Index: orxonox/branches/openAL/ChangeLog
===================================================================
--- orxonox/branches/openAL/ChangeLog	(revision 3921)
+++ orxonox/branches/openAL/ChangeLog	(revision 4194)
@@ -1,2 +1,21 @@
+2005-05-10	Benjamin Grauer <bensch@orxonox.ethz.ch>
+	Merged the gui into the executable
+	Windows compiles again.
+
+2005-04-27	orxonox
+	Tagged Version 0.2.3-pre-alpha
+
+2005-04-23	Patrick Boenzli <patrick@orxonox.ethz.ch>
+	Finished most work on Animation-classes
+
+2005-04-21	Benjamin Grauer <bensch@orxonox.ethz.ch>
+	Material Class update: possibility for transparency.
+
+2005-04-15	Patrick Boenzli <partick@orxonox.ethz.ch>
+	Added AnimationPlayer and two animation classes.
+
+2005-04-07	Patrick Boenzli <patrick@orxonox.ethz.ch>
+	Reimplemeted the Weapon and shoot-functions
+
 2005-03-31	Benjamin Grauer <bensch@orxonox.ethz.ch>
 	Added Text Engine
Index: orxonox/branches/openAL/Makefile.in
===================================================================
--- orxonox/branches/openAL/Makefile.in	(revision 3921)
+++ orxonox/branches/openAL/Makefile.in	(revision 4194)
@@ -105,12 +105,8 @@
 EXEEXT = @EXEEXT@
 GPROF = @GPROF@
-GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
-GTHREAD_LIBS = @GTHREAD_LIBS@
 GTK2_CFLAGS = @GTK2_CFLAGS@
 GTK2_LIBS = @GTK2_LIBS@
 HAVE_CURL_FALSE = @HAVE_CURL_FALSE@
 HAVE_CURL_TRUE = @HAVE_CURL_TRUE@
-HAVE_GTHREAD_FALSE = @HAVE_GTHREAD_FALSE@
-HAVE_GTHREAD_TRUE = @HAVE_GTHREAD_TRUE@
 HAVE_GTK2_FALSE = @HAVE_GTK2_FALSE@
 HAVE_GTK2_TRUE = @HAVE_GTK2_TRUE@
@@ -133,4 +129,6 @@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -141,4 +139,5 @@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
Index: orxonox/branches/openAL/config.h.in
===================================================================
--- orxonox/branches/openAL/config.h.in	(revision 3921)
+++ orxonox/branches/openAL/config.h.in	(revision 4194)
@@ -22,7 +22,4 @@
 #undef HAVE_GL_GL_H
 
-/* if we have gThread */
-#undef HAVE_GTHREAD
-
 /* if we have GTK2 */
 #undef HAVE_GTK2
@@ -46,7 +43,4 @@
 /* Define to 1 if you have the <OpenGL/gl.h> header file. */
 #undef HAVE_OPENGL_GL_H
-
-/* Define to 1 if you have the <pthread.h> header file. */
-#undef HAVE_PTHREAD_H
 
 /* Define to 1 if you have the <SDL.h> header file. */
Index: orxonox/branches/openAL/configure
===================================================================
--- orxonox/branches/openAL/configure	(revision 3921)
+++ orxonox/branches/openAL/configure	(revision 4194)
@@ -1,5 +1,5 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.59 for orxonox 0.2.2-pre-alpha.
+# Generated by GNU Autoconf 2.59 for orxonox 0.2.3-pre-alpha.
 #
 # Report bugs to <orxonox-dev at mail.datacore.ch>.
@@ -270,6 +270,6 @@
 PACKAGE_NAME='orxonox'
 PACKAGE_TARNAME='orxonox'
-PACKAGE_VERSION='0.2.2-pre-alpha'
-PACKAGE_STRING='orxonox 0.2.2-pre-alpha'
+PACKAGE_VERSION='0.2.3-pre-alpha'
+PACKAGE_STRING='orxonox 0.2.3-pre-alpha'
 PACKAGE_BUGREPORT='orxonox-dev at mail.datacore.ch'
 
@@ -312,5 +312,5 @@
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CC CFLAGS ac_ct_CC CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP EGREP DEBUG SUB_PROJECTS_TRUE SUB_PROJECTS_FALSE DOCUMENTATION_TRUE DOCUMENTATION_FALSE DOXYGEN DOXYGEN_TRUE DOXYGEN_FALSE GPROF MSBITFIELDS GTK2_LIBS GTK2_CFLAGS HAVE_GTK2_TRUE HAVE_GTK2_FALSE GTHREAD_LIBS GTHREAD_CFLAGS HAVE_GTHREAD_TRUE HAVE_GTHREAD_FALSE CURL_LIBS CURL_CFLAGS HAVE_CURL_TRUE HAVE_CURL_FALSE LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE RANLIB ac_ct_RANLIB CC CFLAGS ac_ct_CC CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP EGREP DEBUG SUB_PROJECTS_TRUE SUB_PROJECTS_FALSE DOCUMENTATION_TRUE DOCUMENTATION_FALSE DOXYGEN DOXYGEN_TRUE DOXYGEN_FALSE GPROF PKG_CONFIG MSBITFIELDS GTK2_LIBS GTK2_CFLAGS HAVE_GTK2_TRUE HAVE_GTK2_FALSE CURL_LIBS CURL_CFLAGS HAVE_CURL_TRUE HAVE_CURL_FALSE LIBOBJS LTLIBOBJS'
 ac_subst_files=''
 
@@ -789,5 +789,5 @@
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures orxonox 0.2.2-pre-alpha to adapt to many kinds of systems.
+\`configure' configures orxonox 0.2.3-pre-alpha to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -856,5 +856,5 @@
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of orxonox 0.2.2-pre-alpha:";;
+     short | recursive ) echo "Configuration of orxonox 0.2.3-pre-alpha:";;
    esac
   cat <<\_ACEOF
@@ -879,6 +879,4 @@
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
   --without-gtk           Prevents GTK from being loaded
-  --without-gthread       Prevents gThread from being loaded
-  --without-pthread       Prevents pthread from being loaded
   --without-curl          Prevents libcURL from being loaded
 
@@ -993,5 +991,5 @@
 if $ac_init_version; then
   cat <<\_ACEOF
-orxonox configure 0.2.2-pre-alpha
+orxonox configure 0.2.3-pre-alpha
 generated by GNU Autoconf 2.59
 
@@ -1007,5 +1005,5 @@
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by orxonox $as_me 0.2.2-pre-alpha, which was
+It was created by orxonox $as_me 0.2.3-pre-alpha, which was
 generated by GNU Autoconf 2.59.  Invocation command line was
 
@@ -1727,5 +1725,5 @@
 # Define the identity of the package.
  PACKAGE='orxonox'
- VERSION='0.2.2-pre-alpha'
+ VERSION='0.2.3-pre-alpha'
 
 
@@ -2591,4 +2589,84 @@
 
 
+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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  RANLIB=$ac_ct_RANLIB
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -3926,44 +4004,4 @@
 
 #------------------#
-# gThread-disabled #
-#------------------#
-echo "$as_me:$LINENO: checking if gThread should be enabled" >&5
-echo $ECHO_N "checking if gThread should be enabled... $ECHO_C" >&6
-
-# Check whether --with-gthread or --without-gthread was given.
-if test "${with_gthread+set}" = set; then
-  withval="$with_gthread"
-  def_gthread=no
-else
-  def_gthread=yes
-fi;
-if test x$def_gthread = xyes; then
-  echo "yes"
-fi
-if test x$def_gthread = xno; then
-  echo "no"
-fi
-
-#------------------#
-# pthread-disabled #
-#------------------#
-echo "$as_me:$LINENO: checking if pthread should be enabled" >&5
-echo $ECHO_N "checking if pthread should be enabled... $ECHO_C" >&6
-
-# Check whether --with-pthread or --without-pthread was given.
-if test "${with_pthread+set}" = set; then
-  withval="$with_pthread"
-  def_pthread=no
-else
-  def_pthread=yes
-fi;
-if test x$def_pthread = xyes; then
-  echo "yes"
-fi
-if test x$def_pthread = xno; then
-  echo "no"
-fi
-
-#------------------#
 # libCurl-disabled #
 #------------------#
@@ -4175,4 +4213,50 @@
   echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6
+fi
+
+
+#-------------------------#
+# checking for pkg-config #
+#-------------------------#
+if test x$def_gtk = xyes; then
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+
+if test -n "$PKG_CONFIG"; then
+  echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5
+echo "${ECHO_T}$PKG_CONFIG" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
 fi
 
@@ -6869,13 +6953,12 @@
 #-----#
 if test x$def_gtk = xyes; then
-
 	#PKG_CHECK_MODULES(GTK2, gtk+-2.0 >= 2.0.3 gthread-2.0 >= 2.0.3, have_gtk2=yes, have_gtk2=no)
 	echo "$as_me:$LINENO: checking for gtk2.0" >&5
 echo $ECHO_N "checking for gtk2.0... $ECHO_C" >&6
-	if `pkg-config --exists gtk+-2.0`; then
+	if `$PKG_CONFIG --exists gtk+-2.0`; then
   		echo "yes"
   		have_gtk2=yes
-		GTK2_LIBS=`pkg-config --libs gtk+-2.0`
-		GTK2_CFLAGS=`pkg-config --cflags gtk+-2.0`
+		GTK2_LIBS=`$PKG_CONFIG --libs gtk+-2.0`
+		GTK2_CFLAGS=`$PKG_CONFIG --cflags gtk+-2.0`
 
 cat >>confdefs.h <<_ACEOF
@@ -6883,4 +6966,8 @@
 _ACEOF
 
+		if test $DEBUG -ge 3; then
+		 echo "cflags: $GTK2_CFLAGS"
+		 echo "libs: $GTK2_LIBS"
+		fi
 	else
 		echo "no"
@@ -6898,39 +6985,4 @@
   HAVE_GTK2_TRUE='#'
   HAVE_GTK2_FALSE=
-fi
-
-
-#---------#
-# gThread #
-#---------#
-if test x$def_gthread = xyes; then
-
-	echo "$as_me:$LINENO: checking for gthread" >&5
-echo $ECHO_N "checking for gthread... $ECHO_C" >&6
-	if `pkg-config --exists gthread-2.0`; then
-  		echo "yes"
-  		have_gthread=yes
-		GTHREAD_LIBS=`pkg-config --libs gthread-2.0`
-		GTHREAD_CFLAGS=`pkg-config --cflags gthread-2.0`
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_GTHREAD 1
-_ACEOF
-
-	else
-		echo "no"
-	fi
-
-fi
-
-
-
-
-if test x$have_gthread = xyes; then
-  HAVE_GTHREAD_TRUE=
-  HAVE_GTHREAD_FALSE='#'
-else
-  HAVE_GTHREAD_TRUE='#'
-  HAVE_GTHREAD_FALSE=
 fi
 
@@ -7182,11 +7234,317 @@
 
 
-#---------#
-# pthread #
-#---------#
-if test x$def_pthread = xyes ; then
- if test x$have_gthread = xyes ; then
-
-for ac_header in pthread.h
+#--------#
+# efence #
+#--------#
+if test x$def_efence = xyes ; then
+  echo "$as_me:$LINENO: checking for main in -lefence" >&5
+echo $ECHO_N "checking for main in -lefence... $ECHO_C" >&6
+if test "${ac_cv_lib_efence_main+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lefence  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+int
+main ()
+{
+main ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_efence_main=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_efence_main=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_efence_main" >&5
+echo "${ECHO_T}$ac_cv_lib_efence_main" >&6
+if test $ac_cv_lib_efence_main = yes; then
+  FOUND_efence=yes
+fi
+
+   if test x$FOUND_efence = xyes ; then
+      LIBS="$LIBS -lefence"
+   fi
+
+fi
+
+# FIXME: Replace `main' with a function in `-lm':
+
+echo "$as_me:$LINENO: checking for main in -lm" >&5
+echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6
+if test "${ac_cv_lib_m_main+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+int
+main ()
+{
+main ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_m_main=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_m_main=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5
+echo "${ECHO_T}$ac_cv_lib_m_main" >&6
+if test $ac_cv_lib_m_main = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBM 1
+_ACEOF
+
+  LIBS="-lm $LIBS"
+
+fi
+
+
+
+# Checks for header files.
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ctype.h>
+#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))
+      exit(2);
+  exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+
+
+for ac_header in stdlib.h string.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
@@ -7332,19 +7690,17 @@
 #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
 _ACEOF
- pthreadHeader="yes"
-else
-  pthreadHeader="no"
+
 fi
 
 done
 
-  echo "$as_me:$LINENO: checking for main in -lpthread" >&5
-echo $ECHO_N "checking for main in -lpthread... $ECHO_C" >&6
-if test "${ac_cv_lib_pthread_main+set}" = set; then
+
+# Checks for typedefs, structures, and compiler characteristics.
+echo "$as_me:$LINENO: checking for stdbool.h that conforms to C99" >&5
+echo $ECHO_N "checking for stdbool.h that conforms to C99... $ECHO_C" >&6
+if test "${ac_cv_header_stdbool_h+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lpthread  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
+  cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -7353,16 +7709,47 @@
 /* end confdefs.h.  */
 
+#include <stdbool.h>
+#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];
+	bool e = &s;
+	char f[(_Bool) -0.0 == false ? 1 : -1];
+	char g[true];
+	char h[sizeof (_Bool)];
+	char i[sizeof s.t];
 
 int
 main ()
 {
-main ();
+ return !a + !b + !c + !d + !e + !f + !g + !h + !i;
   ;
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
@@ -7378,5 +7765,5 @@
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
+	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
@@ -7384,40 +7771,21 @@
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_lib_pthread_main=yes
+  ac_cv_header_stdbool_h=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_lib_pthread_main=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_main" >&5
-echo "${ECHO_T}$ac_cv_lib_pthread_main" >&6
-if test $ac_cv_lib_pthread_main = yes; then
-  FOUND_pthread=yes
-fi
-
-   if test x$FOUND_pthread = xyes ; then
-      LIBS="$LIBS -lpthread"
-   fi
- fi
-fi
-
-
-#--------#
-# efence #
-#--------#
-if test x$def_efence = xyes ; then
-  echo "$as_me:$LINENO: checking for main in -lefence" >&5
-echo $ECHO_N "checking for main in -lefence... $ECHO_C" >&6
-if test "${ac_cv_lib_efence_main+set}" = set; then
+ac_cv_header_stdbool_h=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdbool_h" >&5
+echo "${ECHO_T}$ac_cv_header_stdbool_h" >&6
+echo "$as_me:$LINENO: checking for _Bool" >&5
+echo $ECHO_N "checking for _Bool... $ECHO_C" >&6
+if test "${ac_cv_type__Bool+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lefence  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
+  cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -7425,17 +7793,19 @@
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-
-
+$ac_includes_default
 int
 main ()
 {
-main ();
+if ((_Bool *) 0)
+  return 0;
+if (sizeof (_Bool))
+  return 0;
   ;
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
@@ -7451,145 +7821,4 @@
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_efence_main=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_efence_main=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_efence_main" >&5
-echo "${ECHO_T}$ac_cv_lib_efence_main" >&6
-if test $ac_cv_lib_efence_main = yes; then
-  FOUND_efence=yes
-fi
-
-   if test x$FOUND_efence = xyes ; then
-      LIBS="$LIBS -lefence"
-   fi
-
-fi
-
-# FIXME: Replace `main' with a function in `-lm':
-
-echo "$as_me:$LINENO: checking for main in -lm" >&5
-echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6
-if test "${ac_cv_lib_m_main+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lm  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-
-int
-main ()
-{
-main ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_m_main=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_m_main=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5
-echo "${ECHO_T}$ac_cv_lib_m_main" >&6
-if test $ac_cv_lib_m_main = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBM 1
-_ACEOF
-
-  LIBS="-lm $LIBS"
-
-fi
-
-
-
-# Checks for header files.
-echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
-if test "${ac_cv_header_stdc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
 	 { ac_try='test -s conftest.$ac_objext'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
@@ -7598,127 +7827,36 @@
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_header_stdc=yes
+  ac_cv_type__Bool=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-ac_cv_header_stdc=no
+ac_cv_type__Bool=no
 fi
 rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then
-  :
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then
-  :
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then
-  :
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ctype.h>
-#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))
-      exit(2);
-  exit (0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-ac_cv_header_stdc=no
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-echo "${ECHO_T}$ac_cv_header_stdc" >&6
-if test $ac_cv_header_stdc = yes; then
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type__Bool" >&5
+echo "${ECHO_T}$ac_cv_type__Bool" >&6
+if test $ac_cv_type__Bool = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE__BOOL 1
+_ACEOF
+
+
+fi
+
+if test $ac_cv_header_stdbool_h = yes; then
 
 cat >>confdefs.h <<\_ACEOF
-#define STDC_HEADERS 1
-_ACEOF
-
-fi
-
-
-
-for ac_header in stdlib.h string.h
+#define HAVE_STDBOOL_H 1
+_ACEOF
+
+fi
+
+
+# Checks for library functions.
+
+for ac_header in stdlib.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
@@ -7869,316 +8007,4 @@
 done
 
-
-# Checks for typedefs, structures, and compiler characteristics.
-echo "$as_me:$LINENO: checking for stdbool.h that conforms to C99" >&5
-echo $ECHO_N "checking for stdbool.h that conforms to C99... $ECHO_C" >&6
-if test "${ac_cv_header_stdbool_h+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-#include <stdbool.h>
-#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];
-	bool e = &s;
-	char f[(_Bool) -0.0 == false ? 1 : -1];
-	char g[true];
-	char h[sizeof (_Bool)];
-	char i[sizeof s.t];
-
-int
-main ()
-{
- return !a + !b + !c + !d + !e + !f + !g + !h + !i;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_header_stdbool_h=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_header_stdbool_h=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_stdbool_h" >&5
-echo "${ECHO_T}$ac_cv_header_stdbool_h" >&6
-echo "$as_me:$LINENO: checking for _Bool" >&5
-echo $ECHO_N "checking for _Bool... $ECHO_C" >&6
-if test "${ac_cv_type__Bool+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-if ((_Bool *) 0)
-  return 0;
-if (sizeof (_Bool))
-  return 0;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type__Bool=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_type__Bool=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type__Bool" >&5
-echo "${ECHO_T}$ac_cv_type__Bool" >&6
-if test $ac_cv_type__Bool = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE__BOOL 1
-_ACEOF
-
-
-fi
-
-if test $ac_cv_header_stdbool_h = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_STDBOOL_H 1
-_ACEOF
-
-fi
-
-
-# Checks for library functions.
-
-for ac_header in stdlib.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ---------------------------------------------- ##
-## Report this to orxonox-dev at mail.datacore.ch ##
-## ---------------------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
 echo "$as_me:$LINENO: checking for GNU libc compatible malloc" >&5
 echo $ECHO_N "checking for GNU libc compatible malloc... $ECHO_C" >&6
@@ -8509,11 +8335,4 @@
 Usually this means the macro was only invoked conditionally." >&5
 echo "$as_me: error: conditional \"HAVE_GTK2\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${HAVE_GTHREAD_TRUE}" && test -z "${HAVE_GTHREAD_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"HAVE_GTHREAD\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"HAVE_GTHREAD\" was never defined.
 Usually this means the macro was only invoked conditionally." >&2;}
    { (exit 1); exit 1; }; }
@@ -8797,5 +8616,5 @@
 cat >&5 <<_CSEOF
 
-This file was extended by orxonox $as_me 0.2.2-pre-alpha, which was
+This file was extended by orxonox $as_me 0.2.3-pre-alpha, which was
 generated by GNU Autoconf 2.59.  Invocation command line was
 
@@ -8860,5 +8679,5 @@
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-orxonox config.status 0.2.2-pre-alpha
+orxonox config.status 0.2.3-pre-alpha
 configured by $0, generated by GNU Autoconf 2.59,
   with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
@@ -9115,4 +8934,6 @@
 s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t
 s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t
+s,@RANLIB@,$RANLIB,;t t
+s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
 s,@CC@,$CC,;t t
 s,@CFLAGS@,$CFLAGS,;t t
@@ -9132,4 +8953,5 @@
 s,@DOXYGEN_FALSE@,$DOXYGEN_FALSE,;t t
 s,@GPROF@,$GPROF,;t t
+s,@PKG_CONFIG@,$PKG_CONFIG,;t t
 s,@MSBITFIELDS@,$MSBITFIELDS,;t t
 s,@GTK2_LIBS@,$GTK2_LIBS,;t t
@@ -9137,8 +8959,4 @@
 s,@HAVE_GTK2_TRUE@,$HAVE_GTK2_TRUE,;t t
 s,@HAVE_GTK2_FALSE@,$HAVE_GTK2_FALSE,;t t
-s,@GTHREAD_LIBS@,$GTHREAD_LIBS,;t t
-s,@GTHREAD_CFLAGS@,$GTHREAD_CFLAGS,;t t
-s,@HAVE_GTHREAD_TRUE@,$HAVE_GTHREAD_TRUE,;t t
-s,@HAVE_GTHREAD_FALSE@,$HAVE_GTHREAD_FALSE,;t t
 s,@CURL_LIBS@,$CURL_LIBS,;t t
 s,@CURL_CFLAGS@,$CURL_CFLAGS,;t t
Index: orxonox/branches/openAL/configure.ac
===================================================================
--- orxonox/branches/openAL/configure.ac	(revision 3921)
+++ orxonox/branches/openAL/configure.ac	(revision 4194)
@@ -23,5 +23,5 @@
 #########################
 AC_PREREQ(2.56)
-AC_INIT(orxonox, 0.2.2-pre-alpha, [orxonox-dev at mail.datacore.ch])
+AC_INIT(orxonox, 0.2.3-pre-alpha, [orxonox-dev at mail.datacore.ch])
 
 ## Detect the canonical host and target build environment.
@@ -39,4 +39,5 @@
 #########################
 AC_PROG_CXX
+AC_PROG_RANLIB
 AC_HEADER_STDC
 
@@ -96,32 +97,4 @@
 fi 
 if test x$def_gtk = xno; then 
-  echo "no"
-fi
-
-#------------------#
-# gThread-disabled #
-#------------------#
-AC_MSG_CHECKING([if gThread should be enabled])
-AC_ARG_WITH([gthread], 
-	AC_HELP_STRING(	[--without-gthread],
-	[Prevents gThread from being loaded]), [def_gthread=no], [def_gthread=yes]) 
-if test x$def_gthread = xyes; then 
-  echo "yes"
-fi 
-if test x$def_gthread = xno; then 
-  echo "no"
-fi
-
-#------------------#
-# pthread-disabled #
-#------------------#
-AC_MSG_CHECKING([if pthread should be enabled])
-AC_ARG_WITH([pthread], 
-	AC_HELP_STRING(	[--without-pthread], 
-	[Prevents pthread from being loaded]), [def_pthread=no], [def_pthread=yes]) 
-if test x$def_pthread = xyes; then 
-  echo "yes"
-fi 
-if test x$def_pthread = xno; then 
   echo "no"
 fi
@@ -218,4 +191,12 @@
 #--------------------#
 AC_PATH_PROG(GPROF, gprof)
+
+#-------------------------#
+# checking for pkg-config #
+#-------------------------#
+if test x$def_gtk = xyes; then
+ AC_PATH_PROG(PKG_CONFIG, pkg-config)
+fi
+
 
 #########################
@@ -482,13 +463,16 @@
 #-----#
 if test x$def_gtk = xyes; then 
-
 	#PKG_CHECK_MODULES(GTK2, gtk+-2.0 >= 2.0.3 gthread-2.0 >= 2.0.3, have_gtk2=yes, have_gtk2=no)
 	AC_MSG_CHECKING([for gtk2.0])
-	if `pkg-config --exists gtk+-2.0`; then
+	if `$PKG_CONFIG --exists gtk+-2.0`; then
   		echo "yes"
   		have_gtk2=yes
-		GTK2_LIBS=`pkg-config --libs gtk+-2.0`
-		GTK2_CFLAGS=`pkg-config --cflags gtk+-2.0`
+		GTK2_LIBS=`$PKG_CONFIG --libs gtk+-2.0`
+		GTK2_CFLAGS=`$PKG_CONFIG --cflags gtk+-2.0`
 		AC_DEFINE_UNQUOTED(HAVE_GTK2, 1, [if we have GTK2])
+		if test $DEBUG -ge 3; then
+		 echo "cflags: $GTK2_CFLAGS"
+		 echo "libs: $GTK2_LIBS"
+		fi
 	else
 		echo "no"
@@ -499,25 +483,4 @@
 AC_SUBST(GTK2_CFLAGS)
 AM_CONDITIONAL(HAVE_GTK2, test x$have_gtk2 = xyes)
-
-#---------#
-# gThread #
-#---------#
-if test x$def_gthread = xyes; then 
-
-	AC_MSG_CHECKING([for gthread])
-	if `pkg-config --exists gthread-2.0`; then
-  		echo "yes"
-  		have_gthread=yes
-		GTHREAD_LIBS=`pkg-config --libs gthread-2.0`
-		GTHREAD_CFLAGS=`pkg-config --cflags gthread-2.0`
-		AC_DEFINE_UNQUOTED(HAVE_GTHREAD, 1, [if we have gThread])
-	else
-		echo "no"
-	fi
-
-fi
-AC_SUBST(GTHREAD_LIBS)
-AC_SUBST(GTHREAD_CFLAGS)
-AM_CONDITIONAL(HAVE_GTHREAD, test x$have_gthread = xyes)
 
 #---------#
@@ -541,18 +504,4 @@
 AC_SUBST(CURL_CFLAGS)
 AM_CONDITIONAL(HAVE_CURL, test x$have_curl = xyes)
-
-#---------#
-# pthread #
-#---------#
-if test x$def_pthread = xyes ; then
- if test x$have_gthread = xyes ; then
-  AC_CHECK_HEADERS([pthread.h], [pthreadHeader="yes"], [pthreadHeader="no"])
-  AC_CHECK_LIB([pthread], [main], [FOUND_pthread=yes])
-   if test x$FOUND_pthread = xyes ; then
-      LIBS="$LIBS -lpthread"
-   fi
- fi
-fi
-
 
 #--------#
Index: orxonox/branches/openAL/doc/orxodox.checkFiles.pl
===================================================================
--- orxonox/branches/openAL/doc/orxodox.checkFiles.pl	(revision 3921)
+++ 	(revision )
@@ -1,294 +1,0 @@
-#!/usr/bin/perl
-########################################################################## 
-#   orxonox - the future of 3D-vertical-scrollers			 #
-#									 #
-#   Copyright (C) 2004 orx						 #
-#									 #
-#   This program is free software; you can redistribute 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.							 #
-#									 #
-#   ### File Specific:							 #
-#   main-programmer: Benjamin Grauer					 #
-#   co-programmer: ...							 #
-#									 #
-#   This Script is for parsing single or multiple files for their        #
-#   doxygeb-tags, and outputs the warnings and errors, but prehibits     #
-#   the progress from being displayed.                                   #
-#   Usage: ./orxodox.checkFiles.pl [fileName1 [fileName2 [...]]]         #
-#   This script ignores file-extensions, and assumes that either         #
-#   .h, .cc or both may exist, and searches for them.                    #
-##########################################################################
-
-$inputFiles = @ARGV[0];
-$tempDoxFile = "TMPorxodox";
-
-unless (open (DOXfile, ">$tempDoxFile"))
- {
-   die("cannot open file\n");
- }
-
-$processFiles = "";
-$numberOfFiles = 0;
-foreach $inputFile (@ARGV)
-  {
-    $tmpNumber = $numberOfFiles;
-
-    $inputFile =~ s/\.cc$//;
-    $inputFile =~ s/\.h$//;
-
-    print "checking file $inputFile: ";
-
-    $inputFile =~ s/$/\.h/;
-    if (-e $inputFile)
-      {
-	$processFiles = "$processFiles $inputFile";
-	$numberOfFiles++;
-	print "found .h ";
-      }
-    $inputFile =~ s/\.h$/\.cc/;
-    if (-e $inputFile)
-      {
-	$processFiles = "$processFiles $inputFile";
-	$numberOfFiles++;
-	print "...found .cc ";
-      }
-    if ($tmpNumber == $numberOfFiles) {print "no matching files found";}
-    print "\n";
-  }
-
-if ($numberOfFiles == 0 && @ARGV !=0){
-  die("no Files have been found\n");}
-
-print "==================================================================\n";
-print "Generating temporary Documentation File\n";
-print "==================================================================\n";
-
-print DOXfile "# THIS IS A DEFAULT FILE FOR DOXYGEN DOCUMENTATION";
-
-printf DOXfile "# Doxyfile 1.3.7 \
-## SAMPLE FILE (to be executed from orxonox/trunk/) \
- \
-#--------------------------------------------------------------------------- \
-# Project related configuration options \
-#--------------------------------------------------------------------------- \
-PROJECT_NAME           = Orxonox \
-PROJECT_NUMBER         = 1 \
-OUTPUT_DIRECTORY       = doxygen/ \
-CREATE_SUBDIRS         = YES \
-OUTPUT_LANGUAGE        = English \
-USE_WINDOWS_ENCODING   = YES \
-BRIEF_MEMBER_DESC      = YES \
-REPEAT_BRIEF           = YES \
-ABBREVIATE_BRIEF       =  \
-ALWAYS_DETAILED_SEC    = NO \
-INLINE_INHERITED_MEMB  = NO \
-FULL_PATH_NAMES        = NO \
-STRIP_FROM_PATH        =  \
-STRIP_FROM_INC_PATH    =  \
-SHORT_NAMES            = NO \
-JAVADOC_AUTOBRIEF      = NO \
-MULTILINE_CPP_IS_BRIEF = NO \
-DETAILS_AT_TOP         = NO \
-INHERIT_DOCS           = YES \
-DISTRIBUTE_GROUP_DOC   = NO \
-TAB_SIZE               = 8 \
-ALIASES                =  \
-OPTIMIZE_OUTPUT_FOR_C  = NO \
-OPTIMIZE_OUTPUT_JAVA   = NO \
-SUBGROUPING            = YES \
-#--------------------------------------------------------------------------- \
-# Build related configuration options \
-#--------------------------------------------------------------------------- \
-EXTRACT_ALL            = NO \
-EXTRACT_PRIVATE        = YES \
-EXTRACT_STATIC         = YES \
-EXTRACT_LOCAL_CLASSES  = YES \
-EXTRACT_LOCAL_METHODS  = NO \
-HIDE_UNDOC_MEMBERS     = NO \
-HIDE_UNDOC_CLASSES     = NO \
-HIDE_FRIEND_COMPOUNDS  = NO \
-HIDE_IN_BODY_DOCS      = NO \
-INTERNAL_DOCS          = NO \
-CASE_SENSE_NAMES       = YES \
-HIDE_SCOPE_NAMES       = NO \
-SHOW_INCLUDE_FILES     = YES \
-INLINE_INFO            = YES \
-SORT_MEMBER_DOCS       = YES \
-SORT_BRIEF_DOCS        = NO \
-SORT_BY_SCOPE_NAME     = NO \
-GENERATE_TODOLIST      = YES \
-GENERATE_TESTLIST      = YES \
-GENERATE_BUGLIST       = YES \
-GENERATE_DEPRECATEDLIST= YES \
-ENABLED_SECTIONS       =  \
-MAX_INITIALIZER_LINES  = 30 \
-SHOW_USED_FILES        = YES \
-#--------------------------------------------------------------------------- \
-# configuration options related to warning and progress messages \
-#--------------------------------------------------------------------------- \
-QUIET                  = YES \
-WARNINGS               = YES \
-WARN_IF_UNDOCUMENTED   = YES \
-WARN_IF_DOC_ERROR      = YES \
-WARN_FORMAT            = \"\$file:\$line: \$text\" \
-WARN_LOGFILE           =  \
-#--------------------------------------------------------------------------- \
-# configuration options related to the input files \
-#--------------------------------------------------------------------------- \
-INPUT                  = $processFiles \
-FILE_PATTERNS          =  \
-RECURSIVE              = NO \
-EXCLUDE                =  \
-EXCLUDE_SYMLINKS       = NO \
-EXCLUDE_PATTERNS       =  \
-EXAMPLE_PATH           =  \
-EXAMPLE_PATTERNS       =  \
-EXAMPLE_RECURSIVE      = NO \
-IMAGE_PATH             =  \
-INPUT_FILTER           =  \
-FILTER_SOURCE_FILES    = NO \
-#--------------------------------------------------------------------------- \
-# configuration options related to source browsing \
-#--------------------------------------------------------------------------- \
-SOURCE_BROWSER         = NO \
-INLINE_SOURCES         = NO \
-STRIP_CODE_COMMENTS    = YES \
-REFERENCED_BY_RELATION = YES \
-REFERENCES_RELATION    = YES \
-VERBATIM_HEADERS       = YES \
-#--------------------------------------------------------------------------- \
-# configuration options related to the alphabetical class index \
-#--------------------------------------------------------------------------- \
-ALPHABETICAL_INDEX     = NO \
-COLS_IN_ALPHA_INDEX    = 5 \
-IGNORE_PREFIX          =  \
-#--------------------------------------------------------------------------- \
-# configuration options related to the HTML output \
-#--------------------------------------------------------------------------- \
-GENERATE_HTML          = YES \
-HTML_OUTPUT            = html \
-HTML_FILE_EXTENSION    = .html \
-HTML_HEADER            =  \
-HTML_FOOTER            =  \
-HTML_STYLESHEET        =  \
-HTML_ALIGN_MEMBERS     = YES \
-GENERATE_HTMLHELP      = NO \
-CHM_FILE               =  \
-HHC_LOCATION           =  \
-GENERATE_CHI           = NO \
-BINARY_TOC             = NO \
-TOC_EXPAND             = NO \
-DISABLE_INDEX          = NO \
-ENUM_VALUES_PER_LINE   = 4 \
-GENERATE_TREEVIEW      = NO \
-TREEVIEW_WIDTH         = 250 \
-#--------------------------------------------------------------------------- \
-# configuration options related to the LaTeX output \
-#--------------------------------------------------------------------------- \
-GENERATE_LATEX         = NO \
-LATEX_OUTPUT           = latex \
-LATEX_CMD_NAME         = latex \
-MAKEINDEX_CMD_NAME     = makeindex \
-COMPACT_LATEX          = NO \
-PAPER_TYPE             = a4wide \
-EXTRA_PACKAGES         =  \
-LATEX_HEADER           =  \
-PDF_HYPERLINKS         = NO \
-USE_PDFLATEX           = NO \
-LATEX_BATCHMODE        = NO \
-LATEX_HIDE_INDICES     = NO \
-#--------------------------------------------------------------------------- \
-# configuration options related to the RTF output \
-#--------------------------------------------------------------------------- \
-GENERATE_RTF           = NO \
-RTF_OUTPUT             = rtf \
-COMPACT_RTF            = NO \
-RTF_HYPERLINKS         = NO \
-RTF_STYLESHEET_FILE    =  \
-RTF_EXTENSIONS_FILE    =  \
-#--------------------------------------------------------------------------- \
-# configuration options related to the man page output \
-#--------------------------------------------------------------------------- \
-GENERATE_MAN           = NO \
-MAN_OUTPUT             = man \
-MAN_EXTENSION          = .3 \
-MAN_LINKS              = NO \
-#--------------------------------------------------------------------------- \
-# configuration options related to the XML output \
-#--------------------------------------------------------------------------- \
-GENERATE_XML           = NO \
-XML_OUTPUT             = xml \
-XML_SCHEMA             =  \
-XML_DTD                =  \
-XML_PROGRAMLISTING     = YES \
-#--------------------------------------------------------------------------- \
-# configuration options for the AutoGen Definitions output \
-#--------------------------------------------------------------------------- \
-GENERATE_AUTOGEN_DEF   = NO \
-#--------------------------------------------------------------------------- \
-# configuration options related to the Perl module output \
-#--------------------------------------------------------------------------- \
-GENERATE_PERLMOD       = NO \
-PERLMOD_LATEX          = NO \
-PERLMOD_PRETTY         = YES \
-PERLMOD_MAKEVAR_PREFIX =  \
-#--------------------------------------------------------------------------- \
-# Configuration options related to the preprocessor    \
-#--------------------------------------------------------------------------- \
-ENABLE_PREPROCESSING   = YES \
-MACRO_EXPANSION        = NO \
-EXPAND_ONLY_PREDEF     = NO \
-SEARCH_INCLUDES        = YES \
-INCLUDE_PATH           =  \
-INCLUDE_FILE_PATTERNS  =  \
-PREDEFINED             =  \
-EXPAND_AS_DEFINED      =  \
-SKIP_FUNCTION_MACROS   = YES \
-#--------------------------------------------------------------------------- \
-# Configuration::additions related to external references    \
-#--------------------------------------------------------------------------- \
-TAGFILES               =  \
-GENERATE_TAGFILE       =  \
-ALLEXTERNALS           = NO \
-EXTERNAL_GROUPS        = YES \
-PERL_PATH              = /usr/bin/perl \
-#--------------------------------------------------------------------------- \
-# Configuration options related to the dot tool    \
-#--------------------------------------------------------------------------- \
-CLASS_DIAGRAMS         = YES \
-HIDE_UNDOC_RELATIONS   = YES \
-HAVE_DOT               = NO \
-CLASS_GRAPH            = YES \
-COLLABORATION_GRAPH    = YES \
-UML_LOOK               = NO \
-TEMPLATE_RELATIONS     = NO \
-INCLUDE_GRAPH          = YES \
-INCLUDED_BY_GRAPH      = YES \
-CALL_GRAPH             = NO \
-GRAPHICAL_HIERARCHY    = YES \
-DOT_IMAGE_FORMAT       = png \
-DOT_PATH               =  \
-DOTFILE_DIRS           =  \
-MAX_DOT_GRAPH_WIDTH    = 1024 \
-MAX_DOT_GRAPH_HEIGHT   = 1024 \
-MAX_DOT_GRAPH_DEPTH    = 0 \
-GENERATE_LEGEND        = YES \
-DOT_CLEANUP            = YES \
-#--------------------------------------------------------------------------- \
-# Configuration::additions related to the search engine    \
-#--------------------------------------------------------------------------- \
-SEARCHENGINE           = NO \
- \
-";
-
-close DOXfile;
-
-print "==================================================================\n";
-print "Generating Documentation of $processFiles\n";
-print "==================================================================\n";
-exec("doxygen $tempDoxFile");
-
-
-unlink $tmpDoxFile;
Index: orxonox/branches/openAL/scripts/data.checkout
===================================================================
--- orxonox/branches/openAL/scripts/data.checkout	(revision 4194)
+++ orxonox/branches/openAL/scripts/data.checkout	(revision 4194)
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+if [ -z "$1" ]
+then
+    svn co https://svn.orxonox.ethz.ch/data data
+else
+    svn co https://svn.orxonox.ethz.ch/data data --username $1
+fi
Index: orxonox/branches/openAL/scripts/data.genlist.pl
===================================================================
--- orxonox/branches/openAL/scripts/data.genlist.pl	(revision 4194)
+++ orxonox/branches/openAL/scripts/data.genlist.pl	(revision 4194)
@@ -0,0 +1,68 @@
+#!/usr/bin/perl
+########################################################################## 
+#   orxonox - the future of 3D-vertical-scrollers			 #
+#									 #
+#   Copyright (C) 2004 orx						 #
+#									 #
+#   This program is free software; you can redistribute 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.							 #
+#									 #
+#   ### File Specific:							 #
+#   main-programmer: Benjamin Grauer					 #
+#   co-programmer: ...							 #
+#									 #
+#   This is a simple perl script, that generates a List of all files     #
+#   contained in a Folder checked out with SVN and writes into an output #
+#   file.                                                                #
+##########################################################################
+
+if (@ARGV[0] eq "-h" || $ARGV[0] eq "--help" || @ARGV != 2)
+  {
+    die ("usage: data.genlist.pl <data-directory> <output-file>\n");
+  }
+
+
+if (! -d @ARGV[0])
+  {
+    die ("@ARGV[0] is not regular Directory.\n");
+  }
+
+open(FD, "> @ARGV[1]") or die("Couldn't open @ARGV[1]\n") ;
+
+
+&createFileList(@ARGV[0]);
+
+close(FD);
+
+
+sub createFileList
+  {
+   my ($folderName) = @_;
+   my ($fullName);
+   my ($inputFile);
+   my ($printFile);
+   my (@folderList);
+
+   open(FOLDERLIST, "ls $folderName -1 |");
+   @folderList = <FOLDERLIST>;
+
+   foreach $inputFile (@folderList)
+     {
+       if ($inputFile eq "." || $inputFile eq "..")
+	 {
+
+	 }
+       chomp($inputFile);
+       $fullName = "$folderName/$inputFile";
+
+       $printFile = $fullName;
+       $printFile =~ s/@ARGV[0]//;
+       print FD "$printFile\n";
+       if (-d $fullName )
+	 {
+	   &createFileList($fullName);
+	 }
+     }
+ }
Index: orxonox/branches/openAL/scripts/gtk-config.osXframework
===================================================================
--- orxonox/branches/openAL/scripts/gtk-config.osXframework	(revision 4194)
+++ orxonox/branches/openAL/scripts/gtk-config.osXframework	(revision 4194)
@@ -0,0 +1,112 @@
+#!/bin/sh
+
+glib_libs="-framework GLib"
+glib_cflags="-I/Library/Frameworks/GLib.framework/Headers"
+glib_thread_libs="-framework GLib -lpthread"
+glib_thread_cflags="-I/Library/Frameworks/GLib.framework/Headers"
+
+prefix=/Library/Frameworks
+gtk_fw_prefix=/Library/Frameworks
+exec_prefix=${prefix}
+exec_prefix_set=no
+
+usage()
+{
+	cat <<EOF
+Usage: gtk-config [OPTIONS] [LIBRARIES]
+Options:
+	[--prefix[=DIR]]
+	[--exec-prefix[=DIR]]
+	[--version]
+	[--libs]
+	[--cflags]
+Libraries:
+	gtk
+	gthread
+EOF
+	exit $1
+}
+
+if test $# -eq 0; then
+	usage 1 1>&2
+fi
+
+lib_gtk=yes
+
+while test $# -gt 0; do
+  case "$1" in
+  -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) optarg= ;;
+  esac
+
+  case $1 in
+    --prefix=*)
+      prefix=$optarg
+      if test $exec_prefix_set = no ; then
+        exec_prefix=$optarg
+      fi
+      ;;
+    --prefix)
+      echo_prefix=yes
+      ;;
+    --exec-prefix=*)
+      exec_prefix=$optarg
+      exec_prefix_set=yes
+      ;;
+    --exec-prefix)
+      echo_exec_prefix=yes
+      ;;
+    --version)
+      echo 1.2.10
+      ;;
+    --cflags)
+      echo_cflags=yes
+      ;;
+    --libs)
+      echo_libs=yes
+      ;;
+    gtk)
+      lib_gtk=yes
+      ;;
+    gthread)
+      lib_gthread=yes
+      ;;
+    *)
+      usage 1 1>&2
+      ;;
+  esac
+  shift
+done
+
+if test "$echo_prefix" = "yes"; then
+	echo $prefix
+fi
+
+if test "$echo_exec_prefix" = "yes"; then
+	echo $exec_prefix
+fi
+
+if test "$lib_gthread" = "yes"; then
+      glib_cflags="$glib_thread_cflags"
+      glib_libs="$glib_thread_libs"
+fi
+
+if test "$echo_cflags" = "yes"; then
+      echo -F${gtk_fw_prefix} ${glib_cflags} -I${gtk_fw_prefix}/GDK.framework/Headers -I${gtk_fw_prefix}/GTK.framework/Headers
+fi
+
+if test "$echo_libs" = "yes"; then
+      my_glib_libs=
+      libdirs=-F${exec_prefix}
+      for i in $glib_libs ; do
+        if test $i != -F${exec_prefix} ; then
+          if test -z "$my_glib_libs" ; then
+            my_glib_libs="$i"
+          else
+            my_glib_libs="$my_glib_libs $i"
+          fi
+        fi
+      done
+
+      echo $libdirs -F${gtk_fw_prefix} -framework GLib -framework GDK -framework GTK ${glib_cflags} -lm
+fi
Index: orxonox/branches/openAL/scripts/orxodox.checkFiles.pl
===================================================================
--- orxonox/branches/openAL/scripts/orxodox.checkFiles.pl	(revision 4194)
+++ orxonox/branches/openAL/scripts/orxodox.checkFiles.pl	(revision 4194)
@@ -0,0 +1,294 @@
+#!/usr/bin/perl
+########################################################################## 
+#   orxonox - the future of 3D-vertical-scrollers			 #
+#									 #
+#   Copyright (C) 2004 orx						 #
+#									 #
+#   This program is free software; you can redistribute 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.							 #
+#									 #
+#   ### File Specific:							 #
+#   main-programmer: Benjamin Grauer					 #
+#   co-programmer: ...							 #
+#									 #
+#   This Script is for parsing single or multiple files for their        #
+#   doxygeb-tags, and outputs the warnings and errors, but prehibits     #
+#   the progress from being displayed.                                   #
+#   Usage: ./orxodox.checkFiles.pl [fileName1 [fileName2 [...]]]         #
+#   This script ignores file-extensions, and assumes that either         #
+#   .h, .cc or both may exist, and searches for them.                    #
+##########################################################################
+
+$inputFiles = @ARGV[0];
+$tempDoxFile = "TMPorxodox";
+
+unless (open (DOXfile, ">$tempDoxFile"))
+ {
+   die("cannot open file\n");
+ }
+
+$processFiles = "";
+$numberOfFiles = 0;
+foreach $inputFile (@ARGV)
+  {
+    $tmpNumber = $numberOfFiles;
+
+    $inputFile =~ s/\.cc$//;
+    $inputFile =~ s/\.h$//;
+
+    print "checking file $inputFile: ";
+
+    $inputFile =~ s/$/\.h/;
+    if (-e $inputFile)
+      {
+	$processFiles = "$processFiles $inputFile";
+	$numberOfFiles++;
+	print "found .h ";
+      }
+    $inputFile =~ s/\.h$/\.cc/;
+    if (-e $inputFile)
+      {
+	$processFiles = "$processFiles $inputFile";
+	$numberOfFiles++;
+	print "...found .cc ";
+      }
+    if ($tmpNumber == $numberOfFiles) {print "no matching files found";}
+    print "\n";
+  }
+
+if ($numberOfFiles == 0 && @ARGV !=0){
+  die("no Files have been found\n");}
+
+print "==================================================================\n";
+print "Generating temporary Documentation File\n";
+print "==================================================================\n";
+
+print DOXfile "# THIS IS A DEFAULT FILE FOR DOXYGEN DOCUMENTATION";
+
+printf DOXfile "# Doxyfile 1.3.7 \
+## SAMPLE FILE (to be executed from orxonox/trunk/) \
+ \
+#--------------------------------------------------------------------------- \
+# Project related configuration options \
+#--------------------------------------------------------------------------- \
+PROJECT_NAME           = Orxonox \
+PROJECT_NUMBER         = 1 \
+OUTPUT_DIRECTORY       = doxygen/ \
+CREATE_SUBDIRS         = YES \
+OUTPUT_LANGUAGE        = English \
+USE_WINDOWS_ENCODING   = YES \
+BRIEF_MEMBER_DESC      = YES \
+REPEAT_BRIEF           = YES \
+ABBREVIATE_BRIEF       =  \
+ALWAYS_DETAILED_SEC    = NO \
+INLINE_INHERITED_MEMB  = NO \
+FULL_PATH_NAMES        = NO \
+STRIP_FROM_PATH        =  \
+STRIP_FROM_INC_PATH    =  \
+SHORT_NAMES            = NO \
+JAVADOC_AUTOBRIEF      = NO \
+MULTILINE_CPP_IS_BRIEF = NO \
+DETAILS_AT_TOP         = NO \
+INHERIT_DOCS           = YES \
+DISTRIBUTE_GROUP_DOC   = NO \
+TAB_SIZE               = 8 \
+ALIASES                =  \
+OPTIMIZE_OUTPUT_FOR_C  = NO \
+OPTIMIZE_OUTPUT_JAVA   = NO \
+SUBGROUPING            = YES \
+#--------------------------------------------------------------------------- \
+# Build related configuration options \
+#--------------------------------------------------------------------------- \
+EXTRACT_ALL            = NO \
+EXTRACT_PRIVATE        = YES \
+EXTRACT_STATIC         = YES \
+EXTRACT_LOCAL_CLASSES  = YES \
+EXTRACT_LOCAL_METHODS  = NO \
+HIDE_UNDOC_MEMBERS     = NO \
+HIDE_UNDOC_CLASSES     = NO \
+HIDE_FRIEND_COMPOUNDS  = NO \
+HIDE_IN_BODY_DOCS      = NO \
+INTERNAL_DOCS          = NO \
+CASE_SENSE_NAMES       = YES \
+HIDE_SCOPE_NAMES       = NO \
+SHOW_INCLUDE_FILES     = YES \
+INLINE_INFO            = YES \
+SORT_MEMBER_DOCS       = YES \
+SORT_BRIEF_DOCS        = NO \
+SORT_BY_SCOPE_NAME     = NO \
+GENERATE_TODOLIST      = YES \
+GENERATE_TESTLIST      = YES \
+GENERATE_BUGLIST       = YES \
+GENERATE_DEPRECATEDLIST= YES \
+ENABLED_SECTIONS       =  \
+MAX_INITIALIZER_LINES  = 30 \
+SHOW_USED_FILES        = YES \
+#--------------------------------------------------------------------------- \
+# configuration options related to warning and progress messages \
+#--------------------------------------------------------------------------- \
+QUIET                  = YES \
+WARNINGS               = YES \
+WARN_IF_UNDOCUMENTED   = YES \
+WARN_IF_DOC_ERROR      = YES \
+WARN_FORMAT            = \"\$file:\$line: \$text\" \
+WARN_LOGFILE           =  \
+#--------------------------------------------------------------------------- \
+# configuration options related to the input files \
+#--------------------------------------------------------------------------- \
+INPUT                  = $processFiles \
+FILE_PATTERNS          =  \
+RECURSIVE              = NO \
+EXCLUDE                =  \
+EXCLUDE_SYMLINKS       = NO \
+EXCLUDE_PATTERNS       =  \
+EXAMPLE_PATH           =  \
+EXAMPLE_PATTERNS       =  \
+EXAMPLE_RECURSIVE      = NO \
+IMAGE_PATH             =  \
+INPUT_FILTER           =  \
+FILTER_SOURCE_FILES    = NO \
+#--------------------------------------------------------------------------- \
+# configuration options related to source browsing \
+#--------------------------------------------------------------------------- \
+SOURCE_BROWSER         = NO \
+INLINE_SOURCES         = NO \
+STRIP_CODE_COMMENTS    = YES \
+REFERENCED_BY_RELATION = YES \
+REFERENCES_RELATION    = YES \
+VERBATIM_HEADERS       = YES \
+#--------------------------------------------------------------------------- \
+# configuration options related to the alphabetical class index \
+#--------------------------------------------------------------------------- \
+ALPHABETICAL_INDEX     = NO \
+COLS_IN_ALPHA_INDEX    = 5 \
+IGNORE_PREFIX          =  \
+#--------------------------------------------------------------------------- \
+# configuration options related to the HTML output \
+#--------------------------------------------------------------------------- \
+GENERATE_HTML          = YES \
+HTML_OUTPUT            = html \
+HTML_FILE_EXTENSION    = .html \
+HTML_HEADER            =  \
+HTML_FOOTER            =  \
+HTML_STYLESHEET        =  \
+HTML_ALIGN_MEMBERS     = YES \
+GENERATE_HTMLHELP      = NO \
+CHM_FILE               =  \
+HHC_LOCATION           =  \
+GENERATE_CHI           = NO \
+BINARY_TOC             = NO \
+TOC_EXPAND             = NO \
+DISABLE_INDEX          = NO \
+ENUM_VALUES_PER_LINE   = 4 \
+GENERATE_TREEVIEW      = NO \
+TREEVIEW_WIDTH         = 250 \
+#--------------------------------------------------------------------------- \
+# configuration options related to the LaTeX output \
+#--------------------------------------------------------------------------- \
+GENERATE_LATEX         = NO \
+LATEX_OUTPUT           = latex \
+LATEX_CMD_NAME         = latex \
+MAKEINDEX_CMD_NAME     = makeindex \
+COMPACT_LATEX          = NO \
+PAPER_TYPE             = a4wide \
+EXTRA_PACKAGES         =  \
+LATEX_HEADER           =  \
+PDF_HYPERLINKS         = NO \
+USE_PDFLATEX           = NO \
+LATEX_BATCHMODE        = NO \
+LATEX_HIDE_INDICES     = NO \
+#--------------------------------------------------------------------------- \
+# configuration options related to the RTF output \
+#--------------------------------------------------------------------------- \
+GENERATE_RTF           = NO \
+RTF_OUTPUT             = rtf \
+COMPACT_RTF            = NO \
+RTF_HYPERLINKS         = NO \
+RTF_STYLESHEET_FILE    =  \
+RTF_EXTENSIONS_FILE    =  \
+#--------------------------------------------------------------------------- \
+# configuration options related to the man page output \
+#--------------------------------------------------------------------------- \
+GENERATE_MAN           = NO \
+MAN_OUTPUT             = man \
+MAN_EXTENSION          = .3 \
+MAN_LINKS              = NO \
+#--------------------------------------------------------------------------- \
+# configuration options related to the XML output \
+#--------------------------------------------------------------------------- \
+GENERATE_XML           = NO \
+XML_OUTPUT             = xml \
+XML_SCHEMA             =  \
+XML_DTD                =  \
+XML_PROGRAMLISTING     = YES \
+#--------------------------------------------------------------------------- \
+# configuration options for the AutoGen Definitions output \
+#--------------------------------------------------------------------------- \
+GENERATE_AUTOGEN_DEF   = NO \
+#--------------------------------------------------------------------------- \
+# configuration options related to the Perl module output \
+#--------------------------------------------------------------------------- \
+GENERATE_PERLMOD       = NO \
+PERLMOD_LATEX          = NO \
+PERLMOD_PRETTY         = YES \
+PERLMOD_MAKEVAR_PREFIX =  \
+#--------------------------------------------------------------------------- \
+# Configuration options related to the preprocessor    \
+#--------------------------------------------------------------------------- \
+ENABLE_PREPROCESSING   = YES \
+MACRO_EXPANSION        = NO \
+EXPAND_ONLY_PREDEF     = NO \
+SEARCH_INCLUDES        = YES \
+INCLUDE_PATH           =  \
+INCLUDE_FILE_PATTERNS  =  \
+PREDEFINED             =  \
+EXPAND_AS_DEFINED      =  \
+SKIP_FUNCTION_MACROS   = YES \
+#--------------------------------------------------------------------------- \
+# Configuration::additions related to external references    \
+#--------------------------------------------------------------------------- \
+TAGFILES               =  \
+GENERATE_TAGFILE       =  \
+ALLEXTERNALS           = NO \
+EXTERNAL_GROUPS        = YES \
+PERL_PATH              = /usr/bin/perl \
+#--------------------------------------------------------------------------- \
+# Configuration options related to the dot tool    \
+#--------------------------------------------------------------------------- \
+CLASS_DIAGRAMS         = YES \
+HIDE_UNDOC_RELATIONS   = YES \
+HAVE_DOT               = NO \
+CLASS_GRAPH            = YES \
+COLLABORATION_GRAPH    = YES \
+UML_LOOK               = NO \
+TEMPLATE_RELATIONS     = NO \
+INCLUDE_GRAPH          = YES \
+INCLUDED_BY_GRAPH      = YES \
+CALL_GRAPH             = NO \
+GRAPHICAL_HIERARCHY    = YES \
+DOT_IMAGE_FORMAT       = png \
+DOT_PATH               =  \
+DOTFILE_DIRS           =  \
+MAX_DOT_GRAPH_WIDTH    = 1024 \
+MAX_DOT_GRAPH_HEIGHT   = 1024 \
+MAX_DOT_GRAPH_DEPTH    = 0 \
+GENERATE_LEGEND        = YES \
+DOT_CLEANUP            = YES \
+#--------------------------------------------------------------------------- \
+# Configuration::additions related to the search engine    \
+#--------------------------------------------------------------------------- \
+SEARCHENGINE           = NO \
+ \
+";
+
+close DOXfile;
+
+print "==================================================================\n";
+print "Generating Documentation of $processFiles\n";
+print "==================================================================\n";
+exec("doxygen $tempDoxFile");
+
+
+unlink $tmpDoxFile;
Index: orxonox/branches/openAL/src/Makefile.am
===================================================================
--- orxonox/branches/openAL/src/Makefile.am	(revision 3921)
+++ orxonox/branches/openAL/src/Makefile.am	(revision 4194)
@@ -8,5 +8,7 @@
 AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/graphics
 AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/graphics/importer
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/graphics/particles
 AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/gui
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/gui/gui
 AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/lang
 AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/util
@@ -20,13 +22,16 @@
 AM_CXXFLAGS+=-I$(MAINSRCDIR)/util/animation
 AM_CXXFLAGS+=-I$(MAINSRCDIR)/util/common
-
-
-AM_LDFLAGS= $(MWINDOWS)
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/subprojects
+
+
 
 #"-O3 -pedantic -fPIC -ffast-math -I/usr/X11R6/include"
 
 
-bin_PROGRAMS=orxonox
-
+bin_PROGRAMS=orxonox 
+noinst_LIBRARIES = libORXgui.a
+
+orxonox_DEPENDENCIES = libORXgui.a
+orxonox_LDADD = libORXgui.a $(GTK2_LIBS) $(GTHREAD_LIBS) $(CURL_LIBS)
 orxonox_SOURCES= orxonox.cc \
 		 game_loader.cc \
@@ -36,4 +41,5 @@
 		 track_manager.cc \
 		 track_node.cc \
+		 factory.cc \
 		 util/animation/animation.cc \
 		 util/animation/animation3d.cc \
@@ -69,4 +75,7 @@
 		 lib/graphics/importer/material.cc \
 		 lib/graphics/importer/texture.cc \
+		 lib/graphics/particles/particle_engine.cc \
+		 lib/graphics/particles/particle_system.cc \
+		 lib/graphics/particles/particle_emitter.cc \
 		 lib/lang/base_entity.cc \
 		 lib/lang/base_object.cc \
@@ -76,5 +85,10 @@
 		 lib/math/vector.cc \
 		 lib/math/curve.cc \
-		 glmenu/glmenu_imagescreen.cc 
+		 glmenu/glmenu_imagescreen.cc \
+		 lib/xmlparser/tinyxml.cc \
+		 lib/xmlparser/tinystr.cc \
+		 lib/xmlparser/tinyxmlerror.cc \
+		 lib/xmlparser/tinyxmlparser.cc \
+		 subprojects/benchmark.cc
 
 noinst_HEADERS = orxonox.h \
@@ -119,4 +133,5 @@
 		 defs/error.h \
 		 defs/debug.h \
+		 defs/globals.h \
 		 lib/coord/p_node.h \
 		 lib/coord/null_parent.h \
@@ -125,4 +140,7 @@
 		 lib/graphics/light.h \
 		 lib/graphics/text_engine.h \
+		 lib/graphics/particles/particle_engine.h \
+		 lib/graphics/particles/particle_system.h \
+		 lib/graphics/particles/particle_emitter.h \
 		 lib/data/data_tank.h \
 		 lib/lang/base_entity.h \
@@ -134,5 +152,29 @@
 		 lib/math/vector.h \
 		 lib/math/curve.h \
-		 glmenu/glmenu_imagescreen.h 
+		 glmenu/glmenu_imagescreen.h \
+		 lib/gui/gui/gui.h \
+	         lib/gui/gui/gui_gtk.h \
+	         lib/gui/gui/gui_element.h \
+	         lib/gui/gui/gui_video.h \
+	         lib/gui/gui/gui_audio.h \
+	         lib/gui/gui/gui_exec.h \
+	         lib/gui/gui/gui_flags.h \
+	         lib/gui/gui/gui_banner.h \
+	         lib/gui/gui/gui_keys.h \
+	         lib/gui/gui/gui_update.h \
+		 subprojects/benchmark.h
+
+libORXgui_a_CPPFLAGS=$(GTK2_CFLAGS) $(GTHREAD_CFLAGS) $(CURL_CFLAGS) $(MSBITFIELDS)
+
+libORXgui_a_SOURCES = lib/gui/gui/gui.cc \
+			    lib/gui/gui/gui_gtk.cc \
+	                    lib/gui/gui/gui_element.cc \
+	       	            lib/gui/gui/gui_video.cc \
+	                    lib/gui/gui/gui_audio.cc \
+	                    lib/gui/gui/gui_exec.cc \
+	                    lib/gui/gui/gui_flags.cc \
+	                    lib/gui/gui/gui_banner.cc \
+	                    lib/gui/gui/gui_keys.cc \
+	                    lib/gui/gui/gui_update.cc
 
 
Index: orxonox/branches/openAL/src/Makefile.in
===================================================================
--- orxonox/branches/openAL/src/Makefile.in	(revision 3921)
+++ orxonox/branches/openAL/src/Makefile.in	(revision 4194)
@@ -16,5 +16,6 @@
 
 
-SOURCES = $(orxonox_SOURCES)
+
+SOURCES = $(libORXgui_a_SOURCES) $(orxonox_SOURCES)
 
 srcdir = @srcdir@
@@ -50,4 +51,19 @@
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+libORXgui_a_AR = $(AR) $(ARFLAGS)
+libORXgui_a_LIBADD =
+am_libORXgui_a_OBJECTS = libORXgui_a-gui.$(OBJEXT) \
+	libORXgui_a-gui_gtk.$(OBJEXT) \
+	libORXgui_a-gui_element.$(OBJEXT) \
+	libORXgui_a-gui_video.$(OBJEXT) \
+	libORXgui_a-gui_audio.$(OBJEXT) libORXgui_a-gui_exec.$(OBJEXT) \
+	libORXgui_a-gui_flags.$(OBJEXT) \
+	libORXgui_a-gui_banner.$(OBJEXT) \
+	libORXgui_a-gui_keys.$(OBJEXT) \
+	libORXgui_a-gui_update.$(OBJEXT)
+libORXgui_a_OBJECTS = $(am_libORXgui_a_OBJECTS)
 am__installdirs = "$(DESTDIR)$(bindir)"
 binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
@@ -55,5 +71,5 @@
 am_orxonox_OBJECTS = orxonox.$(OBJEXT) game_loader.$(OBJEXT) \
 	command_node.$(OBJEXT) keynames.$(OBJEXT) camera.$(OBJEXT) \
-	track_manager.$(OBJEXT) track_node.$(OBJEXT) \
+	track_manager.$(OBJEXT) track_node.$(OBJEXT) factory.$(OBJEXT) \
 	animation.$(OBJEXT) animation3d.$(OBJEXT) \
 	animation_player.$(OBJEXT) garbage_collector.$(OBJEXT) \
@@ -68,9 +84,13 @@
 	text_engine.$(OBJEXT) array.$(OBJEXT) objModel.$(OBJEXT) \
 	primitive_model.$(OBJEXT) model.$(OBJEXT) material.$(OBJEXT) \
-	texture.$(OBJEXT) base_entity.$(OBJEXT) base_object.$(OBJEXT) \
+	texture.$(OBJEXT) particle_engine.$(OBJEXT) \
+	particle_system.$(OBJEXT) particle_emitter.$(OBJEXT) \
+	base_entity.$(OBJEXT) base_object.$(OBJEXT) \
 	ini_parser.$(OBJEXT) list.$(OBJEXT) resource_manager.$(OBJEXT) \
-	vector.$(OBJEXT) curve.$(OBJEXT) glmenu_imagescreen.$(OBJEXT)
+	vector.$(OBJEXT) curve.$(OBJEXT) glmenu_imagescreen.$(OBJEXT) \
+	tinyxml.$(OBJEXT) tinystr.$(OBJEXT) tinyxmlerror.$(OBJEXT) \
+	tinyxmlparser.$(OBJEXT) benchmark.$(OBJEXT)
 orxonox_OBJECTS = $(am_orxonox_OBJECTS)
-orxonox_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
@@ -80,10 +100,11 @@
 @AMDEP_TRUE@	./$(DEPDIR)/animation_player.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/array.Po ./$(DEPDIR)/base_entity.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/base_object.Po ./$(DEPDIR)/camera.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/base_object.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/benchmark.Po ./$(DEPDIR)/camera.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/campaign.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/character_attributes.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/command_node.Po ./$(DEPDIR)/curve.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/data_tank.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/environment.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/environment.Po ./$(DEPDIR)/factory.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/game_loader.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/garbage_collector.Po \
@@ -92,8 +113,21 @@
 @AMDEP_TRUE@	./$(DEPDIR)/helper_parent.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/ini_parser.Po ./$(DEPDIR)/keynames.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/libORXgui_a-gui.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/libORXgui_a-gui_audio.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/libORXgui_a-gui_banner.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/libORXgui_a-gui_element.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/libORXgui_a-gui_exec.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/libORXgui_a-gui_flags.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/libORXgui_a-gui_gtk.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/libORXgui_a-gui_keys.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/libORXgui_a-gui_update.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/libORXgui_a-gui_video.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/light.Po ./$(DEPDIR)/list.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/material.Po ./$(DEPDIR)/model.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/null_parent.Po ./$(DEPDIR)/objModel.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/orxonox.Po ./$(DEPDIR)/p_node.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/particle_emitter.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/particle_engine.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/particle_system.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/player.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/primitive_model.Po \
@@ -105,4 +139,7 @@
 @AMDEP_TRUE@	./$(DEPDIR)/test_bullet.Po ./$(DEPDIR)/test_gun.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/text_engine.Po ./$(DEPDIR)/texture.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/tinystr.Po ./$(DEPDIR)/tinyxml.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/tinyxmlerror.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/tinyxmlparser.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/track_manager.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/track_node.Po ./$(DEPDIR)/vector.Po \
@@ -114,6 +151,6 @@
 CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
 	-o $@
-SOURCES = $(orxonox_SOURCES)
-DIST_SOURCES = $(orxonox_SOURCES)
+SOURCES = $(libORXgui_a_SOURCES) $(orxonox_SOURCES)
+DIST_SOURCES = $(libORXgui_a_SOURCES) $(orxonox_SOURCES)
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
 	html-recursive info-recursive install-data-recursive \
@@ -160,12 +197,8 @@
 EXEEXT = @EXEEXT@
 GPROF = @GPROF@
-GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
-GTHREAD_LIBS = @GTHREAD_LIBS@
 GTK2_CFLAGS = @GTK2_CFLAGS@
 GTK2_LIBS = @GTK2_LIBS@
 HAVE_CURL_FALSE = @HAVE_CURL_FALSE@
 HAVE_CURL_TRUE = @HAVE_CURL_TRUE@
-HAVE_GTHREAD_FALSE = @HAVE_GTHREAD_FALSE@
-HAVE_GTHREAD_TRUE = @HAVE_GTHREAD_TRUE@
 HAVE_GTK2_FALSE = @HAVE_GTK2_FALSE@
 HAVE_GTK2_TRUE = @HAVE_GTK2_TRUE@
@@ -188,4 +221,6 @@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -196,4 +231,5 @@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
@@ -237,6 +273,8 @@
 target_vendor = @target_vendor@
 MAINSRCDIR = .
-AM_CXXFLAGS = -I$(MAINSRCDIR) -I$(MAINSRCDIR)/world_entities -I$(MAINSRCDIR)/story_entities -I$(MAINSRCDIR)/lib -I$(MAINSRCDIR)/lib/coord -I$(MAINSRCDIR)/lib/data -I$(MAINSRCDIR)/lib/graphics -I$(MAINSRCDIR)/lib/graphics/importer -I$(MAINSRCDIR)/lib/gui -I$(MAINSRCDIR)/lib/lang -I$(MAINSRCDIR)/lib/util -I$(MAINSRCDIR)/lib/math -I$(MAINSRCDIR)/defs -I$(MAINSRCDIR)/font -I$(MAINSRCDIR)/network -I$(MAINSRCDIR)/glmenu -I$(MAINSRCDIR)/ai -I$(MAINSRCDIR)/util -I$(MAINSRCDIR)/util/animation -I$(MAINSRCDIR)/util/common
-AM_LDFLAGS = $(MWINDOWS)
+AM_CXXFLAGS = -I$(MAINSRCDIR) -I$(MAINSRCDIR)/world_entities -I$(MAINSRCDIR)/story_entities -I$(MAINSRCDIR)/lib -I$(MAINSRCDIR)/lib/coord -I$(MAINSRCDIR)/lib/data -I$(MAINSRCDIR)/lib/graphics -I$(MAINSRCDIR)/lib/graphics/importer -I$(MAINSRCDIR)/lib/graphics/particles -I$(MAINSRCDIR)/lib/gui -I$(MAINSRCDIR)/lib/gui/gui -I$(MAINSRCDIR)/lib/lang -I$(MAINSRCDIR)/lib/util -I$(MAINSRCDIR)/lib/math -I$(MAINSRCDIR)/defs -I$(MAINSRCDIR)/font -I$(MAINSRCDIR)/network -I$(MAINSRCDIR)/glmenu -I$(MAINSRCDIR)/ai -I$(MAINSRCDIR)/util -I$(MAINSRCDIR)/util/animation -I$(MAINSRCDIR)/util/common -I$(MAINSRCDIR)/subprojects
+noinst_LIBRARIES = libORXgui.a
+orxonox_DEPENDENCIES = libORXgui.a
+orxonox_LDADD = libORXgui.a $(GTK2_LIBS) $(GTHREAD_LIBS) $(CURL_LIBS)
 orxonox_SOURCES = orxonox.cc \
 		 game_loader.cc \
@@ -246,4 +284,5 @@
 		 track_manager.cc \
 		 track_node.cc \
+		 factory.cc \
 		 util/animation/animation.cc \
 		 util/animation/animation3d.cc \
@@ -279,4 +318,7 @@
 		 lib/graphics/importer/material.cc \
 		 lib/graphics/importer/texture.cc \
+		 lib/graphics/particles/particle_engine.cc \
+		 lib/graphics/particles/particle_system.cc \
+		 lib/graphics/particles/particle_emitter.cc \
 		 lib/lang/base_entity.cc \
 		 lib/lang/base_object.cc \
@@ -286,5 +328,10 @@
 		 lib/math/vector.cc \
 		 lib/math/curve.cc \
-		 glmenu/glmenu_imagescreen.cc 
+		 glmenu/glmenu_imagescreen.cc \
+		 lib/xmlparser/tinyxml.cc \
+		 lib/xmlparser/tinystr.cc \
+		 lib/xmlparser/tinyxmlerror.cc \
+		 lib/xmlparser/tinyxmlparser.cc \
+		 subprojects/benchmark.cc
 
 noinst_HEADERS = orxonox.h \
@@ -329,4 +376,5 @@
 		 defs/error.h \
 		 defs/debug.h \
+		 defs/globals.h \
 		 lib/coord/p_node.h \
 		 lib/coord/null_parent.h \
@@ -335,4 +383,7 @@
 		 lib/graphics/light.h \
 		 lib/graphics/text_engine.h \
+		 lib/graphics/particles/particle_engine.h \
+		 lib/graphics/particles/particle_system.h \
+		 lib/graphics/particles/particle_emitter.h \
 		 lib/data/data_tank.h \
 		 lib/lang/base_entity.h \
@@ -344,5 +395,28 @@
 		 lib/math/vector.h \
 		 lib/math/curve.h \
-		 glmenu/glmenu_imagescreen.h 
+		 glmenu/glmenu_imagescreen.h \
+		 lib/gui/gui/gui.h \
+	         lib/gui/gui/gui_gtk.h \
+	         lib/gui/gui/gui_element.h \
+	         lib/gui/gui/gui_video.h \
+	         lib/gui/gui/gui_audio.h \
+	         lib/gui/gui/gui_exec.h \
+	         lib/gui/gui/gui_flags.h \
+	         lib/gui/gui/gui_banner.h \
+	         lib/gui/gui/gui_keys.h \
+	         lib/gui/gui/gui_update.h \
+		 subprojects/benchmark.h
+
+libORXgui_a_CPPFLAGS = $(GTK2_CFLAGS) $(GTHREAD_CFLAGS) $(CURL_CFLAGS) $(MSBITFIELDS)
+libORXgui_a_SOURCES = lib/gui/gui/gui.cc \
+			    lib/gui/gui/gui_gtk.cc \
+	                    lib/gui/gui/gui_element.cc \
+	       	            lib/gui/gui/gui_video.cc \
+	                    lib/gui/gui/gui_audio.cc \
+	                    lib/gui/gui/gui_exec.cc \
+	                    lib/gui/gui/gui_flags.cc \
+	                    lib/gui/gui/gui_banner.cc \
+	                    lib/gui/gui/gui_keys.cc \
+	                    lib/gui/gui/gui_update.cc
 
 EXTRA_DIST = orxonox.conf \
@@ -392,4 +466,11 @@
 $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLIBRARIES:
+	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libORXgui.a: $(libORXgui_a_OBJECTS) $(libORXgui_a_DEPENDENCIES) 
+	-rm -f libORXgui.a
+	$(libORXgui_a_AR) libORXgui.a $(libORXgui_a_OBJECTS) $(libORXgui_a_LIBADD)
+	$(RANLIB) libORXgui.a
 install-binPROGRAMS: $(bin_PROGRAMS)
 	@$(NORMAL_INSTALL)
@@ -432,4 +513,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base_entity.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base_object.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/benchmark.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/camera.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/campaign.Po@am__quote@
@@ -439,4 +521,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data_tank.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/environment.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/factory.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/game_loader.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/garbage_collector.Po@am__quote@
@@ -446,4 +529,14 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ini_parser.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keynames.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libORXgui_a-gui.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libORXgui_a-gui_audio.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libORXgui_a-gui_banner.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libORXgui_a-gui_element.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libORXgui_a-gui_exec.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libORXgui_a-gui_flags.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libORXgui_a-gui_gtk.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libORXgui_a-gui_keys.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libORXgui_a-gui_update.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libORXgui_a-gui_video.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/light.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list.Po@am__quote@
@@ -454,4 +547,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/p_node.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/particle_emitter.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/particle_engine.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/particle_system.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/player.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/primitive_model.Po@am__quote@
@@ -467,4 +563,8 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/text_engine.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/texture.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tinystr.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tinyxml.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tinyxmlerror.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tinyxmlparser.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/track_manager.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/track_node.Po@am__quote@
@@ -490,4 +590,164 @@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
+libORXgui_a-gui.o: lib/gui/gui/gui.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui.o -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui.Tpo" -c -o libORXgui_a-gui.o `test -f 'lib/gui/gui/gui.cc' || echo '$(srcdir)/'`lib/gui/gui/gui.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui.Tpo" "$(DEPDIR)/libORXgui_a-gui.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui.cc' object='libORXgui_a-gui.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui.o `test -f 'lib/gui/gui/gui.cc' || echo '$(srcdir)/'`lib/gui/gui/gui.cc
+
+libORXgui_a-gui.obj: lib/gui/gui/gui.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui.obj -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui.Tpo" -c -o libORXgui_a-gui.obj `if test -f 'lib/gui/gui/gui.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui.Tpo" "$(DEPDIR)/libORXgui_a-gui.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui.cc' object='libORXgui_a-gui.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui.obj `if test -f 'lib/gui/gui/gui.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui.cc'; fi`
+
+libORXgui_a-gui_gtk.o: lib/gui/gui/gui_gtk.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui_gtk.o -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui_gtk.Tpo" -c -o libORXgui_a-gui_gtk.o `test -f 'lib/gui/gui/gui_gtk.cc' || echo '$(srcdir)/'`lib/gui/gui/gui_gtk.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui_gtk.Tpo" "$(DEPDIR)/libORXgui_a-gui_gtk.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui_gtk.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui_gtk.cc' object='libORXgui_a-gui_gtk.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui_gtk.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui_gtk.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui_gtk.o `test -f 'lib/gui/gui/gui_gtk.cc' || echo '$(srcdir)/'`lib/gui/gui/gui_gtk.cc
+
+libORXgui_a-gui_gtk.obj: lib/gui/gui/gui_gtk.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui_gtk.obj -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui_gtk.Tpo" -c -o libORXgui_a-gui_gtk.obj `if test -f 'lib/gui/gui/gui_gtk.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui_gtk.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui_gtk.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui_gtk.Tpo" "$(DEPDIR)/libORXgui_a-gui_gtk.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui_gtk.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui_gtk.cc' object='libORXgui_a-gui_gtk.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui_gtk.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui_gtk.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui_gtk.obj `if test -f 'lib/gui/gui/gui_gtk.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui_gtk.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui_gtk.cc'; fi`
+
+libORXgui_a-gui_element.o: lib/gui/gui/gui_element.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui_element.o -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui_element.Tpo" -c -o libORXgui_a-gui_element.o `test -f 'lib/gui/gui/gui_element.cc' || echo '$(srcdir)/'`lib/gui/gui/gui_element.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui_element.Tpo" "$(DEPDIR)/libORXgui_a-gui_element.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui_element.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui_element.cc' object='libORXgui_a-gui_element.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui_element.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui_element.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui_element.o `test -f 'lib/gui/gui/gui_element.cc' || echo '$(srcdir)/'`lib/gui/gui/gui_element.cc
+
+libORXgui_a-gui_element.obj: lib/gui/gui/gui_element.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui_element.obj -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui_element.Tpo" -c -o libORXgui_a-gui_element.obj `if test -f 'lib/gui/gui/gui_element.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui_element.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui_element.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui_element.Tpo" "$(DEPDIR)/libORXgui_a-gui_element.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui_element.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui_element.cc' object='libORXgui_a-gui_element.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui_element.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui_element.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui_element.obj `if test -f 'lib/gui/gui/gui_element.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui_element.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui_element.cc'; fi`
+
+libORXgui_a-gui_video.o: lib/gui/gui/gui_video.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui_video.o -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui_video.Tpo" -c -o libORXgui_a-gui_video.o `test -f 'lib/gui/gui/gui_video.cc' || echo '$(srcdir)/'`lib/gui/gui/gui_video.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui_video.Tpo" "$(DEPDIR)/libORXgui_a-gui_video.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui_video.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui_video.cc' object='libORXgui_a-gui_video.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui_video.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui_video.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui_video.o `test -f 'lib/gui/gui/gui_video.cc' || echo '$(srcdir)/'`lib/gui/gui/gui_video.cc
+
+libORXgui_a-gui_video.obj: lib/gui/gui/gui_video.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui_video.obj -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui_video.Tpo" -c -o libORXgui_a-gui_video.obj `if test -f 'lib/gui/gui/gui_video.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui_video.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui_video.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui_video.Tpo" "$(DEPDIR)/libORXgui_a-gui_video.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui_video.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui_video.cc' object='libORXgui_a-gui_video.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui_video.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui_video.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui_video.obj `if test -f 'lib/gui/gui/gui_video.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui_video.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui_video.cc'; fi`
+
+libORXgui_a-gui_audio.o: lib/gui/gui/gui_audio.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui_audio.o -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui_audio.Tpo" -c -o libORXgui_a-gui_audio.o `test -f 'lib/gui/gui/gui_audio.cc' || echo '$(srcdir)/'`lib/gui/gui/gui_audio.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui_audio.Tpo" "$(DEPDIR)/libORXgui_a-gui_audio.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui_audio.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui_audio.cc' object='libORXgui_a-gui_audio.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui_audio.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui_audio.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui_audio.o `test -f 'lib/gui/gui/gui_audio.cc' || echo '$(srcdir)/'`lib/gui/gui/gui_audio.cc
+
+libORXgui_a-gui_audio.obj: lib/gui/gui/gui_audio.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui_audio.obj -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui_audio.Tpo" -c -o libORXgui_a-gui_audio.obj `if test -f 'lib/gui/gui/gui_audio.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui_audio.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui_audio.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui_audio.Tpo" "$(DEPDIR)/libORXgui_a-gui_audio.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui_audio.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui_audio.cc' object='libORXgui_a-gui_audio.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui_audio.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui_audio.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui_audio.obj `if test -f 'lib/gui/gui/gui_audio.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui_audio.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui_audio.cc'; fi`
+
+libORXgui_a-gui_exec.o: lib/gui/gui/gui_exec.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui_exec.o -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui_exec.Tpo" -c -o libORXgui_a-gui_exec.o `test -f 'lib/gui/gui/gui_exec.cc' || echo '$(srcdir)/'`lib/gui/gui/gui_exec.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui_exec.Tpo" "$(DEPDIR)/libORXgui_a-gui_exec.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui_exec.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui_exec.cc' object='libORXgui_a-gui_exec.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui_exec.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui_exec.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui_exec.o `test -f 'lib/gui/gui/gui_exec.cc' || echo '$(srcdir)/'`lib/gui/gui/gui_exec.cc
+
+libORXgui_a-gui_exec.obj: lib/gui/gui/gui_exec.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui_exec.obj -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui_exec.Tpo" -c -o libORXgui_a-gui_exec.obj `if test -f 'lib/gui/gui/gui_exec.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui_exec.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui_exec.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui_exec.Tpo" "$(DEPDIR)/libORXgui_a-gui_exec.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui_exec.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui_exec.cc' object='libORXgui_a-gui_exec.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui_exec.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui_exec.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui_exec.obj `if test -f 'lib/gui/gui/gui_exec.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui_exec.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui_exec.cc'; fi`
+
+libORXgui_a-gui_flags.o: lib/gui/gui/gui_flags.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui_flags.o -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui_flags.Tpo" -c -o libORXgui_a-gui_flags.o `test -f 'lib/gui/gui/gui_flags.cc' || echo '$(srcdir)/'`lib/gui/gui/gui_flags.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui_flags.Tpo" "$(DEPDIR)/libORXgui_a-gui_flags.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui_flags.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui_flags.cc' object='libORXgui_a-gui_flags.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui_flags.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui_flags.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui_flags.o `test -f 'lib/gui/gui/gui_flags.cc' || echo '$(srcdir)/'`lib/gui/gui/gui_flags.cc
+
+libORXgui_a-gui_flags.obj: lib/gui/gui/gui_flags.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui_flags.obj -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui_flags.Tpo" -c -o libORXgui_a-gui_flags.obj `if test -f 'lib/gui/gui/gui_flags.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui_flags.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui_flags.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui_flags.Tpo" "$(DEPDIR)/libORXgui_a-gui_flags.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui_flags.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui_flags.cc' object='libORXgui_a-gui_flags.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui_flags.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui_flags.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui_flags.obj `if test -f 'lib/gui/gui/gui_flags.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui_flags.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui_flags.cc'; fi`
+
+libORXgui_a-gui_banner.o: lib/gui/gui/gui_banner.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui_banner.o -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui_banner.Tpo" -c -o libORXgui_a-gui_banner.o `test -f 'lib/gui/gui/gui_banner.cc' || echo '$(srcdir)/'`lib/gui/gui/gui_banner.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui_banner.Tpo" "$(DEPDIR)/libORXgui_a-gui_banner.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui_banner.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui_banner.cc' object='libORXgui_a-gui_banner.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui_banner.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui_banner.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui_banner.o `test -f 'lib/gui/gui/gui_banner.cc' || echo '$(srcdir)/'`lib/gui/gui/gui_banner.cc
+
+libORXgui_a-gui_banner.obj: lib/gui/gui/gui_banner.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui_banner.obj -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui_banner.Tpo" -c -o libORXgui_a-gui_banner.obj `if test -f 'lib/gui/gui/gui_banner.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui_banner.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui_banner.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui_banner.Tpo" "$(DEPDIR)/libORXgui_a-gui_banner.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui_banner.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui_banner.cc' object='libORXgui_a-gui_banner.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui_banner.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui_banner.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui_banner.obj `if test -f 'lib/gui/gui/gui_banner.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui_banner.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui_banner.cc'; fi`
+
+libORXgui_a-gui_keys.o: lib/gui/gui/gui_keys.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui_keys.o -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui_keys.Tpo" -c -o libORXgui_a-gui_keys.o `test -f 'lib/gui/gui/gui_keys.cc' || echo '$(srcdir)/'`lib/gui/gui/gui_keys.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui_keys.Tpo" "$(DEPDIR)/libORXgui_a-gui_keys.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui_keys.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui_keys.cc' object='libORXgui_a-gui_keys.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui_keys.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui_keys.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui_keys.o `test -f 'lib/gui/gui/gui_keys.cc' || echo '$(srcdir)/'`lib/gui/gui/gui_keys.cc
+
+libORXgui_a-gui_keys.obj: lib/gui/gui/gui_keys.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui_keys.obj -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui_keys.Tpo" -c -o libORXgui_a-gui_keys.obj `if test -f 'lib/gui/gui/gui_keys.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui_keys.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui_keys.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui_keys.Tpo" "$(DEPDIR)/libORXgui_a-gui_keys.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui_keys.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui_keys.cc' object='libORXgui_a-gui_keys.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui_keys.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui_keys.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui_keys.obj `if test -f 'lib/gui/gui/gui_keys.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui_keys.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui_keys.cc'; fi`
+
+libORXgui_a-gui_update.o: lib/gui/gui/gui_update.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui_update.o -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui_update.Tpo" -c -o libORXgui_a-gui_update.o `test -f 'lib/gui/gui/gui_update.cc' || echo '$(srcdir)/'`lib/gui/gui/gui_update.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui_update.Tpo" "$(DEPDIR)/libORXgui_a-gui_update.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui_update.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui_update.cc' object='libORXgui_a-gui_update.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui_update.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui_update.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui_update.o `test -f 'lib/gui/gui/gui_update.cc' || echo '$(srcdir)/'`lib/gui/gui/gui_update.cc
+
+libORXgui_a-gui_update.obj: lib/gui/gui/gui_update.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libORXgui_a-gui_update.obj -MD -MP -MF "$(DEPDIR)/libORXgui_a-gui_update.Tpo" -c -o libORXgui_a-gui_update.obj `if test -f 'lib/gui/gui/gui_update.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui_update.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui_update.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libORXgui_a-gui_update.Tpo" "$(DEPDIR)/libORXgui_a-gui_update.Po"; else rm -f "$(DEPDIR)/libORXgui_a-gui_update.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/gui/gui/gui_update.cc' object='libORXgui_a-gui_update.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/libORXgui_a-gui_update.Po' tmpdepfile='$(DEPDIR)/libORXgui_a-gui_update.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libORXgui_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libORXgui_a-gui_update.obj `if test -f 'lib/gui/gui/gui_update.cc'; then $(CYGPATH_W) 'lib/gui/gui/gui_update.cc'; else $(CYGPATH_W) '$(srcdir)/lib/gui/gui/gui_update.cc'; fi`
+
 camera.o: world_entities/camera.cc
 @am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT camera.o -MD -MP -MF "$(DEPDIR)/camera.Tpo" -c -o camera.o `test -f 'world_entities/camera.cc' || echo '$(srcdir)/'`world_entities/camera.cc; \
@@ -1018,4 +1278,52 @@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o texture.obj `if test -f 'lib/graphics/importer/texture.cc'; then $(CYGPATH_W) 'lib/graphics/importer/texture.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/importer/texture.cc'; fi`
 
+particle_engine.o: lib/graphics/particles/particle_engine.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT particle_engine.o -MD -MP -MF "$(DEPDIR)/particle_engine.Tpo" -c -o particle_engine.o `test -f 'lib/graphics/particles/particle_engine.cc' || echo '$(srcdir)/'`lib/graphics/particles/particle_engine.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/particle_engine.Tpo" "$(DEPDIR)/particle_engine.Po"; else rm -f "$(DEPDIR)/particle_engine.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/particles/particle_engine.cc' object='particle_engine.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/particle_engine.Po' tmpdepfile='$(DEPDIR)/particle_engine.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o particle_engine.o `test -f 'lib/graphics/particles/particle_engine.cc' || echo '$(srcdir)/'`lib/graphics/particles/particle_engine.cc
+
+particle_engine.obj: lib/graphics/particles/particle_engine.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT particle_engine.obj -MD -MP -MF "$(DEPDIR)/particle_engine.Tpo" -c -o particle_engine.obj `if test -f 'lib/graphics/particles/particle_engine.cc'; then $(CYGPATH_W) 'lib/graphics/particles/particle_engine.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/particles/particle_engine.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/particle_engine.Tpo" "$(DEPDIR)/particle_engine.Po"; else rm -f "$(DEPDIR)/particle_engine.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/particles/particle_engine.cc' object='particle_engine.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/particle_engine.Po' tmpdepfile='$(DEPDIR)/particle_engine.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o particle_engine.obj `if test -f 'lib/graphics/particles/particle_engine.cc'; then $(CYGPATH_W) 'lib/graphics/particles/particle_engine.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/particles/particle_engine.cc'; fi`
+
+particle_system.o: lib/graphics/particles/particle_system.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT particle_system.o -MD -MP -MF "$(DEPDIR)/particle_system.Tpo" -c -o particle_system.o `test -f 'lib/graphics/particles/particle_system.cc' || echo '$(srcdir)/'`lib/graphics/particles/particle_system.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/particle_system.Tpo" "$(DEPDIR)/particle_system.Po"; else rm -f "$(DEPDIR)/particle_system.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/particles/particle_system.cc' object='particle_system.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/particle_system.Po' tmpdepfile='$(DEPDIR)/particle_system.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o particle_system.o `test -f 'lib/graphics/particles/particle_system.cc' || echo '$(srcdir)/'`lib/graphics/particles/particle_system.cc
+
+particle_system.obj: lib/graphics/particles/particle_system.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT particle_system.obj -MD -MP -MF "$(DEPDIR)/particle_system.Tpo" -c -o particle_system.obj `if test -f 'lib/graphics/particles/particle_system.cc'; then $(CYGPATH_W) 'lib/graphics/particles/particle_system.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/particles/particle_system.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/particle_system.Tpo" "$(DEPDIR)/particle_system.Po"; else rm -f "$(DEPDIR)/particle_system.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/particles/particle_system.cc' object='particle_system.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/particle_system.Po' tmpdepfile='$(DEPDIR)/particle_system.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o particle_system.obj `if test -f 'lib/graphics/particles/particle_system.cc'; then $(CYGPATH_W) 'lib/graphics/particles/particle_system.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/particles/particle_system.cc'; fi`
+
+particle_emitter.o: lib/graphics/particles/particle_emitter.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT particle_emitter.o -MD -MP -MF "$(DEPDIR)/particle_emitter.Tpo" -c -o particle_emitter.o `test -f 'lib/graphics/particles/particle_emitter.cc' || echo '$(srcdir)/'`lib/graphics/particles/particle_emitter.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/particle_emitter.Tpo" "$(DEPDIR)/particle_emitter.Po"; else rm -f "$(DEPDIR)/particle_emitter.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/particles/particle_emitter.cc' object='particle_emitter.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/particle_emitter.Po' tmpdepfile='$(DEPDIR)/particle_emitter.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o particle_emitter.o `test -f 'lib/graphics/particles/particle_emitter.cc' || echo '$(srcdir)/'`lib/graphics/particles/particle_emitter.cc
+
+particle_emitter.obj: lib/graphics/particles/particle_emitter.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT particle_emitter.obj -MD -MP -MF "$(DEPDIR)/particle_emitter.Tpo" -c -o particle_emitter.obj `if test -f 'lib/graphics/particles/particle_emitter.cc'; then $(CYGPATH_W) 'lib/graphics/particles/particle_emitter.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/particles/particle_emitter.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/particle_emitter.Tpo" "$(DEPDIR)/particle_emitter.Po"; else rm -f "$(DEPDIR)/particle_emitter.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/graphics/particles/particle_emitter.cc' object='particle_emitter.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/particle_emitter.Po' tmpdepfile='$(DEPDIR)/particle_emitter.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o particle_emitter.obj `if test -f 'lib/graphics/particles/particle_emitter.cc'; then $(CYGPATH_W) 'lib/graphics/particles/particle_emitter.cc'; else $(CYGPATH_W) '$(srcdir)/lib/graphics/particles/particle_emitter.cc'; fi`
+
 base_entity.o: lib/lang/base_entity.cc
 @am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT base_entity.o -MD -MP -MF "$(DEPDIR)/base_entity.Tpo" -c -o base_entity.o `test -f 'lib/lang/base_entity.cc' || echo '$(srcdir)/'`lib/lang/base_entity.cc; \
@@ -1145,4 +1453,84 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o glmenu_imagescreen.obj `if test -f 'glmenu/glmenu_imagescreen.cc'; then $(CYGPATH_W) 'glmenu/glmenu_imagescreen.cc'; else $(CYGPATH_W) '$(srcdir)/glmenu/glmenu_imagescreen.cc'; fi`
+
+tinyxml.o: lib/xmlparser/tinyxml.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinyxml.o -MD -MP -MF "$(DEPDIR)/tinyxml.Tpo" -c -o tinyxml.o `test -f 'lib/xmlparser/tinyxml.cc' || echo '$(srcdir)/'`lib/xmlparser/tinyxml.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/tinyxml.Tpo" "$(DEPDIR)/tinyxml.Po"; else rm -f "$(DEPDIR)/tinyxml.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/xmlparser/tinyxml.cc' object='tinyxml.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/tinyxml.Po' tmpdepfile='$(DEPDIR)/tinyxml.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinyxml.o `test -f 'lib/xmlparser/tinyxml.cc' || echo '$(srcdir)/'`lib/xmlparser/tinyxml.cc
+
+tinyxml.obj: lib/xmlparser/tinyxml.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinyxml.obj -MD -MP -MF "$(DEPDIR)/tinyxml.Tpo" -c -o tinyxml.obj `if test -f 'lib/xmlparser/tinyxml.cc'; then $(CYGPATH_W) 'lib/xmlparser/tinyxml.cc'; else $(CYGPATH_W) '$(srcdir)/lib/xmlparser/tinyxml.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/tinyxml.Tpo" "$(DEPDIR)/tinyxml.Po"; else rm -f "$(DEPDIR)/tinyxml.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/xmlparser/tinyxml.cc' object='tinyxml.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/tinyxml.Po' tmpdepfile='$(DEPDIR)/tinyxml.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinyxml.obj `if test -f 'lib/xmlparser/tinyxml.cc'; then $(CYGPATH_W) 'lib/xmlparser/tinyxml.cc'; else $(CYGPATH_W) '$(srcdir)/lib/xmlparser/tinyxml.cc'; fi`
+
+tinystr.o: lib/xmlparser/tinystr.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinystr.o -MD -MP -MF "$(DEPDIR)/tinystr.Tpo" -c -o tinystr.o `test -f 'lib/xmlparser/tinystr.cc' || echo '$(srcdir)/'`lib/xmlparser/tinystr.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/tinystr.Tpo" "$(DEPDIR)/tinystr.Po"; else rm -f "$(DEPDIR)/tinystr.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/xmlparser/tinystr.cc' object='tinystr.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/tinystr.Po' tmpdepfile='$(DEPDIR)/tinystr.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinystr.o `test -f 'lib/xmlparser/tinystr.cc' || echo '$(srcdir)/'`lib/xmlparser/tinystr.cc
+
+tinystr.obj: lib/xmlparser/tinystr.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinystr.obj -MD -MP -MF "$(DEPDIR)/tinystr.Tpo" -c -o tinystr.obj `if test -f 'lib/xmlparser/tinystr.cc'; then $(CYGPATH_W) 'lib/xmlparser/tinystr.cc'; else $(CYGPATH_W) '$(srcdir)/lib/xmlparser/tinystr.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/tinystr.Tpo" "$(DEPDIR)/tinystr.Po"; else rm -f "$(DEPDIR)/tinystr.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/xmlparser/tinystr.cc' object='tinystr.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/tinystr.Po' tmpdepfile='$(DEPDIR)/tinystr.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinystr.obj `if test -f 'lib/xmlparser/tinystr.cc'; then $(CYGPATH_W) 'lib/xmlparser/tinystr.cc'; else $(CYGPATH_W) '$(srcdir)/lib/xmlparser/tinystr.cc'; fi`
+
+tinyxmlerror.o: lib/xmlparser/tinyxmlerror.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinyxmlerror.o -MD -MP -MF "$(DEPDIR)/tinyxmlerror.Tpo" -c -o tinyxmlerror.o `test -f 'lib/xmlparser/tinyxmlerror.cc' || echo '$(srcdir)/'`lib/xmlparser/tinyxmlerror.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/tinyxmlerror.Tpo" "$(DEPDIR)/tinyxmlerror.Po"; else rm -f "$(DEPDIR)/tinyxmlerror.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/xmlparser/tinyxmlerror.cc' object='tinyxmlerror.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/tinyxmlerror.Po' tmpdepfile='$(DEPDIR)/tinyxmlerror.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinyxmlerror.o `test -f 'lib/xmlparser/tinyxmlerror.cc' || echo '$(srcdir)/'`lib/xmlparser/tinyxmlerror.cc
+
+tinyxmlerror.obj: lib/xmlparser/tinyxmlerror.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinyxmlerror.obj -MD -MP -MF "$(DEPDIR)/tinyxmlerror.Tpo" -c -o tinyxmlerror.obj `if test -f 'lib/xmlparser/tinyxmlerror.cc'; then $(CYGPATH_W) 'lib/xmlparser/tinyxmlerror.cc'; else $(CYGPATH_W) '$(srcdir)/lib/xmlparser/tinyxmlerror.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/tinyxmlerror.Tpo" "$(DEPDIR)/tinyxmlerror.Po"; else rm -f "$(DEPDIR)/tinyxmlerror.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/xmlparser/tinyxmlerror.cc' object='tinyxmlerror.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/tinyxmlerror.Po' tmpdepfile='$(DEPDIR)/tinyxmlerror.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinyxmlerror.obj `if test -f 'lib/xmlparser/tinyxmlerror.cc'; then $(CYGPATH_W) 'lib/xmlparser/tinyxmlerror.cc'; else $(CYGPATH_W) '$(srcdir)/lib/xmlparser/tinyxmlerror.cc'; fi`
+
+tinyxmlparser.o: lib/xmlparser/tinyxmlparser.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinyxmlparser.o -MD -MP -MF "$(DEPDIR)/tinyxmlparser.Tpo" -c -o tinyxmlparser.o `test -f 'lib/xmlparser/tinyxmlparser.cc' || echo '$(srcdir)/'`lib/xmlparser/tinyxmlparser.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/tinyxmlparser.Tpo" "$(DEPDIR)/tinyxmlparser.Po"; else rm -f "$(DEPDIR)/tinyxmlparser.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/xmlparser/tinyxmlparser.cc' object='tinyxmlparser.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/tinyxmlparser.Po' tmpdepfile='$(DEPDIR)/tinyxmlparser.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinyxmlparser.o `test -f 'lib/xmlparser/tinyxmlparser.cc' || echo '$(srcdir)/'`lib/xmlparser/tinyxmlparser.cc
+
+tinyxmlparser.obj: lib/xmlparser/tinyxmlparser.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT tinyxmlparser.obj -MD -MP -MF "$(DEPDIR)/tinyxmlparser.Tpo" -c -o tinyxmlparser.obj `if test -f 'lib/xmlparser/tinyxmlparser.cc'; then $(CYGPATH_W) 'lib/xmlparser/tinyxmlparser.cc'; else $(CYGPATH_W) '$(srcdir)/lib/xmlparser/tinyxmlparser.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/tinyxmlparser.Tpo" "$(DEPDIR)/tinyxmlparser.Po"; else rm -f "$(DEPDIR)/tinyxmlparser.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='lib/xmlparser/tinyxmlparser.cc' object='tinyxmlparser.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/tinyxmlparser.Po' tmpdepfile='$(DEPDIR)/tinyxmlparser.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o tinyxmlparser.obj `if test -f 'lib/xmlparser/tinyxmlparser.cc'; then $(CYGPATH_W) 'lib/xmlparser/tinyxmlparser.cc'; else $(CYGPATH_W) '$(srcdir)/lib/xmlparser/tinyxmlparser.cc'; fi`
+
+benchmark.o: subprojects/benchmark.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT benchmark.o -MD -MP -MF "$(DEPDIR)/benchmark.Tpo" -c -o benchmark.o `test -f 'subprojects/benchmark.cc' || echo '$(srcdir)/'`subprojects/benchmark.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/benchmark.Tpo" "$(DEPDIR)/benchmark.Po"; else rm -f "$(DEPDIR)/benchmark.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='subprojects/benchmark.cc' object='benchmark.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/benchmark.Po' tmpdepfile='$(DEPDIR)/benchmark.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o benchmark.o `test -f 'subprojects/benchmark.cc' || echo '$(srcdir)/'`subprojects/benchmark.cc
+
+benchmark.obj: subprojects/benchmark.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT benchmark.obj -MD -MP -MF "$(DEPDIR)/benchmark.Tpo" -c -o benchmark.obj `if test -f 'subprojects/benchmark.cc'; then $(CYGPATH_W) 'subprojects/benchmark.cc'; else $(CYGPATH_W) '$(srcdir)/subprojects/benchmark.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/benchmark.Tpo" "$(DEPDIR)/benchmark.Po"; else rm -f "$(DEPDIR)/benchmark.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='subprojects/benchmark.cc' object='benchmark.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/benchmark.Po' tmpdepfile='$(DEPDIR)/benchmark.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o benchmark.obj `if test -f 'subprojects/benchmark.cc'; then $(CYGPATH_W) 'subprojects/benchmark.cc'; else $(CYGPATH_W) '$(srcdir)/subprojects/benchmark.cc'; fi`
 uninstall-info-am:
 
@@ -1268,5 +1656,5 @@
 
 distdir: $(DISTFILES)
-	$(mkdir_p) $(distdir)/ai $(distdir)/defs $(distdir)/glmenu $(distdir)/lib/coord $(distdir)/lib/data $(distdir)/lib/graphics $(distdir)/lib/lang $(distdir)/lib/math $(distdir)/lib/util $(distdir)/network $(distdir)/proto $(distdir)/story_entities $(distdir)/util $(distdir)/util/animation $(distdir)/util/common $(distdir)/world_entities
+	$(mkdir_p) $(distdir)/ai $(distdir)/defs $(distdir)/glmenu $(distdir)/lib/coord $(distdir)/lib/data $(distdir)/lib/graphics $(distdir)/lib/graphics/particles $(distdir)/lib/gui/gui $(distdir)/lib/lang $(distdir)/lib/math $(distdir)/lib/util $(distdir)/network $(distdir)/proto $(distdir)/story_entities $(distdir)/subprojects $(distdir)/util $(distdir)/util/animation $(distdir)/util/common $(distdir)/world_entities
 	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
 	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
@@ -1310,5 +1698,5 @@
 check-am: all-am
 check: check-recursive
-all-am: Makefile $(PROGRAMS) $(HEADERS)
+all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(HEADERS)
 installdirs: installdirs-recursive
 installdirs-am:
@@ -1342,5 +1730,6 @@
 clean: clean-recursive
 
-clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+clean-am: clean-binPROGRAMS clean-generic clean-noinstLIBRARIES \
+	mostlyclean-am
 
 distclean: distclean-recursive
@@ -1392,16 +1781,16 @@
 
 .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
-	clean clean-binPROGRAMS clean-generic clean-recursive ctags \
-	ctags-recursive distclean distclean-compile distclean-generic \
-	distclean-recursive distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-binPROGRAMS \
-	install-data install-data-am install-exec install-exec-am \
-	install-info install-info-am install-man install-strip \
-	installcheck installcheck-am installdirs installdirs-am \
-	maintainer-clean maintainer-clean-generic \
-	maintainer-clean-recursive mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-recursive pdf pdf-am ps ps-am \
-	tags tags-recursive uninstall uninstall-am \
-	uninstall-binPROGRAMS uninstall-info-am
+	clean clean-binPROGRAMS clean-generic clean-noinstLIBRARIES \
+	clean-recursive ctags ctags-recursive distclean \
+	distclean-compile distclean-generic distclean-recursive \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-binPROGRAMS install-data \
+	install-data-am install-exec install-exec-am install-info \
+	install-info-am install-man install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic maintainer-clean-recursive \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-am uninstall-binPROGRAMS uninstall-info-am
 
 
Index: orxonox/branches/openAL/src/command_node.cc
===================================================================
--- orxonox/branches/openAL/src/command_node.cc	(revision 3921)
+++ orxonox/branches/openAL/src/command_node.cc	(revision 4194)
@@ -57,5 +57,5 @@
   this->bEnabled = true;
   this->world = NULL;
-  this->loadBindings (filename);
+  this->loadBindings(filename);
 }
 
@@ -111,11 +111,9 @@
    \param filename: The path and name of the file to load the bindings from
 */
-void CommandNode::loadBindings (char* filename)
+void CommandNode::loadBindings (char* filename = DEFAULT_KEYBIND_FILE)
 {
   FILE* stream;
   
   PRINTF(4)("Loading key bindings from %s\n", filename);
-  
-  if( filename == NULL) filename = DEFAULT_KEYBIND_FILE;
   
   // remove old bindings if present
@@ -128,7 +126,7 @@
   // create parser
   IniParser parser (filename);
-  if( parser.getSection ("Bindings") == -1)
-    {
-      PRINTF(1)("Could not find key bindings in %s\n", filename);
+  if( parser.getSection (CONFIG_SECTION_PLAYER "1") == -1)
+    {
+      PRINTF(1)("Could not find key bindings " CONFIG_SECTION_PLAYER"1 in %s\n", filename);
       return;
     }
@@ -144,14 +142,14 @@
   while( parser.nextVar (namebuf, valuebuf) != -1)
     {
-      index = nameToIndex (namebuf);
+      index = nameToIndex (valuebuf);
       switch( index[0])
 	{
 	case 0:
-	  PRINTF(4)("Key binding %d(%s) set to %s\n", index[1], SDLKToKeyname( index[1]), valuebuf);
-	  strcpy (aliases->keys[index[1]], valuebuf);
+	  PRINTF(4)("Key binding %d(%s) set to %s\n", index[1], SDLKToKeyname( index[1]), namebuf);
+	  strcpy (aliases->keys[index[1]], namebuf);
 	  break;
 	case 1:
-	  PRINTF(4)("Button binding %d(%s) set to %s\n", index[1], SDLBToButtonname( index[1]), valuebuf);
-	  strcpy (aliases->buttons[index[1]], valuebuf);
+	  PRINTF(4)("Button binding %d(%s) set to %s\n", index[1], SDLBToButtonname( index[1]), namebuf);
+	  strcpy (aliases->buttons[index[1]], namebuf);
 	  break;
 	default:
@@ -161,4 +159,33 @@
       memset (valuebuf, 0, 256);
     }
+
+
+  // PARSE MISC SECTION
+  if( parser.getSection (CONFIG_SECTION_MISC_KEYS) == -1)
+    {
+      PRINTF(1)("Could not find key bindings in %s\n", filename);
+      return;
+    }
+
+  while( parser.nextVar (namebuf, valuebuf) != -1)
+    {
+      index = nameToIndex (valuebuf);
+      switch( index[0])
+	{
+	case 0:
+	  PRINTF(4)("Key binding %d(%s) set to %s\n", index[1], SDLKToKeyname( index[1]), namebuf);
+	  strcpy (aliases->keys[index[1]], namebuf);
+	  break;
+	case 1:
+	  PRINTF(4)("Button binding %d(%s) set to %s\n", index[1], SDLBToButtonname( index[1]), namebuf);
+	  strcpy (aliases->buttons[index[1]], namebuf);
+	  break;
+	default:
+	  break;
+	}
+      memset (namebuf, 0, 256);
+      memset (valuebuf, 0, 256);
+    }
+
 }
 
Index: orxonox/branches/openAL/src/command_node.h
===================================================================
--- orxonox/branches/openAL/src/command_node.h	(revision 3921)
+++ orxonox/branches/openAL/src/command_node.h	(revision 4194)
@@ -18,5 +18,5 @@
 #define N_STD_KEYS SDLK_LAST
 #define N_BUTTONS 6
-#define DEFAULT_KEYBIND_FILE "default.ini"
+#define DEFAULT_KEYBIND_FILE "~/.orxonox/orxonox.conf"
 
 //! Key aliasing structure
Index: orxonox/branches/openAL/src/defs/debug.h
===================================================================
--- orxonox/branches/openAL/src/defs/debug.h	(revision 3921)
+++ orxonox/branches/openAL/src/defs/debug.h	(revision 4194)
@@ -59,9 +59,9 @@
 #define DEBUG_MODULE_PNODE              1
 #define DEBUG_MODULE_WORLD_ENTITY       0
-#define DEBUG_MODULE_COMMAND_NODE       0
+#define DEBUG_MODULE_COMMAND_NODE       4
 #define DEBUG_MODULE_GRAPHICS           0
-#define DEBUG_MODULE_LOAD               0
-
-#define DEBUG_MODULE_IMPORTER           1
+#define DEBUG_MODULE_LOAD               2
+
+#define DEBUG_MODULE_IMPORTER           3
 #define DEBUG_MODULE_TRACK_MANAGER      0
 #define DEBUG_MODULE_GARBAGE_COLLECTOR  0
@@ -72,4 +72,5 @@
 #define DEBUG_MODULE_FONT               1
 #define DEBUG_MODULE_ANIM               1
+#define DEBUG_MODULE_PARTICLE           4
 
 #define DEBUG_MODULE_NULL_PARENT        0
Index: orxonox/branches/openAL/src/defs/globals.h
===================================================================
--- orxonox/branches/openAL/src/defs/globals.h	(revision 4194)
+++ orxonox/branches/openAL/src/defs/globals.h	(revision 4194)
@@ -0,0 +1,76 @@
+/*!
+  \file globals.h
+  \brief This file defines some default values.
+  
+  no Class is defined here.
+*/
+
+#ifndef _GLOBALS_H
+#define _GLOBALS_H
+
+#define ORXONOX_STAFF "Patrick Boenzli - Captain\n" \
+                      "Benjamin Grauer - First Officer\n" \
+		      "Christian Meyer - Engeneer\n" \
+		      "Nico Bernold - Physics\n" \
+		      "David Gruetter - The ProtoType\n" \
+		      "many more\n" 
+
+#define DEFAULT_CONFIG_FILE "~/.orxonox/orxonox.conf"
+#define DEFAULT_DATA_DIR "/usr/share/orxonox/data/"
+#define DEFAULT_DATA_DIR_CHECKFILE "data.oxd"
+
+// Defines all the Sections of the Config (in Gui and ORxonox)
+//! Name of Section Misc in the config-File
+#define CONFIG_SECTION_MISC "misc"
+#define CONFIG_SECTION_MISC_KEYS "miscKeys"
+#define CONFIG_SECTION_PLAYER "player"
+#define CONFIG_SECTION_VIDEO "video"
+#define CONFIG_SECTION_VIDEO_ADVANCED "video_advanced"
+#define CONFIG_SECTION_AUDIO "audio"
+#define CONFIG_SECTION_EXEC "exec"
+#define CONFIG_SECTION_DATA "data"
+
+/*
+  TAGS for all the Configuration Options
+  Consider they may __not__ have any WhiteSpaces inside
+*/
+#define CONFIG_NAME_DATADIR "DataDir"
+#define CONFIG_NAME_AUTO_UPDATE "Auto-Update"
+#define CONFIG_NAME_FULLSCREEN "Fullscreen-mode"
+#define CONFIG_NAME_RESOLUTION "Resolution"
+#define CONFIG_NAME_WIREFRAME "WireFrame-mode"
+#define CONFIG_NAME_SHADOWS "Shadows"
+#define CONFIG_NAME_FOG "Fog"
+#define CONFIG_NAME_REFLECTIONS "Reflections"
+#define CONFIG_NAME_TEXTURES "TEXTURES"
+#define CONFIG_NAME_TEXTURE_DETAIL "Texture-Detail"
+#define CONFIG_NAME_MODEL_DETAIL "Model-Detail"
+#define CONFIG_NAME_PARTICLES_ENABLED "Particles Enabled"
+#define CONFIG_NAME_ANTI_ALIASING "Anti-Aliasing"
+#define CONFIG_NAME_FILTER_METHOD "Filtering-Method"
+#define CONFIG_NAME_DISABLE_AUDIO "Disable-Audio"
+#define CONFIG_NAME_MUSIC_VOLUME "Music-Volume"
+#define CONFIG_NAME_EFFECTS_VOLUME "Effects-Volume"
+#define CONFIG_NAME_SAVE_SETTINGS "Save-Settings"
+#define CONFIG_NAME_VERBOSE_MODE "Verbose-Mode"
+#define CONFIG_NAME_ALWAYS_SHOW_GUI "Always-Show-The-Gui"
+#define CONFIG_NAME_PLAYER_UP "Up"
+#define CONFIG_NAME_PLAYER_DOWN "Down"
+#define CONFIG_NAME_PLAYER_LEFT "Left"
+#define CONFIG_NAME_PLAYER_RIGHT "Right"
+#define CONFIG_NAME_PLAYER_FIRE "Fire"
+#define CONFIG_NAME_PLAYER_NEXT_WEAPON "Next"
+#define CONFIG_NAME_PLAYER_PREV_WEAPON "Prev"
+#define CONFIG_NAME_QUIT "Quit"
+#define CONFIG_NAME_PAUSE "Pause"
+#define CONFIG_NAME_NEXT_WORLD "Next-World"
+#define CONFIG_NAME_PREV_WORLD "Prev-World"
+#define CONFIG_NAME_VIEW0 "view0"
+#define CONFIG_NAME_VIEW1 "view1"
+#define CONFIG_NAME_VIEW2 "view2"
+#define CONFIG_NAME_VIEW3 "view3"
+#define CONFIG_NAME_VIEW4 "view4"
+#define CONFIG_NAME_VIEW5 "view5"
+
+
+#endif /* _GLOBALS_H */
Index: orxonox/branches/openAL/src/defs/stdincl.h
===================================================================
--- orxonox/branches/openAL/src/defs/stdincl.h	(revision 3921)
+++ orxonox/branches/openAL/src/defs/stdincl.h	(revision 4194)
@@ -25,6 +25,9 @@
 #include "error.h"
 #include "debug.h"
+#include "globals.h"
 
 #include "compiler.h"
+#include "xmlparser/tinyxml.h"
+#include "factory.h"
 
 #endif /* _STDINCL_H */
Index: orxonox/branches/openAL/src/factory.cc
===================================================================
--- orxonox/branches/openAL/src/factory.cc	(revision 4194)
+++ orxonox/branches/openAL/src/factory.cc	(revision 4194)
@@ -0,0 +1,109 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute 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.
+
+   ### File Specific:
+   main-programmer: Christian Meyer
+   co-programmer: ...
+*/
+
+
+#include "factory.h"
+#include "game_loader.h"
+
+using namespace std;
+
+/*  --------------------------------------------------
+ *		 Factory
+ *   --------------------------------------------------
+ */
+
+/**
+   \brief constructor
+   
+   set everything to zero and define factoryName
+*/
+Factory::Factory (const char* name)
+{
+  this->factoryName = NULL;
+  this->setFactoryName(name);
+  next = NULL;
+  
+  initialize();
+}
+
+/**
+   \brief destructor
+   
+   clear the Q
+*/
+Factory::~Factory ()
+{
+  //  printf("%s\n", this->factoryName);
+  //  Factory* tmpDel = this->next;
+  //  this->next = NULL;
+  if (this->next)
+    delete this->next;
+}
+
+void Factory::setFactoryName(const char* name)
+{
+  if (factoryName)
+    delete factoryName;
+  factoryName = new char[strlen(name)+1];
+  strcpy(factoryName, name);
+}
+
+
+/**
+   \brief generates the associated object from data
+*/
+BaseObject* Factory::fabricate( TiXmlElement* data)
+{
+  return NULL;
+}
+
+/**
+   \brief make this particular factory known to the LevelFactory
+*/
+void Factory::initialize()
+{
+  GameLoader* gl = GameLoader::getInstance();
+  gl->registerFactory( this);
+}
+
+/**
+   \brief add a Factory to the Q
+*/
+void Factory::registerFactory( Factory* factory)
+{
+  if( next == NULL) setNext( factory);
+  else next->registerFactory( factory);
+}
+
+const char* grabParameter( TiXmlElement* root, const char* name)
+{
+  TiXmlElement* element;
+  TiXmlNode* node;
+	
+  assert( root != NULL);
+  assert( name != NULL);
+	
+  element = root->FirstChildElement( name);
+  if( element == NULL) return NULL;
+	
+  node = element->FirstChild();
+  while( node != NULL)
+    {
+      if( node->ToText()) return node->Value();
+      node = node->NextSibling();
+    }
+  return NULL;
+}
+
Index: orxonox/branches/openAL/src/factory.h
===================================================================
--- orxonox/branches/openAL/src/factory.h	(revision 4194)
+++ orxonox/branches/openAL/src/factory.h	(revision 4194)
@@ -0,0 +1,84 @@
+/*! 
+    \file factory.h
+    \brief philosophy stuff
+*/
+
+#ifndef _FACTORY_H
+#define _FACTORY_H
+
+class BaseObject;
+
+#include "xmlparser/tinyxml.h"
+#include "debug.h"
+
+/** 
+    Creates a factory to a Loadable Class.
+    this should be used at the beginning of all the Classes that should be loadable (in the cc-file)
+*/
+#define CREATE_FACTORY(x) tFactory<x>* global_ ## x ## Factory = new tFactory<x>(#x)
+
+
+		
+//! The Factory is
+/**
+   Very philosophic description, huh?
+*/
+class Factory {
+
+ public:
+  Factory (const char* name = NULL);
+  ~Factory ();
+  
+
+  virtual BaseObject* fabricate( TiXmlElement* root);
+  void initialize();
+  void registerFactory( Factory* factory);
+  void setFactoryName(const char* name);
+  const char* getFactoryName() {return factoryName;};
+  void setNext( Factory* factory) {next = factory;}
+  Factory* getNext() {return next;}
+	
+ private:
+  char* factoryName;
+	
+  Factory* next;
+};
+
+template<class T> class tFactory : public Factory
+{
+ public:
+  tFactory(const char* name);
+  virtual ~tFactory();
+  
+  private:
+  BaseObject* fabricate( TiXmlElement* root);
+};
+
+template<class T>
+tFactory<T>::tFactory(const char* name) : Factory(name)
+{
+  PRINTF(5)("fileName: %s\n", name);
+}
+  
+
+template<class T>
+tFactory<T>::~tFactory()
+{}
+
+template<class T>
+BaseObject* tFactory<T>::fabricate( TiXmlElement* root) 
+{ 
+  if(!strcmp(root->Value(), getFactoryName()))
+    return new T ( root);
+  else if( getNext() != NULL) 
+    return getNext()->fabricate( root);
+  else 
+    return NULL;
+}
+
+// helper function
+
+const char* grabParameter( TiXmlElement* root, const char* name);
+
+#endif /* _FACTORY_H */
+
Index: orxonox/branches/openAL/src/game_loader.cc
===================================================================
--- orxonox/branches/openAL/src/game_loader.cc	(revision 3921)
+++ orxonox/branches/openAL/src/game_loader.cc	(revision 4194)
@@ -25,4 +25,6 @@
 #include "command_node.h"
 #include "vector.h"
+#include "resource_manager.h"
+#include "factory.h"
 
 #include <string.h>
@@ -35,5 +37,8 @@
 
 
-GameLoader::GameLoader () {}
+GameLoader::GameLoader () 
+{
+  first = NULL;
+}
 
 
@@ -72,6 +77,16 @@
 {
   ErrorMessage errorCode;
-  
-  this->currentCampaign = this->fileToCampaign(name);
+  char* campaignName;
+  if (ResourceManager::isFile(name))
+    {
+      this->currentCampaign = this->fileToCampaign(name);
+    }
+  else
+    {
+      campaignName = new char[strlen(ResourceManager::getInstance()->getDataDir())+strlen(name)];
+      sprintf(campaignName, "%s%s", ResourceManager::getInstance()->getDataDir(), name);
+      this->currentCampaign = this->fileToCampaign(campaignName);
+      delete campaignName;
+    }
 }
 
@@ -158,5 +173,5 @@
    this will interprete the map/campaign files and recursivly load a tree of worlds/campaigns
 */
-Campaign* GameLoader::fileToCampaign(char *name)
+Campaign* GameLoader::fileToCampaign(const char *name)
 {
   /* do not entirely load the campaign. just the current world
@@ -164,4 +179,40 @@
      can load everything it needs into memory then.
   */
+  
+  if( name == NULL)
+    {
+      PRINTF(2)("No filename specified for loading");
+      return NULL;
+    }
+  
+  TiXmlDocument* XMLDoc = new TiXmlDocument( name);
+  // load the campaign document
+  if( !XMLDoc->LoadFile())
+    {
+      // report an error
+      PRINTF(1)("Could not load XML File %s: %s @ %d:%d\n", name, XMLDoc->ErrorDesc(), XMLDoc->ErrorRow(), XMLDoc->ErrorCol());
+      delete XMLDoc;
+      return NULL;
+    }
+	
+  // check basic validity
+  TiXmlElement* root = XMLDoc->RootElement();
+  assert( root != NULL);
+	
+  if( strcmp( root->Value(), "Campaign"))
+    {
+      // report an error
+      PRINTF(2)("Specified XML File is not an orxonox campaign file (Campaign element missing)\n");
+      delete XMLDoc;
+      return NULL;
+    }
+	
+  // construct campaign
+  Campaign* c = new Campaign( root);
+	
+  // free the XML data
+  delete XMLDoc;
+	
+  return c;
 }
 
@@ -174,5 +225,5 @@
 bool GameLoader::worldCommand (Command* cmd)
 {
-  if( !strcmp( cmd->cmd, "up_world"))
+  if( !strcmp( cmd->cmd, CONFIG_NAME_NEXT_WORLD))
     {
       if( !cmd->bUp) 
@@ -182,5 +233,5 @@
       return true;
     }
-  else if( !strcmp( cmd->cmd, "down_world"))
+  else if( !strcmp( cmd->cmd, CONFIG_NAME_PREV_WORLD))
     {
       if( !cmd->bUp)
@@ -190,5 +241,5 @@
       return true;
     }
-  else if( !strcmp( cmd->cmd, "pause"))
+  else if( !strcmp( cmd->cmd, CONFIG_NAME_PAUSE))
     {
       if( !cmd->bUp)
@@ -201,5 +252,5 @@
       return true;
     }
-  else if( !strcmp( cmd->cmd, "quit"))
+  else if( !strcmp( cmd->cmd, CONFIG_NAME_QUIT))
     {
       if( !cmd->bUp) this->stop();
@@ -230,2 +281,46 @@
     this->currentCampaign->previousLevel();
 }
+
+/**
+   \brief add a Factory to the Factory Q
+   \param factory a Factory to be registered
+*/
+void GameLoader::registerFactory( Factory* factory)
+{
+	assert( factory != NULL);
+	
+	PRINTF(4)("Registered factory for '%s'\n", factory->getFactoryName());
+	
+	if( first == NULL) first = factory;
+	else first->registerFactory( factory);
+}
+
+/**
+   \brief load a StoryEntity
+   \param element a XMLElement containing all the needed info
+*/
+BaseObject* GameLoader::fabricate( TiXmlElement* element)
+{
+  assert( element != NULL);
+	
+  if( first == NULL)
+    {
+      PRINTF(1)("GameLoader does not know any factories, fabricate() failed\n");
+      return NULL;
+    }
+	
+  if( element->Value() != NULL)
+    {
+      PRINTF(4)("Attempting fabrication of a '%s'\n", element->Value());
+      BaseObject* b = first->fabricate( element);
+      if( b == NULL) 
+	PRINTF(2)("Failed to fabricate a '%s'\n", element->Value());
+      else 
+	PRINTF(4)("Successfully fabricated a '%s'\n", element->Value());
+      return b;
+    }
+	
+  PRINTF(2)("Fabricate failed, TiXmlElement did not contain a value\n");
+	
+  return NULL;
+}
Index: orxonox/branches/openAL/src/game_loader.h
===================================================================
--- orxonox/branches/openAL/src/game_loader.h	(revision 3921)
+++ orxonox/branches/openAL/src/game_loader.h	(revision 4194)
@@ -10,4 +10,5 @@
 #include "story_def.h"
 #include "comincl.h"
+
 
 //-----------------------------------------------------------------------------
@@ -51,4 +52,7 @@
   ErrorMessage loadDebugCampaign(Uint32 campaignID);
   
+  void registerFactory( Factory* factory);
+  BaseObject* fabricate( TiXmlElement* data);
+
  private:
   GameLoader ();
@@ -60,6 +64,7 @@
   Campaign* currentCampaign; //!> the current campaign playing
   
-  Campaign* fileToCampaign(char* name);
+  Campaign* fileToCampaign(const char* name);
 
+  Factory* first;
 };
 
Index: orxonox/branches/openAL/src/glmenu/glmenu_imagescreen.cc
===================================================================
--- orxonox/branches/openAL/src/glmenu/glmenu_imagescreen.cc	(revision 3921)
+++ orxonox/branches/openAL/src/glmenu/glmenu_imagescreen.cc	(revision 4194)
@@ -20,28 +20,73 @@
 
 #include "stdincl.h"
+#include "graphics_engine.h"
 #include "material.h"
 
+CREATE_FACTORY(GLMenuImageScreen);
+
+
 using namespace std;
-
-GLMenuImageScreen* GLMenuImageScreen::singletonRef = 0;
-
-GLMenuImageScreen* GLMenuImageScreen::getInstance()
-{
-  if(!singletonRef)
-    singletonRef = new GLMenuImageScreen ();
-  return singletonRef;
-}
-
 /**
    \brief standard constructor
-
-   \todo this constructor is not jet implemented - do it
 */
 GLMenuImageScreen::GLMenuImageScreen () 
 {
-   this->setClassName ("GLMenuImageScreen");
    this->init();
 }
 
+/**
+   \param root The Element to load the GLMenu from
+*/
+GLMenuImageScreen::GLMenuImageScreen (TiXmlElement* root)
+{
+  this->init();
+  this->load(root);
+
+}
+
+/**
+   \brief Loads a GLMenu from an inputElement
+   \param root The Element to load the GLMenu from
+
+   Tags are:
+   \li BackgroundImage STRING: the background Image
+   \li BarImage: STRING: the Image on the Bar
+   \li BackgroundPS: FLOAT FLOAT FLOAT FLOAT: posX posY scaleX scaleY
+   \li BarPS: FLOAT FLOAT FLOAT FLOAT: posX posY scaleX scaleY
+   \li ElementCount: INT: how many elements will be loaded
+*/
+void GLMenuImageScreen::load(TiXmlElement* root)
+{
+  const char* string;
+
+  // Model Loading	
+  string = grabParameter( root, "BackgroundImage");
+  if( string != NULL)
+    this->setBackgroundImage(string);
+
+  string = grabParameter(root, "BackgroundPS");
+  if (string != NULL)
+    {
+      float f1, f2, f3, f4;
+      sscanf (string, "%f %f %f %f", &f1, &f2, &f3, &f4);
+      this->setPosition(f1,f2);
+      this->setScale(f3,f4);
+    }
+
+  string = grabParameter( root, "BarImage");
+  if (string != NULL)
+    this->setBarImage(string);
+  string = grabParameter(root, "BarPS");
+  if (string != NULL)
+    {
+      float f1, f2, f3, f4;
+      sscanf (string, "%f %f %f %f", &f1, &f2, &f3, &f4);
+      this->setBarPosScale(f1,f2,f3,f4);
+    }
+
+  string = grabParameter( root, "ElementCount");
+  if (string != NULL)
+    this->setMaximum(atoi(string));
+}
 
 /**
@@ -51,6 +96,6 @@
 GLMenuImageScreen::~GLMenuImageScreen() 
 {
-  if (this->backMat)
-    delete this->backMat;
+  delete this->backMat;
+  delete this->barMat;
 }
 
@@ -60,153 +105,16 @@
 void GLMenuImageScreen::init ()
 {
-  /*
-  int w = 680;
-  int h = 480;
-
-  glViewport(0,0,w,h);
-  
-  glMatrixMode(GL_PROJECTION);
-  glLoadIdentity(); 
-  gluPerspective(45.0f,(GLfloat)w/(GLfloat)h, .5f ,150.0f);
-  glMatrixMode(GL_MODELVIEW); 
-
-  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-  glLoadIdentity();
-  gluLookAt(0, 0, 6,     0, 0, 0,     0, 1, 0);
-
-  // Bind the texture stored at the zero index of g_Texture[]
-  //glBindTexture(GL_TEXTURE_2D, g_Texture[0]);
-  */
-
-  
+  this->setClassName ("GLMenuImageScreen");
+
   // Select Our VU Meter Background Texture
   this->backMat = new Material("load_screen");
-  this->backMat->setDiffuseMap("pictures/load_screen.jpg");
+  this->barMat = new Material("bar");
   this->maxValue = 10;
   this->currentValue = 0;
-
+  this->setPosition(0,0);
+  this->setScale(1,1);
+  this->setBarPosScale( .6, .75, .3, .1);
   // End of Background image code.
 }
-
-
-/**
-   \brief function to innit screen with all attributes set
-   \param name of the background-image file
-   \param height of the ImageScreen
-   \param width of the Image Screen
-   \param x offset from (0, 0)
-   \param y offset from (0, 0)
-
-   GLMenu uses its own coordinating system: upper left corner is (0, 0). x-axis is down=height, 
-   right axis is right direction (=width)
-*/
-void GLMenuImageScreen::init (char* backImageName, float height, float width, 
-			      float offsetX, float offsetY)
-{}
-
-
-/**
-   \brief draws the ImageScreen to the screenbuffer
-*/
-void GLMenuImageScreen::draw ()
-{
-
-  glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
-
-  PRINTF(4)("GLMenuImagEscreen::draw() - drawing step %i/%i\n", 
-	 this->currentValue, this->maxValue);
-
-  /* screen size */
-  int screenWidth = 640;
-  int screenHeight = 480;
-  
-  /* set image size */
-  int imageWidth = 640;
-  int imageHeight = 480;
-  
-  /* start pos of image */
-  int offsetX = (screenWidth - imageWidth)/2;
-  int offsetY = (screenHeight - imageHeight)/2;
-  
-  /* loadbar pos */
-  int barX = 390;
-  int barY = 50;
-  int barWidth = 230;
-  int barHeight = 30;
-  
-  float val = ((float)this->currentValue/(float)this->maxValue) * barWidth;
-  if( val > (float)barWidth)
-    val = (float)barWidth;
-
-  glMatrixMode(GL_PROJECTION);
-  glPushMatrix();
-  glLoadIdentity();
-  /* set up an ortho screen */
-  glOrtho(0, screenWidth, 0, screenHeight, -1, 1); 
-  glMatrixMode(GL_MODELVIEW);
-  glLoadIdentity();
-  glPushMatrix();
-
-  glEnable(GL_BLEND);
-  glPushAttrib(GL_LIGHTING_BIT | GL_TRANSFORM_BIT);
-  glDisable(GL_LIGHTING);
-
-  /* draw the progress bar */
-  glBegin(GL_QUADS);
-  glColor3f(0.96, 0.84, 0.34);
-  glVertex2i(barX, barY);
-  glVertex2i(barX + (int)val, barY);
-  glVertex2i(barX + (int)val, barY + barHeight);
-  glVertex2i(barX, barY + barHeight);
-  glColor3f(1.0, 1.0, 1.0);
-  glEnd();
-
-  glBegin(GL_QUADS);
-  glColor3f(0.0, 0.0, 0.0);
-  glVertex2i(barX, barY);
-  glVertex2i(barX + barWidth, barY);
-  glVertex2i(barX + barWidth, barY + barHeight);
-  glVertex2i(barX, barY + barHeight);
-  glColor3f(1.0, 1.0, 1.0);
-  glEnd();
-
-  /* draw black border */
-  glBegin(GL_QUADS);
-  glColor3f(0.0, 0.0, 0.0);
-  glVertex2i(barX-1, barY-1);
-  glVertex2i(barX + barWidth +1, barY-1);
-  glVertex2i(barX + barWidth+1, barY + barHeight+1);
-  glVertex2i(barX - 1, barY + barHeight +1);
-  glColor3f(1.0, 1.0, 1.0);
-  glEnd();
-
-  /* draw white border */
-  glBegin(GL_QUADS);
-  glColor3f(1.0, 1.0, 1.0);
-  glVertex2i(barX-2, barY-2);
-  glVertex2i(barX + barWidth +2, barY-2);
-  glVertex2i(barX + barWidth+2, barY + barHeight+2);
-  glVertex2i(barX - 2, barY + barHeight +2);
-  glColor3f(1.0, 1.0, 1.0);
-  glEnd();
-
-  backMat->select();
-  glBegin(GL_QUADS);
-  glTexCoord2i(0, 0); glVertex2i(offsetX, offsetY);
-  glTexCoord2i(1, 0); glVertex2i(offsetX + imageWidth, offsetY);
-  glTexCoord2i(1, 1); glVertex2i(offsetX + imageWidth, offsetY + imageHeight);
-  glTexCoord2i(0, 1); glVertex2i(offsetX, offsetY + imageHeight);
-  glEnd();
-  glDisable(GL_TEXTURE_2D);
-
-  glDisable(GL_BLEND);
-  glPopMatrix();
-  glMatrixMode(GL_PROJECTION);
-  glPopMatrix();
-  glPopAttrib();
-
-  SDL_GL_SwapBuffers();              
-}
- 
 
 /** 
@@ -214,24 +122,55 @@
     \param file name of the backgroun-image
  */
-void GLMenuImageScreen::setBackImageName (char* backImageName)
-{}
+void GLMenuImageScreen::setBackgroundImage (const char* backImageName)
+{
+  this->backMat->setDiffuseMap(backImageName);
+}
 
 
 /**
    \brief sets position of the ImageScreen
-   \param x offset from (0, 0)
-   \param y offset from (0, 0)
+   \param x offset from the top left corner in percent(0-1) of the screensize
+   \param y offset from the top left corner in percent(0-1) of the screensize
 */
 void GLMenuImageScreen::setPosition(float offsetX, float offsetY)
-{}
+{
+  this->offsetX = offsetX;
+  this->offsetY = offsetY;
+}
 
 
 /*
   \brief sets size of the ImageScreen
-  \param height of the ImageScreen
-  \param width of the Image Screen
-*/
-void GLMenuImageScreen::setSize(float height, float width)
-{}
+  \param scaleX the scaleing of the image into the x-direction (in percent (0-1))
+  \param scaleY the scaleing of the image into the y-direction (in percent (0-1))
+*/
+void GLMenuImageScreen::setScale(float scaleX, float scaleY)
+{
+  this->scaleX = scaleX;
+  this->scaleY = scaleY;
+}
+
+/**
+   \param barImage An image for the Bar
+*/
+void GLMenuImageScreen::setBarImage(const char* barImage)
+{
+  this->barMat->setDiffuseMap(barImage);
+}
+
+/**
+   \brief sets the Position and the Size of the bar
+   \param barX The Position in the x-direction in percent of the screen (0-1)
+   \param barY The Position in the y-direction in percent of the screen (0-1)
+   \param barW The Size in the x-direction in percent of the screen (0-1)
+   \param barH The Size in the y-direction in percent of the screen (0-1)
+*/
+void GLMenuImageScreen::setBarPosScale(float barX, float barY, float barW, float barH)
+{
+  this->barX = barX;
+  this->barY = barY;
+  this->barW = barW;
+  this->barH = barH;
+}
 
 
@@ -285,2 +224,95 @@
   this->draw();
 }
+
+
+
+/**
+   \brief draws the ImageScreen to the screenbuffer
+*/
+void GLMenuImageScreen::draw ()
+{
+  glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+  PRINTF(4)("GLMenuImagEscreen::draw() - drawing step %i/%i\n", 
+	    this->currentValue, this->maxValue);
+
+  /* screen size */
+  int screenWidth = GraphicsEngine::getInstance()->getResolutionX();
+  int screenHeight = GraphicsEngine::getInstance()->getResolutionY();
+  
+  int imageWidth = (int)(screenWidth * this->scaleX);
+  int imageHeight = (int)(screenHeight * this->scaleY);
+
+  int offsetX = (int)(this->offsetX * screenWidth);
+  int offsetY = (int)(this->offsetY * screenHeight);
+
+  /* loadbar pos */
+  int barX = (int)(this->barX *screenWidth);
+  int barY = (int)(this->barY *screenHeight);
+  int barW = (int)(this->barW *screenWidth);
+  int barH = (int)(this->barH *screenHeight);
+  
+  float val = (float)this->currentValue/(float)this->maxValue;
+		  
+  if( val > barW)
+    val = barW;
+
+  GraphicsEngine::enter2DMode();
+
+  /* draw the BackGround */
+  backMat->select();
+  glBegin(GL_TRIANGLE_STRIP);
+  glTexCoord2i(0, 0); glVertex2i(offsetX, offsetY + imageHeight);
+  glTexCoord2i(1, 0); glVertex2i(offsetX +imageWidth, offsetY + imageHeight);
+  glTexCoord2i(0, 1); glVertex2i(offsetX, offsetY);
+  glTexCoord2i(1, 1); glVertex2i(offsetX + imageWidth, offsetY);
+  glEnd();
+  
+  glDisable(GL_TEXTURE_2D);
+  /* draw white border */
+  glBegin(GL_LINE_LOOP);
+  glColor3f(1.0, 1.0, 1.0);
+  glVertex2i(barX - 2, barY - 2);
+  glVertex2i(barX + barW + 2, barY - 2);
+  glVertex2i(barX + barW + 2, barY + barH + 2);
+  glVertex2i(barX - 2, barY + barH + 2);
+  glColor3f(1.0, 1.0, 1.0);
+  glEnd();
+  
+  /* draw the progress bar */
+  barMat->select();
+  glBegin(GL_TRIANGLE_STRIP);
+  glTexCoord2f(0, 0); glVertex2i(barX, barY + barH);
+  glTexCoord2f(val, 0); glVertex2i(barX + (int)(val * this->barW * (float)screenWidth), barY + barH);
+  glTexCoord2f(0, 1); glVertex2i(barX, barY);
+  glTexCoord2f(val, 1); glVertex2i(barX + (int)(val * this->barW * (float)screenWidth), barY);
+  glEnd();
+
+  /*
+    glBegin(GL_QUADS);
+    glColor3f(0.0, 0.0, 0.0);
+    glVertex2i(barX, barY);
+    glVertex2i(barX + barWidth, barY);
+    glVertex2i(barX + barWidth, barY + barHeight);
+    glVertex2i(barX, barY + barHeight);
+    glColor3f(1.0, 1.0, 1.0);
+    glEnd();
+    
+    /* draw black border 
+    glBegin(GL_QUADS);
+    glColor3f(0.0, 0.0, 0.0);
+    glVertex2i(barX-1, barY-1);
+    glVertex2i(barX + barWidth +1, barY-1);
+    glVertex2i(barX + barWidth+1, barY + barHeight+1);
+    glVertex2i(barX - 1, barY + barHeight +1);
+    glColor3f(1.0, 1.0, 1.0);
+    glEnd();
+    
+  */
+
+  GraphicsEngine::leave2DMode();
+
+  SDL_GL_SwapBuffers();              
+}
+ 
+
Index: orxonox/branches/openAL/src/glmenu/glmenu_imagescreen.h
===================================================================
--- orxonox/branches/openAL/src/glmenu/glmenu_imagescreen.h	(revision 3921)
+++ orxonox/branches/openAL/src/glmenu/glmenu_imagescreen.h	(revision 4194)
@@ -11,27 +11,25 @@
 
 class Material;
+class TiXmlElement;
 
 class GLMenuImageScreen : public BaseObject {
 
- private:
+ public:
   GLMenuImageScreen ();
-
- public:
+  GLMenuImageScreen (TiXmlElement* root);
+  void load(TiXmlElement* root);
   virtual ~GLMenuImageScreen ();
-  
-  static GLMenuImageScreen* getInstance();
-
-  static GLMenuImageScreen* singletonRef;
 
   void init ();
-  void init (char* backImageName, float height, float width, 
-	     float offsetX, float offsetY);
 
   void draw ();
   
-  void setBackImageName (char* backImageName);
-  void setPosition (float offsetX, float offsetY);
-  void setSize (float height, float width);
-  
+  void setBackgroundImage(const char* backImageName);
+  void setPosition(float offsetX, float offsetY);
+  void setScale (float scaleX, float scaleY);
+
+  void setBarImage(const char* barImage);
+  void setBarPosScale(float barX, float barY, float barW, float barH);
+
   void setMaximum (int maxValue);
   int getMaximum ();
@@ -42,7 +40,9 @@
  private:
   char* backImageName;       //!< the name of the file of the background image
-  float height, width;       //!< hight and width of the image
+  float scaleX, scaleY;      //!< hight and width of the image
   float offsetX, offsetY;    //!< offset of the image from left and up
   Material* backMat;         //!< Background Material.
+  float barX, barY, barW, barH; //!< Position and Scale of the bar.
+  Material* barMat;          //!< A Material for the Loading-Bar
 
   /* progress bar values */
Index: orxonox/branches/openAL/src/lib/Makefile.in
===================================================================
--- orxonox/branches/openAL/src/lib/Makefile.in	(revision 3921)
+++ orxonox/branches/openAL/src/lib/Makefile.in	(revision 4194)
@@ -89,12 +89,8 @@
 EXEEXT = @EXEEXT@
 GPROF = @GPROF@
-GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
-GTHREAD_LIBS = @GTHREAD_LIBS@
 GTK2_CFLAGS = @GTK2_CFLAGS@
 GTK2_LIBS = @GTK2_LIBS@
 HAVE_CURL_FALSE = @HAVE_CURL_FALSE@
 HAVE_CURL_TRUE = @HAVE_CURL_TRUE@
-HAVE_GTHREAD_FALSE = @HAVE_GTHREAD_FALSE@
-HAVE_GTHREAD_TRUE = @HAVE_GTHREAD_TRUE@
 HAVE_GTK2_FALSE = @HAVE_GTK2_FALSE@
 HAVE_GTK2_TRUE = @HAVE_GTK2_TRUE@
@@ -117,4 +113,6 @@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -125,4 +123,5 @@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
Index: orxonox/branches/openAL/src/lib/coord/null_parent.cc
===================================================================
--- orxonox/branches/openAL/src/lib/coord/null_parent.cc	(revision 3921)
+++ orxonox/branches/openAL/src/lib/coord/null_parent.cc	(revision 4194)
@@ -54,5 +54,5 @@
   this->parent = this;
   this->mode = PNODE_ALL;
-  *this->absCoordinate = absCoordinate;
+  this->absCoordinate = absCoordinate;
   this->setName("NullParent");
 }
@@ -80,7 +80,7 @@
 {
 
-  PRINTF(4)("NullParent::update - (%f, %f, %f)\n", this->absCoordinate->x, this->absCoordinate->y, this->absCoordinate->z);
-  *this->absCoordinate = *this->relCoordinate;
-  *this->absDirection = parent->getAbsDir () * *this->relDirection;
+  PRINTF(4)("NullParent::update - (%f, %f, %f)\n", this->absCoordinate.x, this->absCoordinate.y, this->absCoordinate.z);
+  this->absCoordinate = this->relCoordinate;
+  this->absDirection = parent->getAbsDir () * this->relDirection;
 
   tIterator<PNode>* iterator = this->children->getIterator();
Index: orxonox/branches/openAL/src/lib/coord/p_node.cc
===================================================================
--- orxonox/branches/openAL/src/lib/coord/p_node.cc	(revision 3921)
+++ orxonox/branches/openAL/src/lib/coord/p_node.cc	(revision 4194)
@@ -60,13 +60,11 @@
   this->init(parent);
 
-  *this->absCoordinate = absCoordinate;
+  this->absCoordinate = absCoordinate;
 
   if (likely(parent != NULL))
   {
-    *this->relCoordinate = *this->absCoordinate - parent->getAbsCoor ();
+    this->relCoordinate = this->absCoordinate - parent->getAbsCoor();
     parent->addChild (this);
   }
-  else 
-    this->relCoordinate = new Vector();
 }
 
@@ -89,10 +87,4 @@
   delete []this->objectName;
 
-  delete this->relCoordinate;
-  delete this->absCoordinate;
-  delete this->relDirection;
-  delete this->absDirection;
-  delete this->lastAbsCoordinate;
-  delete this->diffCoordinate;
 }
 
@@ -107,12 +99,4 @@
   this->parent = parent; 
   this->objectName = NULL;
-  this->time = 1.0; /* set time to 1 to make divisions by zero impossible */
-
-  this->absCoordinate = new Vector();
-  this->relCoordinate = new Vector();
-  this->absDirection = new Quaternion();
-  this->relDirection = new Quaternion();
-  this->lastAbsCoordinate = new Vector();
-  this->diffCoordinate = new Vector();
 }
 
@@ -158,5 +142,5 @@
 {
   this->bRelCoorChanged = true;
-  *this->relCoordinate = relCoord;
+  this->relCoordinate = relCoord;
 }
 
@@ -182,5 +166,5 @@
 {
   this->bAbsCoorChanged = true;
-  *this->absCoordinate = absCoord;
+  this->absCoordinate = absCoord;
 }
 
@@ -211,9 +195,9 @@
   if( unlikely(this->bAbsCoorChanged))
     {
-      *this->absCoordinate = *this->absCoordinate + shift;
+      this->absCoordinate += shift;
     }
   else 
     {
-      *this->relCoordinate = *this->relCoordinate + shift;
+      this->relCoordinate += shift;
       this->bRelCoorChanged = true;
     }
@@ -241,5 +225,5 @@
 {
   this->bRelCoorChanged = true;
-  *this->relDirection = relDir;
+  this->relDirection = relDir;
 }
 
@@ -264,5 +248,5 @@
 {
   this->bAbsDirChanged = true;
-  *this->absDirection = absDir;
+  this->absDirection = absDir;
 }
 
@@ -293,18 +277,6 @@
 {
   this->bRelDirChanged = true;
-  *this->relDirection = *this->relDirection * shift;
-}
-
-
-
-/**
-   \brief this calculates the current movement speed of the node
-*/
-float PNode::getSpeed() const
-{
-  *this->diffCoordinate = *this->absCoordinate - *this->lastAbsCoordinate;
-  return this->diffCoordinate->len() / this->time;
-}
-
+  this->relDirection = this->relDirection * shift;
+}
 
 /**
@@ -432,7 +404,7 @@
 void PNode::update (float dt)
 {
-  *this->lastAbsCoordinate = *this->absCoordinate;
-  this->time = dt;
-  PRINTF(4)("PNode::update - %s - (%f, %f, %f)\n", this->objectName, this->absCoordinate->x, this->absCoordinate->y, this->absCoordinate->z);
+  this->lastAbsCoordinate = this->absCoordinate;
+
+  PRINTF(4)("PNode::update - %s - (%f, %f, %f)\n", this->objectName, this->absCoordinate.x, this->absCoordinate.y, this->absCoordinate.z);
 
 
@@ -442,5 +414,5 @@
 	{
 	  /* if you have set the absolute coordinates this overrides all other changes */
-	  *this->relCoordinate = *this->absCoordinate - parent->getAbsCoor ();
+	  this->relCoordinate = this->absCoordinate - parent->getAbsCoor ();
 	}
       if( likely(this->bRelCoorChanged) /*&& this->timeStamp != DataTank::timeStamp*/)
@@ -455,5 +427,5 @@
 	    }
 	    else */
-	  *this->absCoordinate = parent->getAbsCoor() + *this->relCoordinate;	      /* update the current absCoordinate */
+	  this->absCoordinate = parent->getAbsCoor() + this->relCoordinate;	      /* update the current absCoordinate */
 	}
     }
@@ -464,10 +436,10 @@
 	{
 	  /* if you have set the absolute coordinates this overrides all other changes */
-	  *this->relDirection = *this->absDirection - parent->getAbsDir();
+	  this->relDirection = this->absDirection - parent->getAbsDir();
 	}
       else if( likely(this->bRelDirChanged) /*&& this->timeStamp != DataTank::timeStamp*/)
 	{
 	  /* update the current absDirection - remember * means rotation around sth.*/
-	  *this->absDirection = parent->getAbsDir() * *this->relDirection;
+	  this->absDirection = parent->getAbsDir() * this->relDirection;
 	}
     }
@@ -478,5 +450,5 @@
 	{
 	  /* if you have set the absolute coordinates this overrides all other changes */
-	  *this->relCoordinate = *this->absCoordinate - parent->getAbsCoor ();
+	  this->relCoordinate = this->absCoordinate - parent->getAbsCoor ();
 	}
       else if( likely(this->bRelCoorChanged) /*&& this->timeStamp != DataTank::timeStamp*/)
@@ -486,5 +458,5 @@
 	    *this->absCoordinate = *this->relCoordinate;
 	    else*/
-	  *this->absCoordinate = parent->getAbsCoor() + parent->getAbsDir().apply(*this->relCoordinate);	      /* update the current absCoordinate */
+	  this->absCoordinate = parent->getAbsCoor() + parent->getAbsDir().apply(this->relCoordinate);	      /* update the current absCoordinate */
 	}
     }
@@ -508,4 +480,5 @@
   delete iterator;
 
+  this->velocity = (this->absCoordinate - this->lastAbsCoordinate) / dt;
   this->timeStamp = timeStamp;
   this->bRelCoorChanged = false;
@@ -540,7 +513,7 @@
 {
   PRINTF(2)("PNode::debug() - absCoord: (%f, %f, %f)\n", 
-	 this->absCoordinate->x, 
-	 this->absCoordinate->y,
-	 this->absCoordinate->z);
+	 this->absCoordinate.x, 
+	 this->absCoordinate.y,
+	 this->absCoordinate.z);
 }
 
@@ -551,5 +524,5 @@
   for debug purposes realy usefull, not used to work properly
 */
-void PNode::setName (char* newName)
+void PNode::setName (const char* newName)
 {
   this->objectName = new char[strlen(newName)+1];
@@ -561,5 +534,5 @@
   \brief gets the name of the node
 */
-char* PNode::getName ()
+const char* PNode::getName ()
 {
   return this->objectName;
Index: orxonox/branches/openAL/src/lib/coord/p_node.h
===================================================================
--- orxonox/branches/openAL/src/lib/coord/p_node.h	(revision 3921)
+++ orxonox/branches/openAL/src/lib/coord/p_node.h	(revision 4194)
@@ -57,17 +57,20 @@
 
 
-  inline Vector* getRelCoor () const { return this->relCoordinate; }
+  inline const Vector& getRelCoor () const { return this->relCoordinate; }
   void setRelCoor (const Vector& relCoord);
-  inline Vector getAbsCoor () const { return *this->absCoordinate; }
+  inline const Vector& getAbsCoor () const { return this->absCoordinate; }
   void setAbsCoor (const Vector& absCoord);
   void shiftCoor (const Vector& shift);
 
-  inline Quaternion getRelDir () const { return *this->relDirection; }
+  inline const Quaternion& getRelDir () const { return this->relDirection; }
   void setRelDir (const Quaternion& relDir);
-  inline Quaternion getAbsDir () const { return *this->absDirection; }
+  inline const Quaternion& getAbsDir () const { return this->absDirection; }
   void setAbsDir (const Quaternion& absDir);
   void shiftDir (const Quaternion& shift);
 
-  float getSpeed() const;
+  /** \returns the Speed of the Node */
+  inline float getSpeed() const {return this->velocity.len()/1000;} //! \FIX THIS SHOULD NOT BE /1000
+  /** \returns the Velocity of the Node */
+  inline const Vector& getVelocity() const {return this->velocity;}
 
   void addChild (PNode* pNode, int parentingMode = DEFAULT_MODE);
@@ -85,6 +88,6 @@
   void processTick (float dt);
 
-  void setName (char* newName);
-  char* getName ();
+  void setName (const char* newName);
+  const char* getName ();
 
 
@@ -99,8 +102,8 @@
   bool bRelDirChanged;     //!< If Relative Direction has changed since last time we checked
 
-  Vector* relCoordinate;    //!< coordinates relative to the parent
-  Vector* absCoordinate;    //!< absolute coordinates in the world ( from (0,0,0) )
-  Quaternion* relDirection; //!< direction relative to the parent
-  Quaternion* absDirection; //!< absolute direvtion in the world ( from (0,0,1) )
+  Vector relCoordinate;    //!< coordinates relative to the parent
+  Vector absCoordinate;    //!< absolute coordinates in the world ( from (0,0,0) )
+  Quaternion relDirection; //!< direction relative to the parent
+  Quaternion absDirection; //!< absolute direvtion in the world ( from (0,0,1) )
 
   int mode;                //!< the mode of the binding
@@ -109,7 +112,6 @@
   void init(PNode* parent);
 
-  Vector* lastAbsCoordinate; //!< this is used for speedcalculation, it stores the last coordinate
-  Vector* diffCoordinate;    //!< this is stored here for performance reasons, difference to the last vector
-  float time;                //!< time since last update
+  Vector velocity;          //!< Saves the velocity.
+  Vector lastAbsCoordinate; //!< this is used for speedcalculation, it stores the last coordinate
 };
 
Index: orxonox/branches/openAL/src/lib/graphics/Makefile.in
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/Makefile.in	(revision 3921)
+++ orxonox/branches/openAL/src/lib/graphics/Makefile.in	(revision 4194)
@@ -89,12 +89,8 @@
 EXEEXT = @EXEEXT@
 GPROF = @GPROF@
-GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
-GTHREAD_LIBS = @GTHREAD_LIBS@
 GTK2_CFLAGS = @GTK2_CFLAGS@
 GTK2_LIBS = @GTK2_LIBS@
 HAVE_CURL_FALSE = @HAVE_CURL_FALSE@
 HAVE_CURL_TRUE = @HAVE_CURL_TRUE@
-HAVE_GTHREAD_FALSE = @HAVE_GTHREAD_FALSE@
-HAVE_GTHREAD_TRUE = @HAVE_GTHREAD_TRUE@
 HAVE_GTK2_FALSE = @HAVE_GTK2_FALSE@
 HAVE_GTK2_TRUE = @HAVE_GTK2_TRUE@
@@ -117,4 +113,6 @@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -125,4 +123,5 @@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
Index: orxonox/branches/openAL/src/lib/graphics/graphics_engine.cc
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/graphics_engine.cc	(revision 3921)
+++ orxonox/branches/openAL/src/lib/graphics/graphics_engine.cc	(revision 4194)
@@ -17,4 +17,5 @@
 
 #include "graphics_engine.h"
+#include "resource_manager.h"
 
 #include "debug.h"
@@ -30,4 +31,7 @@
 {
   this->setClassName ("GraphicsEngine");
+
+  this->fullscreen = false;
+
   this->initVideo();
 
@@ -101,6 +105,8 @@
   
   // TO DO: Create a cool icon and use it here
-  SDL_WM_SetIcon(SDL_LoadBMP("../data/pictures/orxonox-icon32x32.bmp"), NULL);  
-
+  char* loadPic = new char[strlen(ResourceManager::getInstance()->getDataDir())+ 100];
+  sprintf(loadPic, "%s%s", ResourceManager::getInstance()->getDataDir(),  "pictures/orxonox-icon32x32.bmp");
+  SDL_WM_SetIcon(SDL_LoadBMP(loadPic), NULL);  
+  delete loadPic;
   // Enable default GL stuff
   glEnable(GL_DEPTH_TEST);
@@ -137,10 +143,15 @@
 int GraphicsEngine::setResolution(int width, int height, int bpp)
 {
+  Uint32 fullscreenFlag;
   this->resolutionX = width;
   this->resolutionY = height;
   this->bitsPerPixel = bpp;
+  if (this->fullscreen)
+    fullscreenFlag = SDL_FULLSCREEN;
+  else
+    fullscreenFlag = 0;
   
   printf ("ok\n");
-  if((this->screen = SDL_SetVideoMode(this->resolutionX, this->resolutionY, this->bitsPerPixel, this->videoFlags)) == NULL)
+  if((this->screen = SDL_SetVideoMode(this->resolutionX, this->resolutionY, this->bitsPerPixel, this->videoFlags | fullscreenFlag)) == NULL)
     {
       PRINTF(1)("Could not SDL_SetVideoMode(%d, %d, %d, %d): %s\n", this->resolutionX, this->resolutionY, this->bitsPerPixel, this->videoFlags, SDL_GetError());
@@ -148,5 +159,10 @@
       //    return -1;
     }
-
+}
+
+void GraphicsEngine::setFullscreen(bool fullscreen)
+{
+  this->fullscreen = fullscreen;
+  this->setResolution(this->resolutionX, this->resolutionY, this->bitsPerPixel);
 }
 
@@ -254,5 +270,5 @@
   /* Check if our resolution is restricted */
   if(this->videoModes == (SDL_Rect **)-1){
-    PRINTF(1)("All resolutions available.\n");
+    PRINTF(2)("All resolutions available.\n");
   }
   else{
@@ -260,5 +276,5 @@
     PRINT(0)("Available Resoulution Modes are\n");
     for(int i = 0; this->videoModes[i]; ++i)
-      PRINT(0)(" |  %d x %d\n", this->videoModes[i]->w, this->videoModes[i]->h);
+      PRINT(4)(" |  %d x %d\n", this->videoModes[i]->w, this->videoModes[i]->h);
   }
   
Index: orxonox/branches/openAL/src/lib/graphics/graphics_engine.h
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/graphics_engine.h	(revision 3921)
+++ orxonox/branches/openAL/src/lib/graphics/graphics_engine.h	(revision 4194)
@@ -26,4 +26,5 @@
   int setGLattribs(void);
   int setResolution(int width, int height, int bpp);
+  void setFullscreen(bool fullscreen = false);
   /** \returns the x resolution */
   inline int getResolutionX(void) {return this->resolutionX;}
Index: orxonox/branches/openAL/src/lib/graphics/importer/Makefile.in
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/importer/Makefile.in	(revision 3921)
+++ orxonox/branches/openAL/src/lib/graphics/importer/Makefile.in	(revision 4194)
@@ -119,12 +119,8 @@
 EXEEXT = @EXEEXT@
 GPROF = @GPROF@
-GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
-GTHREAD_LIBS = @GTHREAD_LIBS@
 GTK2_CFLAGS = @GTK2_CFLAGS@
 GTK2_LIBS = @GTK2_LIBS@
 HAVE_CURL_FALSE = @HAVE_CURL_FALSE@
 HAVE_CURL_TRUE = @HAVE_CURL_TRUE@
-HAVE_GTHREAD_FALSE = @HAVE_GTHREAD_FALSE@
-HAVE_GTHREAD_TRUE = @HAVE_GTHREAD_TRUE@
 HAVE_GTK2_FALSE = @HAVE_GTK2_FALSE@
 HAVE_GTK2_TRUE = @HAVE_GTK2_TRUE@
@@ -147,4 +143,6 @@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -155,4 +153,5 @@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
Index: orxonox/branches/openAL/src/lib/graphics/importer/array.cc
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/importer/array.cc	(revision 3921)
+++ orxonox/branches/openAL/src/lib/graphics/importer/array.cc	(revision 4194)
@@ -112,24 +112,7 @@
   
 /**
-   \brief Gives back the array !! MUST be executed AFTER finalize.
-   \returns The created array.
-*/
-GLfloat* Array::getArray ()
-{
-  return this->array;
-}
-
-/**
-   \returns The Count of entries in the Array
-*/
-int Array::getCount()
-{
-  return this->entryCount;
-}
-
-/**
    \brief Simple debug info about the Array
 */
-void Array::debug ()
+void Array::debug (void) const
 {
   PRINT(0)("entryCount=%i, address=%p\n", this->entryCount, this->array);
Index: orxonox/branches/openAL/src/lib/graphics/importer/array.h
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/importer/array.h	(revision 3921)
+++ orxonox/branches/openAL/src/lib/graphics/importer/array.h	(revision 4194)
@@ -23,7 +23,9 @@
   void addEntry(GLfloat entry0, GLfloat entry1, GLfloat entry2);
   
-  GLfloat* getArray ();
-  int getCount();
-  void debug(void);
+  /** \returns The array */
+  inline const GLfloat* getArray () const {return this->array;}
+  /**   \returns The Count of entries in the Array*/
+  inline int getCount(void)const {return this->entryCount;}
+  void debug(void) const ;
  private:
   //! One entry of the Array
Index: orxonox/branches/openAL/src/lib/graphics/importer/framework.cc
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/importer/framework.cc	(revision 3921)
+++ orxonox/branches/openAL/src/lib/graphics/importer/framework.cc	(revision 4194)
@@ -79,5 +79,5 @@
     obj = new OBJModel(argv[1]);
   else 
-    obj = new PrimitiveModel(SPHERE);
+    obj = new PrimitiveModel(CYLINDER);
 
   M = Vector(wHandler.screen->w/2, wHandler.screen->h/2, 0); 
Index: orxonox/branches/openAL/src/lib/graphics/importer/material.cc
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/importer/material.cc	(revision 3921)
+++ orxonox/branches/openAL/src/lib/graphics/importer/material.cc	(revision 4194)
@@ -45,12 +45,7 @@
   this->setTransparency(1.0);
 
-
   this->diffuseTexture = NULL;
   this->ambientTexture = NULL;
   this->specularTexture = NULL;
-
-  this->diffuseTextureSet = false;
-  this->ambientTextureSet = false;
-  this->specularTextureSet = false;
 
   this->setName(mtlName);
@@ -88,9 +83,5 @@
   
   // setting the transparency
-  if (this->transparency == 1.0)
-    {
-      glDisable(GL_BLEND);
-    }
-  else
+  if (this->transparency < 1.0)
     {
       glEnable(GL_BLEND);
@@ -98,4 +89,10 @@
       glBlendFunc(GL_SRC_ALPHA, GL_ONE);
     }
+  else
+    {
+      glDisable(GL_BLEND);
+      glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+    }
+
 
   // setting illumination Model 
@@ -105,8 +102,15 @@
     glShadeModel(GL_SMOOTH);
 
-  if (this->diffuseTextureSet)
+  if (this->diffuseTexture)
     {
       glEnable(GL_TEXTURE_2D);
       glBindTexture(GL_TEXTURE_2D, this->diffuseTexture->getTexture());
+
+      /* This allows alpha blending of 2D textures with the scene */
+      if (this->diffuseTexture->hasAlpha())
+	{
+	  glEnable(GL_BLEND);
+	  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+	}
     }
   else
@@ -291,10 +295,8 @@
 {
   PRINTF(4)("setting Diffuse Map %s\n", dMap);
-  //    diffuseTexture = new Texture();
-  //    this->diffuseTextureSet = diffuseTexture->loadImage(dMap);
 
   //! \todo check if RESOURCE MANAGER is availiable
   //! \todo Textures from .mtl-file need special care.
-  this->diffuseTextureSet = this->diffuseTexture = (Texture*)ResourceManager::getInstance()->load(dMap, IMAGE);
+  this->diffuseTexture = (Texture*)ResourceManager::getInstance()->load(dMap, IMAGE);
 }
 
Index: orxonox/branches/openAL/src/lib/graphics/importer/material.h
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/importer/material.h	(revision 3921)
+++ orxonox/branches/openAL/src/lib/graphics/importer/material.h	(revision 4194)
@@ -67,9 +67,4 @@
   Texture* ambientTexture; //!< The ambient texture of the Material.
   Texture* specularTexture;//!< The specular texture of the Material.
-  
-  bool diffuseTextureSet; //!< Chekcs if the diffuse texture is Set.
-  bool ambientTextureSet; //!< Chekcs if the ambient texture is Set.
-  bool specularTextureSet;//!< Chekcs if the specular texture is Set.
-
 };
 #endif
Index: orxonox/branches/openAL/src/lib/graphics/importer/model.cc
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/importer/model.cc	(revision 3921)
+++ orxonox/branches/openAL/src/lib/graphics/importer/model.cc	(revision 4194)
@@ -27,9 +27,109 @@
 using namespace std;
 
-//////////////////
-// DE-CONSTRUCT //
-//////////////////
-/**
-   \brief Creates a 3D-Model. and assigns it a Name.
+
+////////////////////
+/// SUB-Elements ///
+////////////////////
+/**
+   \brief creates a new ModelFaceElement
+*/
+ModelFaceElement::ModelFaceElement()
+{
+  this->vertexNumber = -1;
+  this->normalNumber = -1;
+  this->texCoordNumber = -1;    
+
+  this->next = NULL;
+}
+
+/**
+   \brief destroys a ModelFaceElement
+*/
+ModelFaceElement::~ModelFaceElement()
+{
+  if (this->next)
+    delete this->next;
+}
+
+/**
+   \brief creates a new ModelFace
+*/
+ModelFace::ModelFace()
+{
+  this->vertexCount = 0;
+
+  this->firstElem = NULL;
+  
+  this->material = NULL;
+  
+  this->next = NULL;
+
+}
+
+/**
+   \brief deletes a ModelFace
+*/
+ModelFace::~ModelFace()
+{
+  PRINTF(5)("Cleaning up Face\n");
+
+  if (this->firstElem != NULL)
+    delete this->firstElem;
+  
+  if (this->next != NULL)
+    delete this->next;
+}
+
+/**
+   \brief Creates a new ModelGroup
+*/
+ModelGroup::ModelGroup()
+{
+  PRINTF(4)("Adding new Group\n");
+  this->name = "";
+  this->faceMode = -1;
+  this->faceCount = 0;  
+  this->next = NULL;
+  
+  this->firstFace = new ModelFace;
+  this->currentFace = this->firstFace;
+}
+
+/**
+   \brief deletes a ModelGroup
+*/
+ModelGroup::~ModelGroup()
+{
+  PRINTF(5)("Cleaning up group\n");
+  if (this->firstFace != NULL)
+    delete this->firstFace;
+
+  if (this->next !=NULL)
+    delete this->next;
+}
+
+/**
+   \brief cleans up a ModelGroup
+
+   actually does the same as the delete Operator, but does not delete the predecessing group
+*/
+void ModelGroup::cleanup(void)
+{
+  PRINTF(5)("Cleaning up group\n");
+  if (this->firstFace)
+    delete this->firstFace;
+  this->firstFace = NULL;
+  if (this->next)
+    this->next->cleanup();
+}
+
+
+/////////////
+/// MODEL ///
+/////////////
+/**
+   \brief Creates a 3D-Model.
+
+   assigns it a Name and a Type
 */
 Model::Model(const char* modelName, MODEL_TYPE type)
@@ -42,9 +142,10 @@
   this->finalized = false;
   // setting the start group;
-  this->firstGroup = new Group;
-  this->currentGroup = this->firstGroup;
+  this->currentGroup = this->firstGroup = new ModelGroup;
   this->groupCount = 0;
-  
-  this->initGroup (this->currentGroup);
+  this->vertexCount = 0;
+  this->normalCount = 0;
+  this->texCoordCount = 0;
+  
   this->scaleFactor = 1;
 
@@ -76,12 +177,5 @@
 
   PRINTF(5)("Deleting display Lists.\n");
-  Group* walker = this->firstGroup;
-  while (walker != NULL)
-    {
-      glDeleteLists (walker->listNumber, 1);
-      Group* delWalker = walker;
-      walker = walker->next;
-      delete delWalker;
-    }
+  delete this->firstGroup;
 
   // deleting Arrays
@@ -92,4 +186,6 @@
   tIterator<Material>* tmpIt = this->materialList->getIterator();
   Material* material = tmpIt->nextElement();
+
+  //! \todo do we really have to delete this material??
   while(material)
     {
@@ -128,10 +224,10 @@
 {
   PRINTF(4)("drawing the 3D-Models\n"); 
-  Group* walker = this->firstGroup;
-  while (walker != NULL)
-    {
-      PRINTF(5)("Drawing model %s\n", walker->name);
-      glCallList (walker->listNumber);
-      walker = walker->next;
+  ModelGroup* tmpGroup = this->firstGroup;
+  while (tmpGroup != NULL)
+    {
+      PRINTF(5)("Drawing model %s\n", tmpGroup->name);
+      glCallList (tmpGroup->listNumber);
+      tmpGroup = tmpGroup->next;
     }
 }
@@ -151,16 +247,16 @@
     }
   PRINTF(4)("drawing the requested 3D-Models if found.\n"); 
-  Group* walker = this->firstGroup;
+  ModelGroup* tmpGroup = this->firstGroup;
   int counter = 0;
-  while (walker != NULL)
+  while (tmpGroup != NULL)
     {
       if (counter == groupNumber)
 	{
-	  PRINTF(4)("Drawing model number %i named %s\n", counter, walker->name);
-	  glCallList (walker->listNumber);
+	  PRINTF(4)("Drawing model number %i named %s\n", counter, tmpGroup->name);
+	  glCallList (tmpGroup->listNumber);
 	  return;
 	}
       ++counter;
-      walker = walker->next;
+      tmpGroup = tmpGroup->next;
     }
   PRINTF(2)("Model number %i in %s not Found.\n", groupNumber, this->name);
@@ -178,25 +274,17 @@
 {
   PRINTF(4)("drawing the requested 3D-Models if found.\n"); 
-  Group* walker = this->firstGroup;
-  while (walker != NULL)
-    {
-      if (!strcmp(walker->name, groupName))
+  ModelGroup* tmpGroup = this->firstGroup;
+  while (tmpGroup != NULL)
+    {
+      if (!strcmp(tmpGroup->name, groupName))
 	{
-	  PRINTF(4)("Drawing model %s\n", walker->name);
-	  glCallList (walker->listNumber);
+	  PRINTF(4)("Drawing model %s\n", tmpGroup->name);
+	  glCallList (tmpGroup->listNumber);
 	  return;
 	}
-      walker = walker->next;
+      tmpGroup = tmpGroup->next;
     }
   PRINTF(2)("Model Named %s in %s not Found.\n", groupName, this->name);
   return;
-}
-
-/**
-   \returns Count of the Models in this File
-*/
-int Model::getGroupCount (void) const
-{
-  return this->groupCount;
 }
 
@@ -210,6 +298,6 @@
 void Model::setName(const char* name)
 {
-  if (this->name) 
-    delete this->name;
+  if (this->name)
+    delete []this->name;
   if (name)
     {
@@ -219,40 +307,4 @@
   else 
     this->name = NULL;
-}
-
-/**
-   \brief initializes a new Group model
-   \param group the group that should be initialized.
-   \todo Maybe Group should be a Class, because it does a lot of stuff
-   
-*/
-bool Model::initGroup(Group* group)
-{
-  PRINTF(4)("Adding new Group\n");
-  group->name = "";
-  group->faceMode = -1;
-  group->faceCount = 0;  
-  group->next = NULL;
-
-  group->firstFace = new Face;
-  this->initFace (group->firstFace);
-  group->currentFace = group->firstFace;
-}
-
-/**
-   \brief initializes a new Face. (sets default Values)
-   \param face The face to initialize
-*/
-bool Model::initFace (Face* face)
-{
-  face->vertexCount = 0;
-
-  face->firstElem = NULL;
-  
-  face->material = NULL;
-  
-  face->next = NULL;
-
-  return true;
 }
 
@@ -268,4 +320,5 @@
   if (this->normals)
     delete this->normals;
+
   this->vertices = NULL;
   this->vTexture = NULL;
@@ -280,59 +333,9 @@
 {
   PRINTF(4)("cleaning up the 3D-Model to save Memory.\n");
-  this->cleanupGroup(this->firstGroup);
+  this->firstGroup->cleanup();
   return true; 
 }
 
-/**
-   \brief Cleans up all groups starting from group.
-   \param group the first Group to clean
-*/
-bool Model::cleanupGroup (Group* group)
-{
-  PRINTF(5)("Cleaning up group\n");
-  if (group->firstFace != NULL)
-    {
-      cleanupFace (group->firstFace);
-      delete group->firstFace;
-    }
-
-  if (group->next !=NULL)
-    cleanupGroup (group->next);
-  return true;
-}
-
-/**
-   \brief Cleans up all Faces starting from face until NULL is reached.
-   \param face the first face to clean.
-*/
-bool Model::cleanupFace (Face* face)
-{
-  PRINTF(5)("Cleaning up Face\n");
-
-  if (face->firstElem != NULL)
-    {
-      this->cleanupFaceElement(face->firstElem);
-      delete face->firstElem;
-    }
-      
-  if (face->next != NULL)
-    {
-      this->cleanupFace (face->next);
-      delete face->next;
-    }
-}
-
-/**
-   \brief Cleans up all FaceElements starting from faceElem.
-   \param faceElem the first FaceElement to clean.
-*/
-bool Model::cleanupFaceElement(FaceElement* faceElem)
-{
-  if (faceElem->next != NULL)
-    {
-      this->cleanupFaceElement (faceElem->next);
-      delete faceElem->next;
-    }
-}
+
 
 //////////
@@ -354,10 +357,9 @@
 /**
    \brief adds a new Material to the Material List
-   \param material the name of the Material to add
+   \param materialName the name of the Material to add
    \returns the added material
 */
 Material* Model::addMaterial(const char* materialName)
 {
-  
   Material* newMat = new Material();
   newMat->setName(materialName);
@@ -395,14 +397,13 @@
 
    This function initializes a new Group. 
-   With it you should be able to import .obj-files with more than one Models inside. 
-*/
-bool Model::addGroup (const char* groupString)
+   With it you should be able to create Models with more than one SubModel inside
+*/
+bool Model::addGroup(const char* groupString)
 {
   PRINTF(5)("Read Group: %s.\n", groupString);
-  if (this->groupCount != 0 && this->currentGroup->faceCount>0)
+  if (this->groupCount != 0 && this->currentGroup->faceCount > 0)
     {
       //      finalizeGroup(currentGroup);
-      this->currentGroup = this->currentGroup->next = new Group;
-      this->initGroup(this->currentGroup);
+      this->currentGroup = this->currentGroup->next = new ModelGroup;
     }
   // setting the group name if not default.
@@ -429,4 +430,5 @@
   PRINTF(5)("reading in a vertex: %f %f %f\n", &subbuffer1, &subbuffer2, &subbuffer3);
   this->vertices->addEntry(subbuffer1*scaleFactor, subbuffer2*scaleFactor, subbuffer3*scaleFactor);
+  this->vertexCount++;
   return true;
 }
@@ -443,4 +445,5 @@
   PRINTF(5)("reading in a vertex: %f %f %f\n", x, y, z);
   this->vertices->addEntry(x*scaleFactor, y*scaleFactor, z*scaleFactor);
+  this->vertexCount++;
   return true;
 }
@@ -460,4 +463,5 @@
   PRINTF(5)("found vertex-Normal %f, %f, %f\n", &subbuffer1,&subbuffer2,&subbuffer3);
   this->normals->addEntry(subbuffer1, subbuffer2, subbuffer3);
+  this->normalCount++;
   return true;
 }
@@ -475,4 +479,6 @@
   PRINTF(5)("found vertex-Normal %f, %f, %f\n", x, y, z);
   this->normals->addEntry(x, y, z);
+  this->normalCount++;
+  return true;
 }
 
@@ -492,4 +498,5 @@
   this->vTexture->addEntry(subbuffer1);
   this->vTexture->addEntry(subbuffer2);
+  this->texCoordCount++;
   return true;
 }
@@ -507,4 +514,6 @@
   this->vTexture->addEntry(u);
   this->vTexture->addEntry(v);
+  this->texCoordCount++;
+  return true;
 }
 
@@ -514,17 +523,18 @@
 
    If a face line is found this function will add it to the glList.
+
+   String is different from the argument addFace, in this that the first Vertex/Normal/Texcoord is 1 instead of 0
 */
 bool Model::addFace (const char* faceString)
 {
   if (this->currentGroup->faceCount >0)
-    this->currentGroup->currentFace = this->currentGroup->currentFace->next = new Face;
-  this->initFace (this->currentGroup->currentFace);
-
-  FaceElement* tmpElem = this->currentGroup->currentFace->firstElem = new FaceElement;
+    this->currentGroup->currentFace = this->currentGroup->currentFace->next = new ModelFace;
+
+  ModelFaceElement* tmpElem = this->currentGroup->currentFace->firstElem = new ModelFaceElement;
   tmpElem->next = NULL;
   while(strcmp (faceString, "\0"))
     {
       if (this->currentGroup->currentFace->vertexCount>0)
-	  tmpElem = tmpElem->next = new FaceElement;
+	  tmpElem = tmpElem->next = new ModelFaceElement;
       tmpElem->next = NULL;
 
@@ -552,14 +562,8 @@
       if (vertex)
 	tmpElem->vertexNumber = atoi(vertex)-1;
-      else
-	tmpElem->vertexNumber = -1;
       if (texture)
 	tmpElem->texCoordNumber = atoi(texture)-1;
-      else
-	tmpElem->texCoordNumber = -1;
       if (normal)
 	tmpElem->normalNumber = atoi(normal)-1;
-      else
-	tmpElem->normalNumber = -1;
 
       faceString += tmpLen;
@@ -575,14 +579,12 @@
    \brief adds a new Face
    \param faceElemCount the number of Vertices to add to the Face.
-   \param type 0: vertex only, 1: vertex and normal, 2: vertex and Texture, 3 vertex, normal and texture
+   \param type The information Passed with each Vertex
 */
 bool Model::addFace(int faceElemCount, VERTEX_FORMAT type, ...)
 {
-   if (this->currentGroup->faceCount > 0)
-    this->currentGroup->currentFace = this->currentGroup->currentFace->next = new Face;
-  this->initFace (this->currentGroup->currentFace);
-
-  FaceElement* tmpElem = this->currentGroup->currentFace->firstElem = new FaceElement;
-  tmpElem->next = NULL;
+  if (this->currentGroup->faceCount > 0)
+    this->currentGroup->currentFace = this->currentGroup->currentFace->next = new ModelFace;
+  
+  ModelFaceElement* tmpElem = this->currentGroup->currentFace->firstElem = new ModelFaceElement;
   
   va_list itemlist;
@@ -591,13 +593,12 @@
   for (int i = 0; i < faceElemCount; i++)
     {
-      if (this->currentGroup->currentFace->vertexCount>0)
-	  tmpElem = tmpElem->next = new FaceElement;
-      tmpElem->next = NULL;
-
-      tmpElem->vertexNumber = va_arg (itemlist, int) -1;
+      if (this->currentGroup->currentFace->vertexCount > 0)
+	tmpElem = tmpElem->next = new ModelFaceElement;
+
+      tmpElem->vertexNumber = va_arg (itemlist, int);
       if (type & TEXCOORD)
-	tmpElem->texCoordNumber = va_arg (itemlist, int) -1;
+	tmpElem->texCoordNumber = va_arg (itemlist, int);
       if (type & NORMAL)
- 	tmpElem->normalNumber = va_arg(itemlist, int) -1;
+ 	tmpElem->normalNumber = va_arg(itemlist, int);
       this->currentGroup->currentFace->vertexCount++;
     }
@@ -614,6 +615,5 @@
 {
   if (this->currentGroup->faceCount > 0)
-    this->currentGroup->currentFace = this->currentGroup->currentFace->next = new Face;
-  this->initFace (this->currentGroup->currentFace);
+    this->currentGroup->currentFace = this->currentGroup->currentFace->next = new ModelFace;
   
   this->currentGroup->currentFace->material = this->findMaterialByName(matString);
@@ -630,6 +630,5 @@
 {
   if (this->currentGroup->faceCount > 0)
-    this->currentGroup->currentFace = this->currentGroup->currentFace->next = new Face;
-  this->initFace (this->currentGroup->currentFace);
+    this->currentGroup->currentFace = this->currentGroup->currentFace->next = new ModelFace;
   
   this->currentGroup->currentFace->material = mtl;
@@ -662,17 +661,17 @@
   Vector curV;
 
-  Group* tmpGroup = firstGroup;
+  ModelGroup* tmpGroup = firstGroup;
   while (tmpGroup)
     {
-      Face* tmpFace = tmpGroup->firstFace;
+      ModelFace* tmpFace = tmpGroup->firstFace;
       while (tmpFace)
 	{
 	  if (tmpFace->firstElem)
 	    {
-	      FaceElement* firstElem = tmpFace->firstElem;
-	      FaceElement* prevElem;
-	      FaceElement* curElem = firstElem;
-	      FaceElement* nextElem;
-	      FaceElement* lastElem;
+	      ModelFaceElement* firstElem = tmpFace->firstElem;
+	      ModelFaceElement* prevElem;
+	      ModelFaceElement* curElem = firstElem;
+	      ModelFaceElement* nextElem;
+	      ModelFaceElement* lastElem;
 	      // find last Element of the Chain. !! IMPORTANT:the last Element of the Chain must point to NULL, or it will resolv into an infinity-loop.
 	      while (curElem)
@@ -704,10 +703,10 @@
     }
 
-  for (int i=0; i<vertices->getCount()/3;i++)
+  for (int i=0; i < vertices->getCount()/3;i++)
     {
       normArray[i].normalize();
       PRINTF(5)("Found Normale number %d: (%f; %f, %f).\n", i, normArray[i].x, normArray[i].y, normArray[i].z);
       
-      this->normals->addEntry(normArray[i].x, normArray[i].y, normArray[i].z);
+      this->addVertexNormal(normArray[i].x, normArray[i].y, normArray[i].z);
 
     }
@@ -744,5 +743,5 @@
 
       // Putting Faces to GL
-      Face* tmpFace = this->currentGroup->firstFace;
+      ModelFace* tmpFace = this->currentGroup->firstFace;
       while (tmpFace != NULL)
 	{
@@ -794,5 +793,5 @@
 	    }
 	  
-	  FaceElement* tmpElem = tmpFace->firstElem;
+	  ModelFaceElement* tmpElem = tmpFace->firstElem;
 	  while (tmpElem != NULL)
 	    {
@@ -826,5 +825,4 @@
   glNormalPointer(3, 0, this->normals->getArray());
   glTexCoordPointer(2, GL_FLOAT, 0, this->vTexture->getArray());
-
 }
 
@@ -841,14 +839,32 @@
    merging this information, the face will be drawn.
 */
-bool Model::addGLElement (FaceElement* elem)
+bool Model::addGLElement (ModelFaceElement* elem)
 {
   PRINTF(5)("importing grafical Element to openGL.\n");
 
   if (elem->texCoordNumber != -1)
-    glTexCoord2fv(this->vTexture->getArray() + elem->texCoordNumber * 2);
+    {
+      if (likely(elem->texCoordNumber < this->texCoordCount))
+	glTexCoord2fv(this->vTexture->getArray() + elem->texCoordNumber * 2);
+      else
+	PRINTF(2)("TextureCoordinate %d is not in the List (max: %d)\nThe Model might be incomplete\n",
+		  elem->texCoordNumber, this->texCoordCount);
+    }
   if (elem->normalNumber != -1)
-    glNormal3fv(this->normals->getArray() + elem->normalNumber * 3);
+    {
+    if (likely(elem->normalNumber < this->normalCount))
+      glNormal3fv(this->normals->getArray() + elem->normalNumber * 3);
+    else
+	PRINTF(2)("Normal %d is not in the List (max: %d)\nThe Model might be incomplete",
+		  elem->normalNumber, this->normalCount);      
+    }
   if (elem->vertexNumber != -1)
-    glVertex3fv(this->vertices->getArray() + elem->vertexNumber * 3);
+    {
+      if (likely(elem->vertexNumber < this->vertexCount))
+	  glVertex3fv(this->vertices->getArray() + elem->vertexNumber * 3);
+      else
+	PRINTF(2)("Vertex %d is not in the List (max: %d)\nThe Model might be incomplete",
+		  elem->vertexNumber, this->vertexCount);      
+    }	
 
 }
@@ -910,19 +926,10 @@
   this->addVertexNormal (-1.0, 0.0, 0.0);
 
-  /* normaleLess-testingMode
-  this->addFace ("1 2 4 3");
-  this->addFace ("3 4 6 5");
-  this->addFace ("5 6 8 7");
-  this->addFace ("7 8 2 1");
-  this->addFace ("2 8 6 4");
-  this->addFace ("7 1 3 5");
-  */
-
-  this->addFace (4, VERTEX_TEXCOORD_NORMAL, 1,1,1, 2,2,2, 4,4,3, 3,3,4);
-  this->addFace (4, VERTEX_TEXCOORD_NORMAL, 3,3,5, 4,4,6, 6,6,7, 5,5,8);
-  this->addFace (4, VERTEX_TEXCOORD_NORMAL, 5,5,9, 6,6,10, 8,8,11, 7,7,12);
-  this->addFace (4, VERTEX_TEXCOORD_NORMAL, 7,7,13, 8,8,14, 2,10,15, 1,9,16);
-  this->addFace (4, VERTEX_TEXCOORD_NORMAL, 2,2,17, 8,11,18, 6,12,19, 4,4,20);
-  this->addFace (4, VERTEX_TEXCOORD_NORMAL, 7,13,21, 1,1,22, 3,3,23, 5,14,24);
-
-}
+  this->addFace (4, VERTEX_TEXCOORD_NORMAL, 0,0,0, 1,1,1, 3,3,2, 2,2,3);
+  this->addFace (4, VERTEX_TEXCOORD_NORMAL, 2,2,4, 3,3,5, 5,5,6, 4,4,7);
+  this->addFace (4, VERTEX_TEXCOORD_NORMAL, 4,4,8, 5,5,9, 7,7,10, 6,6,11);
+  this->addFace (4, VERTEX_TEXCOORD_NORMAL, 6,6,12, 7,7,13, 1,9,14, 0,8,15);
+  this->addFace (4, VERTEX_TEXCOORD_NORMAL, 1,1,16, 7,10,17, 5,11,18, 3,3,19);
+  this->addFace (4, VERTEX_TEXCOORD_NORMAL, 6,12,20, 0,0,21, 2,2,22, 4,13,23);
+
+}
Index: orxonox/branches/openAL/src/lib/graphics/importer/model.h
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/importer/model.h	(revision 3921)
+++ orxonox/branches/openAL/src/lib/graphics/importer/model.h	(revision 4194)
@@ -34,69 +34,86 @@
 		    VERTEX_TEXCOORD_NORMAL = NORMAL | TEXCOORD};
 
+////////////////////
+/// SUB-ELEMENTS ///
+////////////////////
+//! This is the placeholder of one Vertex beloning to a Face.
+class ModelFaceElement
+{
+ public:
+  ModelFaceElement();
+  ~ModelFaceElement();
+
+  int vertexNumber;         //!< The number of the Vertex out of the Array* vertices, this vertex points to.
+  int normalNumber;         //!< The number of the Normal out of the Array* normals, this vertex points to.
+  int texCoordNumber;       //!< The number of the textureCoordinate out of the Array* vTexture, this vertex points to.
+  ModelFaceElement* next;   //!< Point to the next FaceElement in this List.
+};
+
+//! This is the placeholder of a Face belonging to a Group of Faces.
+class ModelFace
+{
+ public:
+  ModelFace();
+  ~ModelFace();
+
+  int vertexCount;                //!< The Count of vertices this Face has.
+  ModelFaceElement* firstElem;    //!< Points to the first Vertex (FaceElement) of this Face.
+  
+  Material* material;             //!< The Material to use.
+  
+  ModelFace* next;                //!< Pointer to the next Face.
+}; 
+
+//! Group to handle multiple Models per obj-file.
+class ModelGroup
+{
+ public:
+  ModelGroup();
+  ~ModelGroup();
+
+  void cleanup();
+
+  char* name;                 //!< the Name of the Group. this is an identifier, that can be accessed via the draw (char* name) function.
+  
+  GLubyte* indices;           //!< The indices of the Groups. Needed for vertex-arrays
+  GLuint listNumber;          //!< The number of the GL-List this Group gets.
+  ModelFace* firstFace;       //!< The first Face in this group.
+  ModelFace* currentFace;     //!< The current Face in this Group (the one we are currently working with.)
+  int faceMode;               //!< The Mode the Face is in: initially -1, 0 for FaceList opened, 1 for Material,  3 for triangle, 4 for Quad, 5+ for Poly \todo ENUM...
+  int faceCount;              //!< The Number of Faces this Group holds.
+  
+  ModelGroup* next;           //!< Pointer to the next Group.
+};
+
+/////////////
+/// MODEL ///
+/////////////
+
 //! Class that handles 3D-Models. it can also read them in and display them.
 class Model
 {
  private:
-  /////////////
-  // structs //
-  /////////////
-  //! This is the placeholder of one Vertex beloning to a Face.
-  struct FaceElement
-  {
-    int vertexNumber;    //!< The number of the Vertex out of the Array* vertices, this vertex points to.
-    int normalNumber;    //!< The number of the Normal out of the Array* normals, this vertex points to.
-    int texCoordNumber;  //!< The number of the textureCoordinate out of the Array* vTexture, this vertex points to.
-    FaceElement* next;   //!< Point to the next FaceElement in this List.
-  };
 
-  //! This is the placeholder of a Face belonging to a Group of Faces.
-  struct Face
-  {
-    int vertexCount;        //!< The Count of vertices this Face has.
-    FaceElement* firstElem; //!< Points to the first Vertex (FaceElement) of this Face.
+  char* name;                 //!< This is the name of the Model.
+  MODEL_TYPE type;            //!< A type for the Model
+  bool finalized;             //!< Sets the Object to be finalized.
 
-    Material* material;     //!< The Material to use.
+  int vertexCount;            //!< A modelwide Counter for vertices.
+  int normalCount;            //!< A modelwide Counter for the normals.
+  int texCoordCount;          //!< A modelwide Counter for the texCoord.
+  Array* vertices;            //!< The Array that handles the Vertices.
+  Array* normals;             //!< The Array that handles the Normals.
+  Array* vTexture;            //!< The Array that handles the VertexTextureCoordinates.
 
-    Face* next;             //!< Pointer to the next Face.
-  }; 
+  ModelGroup* firstGroup;     //!< The first of all groups.
+  ModelGroup* currentGroup;   //!< The currentGroup. this is the one we will work with.
+  int groupCount;             //!< The Count of Groups.
 
-  //! Group to handle multiple Models per obj-file.
-  struct Group
-  {
-    char* name;         //!< the Name of the Group. this is an identifier, that can be accessed via the draw (char* name) function.
-
-    GLubyte* indices;   //!< The indices of the Groups. Needed for vertex-arrays
-    GLuint listNumber;  //!< The number of the GL-List this Group gets.
-    Face* firstFace;    //!< The first Face in this group.
-    Face* currentFace;  //!< The current Face in this Group (the one we are currently working with.)
-    int faceMode;       //!< The Mode the Face is in: initially -1, 0 for FaceList opened, 1 for Material,  3 for triangle, 4 for Quad, 5+ for Poly \todo ENUM...
-    int faceCount;      //!< The Number of Faces this Group holds.
-
-    Group* next;        //!< Pointer to the next Group.
-  };
-
-  char* name;            //!< This is the name of the Model.
-  MODEL_TYPE type;
-  bool finalized;        //!< Sets the Object to be finalized.
-
-  Array* vertices;      //!< The Array that handles the Vertices.
-  int verticesCount;    //!< A global Counter for vertices.
-  Array* normals;       //!< The Array that handles the Normals.
-  Array* vTexture;      //!< The Array that handles the VertexTextureCoordinates.
-
-  Group* firstGroup;    //!< The first of all groups.
-  Group* currentGroup;  //!< The currentGroup. this is the one we will work with.
-  int groupCount;       //!< The Count of Groups.
-
-  tList<Material>* materialList;
+  tList<Material>* materialList;//!< A list for all the Materials in this Model
   
-
-  bool initGroup(Group* group);
-  bool initFace (Face* face);
-
   bool buildVertexNormals(void);
 
   bool importToDisplayList(void);
-  bool addGLElement(FaceElement* elem);
+  bool addGLElement(ModelFaceElement* elem);
 
   bool importToVertexArray(void);
@@ -104,7 +121,4 @@
   bool deleteArrays(void);
   bool cleanup(void);
-  bool cleanupGroup(Group* group);
-  bool cleanupFace(Face* face);
-  bool cleanupFaceElement(FaceElement* faceElem);
 
 
@@ -121,4 +135,5 @@
 
   void setName(const char* name);
+  /** \returns the Name of the Model */
   inline const char* getName() {return this->name;}
   
@@ -126,5 +141,7 @@
   void draw(int groupNumber) const;
   void draw(char* groupName) const;
-  int getGroupCount() const;
+
+  /** \returns Count of the Models (Groups) in this File */
+  inline int getGroupCount(void) const {return this->groupCount;}
 
   Material* addMaterial(Material* material);
@@ -143,4 +160,11 @@
   bool setMaterial(Material* mtl);
   void finalize(void);
+
+  /** \returns The number of Vertices of the Model */
+  inline int getVertexCount(void) const {return this->vertexCount;}
+  /** \returns The number of Normals of the Model */
+  inline int getNormalCount(void) const {return this->normalCount;}
+  /** \returns The number of Texture Coordinates of the Model*/
+  inline int getTexCoordCount(void) const {return this->texCoordCount;}
 };
 
Index: orxonox/branches/openAL/src/lib/graphics/importer/objModel.cc
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/importer/objModel.cc	(revision 3921)
+++ orxonox/branches/openAL/src/lib/graphics/importer/objModel.cc	(revision 4194)
@@ -34,5 +34,6 @@
 OBJModel::OBJModel(const char* fileName, float scaling) : Model(fileName)
 {
-  this->initializeOBJ();
+  this->objPath = "./";
+
   this->scaleFactor = scaling;
 
@@ -52,18 +53,4 @@
   if (this->objPath)
     delete []this->objPath;
-  if (this->objFileName)
-    delete []this->objFileName;
-  if (this->mtlFileName)
-    delete []this->mtlFileName;
-}
-
-/**
-   \brief Initializes an obj-model
-*/
-void OBJModel::initializeOBJ(void)
-{
-  this->objPath = NULL;
-  this->objFileName = NULL;
-  this->mtlFileName = NULL;
 }
 
@@ -71,39 +58,24 @@
    \brief Imports a obj file and handles the the relative location
    \param fileName The file to import
+
+   Splits the FileName from the DirectoryName
 */
 bool OBJModel::importFile (const char* fileName)
 {
   PRINTF(4)("preparing to read in file: %s\n", fileName);
-
-
-#ifdef __WIN32__
-  // win32 path reading
-  char pathSplitter= '\\';
-#else /* __WIN32__ */
-  // unix path reading
-  char pathSplitter='/';
-#endif /* __WIN32__ */
-  char* tmpName;
-  strcpy(tmpName, fileName);
-  if (tmpName[0] == pathSplitter)
-    tmpName++;
-  char* name = tmpName;
-  while (( tmpName = strchr (tmpName+1, pathSplitter)))
-    {
-      name = tmpName+1;
-    }
-  this->objPath = new char[name-fileName+1];
-  strncpy(this->objPath, fileName, name-fileName);
-  this->objPath[name-fileName] = '\0';
-  if (strlen(objPath)> 0)
-    PRINTF(5)("Resolved file %s to folder: %s.\n", name, objPath);
-  else
-    PRINTF(5)("Resolved file %s.\n", name);
-  
-  this->setName(name);
-
-  this->objFileName = new char[strlen(name)+1];
-  strcpy (this->objFileName, name);
-  this->readFromObjFile ();
+  // splitting the 
+  char* split = NULL;
+
+  if (!(split = strrchr(fileName, '/')))
+    split = strrchr(fileName, '\\'); // windows Case
+  if (split)
+    {
+      int len = split - fileName+1;
+      this->objPath = new char[len +2];
+      strncpy(this->objPath, fileName, len);
+      this->objPath[len] = '\0';
+      PRINTF(1)("Resolved file %s to Path %s.\n", fileName, this->objPath);
+    }
+  this->readFromObjFile (fileName);
   return true;
 }
@@ -113,16 +85,10 @@
    This function does read the file, parses it for the occurence of things like vertices, faces and so on, and executes the specific tasks
 */
-bool OBJModel::readFromObjFile (void)
-{
-  char* fileName = new char [strlen(objPath)+strlen(objFileName)+1];
-  if (this->objFileName != NULL && !strcmp(this->objFileName, ""))
-    return false;
-  strcpy(fileName, this->objPath);
-  strcat(fileName, this->objFileName);
-
+bool OBJModel::readFromObjFile(const char* fileName)
+{
   FILE* stream;
   if( (stream = fopen (fileName, "r")) == NULL)
     {
-      printf("IniParser could not open %s\n", fileName);
+      printf("Object File Could not be Opened %s\n", fileName);
       return false;
     }
@@ -179,5 +145,4 @@
     }
   fclose (stream);
-  delete []fileName;
   return true;
 }
@@ -194,15 +159,12 @@
 bool OBJModel::readMtlLib (const char* mtlFile)
 {
-  this->mtlFileName = new char [strlen(mtlFile)+1];
-  strcpy(this->mtlFileName, mtlFile);
-  char* fileName = new char [strlen(objPath) + strlen(this->mtlFileName)+1];
-  strcpy(fileName, this->objPath);
-  strcat(fileName, this->mtlFileName);
-  
+  char* fileName = new char [strlen(this->objPath) + strlen(mtlFile)+1];
+  sprintf(fileName, "%s%s", this->objPath, mtlFile);
 
   FILE* stream;
   if( (stream = fopen (fileName, "r")) == NULL)
     {
-      printf("IniParser could not open %s\n", fileName);
+      PRINTF(2)("MaterialLibrary could not be opened %s\n", fileName);
+      delete []fileName;
       return false;
     }
Index: orxonox/branches/openAL/src/lib/graphics/importer/objModel.h
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/importer/objModel.h	(revision 3921)
+++ orxonox/branches/openAL/src/lib/graphics/importer/objModel.h	(revision 4194)
@@ -15,15 +15,12 @@
   OBJModel(const char* fileName, float scaling = 1.0);
   virtual ~OBJModel();
-  void initializeOBJ(void);
 
  private:
   // Variables
   char* objPath;        //!< The Path where the obj and mtl-file are located.
-  char* objFileName;    //!< The Name of the obj-file.
-  char* mtlFileName;    //!< The Name of the mtl-file (parsed out of the obj-file)
 
   ///// readin /////
   bool importFile (const char* fileName);
-  bool readFromObjFile (void);
+  bool readFromObjFile (const char* fileName);
   bool readMtlLib (const char* matFile);
 };
Index: orxonox/branches/openAL/src/lib/graphics/importer/primitive_model.cc
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/importer/primitive_model.cc	(revision 3921)
+++ orxonox/branches/openAL/src/lib/graphics/importer/primitive_model.cc	(revision 4194)
@@ -71,5 +71,4 @@
 void PrimitiveModel::sphereModel(float size, unsigned int detail)
 {
-  int vertexCount = 0;
   if (detail <= 0) 
     detail = 1;
@@ -89,9 +88,10 @@
 			  size * sin(vi) * cos(vj));
 	  this->addVertexTexture(i / (df *2.0), (j-1.0)/(df)+.5);
-	  vertexCount++;
 	}
     }
   this->addVertex(0, -size, 0);
+  this->addVertexTexture(0,0);
   this->addVertex(0, size, 0);
+  this->addVertexTexture(0 ,1);
 
   // defining the binding Faces.
@@ -102,26 +102,26 @@
 	{
 	  
-	  v1 = i*detail + j;
-	  v4 = i*detail + (j+1);
+	  v1 = i*detail + j-1;
+	  v4 = i*detail + j;
 	  
 	  if (i == detail*2 -1)
 	    {
-	      v2 = j;
-	      v3 = j+1;
+	      v2 = j-1;
+	      v3 = j;
 	    }
 	  else
 	    {
-	      v2 = (i+1)*detail + j;
-	      v3 = (i+1)*detail + (j+1);
-	    }
-	  
+	      v2 = (i+1)*detail + j-1;
+	      v3 = (i+1)*detail + j;
+	    }
+
 	  if (j == 0)
 	    {
-	      v1 = vertexCount+1;
+	      v1 = this->getVertexCount()-2;
 	      this->addFace(3, VERTEX_TEXCOORD, v1, v1, v3, v3, v4, v4);
 	    }
 	  else if (j == detail)
 	    {
-	      v3 = vertexCount+2;
+	      v3 = this->getVertexCount()-1;
 	      this->addFace(3, VERTEX_TEXCOORD, v1, v1, v2, v2, v3, v3);
 	    }
@@ -157,17 +157,17 @@
     {
       int p1, p2, p3, p4;
-      p1 = 2*i+1;
-      p2 = 2*i+2;
-      p3 = 2*i+4;
-      p4 = 2*i+3;
+      p1 = 2*i;
+      p2 = 2*i+1;
+      p3 = 2*i+3;
+      p4 = 2*i+2;
       // something is wrong here
       this->addFace(4, VERTEX_ONLY, p1, p2, p3, p4);
-      this->addFace(3, VERTEX_ONLY, p4, p1, 2*detail+1);
-      this->addFace(3, VERTEX_ONLY, p2, p3, 2*detail+2);
+      this->addFace(3, VERTEX_ONLY, p4, p1, 2*detail);
+      this->addFace(3, VERTEX_ONLY, p2, p3, 2*detail+1);
     }
   // caps
-  this->addFace(4, VERTEX_ONLY, 2*detail-1, 2*detail, 2, 1);
-  this->addFace(3, VERTEX_ONLY, 1, 2*detail-1, 2*detail+1);
-  this->addFace(3, VERTEX_ONLY, 2*detail, 2, 2*detail+2);
+  this->addFace(4, VERTEX_ONLY, 2*detail-2, 2*detail-1, 1, 0);
+  this->addFace(3, VERTEX_ONLY, 0, 2*detail-2, 2*detail);
+  this->addFace(3, VERTEX_ONLY, 2*detail-1, 1, 2*detail+1);
 }
 
@@ -198,11 +198,11 @@
     {
       unsigned int v1, v2;
-      v1 = i+3;
+      v1 = i+2;
       if (i == detail -1)
-	v2 = 3;
+	v2 = 2;
       else
-	v2 = i+4;
-      this->addFace(3, VERTEX_ONLY, 1, v1, v2);
-      this->addFace(3, VERTEX_ONLY, 2, v1, v2); 
+	v2 = i+3;
+      this->addFace(3, VERTEX_ONLY, 0, v1, v2);
+      this->addFace(3, VERTEX_ONLY, 1, v1, v2); 
     }
 }
@@ -228,5 +228,5 @@
   unsigned int v1, v2, v3, v4;
   for (int i = 0; i < detail-1; i++)
-    for (int j = 1; j < detail; j++)
+    for (int j = 0; j < detail-1; j++)
       {
 	v1 = i*detail + j;
Index: orxonox/branches/openAL/src/lib/graphics/importer/texture.cc
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/importer/texture.cc	(revision 3921)
+++ orxonox/branches/openAL/src/lib/graphics/importer/texture.cc	(revision 4194)
@@ -25,4 +25,5 @@
 Texture::Texture(const char* imageName)
 {
+  bAlpha = false;
   this->texture = 0;
   if (imageName)
@@ -112,4 +113,5 @@
       if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA ) {
 	SDL_SetAlpha(surface, saved_flags | SDL_OPENGL, saved_alpha);
+	this->bAlpha = true;
       }
       
@@ -119,5 +121,6 @@
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-      /*      glTexImage2D(GL_TEXTURE_2D,
+      // build the Texture
+      glTexImage2D(GL_TEXTURE_2D,
 		   0,
 		   GL_RGBA,
@@ -127,7 +130,7 @@
 		   GL_UNSIGNED_BYTE,
 		   image->pixels);
-      */
+      // build the MipMaps
       gluBuild2DMipmaps(GL_TEXTURE_2D,
-			3,
+			GL_RGBA,
 			w,
 			h,
@@ -135,5 +138,5 @@
 			GL_UNSIGNED_BYTE,
 			image->pixels);
-
+      
       SDL_FreeSurface(image); /* No longer needed */
       
Index: orxonox/branches/openAL/src/lib/graphics/importer/texture.h
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/importer/texture.h	(revision 3921)
+++ orxonox/branches/openAL/src/lib/graphics/importer/texture.h	(revision 4194)
@@ -23,4 +23,6 @@
   char* searchTextureInPaths(const char* texName) const;
   void swap(unsigned char &a, unsigned char &b);
+
+  bool bAlpha;           //!< if the texture has an alpha channel.
  public:
   Texture(const char* imageName = NULL);
@@ -30,4 +32,5 @@
   inline GLuint getTexture(void) {return this->texture;} 
   GLuint loadTexToGL (SDL_Surface* surface);
+  inline bool hasAlpha(void) {return bAlpha;}
 
   bool loadImage(const char* imageName);
Index: orxonox/branches/openAL/src/lib/graphics/particles/particle_emitter.cc
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/particles/particle_emitter.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/graphics/particles/particle_emitter.cc	(revision 4194)
@@ -0,0 +1,155 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute 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.
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer: Patrick Boenzli
+*/
+
+#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_PARTICLE
+
+#include "particle_emitter.h"
+
+#include "particle_system.h"
+#include "particle_engine.h"
+
+using namespace std;
+
+
+/**
+   \brief standard constructor
+*/
+ParticleEmitter::ParticleEmitter(const Vector& direction, float angle, float emissionRate, 
+		  float velocity)
+{
+   this->setClassName ("ParticleEmitter");
+   this->direction = direction;
+   this->setSpread(angle);
+   this->setEmissionRate(emissionRate);
+   this->setVelocity(velocity);
+
+   this->saveTime = 0.0;
+
+   ParticleEngine::getInstance()->addEmitter(this);
+}
+
+
+
+/**
+   \brief standard destructor
+
+*/
+ParticleEmitter::~ParticleEmitter () 
+{
+  ParticleEngine::getInstance()->removeEmitter(this);
+  
+}
+
+
+/**
+   \brief this start the emitter
+*/
+void ParticleEmitter::start() {}
+
+
+/**
+   \brief this stops the emitter
+*/
+void ParticleEmitter::stop() {}
+
+
+
+
+/* these are Animation interfaces: so you can change spec values as you want */
+
+/**
+   \brief set the emission rate
+   \param sets the number of particles emitted per second
+
+   if you want to change the value of this variable during emission time (to make it more dynamic)
+   you may want to use the animation class
+*/
+void ParticleEmitter::setEmissionRate(float emissionRate)
+{
+  this->emissionRate = emissionRate;
+}
+
+/**
+   \brief set the angle of the emitter
+   \param angle around the direction in which there are particles to be emitted
+   \param randomAngle A random spread-angle, the +- randomness of this option
+
+   if you want to change the value of this variable during emission time (to make it more dynamic)
+   you may want to use the animation class
+*/
+void ParticleEmitter::setSpread(float angle, float randomAngle)
+{
+  this->angle = angle;
+  this->randomAngle = randomAngle;
+}
+
+/**
+   \brief sets the velocity of all particles emitted
+   \param velocity The starting velocity of the emitted particles
+   \param random A random starting velocity, the +- randomness of this option
+
+   if you want to change the value of this variable during emission time (to make it more dynamic)
+   you may want to use the animation class
+*/
+void ParticleEmitter::setVelocity(float velocity, float randomVelocity)
+{
+  this->velocity = velocity;
+  this->randomVelocity = randomVelocity;
+}
+
+/**
+   \brief this set the time to life of a particle, after which it will die
+   \param the time to live in seconds
+
+   if you want to change the value of this variable during emission time (to make it more dynamic)
+   you may want to use the animation class
+*/
+
+void ParticleEmitter::tick(float dt, ParticleSystem* system)
+{
+  if (likely(dt > 0.0 && this->emissionRate > 0.0))
+  {
+    // saving the time
+    float count = (dt+this->saveTime) * this->emissionRate;
+    this->saveTime = modff(count, &count) / this->emissionRate;
+    PRINTF(5)("emitting %f particles, saving %f seconds for the next round\n", count, this->saveTime); 
+    
+    if (likely(count > 0))
+      {
+	Vector inheritVelocity = this->getVelocity() * system->inheritSpeed;
+	for (int i = 0; i < count; i++)
+	  // emmits from EMITTER_DOT,
+	  {
+	    Vector randDir = Vector(rand()-RAND_MAX/2, rand()-RAND_MAX/2, rand()-RAND_MAX/2);
+	    randDir.normalize();
+	    randDir = (this->getAbsDir()*Quaternion(angle + randomAngle *((float)rand()/RAND_MAX -.5), randDir)).apply(this->direction);
+	    Vector velocityV = randDir.getNormalized()*this->velocity + inheritVelocity;
+
+	    // this should spread the Particles evenly. if the Emitter is moved around quickly
+	    Vector equalSpread = this->getVelocity() * random()/RAND_MAX * dt;
+
+	    system->addParticle(this->getAbsCoor() - equalSpread, velocityV);
+	  }
+      }
+  }
+}
+
+/**
+   \brief outputs some nice debug information
+*/
+void ParticleEmitter::debug(void)
+{
+
+}
Index: orxonox/branches/openAL/src/lib/graphics/particles/particle_emitter.h
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/particles/particle_emitter.h	(revision 4194)
+++ orxonox/branches/openAL/src/lib/graphics/particles/particle_emitter.h	(revision 4194)
@@ -0,0 +1,51 @@
+/*! 
+    \file particle_e,otter.h
+    \brief Definition of a ParticleEmitter
+*/
+
+#ifndef _PARTICLE_EMITTER_H
+#define _PARTICLE_EMITTER_H
+
+#include "p_node.h"
+
+// FORWARD DEFINITION 
+struct Particle;
+class ParticleSystem;
+
+typedef enum EMITTER_TYPE {EMITTER_DOT,
+			   EMITTER_PLANE,
+			   EMITTER_SPHERE,
+			   EMITTER_CUBE};
+
+//! A default singleton class.
+class ParticleEmitter : public PNode {
+
+ public:
+  ParticleEmitter(const Vector& direction, float angle = .5,
+		  float emissionRate = 1.0, float velocity = 1.0);
+  virtual ~ParticleEmitter(void);
+
+  /* controlling the emitter: interface */
+  void start();
+  void stop();
+  void tick(float dt, ParticleSystem* system);
+
+  /* controlling the behavour: these can be used as Animation interfaces */
+  void setEmissionRate(float emissionRate);
+  void setSpread(float angle, float randomAngle = 0.0);
+  void setVelocity(float velocity, float randomVelocity = 0.0);
+
+  void debug(void);
+
+ private:
+  Vector direction;     //!< emition direction
+  float angle;          //!< max angle from the direction of the emitter
+  float randomAngle;    //!< random emission angle (angle +- angleRandom is the emitted angle.
+  float emissionRate;   //!< amount of particles per seconds emitted by emitter.
+  float velocity;       //!< the initial speed of a Particles.
+  float randomVelocity; //!< the random variation from the initial Speed.
+
+  float saveTime;       //!< The time that was missing by the last Tick (otherwise there would be no emission when framefate is too big).
+};
+
+#endif /* _PARTICLE_EMITTER_H */
Index: orxonox/branches/openAL/src/lib/graphics/particles/particle_engine.cc
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/particles/particle_engine.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/graphics/particles/particle_engine.cc	(revision 4194)
@@ -0,0 +1,307 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute 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.
+
+   ### File Specific:
+   main-programmer: ...
+   co-programmer: ...
+*/
+
+#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_PARTICLE
+
+#include "particle_engine.h"
+
+#include "particle_system.h"
+#include "particle_emitter.h"
+
+#include "list.h"
+
+using namespace std;
+
+/**
+   \brief standard constructor
+*/
+ParticleEngine::ParticleEngine () 
+{
+   this->setClassName ("ParticleEngine");
+
+   this->systemList = new tList<ParticleSystem>;
+   this->emitterList = new tList<ParticleEmitter>;
+   this->connectionList = new tList<ParticleConnection>;
+}
+
+/**
+   \brief the singleton reference to this class
+*/
+ParticleEngine* ParticleEngine::singletonRef = NULL;
+
+/**
+   \returns a Pointer to this Class
+*/
+ParticleEngine* ParticleEngine::getInstance(void)
+{
+  if (!ParticleEngine::singletonRef)
+    ParticleEngine::singletonRef = new ParticleEngine();
+  return ParticleEngine::singletonRef;
+}
+
+/**
+   \brief deletes all the system, emitters, connections and Lists
+*/
+ParticleEngine::~ParticleEngine () 
+{
+  // delete all remaining systems
+  tIterator<ParticleSystem>* sysIt = this->systemList->getIterator();
+  ParticleSystem* tmpSys = sysIt->nextElement();
+  while(tmpSys)
+    {
+      delete tmpSys;
+      tmpSys = sysIt->nextElement();
+    }
+  delete sysIt;
+  delete this->systemList;
+
+  // delete all remaining emitters
+  tIterator<ParticleEmitter>* emitIt = this->emitterList->getIterator();
+  ParticleEmitter* tmpEmit = emitIt->nextElement();
+  while(tmpEmit)
+    {
+      delete tmpEmit;
+      tmpEmit = emitIt->nextElement();
+    }
+  delete emitIt;
+  delete this->emitterList;
+
+  // there should be no more Connections
+  if (this->connectionList->getSize() == 0)
+    delete this->connectionList;
+  else
+    PRINTF(2)("The Connection List is not empty. This should not happen.\n");
+
+  ParticleEngine::singletonRef = NULL;
+}
+
+/**
+   \brief Adds a System to the System list.
+
+   this is done automatically when creating a ParticleSystem
+*/
+void ParticleEngine::addSystem(ParticleSystem* system)
+{
+  this->systemList->add(system);
+}
+
+/**
+   \brief Adds an emitter to the emitterList
+
+   this is done automatically when creating a ParticleEmitter
+*/
+void ParticleEngine::addEmitter(ParticleEmitter* emitter)
+{
+  this->emitterList->add(emitter);
+}
+
+/**
+   \brief Connects a ParticleSystem to a ParticleSystem thus emitting Particles.
+   \param emitter the Emitter to connect to the System
+   \param system the System to connect to the Emitter
+*/
+void ParticleEngine::addConnection(ParticleEmitter* emitter, ParticleSystem* system)
+{
+  // look, if we have already added this connection
+  tIterator<ParticleConnection>* tmpConIt = connectionList->getIterator();
+  ParticleConnection* tmpConnection = tmpConIt->nextElement();
+  while(tmpConnection)
+    {
+      if (tmpConnection->emitter == emitter && tmpConnection->system == system)
+	{
+	  PRINTF(2)("Connection between Emitter and System already added\n");
+	  delete tmpConIt;
+	  return;
+	}
+      
+      tmpConnection = tmpConIt->nextElement();
+    }
+  delete tmpConIt;
+  
+
+
+  ParticleConnection* tmpCon = new ParticleConnection;
+  tmpCon->emitter = emitter;
+  tmpCon->system = system;
+
+  this->connectionList->add(tmpCon);
+}
+
+/**
+   \brief Removes a system from the systemList and also removes all Connections to the System
+   \param system The ParticleSystem to delete
+*/
+bool ParticleEngine::removeSystem(ParticleSystem* system)
+{
+  // remove any connections, that have this system within
+  tIterator<ParticleConnection>* tmpConIt = connectionList->getIterator();
+  ParticleConnection* tmpConnection = tmpConIt->nextElement();
+  while(tmpConnection)
+    {
+      if (tmpConnection->system == system)
+	this->breakConnection(tmpConnection);
+      tmpConnection = tmpConIt->nextElement();
+    }
+  delete tmpConIt;
+
+  // remove the System from the systemList.
+  this->systemList->remove(system);
+}
+
+/**
+   \brief removes an emitter from the emitterList and also from all Connections it is attached to.
+   \param emitter the ParticleEmitter to remove.
+*/
+bool ParticleEngine::removeEmitter(ParticleEmitter* emitter)
+{
+  // remove any connections, that have this emitter within
+  tIterator<ParticleConnection>* tmpConIt = connectionList->getIterator();
+  ParticleConnection* tmpConnection = tmpConIt->nextElement();
+  while(tmpConnection)
+    {
+      if (tmpConnection->emitter == emitter)
+	this->breakConnection(tmpConnection);
+      tmpConnection = tmpConIt->nextElement();
+    }
+  delete tmpConIt;
+
+  // remove the emitter from the emitterList
+  this->emitterList->remove(emitter);
+}
+
+/**
+   \brief removes a Connection between an Emitter and a System
+   \param emitter The emitter of the connection to remove
+   \param system The system of the connection to remove
+   \returns true, if the connection was broken, false if the conntection was not found
+
+   only if both system and emitter are in the connection the Connection will be broken
+*/
+bool ParticleEngine::breakConnection(ParticleEmitter* emitter, ParticleSystem* system)
+{
+  // look, if we have already added this connection
+  tIterator<ParticleConnection>* tmpConIt = connectionList->getIterator();
+  ParticleConnection* tmpConnection = tmpConIt->nextElement();
+  while(tmpConnection)
+    {
+    if (tmpConnection->emitter == emitter && tmpConnection->system == system)
+      {
+	this->breakConnection(tmpConnection);
+	delete tmpConIt;
+	return true;
+      }
+    tmpConnection = tmpConIt->nextElement();
+    }
+  delete tmpConIt;
+  return false;
+}
+
+/**
+   \brief removes a Connection between an Emitter and a System
+   \param connection the connection to remove
+
+   \see bool ParticleEngine::breakConnection(ParticleEmitter* emitter, ParticleSystem* system)
+*/
+bool ParticleEngine::breakConnection(ParticleConnection* connection)
+{
+  this->connectionList->remove(connection);
+  return true;
+}
+
+
+/**
+   \brief this function ticks all the ParticleSystems, so an animation will flow
+   \param dt passed since last tick
+*/
+void ParticleEngine::tick(float dt)
+{
+  // ticks all the ParticleSystems
+  tIterator<ParticleSystem>* tmpIt = systemList->getIterator();
+  ParticleSystem* tmpSys = tmpIt->nextElement();
+  while(tmpSys)
+    {
+      tmpSys->tick(dt);
+      tmpSys = tmpIt->nextElement();
+    }
+  delete tmpIt;
+
+  // add new Particles to each System connected to an Emitter.
+  tIterator<ParticleConnection>* tmpConIt = connectionList->getIterator();
+  ParticleConnection* tmpConnection = tmpConIt->nextElement();
+  while(tmpConnection)
+    {
+      tmpConnection->emitter->tick(dt, tmpConnection->system);
+      tmpConnection = tmpConIt->nextElement();
+    }
+  delete tmpConIt;
+}
+
+/**
+   \brief draws all the systems and their Particles.
+   \param dt the time passed in seconds (since the last Frame)
+*/
+void ParticleEngine::draw(float dt)
+{
+  tIterator<ParticleSystem>* tmpIt = systemList->getIterator();
+  ParticleSystem* tmpSys = tmpIt->nextElement();
+  while(tmpSys)
+    {
+      tmpSys->draw(dt);
+      tmpSys = tmpIt->nextElement();
+    }
+  delete tmpIt;
+
+}
+
+/**
+   \brief outputs some nice debug information
+*/
+void ParticleEngine::debug(void)
+{
+  PRINT(0)("+-----------------------------------+\n");
+  PRINT(0)("+ PARTICLE-ENGINE DEBUG INFORMATION +\n");
+  PRINT(0)("+-----------------------------------+\n");
+  PRINT(0)(" Reference: %p\n", ParticleEngine::singletonRef);
+  PRINT(0)(" Count: Emitters: %d; Systems: %d, Connections: %d\n",
+	    this->emitterList->getSize(), this->systemList->getSize(), this->connectionList->getSize());
+  if (this->connectionList->getSize() > 0)
+    {
+      PRINT(0)(" Connections:\n");
+      PRINT(0)(" -----------------------------------\n");
+
+      tIterator<ParticleConnection>* tmpConIt = connectionList->getIterator();
+      ParticleConnection* tmpConnection = tmpConIt->nextElement();
+      while(tmpConnection)
+	{
+	  PRINT(0)(" Emitter '%s' emitts into System '%s'\n", tmpConnection->emitter->getName(), tmpConnection->system->getName());
+	  tmpConnection = tmpConIt->nextElement();
+	}
+      delete tmpConIt;
+    }
+  if (this->systemList->getSize() > 0)
+    {
+      tIterator<ParticleSystem>* tmpIt = systemList->getIterator();
+      ParticleSystem* tmpSys = tmpIt->nextElement();
+      while(tmpSys)
+	{
+	  tmpSys->debug();
+	  tmpSys = tmpIt->nextElement();
+	}
+      delete tmpIt;
+    }
+
+  PRINT(0)("+--------------------------------PE-+\n");
+
+}
Index: orxonox/branches/openAL/src/lib/graphics/particles/particle_engine.h
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/particles/particle_engine.h	(revision 4194)
+++ orxonox/branches/openAL/src/lib/graphics/particles/particle_engine.h	(revision 4194)
@@ -0,0 +1,55 @@
+/*! 
+    \file particle_engine.h
+    \brief Definition of the ParticleEngine
+*/
+
+#ifndef _PARTICLE_ENGINE_H
+#define _PARTICLE_ENGINE_H
+
+#include "base_object.h"
+#include "particle_system.h"
+#include "particle_emitter.h"
+
+// FORWARD DEFINITION 
+template<class T> class tList;
+class ParticleSystem;
+class ParticleEmitter;
+
+struct ParticleConnection
+{
+  ParticleEmitter* emitter;    //!< The emitter to emit system from.
+  ParticleSystem* system;      //!< The Particles emitted from emitter.
+};
+
+//! A default singleton class.
+class ParticleEngine : public BaseObject {
+
+ public:
+  static ParticleEngine* getInstance(void);
+  virtual ~ParticleEngine(void);
+
+  void tick(float dt);
+  void draw(float dt);
+
+  void addSystem(ParticleSystem* system);
+  void addEmitter(ParticleEmitter* emitter);
+  void addConnection(ParticleEmitter* emitter, ParticleSystem* system);
+
+  bool removeSystem(ParticleSystem* system);
+  bool removeEmitter(ParticleEmitter* emitter);
+  bool breakConnection(ParticleEmitter* emitter, ParticleSystem* system);
+  bool breakConnection(ParticleConnection* connection);
+
+  void debug();
+
+ private:
+  ParticleEngine(void);
+  static ParticleEngine* singletonRef;
+
+  tList<ParticleSystem>* systemList;
+  tList<ParticleEmitter>* emitterList;
+
+  tList<ParticleConnection>* connectionList;
+};
+
+#endif /* _PARTICLE_ENGINE_H */
Index: orxonox/branches/openAL/src/lib/graphics/particles/particle_system.cc
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/particles/particle_system.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/graphics/particles/particle_system.cc	(revision 4194)
@@ -0,0 +1,382 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute 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.
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer: ...
+*/
+
+#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_PARTICLE
+
+#include "particle_system.h"
+
+#include "particle_emitter.h"
+#include "particle_engine.h"
+#include "compiler.h"
+#include "material.h"
+
+using namespace std;
+
+/**
+   \brief standard constructor
+   \param count the Count of particles in the System
+   \param type The Type of the ParticleSystem
+
+   \todo this constructor is not jet implemented - do it
+*/
+ParticleSystem::ParticleSystem (unsigned int maxCount, PARTICLE_TYPE type)
+{
+   this->setClassName ("ParticleSystem");
+   this->material = NULL;
+   this->name = NULL;
+   this->maxCount = maxCount;
+   this->count = 0;
+   this->particles = NULL;
+   this->deadList = NULL;
+   this->setConserve(1);
+   this->setLifeSpan(1);
+   this->setInheritSpeed(0);
+   this->glID = NULL;
+   this->setRadius(1.0, 1.0, 0.0);
+   this->setType(type, 1);
+   ParticleEngine::getInstance()->addSystem(this);
+}
+
+
+/**
+   \brief standard deconstructor
+*/
+ParticleSystem::~ParticleSystem()
+{
+  // delete what has to be deleted here
+   ParticleEngine::getInstance()->removeSystem(this);
+
+   // deleting all the living Particles
+   while (this->particles)
+     {
+       Particle* tmpDelPart = this->particles;
+       this->particles = this->particles->next;
+       delete tmpDelPart;
+     }
+
+   // deleting all the dead particles
+   while (this->deadList)
+     {
+       Particle* tmpDelPart = this->deadList;
+       this->deadList = this->deadList->next;
+       delete tmpDelPart;
+     }
+
+   if (this->material)
+     delete this->material;
+}
+
+/**
+   \brief sets the Name of the Particle System
+   \param name the Name of the System
+*/
+void ParticleSystem::setName(const char* name)
+{
+  if (this->name)
+    delete this->name;
+  this->name = new char[strlen(name)+1];
+  strcpy(this->name, name);
+}
+
+/**
+   \returns the Name of the ParticleSystem
+*/
+const char* ParticleSystem::getName(void) const
+{
+  return this->name;
+}
+
+/**
+   \todo this will be different
+*/
+void ParticleSystem::setType(PARTICLE_TYPE particleType, int count)
+{
+  this->particleType = particleType;
+  this->dialectCount = count;
+  if (glID != NULL)
+    delete glID;
+
+  glID = new GLuint[count];
+  for (int i = 0; i< count; i++)
+    glID[i] = 0;
+
+  glID[0] = glGenLists(count);
+  
+  material = new Material("transperencyMap");
+  material->setDiffuseMap("pictures/radialTransparency.png");
+  //  material->setTransparency(.5);
+
+  glNewList(glID[0], GL_COMPILE);
+  glBegin(GL_TRIANGLE_STRIP);
+  glTexCoord2f(1, 1);
+  glVertex3f(0.0, .5, .5);
+  glTexCoord2f(1, 0);
+  glVertex3f(0.0, -.5, .5);
+  glTexCoord2f(0, 1);
+  glVertex3f(0.0, .5, -.5);
+  glTexCoord2f(0, 0);
+  glVertex3f(0.0, -.5, -.5);
+  glEnd();
+  glEndList();
+}
+
+// setting properties
+void ParticleSystem::setMaterial(Material* material)
+{
+  this->material = material;
+}
+
+
+
+/**
+   \brief how much of the speed from the ParticleEmitter should flow onto the ParticleSystem
+   \param value a Value between zero and one
+
+   
+   if you want to change the value of this variable during emission time (to make it more dynamic)
+   you may want to use the animation class
+*/
+void ParticleSystem::setInheritSpeed(float value)
+{
+  if (unlikely(value > 1.0))
+    this->inheritSpeed = 1;
+  else if (unlikely(value < 0.0))
+    this->inheritSpeed = 0;
+  else
+    this->inheritSpeed = value;
+}
+
+/**
+   \brief Sets the lifespan of newly created particles
+*/   
+void ParticleSystem::setLifeSpan(float lifeSpan, float randomLifeSpan)
+{
+  this->lifeSpan = lifeSpan;
+  this->randomLifeSpan = randomLifeSpan;
+}
+
+/**
+   \brief sets the radius of newly created particles
+*/
+void ParticleSystem::setRadius(float startRadius, float endRadius, float randomStartRadius, float randomEndRadius)
+{
+  this->startRadius = startRadius;
+  this->endRadius = endRadius;
+  this->randomStartRadius = randomStartRadius;
+  this->randomEndRadius = randomEndRadius;
+}
+
+/**
+   \brief sets the conserve Factor of newly created particles
+*/
+void ParticleSystem::setConserve(float conserve)
+{
+  if (conserve > 1.0)
+    this->conserve = 1.0;
+  else if (conserve < 0.0)
+    this->conserve = 0.0;
+  else
+    this->conserve = conserve;
+}
+
+/**
+   \brief ticks the system.
+   \param dt the time to tick all the Particles of the System
+
+   this is used to get all the particles some motion
+*/
+void ParticleSystem::tick(float dt)
+{
+  Particle* tickPart = particles;  // the particle to Tick
+  Particle* prevPart = NULL;       // 
+  while (likely(tickPart != NULL))
+    {
+      tickPart->position = tickPart->position + tickPart->velocity;
+      tickPart->radius += tickPart->radiusIt * dt;
+
+      // many more to come
+
+
+      if (this->conserve < 1.0)
+	tickPart->velocity = tickPart->velocity * this->conserve;
+      // find out if we have to delete tickPart
+      if ((tickPart->timeToLive -= dt) <= 0)
+	{
+	  // remove the particle from the list
+	  if (likely(prevPart != NULL))
+	    {
+	      prevPart->next = tickPart->next;
+	      tickPart->next = this->deadList;
+	      this->deadList = tickPart;
+	      tickPart = prevPart->next;
+	    }
+	  else
+	    {
+	      prevPart = NULL;
+	      this->particles = tickPart->next;
+	      tickPart->next = this->deadList;
+	      this->deadList = tickPart;
+	      tickPart = this->particles;
+	    }
+	  --this->count;
+	}
+      else
+	{      
+	  prevPart = tickPart;
+	  tickPart = tickPart->next;
+	}
+    }
+}
+
+/**
+   \brief draws all the Particles of this System
+   \param the time passed in seconds (since the last draw)
+*/
+void ParticleSystem::draw(float dt)
+{
+  glPushAttrib(GL_ENABLE_BIT);
+  //  material->select();
+  Particle* drawPart = particles;
+
+  switch (this->particleType)
+    {
+    case PARTICLE_SPRITE:
+      glMatrixMode(GL_MODELVIEW);
+      //  glDisable(GL_LIGHTING);
+      material->select(); 
+      glDisable(GL_DEPTH_TEST);
+      while (likely(drawPart != NULL))
+	{
+	  glPushMatrix();
+	  glTranslatef(drawPart->position.x, drawPart->position.y, drawPart->position.z);
+	  glScalef(drawPart->radius, drawPart->radius, drawPart->radius);
+	  glCallList(*this->glID);
+	  
+	  //glVertex3f(drawPart->position.x, drawPart->position.y, drawPart->position.z);
+	  drawPart = drawPart->next;
+	  glPopMatrix();
+	}
+      //      glEnd();
+      
+      //  glEnable(GL_LIGHTING);
+      
+      glEnable(GL_DEPTH_TEST);
+      break;
+    default:
+
+    case PARTICLE_SPARK:
+      glEnable(GL_LINE_SMOOTH);
+      glBegin(GL_LINES);
+      while (likely(drawPart != NULL))
+	{
+	  glVertex3f(drawPart->position.x, drawPart->position.y, drawPart->position.z);
+	  glVertex3f(drawPart->position.x - drawPart->velocity.x,
+		     drawPart->position.y - drawPart->velocity.y,
+		     drawPart->position.z - drawPart->velocity.z);
+	  drawPart = drawPart->next;
+	}
+      glEnd();
+      break;
+      
+    case PARTICLE_DOT:
+      glBegin(GL_POINTS);
+      while (likely(drawPart != NULL))
+	{
+	  glLineWidth(drawPart->radius);
+
+	  glVertex3f(drawPart->position.x, drawPart->position.y, drawPart->position.z);
+	  drawPart = drawPart->next;
+	}
+      glEnd();
+      break;
+    }
+  glPopAttrib();
+}
+
+/**
+   \brief adds a new Particle to the System
+   \param position the position where the particle gets emitted.
+   \param velocity the Starting velocity of the particle.
+   \param data some more data given by the emitter
+*/
+void ParticleSystem::addParticle(const Vector& position, const Vector& velocity, unsigned int data)
+{
+  if (this->count <= this->maxCount)
+    {
+      // if it is the first Particle
+      if (unlikely(particles == NULL))
+	{
+	  if (likely(deadList != NULL))
+	    {
+	      this->particles = this->deadList;
+	      deadList = deadList->next;
+	    }
+	  else
+	    {
+	      PRINTF(5)("Generating new Particle\n");
+	      this->particles = new Particle;
+	    }
+	  this->particles->next = NULL;
+	}
+      // filling the List from the beginning
+      else
+	{
+	  Particle* tmpPart;
+	  if (likely(deadList != NULL))
+	    {
+	      tmpPart = this->deadList;
+	      deadList = deadList->next;
+	    }
+	  else
+	    {
+	      PRINTF(5)("Generating new Particle\n");
+	      tmpPart = new Particle;
+	    }
+	  tmpPart->next = this->particles;
+	  this->particles = tmpPart;
+	}
+      
+      particles->timeToLive = this->lifeSpan + (float)(rand()/RAND_MAX)* this->randomLifeSpan;
+      particles->position = position;
+      particles->velocity = velocity;
+
+      //  particle->rotation = ; //! \todo rotation is once again something to be done.
+      particles->mass = this->initialMass + (rand()/RAND_MAX -.5)* this->randomInitialMass;
+      particles->radius = this->startRadius + (rand()/RAND_MAX-.5)*this->randomStartRadius;
+      
+      particles->radiusIt = (this->endRadius + (rand()/RAND_MAX-.5)*this->randomEndRadius - particles->radius) / particles->timeToLive;
+
+      ++this->count;
+    }
+  else
+    PRINTF(5)("maximum count of particles reached not adding any more\n");
+}
+
+/**
+   \brief outputs some nice debug information
+*/
+void ParticleSystem::debug(void)
+{
+  PRINT(0)("  ParticleSystem %s\n", this->name);
+  PRINT(0)("  ParticleCount: %d, maximumCount: %d :: filled %d%%\n", this->count, this->maxCount, 100*this->count/this->maxCount);
+  if (deadList)
+    {
+      PRINT(0)("  - ParticleDeadList is used: ");
+      int i = 1;
+      Particle* tmpPart = this->deadList;
+      while (tmpPart = tmpPart->next) ++i;
+      PRINT(0)("count: %d\n", i);
+    }
+}
Index: orxonox/branches/openAL/src/lib/graphics/particles/particle_system.h
===================================================================
--- orxonox/branches/openAL/src/lib/graphics/particles/particle_system.h	(revision 4194)
+++ orxonox/branches/openAL/src/lib/graphics/particles/particle_system.h	(revision 4194)
@@ -0,0 +1,105 @@
+/*! 
+    \file particle_system.h
+
+*/
+
+#ifndef _PARTICLE_SYSTEM_H
+#define _PARTICLE_SYSTEM_H
+
+#include "base_object.h"
+#include "vector.h"
+
+#define PARTICLE_DOT_MASK           0x000001
+#define PARTICLE_SPARK_MASK         0x000010
+#define PARTICLE_SPRITE_MASK        0x000100
+#define PARTICLE_MODEL_MASK         0x001000
+#define PARTICLE_WORDL_ENTITY_MASK  0x010000
+#define PARTICLE_MULTI_MASK         0x100000
+
+//! An enumerator for the different types of particles.
+typedef enum PARTICLE_TYPE {PARTICLE_DOT = PARTICLE_DOT_MASK,
+			    PARTICLE_SPARK = PARTICLE_SPARK_MASK,
+			    PARTICLE_SPRITE = PARTICLE_SPRITE_MASK,
+			    PARTICLE_MULTI_SPRITE = PARTICLE_SPRITE_MASK | PARTICLE_MULTI_MASK,
+			    PARTICLE_MODEL = PARTICLE_MODEL_MASK,
+			    PARTICLE_MULTI_MODE = PARTICLE_MODEL_MASK | PARTICLE_MULTI_MASK};
+
+#define PARTICLE_DEFAULT_MAX_COUNT    200               //!< a default count of particles in the system.
+#define PARTICLE_DEFAULT_TYPE         PARTICLE_SPRITE   //!< A default type of the system.
+
+// FORWARD DEFINITION
+class Material;
+class ParticleEmitter;
+
+
+//! A struct for one Particle
+typedef struct Particle
+{
+  float timeToLive;           //!< The time this particle lives from NOW on.
+  Vector position;            //!< The current position of this particle.
+  Vector velocity;            //!< The current velocity of this particle.
+  Quaternion rotation;        //!< The current rotation of this particle.
+  float mass;                 //!< The mass of this particle.
+  float radius;               //!< The current size of this particle.
+  float radiusIt;             //!< The difference of the Size per second.
+
+  PARTICLE_TYPE type;
+
+  Particle* next;             //!< pointer to the next particle in the List. (NULL if no preceding one)
+};
+
+//! A class to handle particle Systems
+class ParticleSystem : public BaseObject {
+  friend class ParticleEmitter;
+
+ public:
+  ParticleSystem(unsigned int maxCount = PARTICLE_DEFAULT_MAX_COUNT,
+		 PARTICLE_TYPE type = PARTICLE_DEFAULT_TYPE);
+  virtual ~ParticleSystem();
+  void setName(const char* name);
+  const char* getName(void) const;
+
+  void setType(PARTICLE_TYPE particleType, int count = 0);
+  void setMaterial(Material* material);
+  void setInheritSpeed(float value);
+  void setLifeSpan(float lifeSpan, float randomLifeSpan = 0.0);
+  void setRadius(float startRadius, float endRadius,
+		 float randomStartRadius = 0.0, float randomEndRadius = 0.0);
+  void setConserve(float conserve);
+  void setMass(float mass, float randomMass);
+
+  void tick(float dt);
+  void draw(float dt);
+
+  void debug(void);
+
+ private:
+  char* name;                // the Name of the Particle System
+
+  float conserve;            //!< How much energy gets conserved to the next Tick.
+  float lifeSpan;            //!< Initial lifetime of a Particle.
+  float randomLifeSpan;
+  float startRadius;
+  float endRadius;
+  float randomStartRadius;
+  float randomEndRadius;
+  float initialMass;
+  float randomInitialMass;
+  float inheritSpeed;
+
+  // particles
+  int maxCount;              //!< The maximum count of Particles.
+  int count;                 //!< The current count of Particles.
+  PARTICLE_TYPE particleType;//!< A type for all the Particles
+  Material* material;        //!< A Material for all the Particles.
+  Particle* particles;       //!< A list of particles of this System.
+  Particle* deadList;        //!< A list of dead Particles in the System.
+
+  GLuint* glID;              //!< A List of different gl-List-ID's
+  GLuint dialectCount;       //!< How many different types of particles are there in the Particle System
+
+  void addParticle(const Vector& position, const Vector& velocity, unsigned int data = 0);
+  
+};
+
+#endif /* _PARTICLE_SYSTEM_H */
Index: orxonox/branches/openAL/src/lib/gui/Makefile.in
===================================================================
--- orxonox/branches/openAL/src/lib/gui/Makefile.in	(revision 3921)
+++ orxonox/branches/openAL/src/lib/gui/Makefile.in	(revision 4194)
@@ -89,12 +89,8 @@
 EXEEXT = @EXEEXT@
 GPROF = @GPROF@
-GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
-GTHREAD_LIBS = @GTHREAD_LIBS@
 GTK2_CFLAGS = @GTK2_CFLAGS@
 GTK2_LIBS = @GTK2_LIBS@
 HAVE_CURL_FALSE = @HAVE_CURL_FALSE@
 HAVE_CURL_TRUE = @HAVE_CURL_TRUE@
-HAVE_GTHREAD_FALSE = @HAVE_GTHREAD_FALSE@
-HAVE_GTHREAD_TRUE = @HAVE_GTHREAD_TRUE@
 HAVE_GTK2_FALSE = @HAVE_GTK2_FALSE@
 HAVE_GTK2_TRUE = @HAVE_GTK2_TRUE@
@@ -117,4 +113,6 @@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -125,4 +123,5 @@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
Index: orxonox/branches/openAL/src/lib/gui/console/Makefile.in
===================================================================
--- orxonox/branches/openAL/src/lib/gui/console/Makefile.in	(revision 3921)
+++ orxonox/branches/openAL/src/lib/gui/console/Makefile.in	(revision 4194)
@@ -107,12 +107,8 @@
 EXEEXT = @EXEEXT@
 GPROF = @GPROF@
-GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
-GTHREAD_LIBS = @GTHREAD_LIBS@
 GTK2_CFLAGS = @GTK2_CFLAGS@
 GTK2_LIBS = @GTK2_LIBS@
 HAVE_CURL_FALSE = @HAVE_CURL_FALSE@
 HAVE_CURL_TRUE = @HAVE_CURL_TRUE@
-HAVE_GTHREAD_FALSE = @HAVE_GTHREAD_FALSE@
-HAVE_GTHREAD_TRUE = @HAVE_GTHREAD_TRUE@
 HAVE_GTK2_FALSE = @HAVE_GTK2_FALSE@
 HAVE_GTK2_TRUE = @HAVE_GTK2_TRUE@
@@ -136,4 +132,6 @@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -144,4 +142,5 @@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
Index: orxonox/branches/openAL/src/lib/gui/gui/Makefile.am
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/Makefile.am	(revision 3921)
+++ orxonox/branches/openAL/src/lib/gui/gui/Makefile.am	(revision 4194)
@@ -7,6 +7,5 @@
 AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/coord
 AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/data
-AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/gaphics
-AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/graphics/font
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/graphics
 AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/graphics/importer
 AM_CXXFLAGS+=-I$(MAINSRCDIR)/lib/gui
@@ -19,4 +18,7 @@
 AM_CXXFLAGS+=-I$(MAINSRCDIR)/glmenu
 AM_CXXFLAGS+=-I$(MAINSRCDIR)/ai
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/util
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/util/animation
+AM_CXXFLAGS+=-I$(MAINSRCDIR)/util/common
 
 #AM_LDFLAGS=$(GTK2_LIBS)   $(GTHREAD_LIBS)
@@ -24,23 +26,39 @@
 
 bin_PROGRAMS=gui
-gui_SOURCES=orxonox_gui.cc \
-	    orxonox_gui_gtk.cc \
-	    orxonox_gui_video.cc \
-	    orxonox_gui_audio.cc \
-	    orxonox_gui_exec.cc \
-	    orxonox_gui_flags.cc \
-	    orxonox_gui_banner.cc \
-	    orxonox_gui_keys.cc \
-	    orxonox_gui_update.cc
+gui_SOURCES=gui_main.cc \
+	    gui.cc \
+	    gui_gtk.cc \
+	    gui_element.cc \
+	    gui_video.cc \
+	    gui_audio.cc \
+	    gui_exec.cc \
+	    gui_flags.cc \
+	    gui_banner.cc \
+	    gui_keys.cc \
+	    gui_update.cc \
+		  $(MAINSRCDIR)/lib/graphics/graphics_engine.cc \
+		  $(MAINSRCDIR)/lib/lang/base_object.cc \
+		  $(MAINSRCDIR)/lib/math/vector.cc \
+		  $(MAINSRCDIR)/util/resource_manager.cc \
+		  $(MAINSRCDIR)/lib/graphics/text_engine.cc \
+		  $(MAINSRCDIR)/lib/coord/p_node.cc \
+		  $(MAINSRCDIR)/lib/coord/null_parent.cc \
+		  $(MAINSRCDIR)/lib/graphics/importer/array.cc \
+		  $(MAINSRCDIR)/lib/graphics/importer/model.cc \
+		  $(MAINSRCDIR)/lib/graphics/importer/objModel.cc \
+		  $(MAINSRCDIR)/lib/graphics/importer/material.cc \
+		  $(MAINSRCDIR)/lib/graphics/importer/texture.cc \
+		  $(MAINSRCDIR)/lib/graphics/importer/primitive_model.cc 
 
-noinst_HEADERS=orxonox_gui.h \
-	    orxonox_gui_gtk.h \
-	    orxonox_gui_video.h \
-	    orxonox_gui_audio.h \
-	    orxonox_gui_exec.h \
-	    orxonox_gui_flags.h \
-	    orxonox_gui_banner.h \
-	    orxonox_gui_keys.h \
-	    orxonox_gui_update.h
+noinst_HEADERS=gui.h \
+	    gui_gtk.h \
+	    gui_element.h \
+	    gui_video.h \
+	    gui_audio.h \
+	    gui_exec.h \
+	    gui_flags.h \
+	    gui_banner.h \
+	    gui_keys.h \
+	    gui_update.h
 
 #  uncomment the following if orxonox requires the mathlibrary
Index: orxonox/branches/openAL/src/lib/gui/gui/Makefile.in
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/Makefile.in	(revision 3921)
+++ orxonox/branches/openAL/src/lib/gui/gui/Makefile.in	(revision 4194)
@@ -53,9 +53,13 @@
 binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
 PROGRAMS = $(bin_PROGRAMS)
-am_gui_OBJECTS = orxonox_gui.$(OBJEXT) orxonox_gui_gtk.$(OBJEXT) \
-	orxonox_gui_video.$(OBJEXT) orxonox_gui_audio.$(OBJEXT) \
-	orxonox_gui_exec.$(OBJEXT) orxonox_gui_flags.$(OBJEXT) \
-	orxonox_gui_banner.$(OBJEXT) orxonox_gui_keys.$(OBJEXT) \
-	orxonox_gui_update.$(OBJEXT)
+am_gui_OBJECTS = gui_main.$(OBJEXT) gui.$(OBJEXT) gui_gtk.$(OBJEXT) \
+	gui_element.$(OBJEXT) gui_video.$(OBJEXT) gui_audio.$(OBJEXT) \
+	gui_exec.$(OBJEXT) gui_flags.$(OBJEXT) gui_banner.$(OBJEXT) \
+	gui_keys.$(OBJEXT) gui_update.$(OBJEXT) \
+	graphics_engine.$(OBJEXT) base_object.$(OBJEXT) \
+	vector.$(OBJEXT) resource_manager.$(OBJEXT) \
+	text_engine.$(OBJEXT) p_node.$(OBJEXT) null_parent.$(OBJEXT) \
+	array.$(OBJEXT) model.$(OBJEXT) objModel.$(OBJEXT) \
+	material.$(OBJEXT) texture.$(OBJEXT) primitive_model.$(OBJEXT)
 gui_OBJECTS = $(am_gui_OBJECTS)
 gui_LDADD = $(LDADD)
@@ -63,13 +67,19 @@
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
-@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/orxonox_gui.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/orxonox_gui_audio.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/orxonox_gui_banner.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/orxonox_gui_exec.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/orxonox_gui_flags.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/orxonox_gui_gtk.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/orxonox_gui_keys.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/orxonox_gui_update.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/orxonox_gui_video.Po
+@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/array.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/base_object.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/graphics_engine.Po ./$(DEPDIR)/gui.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/gui_audio.Po ./$(DEPDIR)/gui_banner.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/gui_element.Po ./$(DEPDIR)/gui_exec.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/gui_flags.Po ./$(DEPDIR)/gui_gtk.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/gui_keys.Po ./$(DEPDIR)/gui_main.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/gui_update.Po ./$(DEPDIR)/gui_video.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/material.Po ./$(DEPDIR)/model.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/null_parent.Po ./$(DEPDIR)/objModel.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/p_node.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/primitive_model.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/resource_manager.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/text_engine.Po ./$(DEPDIR)/texture.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/vector.Po
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
@@ -116,12 +126,8 @@
 EXEEXT = @EXEEXT@
 GPROF = @GPROF@
-GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
-GTHREAD_LIBS = @GTHREAD_LIBS@
 GTK2_CFLAGS = @GTK2_CFLAGS@
 GTK2_LIBS = @GTK2_LIBS@
 HAVE_CURL_FALSE = @HAVE_CURL_FALSE@
 HAVE_CURL_TRUE = @HAVE_CURL_TRUE@
-HAVE_GTHREAD_FALSE = @HAVE_GTHREAD_FALSE@
-HAVE_GTHREAD_TRUE = @HAVE_GTHREAD_TRUE@
 HAVE_GTK2_FALSE = @HAVE_GTK2_FALSE@
 HAVE_GTK2_TRUE = @HAVE_GTK2_TRUE@
@@ -144,4 +150,6 @@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -152,4 +160,5 @@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
@@ -193,27 +202,43 @@
 target_vendor = @target_vendor@
 MAINSRCDIR = ../../..
-AM_CXXFLAGS = $(GTK2_CFLAGS) $(GTHREAD_CFLAGS) $(CURL_CFLAGS) $(MSBITFIELDS) -I$(MAINSRCDIR) -I$(MAINSRCDIR)/world_entities -I$(MAINSRCDIR)/story_entities -I$(MAINSRCDIR)/lib -I$(MAINSRCDIR)/lib/coord -I$(MAINSRCDIR)/lib/data -I$(MAINSRCDIR)/lib/gaphics -I$(MAINSRCDIR)/lib/graphics/font -I$(MAINSRCDIR)/lib/graphics/importer -I$(MAINSRCDIR)/lib/gui -I$(MAINSRCDIR)/lib/lang -I$(MAINSRCDIR)/lib/util -I$(MAINSRCDIR)/lib/math -I$(MAINSRCDIR)/defs -I$(MAINSRCDIR)/font -I$(MAINSRCDIR)/network -I$(MAINSRCDIR)/glmenu -I$(MAINSRCDIR)/ai
+AM_CXXFLAGS = $(GTK2_CFLAGS) $(GTHREAD_CFLAGS) $(CURL_CFLAGS) $(MSBITFIELDS) -I$(MAINSRCDIR) -I$(MAINSRCDIR)/world_entities -I$(MAINSRCDIR)/story_entities -I$(MAINSRCDIR)/lib -I$(MAINSRCDIR)/lib/coord -I$(MAINSRCDIR)/lib/data -I$(MAINSRCDIR)/lib/graphics -I$(MAINSRCDIR)/lib/graphics/importer -I$(MAINSRCDIR)/lib/gui -I$(MAINSRCDIR)/lib/lang -I$(MAINSRCDIR)/lib/util -I$(MAINSRCDIR)/lib/math -I$(MAINSRCDIR)/defs -I$(MAINSRCDIR)/font -I$(MAINSRCDIR)/network -I$(MAINSRCDIR)/glmenu -I$(MAINSRCDIR)/ai -I$(MAINSRCDIR)/util -I$(MAINSRCDIR)/util/animation -I$(MAINSRCDIR)/util/common
 
 #AM_LDFLAGS=$(GTK2_LIBS)   $(GTHREAD_LIBS)
 AM_LDFLAGS = $(GTK2_LIBS) $(GTHREAD_LIBS) $(CURL_LIBS)
-gui_SOURCES = orxonox_gui.cc \
-	    orxonox_gui_gtk.cc \
-	    orxonox_gui_video.cc \
-	    orxonox_gui_audio.cc \
-	    orxonox_gui_exec.cc \
-	    orxonox_gui_flags.cc \
-	    orxonox_gui_banner.cc \
-	    orxonox_gui_keys.cc \
-	    orxonox_gui_update.cc
-
-noinst_HEADERS = orxonox_gui.h \
-	    orxonox_gui_gtk.h \
-	    orxonox_gui_video.h \
-	    orxonox_gui_audio.h \
-	    orxonox_gui_exec.h \
-	    orxonox_gui_flags.h \
-	    orxonox_gui_banner.h \
-	    orxonox_gui_keys.h \
-	    orxonox_gui_update.h
+gui_SOURCES = gui_main.cc \
+	    gui.cc \
+	    gui_gtk.cc \
+	    gui_element.cc \
+	    gui_video.cc \
+	    gui_audio.cc \
+	    gui_exec.cc \
+	    gui_flags.cc \
+	    gui_banner.cc \
+	    gui_keys.cc \
+	    gui_update.cc \
+		  $(MAINSRCDIR)/lib/graphics/graphics_engine.cc \
+		  $(MAINSRCDIR)/lib/lang/base_object.cc \
+		  $(MAINSRCDIR)/lib/math/vector.cc \
+		  $(MAINSRCDIR)/util/resource_manager.cc \
+		  $(MAINSRCDIR)/lib/graphics/text_engine.cc \
+		  $(MAINSRCDIR)/lib/coord/p_node.cc \
+		  $(MAINSRCDIR)/lib/coord/null_parent.cc \
+		  $(MAINSRCDIR)/lib/graphics/importer/array.cc \
+		  $(MAINSRCDIR)/lib/graphics/importer/model.cc \
+		  $(MAINSRCDIR)/lib/graphics/importer/objModel.cc \
+		  $(MAINSRCDIR)/lib/graphics/importer/material.cc \
+		  $(MAINSRCDIR)/lib/graphics/importer/texture.cc \
+		  $(MAINSRCDIR)/lib/graphics/importer/primitive_model.cc 
+
+noinst_HEADERS = gui.h \
+	    gui_gtk.h \
+	    gui_element.h \
+	    gui_video.h \
+	    gui_audio.h \
+	    gui_exec.h \
+	    gui_flags.h \
+	    gui_banner.h \
+	    gui_keys.h \
+	    gui_update.h
 
 
@@ -293,13 +318,28 @@
 	-rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_gui.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_gui_audio.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_gui_banner.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_gui_exec.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_gui_flags.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_gui_gtk.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_gui_keys.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_gui_update.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orxonox_gui_video.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/array.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base_object.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphics_engine.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_audio.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_banner.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_element.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_exec.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_flags.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_gtk.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_keys.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_update.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_video.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/material.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/model.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/null_parent.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/objModel.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/p_node.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/primitive_model.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resource_manager.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/text_engine.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/texture.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector.Po@am__quote@
 
 .cc.o:
@@ -318,4 +358,212 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+graphics_engine.o: $(MAINSRCDIR)/lib/graphics/graphics_engine.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT graphics_engine.o -MD -MP -MF "$(DEPDIR)/graphics_engine.Tpo" -c -o graphics_engine.o `test -f '$(MAINSRCDIR)/lib/graphics/graphics_engine.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/graphics/graphics_engine.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/graphics_engine.Tpo" "$(DEPDIR)/graphics_engine.Po"; else rm -f "$(DEPDIR)/graphics_engine.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/graphics/graphics_engine.cc' object='graphics_engine.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/graphics_engine.Po' tmpdepfile='$(DEPDIR)/graphics_engine.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o graphics_engine.o `test -f '$(MAINSRCDIR)/lib/graphics/graphics_engine.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/graphics/graphics_engine.cc
+
+graphics_engine.obj: $(MAINSRCDIR)/lib/graphics/graphics_engine.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT graphics_engine.obj -MD -MP -MF "$(DEPDIR)/graphics_engine.Tpo" -c -o graphics_engine.obj `if test -f '$(MAINSRCDIR)/lib/graphics/graphics_engine.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/graphics/graphics_engine.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/graphics/graphics_engine.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/graphics_engine.Tpo" "$(DEPDIR)/graphics_engine.Po"; else rm -f "$(DEPDIR)/graphics_engine.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/graphics/graphics_engine.cc' object='graphics_engine.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/graphics_engine.Po' tmpdepfile='$(DEPDIR)/graphics_engine.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o graphics_engine.obj `if test -f '$(MAINSRCDIR)/lib/graphics/graphics_engine.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/graphics/graphics_engine.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/graphics/graphics_engine.cc'; fi`
+
+base_object.o: $(MAINSRCDIR)/lib/lang/base_object.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT base_object.o -MD -MP -MF "$(DEPDIR)/base_object.Tpo" -c -o base_object.o `test -f '$(MAINSRCDIR)/lib/lang/base_object.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/lang/base_object.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/base_object.Tpo" "$(DEPDIR)/base_object.Po"; else rm -f "$(DEPDIR)/base_object.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/lang/base_object.cc' object='base_object.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/base_object.Po' tmpdepfile='$(DEPDIR)/base_object.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o base_object.o `test -f '$(MAINSRCDIR)/lib/lang/base_object.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/lang/base_object.cc
+
+base_object.obj: $(MAINSRCDIR)/lib/lang/base_object.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT base_object.obj -MD -MP -MF "$(DEPDIR)/base_object.Tpo" -c -o base_object.obj `if test -f '$(MAINSRCDIR)/lib/lang/base_object.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/lang/base_object.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/lang/base_object.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/base_object.Tpo" "$(DEPDIR)/base_object.Po"; else rm -f "$(DEPDIR)/base_object.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/lang/base_object.cc' object='base_object.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/base_object.Po' tmpdepfile='$(DEPDIR)/base_object.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o base_object.obj `if test -f '$(MAINSRCDIR)/lib/lang/base_object.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/lang/base_object.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/lang/base_object.cc'; fi`
+
+vector.o: $(MAINSRCDIR)/lib/math/vector.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vector.o -MD -MP -MF "$(DEPDIR)/vector.Tpo" -c -o vector.o `test -f '$(MAINSRCDIR)/lib/math/vector.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/math/vector.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/vector.Tpo" "$(DEPDIR)/vector.Po"; else rm -f "$(DEPDIR)/vector.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/math/vector.cc' object='vector.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/vector.Po' tmpdepfile='$(DEPDIR)/vector.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o vector.o `test -f '$(MAINSRCDIR)/lib/math/vector.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/math/vector.cc
+
+vector.obj: $(MAINSRCDIR)/lib/math/vector.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT vector.obj -MD -MP -MF "$(DEPDIR)/vector.Tpo" -c -o vector.obj `if test -f '$(MAINSRCDIR)/lib/math/vector.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/math/vector.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/math/vector.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/vector.Tpo" "$(DEPDIR)/vector.Po"; else rm -f "$(DEPDIR)/vector.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/math/vector.cc' object='vector.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/vector.Po' tmpdepfile='$(DEPDIR)/vector.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o vector.obj `if test -f '$(MAINSRCDIR)/lib/math/vector.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/math/vector.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/math/vector.cc'; fi`
+
+resource_manager.o: $(MAINSRCDIR)/util/resource_manager.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT resource_manager.o -MD -MP -MF "$(DEPDIR)/resource_manager.Tpo" -c -o resource_manager.o `test -f '$(MAINSRCDIR)/util/resource_manager.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/util/resource_manager.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/resource_manager.Tpo" "$(DEPDIR)/resource_manager.Po"; else rm -f "$(DEPDIR)/resource_manager.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/util/resource_manager.cc' object='resource_manager.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/resource_manager.Po' tmpdepfile='$(DEPDIR)/resource_manager.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o resource_manager.o `test -f '$(MAINSRCDIR)/util/resource_manager.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/util/resource_manager.cc
+
+resource_manager.obj: $(MAINSRCDIR)/util/resource_manager.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT resource_manager.obj -MD -MP -MF "$(DEPDIR)/resource_manager.Tpo" -c -o resource_manager.obj `if test -f '$(MAINSRCDIR)/util/resource_manager.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/util/resource_manager.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/util/resource_manager.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/resource_manager.Tpo" "$(DEPDIR)/resource_manager.Po"; else rm -f "$(DEPDIR)/resource_manager.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/util/resource_manager.cc' object='resource_manager.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/resource_manager.Po' tmpdepfile='$(DEPDIR)/resource_manager.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o resource_manager.obj `if test -f '$(MAINSRCDIR)/util/resource_manager.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/util/resource_manager.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/util/resource_manager.cc'; fi`
+
+text_engine.o: $(MAINSRCDIR)/lib/graphics/text_engine.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT text_engine.o -MD -MP -MF "$(DEPDIR)/text_engine.Tpo" -c -o text_engine.o `test -f '$(MAINSRCDIR)/lib/graphics/text_engine.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/graphics/text_engine.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/text_engine.Tpo" "$(DEPDIR)/text_engine.Po"; else rm -f "$(DEPDIR)/text_engine.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/graphics/text_engine.cc' object='text_engine.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/text_engine.Po' tmpdepfile='$(DEPDIR)/text_engine.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o text_engine.o `test -f '$(MAINSRCDIR)/lib/graphics/text_engine.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/graphics/text_engine.cc
+
+text_engine.obj: $(MAINSRCDIR)/lib/graphics/text_engine.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT text_engine.obj -MD -MP -MF "$(DEPDIR)/text_engine.Tpo" -c -o text_engine.obj `if test -f '$(MAINSRCDIR)/lib/graphics/text_engine.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/graphics/text_engine.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/graphics/text_engine.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/text_engine.Tpo" "$(DEPDIR)/text_engine.Po"; else rm -f "$(DEPDIR)/text_engine.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/graphics/text_engine.cc' object='text_engine.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/text_engine.Po' tmpdepfile='$(DEPDIR)/text_engine.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o text_engine.obj `if test -f '$(MAINSRCDIR)/lib/graphics/text_engine.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/graphics/text_engine.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/graphics/text_engine.cc'; fi`
+
+p_node.o: $(MAINSRCDIR)/lib/coord/p_node.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT p_node.o -MD -MP -MF "$(DEPDIR)/p_node.Tpo" -c -o p_node.o `test -f '$(MAINSRCDIR)/lib/coord/p_node.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/coord/p_node.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/p_node.Tpo" "$(DEPDIR)/p_node.Po"; else rm -f "$(DEPDIR)/p_node.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/coord/p_node.cc' object='p_node.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/p_node.Po' tmpdepfile='$(DEPDIR)/p_node.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o p_node.o `test -f '$(MAINSRCDIR)/lib/coord/p_node.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/coord/p_node.cc
+
+p_node.obj: $(MAINSRCDIR)/lib/coord/p_node.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT p_node.obj -MD -MP -MF "$(DEPDIR)/p_node.Tpo" -c -o p_node.obj `if test -f '$(MAINSRCDIR)/lib/coord/p_node.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/coord/p_node.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/coord/p_node.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/p_node.Tpo" "$(DEPDIR)/p_node.Po"; else rm -f "$(DEPDIR)/p_node.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/coord/p_node.cc' object='p_node.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/p_node.Po' tmpdepfile='$(DEPDIR)/p_node.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o p_node.obj `if test -f '$(MAINSRCDIR)/lib/coord/p_node.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/coord/p_node.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/coord/p_node.cc'; fi`
+
+null_parent.o: $(MAINSRCDIR)/lib/coord/null_parent.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT null_parent.o -MD -MP -MF "$(DEPDIR)/null_parent.Tpo" -c -o null_parent.o `test -f '$(MAINSRCDIR)/lib/coord/null_parent.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/coord/null_parent.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/null_parent.Tpo" "$(DEPDIR)/null_parent.Po"; else rm -f "$(DEPDIR)/null_parent.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/coord/null_parent.cc' object='null_parent.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/null_parent.Po' tmpdepfile='$(DEPDIR)/null_parent.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o null_parent.o `test -f '$(MAINSRCDIR)/lib/coord/null_parent.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/coord/null_parent.cc
+
+null_parent.obj: $(MAINSRCDIR)/lib/coord/null_parent.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT null_parent.obj -MD -MP -MF "$(DEPDIR)/null_parent.Tpo" -c -o null_parent.obj `if test -f '$(MAINSRCDIR)/lib/coord/null_parent.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/coord/null_parent.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/coord/null_parent.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/null_parent.Tpo" "$(DEPDIR)/null_parent.Po"; else rm -f "$(DEPDIR)/null_parent.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/coord/null_parent.cc' object='null_parent.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/null_parent.Po' tmpdepfile='$(DEPDIR)/null_parent.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o null_parent.obj `if test -f '$(MAINSRCDIR)/lib/coord/null_parent.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/coord/null_parent.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/coord/null_parent.cc'; fi`
+
+array.o: $(MAINSRCDIR)/lib/graphics/importer/array.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT array.o -MD -MP -MF "$(DEPDIR)/array.Tpo" -c -o array.o `test -f '$(MAINSRCDIR)/lib/graphics/importer/array.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/graphics/importer/array.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/array.Tpo" "$(DEPDIR)/array.Po"; else rm -f "$(DEPDIR)/array.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/graphics/importer/array.cc' object='array.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/array.Po' tmpdepfile='$(DEPDIR)/array.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o array.o `test -f '$(MAINSRCDIR)/lib/graphics/importer/array.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/graphics/importer/array.cc
+
+array.obj: $(MAINSRCDIR)/lib/graphics/importer/array.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT array.obj -MD -MP -MF "$(DEPDIR)/array.Tpo" -c -o array.obj `if test -f '$(MAINSRCDIR)/lib/graphics/importer/array.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/graphics/importer/array.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/graphics/importer/array.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/array.Tpo" "$(DEPDIR)/array.Po"; else rm -f "$(DEPDIR)/array.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/graphics/importer/array.cc' object='array.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/array.Po' tmpdepfile='$(DEPDIR)/array.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o array.obj `if test -f '$(MAINSRCDIR)/lib/graphics/importer/array.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/graphics/importer/array.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/graphics/importer/array.cc'; fi`
+
+model.o: $(MAINSRCDIR)/lib/graphics/importer/model.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT model.o -MD -MP -MF "$(DEPDIR)/model.Tpo" -c -o model.o `test -f '$(MAINSRCDIR)/lib/graphics/importer/model.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/graphics/importer/model.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/model.Tpo" "$(DEPDIR)/model.Po"; else rm -f "$(DEPDIR)/model.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/graphics/importer/model.cc' object='model.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/model.Po' tmpdepfile='$(DEPDIR)/model.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o model.o `test -f '$(MAINSRCDIR)/lib/graphics/importer/model.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/graphics/importer/model.cc
+
+model.obj: $(MAINSRCDIR)/lib/graphics/importer/model.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT model.obj -MD -MP -MF "$(DEPDIR)/model.Tpo" -c -o model.obj `if test -f '$(MAINSRCDIR)/lib/graphics/importer/model.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/graphics/importer/model.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/graphics/importer/model.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/model.Tpo" "$(DEPDIR)/model.Po"; else rm -f "$(DEPDIR)/model.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/graphics/importer/model.cc' object='model.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/model.Po' tmpdepfile='$(DEPDIR)/model.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o model.obj `if test -f '$(MAINSRCDIR)/lib/graphics/importer/model.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/graphics/importer/model.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/graphics/importer/model.cc'; fi`
+
+objModel.o: $(MAINSRCDIR)/lib/graphics/importer/objModel.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT objModel.o -MD -MP -MF "$(DEPDIR)/objModel.Tpo" -c -o objModel.o `test -f '$(MAINSRCDIR)/lib/graphics/importer/objModel.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/graphics/importer/objModel.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/objModel.Tpo" "$(DEPDIR)/objModel.Po"; else rm -f "$(DEPDIR)/objModel.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/graphics/importer/objModel.cc' object='objModel.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/objModel.Po' tmpdepfile='$(DEPDIR)/objModel.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o objModel.o `test -f '$(MAINSRCDIR)/lib/graphics/importer/objModel.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/graphics/importer/objModel.cc
+
+objModel.obj: $(MAINSRCDIR)/lib/graphics/importer/objModel.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT objModel.obj -MD -MP -MF "$(DEPDIR)/objModel.Tpo" -c -o objModel.obj `if test -f '$(MAINSRCDIR)/lib/graphics/importer/objModel.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/graphics/importer/objModel.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/graphics/importer/objModel.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/objModel.Tpo" "$(DEPDIR)/objModel.Po"; else rm -f "$(DEPDIR)/objModel.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/graphics/importer/objModel.cc' object='objModel.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/objModel.Po' tmpdepfile='$(DEPDIR)/objModel.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o objModel.obj `if test -f '$(MAINSRCDIR)/lib/graphics/importer/objModel.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/graphics/importer/objModel.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/graphics/importer/objModel.cc'; fi`
+
+material.o: $(MAINSRCDIR)/lib/graphics/importer/material.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT material.o -MD -MP -MF "$(DEPDIR)/material.Tpo" -c -o material.o `test -f '$(MAINSRCDIR)/lib/graphics/importer/material.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/graphics/importer/material.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/material.Tpo" "$(DEPDIR)/material.Po"; else rm -f "$(DEPDIR)/material.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/graphics/importer/material.cc' object='material.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/material.Po' tmpdepfile='$(DEPDIR)/material.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o material.o `test -f '$(MAINSRCDIR)/lib/graphics/importer/material.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/graphics/importer/material.cc
+
+material.obj: $(MAINSRCDIR)/lib/graphics/importer/material.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT material.obj -MD -MP -MF "$(DEPDIR)/material.Tpo" -c -o material.obj `if test -f '$(MAINSRCDIR)/lib/graphics/importer/material.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/graphics/importer/material.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/graphics/importer/material.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/material.Tpo" "$(DEPDIR)/material.Po"; else rm -f "$(DEPDIR)/material.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/graphics/importer/material.cc' object='material.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/material.Po' tmpdepfile='$(DEPDIR)/material.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o material.obj `if test -f '$(MAINSRCDIR)/lib/graphics/importer/material.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/graphics/importer/material.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/graphics/importer/material.cc'; fi`
+
+texture.o: $(MAINSRCDIR)/lib/graphics/importer/texture.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT texture.o -MD -MP -MF "$(DEPDIR)/texture.Tpo" -c -o texture.o `test -f '$(MAINSRCDIR)/lib/graphics/importer/texture.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/graphics/importer/texture.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/texture.Tpo" "$(DEPDIR)/texture.Po"; else rm -f "$(DEPDIR)/texture.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/graphics/importer/texture.cc' object='texture.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/texture.Po' tmpdepfile='$(DEPDIR)/texture.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o texture.o `test -f '$(MAINSRCDIR)/lib/graphics/importer/texture.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/graphics/importer/texture.cc
+
+texture.obj: $(MAINSRCDIR)/lib/graphics/importer/texture.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT texture.obj -MD -MP -MF "$(DEPDIR)/texture.Tpo" -c -o texture.obj `if test -f '$(MAINSRCDIR)/lib/graphics/importer/texture.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/graphics/importer/texture.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/graphics/importer/texture.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/texture.Tpo" "$(DEPDIR)/texture.Po"; else rm -f "$(DEPDIR)/texture.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/graphics/importer/texture.cc' object='texture.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/texture.Po' tmpdepfile='$(DEPDIR)/texture.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o texture.obj `if test -f '$(MAINSRCDIR)/lib/graphics/importer/texture.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/graphics/importer/texture.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/graphics/importer/texture.cc'; fi`
+
+primitive_model.o: $(MAINSRCDIR)/lib/graphics/importer/primitive_model.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT primitive_model.o -MD -MP -MF "$(DEPDIR)/primitive_model.Tpo" -c -o primitive_model.o `test -f '$(MAINSRCDIR)/lib/graphics/importer/primitive_model.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/graphics/importer/primitive_model.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/primitive_model.Tpo" "$(DEPDIR)/primitive_model.Po"; else rm -f "$(DEPDIR)/primitive_model.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/graphics/importer/primitive_model.cc' object='primitive_model.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/primitive_model.Po' tmpdepfile='$(DEPDIR)/primitive_model.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o primitive_model.o `test -f '$(MAINSRCDIR)/lib/graphics/importer/primitive_model.cc' || echo '$(srcdir)/'`$(MAINSRCDIR)/lib/graphics/importer/primitive_model.cc
+
+primitive_model.obj: $(MAINSRCDIR)/lib/graphics/importer/primitive_model.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT primitive_model.obj -MD -MP -MF "$(DEPDIR)/primitive_model.Tpo" -c -o primitive_model.obj `if test -f '$(MAINSRCDIR)/lib/graphics/importer/primitive_model.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/graphics/importer/primitive_model.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/graphics/importer/primitive_model.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/primitive_model.Tpo" "$(DEPDIR)/primitive_model.Po"; else rm -f "$(DEPDIR)/primitive_model.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(MAINSRCDIR)/lib/graphics/importer/primitive_model.cc' object='primitive_model.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/primitive_model.Po' tmpdepfile='$(DEPDIR)/primitive_model.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o primitive_model.obj `if test -f '$(MAINSRCDIR)/lib/graphics/importer/primitive_model.cc'; then $(CYGPATH_W) '$(MAINSRCDIR)/lib/graphics/importer/primitive_model.cc'; else $(CYGPATH_W) '$(srcdir)/$(MAINSRCDIR)/lib/graphics/importer/primitive_model.cc'; fi`
 uninstall-info-am:
 
Index: orxonox/branches/openAL/src/lib/gui/gui/gui.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui.cc	(revision 4194)
@@ -0,0 +1,156 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+#include <unistd.h>
+
+#include "gui_gtk.h"
+#include "gui.h"
+#include "gui_video.h"
+#include "gui_audio.h"
+#include "gui_exec.h"
+#include "gui_flags.h"
+#include "gui_banner.h"
+#include "gui_keys.h"
+#include "gui_update.h"
+
+// GUI-modules
+GuiFlags* flags   = NULL;
+GuiVideo* video   = NULL;
+GuiAudio* audio   = NULL;
+GuiExec* exec     = NULL;
+GuiBanner* banner = NULL;
+GuiKeys* keys     = NULL;
+GuiUpdate* update = NULL;
+
+/* ORXONOXGUI */
+
+/**
+   \brief Initializes the Gui
+*/
+Gui::Gui(int argc, char *argv[])
+{
+  Window* orxonoxGUI = NULL;
+  executable = NULL;
+  
+  initGUI(argc, argv);
+
+  orxonoxGUI = new Window( "grafical " PACKAGE_NAME " loader, "PACKAGE_VERSION);
+  {
+    Box* windowBox = new Box ('h');
+    {
+      banner = new GuiBanner();
+      windowBox->fill (banner->getWidget());
+      
+      Box* optionBoxL = new Box('v');
+      {
+	Box* avBox = new Box('h');
+	
+	video = new GuiVideo();
+	avBox->fill(video->getWidget());
+	audio = new GuiAudio();
+	avBox->fill(audio->getWidget());
+      
+	optionBoxL->fill(avBox);
+
+	keys = new GuiKeys();
+	optionBoxL->fill(keys->getWidget());
+	windowBox->fill(optionBoxL);
+      }
+      Box* optionBoxR = new Box('v');
+      {
+	flags = new GuiFlags();
+	optionBoxR->fill(flags->getWidget());
+	
+	update = new GuiUpdate();
+	optionBoxR->fill(update->getWidget());
+
+	exec = new GuiExec();
+	optionBoxR->fill(exec->getWidget());
+      }
+      windowBox->fill(optionBoxR);
+    }
+    orxonoxGUI->fill(windowBox);
+  }
+
+
+  // Reading Values from File
+  exec->setConfDir(GUI_DEFAULT_CONF_DIR);
+  exec->setConfFile(GUI_DEFAULT_CONF_FILE);
+  exec->readFromFile(Window::mainWindow);
+  // Merging changes to the Options from appended flags.
+  for (int optCount = 1; optCount < argc; optCount++)
+    Window::mainWindow->walkThrough(Widget::flagCheck, argv[optCount], 0);
+
+  flags->setTextFromFlags(Window::mainWindow);
+  Window::mainWindow->showall();
+  
+  Window::mainWindow->walkThrough(Widget::redrawOptions, 1);
+
+  //// Handling special Cases. ///
+
+  // case update //
+#ifdef HAVE_CURL
+  if (static_cast<Option*>(Window::mainWindow->findWidgetByName(CONFIG_NAME_AUTO_UPDATE, 0))->value == 1)
+    {
+      update->checkForUpdates();
+    }
+#endif /* HAVE_CURL */
+}
+
+/**
+   \brief starts the OrxonoxGUI
+*/
+void Gui::startGui(void)
+{
+  mainloopGUI();
+  
+#ifndef HAVE_GTK2
+  GuiExec::startOrxonox(NULL, exec);
+#endif /* HAVE_GTK2 */
+}
+
+void Gui::printHelp()
+{
+  Window::mainWindow->walkThrough(Widget::printHelp, 1);
+}
+
+/**
+   \brief a bool that knows if orxonox should be started
+*/
+bool Gui::startOrxonox = false;
+
+/**
+   \brief Destructor.
+*/
+Gui::~Gui(void)
+{
+  delete video;
+  delete audio;
+  delete exec;
+  delete flags;
+  delete banner;
+  delete keys;
+  delete update;
+}
Index: orxonox/branches/openAL/src/lib/gui/gui/gui.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui.h	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui.h	(revision 4194)
@@ -0,0 +1,34 @@
+/*!
+ \file gui.h
+ \brief Creation of the Gui
+
+ \todo way to start gui without GTK (textmode) AND IMPROOVE
+ \todo curl interface to Download cool stuff
+
+ \todo widgets save themselves
+ \todo good way to step through all the Widgets
+ \todo label -> protected : getlabel function
+*/
+
+#ifndef _GUI_H
+#define _GUI_H
+
+using namespace std;
+
+#define GUI_DEFAULT_CONF_DIR "~/.orxonox"
+#define GUI_DEFAULT_CONF_FILE "orxonox.conf"
+
+//! Class that creates the Gui
+class Gui
+{
+ public:
+  Gui(int argc, char *argv[]);
+  ~Gui(void);
+
+  void startGui(void);
+  void printHelp(void);
+
+  static bool startOrxonox;
+};
+
+#endif /* _GUI_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_audio.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_audio.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_audio.cc	(revision 4194)
@@ -0,0 +1,79 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+#include "gui_audio.h"
+
+#include "gui_gtk.h"
+
+/**
+   \brief Creates an Audio-Frame
+*/
+GuiAudio::GuiAudio(void)
+{
+  Frame* audioFrame;        //!< The Frame that holds the audio Options.
+
+  audioFrame = new Frame("Audio-Options:");
+  audioFrame->setGroupName(CONFIG_SECTION_AUDIO);
+  {
+    Box* audioBox;            //!< The Box that holds the audio Options.
+    audioBox = new Box('v');
+    {
+      CheckButton* enableSound; //!< A Ckeckbutton for enabling Sound.
+      Slider* musicVolume;      //!< A Slider for music volume.
+      Slider* effectsVolume;    //!< A Slider for effects volume.
+      
+      enableSound = new CheckButton(CONFIG_NAME_DISABLE_AUDIO);
+      enableSound->setFlagName ("no-sound", 0);
+      enableSound->setDescription("Disables Sound", "Check this to disable Sound in Orxonox");
+      enableSound->setDefaultValue(0);
+      enableSound->saveability();
+      audioBox->fill(enableSound);
+      Label* musicVolumeLabel = new Label(CONFIG_NAME_MUSIC_VOLUME);
+      audioBox->fill(musicVolumeLabel);
+      musicVolume = new Slider("Music Volume", 0, 100);
+      musicVolume->setFlagName("music-volume", "m", 80);
+      musicVolume->setDescription("Sets the volume of the ingame music");
+      musicVolume->saveability();
+      audioBox->fill (musicVolume);
+      Label* effectsVolumeLabel = new Label (CONFIG_NAME_EFFECTS_VOLUME);
+      audioBox->fill (effectsVolumeLabel);
+      effectsVolume = new Slider ("Effects Volume", 0, 100);
+      effectsVolume->setFlagName ("effects-volume", "e", 80);
+      effectsVolume->setDescription("Sets the volune of the ingame SoundEffects");
+      effectsVolume->saveability();
+      audioBox->fill (effectsVolume);
+    }
+    audioFrame->fill(audioBox);
+  }
+  setMainWidget(audioFrame);
+}
+
+/** 
+    \brief Destructs the Audio-Stuff
+*/
+GuiAudio::~GuiAudio(void)
+{
+  // nothing to do here.
+}
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_audio.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_audio.h	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_audio.h	(revision 4194)
@@ -0,0 +1,18 @@
+/*!
+  \file gui_audio.h
+  \brief File that holds the class that creates the Audio-Options.
+*/
+
+#ifndef _GUI_AUDIO_H
+#define _GUI_AUDIO_H
+
+#include "gui_element.h"
+
+//! Class that creates the Audio-Options.
+class GuiAudio : public GuiElement
+{
+ public:
+  GuiAudio(void);
+  ~GuiAudio(void);
+};
+#endif /* _GUI_AUDIO_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_banner.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_banner.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_banner.cc	(revision 4194)
@@ -0,0 +1,97 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+#include "gui_banner.h"
+
+#include "gui_gtk.h"
+
+#include "banner.xpm"
+#include "logo.xpm"
+
+/**
+   \brief Creates a new BannerEventBox and its content.
+*/
+GuiBanner::GuiBanner(void)
+{
+  // the banner Frame
+  Frame* bannerFrame;       //!< The frame that holds the Banner.
+  Box* bannerBox;           //!< The box that holds the Banner.
+  EventBox* bannerEventBox; //!< an Image needs an EventBox to catch klicks.
+  Label* bannerLabel;       //!< The Label of the Banner.
+
+  // the logo Window
+  Window* logoWindow;       //!< The Window that holds the Orxonox-CrewLogo.
+  Box* logoBox;             //!< The Box that holds the Orxonox-CrewLogo
+  Image* logoImage;         //!< The Orxonox-CrewLogo-Image
+  Label* logoLabel;         //!< The Label for the Orxonox-CrewLogo
+  Label* orxIsLabel;        //!< Some text about us.
+
+
+  // Banner Itself //
+  bannerEventBox = new EventBox("BannerEventBox");
+  {
+    Image* bannerImage;       //!< The Image for the Banner.
+
+    bannerImage = new Image(banner_xpm);
+    bannerEventBox->fill(bannerImage);
+  }
+  // Banner Window //
+  logoWindow = new Window(PACKAGE_NAME " is:");
+  {
+  EventBox* logoEventBox;   //!< The EventBox that holds the Orxonox-CrewLogo. it has to be an eventbox, because Images can not receive clicks.
+  
+#ifdef HAVE_GTK2
+    bannerEventBox->connectSignal("button_press_event", logoWindow, Window::windowOpen);
+    logoWindow->connectSignal("destroy", logoWindow, Window::windowClose);
+    logoWindow->connectSignal("delete_event", logoWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+    logoEventBox = new EventBox();
+    logoBox = new Box('v');
+    logoLabel = new Label(PACKAGE_NAME " v." PACKAGE_VERSION);
+    logoBox->fill(logoLabel);
+    logoImage = new Image(logo_xpm);
+    logoBox->fill(logoImage);
+
+    //! \todo add the names of all the guys working on orxonox
+    orxIsLabel = new Label("           " PACKAGE_NAME " is:\n" ORXONOX_STAFF);
+    logoBox->fill(orxIsLabel);
+    logoEventBox->fill(logoBox);
+#ifdef HAVE_GTK2
+    logoEventBox->connectSignal("button_press_event", logoWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+    logoWindow->fill(logoEventBox);
+  }
+  Window::addWindow(logoWindow);
+  
+  setMainWidget(bannerEventBox);
+}
+
+/**
+   \brief Destructs it.
+*/
+GuiBanner::~GuiBanner(void)
+{
+  // nothing to do here
+}
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_banner.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_banner.h	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_banner.h	(revision 4194)
@@ -0,0 +1,22 @@
+/*!
+  \file gui_banner.h
+  \brief  File that holds the class that creates the Banner-Image.\n
+  This is Commercial :-)
+*/
+
+#ifndef _GUI_BANNER_H
+#define _GUI_BANNER_H
+
+#include "gui.h"
+#include "gui_element.h"
+
+//! Class that creates the Banner-Image
+class GuiBanner : public GuiElement
+{
+ public:
+  GuiBanner(void);
+  ~GuiBanner(void);
+};
+
+
+#endif /* _GUI_BANNER_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_element.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_element.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_element.cc	(revision 4194)
@@ -0,0 +1,50 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute 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.
+
+   ### File Specific:
+   main-programmer: ...
+   co-programmer: ...
+*/
+
+//#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_
+
+#include "gui_element.h"
+
+#include "gui_gtk.h"
+
+using namespace std;
+
+
+/**
+   \brief standard constructor
+   \todo this constructor is not jet implemented - do it
+*/
+GuiElement::GuiElement () 
+{
+  this->mainWidget = NULL;
+}
+
+
+/**
+   \brief standard deconstructor
+
+*/
+GuiElement::~GuiElement () 
+{
+  // delete what has to be deleted here
+}
+
+/**
+   \brief Every GuiElement should set this, or it could result in a SegFault.
+*/
+void GuiElement::setMainWidget(Widget* widget)
+{
+  this->mainWidget = widget;
+}
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_element.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_element.h	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_element.h	(revision 4194)
@@ -0,0 +1,28 @@
+/*! 
+    \file gui_element.h
+    \brief Definition of ...
+
+*/
+
+#ifndef _GUI_ELEMENT_H
+#define _GUI_ELEMENT_H
+
+class Widget;
+
+//! A SuperClass for all the Different GuiElements
+class GuiElement {
+
+ public:
+  GuiElement();
+  virtual ~GuiElement();
+  
+  /** \returns the main Widget of this GuiElement. */
+  Widget* getWidget(void) {return this->mainWidget;}
+ protected:
+  void setMainWidget(Widget* widget);
+  
+ private:
+  Widget* mainWidget;
+};
+
+#endif /* _GUI_ELEMENT_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_exec.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_exec.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_exec.cc	(revision 4194)
@@ -0,0 +1,410 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+#include "gui_exec.h"
+
+#include "resource_manager.h"
+
+#include <string.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#ifdef __WIN32__
+#include <direct.h>
+#endif /* __WIN32__ */
+HashTable* orxonoxFlagHash;
+
+/** 
+    \brief Creates the Exec-Frame
+*/
+GuiExec::GuiExec(void)
+{
+  Frame* execFrame;            //!< The Frame that holds the ExecutionOptions.
+
+  this->confFile = NULL;
+  this->confDir = NULL;
+
+  execFrame = new Frame("Execute-Tags:");
+  {
+    Box* execBox;                //!< The Box that holds the ExecutionOptions.
+
+    execBox = new Box('v');
+    execFrame->setGroupName(CONFIG_SECTION_MISC);
+    {
+      Button* start;               //!< The start Button of orxonox.
+      Menu* verboseMode;           //!< A Menu for setting the verbose-Mode. \todo setting up a verbose-class.
+      CheckButton* alwaysShow;     //!< A CheckButton, for if orxonox should start with or without gui.
+      Button* quit;                //!< A Button to quit the Gui without starting orxonox.
+      
+      start = new Button("Start");
+#ifdef HAVE_GTK2
+      start->connectSignal("clicked", this, startOrxonox);
+#endif /* HAVE_GTK2 */
+      execBox->fill(start);
+      this->saveSettings = new CheckButton(CONFIG_NAME_SAVE_SETTINGS);
+      this->saveSettings->value = 1;
+      this->saveSettings->saveability();
+      execBox->fill(this->saveSettings);
+
+#ifdef DEBUG
+      verboseMode = new Menu(CONFIG_NAME_VERBOSE_MODE, "nothing",
+#if DEBUG >=1
+			     "error",
+#endif
+#if DEBUG >=2
+			     "warning",
+#endif
+#if DEBUG >=3
+			     "info",
+#endif
+#if DEBUG >=4
+			     "debug",
+#endif
+#if DEBUG >=5
+			     "heavydebug",
+#endif
+			     "lastItem");
+      verboseMode->setFlagName("verbose", "v", 2);
+      verboseMode->setDescription("Sets the Output Mode", "This Enables Outbug messages\n"
+				  "0: nothing will be displayed, but stuff one cannot do without (eg.GUI)\n"
+#if DEBUG >=1
+				  "1: error: outputs all the above and errors"
+#endif
+#if DEBUG >=2
+				  "2: warning: outputs all the above plus warnings"
+#endif
+#if DEBUG >=3
+				  "3: info: outputs all the above plus Information"
+#endif
+#if DEBUG >=4
+				  "4: debug: displays all the above plus debug information"
+#endif
+#if DEBUG >=5
+				  "5: heavydebug: displays all the above plus heavy debug information: WARNING: the game will run very slow with this."
+#endif
+				  );
+      verboseMode->saveability();
+      execBox->fill(verboseMode);
+#endif
+
+      alwaysShow = new CheckButton(CONFIG_NAME_ALWAYS_SHOW_GUI);
+      alwaysShow->setFlagName("gui", "g", 0);
+      alwaysShow->setDescription("shows the gui when starting orxonox");
+      alwaysShow->saveability();
+      execBox->fill(alwaysShow);
+
+      quit = new Button("Quit");
+#ifdef HAVE_GTK2
+      quit->connectSignal("clicked", this, GuiExec::quitGui);
+      //  Window::mainWindow->connectSignal("remove", this, GuiExec::quitGui);
+      Window::mainWindow->connectSignal("destroy", this, GuiExec::quitGui);
+#endif /* HAVE_GTK2 */
+      execBox->fill(quit);
+    }
+    execFrame->fill(execBox);
+  }
+  setMainWidget(execFrame);
+}
+
+/**
+   \brief Destructs the Execution-stuff
+*/
+GuiExec::~GuiExec(void)
+{
+  if(this->confFile)
+    delete []this->confFile;
+  if(this->confDir)
+    delete []this->confDir;
+}
+
+/* FILE HANDLING */
+
+/**
+   \brief sets the Directory of the configuration files
+   \param confDir the Directory for the configuration files
+*/
+void GuiExec::setConfDir(const char* confDir)
+{
+  this->confDir = ResourceManager::homeDirCheck(confDir);
+
+  PRINTF(5)("Config Directory is: %s.\n", this->confDir);
+  //! \todo F** Windows-support
+#ifndef __WIN32__
+  mkdir(this->confDir, 0755);
+#else /* __WiN32__ */
+  mkdir(this->confDir);
+#endif /* __WIN32__ */
+}
+
+/**
+   \brief Sets the location of the configuration File.
+   \param fileName the location of the configFile
+
+   The name will be parsed from ~/ to /home/[username] on unix and c:/Documents and Settings/username/Settings/ on Windows
+*/
+void GuiExec::setConfFile(const char* fileName)
+{
+  if (!this->confDir)
+    this->setConfDir("~/");
+  this->confFile = new char[strlen(this->confDir)+strlen(fileName)+2];
+  sprintf(this->confFile, "%s/%s", this->confDir, fileName);
+  PRINTF(5)("ConfigurationFile is %s.\n", this->confFile);
+}
+
+/**
+   \returns The name of the Configuration-File
+*/
+const char* GuiExec::getConfigFile(void) const
+{
+  return this->confFile;
+}
+
+/**
+   \brief checks if a option should be saved.
+   \return 1 if it should 0 if not/
+*/
+int GuiExec::shouldsave()
+{
+  return(static_cast<Option*>(this->saveSettings)->value);
+}
+
+/** 
+    \brief Saves the configuration-file to the Disk.\n
+    \param widget from which Widget on should be saved.
+
+    this Function only opens and closes the file, in between GuiExec::writeFileText(Widget* widget) will execute the real writing process.
+*/
+void GuiExec::writeToFile(Widget* widget)
+{
+  this->CONFIG_FILE = fopen(this->confFile, "w");
+  if(this->CONFIG_FILE)
+    this->writeFileText(widget, 0);
+  fclose(this->CONFIG_FILE);
+}
+
+/**
+   \brief Actually writes into the configuration file to the disk.
+   \param widget from which Widget on should be saved.
+   \param depth initially "0", and grows higher, while new Groups are bundeled.
+*/
+void GuiExec::writeFileText(Widget* widget, int depth)
+{
+  int counter = 0;
+  while(counter < depth &&((widget->optionType > GUI_NOTHING
+			      &&(static_cast<Option*>(widget)->isSaveable()))
+			     ||(widget->optionType < GUI_NOTHING
+				&& static_cast<Packer*>(widget)->getGroupName())))
+    {
+      fprintf(this->CONFIG_FILE, "  ", depth);
+      counter++;
+    }
+  
+  // check if it is a Packer, and if it is, check if it has a name and if there is something in it.
+  if(widget->optionType < GUI_NOTHING)
+    {
+      if(static_cast<Packer*>(widget)->getGroupName())
+	{
+	  fprintf(CONFIG_FILE, "[%s]\n", static_cast<Packer*>(widget)->getGroupName());
+	  this->writeFileText(static_cast<Packer*>(widget)->down, depth+1);
+	  fprintf(CONFIG_FILE, "\n");
+	}
+      else
+	{
+	  this->writeFileText(static_cast<Packer*>(widget)->down, depth);
+	}
+    } 
+
+  if(widget->optionType > GUI_NOTHING)
+    if (static_cast<Option*>(widget)->isSaveable())
+      {
+	char Buffer[256];
+	char* space2under;
+	strcpy(Buffer, static_cast<Option*>(widget)->title);
+	if(strchr(Buffer, '_'))
+	  PRINTF(2)("Optionname %s is not Valid for Saving, because it includes an underscore\n", Buffer);
+	while(space2under = strchr(Buffer, ' '))
+	  {
+	    space2under[0] = '_';
+	  }
+	  fprintf(CONFIG_FILE, "%s = %s\n", Buffer, static_cast<Option*>(widget)->save());
+      }
+
+  if(widget->next != NULL)
+    this->writeFileText(widget->next, depth);
+}
+
+/**
+   \brief Reads in Configuration Data.
+   \param widget from which Widget on should be saved.
+*/
+void GuiExec::readFromFile(Widget* widget)
+{
+  this->CONFIG_FILE = fopen(this->confFile, "r");
+  VarInfo varInfo;
+  if(this->CONFIG_FILE)
+    {
+      Widget* groupWidget = widget;
+      char Buffer[256] = "";
+      char Variable[256]= "";
+      char* Value;
+      while(fscanf(this->CONFIG_FILE, "%s", Buffer) != EOF)
+	{
+	  // group-search //
+	  if(!strncmp(Buffer, "[", 1))
+	    {
+	      if((groupWidget = locateGroup(widget, Buffer, 1))==NULL)
+		{
+		  PRINTF(2)("!!There is no group called %s in this GUI.\n First best Widget will get the Infos assigned.\n Config-File will be updated in next Save\n", Buffer);
+		  groupWidget = widget;
+		}
+	      else
+		PRINT(5)("Group %s located.\n", static_cast<Packer*>(groupWidget)->groupName);
+	    }
+	  // option-setting //
+	  if(!strcmp(Buffer, "="))
+	    {
+	      char* under2space;
+	      while(under2space = strchr(Variable, '_'))
+		{
+		  sprintf(under2space, " %s", under2space+1);
+		}
+	      
+	      fscanf(this->CONFIG_FILE, "%s", Buffer);
+	      varInfo.variableName = Variable;
+	      varInfo.variableValue = Buffer;
+	      groupWidget->walkThrough(this->readFileText, &varInfo, 0);
+	      sprintf(Variable, "");
+	    }
+	  sprintf(Variable, "%s", Buffer);
+	}
+      widget->walkThrough(widget->setOptions, 0);
+    }
+}
+
+/**
+   \brief Maps Confugurations to the Options.
+   \param widget which widget downwards
+   \param varInfo Information about the Variable to read
+*/
+void GuiExec::readFileText(Widget* widget, void* varInfo)
+{
+  VarInfo* info =(VarInfo*)varInfo;
+  if(widget->title && !strcmp(widget->title, info->variableName))
+    {
+      PRINT(5)("Located Option %s.\n", widget->title);
+      if(widget->optionType > GUI_NOTHING)
+	static_cast<Option*>(widget)->load(info->variableValue);
+    }
+}
+
+/**
+   \brief Locates a Group.
+   \param widget The Widget from where to search from
+   \param groupName The GroupName for which to search.
+   \param depth The Depth of the search seen from the first widget we searched from.
+   \returns The Widget that holds the Group, or the NULL if the Group wasn't found.
+
+   \todo do this in gui-gtk.
+*/
+Widget* GuiExec::locateGroup(Widget* widget, char* groupName, int depth)
+{
+  Widget* tmp;
+
+  // removes the trailing and ending [ ].
+  if(!strncmp(groupName, "[", 1))
+    {
+      groupName = groupName+1;
+      groupName[strlen(groupName)-1] = '\0';
+    }
+
+  if(widget->optionType < GUI_NOTHING)
+    {
+      if(static_cast<Packer*>(widget)->getGroupName() &&
+	 !strcmp(groupName, static_cast<Packer*>(widget)->getGroupName()))
+	{
+	  return widget;
+	}
+      else
+	{
+	  if((tmp = locateGroup(static_cast<Packer*>(widget)->down, groupName, depth+1)) != NULL)
+	    return tmp;
+	}
+    } 
+  
+  if(widget->next != NULL && depth != 0)
+    {
+      if((tmp = locateGroup(widget->next, groupName, depth)) != NULL)
+	return tmp;
+    }
+  return NULL;
+}
+
+/**
+   \brief Starts ORXONOX.(not really implemented yet, but the function is there.\n
+   \param widget the widget that executed the start command
+   \param data additional data
+
+   This is a Signal and can be executed through Widget::signal_connect
+*/
+#ifdef HAVE_GTK2
+int GuiExec::startOrxonox(GtkWidget* widget, void* data)
+#else /* HAVE_GTK2 */
+int GuiExec::startOrxonox(void* widget, void* data)
+#endif /* HAVE_GTK2 */
+{
+  Window::mainWindow->hide();
+
+#ifdef HAVE_GTK2
+  gtk_widget_destroy(Window::mainWindow->widget);
+#else
+  quitGui(widget, data);
+#endif /* HAVE_GTK2 */
+
+  PRINT(3)("Starting Orxonox\n");
+  Gui::startOrxonox = true;
+}
+
+/**
+   \brief Starts ORXONOX.(not really implemented yet, but the function is there.\n
+   \param widget the widget that executed the start command
+   \param data additional data
+
+   This is a Signal and can be executed through Widget::signal_connect
+*/
+#ifdef HAVE_GTK2
+int GuiExec::quitGui(GtkWidget* widget, void* data)
+#else /* HAVE_GTK2 */
+int GuiExec::quitGui(void* widget, void* data)
+#endif /* HAVE_GTK2 */
+{
+  GuiExec* exec = (GuiExec*)data;
+  if(exec->shouldsave())
+    exec->writeToFile(Window::mainWindow);
+#ifdef HAVE_GTK2
+  gtk_main_quit();
+  while(gtk_events_pending()) gtk_main_iteration();
+#endif /* HAVE_GTK2 */
+}
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_exec.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_exec.h	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_exec.h	(revision 4194)
@@ -0,0 +1,66 @@
+/*!
+  \file gui_exec.h
+  \brief File that holds the class that creates the execute-Options.
+*/
+
+#ifndef _GUI_EXEC_H
+#define _GUI_EXEC_H
+
+#include "gui.h"
+#include "gui_element.h"
+#include "gui_gtk.h"
+
+class Widget;
+class CheckButton;
+using namespace std;
+
+//! Class that creates the execute-Options.
+class GuiExec : public GuiElement
+{
+ private:
+  CheckButton* saveSettings;   //!< A CheckBox for if the Options should be saved.
+
+  char* confDir;               //!< The directory of the orxonox-configuration-files.
+  char* confFile;              //!< The name of the .orxonox.conf(ig)-file.
+  FILE* CONFIG_FILE;           //!< Filehandler for reading and writing.
+
+  //! A struct that holds informations about variables.
+  struct VarInfo
+  {
+    char* variableName;        //!< The Name of this variable;
+    char* variableValue;       //!< The Value this variable gets.
+  };
+
+ public:
+  GuiExec(void);
+  ~GuiExec(void);
+  
+  void setConfDir(const char* confDir);
+  void setConfFile(const char* confFile);
+  const char* getConfigFile(void) const;
+  int shouldsave(void);
+  void writeToFile(Widget* widget);
+  void writeFileText(Widget* widget, int depth);
+  void readFromFile(Widget* widget);
+  static void readFileText(Widget* widget, void* varInfo);
+  Widget* locateGroup(Widget* widget, char* groupName, int depth);
+
+#ifdef HAVE_GTK2
+  static int startOrxonox(GtkWidget *widget, void* data);
+  static int quitGui(GtkWidget *widget, void* data);
+#else /* HAVE_GTK2 */
+  static int startOrxonox(void* widget, void* data);
+  static int quitGui(void* widget, void* data);
+#endif /* HAVE_GTK2 */
+};
+
+//! A simple hashtable 
+struct HashTable
+{
+  char* name;           //!< name of the entry
+  char* value;          //!< value of the entry
+  HashTable* next;      //!< pointer to the next entry
+};
+
+
+#endif /* _GUI_EXEC_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_flags.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_flags.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_flags.cc	(revision 4194)
@@ -0,0 +1,99 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+#include "gui_flags.h"
+
+/**
+   \brief Creates the Flags-Frame
+*/
+GuiFlags::GuiFlags(void)
+{
+  this->flagsFrame = new Frame("Orxonox-Startup-Flags:");
+  this->flagsBox = new Box('v');
+
+  this->flagsLabel = new Label();
+  this->flagsLabel->setSize(260,60);
+  this->flagsBox->fill(flagsLabel);
+  this->shortFlags = new CheckButton("shortFlags");
+  this->shortFlags->setDefaultValue(0);
+  this->flagsBox->fill(shortFlags);
+
+  this->flagsFrame->fill(flagsBox);
+  this->setMainWidget(flagsFrame);
+}
+
+/**
+   \brief Destructs the Flags-stuff
+*/
+GuiFlags::~GuiFlags(void)
+{
+  // nothing to do here
+}
+
+/**
+   \brief Sets the Flags from widget downwards.
+   \param widget the Widget from which on to scan for deeper Options and their settings.
+*/
+void GuiFlags::setTextFromFlags(Widget* widget)
+{
+  FlagInfo flagInfo;
+  flagInfo.shortFlags = this->shortFlags;
+  flagInfo.flagsLabel = this->flagsLabel;
+
+  this->flagsLabel->ereaseText();
+  this->flagsLabel->appendText(executable);
+  widget->walkThrough(GuiFlags::flagsText, &flagInfo, 0);
+  //  flagsLabel->setTitle(flagText);
+}
+
+/** 
+    \brief this actually sets the flagtext, and appends it to flagText
+    \param widget like GuiFlags::setTextFromFlags(widget)
+    \param flagInfo Information aboout the Flag that should be updated.
+*/
+void GuiFlags::flagsText(Widget* widget, void* flagInfo)
+{
+  FlagInfo* info =(FlagInfo*)flagInfo;
+  if(widget->optionType > GUI_NOTHING)
+    if (static_cast<Option*>(widget)->value != static_cast<Option*>(widget)->defaultValue )
+      {
+	if(info->shortFlags->isActive() && static_cast<Option*>(widget)->flagNameShort)
+	  {
+	    info->flagsLabel->appendText(" -");
+	    info->flagsLabel->appendText(static_cast<Option*>(widget)->flagNameShort);
+	  }
+	else if(!info->shortFlags->isActive() && static_cast<Option*>(widget)->flagName)
+	  {
+	    info->flagsLabel->appendText(" --");
+	    info->flagsLabel->appendText(static_cast<Option*>(widget)->flagName);
+	  }
+
+	if(static_cast<Option*>(widget)->optionType > GUI_BOOL)
+	  {
+	    info->flagsLabel->appendText("=");
+	    info->flagsLabel->appendInt(static_cast<Option*>(widget)->value);
+	  }
+      }
+}
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_flags.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_flags.h	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_flags.h	(revision 4194)
@@ -0,0 +1,36 @@
+/*!
+  \file gui_flags.h
+  \brief File that holds the class that creates the flags-Text.
+*/
+
+#ifndef _GUI_FLAGS_H
+#define _GUI_FLAGS_H
+
+#include "gui.h"
+#include "gui_element.h"
+#include "gui_gtk.h"
+
+//! Class that creates the flags-Text.
+class GuiFlags : public GuiElement
+{
+ private:
+  Frame* flagsFrame;          //!< The Frame that holds the flagsDisplay.
+  Box* flagsBox;              //!< The Box that holds the flagsDisplay.
+  CheckButton* shortFlags;    //!< CheckButton to change the display of short and long flags \todo show long if long not availible...
+  Label* flagsLabel;          //!< The Label of the Flags
+
+ public:
+  GuiFlags(void);
+  ~GuiFlags(void);
+
+  void setTextFromFlags(Widget* widget);
+  static void flagsText(Widget* widget, void* flagInfo);
+  
+  //! Struct that handles flag information.
+  struct FlagInfo
+  {
+    CheckButton* shortFlags;     //!< Button for the flag.
+    Label* flagsLabel;           //!< Label for the flag.
+  };
+};
+#endif /* _GUI_FLAGS_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_gtk.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_gtk.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_gtk.cc	(revision 4194)
@@ -0,0 +1,1941 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+
+#include "gui_gtk.h"
+
+#include <stdarg.h>
+#include <string.h>
+#include <stdlib.h>
+
+using namespace std;
+
+#include "gui_flags.h"
+#include "gui_exec.h"
+
+extern GuiFlags* flags;
+
+char* executable;
+
+/**
+   \brief Initializes the Guis GTK-stuff.
+   \param argc the argument count.
+   \param argv The Argument strings.
+*/
+bool initGUI(int argc, char *argv[])
+{
+  executable = new char[strlen(argv[0])+1];
+  strcpy(executable, argv[0]);
+
+#ifdef HAVE_GTK2
+  gtk_init(&argc, &argv);
+#include "rc"
+  gtk_rc_parse_string( rc_string );
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief enters the GUI's main-loop
+*/
+bool mainloopGUI(void)
+{
+#ifdef HAVE_GTK2
+  gtk_main();
+#else /* HAVE_GTK2 */
+  char boolAns = 'y';
+  char ans[1000];
+  PRINT(0)("================================\n");
+  PRINT(0)("= ORXONOX CONFIGURATION WIZARD =\n");
+  PRINT(0)("================================ - v." PACKAGE_VERSION "\n");
+
+  while(true)
+    {
+      PRINT(0)("\n Listing all the Orxonox Options: \n");
+      PRINT(0)("  #############################\n");
+      Window::mainWindow->walkThrough(Widget::listOptionsAndGroups, 1);
+      
+      PRINT(0)("\nDo you want change any of the above values now? [Yn] ");
+      scanf("%s", ans);
+      if (ans[0] =='n' || ans[0]=='N')
+	break;
+      
+      PRINT(0)("\n Listing all groups\n");
+      PRINT(0)("  #################\n");
+      int groupCount = 0;
+      Window::mainWindow->walkThrough(Widget::listGroups, &groupCount, 1);
+      
+      PRINT(0)("\nIn which Group? [1-%d] ", groupCount);
+      Packer* group;
+      while(true)
+	{
+	  scanf("%s", ans);
+	  int ansIp = atoi(ans);
+	  if (ansIp <= groupCount)
+	    {
+	      group = static_cast<Packer*>(Window::mainWindow->findGroupByNumber(&ansIp, 1));
+	      break;
+	    }
+	  else
+	    PRINT(0)("\nChoose a smaller Number please: [1-%d] ", groupCount);
+	}
+      PRINT(0)("\n\nGroup: [%s]\n\n", group->groupName);
+      int optionCount = 0;
+      group->walkThrough(Widget::listOptions, &optionCount, 0);
+      PRINT(0)("\nWhich Option? [1-%d] ", optionCount);
+      Option* option;
+      while(true)
+	{
+	  scanf("%s", ans);
+	  int ansIp = atoi(ans);
+	  if (ansIp <= groupCount)
+	    {
+	      option = static_cast<Option*>(group->findOptionByNumber(&ansIp, 0));
+	      break;
+	    }
+	  else
+	    PRINT(0)("\nChoose a smaler Number please: [1-%d] ", optionCount);
+	}
+      PRINT(0)("\n\n:: %s ::\n", option->title);
+      option->changeOption();
+      
+      // here follows the rest.... this will be nasty.
+      //! \todo finish it.
+      //! \todo memory leek at save(); and save is a BAD word, use saveString instead, or something like it.
+    }
+#endif /* HAVE_GTK2 */
+  
+}
+
+
+//////////////////////////////
+/// DEFINING WIDGET-CLASES ///
+//////////////////////////////
+
+////////////
+/* WIDGET */
+////////////
+/**
+   \brief constructs a Widget
+*/
+Widget::Widget(void)
+{
+  next = NULL;
+  this->title = NULL;
+}
+
+/**
+   \brief deletes any given Widget
+   This is still pretty crappy.
+*/
+Widget::~Widget(void)
+{
+  if (this->title)
+    {
+      delete []this->title;
+    }
+  
+  PRINTF(5)("deleting the Widget part.\n");
+
+  // deleting next item if existent
+  if (this->next)
+    delete this->next;
+  this->next = NULL;
+
+  //!  \todo not hiding widget, deleting.
+  //  this->hide();
+  // gtk_destroy_widget(this->widget);
+}
+
+/**
+   \brief sets a new Title to a Widget
+   \param title The new Title to set to the Widget
+*/
+void Widget::setTitle(const char* title)
+{
+  if (this->title)
+    delete []this->title;
+  this->title = new char[strlen(title)+1];
+  strcpy(this->title, title);
+}
+
+/**
+   \brief makes the widget visible.
+*/
+void Widget::show(void)
+{
+#ifdef HAVE_GTK2
+  gtk_widget_show(this->widget);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief hides the widget.
+*/
+void Widget::hide(void)
+{
+#ifdef HAVE_GTK2
+  gtk_widget_hide(this->widget);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Sets the resolution of a specific widget to the given size.
+   \param width the width of the widget to set.
+   \param height the height of the widget to set.
+*/
+void Widget::setSize(int width, int height)
+{
+#ifdef HAVE_GTK2
+  gtk_widget_set_usize(this->widget, width, height);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief searches through widgets for a Name.
+*/
+Widget* Widget::findWidgetByName(char* name, unsigned int depth)
+{
+
+  if (this->title && !strcmp(this->title, name))
+    return this;
+
+  if (this->optionType < GUI_NOTHING && static_cast<Packer*>(this)->down)
+    {
+      Widget* tmp = static_cast<Packer*>(this)->down->findWidgetByName(name, depth+1);
+      if (tmp)
+	return tmp;
+    }
+  
+  if (depth>0 && this->next)
+    return this->next->findWidgetByName(name, depth);
+
+  return NULL;
+}
+
+/**
+   \brief Moves through all the Widgets downwards from this and executes the function on them.
+   \param function must be of type void and takes a Widget* as an Input. 
+   \param depth the current depth. if > 0 then the next Widget will also be walked through.
+*/
+void Widget::walkThrough(void(*function)(Widget*), unsigned int depth)
+{
+  function(this);
+  if (this->optionType < GUI_NOTHING)
+    {
+      static_cast<Packer*>(this)->down->walkThrough(function, depth+1);
+    } 
+
+  if (this->next && depth != 0)
+    this->next->walkThrough(function, depth);
+}
+
+/**
+   \brief Moves through all the Widgets downwards from this and executes the function on them.
+   \param function must be of type void and takes a Widget* as an Input.
+   \param data Additional Data you want to pass to the function.
+   \param depth the current depth. if > 0 then the next Widget will also be walked through.
+*/
+void Widget::walkThrough(void(*function)(Widget*, void*), void* data, unsigned int depth)
+{
+  function(this, data);
+  if (this->optionType < GUI_NOTHING)
+    {
+      static_cast<Packer*>(this)->down->walkThrough(function, data, depth+1);
+    }
+  if (this->next && depth != 0)
+    this->next->walkThrough(function, data, depth);
+}
+
+/** 
+    \brief This is for listing the options of "widget"
+    \param widget specifies the widget that should be listed
+*/
+void Widget::listOptionsAndGroups(Widget* widget)
+{
+  if (widget->optionType < GUI_NOTHING && static_cast<Packer*>(widget)->groupName)
+    PRINT(0)("[%s]\n", static_cast<Packer*>(widget)->groupName);
+  if (widget->optionType > GUI_NOTHING)
+    {
+      Widget::listOptions(widget);
+    }
+}
+
+/** 
+    \brief This is for listing the options of "widget"
+    \param widget specifies the widget that should be listed
+*/
+void Widget::listOptions(Widget* widget)
+{
+  if(widget->optionType > GUI_NOTHING)
+    PRINT(0)("  %s is %s\n", static_cast<Option*>(widget)->title, static_cast<Option*>(widget)->save());
+}
+
+/** 
+    \brief This is for listing the options of "widget"
+    \param widget specifies the widget that should be listed
+    \param data A Counter, that always knows how many Options have been found yet.
+*/
+void Widget::listOptions(Widget* widget, void* data)
+{
+  
+  if (widget->optionType > GUI_NOTHING)
+    {
+      int* count =(int*)data;
+      *count = *count +1;
+      PRINT(0)(" %d:%s is %s\n", *count,
+	       static_cast<Option*>(widget)->title,
+	       static_cast<Option*>(widget)->save());
+    }
+}
+
+/** 
+    \brief This is for listing the options of "widget"
+    \param widget specifies the widget that should be listed
+    \param data A Counter, that always knows how many Options have been found yet.
+*/
+void Widget::printHelp(Widget* widget)
+{
+  int helpLen=0;
+
+  if (widget->optionType > GUI_NOTHING)
+    {
+      Option* option = (Option*)widget;
+      if (option->flagName || option->flagNameShort)
+	{
+	  PRINT(0)("  ");
+	  if (option->flagNameShort)
+	    {
+	      PRINT(0)("-%s", option->flagNameShort);
+	      helpLen += strlen(option->flagNameShort)+1;
+	    }
+	  if (option->flagName)
+	    {
+	      if (helpLen > 0)
+		{
+		  PRINT(0)("|");
+		  helpLen++;
+		}
+	      PRINT(0)("--%s:", option->flagName);
+	      helpLen += strlen(option->flagName)+2;
+	    }
+	  while ((helpLen ++) < 29)
+	    PRINT(0)(" ");
+	  if (option->shortDescription)
+	    PRINT(0)("%s\n", option->shortDescription);
+	  else
+	    PRINT(0)("\n");
+	}
+    }
+}
+
+/** 
+    \brief Finds an Option by a given number(the n'th option found away from this Widget)
+    \param number The Count of options to wait(by reference)
+    \param depth The depth of the sarch. if 0 it will not search next pointer
+    
+    \todo should return Option* would be much sexier.
+*/
+Widget* Widget::findOptionByNumber(int* number, unsigned int depth)
+{
+  if (optionType > GUI_NOTHING)
+    {
+      --*number;
+      if (*number <= 0)
+	{
+	  return this;
+	}
+    }
+  if (this->optionType < GUI_NOTHING && static_cast<Packer*>(this)->down)
+    {
+      Widget* tmp = static_cast<Packer*>(this)->down->findOptionByNumber(number, depth+1);
+      if (tmp)
+	return tmp;
+    }
+  if (depth>0 && this->next)
+    return this->next->findOptionByNumber(number, depth);
+
+  return NULL;
+}
+
+/** 
+    \brief This is for listing the groups of "widget"
+    \param widget specifies the widget that should be listed
+*/
+void Widget::listGroups(Widget* widget)
+{
+  if (widget->optionType < GUI_NOTHING && static_cast<Packer*>(widget)->groupName)
+    PRINT(0)("[%s]\n", static_cast<Packer*>(widget)->groupName);
+}
+
+/** 
+    \brief This is for listing the Groups of "widget". It also displays the n'th number found.
+    \param widget specifies the widget that should be listed
+    \param data the Counter, that will show the number(this function will raise it by one if a Group is fount.
+*/
+void Widget::listGroups(Widget* widget, void* data)
+{
+  int* count = (int*)data;
+  if (widget->optionType < GUI_NOTHING && static_cast<Packer*>(widget)->groupName)
+    PRINT(0)("%d: [%s]\n", ++*count, static_cast<Packer*>(widget)->groupName);
+}
+
+/** 
+    \brief Finds a Group by a given number(the n'th Group found away from this Widget)
+    \param number The Count of options to wait(by reference)
+    \param depth The depth of the sarch. if 0 it will not search next pointer
+*/
+Widget* Widget::findGroupByNumber(int* number, unsigned int depth)
+{
+  if (optionType < GUI_NOTHING && static_cast<Packer*>(this)->groupName)
+    {
+      --*number;
+      if (*number <= 0)
+	{
+	  return this;
+	}
+    }
+  if (this->optionType < GUI_NOTHING && static_cast<Packer*>(this)->down)
+    {
+      Widget* tmp = static_cast<Packer*>(this)->down->findGroupByNumber(number, depth+1);
+      if (tmp)
+	return tmp;
+    }
+  if (depth>0 && this->next)
+    return this->next->findGroupByNumber(number, depth);
+
+  return NULL;
+}
+
+/**
+    \brief This is for setting the option of "widget"
+    \param widget specifies the widget that should be set.
+*/
+void Widget::setOptions(Widget* widget)
+{
+  if (widget->optionType > GUI_NOTHING)
+    static_cast<Option*>(widget)->redraw();
+}
+
+/**
+   \brief redraws all the Widgets down from widget
+   \param widget The topmost Widget
+   \param data ...
+*/
+void Widget::redrawOptions(Widget* widget)
+{
+  if (widget->optionType > GUI_NOTHING)
+    static_cast<Option*>(widget)->redraw();
+}
+
+/**
+   \brief Walks through all the Flags given at startuptime.
+*/
+void Widget::flagCheck(Widget* widget, void* flagName)
+{
+  if (widget->optionType > GUI_NOTHING)
+    {      
+      Option* option =(Option*)widget;
+      char* name =(char*)flagName;
+      char* value = NULL;
+      bool found = false;
+      // check if long flag matches
+      if ((option->flagName && strlen(name) > 2 &&
+	   !strncmp(name+2, option->flagName, strlen(option->flagName)) &&
+	   (name[strlen(option->flagName)+2] == '\0' || name[strlen(option->flagName)+2] == '=') ))
+	{
+	  found = true;
+	  if (name[strlen(option->flagName)+2] == '=')
+	    {
+	      value = name+strlen(option->flagName)+3;
+	    }
+	}
+      // check if short flag matches
+      else if (option->flagNameShort && strlen(name)>1 &&
+	       !strncmp(name+1, option->flagNameShort, strlen(option->flagNameShort)) &&
+	       (name[strlen(option->flagNameShort)+1] == '\0' || name[strlen(option->flagNameShort)+1] == '='))
+	{
+	  found = true;
+	  if (name[strlen(option->flagNameShort)+1] == '=')
+	    {
+	      value = name+strlen(option->flagNameShort)+2;
+	    }	  
+	}
+
+      if (found)
+	{
+	  PRINT(4)("found matching Flag %s\n", name);
+	  if (value)
+	    {
+	      PRINT(4)("with Value %s\n", value);
+	      option->value = atoi(value);
+	    }
+	  else
+	    {
+	      option->value = !option->defaultValue;
+	    }
+	  option->redraw();
+	}
+
+    }
+}
+
+#ifdef HAVE_GTK2
+/** 
+    \brief Connect any signal to any given Sub-widget
+*/
+gulong Widget::connectSignal(char* event, gint(*signal)(GtkWidget*, GdkEvent*, void *))
+{
+  return g_signal_connect(G_OBJECT(this->widget), event, G_CALLBACK(signal), NULL);
+}
+
+/**
+   \brief Connect a signal with additionally passing the whole Object
+*/
+gulong Widget::connectSignal(char* event, gint(*signal)( GtkWidget*, Widget *))
+{
+  return g_signal_connect(G_OBJECT(this->widget), event, G_CALLBACK(signal), this);
+}
+
+/**
+   \brief Connect a signal with additionally passing a whole external Object
+*/
+gulong Widget::connectSignal(char* event, void* extObj, gint(*signal)(GtkWidget*, GdkEvent*, void *))
+{
+  return g_signal_connect(G_OBJECT(this->widget), event, G_CALLBACK(signal), extObj);
+}
+
+/**
+   \brief Connect a signal with additionally passing a whole external Object
+*/
+gulong Widget::connectSignal(char* event, void* extObj, gint(*signal)(GtkWidget*, void *))
+{
+  return g_signal_connect(G_OBJECT(this->widget), event, G_CALLBACK(signal), extObj);
+}
+
+/**
+   \brief Connect a signal with additionally passing a whole external Object
+*/
+gulong Widget::connectSignal(char* event, void* extObj, gint(*signal)(GtkWidget*, GdkEventKey*, void *))
+{
+  return g_signal_connect(G_OBJECT(this->widget), event, G_CALLBACK(signal), extObj);
+}
+
+void Widget::disconnectSignal(gulong signalID)
+{
+  g_signal_handler_disconnect(G_OBJECT(this->widget), signalID);
+}
+
+/**
+   \brief Signal that does absolutely nothing
+   \param widget The widget that initiated the Signal
+   \param event The event-type.
+   \param nothing nothin.
+*/
+gint Widget::doNothingSignal(GtkWidget *widget, GdkEvent* event, void* nothing)
+{
+}
+#endif /* HAVE_GTK2 */
+
+/////////////
+/* PACKERS */
+/////////////
+/**
+   \brief Constructs a Packer
+*/
+Packer::Packer(void)
+{
+  this->down = NULL;
+  this->groupName = NULL;
+}
+
+/**
+   \brief Destroys a Packer.
+*/
+Packer::~Packer(void)
+{ 
+  PRINTF(5)("deleting the Packer part.\n");
+  if (this->groupName)
+    delete []this->groupName;
+  
+  //deleting recursively.
+  if (this->down)
+    delete this->down;
+}
+
+/**
+   \brief Sets the group name under which all the lower widgets of this will be saved.
+   \param name The name of the group.
+*/
+void Packer::setGroupName(const char* name)
+{
+  if (this->groupName)
+    delete []this->groupName;
+  this->groupName = new char[strlen(name)+1];
+  strcpy(this->groupName, name);
+}
+
+////////////////
+/* CONTAINERS */
+////////////////
+/**
+   \brief Initializes a Container.
+
+   sets the Container-Specific defaults.
+*/
+Container::Container(void)
+{
+  this->optionType = GUI_CONTAINER;
+}
+
+/**
+   \brief Destroys a Container.
+*/
+Container::~Container(void)
+{ 
+  PRINTF(5)("deleting the Container part.\n");
+}
+
+/**
+   \briefFills a Container with lowerWidget.
+   \param lowerWidget the Widget that should be filled into the Container.
+
+   It does this by filling up the down pointer only if down points to NULL.
+*/
+void Container::fill(Widget* lowerWidget)
+{
+  if (this->down == NULL)
+    {
+#ifdef HAVE_GTK2
+      gtk_container_add(GTK_CONTAINER(this->widget), lowerWidget->widget);
+#endif /* HAVE_GTK2 */
+
+      this->down = lowerWidget;
+    }
+  else
+    PRINTF(2)("You tried to put more than one Widget into a Container. \nNot including this item.\nThis is only possible with Boxes.\n");
+}
+
+/**
+   \param borderwidth sets the Width of the border
+*/
+void Container::setBorderWidth(int borderwidth)
+{
+  this->borderwidth = borderwidth;
+
+#ifdef HAVE_GTK2
+  gtk_container_set_border_width(GTK_CONTAINER(widget), borderwidth);
+#endif /* HAVE_GTK2 */
+}
+
+////////////
+/* WINDOW */
+////////////
+
+/**
+   \brief The main Window of Th Gui
+*/
+Window* Window::mainWindow = NULL;      
+
+/**
+   \brief Creating a Window with a name
+   \param windowName the name the window should get.
+*/
+Window::Window(const char* windowName)
+{
+  if (!mainWindow)
+    {
+      mainWindow = this;
+      this->isOpen = true;
+    }
+  isOpen = false;
+
+#ifdef HAVE_GTK2
+  widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_policy(GTK_WINDOW(widget), TRUE, TRUE, TRUE);
+#if !defined(__WIN32__)
+  //  gtk_window_set_decorated(GTK_WINDOW(widget), FALSE);
+#endif 
+  gtk_container_set_border_width(GTK_CONTAINER(widget), 3);
+#endif /* HAVE_GTK2 */
+
+  if (windowName)
+    this->setTitle(windowName);
+}
+
+/**
+   \brief Destructs a Window.
+*/
+Window::~Window(void)
+{
+  PRINTF(5)("deleting the Window: %s\n", this->title);
+}
+
+/**
+   \brief Adds a new Window Windows to the List of Windows.
+   \param windowToAdd The Windows that should be added to the List
+   \todo this instead of windowToAdd(possibly)
+*/
+void Window::addWindow(Window* windowToAdd)
+{
+  if (!mainWindow)
+    {
+      mainWindow = windowToAdd;
+      windowToAdd->isOpen = true;
+    }
+  else
+    {
+      Widget* tmpWindow = mainWindow;
+      while(tmpWindow->next)
+	tmpWindow = tmpWindow->next;
+      tmpWindow->next = windowToAdd;
+      windowToAdd->isOpen = false;
+    }
+  return;
+}
+
+/**
+   \brief Shows all Widgets that are included within this->widget.
+*/
+void Window::showall(void)
+{
+#ifdef HAVE_GTK2
+  if (!this->isOpen)
+    gtk_widget_show_all(this->widget);
+  else
+    gtk_widget_show(this->widget);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Set The Window-title to title
+   \param title title the Window should get.
+*/
+void Window::setTitle(const char* title)
+{
+  if (this->title)
+    delete []this->title;
+  this->title = new char[strlen(title)+1];
+  strcpy(this->title, title);
+#ifdef HAVE_GTK2
+  gtk_window_set_title(GTK_WINDOW(widget), title);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief opens up a Window and fixes the Focus to it
+*/
+void Window::open(void)
+{
+  if (this != mainWindow)
+    {
+      isOpen = true;
+#ifdef HAVE_GTK2
+      gtk_widget_show_all(this->widget);
+      gtk_grab_add(this->widget);
+#endif /* HAVE_GTK2 */
+    }
+}
+
+/**
+   \brief closes up a Window and removes the Focus from it
+*/
+void Window::close(void)
+{
+  if (this != mainWindow)
+    {
+      this->isOpen = false;
+#ifdef HAVE_GTK2
+      gtk_grab_remove(this->widget);
+      gtk_widget_hide(this->widget);
+#endif /* HAVE_GTK2 */
+    }
+}
+
+/**
+   \brief opens up a window(not topmost Window).
+   this is the Signal that does it. !!SIGNALS ARE STATIC!!
+   \param widget the widget that did it.
+   \param event the event that did it.
+   \param window the Window that should be opened
+*/
+#ifdef HAVE_GTK2
+gint Window::windowOpen(GtkWidget* widget, GdkEvent* event, void* window)
+{
+  static_cast<Window*>(window)->open();
+}
+#else /* HAVE_GTK2 */
+int Window::windowOpen(void* widget, void* event, void* window){}
+#endif /* HAVE_GTK2 */
+
+/**
+   \brief closes a window(not topmost Window).
+   this is the Signal that does it. !!SIGNALS ARE STATIC!!
+   \param widget the widget that did it!
+   \param event the event that did it!
+   \param window the Window that should be closed
+*/
+#ifdef HAVE_GTK2
+gint Window::windowClose(GtkWidget* widget, GdkEvent* event, void* window)
+{
+  static_cast<Window*>(window)->close();
+}
+#else /* HAVE_GTK2 */
+int Window::windowClose(void* widget, void* event, void* window){}
+#endif /* HAVE_GTK2 */
+
+///////////
+/* FRAME */
+///////////
+/**
+   \brief Creates a new Frame with name title
+*/
+Frame::Frame(const char* frameName)
+{
+#ifdef HAVE_GTK2
+  this->widget = gtk_frame_new("");
+  gtk_container_set_border_width(GTK_CONTAINER(this->widget), 3);
+#endif /* HAVE_GTK2 */
+  if (frameName)
+    this->setTitle(frameName);
+}
+
+/**
+   \brief destrcucts a Frame
+*/
+Frame::~Frame(void)
+{
+  PRINTF(5)("deleting the Frame: %s\n", this->title);
+}
+
+/**
+   \brief Sets the Frames name to title
+   \param title The title the Frame should get.
+*/
+void Frame::setTitle(const char* title)
+{
+  if (this->title)
+    delete []this->title;
+  this->title = new char[strlen(title)+1];
+  strcpy(this->title, title);
+#ifdef HAVE_GTK2
+  gtk_frame_set_label(GTK_FRAME(widget), this->title);
+#endif /* HAVE_GTK2 */
+}
+
+//////////////
+/* EVENTBOX */
+//////////////
+/**
+   \brief Creates a new EventBox with name title
+   \param eventBoxName title the Eventbox should get(only data-structure-internal)
+*/
+EventBox::EventBox(const char* eventBoxName)
+{
+#ifdef HAVE_GTK2
+  this->widget = gtk_event_box_new();
+  gtk_container_set_border_width(GTK_CONTAINER(this->widget), 3);
+#endif /* HAVE_GTK2 */
+
+  if (eventBoxName)
+    this->setTitle(eventBoxName);
+}
+
+/**
+   \brief destructs an EventBox.
+*/
+EventBox::~EventBox(void)
+{
+  PRINTF(5)("deleting the EventBox: %s\n", this->title);
+}
+
+/////////
+/* BOX */
+/////////
+/**
+   \brief Creates a new Box of type boxtype
+   \param boxtype if 'v' the Box will be vertically, if 'h' the Box will be horizontally
+*/
+Box::Box(char boxtype)
+{
+  this->optionType = GUI_BOX;
+
+#ifdef HAVE_GTK2
+  if (boxtype == 'v')
+    this->widget = gtk_vbox_new(FALSE, 0);
+  else
+    this->widget = gtk_hbox_new(FALSE, 0);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief destructs a Box.
+*/
+Box::~Box(void)
+{
+  PRINTF(5)("deleting the Box: %s\n", this->title);
+}
+
+/** 
+    \brief Fills a box with a given Widget.
+    \param lowerWidget the next Widget that should be appendet to this Box
+
+    It does this by apending the first one to its down-pointer and all its following ones to the preceding next-pointer. The last one will receive a NULL pointer as Next
+*/
+void Box::fill(Widget* lowerWidget)
+{
+#ifdef HAVE_GTK2
+  gtk_box_pack_start(GTK_BOX(this->widget), lowerWidget->widget, TRUE, TRUE, 0);
+#endif /* HAVE_GTK2 */
+  if (this->down == NULL)
+    this->down = lowerWidget;
+  else
+    {
+      Widget* tmp;
+      tmp = this->down;
+      while(tmp->next != NULL)
+	tmp = tmp->next;
+      tmp->next = lowerWidget;
+    }
+}
+
+////////////
+/* OPTION */
+////////////
+/**
+   \brief Initializes a new Option.
+   sets all Option-Specific-Values to their defaults.
+*/
+Option::Option(void)
+{
+  this->value = 0;
+  this->flagName = NULL;
+  this->flagNameShort = NULL;
+  
+  this->shortDescription = NULL;
+  this->longDescription = NULL;
+
+  this->saveable = false;
+  this->defaultValue = 0;
+}
+
+/**
+   \brief Destroys an Option.
+*/
+Option::~Option(void)
+{ 
+  PRINTF(5)("deleting the Option Part.\n");
+  if (this->flagName)
+    delete []this->flagName;
+  if (this->flagNameShort)
+    delete []this->flagNameShort;
+  if (this->shortDescription)
+    delete []this->shortDescription;
+  if (this->longDescription)
+    delete []this->longDescription;
+}
+
+/**
+   \param defaultValue new defaultValue for this option
+*/
+void Option::setDefaultValue(int defaultValue)
+{
+  this->value = this->defaultValue = defaultValue;
+}
+
+/**
+   \brief This sets The FlagName of an Option and defines its default Values
+   !! Options will be saved if flagname is different from NULL !!
+   \param flagname the Name that will be displayed in the output
+   \param defaultvalue the default Value for this Option(see definition of defaultvalue
+*/
+void Option::setFlagName(const char* flagname, int defaultvalue)
+{
+  if (this->flagName)
+    delete this->flagName;
+  this->flagName = new char [strlen(flagname)+1];
+  strcpy(this->flagName, flagname);
+
+  this->setDefaultValue(defaultvalue);
+
+  if (this->flagNameShort)
+    {
+      delete this->flagNameShort;
+      this->flagNameShort = NULL;
+    }
+
+  //  cout << "Set Flagname of " << this->title << " to " << flagname << endl;
+}
+
+/** 
+    \brief see Option::setFlagName(char* flagname, int defaultvalue)
+    \param flagname the Name that will be displayed in the output
+    \param defaultvalue the default Value for this Option(see definition of defaultvalue
+    \param flagnameshort a short flagname to be displayed in the output
+*/
+void Option::setFlagName(const char* flagname, const char* flagnameshort,  int defaultvalue)
+{
+  if (this->flagName)
+    delete []this->flagName;
+  this->flagName = new char [strlen(flagname)+1];
+  strcpy(this->flagName, flagname);
+
+  if (this->flagNameShort)
+    delete []this->flagNameShort;
+  this->flagNameShort = new char [strlen(flagnameshort)+1];
+  strcpy(this->flagNameShort, flagnameshort);
+  this->setDefaultValue(defaultvalue);
+  //  cout << "Set Flagname of " << this->title << " to " << flagname << endl;
+}
+
+void Option::setDescription(const char* shortDescription, const char* longDescription)
+{
+  // setting up the short description
+  if (this->shortDescription)
+    delete []this->shortDescription;
+  this->shortDescription = new char [strlen(shortDescription)+1];
+  strcpy(this->shortDescription, shortDescription);
+
+  //setting up the long description
+  if (this->longDescription)
+    delete []this->longDescription;
+  if (longDescription)
+    {
+      this->longDescription = new char [strlen(longDescription)+1];
+      strcpy(this->longDescription, longDescription);
+    }
+  else
+    this->longDescription = NULL;
+}
+
+/**
+   \brief Sets the saveable-state of the option.
+   \param isSaveable the saveable-state to set.
+*/
+void Option::saveability(bool isSaveable)
+{
+  this->saveable = isSaveable;
+}
+
+/**
+   \brief saves an Option
+   \returns the String that should be saved. (this string __should__ be deleted)
+
+   this is a default Option save
+*/
+char* Option::save(void)
+{
+  char* value = new char [30];
+  sprintf (value, "%d", this->value);
+  return value;
+}
+
+/**
+   \brief loads an Option from of its loadString
+   \param loadString the string from which to load the data from
+*/
+void Option::load(char* loadString)
+{
+  this->value = atoi(loadString);
+  PRINT(5)("Loading %s: %s %d\n", this->title, loadString, value); 
+  this->redraw();
+}
+
+/**
+   \returns The saveable-state.
+*/
+bool Option::isSaveable(void)
+{
+  return this->saveable;
+}
+
+#ifdef HAVE_GTK2
+/** 
+    \brief Signal OptionChange writes the Value from the Slider to its Object-Database.
+    \param widget The widget(Slider) that has a changed Value
+    \param slider the Slider-Object that should receive the change.
+*/
+gint Option::OptionChange(GtkWidget *widget, Widget* option)
+{
+  static_cast<Option*>(option)->changeOption();
+  flags->setTextFromFlags(Window::mainWindow);  //// must be different !!!
+}
+#endif /* HAVE_GTK2 */
+
+////////////
+/* BUTTON */
+////////////
+/**
+   \brief Creates a new Button with a buttonname
+   \param buttonName sets the Name of the Button
+*/
+Button::Button(const char* buttonName)
+{
+  this->optionType = GUI_NOTHING;
+
+#ifdef HAVE_GTK2
+  widget = gtk_button_new_with_label("");
+#endif /* HAVE_GTK2 */
+
+  if (buttonName)
+    this->setTitle(buttonName);
+}
+
+/**
+   \brief destructs a Button.
+*/
+Button::~Button(void)
+{
+  PRINTF(5)("deleting the Label: %s\n", this->title);
+}
+
+/**
+   \brief Sets a new name to the Button
+   \param title The name the Button should get
+*/
+void Button::setTitle(const char *title)
+{
+  if (this->title)
+    delete []this->title;
+  this->title = new char[strlen(title)+1];
+  strcpy(this->title, title);
+#ifdef HAVE_GTK2
+  gtk_button_set_label(GTK_BUTTON(widget), title);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief redraws the Button
+   \todo not implemented yet
+*/
+void Button::redraw(void)
+{
+}
+
+/**
+   \brief Button can not be changed, optionChange is empty)
+
+   \todo Actions for non-GTK-mode
+*/
+void Button::changeOption(void)
+{
+  // This will possibly be used for ACTIONS !
+}
+
+/////////////////
+/* CHECKBUTTON */
+/////////////////
+/**
+   \brief Creates a new CheckButton with an ame 
+   \param buttonName The name the CheckButton should display.
+*/
+CheckButton::CheckButton(const char* buttonName)
+{
+  this->optionType = GUI_BOOL;
+
+#ifdef HAVE_GTK2
+  this->widget = gtk_check_button_new_with_label("");
+#endif /* HAVE_GTK2 */
+
+  if (buttonName)
+    this->setTitle(buttonName);
+
+#ifdef HAVE_GTK2
+  this->connectSignal("clicked", this->OptionChange);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief destructs a CheckButton.
+*/
+CheckButton::~CheckButton(void)
+{
+  if (this->title)
+    PRINTF(5)("deleting the CheckButton: %s\n", this->title);
+  else 
+    PRINTF(5)("deleting the CheckButton.\n");
+}
+
+/**
+   \brief Sets a new Title to a CheckButton
+   \param title The new Name the CheckButton should display.
+*/
+void CheckButton::setTitle(const char* title)
+{
+  if (this->title)
+    delete []this->title;
+  this->title = new char[strlen(title)+1];
+  strcpy(this->title, title);
+#ifdef HAVE_GTK2
+  gtk_button_set_label(GTK_BUTTON(widget), title);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \returns the Active state of the checkButton
+*/
+bool CheckButton::isActive(void)
+{
+#ifdef HAVE_GTK2
+  return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Changed the Option, call this Function
+*/
+void CheckButton::changeOption(void)
+{
+#ifdef HAVE_GTK2
+  this->value =(int)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(this->widget));
+#else /* HAVE_GTK2 */
+  char tmpChar[200];
+  PRINT(0)("\nPlease give me a new value for %s [0,1](default:%d): ",this->title, this->defaultValue);
+  scanf("%s", tmpChar);
+
+  if ((this->value = atoi(tmpChar))=!0)
+    this->value = 1;
+
+  PRINT(0)("%s set to: %d\n", this->title, this->value);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Redraws the CheckButton(if option has changed).
+   Example: if new settings are loaded the Button must be redrawn for the GUI to display that Change
+*/
+void CheckButton::redraw(void)
+{
+#ifdef HAVE_GTK2
+  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(this->widget), value);
+#endif /* HAVE_GTK2 */
+}
+
+////////////
+/* SLIDER */
+////////////
+/**
+   \brief Creates a new Slider
+   \param slidername The data-structure-name of the slider.
+   \param start The minimal Value of the slider.
+   \param end The maximal Value of the slider.
+*/
+Slider::Slider(const char* slidername, int start, int end)
+{
+  this->optionType = GUI_INT;
+
+  this->start = start;
+  this->end = end;
+#ifdef HAVE_GTK2
+ widget = gtk_hscale_new_with_range(this->start, this->end, 5);
+#endif /* HAVE_GTK2 */
+
+  this->setValue(start);
+  this->setTitle(slidername);
+#ifdef HAVE_GTK2
+  this->connectSignal("value_changed", this->OptionChange);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief destructs a Slider.
+*/
+Slider::~Slider(void)
+{
+  PRINTF(5)("deleting the Slider: %s\n", this->title);
+}
+
+/**
+   \brief Setting a new value to the Slider.
+   Maybe you also require a Slider::redraw() for this to display
+*/
+void Slider::setValue(int value)
+{
+  this->value = value;
+}
+
+/**
+   \brief Redraws the widget
+   Example: see void CheckButton::redraw(void)
+*/
+void Slider::redraw(void)
+{
+#ifdef HAVE_GTK2
+  gtk_range_set_value(GTK_RANGE(this->widget), this->value);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Changed the Option, call this Function
+*/
+void Slider::changeOption(void)
+{
+#ifdef HAVE_GTK2
+  this->value =(int)gtk_range_get_value(GTK_RANGE(this->widget));
+#else /* HAVE_GTK2 */
+  char tmpChar[20];
+  PRINT(0)("\nPlease give me a new value for %s [%d-%d] (default:%d): ", this->title, this->start, this->end, this->defaultValue);
+  scanf("%s", tmpChar);
+
+  if ((this->value = atoi(tmpChar))> this->end)
+    this->value = this->end;
+  if (this->value <= this->start)
+    this->value = this->start;
+
+  PRINT(0)("%s set to: %d\n",this->title, this->value);
+#endif /* HAVE_GTK2 */
+}
+
+//////////
+/* MENU */
+//////////
+/**
+   \brief constructs a new Menu, without adding any items to it.
+   \param menuName the Name the Menu gets.
+*/
+Menu::Menu(const char* menuName)
+{
+  this->init();
+  this->setTitle(menuName);
+}
+
+/** 
+    \brief Creates a Menu-Item-list out of multiple input.
+    !! Consider, that the last input argument has to be "lastItem" for this to work!!
+    \param menuname The Database-Name of this Menu
+    \param ... items to be added to this Menu. !! Consider, that the last input argument has to be "lastItem" for this to work!!
+*/
+Menu::Menu(char* menuname, ...)
+{
+  this->init();
+  this->setTitle(menuname);
+  va_list itemlist;                     //!< The list to readin multiple Options.
+
+  char *itemName;
+
+  va_start(itemlist, menuname);
+  while(strcmp(itemName = va_arg(itemlist, char*), "lastItem"))
+    {
+      this->addItem(itemName);
+    }
+  va_end(itemlist);
+}
+
+/**
+   \brief destructs a Menu.
+*/
+Menu::~Menu(void)
+{
+  PRINTF(5)("deleting the Menu: %s\n", this->title);
+  this->currItem = this->firstItem;
+  while(this->currItem)
+    {
+      delete []this->currItem->name;
+      //! \todo destroy menu
+      /*
+	#ifdef HAVE_GTK2
+	gtk_widget_destroy(this->currItem->item);
+	#endif /* HAVE_GTK2 */
+      MenuItem* tmpItem = this->currItem;
+      this->currItem = this->currItem->next;
+      delete tmpItem;
+    }
+}
+
+/**
+   \brief Initializes a new Menu with no items
+*/
+void Menu::init(void)
+{
+  this->optionType = GUI_INT;
+  this->firstItem = NULL;
+
+#ifdef HAVE_GTK2
+  this->widget = gtk_option_menu_new();
+  this->menu = gtk_menu_new();
+  gtk_option_menu_set_menu(GTK_OPTION_MENU(this->widget), menu);
+  this->connectSignal("changed", this->OptionChange);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief saves the Label of the Menu
+   \returns the name of the selected Menu-Item
+*/
+char* Menu::save(void)
+{
+  MenuItem* tmpItem = this->firstItem;
+  for (int i = 0; i<this->value; i++)
+    tmpItem = tmpItem->next;
+      
+  return tmpItem->name;
+}
+
+/**
+   \brief loads a Menu from of its loadString
+   \param loadString the string from which to load the data from
+*/
+void Menu::load(char* loadString)
+{
+  MenuItem* tmpItem = firstItem;
+  bool foundItem = false;
+  while (tmpItem)
+    {
+      if (!strcmp(loadString, tmpItem->name))
+	{foundItem = true; break;}
+      tmpItem = tmpItem->next;
+    }
+  if (foundItem)
+    this->value = tmpItem->itemNumber;
+  else
+    {
+      this->value = 0;
+      PRINTF(2)("%s has not been found in the Itemlist of %s\n", loadString, this->title);
+    }
+  PRINTF(5)( "Loading %s: setting to %d\n", this->title, this->value); 
+  this->redraw();
+}
+
+/**
+   \brief appends a new Item to the Menu-List.
+   \param itemName the itemName to be appendet.
+*/
+void Menu::addItem(char* itemName)
+{
+  if (!this->firstItem)
+    {
+      this->firstItem = this->currItem = new MenuItem;
+      this->currItem->itemNumber = 0;
+    }
+  else
+    {
+      int tmpI = this->currItem->itemNumber;
+      this->currItem = this->currItem->next = new MenuItem;
+      this->currItem->itemNumber = tmpI+1;
+    }
+
+  this->currItem->name = new char[strlen(itemName)+1];
+  strcpy(this->currItem->name, itemName);
+
+#ifdef HAVE_GTK2
+  this->currItem->item = gtk_menu_item_new_with_label(itemName);
+  gtk_menu_shell_append(GTK_MENU_SHELL(this->menu), this->currItem->item);
+#endif /* HAVE_GTK2 */
+  this->currItem->next = NULL;
+}
+
+/**
+   \brief Redraws the widget
+   Example: see void CheckButton::redraw(void)
+*/
+void Menu::redraw(void)
+{
+#ifdef HAVE_GTK2
+  gtk_option_menu_set_history(GTK_OPTION_MENU(this->widget), this->value);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Changed the Option, call this Function
+*/
+void Menu::changeOption(void)
+{
+#ifdef HAVE_GTK2
+  this->value =(int)gtk_option_menu_get_history(GTK_OPTION_MENU(this->widget));
+#else /* HAVE_GTK2 */
+  char tmpChar[20];
+  PRINT(0)("\nPlease give me a new value for %s (default: %d): ", this->title, this->defaultValue);
+  scanf("%s",tmpChar);
+  this->value = atoi(tmpChar);
+
+#endif /* HAVE_GTK2 */
+  PRINT(5)("%s set to: %d\n", this->title, this->value);
+}
+
+/* OPTION LABEL */
+
+/**
+   \brief Creates a new OptionLabel with a LabelName and a Value.
+   \param label The name of the OptionLabel.
+   \param value The Value of the OptionLabel(what will be displayed).
+*/
+OptionLabel::OptionLabel(const char* label, const char* value)
+{
+  this->optionType = GUI_CHAR_ARRAY;
+  cValue = NULL;
+
+#ifdef HAVE_GTK2
+  this->widget = gtk_label_new("");
+#endif /* HAVE_GTK2 */
+
+  this->setTitle(label);
+  this->setValue(value);
+}
+
+/**
+   \brief destructs an OptionLabel.
+*/
+OptionLabel::~OptionLabel(void)
+{
+  PRINTF(5)("deleting the OptionLabel: %s\n", this->title);
+  if (this->cValue)
+    delete []this->cValue;
+}
+
+/**
+   \brief Updates the value of an OptionLabel
+   \param newValue The new Name that should be displayed.
+*/
+void OptionLabel::setValue(const char* newValue)
+{
+  if (this->cValue)
+    delete []this->cValue;
+  this->cValue = new char [strlen(newValue)+1];
+  strcpy(this->cValue, newValue);
+
+  this->redraw();
+}
+
+/**
+   \brief Redraws an OptionLabel(not implemented yet, but it works).
+*/
+void OptionLabel::redraw(void)
+{
+#ifdef HAVE_GTK2
+  gtk_label_set_text(GTK_LABEL(widget), cValue);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Changed the Option, call this Function
+*/
+void OptionLabel::changeOption(void)
+{
+#ifdef HAVE_GTK2
+  this->cValue = (char*)gtk_label_get_text(GTK_LABEL(this->widget));
+#else /* HAVE_GTK2 */
+  PRINT(0)("\nPlease give me a new input for %s: ", this->title);
+  char tmpChar[100];
+  scanf("%s",tmpChar);
+  this->setValue(tmpChar);
+#endif /* HAVE_GTK2 */
+  PRINT(4)("%s set to: %s\n", this->title,  this->cValue);
+}
+
+
+/**
+   \brief creates the Optionlabel save-string
+   \returns the String to save.
+*/
+char* OptionLabel::save(void)
+{
+  return cValue;
+}
+
+/**
+   \brief loads an Option from of its loadString
+   \param loadString the string from which to load the data from
+*/
+void OptionLabel::load(char* loadString)
+{
+  PRINTF(5)("Loading %s: setting to %s\n", this->title, loadString); 
+  this->setValue(loadString);
+}
+
+///////////
+/* LABEL */
+///////////
+/**
+   \brief Creates a new Label with a Text.
+   \param text The text to be displayed.
+*/
+Label:: Label(const char* text)
+{
+  this->optionType = GUI_NOTHING;
+  
+#ifdef HAVE_GTK2
+  this->widget = gtk_label_new("");
+  gtk_label_set_line_wrap(GTK_LABEL(this->widget), TRUE);
+#endif /* HAVE_GTK2 */
+  
+  if (text)
+    this->setTitle(text);
+}
+
+/**
+   \brief destructs a Label.
+*/
+Label::~Label(void)
+{
+  PRINTF(5)("deleting the Label: %s\n", this->title);
+}
+
+/**
+   \brief Sets a new Text to a Label.
+   \param text The text to be inserted into the Label.
+*/
+void Label::setTitle(const char* text)
+{
+  if (this->title)
+    delete []this->title;
+  this->title = new char[strlen(text)+1];
+  strcpy(this->title, text);
+#ifdef HAVE_GTK2
+  gtk_label_set_text(GTK_LABEL(this->widget), this->title);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief ereases the Text of a Label
+*/
+void Label::ereaseText(void)
+{
+  this->setTitle("");
+}
+
+/** 
+    \brief appends some Text to a Label
+    \param textToAppend The text that will be appended to this Label
+*/
+void Label::appendText(char* textToAppend)
+{
+  if (this->title)
+    {
+      char* tmpTitle = new char[strlen(this->title)+strlen(textToAppend)+1];
+      strcpy(tmpTitle, title);  
+      strcat(tmpTitle, textToAppend);
+      delete []this->title;
+      this->title = tmpTitle;
+    }
+  else
+    this->title = new char[strlen(textToAppend)];
+  
+#ifdef HAVE_GTK2
+  gtk_label_set_text(GTK_LABEL(this->widget), title);
+#endif /* HAVE_GTK2 */
+}
+
+/** 
+    \brief Appends some integer to the Label
+    \param intToAppend The Int that will be added.
+    
+    it does this by just converting the int into a char* and send it to appendText
+*/
+void Label::appendInt(int intToAppend)
+{
+  char append [32];
+  sprintf(append, "%d", intToAppend);
+  this->appendText(append);
+}
+
+
+/**
+   \brief get the Text of a Label
+   \return The Text the Label holds.
+*/
+const char* Label::getText(void)
+{
+  return this->title;
+}
+
+//////////////////
+/* PROGRESS-BAR */
+//////////////////
+/**
+   \brief Creates a new ProgressBar.
+   \param label The name you want to get the ProgressBar.
+*/
+ProgressBar::ProgressBar(const char* label)
+{
+  this->optionType = GUI_NOTHING;
+  this->progress = 0.0;
+  this->totalSize = 0.0;
+
+#ifdef HAVE_GTK2
+  this->adjustment =(GtkAdjustment*)gtk_adjustment_new(0, 0, 100, 0, 0, 0);
+  this->widget = gtk_progress_bar_new_with_adjustment(this->adjustment);
+#endif /* HAVE_GTK2 */
+
+  if (label)
+    this->setTitle(label);
+}
+
+/**
+   \brief destructs a ProgressBar
+*/
+ProgressBar::~ProgressBar(void)
+{
+  PRINTF(5)("deleting the ProgressBar: %s\n", this->title);
+}
+
+/**
+   \brief Sets the Total size of the Bar.(ex. The maximum one can download)
+*/
+void ProgressBar::setTotalSize(double totalSize)
+{
+  this->totalSize = totalSize;
+}
+
+/**
+   \brief Sets the progress maximum is this->totalSize
+*/
+void ProgressBar::setProgress(double progress)
+{
+  this->progress = progress;
+
+  if (this->progress > this->totalSize)
+    this->progress = this->totalSize;
+
+#ifdef HAVE_GTK2
+  gtk_progress_set_value(GTK_PROGRESS(widget), this->progress*100.0/this->totalSize);
+  PRINTF(5)("Progress: %f%%\n", this->progress*100.0/this->totalSize);
+#else /* HVE_GTK2 */
+  PRINT(0)("Progress: %f%%\n", this->progress*100.0/this->totalSize);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+    \brief returns the Progress Status
+*/
+double ProgressBar::getProgress(void)
+{
+  return this->progress;
+}
+
+///////////
+/* IMAGE */
+///////////
+/**
+   \brief Creates a new Image
+   \param imageName the location of the Image on the Hard Disc
+*/
+Image::Image(const char* imageName)
+{
+  this->init(imageName);
+
+#ifdef HAVE_GTK2
+  widget = gtk_image_new_from_file(imageName);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief Creates a new Image
+   \param imageData data to the PixBuff
+*/
+Image::Image(char** imageData)
+{
+  this->init("pixBuffImage");
+
+#ifdef HAVE_GTK2
+  widget = gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_xpm_data((const char**)imageData));
+#endif /* HAVE_GTK2 */
+}
+
+
+/**
+   \brief destructs an Image.
+*/
+Image::~Image(void)
+{
+  PRINTF(5)("deleting the Image: %s\n", this->title);
+}
+
+/** 
+    \brief Initializes a new Image
+    \param name the name to set to the Image
+*/
+void Image::init(const char* name)
+{
+  optionType = GUI_NOTHING;
+
+  if (this->title)
+    delete []this->title;
+  this->title = new char[strlen(name)+1];
+  strcpy(this->title, name);
+}
+
+
+/////////////////
+/* FILE DIALOG */
+/////////////////
+/**
+   \brief Creates a new FileDialog
+   \param fileDialogName a Name for the Dialog
+*/
+FileDialog::FileDialog(const char* fileDialogName)
+{
+  this->optionType = GUI_NOTHING;
+  this->isOpen = false;
+  this->changeOption = NULL;
+  this->openUpButton = NULL;
+  this->okObject = NULL;
+  this->okFunc = NULL;
+
+#ifdef HAVE_GTK2
+  this->widget = gtk_file_selection_new(fileDialogName);
+
+  gtk_file_selection_set_select_multiple(GTK_FILE_SELECTION (this->widget), FALSE);
+
+  g_signal_connect(GTK_FILE_SELECTION (this->widget)->cancel_button,
+                     "button_release_event",
+                     G_CALLBACK (FileDialog::dialogClose),
+                     this);
+  g_signal_connect(GTK_FILE_SELECTION (this->widget),
+                     "delete_event",
+                     G_CALLBACK (FileDialog::dialogClose),
+                     this);
+  g_signal_connect(GTK_FILE_SELECTION (this->widget)->ok_button,
+                     "button_release_event",
+                     G_CALLBACK (FileDialog::dialogOK),
+                     this);
+#endif /* HAVE_GTK2 */
+  if (fileDialogName)
+    this->setTitle(fileDialogName);
+}
+
+/**
+   \brief destructs a FileDialog
+*/
+FileDialog::~FileDialog(void)
+{
+  PRINTF(5)("deleting FileDialog %s\n", this->title);
+}
+
+void FileDialog::setChangeOption(OptionLabel* changeOption)
+{
+  this->changeOption = changeOption;
+}
+
+void FileDialog::setOKFunc(void* okObject, bool(*function)(const char* , void*))
+{
+  this->okObject = okObject;
+  this->okFunc = function;
+}
+
+
+void FileDialog::setOpenUpButton(Button* openUpButton)
+{
+  this->openUpButton = openUpButton;
+
+  openUpButton->connectSignal("button_release_event", this, FileDialog::dialogOpen);
+}
+
+
+void FileDialog::setDefaultFileName(const char* defaultFileName)
+{
+#ifdef HAVE_GTK2
+  gtk_file_selection_set_filename (GTK_FILE_SELECTION(this->widget), defaultFileName);
+#endif /* HAVE_GTK2 */
+}
+
+void FileDialog::setMask(const char* mask)
+{
+#ifdef HAVE_GTK2
+  gtk_file_selection_complete(GTK_FILE_SELECTION(this->widget), mask);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief disables the File Operator Buttons
+*/
+void FileDialog::disableFileOpts(void)
+{
+#ifdef HAVE_GTK2
+  gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(this->widget));
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \brief The ok-button has been pressed
+*/
+void FileDialog::okEvent(void)
+{
+  if (this->okFunc)
+    {
+#ifdef HAVE_GTK2
+      if(this->okFunc((const char*)gtk_file_selection_get_filename(GTK_FILE_SELECTION(this->widget)), this->okObject))
+	 this->close();
+#endif /* HAVE_GTK2 */
+    }
+  else if (this->changeOption)
+    {
+#ifdef HAVE_GTK2
+      changeOption->setValue(gtk_file_selection_get_filename(GTK_FILE_SELECTION(this->widget)));
+#endif /* HAVE_GTK2 */
+      this->close();
+    }
+  else
+    this->close();
+}
+
+/**
+   \biref opens up the FileDialog-Window
+*/
+void FileDialog::open(void)
+{
+  isOpen = true;
+#ifdef HAVE_GTK2
+  gtk_widget_show_all(this->widget);
+  gtk_grab_add(this->widget);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \closes the FileDialog-Window
+*/
+void FileDialog::close(void)
+{
+  this->isOpen = false;
+#ifdef HAVE_GTK2
+  gtk_grab_remove(this->widget);
+  gtk_widget_hide(this->widget);
+#endif /* HAVE_GTK2 */
+}
+
+#ifdef HAVE_GTK2
+gint FileDialog::dialogOK(GtkWidget* widget, GdkEvent* event, void* dialog)
+{
+  static_cast<FileDialog*>(dialog)->okEvent();
+}
+#else /* HAVE_GTK2 */
+int FileDialog::dialogOK(void* widget, void* event, void* dialog){}
+#endif /* HAVE_GTK2 */
+
+#ifdef HAVE_GTK2
+gint FileDialog::dialogOpen(GtkWidget* widget, GdkEvent* event, void* dialog)
+{
+  static_cast<FileDialog*>(dialog)->open();
+}
+#else /* HAVE_GTK2 */
+int FileDialog::dialogOpen(void* widget, void* event, void* dialog){}
+#endif /* HAVE_GTK2 */
+
+#ifdef HAVE_GTK2
+gint FileDialog::dialogClose(GtkWidget* widget, GdkEvent* event, void* dialog)
+{
+  static_cast<FileDialog*>(dialog)->close();
+}
+#else /* HAVE_GTK2 */
+int FileDialog::dialogClose(void* widget, void* event, void* dialog){}
+#endif /* HAVE_GTK2 */
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_gtk.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_gtk.h	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_gtk.h	(revision 4194)
@@ -0,0 +1,461 @@
+/*!
+ \file gui_gtk.h
+ \brief Contains all th different Widgets.
+*/
+#ifndef _GUI_GTK_H
+#define _GUI_GTK_H
+
+#if HAVE_CONFIG_H 
+#include <config.h> 
+#endif
+
+#include "debug.h"
+#include "globals.h"
+
+#ifdef HAVE_GTK2
+#include <gtk/gtkmain.h>
+#include <gtk/gtkwindow.h>
+#include <gtk/gtkframe.h>
+#include <gtk/gtkhbox.h>
+#include <gtk/gtkvbox.h>
+#include <gtk/gtkbutton.h>
+#include <gtk/gtkcheckbutton.h>
+#include <gtk/gtkhscale.h>
+#include <gtk/gtkoptionmenu.h>
+#include <gtk/gtkmenu.h>
+#include <gtk/gtkmenuitem.h>
+#include <gtk/gtklabel.h>
+#include <gtk/gtkimage.h>
+#include <gtk/gtkeventbox.h>
+#include <gtk/gtkprogressbar.h>
+#include <gtk/gtkfilesel.h>
+#endif /* HAVE_GTK2 */
+
+// enumerator for different GuiOption-Types
+enum GUI_OPTION {GUI_BOX = -2,
+		 GUI_CONTAINER = -1,
+		 GUI_NOTHING = 0,
+		 GUI_BOOL = 1,
+		 GUI_INT = 2,
+		 GUI_FLOAT = 3,
+		 GUI_CHAR = 4,
+		 GUI_CHAR_ARRAY = 5};
+
+extern char* executable;
+
+bool initGUI(int argc, char* argv[]);
+bool mainloopGUI(void);
+
+//! This is the topmost object that can be displayed all others are derived from it.
+class Widget
+{
+ private:
+
+ public:
+  Widget(void);
+  virtual ~Widget(void);
+
+  void show(void);
+  void hide(void);
+  void setSize(int width, int height);
+
+  virtual void setTitle(const char* title);  //!< An abstract Function, that sets the title of Widgets.
+
+  Widget* findWidgetByName(char* name, unsigned int depth);
+  void walkThrough(void(*function)(Widget*), unsigned int depth);
+  void walkThrough(void(*function)(Widget*, void*), void* data, unsigned int depth);
+   static void listOptionsAndGroups(Widget* widget);
+   static void listOptions(Widget* widget);
+   static void listOptions(Widget* widget, void* data);
+   Widget* findOptionByNumber(int* number, unsigned int depth);
+   static void listGroups(Widget* widget);
+   static void listGroups(Widget* widget, void* data);
+   static void printHelp(Widget* widget);
+   Widget* findGroupByNumber(int* number, unsigned int depth);
+   static void setOptions(Widget* widget);
+   static void redrawOptions(Widget* widget);
+   static void flagCheck(Widget* widget, void* flagName);
+  
+#ifdef HAVE_GTK2
+  // Connection - Functions
+  gulong connectSignal(char* event, gint(*signal)(GtkWidget*, GdkEvent*, void* ));
+  gulong connectSignal(char* event, gint(*signal)(GtkWidget*, Widget* ));
+  gulong connectSignal(char* event, void* extObj, gint(*signal)(GtkWidget*, GdkEvent*, void* ));
+  gulong connectSignal(char* event, void* extObj, gint(*signal)(GtkWidget*, void* ));
+  gulong connectSignal(char* event, void* extObj, gint(*signal)(GtkWidget*, GdkEventKey*, void* ));
+  void disconnectSignal(gulong signalID);
+  // Signals
+  static gint doNothingSignal(GtkWidget* widget, GdkEvent* event, void* nothing);
+#else /* HAVE_GTK2 */
+  // Connection - Functions
+  unsigned long connectSignal(char* event, int(*signal)(void*, void*, void* )){};
+  unsigned long connectSignal(char* event, int(*signal)(void*, Widget* )){};
+  unsigned long connectSignal(char* event, void* extObj, int(*signal)(void*, void*, void* )){};
+  unsigned long connectSignal(char* event, void* extObj, int(*signal)(void*, void* )){};
+  void disconnectSignal(unsigned long signalID);
+  // Signals
+  static int doNothingSignal(void* widget, void* event, void* nothing);
+#endif /* HAVE_GTK2 */
+
+
+  Widget* next;                     //!< next always points to the next Widget in the list. Every Widget has a next one, or has NULL as next
+#ifdef HAVE_GTK2
+  GtkWidget* widget;                //!< widget is the gtk_widget that the specific Object Contains.
+#else /* HAVE_GTK2 */
+  void* widget;
+#endif /* HAVE_GTK2 */
+
+  GUI_OPTION optionType;            //!< The Type of the Widget.
+  char* title;                      //!< The name of the Widget. Some do display it, Options need it to save;
+};
+
+//! This is a Packer Object, which has the ability to Pack other Widgets into itself.
+class Packer : public Widget
+{
+ public:
+  Packer(void);
+  virtual ~Packer(void);
+
+  Widget* down;                      //!< this points to the Widget below this.
+  char* groupName;                   //!< For each Packer you can specify a Groupname under which the lowerWidgets will be saved.
+
+  void setGroupName(const char* name);
+  /** \returns the GroupName if existent NULL otherwise */
+  inline const char* getGroupName(void) const {return this->groupName;}
+
+
+  virtual void fill(Widget* lowerWidget) = 0; //!< An abstract function, that fills Packers.
+};
+
+//! This is a Container Class, it can contain one sub-Widget: down.
+/**
+ * A Container is a Widget that can hold a subWidget in addition to a next-Widget.
+ * The Container can by itself not be displayed created or used.
+ * The derived classes of Container can be displayed
+*/
+class Container : public Packer
+{
+ private:
+  int borderwidth;          //!< The width of The Container Boarder.
+  int policy;               //!< The Update Policy of a Container.
+  
+ public:
+  Container(void);
+  virtual ~Container(void);
+
+  void setBorderWidth(int borderwidth);
+  void fill(Widget* lowerWidget);
+};
+
+//! Window is the class that creates new Windows, and handels them
+/**
+ * A Window is a class derived from Container that contains a window-widget.
+ * It has the ability to hold one sub-object
+ */
+class Window : public Container
+{
+ private:
+  bool isOpen;                      //!< A bool Variable that checks if a Window is already open.
+ public:
+  static Window* mainWindow;        //!< Pointer to the First Window that was opened. By default this should be the GUI's main-Window.
+  static void addWindow(Window* windowToAdd);
+
+  Window(const char* windowName = NULL);
+  virtual ~Window(void);
+  
+  virtual void setTitle(const char* title);
+  void showall(void);
+  void open(void);
+  void close(void);
+
+#ifdef HAVE_GTK2
+  // Signals
+  static gint windowOpen(GtkWidget* widget, GdkEvent* event, void* window);
+  static gint windowClose(GtkWidget* widget, GdkEvent* event, void* window);
+#else /* HAVE_GTK2 */
+  int Window::windowOpen(void* widget, void* event, void* window);
+  int Window::windowClose(void* widget, void* event, void* window);
+#endif /* HAVE_GTK2 */
+};
+
+//! Frame is the class that handles frames
+/**
+ * A Frame is an object, that has a border and if you like a name on it.
+ * It can contain a Widget, which means that you can insert anything you like inside of a frame
+ */
+class Frame :public Container
+{
+ public:
+  Frame(const char* frameName = NULL);
+  virtual ~Frame(void);
+
+  virtual void setTitle(const char* title);
+};
+
+//! EventBox is a Container that can Handle all Events happening inside of it.
+/**
+ * Example: if you have a picture, and you want it to catch mouse-clicks, you have to pack it inside a EventBox
+ */
+class EventBox : public Container
+{
+ public:
+  EventBox(const char* eventBoxName = NULL);
+  virtual ~EventBox(void);
+};
+
+//! A Box can contain multiple Widgets
+/**
+   A Box can Contain multiple Widgets, that are ordered either horizontally or vertically
+   I defined the standartbox to be horizontally.
+   A Box is always filled left->right(horizontally) or up->down(vertically)
+*/
+class Box : public Packer
+{
+ public:
+  Box(char boxtype = 'h');
+  virtual ~Box(void);
+  
+  virtual void fill(Widget* lowerWidget);
+};
+
+//! An Option is a Widget that contains something that may change its state.
+/**
+ * Options are the essence of a GUI, they: Configure, Start, Quit, Execute, and make it worth something
+ */
+class Option : public Widget
+{
+ protected:
+  bool saveable;              //!< Options can be Saved.
+  
+ public:
+  Option(void);
+  virtual ~Option(void);
+
+  int value;                  //!< every option has a value either true or false(0,1) or something else like 25 for 25% of the volume
+  char* flagName;             //!< options have a flag name that will be appendet if you start the Program from the GUI.
+  char* flagNameShort;        //!< like flag_name but shorter
+  int defaultValue;           //!< A default value is good, for hiding a option if it is not needed.(hidden if value == default_value)
+
+  char* shortDescription;      //!< A Text that describes this option in short
+  char* longDescription;      //!< A Longer Text describing this option in a full way
+
+  void saveability(bool isSaveable = true);
+  virtual char* save(void);
+  virtual void load(char* loadString);
+
+  bool isSaveable(void);
+  void setDefaultValue(int defaultValue);
+  void setFlagName(const char* flagname, int defaultvalue);
+  void setFlagName(const char* flagname, const char* flagnameshort, int defaultvalue);
+  void setDescription(const char* shortDescription, const char* longDescription = NULL);
+
+  virtual void redraw(void) = 0;       //!< A Option must be able to redraw itself.
+  virtual void changeOption(void) = 0; //!< What to do, if an Option is Changed. eacht option decides for itself.
+#ifdef HAVE_GTK2
+    // Signals  
+  static gint OptionChange(GtkWidget* widget, Widget* option); //!< Signal for Options that change.
+#endif /* HAVE_GTK2 */
+};
+
+//! Buttons can be pressed, and released.
+/**
+ * Buttons are mainly there for executing some action like Starting the Programm, or Quiting it.
+ */
+class Button : public Option 
+{
+ public:
+  Button(const char* buttonName = NULL);
+  virtual ~Button(void);
+
+  virtual void setTitle(const char* title);
+  virtual void redraw(void);
+  virtual void changeOption(void);
+};
+
+//! CheckButtons are a key in configuring bool Variables
+/** CheckButtons can configure bool Variables like wireframe on/off, enable_sound etc.
+ */
+class CheckButton : public Option
+{
+ public:
+  CheckButton(const char* buttonName = NULL);
+  virtual ~CheckButton(void);
+
+  bool isActive(void);
+
+  virtual void setTitle(const char* title);
+  virtual void redraw(void);
+  virtual void changeOption(void);
+};
+
+//! Sliders are Options that can be modified in their value
+/**
+ * good for volume, brightness, etc.
+ */
+class Slider : public Option
+{
+ private:
+  int start;                            //!< The beginning of the Slider-range.
+  int end;                              //!< The end of the Slider-range.
+ public:
+  Slider(const char* slidername, int start, int end);
+  virtual ~Slider(void);
+
+  void setValue(int value);
+  virtual void redraw(void);
+  virtual void changeOption(void);
+};
+
+//! A Menu is an Option that has a dropdown menu, where you can chose between different Items
+class Menu : public Option
+{
+ private:
+#ifdef HAVE_GTK2
+  GtkWidget* menu;                      //!< The menu That will hold the Options.
+#endif /* HAVE_GTK2 */
+
+  //! A struct to handle the MenuItems
+  struct MenuItem
+  {
+    char* name;                         //!< The name of this entry.
+    int itemNumber;                     //!< The n'th entry of this menu;
+#ifdef HAVE_GTK2
+    GtkWidget* item;                    //!< One Item From a Menu.
+#endif /* HAVE_GTK2 */
+
+    MenuItem* next;                     //!< Pointer to the next MenuItem.
+  };
+  MenuItem* firstItem;                  //!< Pointer to the first Item.
+  MenuItem* currItem;                   //!< Pointer to the current Item.
+  
+ public:
+  Menu(const char* menuName);
+  Menu(char* menuname, ...);
+  virtual ~Menu(void);
+  void init(void);
+
+  virtual char* save(void);
+  virtual void load(char* loadString);
+  
+  void addItem(char* itemName);
+  virtual void redraw(void);
+  virtual void changeOption(void);
+};
+
+//! A OptionLabel is a simple Label, that holds a char*, and will be updated, if changed.
+class OptionLabel : public Option
+{
+ public:
+  OptionLabel(const char* label, const char* value);
+  virtual ~OptionLabel(void);
+  
+  void setValue(const char* newValue);
+
+  virtual char* save(void);
+  virtual void load(char* loadString);
+
+  virtual void redraw(void);
+  virtual void changeOption(void);
+
+  char* cValue;                          //!< The Value the Label will have. \todo make private
+};
+
+//! A EntryField is a TextEntry field, for putting some text into.
+class EntryField : public Option
+{
+ public:
+  EntryField(const char* name = NULL);
+  virtual ~EntryField(void);
+  
+  void setValue(const char* newValue);
+  virtual char* save(void);
+  virtual void load(char* loadString);
+  
+  virtual void redraw(void);
+  virtual void changeOption(void);
+};
+
+//! A label is a Widget, that displays a text
+class Label : public Widget
+{
+ public:
+  Label(const char* text = NULL);
+  virtual ~Label(void);
+  
+  virtual void setTitle(const char* text);
+  void ereaseText(void);
+  void appendText(char* textToAppend);
+  void appendInt(int intToAppend);
+  const char* getText(void);
+};
+
+//! A ProgressBar is a Widget, that can display a Progress
+class ProgressBar : public Widget
+{
+ public:
+  ProgressBar(const char* label = NULL);
+  virtual ~ProgressBar(void);
+
+  void setProgress(double progress);
+  void setTotalSize(double totalSize);
+  double getProgress(void);
+
+ private:
+  double totalSize;         //!< The total Size of a download Bar
+  double progress;          //!< The progress of a Bar.
+#ifdef HAVE_GTK2
+  GtkAdjustment* adjustment;
+#endif /* HAVE_GTK2 */
+};
+
+//! Image is the keeper of one Image 
+/** 
+ * Images are mighty cool.
+ * Images can help you lighten up the Programming process, and will give everyone a better impression of the Software.
+ */
+class Image : public Widget
+{
+ public:
+  Image(const char* imgaeName);
+  Image(char** imageData);
+  virtual ~Image(void);
+  void init(const char* name);
+};
+
+//! A FileDialog is a window with wich one can select a File
+class FileDialog : public Widget
+{
+ private:
+  OptionLabel* changeOption;
+  Button* openUpButton;
+  bool isOpen;
+  bool (*okFunc)(const char* , void*);
+  void* okObject;
+
+ public:
+  FileDialog(const char* fileDialogName);
+  virtual ~FileDialog(void);
+
+  void setChangeOption(OptionLabel* changeOption);
+  void setOKFunc(void* okObject, bool(*function)(const char* , void*));
+  void setOpenUpButton(Button* openUpButton);
+  void setDefaultFileName(const char* defaultFileName);
+  void setMask(const char* mask);
+  void disableFileOpts(void);
+
+  void okEvent();
+  void open();
+  void close();
+
+#ifdef HAVE_GTK2
+  static gint dialogOK(GtkWidget* widget, GdkEvent* event, void* dialog);
+  static gint dialogOpen(GtkWidget* widget, GdkEvent* event, void* dialog);
+  static gint dialogClose(GtkWidget* widget, GdkEvent* event, void* dialog);
+#else /* HAVE_GTK2 */
+  static int dialogOK(void* widget, void* event, void* dialog);
+  static int dialogOpen(void* widget, void* event, void* dialog);
+  static int dialogClose(void* widget, void* event, void* dialog);
+#endif /* HAVE_GTK2 */
+};
+
+#endif /* _GUI_GTK_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_keys.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_keys.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_keys.cc	(revision 4194)
@@ -0,0 +1,439 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+#include "gui_keys.h"
+
+#include <string.h>
+
+/**
+   \brief Creates an Keyboard-Frame
+*/
+GuiKeys::GuiKeys(void)
+{
+  Frame* keysFrame;      //!< The Frame that holds the keyOptions.
+
+  keysFrame = new Frame("Keyboard-Options:");
+  {
+    Box* keysBox0;          //!< The Frame that holds the keyOptions.
+    
+    //  keysFrame->setGroupName("Keyboard");
+    keysBox0 = new Box('v');
+    {
+      Box* keysBox1;
+      MiscKeys* misc;            //!< The Misc Keys
+
+      keysBox1 = new Box('h');
+      {
+	PlayerKeys* player1;       //!< The first Player's keys.
+	PlayerKeys* player2;       //!< The seconds Player's keys.
+	
+	player1 = new PlayerKeys(CONFIG_SECTION_PLAYER "1");
+	player2 = new PlayerKeys(CONFIG_SECTION_PLAYER "2");
+	
+	keysBox1->fill(player1->getOpenButton());
+	keysBox1->fill(player2->getOpenButton());
+      }
+      keysBox0->fill(keysBox1);
+
+      misc = new MiscKeys();
+      keysBox0->fill(misc->getOpenButton());
+    }
+    keysFrame->fill(keysBox0);
+  }
+  
+  // setting up the Input Windows that receives keystrokes.
+  this->inputWindow = new Window("inputWindow");
+  this->inputButton = new Button("test");
+#ifdef HAVE_GTK2
+  this->inputWindow->connectSignal("destroy",  Widget::doNothingSignal);
+  this->inputWindow->connectSignal("delete_event", Widget::doNothingSignal);
+#endif /* HAVE_GTK2 */
+  this->inputWindow->fill(inputButton);
+  
+  this->setMainWidget(keysFrame);
+}
+
+/**
+   \brief Destructs the Keys-stuff
+*/
+GuiKeys::~GuiKeys(void)
+{
+  // nothing to do here.
+}
+
+
+Window* GuiKeys::inputWindow = NULL;
+Button* GuiKeys::inputButton = NULL;
+long GuiKeys::keySignal = 0;
+
+////////////
+/* PLAYER */
+////////////
+/**
+   \brief Creates new inputs for a player
+   \param player the name of the Player
+*/
+PlayerKeys::PlayerKeys(char* player)
+{
+  Window* pKeyWindow;     //!< The Window for a new Key-setting.
+
+  char* windowName = new char[strlen(player)+12];
+  strcpy(windowName, "KeySets: ");
+  strcat(windowName, player);
+  pKeyWindow = new Window(windowName);
+  {
+    Frame* pKeyFrame;       //!< The Frame for a new Key-setting.
+
+    pKeyFrame = new Frame(windowName);
+    {
+      Box* pKeysBox;          //!< The Box that holds the Key-settings.
+      pKeysBox = new Box('v');
+      {
+	Button* closeButton;    //!< The CloseButton for this key-settings.
+
+	pKeysBox->setGroupName(player);
+	pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_UP, "UP"));
+	pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_DOWN, "DOWN"));
+	pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_LEFT, "LEFT"));
+	pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_RIGHT, "RIGHT"));
+	pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_FIRE, "SPACE"));
+	pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_NEXT_WEAPON, "m"));
+	pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_PREV_WEAPON, "n"));
+	closeButton = new Button("close");
+#ifdef HAVE_GTK2
+	closeButton->connectSignal("button_press_event", pKeyWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+
+	pKeysBox->fill(closeButton);
+      }
+      pKeyFrame->fill(pKeysBox);
+    }
+    pKeyWindow->fill(pKeyFrame);
+  }
+  delete windowName;
+  Window::addWindow(pKeyWindow);
+#ifdef HAVE_GTK2
+  pKeyWindow->connectSignal("destroy", pKeyWindow, Window::windowClose);
+  pKeyWindow->connectSignal("delete_event", pKeyWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+  
+  this->openButton = new Button(player);
+#ifdef HAVE_GTK2
+  this->openButton->connectSignal("button_press_event", pKeyWindow, Window::windowOpen);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \returns the OpenButton of a Player
+*/
+Button* PlayerKeys::getOpenButton(void)
+{
+  return this->openButton;
+}
+
+//////////////////
+/* MISC_OPTIONS */
+//////////////////
+/**
+   \brief Creates new inputs for a misc
+   \param player the name of the Misc
+*/
+MiscKeys::MiscKeys()
+{
+  Window* keyWindow;     //!< The Window for a new Key-setting.
+
+  keyWindow = new Window("misc Keys");
+  {
+    Frame* keyFrame;       //!< The Frame for a new Key-setting.
+
+    keyFrame = new Frame("misc Keys:");
+    {
+      Box* keysBox;          //!< The Box that holds the Key-settings.
+      keysBox = new Box('v');
+      {
+	Button* closeButton;    //!< The CloseButton for this key-settings.
+
+	keysBox->setGroupName(CONFIG_SECTION_MISC_KEYS);
+	keysBox->fill(addKey(CONFIG_NAME_QUIT , "ESCAPE"));
+	keysBox->fill(addKey(CONFIG_NAME_PAUSE, "PAUSE"));
+	keysBox->fill(addKey(CONFIG_NAME_NEXT_WORLD, "x"));
+	keysBox->fill(addKey(CONFIG_NAME_PREV_WORLD, "z"));
+	keysBox->fill(addKey(CONFIG_NAME_VIEW0, "1"));
+	keysBox->fill(addKey(CONFIG_NAME_VIEW1, "2"));
+	keysBox->fill(addKey(CONFIG_NAME_VIEW2, "3"));
+	keysBox->fill(addKey(CONFIG_NAME_VIEW3, "4"));
+	keysBox->fill(addKey(CONFIG_NAME_VIEW4, "5"));
+	keysBox->fill(addKey(CONFIG_NAME_VIEW5, "6"));
+
+	closeButton = new Button("close");
+#ifdef HAVE_GTK2
+	closeButton->connectSignal("button_press_event", keyWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+
+	keysBox->fill(closeButton);
+      }
+      keyFrame->fill(keysBox);
+    }
+    keyWindow->fill(keyFrame);
+  }
+  Window::addWindow(keyWindow);
+#ifdef HAVE_GTK2
+  keyWindow->connectSignal("destroy", keyWindow, Window::windowClose);
+  keyWindow->connectSignal("delete_event", keyWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+  
+  this->openButton = new Button("misc");
+#ifdef HAVE_GTK2
+  this->openButton->connectSignal("button_press_event", keyWindow, Window::windowOpen);
+#endif /* HAVE_GTK2 */
+}
+
+/**
+   \returns the OpenButton of a Misc
+*/
+Button* MiscKeys::getOpenButton(void)
+{
+  return this->openButton;
+}
+
+
+/**
+   \brief adds a new Key.
+   \param key the number of the Key
+   \param name The name of the new Key.
+   \returns A widget that has the Key-Box
+*/
+Widget* addKey(const char* name, const char* defaultVal)
+{
+  InputKey* inputKey = new InputKey;
+  inputKey->keyBox = new Box();
+  inputKey->keyButton = new Button(name);
+  if (defaultVal)
+    inputKey->keyOLabel = new OptionLabel(name, defaultVal);
+  else
+    inputKey->keyOLabel = new OptionLabel(name, name);
+  inputKey->keyOLabel->saveability();
+
+#ifdef HAVE_GTK2
+  //inputKey->keyButton->connectSignal("key_press_event", inputKey->keyButton, key_cb);
+  inputKey->keyButton->connectSignal("button_press_event", inputKey, inputWindowEvent);
+#endif /* HAVE_GTK2 */
+  inputKey->keyBox->fill(inputKey->keyButton);
+  inputKey->keyBox->fill(inputKey->keyOLabel);
+  return inputKey->keyBox;
+}
+
+
+#ifdef HAVE_GTK2
+gint inputWindowEvent(GtkWidget* w, GdkEventKey* event, void* inputKey)
+{
+  GuiKeys::inputButton->setTitle("press a Key");
+  GuiKeys::keySignal = GuiKeys::inputButton->connectSignal("key_press_event", inputKey, key_cb);
+  GuiKeys::inputWindow->open();
+}
+  
+/**
+   \brief Function which gets keystrokes
+   \param w the widget that released the Function.
+   \param event The event that happened.
+   \param Widget the Widget which will be applied.
+   \returns Nothing
+*/
+gint key_cb(GtkWidget* w, GdkEventKey* event, void* inputKey)
+{
+  InputKey* inputkey =(InputKey*) inputKey;
+  char title [50];
+
+  switch(event->keyval)
+    {
+    case GDK_Up:
+      strcpy(title, "UP");
+      break;
+    case GDK_Down:
+      strcpy(title, "DOWN");
+      break;
+    case GDK_Left:
+      strcpy(title, "LEFT");
+      break;
+    case GDK_Right:
+      strcpy(title, "RIGHT");
+      break;
+      
+    case GDK_space:
+      strcpy(title, "SPACE");
+      break;
+      
+    case GDK_Return:
+      strcpy(title, "RETURN");
+      break;
+      
+      // Special Keys //
+    case GDK_BackSpace:
+      strcpy(title, "BACKSPACE");
+      break;
+    case GDK_Scroll_Lock:
+      strcpy(title, "SCROLLOCK");
+      break;
+    case GDK_minus:
+      strcpy(title, "MINUS");
+      break;
+    case GDK_plus:
+      strcpy(title, "PLUS");
+      break;
+    case GDK_slash:
+      strcpy(title, "SLASH");
+      break;
+    case GDK_period:
+      strcpy(title, "PERIOD");
+      break;
+    case GDK_comma:
+      strcpy(title, "COMMA");
+      break;
+    case GDK_colon:
+      strcpy(title, "COLON");
+      break;
+    case GDK_semicolon:
+      strcpy(title, "SEMICOLON");
+      break;
+    case GDK_less:
+      strcpy(title, "LESS");
+      break;
+    case GDK_equal:
+      strcpy(title, "EQUALS");
+      break;
+    case GDK_greater:
+      strcpy(title, "GREATER");
+      break;
+    case GDK_question:
+      strcpy(title, "QUESTION");
+      break;
+    case GDK_at:
+      strcpy(title, "AT");
+      break;
+    case GDK_bracketleft:
+      strcpy(title, "LEFTBRACKET");
+      break;
+    case GDK_bracketright:
+      strcpy(title, "RIGHTBRACKET");
+      break;
+    case GDK_backslash:
+      strcpy(title, "BACKSLASH");
+      break;
+    case GDK_underscore:
+      strcpy(title, "UNDERSCORE");
+      break;
+    case GDK_quoteleft:
+      strcpy(title, "BACKQUOTE");
+      break;
+
+    case GDK_Page_Up:
+      strcpy(title, "PAGEUP");
+      break;
+    case GDK_Page_Down:
+      strcpy(title, "PAGEDOWN");
+      break;
+    case GDK_Home:
+      strcpy(title, "HOME");
+      break;
+    case GDK_Insert:
+      strcpy(title, "INSERT");
+      break;
+      
+    case GDK_Escape:
+      strcpy(title, "ESCAPE");
+      break;
+    case GDK_Tab:
+      strcpy(title, "TAB");
+      break;
+    case GDK_Shift_L:
+      strcpy(title, "LSHIFT");
+      break;
+    case GDK_Shift_R:
+      strcpy(title, "R_SHIFT");
+      break;
+    case GDK_Control_L:
+      strcpy(title, "LCTRL");
+      break;
+    case GDK_Control_R:
+      strcpy(title, "RCTRL");
+      break;
+    case GDK_Alt_L:
+      strcpy(title, "LALT");
+      break;
+    case GDK_Alt_R:
+      strcpy(title, "RALT");
+      break;
+      // FXX KEYS //
+    case GDK_F1:
+      strcpy(title, "F1");
+      break;
+    case GDK_F2:
+      strcpy(title, "F2");
+      break;
+    case GDK_F3:
+      strcpy(title, "F3");
+      break;
+    case GDK_F4:
+      strcpy(title, "F4");
+      break;
+    case GDK_F5:
+      strcpy(title, "F5");
+      break;
+    case GDK_F6:
+      strcpy(title, "F6");
+      break;
+    case GDK_F7:
+      strcpy(title, "F7");
+      break;
+    case GDK_F8:
+      strcpy(title, "F8");
+      break;
+    case GDK_F9:
+      strcpy(title, "F9");
+      break;
+    case GDK_F10:
+      strcpy(title, "F10");
+      break;
+    case GDK_F11:
+      strcpy(title, "F11");
+      break;
+    case GDK_F12:
+      strcpy(title, "F12");
+      break;
+      
+      
+    default:
+      char* tmp;
+      sprintf(tmp, "%c", event->keyval);
+      printf("other key %s \n", tmp);
+      strcpy(title, tmp);
+      break;
+    }
+
+  inputkey->keyOLabel->setValue(title);
+  GuiKeys::inputButton->disconnectSignal(GuiKeys::keySignal);
+  GuiKeys::inputWindow->close();
+}
+#endif /* HAVE_GTK2 */
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_keys.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_keys.h	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_keys.h	(revision 4194)
@@ -0,0 +1,67 @@
+/*!
+  \file gui_keys.h
+  \brief File that holds the class that creates the Keyboard-Options.
+*/
+
+#ifndef _GUI_KEYS_H
+#define _GUI_KEYS_H
+
+#include "gui.h"
+#include "gui_element.h"
+#include "gui_gtk.h"
+
+#ifdef HAVE_GTK2
+#include <gdk/gdkkeysyms.h>
+#endif /* HAVE_GTK2 */
+
+//! One KeyOption has one InputKey
+struct InputKey
+{
+  Box* keyBox;           //!< One Box that holds the Keys
+  Button* keyButton;     //!< The Button for changing the Key.
+  OptionLabel* keyOLabel;//!< The Label for displaying the Key-setting.
+};
+
+//! Class that creates the Keys-Options.
+class GuiKeys : public GuiElement
+{
+ public:
+  GuiKeys(void);
+  ~GuiKeys(void);
+
+  static Window* inputWindow; //!< A Window that gets keyboard clicks. Static, because only one needed.
+  static Button* inputButton; //!< A Button that gets keyboard clicks. Static, because only one needed.
+  static long keySignal;      //!< A keySignal that handles keyboard clicks. Static, because only one needed.
+};
+
+//! Class to hold infos about a Player
+class PlayerKeys
+{
+ private:
+  Button* openButton;     //!< The OpenButton for this key-settings.
+
+ public:
+  PlayerKeys(char* player);
+
+  Button* getOpenButton(void);
+};
+
+class MiscKeys
+{
+ private:
+  Button* openButton;     //!< The OpenButton for this key-settings.
+
+ public:
+  MiscKeys();
+
+  Button* getOpenButton(void);  
+};
+
+Widget* addKey(const char* name, const char* defaultValue = NULL);
+#ifdef HAVE_GTK2
+gint inputWindowEvent(GtkWidget* w, GdkEventKey* event, void* widget);
+gint key_cb(GtkWidget* w, GdkEventKey* event, void* inputKey);
+#endif /* HAVE_GTK2 */
+
+
+#endif /* _GUI_KEYS_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_main.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_main.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_main.cc	(revision 4194)
@@ -0,0 +1,34 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+#include "gui.h"
+
+int verbose = 4;
+
+int main(int argc, char *argv[])
+{
+  Gui* orxonoxgui = new Gui(argc, argv);
+  return 0;
+}
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_update.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_update.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_update.cc	(revision 4194)
@@ -0,0 +1,500 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+#include "gui_update.h"
+#include <string.h>
+
+#include "gui.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+using namespace std;
+
+/**
+   \brief Creates an Update-Frame
+*/
+GuiUpdate::GuiUpdate(void)
+{
+  FileDialog* dataDirDialog;   //!< A FileDialog for the selection of the DataRepos
+  Button* dataDirButton;       //!< A Button for the selection of the DataRepos
+  OptionLabel* dataDirLabel;   //!< A Label fot the selection of the DataRepos
+  
+
+  this->tmpDir = NULL;
+  this->homeDir = NULL;
+  this->installSourceDir = NULL;
+  this->userName = NULL;
+
+  this->getSystemInfo();
+
+  this->updateFrame = new Frame("Update-Options:");
+  this->updateFrame->setGroupName(CONFIG_SECTION_DATA);
+  this->updateBox = new Box('v');
+
+  dataDirButton = new Button(CONFIG_NAME_DATADIR);
+  dataDirLabel = new OptionLabel(CONFIG_NAME_DATADIR, "unknown");
+  dataDirLabel->setFlagName("data-dir", "d", 0);
+  dataDirLabel->setDescription("Sets the location of the orxonox' Data-Directory");
+  dataDirLabel->saveability();
+  dataDirDialog = new FileDialog("data-Repos-location");
+  dataDirDialog->setDefaultFileName("data");
+  dataDirDialog->setMask(DATA_IDENTIFIER);
+  this->checkDataDir("../data/" DATA_IDENTIFIER, dataDirLabel);
+  dataDirDialog->disableFileOpts();
+  dataDirDialog->setOpenUpButton(dataDirButton);
+  //dataDirDialog->setChangeOption(dataDirLabel);
+  dataDirDialog->setOKFunc(dataDirLabel, GuiUpdate::checkDataDir);
+  updateBox->fill(dataDirButton);
+  updateBox->fill(dataDirLabel);
+
+#ifdef HAVE_CURL
+
+  // the Button for autoUpdating
+  this->autoUpdate = new CheckButton(CONFIG_NAME_AUTO_UPDATE);
+  this->updateBox->fill(this->autoUpdate);
+  this->autoUpdate->setFlagName("update", "u", 0);
+  this->autoUpdate->setDescription("Updates orxonox", "When this option is selected orxonox automatically searches for updates, and if found installs them");
+  this->autoUpdate->saveability();
+
+  
+
+
+  this->updateSourceWindowCreate();
+  this->updateBox->fill(this->updateSourceWindowGetButton());
+
+  this->updateDataWindowCreate();
+  this->updateBox->fill(this->updateDataWindowGetButton());
+
+#else /* HAVE_CURL */
+  Label* noCurlLabel = new Label("since you do not have cURL-support,\nupdate options are not availible");
+  this->updateBox->fill(noCurlLabel);  
+#endif /* HAVE_CURL */
+  this->updateFrame->fill(this->updateBox);
+  this->setMainWidget(this->updateFrame);
+
+
+}
+
+/**
+   \brief Destructs the Update-stuff
+*/
+GuiUpdate::~GuiUpdate(void)
+{
+
+}
+
+/**
+   \brief checks if the Folder containing selected File is data.oxd, and if so sets it.
+   \param 
+*/
+bool GuiUpdate::checkDataDir(const char* fileName, void* object)
+{
+  if (!strcmp(fileName+(strlen(fileName)-strlen(DATA_IDENTIFIER)), DATA_IDENTIFIER))
+    {
+      char* tmpName = new char[strlen(fileName)-strlen(DATA_IDENTIFIER)+1];
+      strncpy(tmpName, fileName, strlen(fileName)-strlen(DATA_IDENTIFIER));
+      tmpName[strlen(fileName)-strlen(DATA_IDENTIFIER)] = '\0'; 
+      static_cast<OptionLabel*>(object)->setValue(tmpName);
+      delete tmpName;
+      return true;
+    }
+  else
+    return false;
+}
+
+
+/** 
+    \brief Look what info we can get from this system
+*/
+bool GuiUpdate::getSystemInfo(void)
+{
+  PRINTF(5)("Grabbing system information\n");
+  this->tmpDir = getenv("TMPDIR");
+  if(!tmpDir)
+    this->tmpDir = "/tmp";
+  PRINTF(5)("Temporary directory is: %s\n", this->tmpDir);
+
+#ifdef __WIN32__
+  this->homeDir = getenv("USERPROFILE");
+#else
+  this->homeDir = getenv("HOME");
+#endif
+  PRINTF(5)("Home directory is %s\n", homeDir);
+
+
+  this->installDataDir = DEFAULT_DATA_DIR;
+  PRINTF(5)("Installation of orxonox-data will go to this directory: %s\n", this->installDataDir);
+
+  this->installSourceDir = "/usr/games/bin";
+  PRINTF(5)("Installation of orxonox-source will go to this directory: %s\n", this->installSourceDir);
+
+  this->userName = getenv("USER");
+  PRINTF(5)("Logged in username is: %s\n", this->userName);
+}
+
+#ifdef HAVE_CURL
+bool* GuiUpdate::checkForUpdates(void)
+{
+  PRINTF(4)("checking for new version of orxonox\n");
+  FileInfo updateFileInfo;
+  updateFileInfo.fileName = "update_info";
+  updateFileInfo.webRoot = "http://www.orxonox.ethz.ch/files/data";
+  updateFileInfo.localRoot = this->tmpDir;
+  
+  download(&updateFileInfo);
+}
+
+/**
+   \brief Creates a window, and all it contains for the Data-update.
+*/
+void GuiUpdate::updateDataWindowCreate(void)
+{
+  this->updateDataWindow = new Window("update orxonox::Data");   
+  this->updateDataBox = new Box('v');
+
+  // the close-Button of the Update Window.
+  //  updateWindowClose = new Button("close");
+#ifdef HAVE_GTK2
+  //  updateWindowClose->connectSignal("button_press_event", updateWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+  //  updateWindowBox->fill(updateWindowClose);
+
+  this->updateDataBar = new ProgressBar();
+  this->updateDataBox->fill(this->updateDataBar);
+
+  FileInfo* dataInfo = new FileInfo;
+  dataInfo->bar = this->updateDataBar;
+
+  this->updateDataBegin = new Button("begin.");
+  dataInfo->stateButton = this->updateDataBegin;
+#ifdef HAVE_GTK2
+  dataInfo->buttonSignal = updateDataBegin->connectSignal("button_press_event", dataInfo, updateDataFunc);
+#endif /* HAVE_GTK2 */
+  this->updateDataBox->fill(this->updateDataBegin);
+
+  this->updateDataWindow->fill(this->updateDataBox);
+
+  this->updateDataWindowButton = new Button("update orxonox::Data");
+#ifdef HAVE_GTK2
+  this->updateDataWindowButton->connectSignal("button_press_event", this->updateDataWindow, Window::windowOpen);
+  this->updateDataWindow->connectSignal("destroy", this->updateDataWindow, Window::windowClose);
+  this->updateDataWindow->connectSignal("delete_event", this->updateDataWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+
+}
+
+/**
+   \returns A Pointer to the Button of the UpdaterDataWindow
+*/
+Button* GuiUpdate::updateDataWindowGetButton(void)
+{
+  return this->updateDataWindowButton;
+}
+
+/**
+   \brief Creates a window, and all it contains for the Source-update.
+*/
+void GuiUpdate::updateSourceWindowCreate(void)
+{
+  // the button, that opens this Window.
+  this->updateSourceWindowButton = new Button("update orxonox::Source");
+
+  // the Window itself
+  this->updateSourceWindow = new Window("update orxonox::Source");
+
+  this->updateSourceBox = new Box();
+
+  this->updateSourceBar = new ProgressBar();
+  this->updateSourceBox->fill(this->updateSourceBar);
+  test = new Button("increment");
+
+#ifdef HAVE_GTK2 
+  test->connectSignal("button_press_event", updateSourceBar, updateSourceFunc);
+#endif /* HAVE_GTK2 */
+
+  this->updateSourceBox->fill(test);
+  this->updateSourceWindow->fill(updateSourceBox); 
+#ifdef HAVE_GTK2 
+  this->updateSourceWindowButton->connectSignal("button_press_event", this->updateSourceWindow, Window::windowOpen);
+  this->updateSourceWindow->connectSignal("destroy", this->updateSourceWindow, Window::windowClose);
+  this->updateSourceWindow->connectSignal("delete_event", this->updateSourceWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+
+}
+
+/**
+   \returns A Pointer to the Button of the UpdaterSourceWindow
+*/
+Button* GuiUpdate::updateSourceWindowGetButton(void)
+{
+  return this->updateSourceWindowButton;
+}
+
+
+#ifdef HAVE_GTK2 
+/**
+   \brief updates the Data of orxonox.
+   \param w The widget, that executed this Function.
+   \param event The event that trigered this Function.
+   \param button The Button, that triggered this event.
+*/
+gint GuiUpdate::updateDataFunc(GtkWidget* w, GdkEventKey* event, void* info)
+{
+  FileInfo* dataInfo =(FileInfo*)info;
+
+  dataInfo->fileName = "02%20orxonox%203.mp3";
+  dataInfo->webRoot  = "http://www.orxonox.ethz.ch/files/";
+  dataInfo->localRoot = "./";
+  PRINTF(4)("Preparing to download file %s.\n", dataInfo->fileName);
+  downloadWithStyle(dataInfo);
+}
+
+/**
+   \brief updates the source of orxonox.
+   \param w The widget, that executed this Function.
+   \param event The event that trigered this Function.
+   \param button The Button, that triggered this event.
+*/
+gint GuiUpdate::updateSourceFunc(GtkWidget* w, GdkEventKey* event, void* bar)
+{
+  ProgressBar* tmpBar = static_cast<ProgressBar*>(bar);
+  tmpBar->setTotalSize(20);
+  tmpBar->setProgress(tmpBar->getProgress()+1);
+}
+#endif /* HAVE_GTK2 */
+
+/**
+   \brief The Function Curl calls to write out the File.
+   \param ptr A Pointer to the date to write.
+   \param size The size in bytes of one nmemb to write.
+   \param nmemb The Count of size to write.
+   \param stream Filehandler to write to.
+*/
+size_t GuiUpdate::curlWriteFunc(void* ptr, size_t size, size_t nmemb, FILE* stream)
+{
+  return fwrite(ptr, size, nmemb, stream);
+}
+
+/**
+   \brief The Function Curl calls to write out the File.
+   \param ptr A Pointer to the date to write to.
+   \param size The size in bytes of one nmemb to write.
+   \param nmemb The Count of size to write.
+   \param stream Filehandler to get data from.
+*/
+size_t GuiUpdate::curlReadFunc(void* ptr, size_t size, size_t nmemb, FILE* stream)
+{
+  return fread(ptr, size, nmemb, stream);
+}
+
+
+/**
+   \brief An update Function for the GUI, to show the progress.
+   \param Bar th ProgressBar to update
+   \param totalSize The total size of the download in bytes.
+   \param progress The current Progress of the download in bytes.
+   \param upTotal not needed
+   \param upProgress not needed
+*/
+int GuiUpdate::curlProgressFunc(ProgressBar* bar, double totalSize, double progress, double upTotal, double upProgress)
+{
+  bar->setProgress(progress);
+  bar->setTotalSize(totalSize);
+#ifdef HAVE_GTK2
+  while(gtk_events_pending()) gtk_main_iteration();
+#endif
+  return 0;
+}
+
+/**
+   \brief The Curl handle for only one CURL(static).
+*/
+CURL* GuiUpdate::curlHandle = NULL;
+
+//! A bool parameter that shows if we are downloading.
+bool GuiUpdate::isDownloading = false;
+
+//! A parameter to see, if downloading has been canceled
+bool GuiUpdate::downloadCanceled = false;
+
+/**
+   \brief Initializes a Download without displaying it.
+   \param fileInfo the FileInfo.
+
+   !! BE AWARE THIS WILL NOT BE THREADED. !!
+*/
+bool GuiUpdate::download(void* fileInfo)
+{
+  if(isDownloading)
+    {
+      PRINTF(2)("unable to Download. already getting some file\n");
+      return false;
+    }
+  PRINTF(4)("Downloading.\n");
+  FileInfo* info =(FileInfo*)fileInfo;
+  CURLcode res;
+  CURL* localCurl;
+  localCurl = curl_easy_init();
+  char* fileOnNet = new char [strlen(info->webRoot)+strlen(info->fileName)+2];
+  strcpy(fileOnNet, info->webRoot);
+  if(fileOnNet[strlen(fileOnNet)] != '/') //!< \todo windows-shit
+    strcat(fileOnNet, "/");
+  strcat(fileOnNet, info->fileName);
+  char* fileOnDisk = new char [strlen(info->localRoot)+strlen(info->fileName)+2];
+  strcpy(fileOnDisk, info->localRoot);
+  if(fileOnDisk[strlen(fileOnDisk)] != '/') //!< \todo windows-shit
+    strcat(fileOnDisk, "/");
+  strcat(fileOnDisk, info->fileName);
+  
+  if(localCurl)
+    {
+      
+      info->fileHandle = fopen(fileOnDisk, "w");
+      
+      curl_easy_setopt(localCurl, CURLOPT_URL, fileOnNet);
+      curl_easy_setopt(localCurl, CURLOPT_WRITEDATA, info->fileHandle);
+      curl_easy_setopt(localCurl, CURLOPT_WRITEFUNCTION, curlWriteFunc);
+      curl_easy_setopt(localCurl, CURLOPT_READFUNCTION, curlReadFunc);
+      curl_easy_setopt(localCurl, CURLOPT_NOPROGRESS, true);
+      
+      curl_easy_perform(localCurl);
+
+      curl_easy_cleanup(localCurl);
+      fclose(info->fileHandle);
+    }
+}
+
+/**
+   \brief Initializes a Download with some style.
+   \param fileInfo the FileInfo.
+   \todo release thread-lock.
+
+   Downloading with a Button that gets a different Name while downloading, and a Bar, that gets to be updated. More to be followed
+*/
+bool GuiUpdate::downloadWithStyle(void* fileInfo)
+{
+  if(isDownloading)
+    {
+      PRINTF(2)("unable to Download. already getting some file\n");
+      return false;
+    }
+  PRINTF(4)("Downloading.\n");
+  FileInfo* info =(FileInfo*)fileInfo;
+  CURLcode res;
+  curlHandle = curl_easy_init();
+  char* fileOnNet = new char [strlen(info->webRoot)+strlen(info->fileName)+1];
+  strcpy(fileOnNet, info->webRoot);
+  strcat(fileOnNet, info->fileName);
+  char* fileOnDisk = new char [strlen(info->localRoot)+strlen(info->fileName)+1];
+  strcpy(fileOnDisk, info->localRoot);
+  strcat(fileOnDisk, info->fileName);
+
+  if(curlHandle)
+    {
+      
+      info->fileHandle = fopen(fileOnDisk, "w");
+      
+      curl_easy_setopt(curlHandle, CURLOPT_URL, fileOnNet);
+      curl_easy_setopt(curlHandle, CURLOPT_WRITEDATA, info->fileHandle);
+      curl_easy_setopt(curlHandle, CURLOPT_WRITEFUNCTION, curlWriteFunc);
+      curl_easy_setopt(curlHandle, CURLOPT_READFUNCTION, curlReadFunc);
+      curl_easy_setopt(curlHandle, CURLOPT_NOPROGRESS, false);
+      curl_easy_setopt(curlHandle, CURLOPT_PROGRESSFUNCTION, curlProgressFunc);
+      curl_easy_setopt(curlHandle, CURLOPT_PROGRESSDATA, info->bar);
+
+      if(!isDownloading)
+	{
+#ifdef HAVE_GTK2 
+	  info->stateButton->disconnectSignal(info->buttonSignal);
+	  info->buttonSignal = info->stateButton->connectSignal("button_press_event", info, cancelDownload);
+#endif /* HAVE_GTK2 */
+	  info->stateButton->setTitle("please wait");
+	  
+	  downloadThread(info);
+	  downloadThreadFinished(info);
+	 
+	  //      res = curl_easy_perform(curlHandle);
+	  
+	  //      fclose(outfile);
+	}
+      else 
+	PRINTF(1)("thread already in use\n");
+
+    }
+  return true;
+}
+
+/**
+   \brief The downloading process(either threaded or not).
+   \param fileInfo the FileInfo.
+
+   \todo Threads get locked, if the cancel button is pressed in to small intervals.
+*/
+void* GuiUpdate::downloadThread(void* fileInfo)
+{
+  isDownloading = true;
+  curl_easy_perform(curlHandle);
+}
+
+/**
+   \brief Finishes a downloading process. 
+   \param fileInfo the FileInfo.
+*/
+void* GuiUpdate::downloadThreadFinished(void* fileInfo)
+{ 
+  FileInfo* info =(FileInfo*)fileInfo;
+  if(curlHandle)
+    curl_easy_cleanup(curlHandle);
+ 
+  PRINTF(4)("Closing the downloaded file.\n");
+  fclose(info->fileHandle);
+
+  if(isDownloading)
+    info->stateButton->setTitle("go on");
+  //  else
+  //    info->stateButton->setTitle("done");
+#ifdef HAVE_GTK2 
+  info->stateButton->disconnectSignal(info->buttonSignal);
+  info->buttonSignal = info->stateButton->connectSignal("button_press_event", info, updateDataFunc);
+#endif /* HAVE_GTK2 */
+  isDownloading = false;
+
+}
+
+#ifdef HAVE_GTK2
+/**
+   \brief canceles a downloading session.
+   \param w The widget, that executed this Function.
+   \param event The event that trigered this Function.
+   \param bar The Bar, that triggered this event.
+
+   \todo canceling a session in non-threaded mode.
+*/
+gint GuiUpdate::cancelDownload(GtkWidget* w, GdkEventKey* event, void* bar)
+{
+  PRINTF(3)("Cannot cancle the Downloading process until after this File\n");
+}
+#endif /* HAVE_GTK2 */
+
+#endif /* HAVE_CURL */
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_update.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_update.h	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_update.h	(revision 4194)
@@ -0,0 +1,117 @@
+/*!
+  \file gui_update.h
+  \brief File that holds the class that creates the update-menu.
+*/
+
+#ifndef _GUI_UPDATE_H
+#define _GUI_UPDATE_H
+
+#include "gui.h"
+#include "gui_element.h"
+#include "gui_gtk.h"
+
+
+#define DATA_IDENTIFIER "data.oxd"
+
+#include <stdio.h>
+#ifdef HAVE_CURL
+#include <curl/curl.h>
+#include <curl/types.h>
+#include <curl/easy.h>
+#endif /* HAVE_CURL */
+#ifdef HAVE_PTHREAD_H
+#define _MULTI_THREADED
+#include <pthread.h>
+#endif /* HAVE_PTHREAD_H */
+using namespace std;
+
+//! Class that creates the execute-Options.
+class GuiUpdate : public GuiElement
+{
+ private:
+  // Defining Variables
+  char* tmpDir;                         //!< The Temporary directory.
+  char* homeDir;                        //!< The Home directory.
+  char* installDataDir;                 //!< Where to install the Data to.
+  char* installSourceDir;               //!< Where to install the Source to.
+  char* userName;                       //!< The user logged in.
+
+  bool getSystemInfo(void);
+ 
+  // Window creation.
+  Frame* updateFrame;                   //!< The Frame that holds the updateOptions.
+  Box* updateBox;                       //!< The Box that holds the updateOptions.
+  CheckButton* autoUpdate;              //!< A Checkbutton to enable the automatic Updating.
+
+  
+  Button* updateDataWindowButton;       //!< A Button to update the Data of orxonox.
+  Window* updateDataWindow;             //!< A Window for the data-update.
+  Box* updateDataBox;                   //!< A Box for the Window for the Data-update.
+  ProgressBar* updateDataBar;           //!< A Bar to display the progress of the download.
+  Button* updateDataBegin;              //!< A Button to start the process.
+
+  Button* updateSourceWindowButton;     //!< A Button to update the Source of orxonox. \todo tricky
+  Window* updateSourceWindow;           //!< A Window for the Source-update.
+  Box* updateSourceBox;                 //!< A Box for the Window for the Source-update.
+  ProgressBar* updateSourceBar;         //!< A Bar to display the progress of the download.
+
+  Button* test;                         //!< will be deleted soon.
+
+#ifdef HAVE_GTK2
+  static gint updateDataFunc(GtkWidget* w, GdkEventKey* event, void* info);
+  static gint updateSourceFunc(GtkWidget* w, GdkEventKey* event, void* info);
+#endif /* HAVE_GTK2 */
+
+  static bool checkDataDir(const char* fileName, void* object);
+
+#ifdef HAVE_CURL
+  //! A Struct to hold information about one File to download.
+  struct FileInfo
+  {
+    char* fileName;                     //!< The Name of the file we want to get.
+    char* webRoot;                      //!< The Root of the File on The Web
+    char* localRoot;                    //!< The Root directory to put the files on the local disk.
+    FILE* fileHandle;                   //!< A fileHandler.
+
+    Button* stateButton;                //!< A button that shows either start or cancel;
+    long int buttonSignal;              //!< The Signal of the stateButton.
+    ProgressBar* bar;                   //!< The ProgressBar, that sould be updated.
+  };
+
+  static size_t curlWriteFunc(void* ptr, size_t size, size_t nmemb, FILE* stream);
+  static size_t curlReadFunc(void* ptr, size_t size, size_t nmemb, FILE* stream);
+  static int curlProgressFunc(ProgressBar* bar, double totalSize, double progress, double upTotal, double upProgress);
+
+  static CURL* curlHandle;
+#ifdef HAVE_GTK2 
+  static gint cancelDownload(GtkWidget* w, GdkEventKey* event, void* bar);
+#endif /* HAVE_GTK2 */  
+  static bool isDownloading;
+  static bool downloadCanceled;
+
+  static bool download(void* fileInfo);
+  static bool downloadWithStyle(void* fileInfo);
+  static void* downloadThread(void* fileInfo);
+  static void* downloadThreadFinished(void* fileInfo);
+
+  
+#endif /* HAVE_CURL */
+
+ public:
+  GuiUpdate(void);
+  ~GuiUpdate(void);
+  
+#ifdef HAVE_CURL   
+  void updateDataWindowCreate(void);
+  Button* updateDataWindowGetButton(void);
+
+  void updateSourceWindowCreate(void);
+  Button* updateSourceWindowGetButton(void);
+
+  bool* checkForUpdates(void);
+ 
+#endif /* HAVE_CURL */
+
+};
+
+#endif /* _GUI_UPDATE_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_video.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_video.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_video.cc	(revision 4194)
@@ -0,0 +1,225 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+
+*/
+
+
+#include "gui_video.h"
+
+#include "gui_gtk.h"
+#include "glincl.h"
+#include <stdlib.h>
+
+/**
+   \brief Creates the Video-Option-Frame
+*/
+GuiVideo::GuiVideo(void)
+{
+  Frame* videoFrame;        //!< The Frame that holds the video options.
+
+  videoFrame = new Frame("Video-Options:");
+  videoFrame->setGroupName("video");
+  {
+    Box* videoBox;            //!< The Box that holds the video options.
+
+    videoBox = new Box('v');
+    {
+      CheckButton* fullscreen;  //!< CheckButton for fullscreen-mode
+      Menu* resolution;         //!< Menu for the resolution
+      CheckButton* wireframe;   //!< CheckButton for wireframe Mode.
+
+      fullscreen = new CheckButton(CONFIG_NAME_FULLSCREEN);
+      fullscreen->setFlagName("windowed", "q", 1);
+      fullscreen->setDescription("Starts orxonox in windowed mode");
+      fullscreen->saveability();
+      videoBox->fill(fullscreen);
+      resolution = new Menu(CONFIG_NAME_RESOLUTION);
+      getResolutions(resolution);
+      resolution->saveability();
+      resolution->setFlagName("resolution", "r", 0);
+      resolution->setDescription("Sets the resolution of orxonox");
+      videoBox->fill(resolution);
+      wireframe = new CheckButton(CONFIG_NAME_WIREFRAME);
+      wireframe->setFlagName("wireframe", "w", 0);
+      wireframe->setDescription("Starts orxonox in wireframe mode");
+      wireframe->saveability();
+      videoBox->fill(wireframe);
+
+      videoBox->fill(advancedWindowCreate());
+    }
+    videoFrame->fill(videoBox);
+  }
+  setMainWidget(videoFrame);
+}
+
+/**
+   \brief Destructs the Video-stuff
+*/
+GuiVideo::~GuiVideo(void)
+{
+  // nothing to do here.
+}
+
+/**
+   \brief Creates a window, and all it contains for the Source-update.
+*/
+Widget* GuiVideo::advancedWindowCreate(void)
+{
+  // advanced-Performance-Options
+  Window* advancedWindow;   //!< A Window to display advanced options.
+  Button* advancedButton;   //!< A Button to open the Advanced Video Performance Window.
+  // the button, that opens this Window.
+  advancedButton = new Button("advanced");
+
+  // the Window itself
+  advancedWindow = new Window("Advanced Video Options");
+  advancedWindow->setGroupName(CONFIG_SECTION_VIDEO_ADVANCED);
+  {
+    Box* advancedBox;         //!< A Box to pack the options into.
+
+    advancedBox = new Box('v');
+    {
+      CheckButton* shadows;     //!< CheckButton for shadows
+      CheckButton* fog;         //!< CheckButton for fog.
+      CheckButton* reflections; //!< CheckButton for reflections
+      CheckButton* textures;    //!< CheckButton for textures
+      Menu* textureDetail;      //!< Menu for the Texture-Detail.
+      Label* modelDetailLabel;  //!< Label for model-detail.
+      Menu* modelDetail;        //!< model-detail.
+      CheckButton* particles;   //!< If the Particles should be enabled
+      Label* antiAliasingLabel; //!< Label for the anti-aliasing mode.
+      Menu* antiAliasing;       //!< Menu for the Antialiasing-mode.
+      Label* filterMethodLabel; //!< Label for filtering-Method.
+      Menu* filterMethod;       //!< Menu for filtering Method.
+      Button* closeButton;      //!< A Button to close the Advanced-settingsWindow.
+
+      // Advanced Performance Options
+      shadows = new CheckButton(CONFIG_NAME_SHADOWS);
+      shadows->saveability();
+      advancedBox->fill(shadows);
+      
+      fog = new CheckButton(CONFIG_NAME_FOG);
+      fog->saveability();
+      advancedBox->fill(fog);
+      
+      reflections = new CheckButton(CONFIG_NAME_REFLECTIONS);
+      reflections->saveability();
+      advancedBox->fill(reflections);
+      
+      textures = new CheckButton(CONFIG_NAME_TEXTURES);
+      textures->saveability();
+      advancedBox->fill(textures);
+      
+      textureDetail = new Menu(CONFIG_NAME_TEXTURE_DETAIL, "low", "medium", "high", "lastItem");
+      textureDetail->setDefaultValue(1);
+      textureDetail->saveability();
+      advancedBox->fill(textureDetail);
+      
+      modelDetailLabel = new Label(CONFIG_NAME_MODEL_DETAIL);
+      advancedBox->fill(modelDetailLabel);
+      modelDetail = new Menu(CONFIG_NAME_MODEL_DETAIL, "low", "high", "lastItem");
+      modelDetail->setDefaultValue(1);
+      modelDetail->saveability();
+      advancedBox->fill(modelDetail);
+      
+      particles = new CheckButton(CONFIG_NAME_PARTICLES_ENABLED);
+      particles->saveability();
+      particles->setDefaultValue(1);
+      advancedBox->fill(particles);
+
+      antiAliasingLabel = new Label("Anti-Aliasing-depth:");
+      advancedBox->fill(antiAliasingLabel);
+      antiAliasing = new Menu(CONFIG_NAME_ANTI_ALIASING, "0", "1", "2", "4", "8",  "lastItem");
+      antiAliasing->setDefaultValue(2);
+      antiAliasing->saveability();
+      advancedBox->fill(antiAliasing);
+      
+      filterMethodLabel = new Label("Filtering Method:");
+      advancedBox->fill(filterMethodLabel);
+      filterMethod = new Menu(CONFIG_NAME_FILTER_METHOD, "none", "linear", "bilinear", "trilinear", "anisortopic", "lastItem");
+      filterMethod->setDefaultValue(1);
+      filterMethod->saveability();
+      advancedBox->fill(filterMethod);
+
+
+  
+      closeButton = new Button("close");
+#ifdef HAVE_GTK2
+      closeButton->connectSignal("button_press_event", advancedWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+
+      advancedBox->fill(closeButton);
+    }
+    advancedWindow->fill(advancedBox);
+  }
+#ifdef HAVE_GTK2
+  advancedButton->connectSignal("button_press_event", advancedWindow, Window::windowOpen);
+  advancedWindow->connectSignal("destroy", advancedWindow, Window::windowClose);
+  advancedWindow->connectSignal("delete_event", advancedWindow, Window::windowClose);
+#endif /* HAVE_GTK2 */
+  Window::addWindow(advancedWindow);
+
+  return advancedButton;
+}
+
+/**
+   \brief sets all resolutions to the menu
+   \param menu the Menu to set The resolutions to.
+*/
+void GuiVideo::getResolutions(Menu* menu)
+{
+  SDL_Init(SDL_INIT_VIDEO);
+  SDL_Rect **modes;
+  int i;
+  int x = 0,y =0; // check for difference
+  char tmpChar[100];
+  
+  /* Get available fullscreen/hardware modes */
+  modes=SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_HWSURFACE);
+  
+  /* Check is there are any modes available */
+  if(modes == (SDL_Rect **)0){
+    PRINTF(2)("No video-modes available!\n");
+    exit(-1);
+  }
+  
+  /* Check if our resolution is restricted */
+  if(modes == (SDL_Rect **)-1){
+    PRINTF(2)("All resolutions available.\n");
+  }
+  else{
+    /* Print valid modes */
+    PRINT(5)("Available Modes\n");
+    for(i = 0; modes[i] ;++i)
+      {
+	if (x != modes[i]->w || y != modes[i]->h)
+	  { 
+	    PRINTF(5)("  %d x %d\n", modes[i]->w, modes[i]->h);
+	    sprintf(tmpChar, "%dx%d", modes[i]->w, modes[i]->h);
+	    menu->addItem(tmpChar);
+	    x = modes[i]->w; y = modes[i]->h;
+	  }
+      }
+  }
+  SDL_Quit();
+}
Index: orxonox/branches/openAL/src/lib/gui/gui/gui_video.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/gui_video.h	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/gui_video.h	(revision 4194)
@@ -0,0 +1,29 @@
+/*!
+  \file gui_video.h
+  \brief File that holds the class that creates the Video-Options.
+*/
+#ifndef _GUI_VIDEO_H
+#define _GUI_VIDEO_H
+
+#include "gui.h"
+#include "gui_element.h"
+
+// FORWARD DECLARATIONS
+class Widget;
+class Menu;
+
+//! Class that creates the Video-Options.
+class GuiVideo : public GuiElement
+{
+ private:
+  //  Button* advancedWindowGetButton(void);
+  
+ public:
+  GuiVideo(void);
+  ~GuiVideo(void);
+
+ private:
+  void getResolutions(Menu* menu);
+  Widget* advancedWindowCreate(void);
+};
+#endif /* _GUI_VIDEO_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/logo.xpm
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/logo.xpm	(revision 4194)
+++ orxonox/branches/openAL/src/lib/gui/gui/logo.xpm	(revision 4194)
@@ -0,0 +1,3170 @@
+/* XPM */
+static char * logo_xpm[] = {
+"200 200 2967 2",
+"  	c #000000",
+". 	c #020202",
+"+ 	c #010101",
+"@ 	c #242424",
+"# 	c #2A2A2A",
+"$ 	c #030303",
+"% 	c #040404",
+"& 	c #8B8B8B",
+"* 	c #A0A0A0",
+"= 	c #848484",
+"- 	c #0D0D0D",
+"; 	c #E3E3E3",
+"> 	c #F4F4F4",
+", 	c #181818",
+"' 	c #1C1C1C",
+") 	c #6D6D6D",
+"! 	c #A7A7A7",
+"~ 	c #CECECE",
+"{ 	c #080808",
+"] 	c #555555",
+"^ 	c #FFFFFF",
+"/ 	c #828282",
+"( 	c #090909",
+"_ 	c #B1B1B1",
+": 	c #D3D3D3",
+"< 	c #D5D5D5",
+"[ 	c #FDFDFD",
+"} 	c #8D8D8D",
+"| 	c #D1D1D1",
+"1 	c #FEFEFE",
+"2 	c #E2E2E2",
+"3 	c #6E6E6E",
+"4 	c #FCFCFC",
+"5 	c #EAEAEA",
+"6 	c #0E0E0E",
+"7 	c #141414",
+"8 	c #F7F7F7",
+"9 	c #525252",
+"0 	c #3D3D3D",
+"a 	c #F9F9F9",
+"b 	c #565656",
+"c 	c #3B3B3B",
+"d 	c #F5F5F5",
+"e 	c #1F1F1F",
+"f 	c #FDFEFE",
+"g 	c #FFFEFE",
+"h 	c #EBEAE9",
+"i 	c #29292A",
+"j 	c #9D9D9D",
+"k 	c #FEFDFE",
+"l 	c #FEFEFD",
+"m 	c #BABABA",
+"n 	c #020101",
+"o 	c #111214",
+"p 	c #E2E2E1",
+"q 	c #4B4B4B",
+"r 	c #969696",
+"s 	c #535353",
+"t 	c #FAFFFF",
+"u 	c #FCFBFC",
+"v 	c #C8C6C6",
+"w 	c #050505",
+"x 	c #F3F2F2",
+"y 	c #FDFFFA",
+"z 	c #FAFCFF",
+"A 	c #F2F7F8",
+"B 	c #FCFDFE",
+"C 	c #FAFAFA",
+"D 	c #333333",
+"E 	c #030404",
+"F 	c #B7B5B3",
+"G 	c #FBFFFF",
+"H 	c #606060",
+"I 	c #292929",
+"J 	c #F8F8F8",
+"K 	c #C1C1C1",
+"L 	c #717171",
+"M 	c #FCFEFF",
+"N 	c #FDFCF9",
+"O 	c #FDFCFA",
+"P 	c #FCFCFB",
+"Q 	c #838383",
+"R 	c #FCFEFE",
+"S 	c #FEFDF7",
+"T 	c #BCDFF5",
+"U 	c #A4CDED",
+"V 	c #949494",
+"W 	c #6E6D6F",
+"X 	c #FEFCFB",
+"Y 	c #FBFEFF",
+"Z 	c #FFFDF8",
+"` 	c #919191",
+" .	c #C0C0C0",
+"..	c #C9C9C9",
+"+.	c #E8E8E8",
+"@.	c #323232",
+"#.	c #FBFCFD",
+"$.	c #FCFCFA",
+"%.	c #BAD9E8",
+"&.	c #F7FCFB",
+"*.	c #FAFDFE",
+"=.	c #0B0B0B",
+"-.	c #DBDBDB",
+";.	c #FBFDFE",
+">.	c #50A7EF",
+",.	c #3696F1",
+"'.	c #FAFEFE",
+").	c #EFEFEF",
+"!.	c #373737",
+"~.	c #FAFCFC",
+"{.	c #F6FBFC",
+"].	c #BADBEE",
+"^.	c #FEFFFF",
+"/.	c #2F2F2F",
+"(.	c #CACACA",
+"_.	c #FAFAF7",
+":.	c #5E5F5D",
+"<.	c #030102",
+"[.	c #FEFDFD",
+"}.	c #F9FCFA",
+"|.	c #3898EC",
+"1.	c #9FCBED",
+"2.	c #FCFDFD",
+"3.	c #EEEEEC",
+"4.	c #262827",
+"5.	c #010103",
+"6.	c #4C4C4C",
+"7.	c #D8ECFA",
+"8.	c #0A80F5",
+"9.	c #0780F6",
+"0.	c #C9E4F7",
+"a.	c #FEFCFA",
+"b.	c #68696A",
+"c.	c #1A1A1A",
+"d.	c #DDDDDD",
+"e.	c #FAFCFD",
+"f.	c #FDFBF5",
+"g.	c #B4D7F2",
+"h.	c #2A8EE9",
+"i.	c #F6FEFF",
+"j.	c #FEFCFE",
+"k.	c #CFD4D1",
+"l.	c #050305",
+"m.	c #000002",
+"n.	c #020002",
+"o.	c #030101",
+"p.	c #474646",
+"q.	c #E9E9E7",
+"r.	c #D6D6D6",
+"s.	c #B2B2B2",
+"t.	c #FCFDFC",
+"u.	c #FDFFFD",
+"v.	c #FEFEFF",
+"w.	c #F8F8FA",
+"x.	c #858784",
+"y.	c #060606",
+"z.	c #E0E0E0",
+"A.	c #F9FCFC",
+"B.	c #1E8CF3",
+"C.	c #1B86F3",
+"D.	c #CDE9F4",
+"E.	c #FCFFFE",
+"F.	c #FDFDFC",
+"G.	c #C1C3C3",
+"H.	c #090908",
+"I.	c #B5B5B5",
+"J.	c #7ABAEE",
+"K.	c #047EFC",
+"L.	c #0181FD",
+"M.	c #5DAAEE",
+"N.	c #F7FDFF",
+"O.	c #FCFDFA",
+"P.	c #D5D6D6",
+"Q.	c #070605",
+"R.	c #B3B3B3",
+"S.	c #FDFCFC",
+"T.	c #FAFCFB",
+"U.	c #E3F3FA",
+"V.	c #228BF2",
+"W.	c #0F7FEE",
+"X.	c #DBEDF5",
+"Y.	c #FDFBFC",
+"Z.	c #F8FEFA",
+"`.	c #111011",
+" +	c #020001",
+".+	c #080506",
+"++	c #676A6C",
+"@+	c #F5F9FA",
+"#+	c #BCBCBC",
+"$+	c #7E7E7E",
+"%+	c #FDFDF8",
+"&+	c #FEFDF9",
+"*+	c #A8A8A8",
+"=+	c #151515",
+"-+	c #0F0F0F",
+";+	c #FEFDFA",
+">+	c #D5EDF5",
+",+	c #0E7EEE",
+"'+	c #017FFC",
+")+	c #3798F1",
+"!+	c #EDF6F4",
+"~+	c #8C8E8D",
+"{+	c #343434",
+"]+	c #FBFBFB",
+"^+	c #EEF8FB",
+"/+	c #238FF0",
+"(+	c #0281FD",
+"_+	c #027FFC",
+":+	c #0F82F3",
+"<+	c #E2F2FB",
+"[+	c #FEFDFB",
+"}+	c #454646",
+"|+	c #707070",
+"1+	c #F7FCFC",
+"2+	c #48A1EC",
+"3+	c #047FF8",
+"4+	c #067EF9",
+"5+	c #C5E6F6",
+"6+	c #FBFEFC",
+"7+	c #2A292A",
+"8+	c #060504",
+"9+	c #9B9E9E",
+"0+	c #FAFDFD",
+"a+	c #FFFCF6",
+"b+	c #BBBBBB",
+"c+	c #FFFFFE",
+"d+	c #FBFBFC",
+"e+	c #E8F5F6",
+"f+	c #F3FEFE",
+"g+	c #CFCFCF",
+"h+	c #262626",
+"i+	c #B4DCF4",
+"j+	c #067FF3",
+"k+	c #0180FD",
+"l+	c #0380FC",
+"m+	c #73B4EC",
+"n+	c #FDFFFE",
+"o+	c #FCFBFB",
+"p+	c #9DCEF2",
+"q+	c #057FFB",
+"r+	c #0280FB",
+"s+	c #037EFE",
+"t+	c #0380FB",
+"u+	c #86BEEE",
+"v+	c #CCCDCD",
+"w+	c #7EBDEE",
+"x+	c #047FFA",
+"y+	c #0280FC",
+"z+	c #047EFE",
+"A+	c #9ECCF3",
+"B+	c #4D4D4C",
+"C+	c #171717",
+"D+	c #CCCBCA",
+"E+	c #FDFCFB",
+"F+	c #F9FCFB",
+"G+	c #E8F5F8",
+"H+	c #818181",
+"I+	c #5E5E5E",
+"J+	c #FEFFFD",
+"K+	c #A5C8E3",
+"L+	c #75B6E9",
+"M+	c #F6FBFB",
+"N+	c #FBFCFB",
+"O+	c #F0EFEC",
+"P+	c #3C3C3C",
+"Q+	c #5F5F5F",
+"R+	c #FFFEFB",
+"S+	c #9ACCF5",
+"T+	c #0182FB",
+"U+	c #037DFE",
+"V+	c #0180FC",
+"W+	c #0581F8",
+"X+	c #A6D4F3",
+"Y+	c #FBFEF6",
+"Z+	c #FCFEFD",
+"`+	c #F9FCFF",
+" @	c #3898E9",
+".@	c #017EFF",
+"+@	c #0181FA",
+"@@	c #0180FE",
+"#@	c #2990EE",
+"$@	c #F2FDFE",
+"%@	c #FDFEFA",
+"&@	c #FEFEFC",
+"*@	c #FDFDF9",
+"=@	c #C1E2F4",
+"-@	c #097EF1",
+";@	c #0080FF",
+">@	c #7EBBEF",
+",@	c #FBFDFC",
+"'@	c #8A8A8A",
+")@	c #030201",
+"!@	c #3D3A39",
+"~@	c #FDFEFD",
+"{@	c #FEFCF7",
+"]@	c #F4FCFC",
+"^@	c #88C3ED",
+"/@	c #79B5EA",
+"(@	c #7F7F7F",
+"_@	c #9B9B9B",
+":@	c #404040",
+"<@	c #424242",
+"[@	c #FDFEFC",
+"}@	c #A4D3F0",
+"|@	c #087EF6",
+"1@	c #4DA1EA",
+"2@	c #E6F4FB",
+"3@	c #FDFCF6",
+"4@	c #F6FEFE",
+"5@	c #72B1E9",
+"6@	c #0181FC",
+"7@	c #037EFF",
+"8@	c #0281F8",
+"9@	c #1B83ED",
+"0@	c #D2E9F5",
+"a@	c #FCFDF8",
+"b@	c #C0E0F3",
+"c@	c #0C7DF9",
+"d@	c #0282F9",
+"e@	c #037DFF",
+"f@	c #0380FE",
+"g@	c #057EF8",
+"h@	c #ABD2F2",
+"i@	c #FFFDFF",
+"j@	c #FBFFFA",
+"k@	c #DEF0F6",
+"l@	c #288BEE",
+"m@	c #0180FF",
+"n@	c #0081FE",
+"o@	c #60ADED",
+"p@	c #FAFDFC",
+"q@	c #FDFDFB",
+"r@	c #9F9E9F",
+"s@	c #616165",
+"t@	c #EBF1ED",
+"u@	c #FAFDFB",
+"v@	c #EFF8F9",
+"w@	c #6BB5F0",
+"x@	c #067EF7",
+"y@	c #90C4F2",
+"z@	c #6A6A6A",
+"A@	c #121212",
+"B@	c #909090",
+"C@	c #BFBFBF",
+"D@	c #444444",
+"E@	c #393939",
+"F@	c #FCFDF6",
+"G@	c #B3D4EE",
+"H@	c #0280FA",
+"I@	c #3596EE",
+"J@	c #CAE7F6",
+"K@	c #EEEEEE",
+"L@	c #FDFFFF",
+"M@	c #56A9F0",
+"N@	c #0281FB",
+"O@	c #017FFF",
+"P@	c #0081FC",
+"Q@	c #0280FE",
+"R@	c #3790EC",
+"S@	c #EDF9F7",
+"T@	c #FCFAFD",
+"U@	c #61B3F1",
+"V@	c #037FFD",
+"W@	c #489EEC",
+"X@	c #F5FCFD",
+"Y@	c #FBFDF8",
+"Z@	c #F6F8FC",
+"`@	c #4EA2EF",
+" #	c #0080FE",
+".#	c #3192ED",
+"+#	c #F7FEFE",
+"@#	c #F7F7F4",
+"##	c #FDFAF8",
+"$#	c #E3F5F8",
+"%#	c #4499E8",
+"&#	c #0381F5",
+"*#	c #A6D3ED",
+"=#	c #2C2C2C",
+"-#	c #A1A1A1",
+";#	c #414141",
+">#	c #C4C4C4",
+",#	c #4A4A49",
+"'#	c #DEF3FA",
+")#	c #057FF6",
+"!#	c #1E8AF1",
+"~#	c #BDDEF3",
+"{#	c #288DF0",
+"]#	c #007FFF",
+"^#	c #0082F8",
+"/#	c #047DFE",
+"(#	c #0281F9",
+"_#	c #057EFA",
+":#	c #6FB4ED",
+"<#	c #F9FDFB",
+"[#	c #E0F0F6",
+"}#	c #1281F3",
+"|#	c #0281FC",
+"1#	c #4CA4EA",
+"2#	c #077EF7",
+"3#	c #037FFC",
+"4#	c #0880F4",
+"5#	c #CCE7F6",
+"6#	c #FBFDFD",
+"7#	c #86C2EE",
+"8#	c #057FF8",
+"9#	c #0380FD",
+"0#	c #1987F4",
+"a#	c #EDF7FB",
+"b#	c #FEFFFE",
+"c#	c #FEFEFB",
+"d#	c #C4E5F5",
+"e#	c #278AE6",
+"f#	c #B6D8F1",
+"g#	c #4A4A4A",
+"h#	c #646464",
+"i#	c #DEDEDE",
+"j#	c #FFFDFE",
+"k#	c #FDFEF7",
+"l#	c #CAC9C8",
+"m#	c #4D4F52",
+"n#	c #010203",
+"o#	c #050304",
+"p#	c #E4F2FC",
+"q#	c #0680F8",
+"r#	c #0180FB",
+"s#	c #0F7EF0",
+"t#	c #9BCDED",
+"u#	c #F9FCFE",
+"v#	c #FCFDF9",
+"w#	c #FDFFFC",
+"x#	c #E1F4F9",
+"y#	c #1183F0",
+"z#	c #067EFD",
+"A#	c #2D96EF",
+"B#	c #067EF6",
+"C#	c #087FF5",
+"D#	c #A6D3F2",
+"E#	c #80BFF1",
+"F#	c #067FF8",
+"G#	c #1883EB",
+"H#	c #E4F9FC",
+"I#	c #3E9AF1",
+"J#	c #017FFE",
+"K#	c #0380F8",
+"L#	c #72B5F0",
+"M#	c #BBE0F4",
+"N#	c #0F83F7",
+"O#	c #2E94F0",
+"P#	c #087DF9",
+"Q#	c #037FFA",
+"R#	c #087DF2",
+"S#	c #D7EEF8",
+"T#	c #F9FEFE",
+"U#	c #FAFDFA",
+"V#	c #A0CFF1",
+"W#	c #1688F4",
+"X#	c #057FF9",
+"Y#	c #047FF9",
+"Z#	c #E4F3FB",
+"`#	c #4E4F4F",
+" $	c #C9C9C4",
+".$	c #F1F1F1",
+"+$	c #8E8E8E",
+"@$	c #FFFCFD",
+"#$	c #FCFFFA",
+"$$	c #FAFEFB",
+"%$	c #D0CFCE",
+"&$	c #555357",
+"*$	c #040405",
+"=$	c #F4FBFD",
+"-$	c #238CF1",
+";$	c #027EFE",
+">$	c #0184FC",
+",$	c #62AEEC",
+"'$	c #F6FCFE",
+")$	c #D9EDF7",
+"!$	c #097DF3",
+"~$	c #067EF8",
+"{$	c #E5F7FB",
+"]$	c #429BE9",
+"^$	c #0E81F0",
+"/$	c #178BF7",
+"($	c #0181FE",
+"_$	c #7AB7EE",
+":$	c #FAFEF9",
+"<$	c #A0CCEE",
+"[$	c #047EFB",
+"}$	c #0E83F2",
+"|$	c #1A8AF0",
+"1$	c #037FFE",
+"2$	c #1D89EF",
+"3$	c #DCF4FB",
+"4$	c #268BEC",
+"5$	c #027FFE",
+"6$	c #057EF9",
+"7$	c #B3D7F4",
+"8$	c #F6FBFE",
+"9$	c #7CBBF0",
+"0$	c #097CF7",
+"a$	c #067FF5",
+"b$	c #FBFDFF",
+"c$	c #FCFEF9",
+"d$	c #FDFEFB",
+"e$	c #FFFEFF",
+"f$	c #FEFCFC",
+"g$	c #FDFFF9",
+"h$	c #E6EFF3",
+"i$	c #F9FBF9",
+"j$	c #FEFBF8",
+"k$	c #F9FEFF",
+"l$	c #FDFEF8",
+"m$	c #DDDCDB",
+"n$	c #787878",
+"o$	c #101010",
+"p$	c #F8FEFE",
+"q$	c #328EEA",
+"r$	c #0081FD",
+"s$	c #0081FB",
+"t$	c #077EF8",
+"u$	c #479AE9",
+"v$	c #DEF2FA",
+"w$	c #A2D0F2",
+"x$	c #248AEF",
+"y$	c #F2FBFA",
+"z$	c #D8F0F9",
+"A$	c #1C89ED",
+"B$	c #027FFF",
+"C$	c #037FFB",
+"D$	c #0B80F6",
+"E$	c #D2E9F3",
+"F$	c #EDFAFB",
+"G$	c #1A87EF",
+"H$	c #0B81F4",
+"I$	c #BEDFF3",
+"J$	c #F8FCF9",
+"K$	c #3D98ED",
+"L$	c #027FFB",
+"M$	c #027FFA",
+"N$	c #9ACCF4",
+"O$	c #E3F1F7",
+"P$	c #58A9EE",
+"Q$	c #0380F7",
+"R$	c #0081FA",
+"S$	c #1E89EE",
+"T$	c #EEF9FD",
+"U$	c #0A0A0A",
+"V$	c #5A5A5A",
+"W$	c #D0D0D0",
+"X$	c #FAFCF7",
+"Y$	c #EDF6FA",
+"Z$	c #FAFBFD",
+"`$	c #4F4F4F",
+" %	c #CDCECC",
+".%	c #63A5E3",
+"+%	c #66B3EE",
+"@%	c #D6ECF7",
+"#%	c #FCFEFB",
+"$%	c #EBEBEB",
+"%%	c #E7E7E6",
+"&%	c #FEFFFC",
+"*%	c #F2FFFF",
+"=%	c #3B93EA",
+"-%	c #0380F5",
+";%	c #0181FB",
+">%	c #2E90F1",
+",%	c #5BABF1",
+"'%	c #3E92E8",
+")%	c #F4FDFE",
+"!%	c #ACD4EF",
+"~%	c #0780F5",
+"{%	c #4C9FED",
+"]%	c #78B7EE",
+"^%	c #037FFF",
+"/%	c #0282FA",
+"(%	c #8CC1F0",
+"_%	c #F8FCFC",
+":%	c #6DB3F3",
+"<%	c #027FFD",
+"[%	c #0280FD",
+"}%	c #419CEB",
+"|%	c #3095F2",
+"1%	c #047FFC",
+"2%	c #067FF7",
+"3%	c #308FEA",
+"4%	c #E8E8E7",
+"5%	c #D4D4D4",
+"6%	c #E3F8FC",
+"7%	c #8EC0ED",
+"8%	c #53A2E6",
+"9%	c #717173",
+"0%	c #A0D0EF",
+"a%	c #0B7DF5",
+"b%	c #1084F5",
+"c%	c #69AEEA",
+"d%	c #D4ECF6",
+"e%	c #F8FDFC",
+"f%	c #FDFAFA",
+"g%	c #67B0F7",
+"h%	c #0381F9",
+"i%	c #5FB0EC",
+"j%	c #5DAAED",
+"k%	c #067DF8",
+"l%	c #67B1F4",
+"m%	c #FCFEFC",
+"n%	c #F8FDFB",
+"o%	c #75B6EC",
+"p%	c #0680F7",
+"q%	c #AED5F4",
+"r%	c #D8EEF7",
+"s%	c #1181F3",
+"t%	c #4AA1ED",
+"u%	c #F5FBFD",
+"v%	c #8DC5F0",
+"w%	c #0081FF",
+"x%	c #0480F9",
+"y%	c #3B97F0",
+"z%	c #5AABE8",
+"A%	c #0182FE",
+"B%	c #358EE9",
+"C%	c #F5FEFE",
+"D%	c #FEFFFB",
+"E%	c #FAFEFA",
+"F%	c #D7EBF7",
+"G%	c #6DB3ED",
+"H%	c #1D88EE",
+"I%	c #87C3F0",
+"J%	c #FCFDFB",
+"K%	c #F8F9F8",
+"L%	c #ECF9F9",
+"M%	c #1C88F6",
+"N%	c #0E80ED",
+"O%	c #62ACF0",
+"P%	c #FBFFFB",
+"Q%	c #FCFEFA",
+"R%	c #68B0F0",
+"S%	c #057DFE",
+"T%	c #449FF2",
+"U%	c #F8FAF9",
+"V%	c #90CAF1",
+"W%	c #087DF4",
+"X%	c #017FFD",
+"Y%	c #80BCEE",
+"Z%	c #FEFEFA",
+"`%	c #FDFCFD",
+" &	c #EFFAFA",
+".&	c #489CED",
+"+&	c #3193F1",
+"@&	c #F2FAFC",
+"#&	c #FCFBFE",
+"$&	c #52A3EE",
+"%&	c #0083F9",
+"&&	c #288EF5",
+"*&	c #DDEDF6",
+"=&	c #AED6EF",
+"-&	c #60A8EA",
+";&	c #F3FBFA",
+">&	c #73B8EB",
+",&	c #61AFF5",
+"'&	c #FBFFFD",
+")&	c #D4ECF7",
+"!&	c #62ADEF",
+"~&	c #0A82F4",
+"{&	c #037EFC",
+"]&	c #D8ECF6",
+"^&	c #FDFDFE",
+"/&	c #3F3F3F",
+"(&	c #020203",
+"_&	c #C7C7C5",
+":&	c #FEFEF8",
+"<&	c #63ACE9",
+"[&	c #0380FA",
+"}&	c #0A7FF1",
+"|&	c #5AAAF1",
+"1&	c #CDE7F5",
+"2&	c #FAFBFA",
+"3&	c #FDFBF9",
+"4&	c #82C1EC",
+"5&	c #047FFB",
+"6&	c #057FFA",
+"7&	c #3298F3",
+"8&	c #A8D4F0",
+"9&	c #1787F2",
+"0&	c #067DFB",
+"a&	c #037EFD",
+"b&	c #A9D3EE",
+"c&	c #FAFFFD",
+"d&	c #DBEDF8",
+"e&	c #1484F5",
+"f&	c #8BC3EB",
+"g&	c #B7DCF1",
+"h&	c #1481F5",
+"i&	c #B7DCF4",
+"j&	c #FBFDF6",
+"k&	c #FAFEFF",
+"l&	c #DBEFF8",
+"m&	c #0781F6",
+"n&	c #92C8F0",
+"o&	c #F7FCFD",
+"p&	c #6CB6F1",
+"q&	c #0180FA",
+"r&	c #FEFBFE",
+"s&	c #CFE9F5",
+"t&	c #5CACF1",
+"u&	c #077EF6",
+"v&	c #047EFD",
+"w&	c #4DA5F0",
+"x&	c #FCFCFD",
+"y&	c #D9D9D9",
+"z&	c #6B6A68",
+"A&	c #FCFFFD",
+"B&	c #BBDCF6",
+"C&	c #077FF5",
+"D&	c #51A6EE",
+"E&	c #B2D6F2",
+"F&	c #98CCEB",
+"G&	c #0480FA",
+"H&	c #2491F2",
+"I&	c #F6FCFD",
+"J&	c #FCFFFB",
+"K&	c #C8E5F5",
+"L&	c #2F94EE",
+"M&	c #0381FB",
+"N&	c #057DFD",
+"O&	c #CBE6F4",
+"P&	c #FEFEF9",
+"Q&	c #A5D6F1",
+"R&	c #1A84EA",
+"S&	c #E3F3F7",
+"T&	c #FFFEFD",
+"U&	c #F6F9F9",
+"V&	c #328FEA",
+"W&	c #82BBEB",
+"X&	c #FBFEFE",
+"Y&	c #FFFEFC",
+"Z&	c #ECF7FA",
+"`&	c #0E7FF0",
+" *	c #1888F3",
+".*	c #B9DCF2",
+"+*	c #FBFEFD",
+"@*	c #4099F1",
+"#*	c #74BBF2",
+"$*	c #C6E6F6",
+"%*	c #57A9ED",
+"&*	c #097EF8",
+"**	c #057EFB",
+"=*	c #A3CEF0",
+"-*	c #858581",
+";*	c #505050",
+">*	c #CCCCCC",
+",*	c #8F8F8F",
+"'*	c #626262",
+")*	c #F6F6F6",
+"!*	c #EEF9FB",
+"~*	c #1F89F2",
+"{*	c #047EFA",
+"]*	c #0281FE",
+"^*	c #1588F4",
+"/*	c #0480FB",
+"(*	c #0A7FED",
+"_*	c #EAF7FB",
+":*	c #FCFFFF",
+"<*	c #FFFEFA",
+"[*	c #E0F5FA",
+"}*	c #489EE7",
+"|*	c #0F81F2",
+"1*	c #E6F4FA",
+"2*	c #C2DFEC",
+"3*	c #FDFFFB",
+"4*	c #C4E3EF",
+"5*	c #EFFBFB",
+"6*	c #F6FFFD",
+"7*	c #3795EF",
+"8*	c #3898F0",
+"9*	c #CEE6F2",
+"0*	c #389BF4",
+"a*	c #168AF7",
+"b*	c #0C7FF2",
+"c*	c #0183FD",
+"d*	c #1584F4",
+"e*	c #E7F5FA",
+"f*	c #F9FDFC",
+"g*	c #FDFAFB",
+"h*	c #2C2C2B",
+"i*	c #BEBEBE",
+"j*	c #EDEDED",
+"k*	c #727272",
+"l*	c #A2A2A2",
+"m*	c #E5E5E5",
+"n*	c #858585",
+"o*	c #474747",
+"p*	c #1D1D1D",
+"q*	c #A9A9A9",
+"r*	c #6EB2EE",
+"s*	c #0D7DED",
+"t*	c #E6F8F9",
+"u*	c #FEFCF9",
+"v*	c #F5FCFB",
+"w*	c #3192E6",
+"x*	c #FFFDFC",
+"y*	c #52A1EC",
+"z*	c #5AA5EA",
+"A*	c #E4F5FA",
+"B*	c #F5FDFE",
+"C*	c #1C88EB",
+"D*	c #0282F7",
+"E*	c #1A89F0",
+"F*	c #057EFD",
+"G*	c #55A5F0",
+"H*	c #F7FDFA",
+"I*	c #FCFAF9",
+"J*	c #D5D6D5",
+"K*	c #111111",
+"L*	c #777777",
+"M*	c #E6E6E6",
+"N*	c #C2C2C2",
+"O*	c #E7E7E7",
+"P*	c #D7D7D7",
+"Q*	c #797979",
+"R*	c #CAE4F3",
+"S*	c #087EF5",
+"T*	c #B5DDF2",
+"U*	c #93CAF2",
+"V*	c #248CF1",
+"W*	c #0080FD",
+"X*	c #077EF9",
+"Y*	c #BFDFF1",
+"Z*	c #F8FCFE",
+"`*	c #CBDFEA",
+" =	c #F5FEFD",
+".=	c #FEFFF8",
+"+=	c #FFFDFD",
+"@=	c #C4E1F3",
+"#=	c #F6FCF9",
+"$=	c #FEFFFA",
+"%=	c #EEFCFE",
+"&=	c #0A7EEC",
+"*=	c #258BF2",
+"==	c #90CAF0",
+"-=	c #D9F0F5",
+";=	c #A9D5F1",
+">=	c #A4A3A5",
+",=	c #6A6A69",
+"'=	c #2B2B2B",
+")=	c #5D5D5D",
+"!=	c #FDFAFD",
+"~=	c #F8FEFC",
+"{=	c #3497F4",
+"]=	c #057EFC",
+"^=	c #5BA8ED",
+"/=	c #F8FDFE",
+"(=	c #F6FCFB",
+"_=	c #9ECBF1",
+":=	c #3699EF",
+"<=	c #0980F2",
+"[=	c #ADD8F7",
+"}=	c #FEFDFC",
+"|=	c #FFFFFB",
+"1=	c #FFFFFD",
+"2=	c #E8FAFC",
+"3=	c #107BF2",
+"4=	c #2890F1",
+"5=	c #9ACBEE",
+"6=	c #F3FDFD",
+"7=	c #87C2F0",
+"8=	c #1989F1",
+"9=	c #E5F6FB",
+"0=	c #FAFEFD",
+"a=	c #F6FDFE",
+"b=	c #6C6C6C",
+"c=	c #A6A6A6",
+"d=	c #FFFFFA",
+"e=	c #E8F0F4",
+"f=	c #539CE1",
+"g=	c #72B8F0",
+"h=	c #A2D3EE",
+"i=	c #D9EDF8",
+"j=	c #F0F9F8",
+"k=	c #FCFEF8",
+"l=	c #FEFFF9",
+"m=	c #81C0F1",
+"n=	c #1583ED",
+"o=	c #EAF7FC",
+"p=	c #FBFDFA",
+"q=	c #F8FBFC",
+"r=	c #B9DDF6",
+"s=	c #4B9FF0",
+"t=	c #0881F7",
+"u=	c #AED4F1",
+"v=	c #FFFEF4",
+"w=	c #B7DBF2",
+"x=	c #0283FC",
+"y=	c #2E93F2",
+"z=	c #9ECEF1",
+"A=	c #F3F9FC",
+"B=	c #FAFFFE",
+"C=	c #3092EC",
+"D=	c #0181F9",
+"E=	c #75B6EE",
+"F=	c #FDFDFA",
+"G=	c #FAFCFE",
+"H=	c #F1FCFD",
+"I=	c #E1F1FA",
+"J=	c #B2D5F0",
+"K=	c #75B7F4",
+"L=	c #51A2E7",
+"M=	c #D8E7ED",
+"N=	c #E4E4E3",
+"O=	c #8CC6F1",
+"P=	c #057CFA",
+"Q=	c #0480F8",
+"R=	c #057DF9",
+"S=	c #2088F3",
+"T=	c #53A5F0",
+"U=	c #7FBDEF",
+"V=	c #B8DCF2",
+"W=	c #E1F0F8",
+"X=	c #F4FFF9",
+"Y=	c #FEFBF9",
+"Z=	c #CDEAF5",
+"`=	c #0982F4",
+" -	c #A4CEF2",
+".-	c #FEFDFF",
+"+-	c #C0DFF5",
+"@-	c #50A1ED",
+"#-	c #80B7E2",
+"$-	c #BDDCF2",
+"%-	c #3792EE",
+"&-	c #A4D0F1",
+"*-	c #F2FBFC",
+"=-	c #FDFEF9",
+"--	c #D6EAF4",
+";-	c #0680F9",
+">-	c #BDDEF4",
+",-	c #F7FEFF",
+"'-	c #E3F6FC",
+")-	c #BCDBF2",
+"!-	c #8AC4F1",
+"~-	c #53A5EB",
+"{-	c #2790EF",
+"]-	c #077FF4",
+"^-	c #0480F7",
+"/-	c #7ABAEF",
+"(-	c #FBFCFC",
+"_-	c #505152",
+":-	c #49A4EB",
+"<-	c #057EF7",
+"[-	c #0D83F1",
+"}-	c #228CF2",
+"|-	c #5EAAEE",
+"1-	c #8AC5F1",
+"2-	c #1385F6",
+"3-	c #51A8F1",
+"4-	c #F9FDF9",
+"5-	c #EBF8F8",
+"6-	c #F6F9FB",
+"7-	c #F0FBF7",
+"8-	c #7CBCEF",
+"9-	c #1384F2",
+"0-	c #86C3EF",
+"a-	c #60ACEE",
+"b-	c #3594EA",
+"c-	c #1584EF",
+"d-	c #2F8FEE",
+"e-	c #EAF6F8",
+"f-	c #020302",
+"g-	c #B7B5B7",
+"h-	c #D0E9F6",
+"i-	c #1380F1",
+"j-	c #0281F7",
+"k-	c #0E80F2",
+"l-	c #EBF4F9",
+"m-	c #FDFEFF",
+"n-	c #F7FEFB",
+"o-	c #2B91EE",
+"p-	c #0E81F5",
+"q-	c #BBE0F5",
+"r-	c #C5C5C5",
+"s-	c #191919",
+"t-	c #ECECEC",
+"u-	c #FCFDFF",
+"v-	c #8DC6F1",
+"w-	c #0082FE",
+"x-	c #0280F9",
+"y-	c #057DFB",
+"z-	c #99CDEF",
+"A-	c #C1DDF4",
+"B-	c #0082FC",
+"C-	c #047DFF",
+"D-	c #047FF7",
+"E-	c #74B5E8",
+"F-	c #EEEBEF",
+"G-	c #272728",
+"H-	c #FEFCFD",
+"I-	c #F1FAFA",
+"J-	c #409DF0",
+"K-	c #54AAEF",
+"L-	c #72B3EB",
+"M-	c #3995EB",
+"N-	c #1685F2",
+"O-	c #0480FC",
+"P-	c #3995EF",
+"Q-	c #67B3EE",
+"R-	c #0380F9",
+"S-	c #0281FA",
+"T-	c #1281EF",
+"U-	c #2B8EEA",
+"V-	c #61ACF0",
+"W-	c #6AB4EA",
+"X-	c #0481F9",
+"Y-	c #027EFB",
+"Z-	c #3992EC",
+"`-	c #EDFBFD",
+" ;	c #6E716F",
+".;	c #010000",
+"+;	c #FEFBFA",
+"@;	c #D1EBF8",
+"#;	c #1A86ED",
+"$;	c #0181FF",
+"%;	c #3090ED",
+"&;	c #F6FDFD",
+"*;	c #EAF6F7",
+"=;	c #C1DFF2",
+"-;	c #8EC7F0",
+";;	c #61AEF4",
+">;	c #3090EC",
+",;	c #0682F7",
+"';	c #0E7FEF",
+");	c #D5EBF5",
+"!;	c #FBFFFE",
+"~;	c #1F89F1",
+"{;	c #097DF4",
+"];	c #2B8FEC",
+"^;	c #55A6F2",
+"/;	c #81BEF0",
+"(;	c #E1F1F6",
+"_;	c #F3FDFC",
+":;	c #F6FCF7",
+"<;	c #52A4E8",
+"[;	c #0A7FF6",
+"};	c #BADDF3",
+"|;	c #C7CACA",
+"1;	c #EDEEED",
+"2;	c #91C7EF",
+"3;	c #0580F6",
+"4;	c #6CB3EC",
+"5;	c #FAFEFC",
+"6;	c #DFF1FA",
+"7;	c #B4D7ED",
+"8;	c #CAE3ED",
+"9;	c #FDFBFA",
+"0;	c #EAF6F9",
+"a;	c #AED1E7",
+"b;	c #DDF1F9",
+"c;	c #F6FFFE",
+"d;	c #F7FFFF",
+"e;	c #FFFCFC",
+"f;	c #9FCCEE",
+"g;	c #71B5EE",
+"h;	c #FBFCFA",
+"i;	c #303030",
+"j;	c #434343",
+"k;	c #B6B6B6",
+"l;	c #F2F2F2",
+"m;	c #F9FFFD",
+"n;	c #F1FBF8",
+"o;	c #3F98E7",
+"p;	c #0480FD",
+"q;	c #0A82F1",
+"r;	c #C6E5F7",
+"s;	c #FEFDF8",
+"t;	c #FCFBF7",
+"u;	c #FEFBF5",
+"v;	c #FDFBFB",
+"w;	c #FCFFFC",
+"x;	c #E5F3F9",
+"y;	c #1586F2",
+"z;	c #2A91F3",
+"A;	c #EAF4FC",
+"B;	c #FBFEFA",
+"C;	c #F0F0F0",
+"D;	c #575757",
+"E;	c #CCE8F7",
+"F;	c #157EEB",
+"G;	c #3595EF",
+"H;	c #F0F8FA",
+"I;	c #F8FDF7",
+"J;	c #5AA9F0",
+"K;	c #0683F9",
+"L;	c #C1DFF6",
+"M;	c #929292",
+"N;	c #545454",
+"O;	c #E4F2FA",
+"P;	c #E3F2FB",
+"Q;	c #E4F1FB",
+"R;	c #E2F2FA",
+"S;	c #CAE3F5",
+"T;	c #A3D1EF",
+"U;	c #A7D2EC",
+"V;	c #45A2F0",
+"W;	c #007FFD",
+"X;	c #79BDEE",
+"Y;	c #FFFFFC",
+"Z;	c #A0D1EF",
+"`;	c #3B9AEA",
+" >	c #A2D1F2",
+".>	c #A5D1EE",
+"+>	c #C8E2F4",
+"@>	c #E3F2FC",
+"#>	c #E4F2FB",
+"$>	c #F3FDFE",
+"%>	c #7C7C7C",
+"&>	c #515151",
+"*>	c #F2FAFA",
+"=>	c #59A0E2",
+"->	c #0680F2",
+";>	c #077FF6",
+">>	c #0C81F3",
+",>	c #BDDFF3",
+"'>	c #F8FEFD",
+")>	c #E0F1F8",
+"!>	c #1C8AF0",
+"~>	c #067DFA",
+"{>	c #097EF4",
+"]>	c #5C9FE0",
+"^>	c #F0F8F7",
+"/>	c #494949",
+"(>	c #DFDFDF",
+"_>	c #E2F2F9",
+":>	c #5BACEF",
+"<>	c #3291ED",
+"[>	c #EDF6FB",
+"}>	c #F7F9FD",
+"|>	c #50A4ED",
+"1>	c #0082F9",
+"2>	c #3897EC",
+"3>	c #DEF3F9",
+"4>	c #F5F6F5",
+"5>	c #DCDCDC",
+"6>	c #F7FBFD",
+"7>	c #64AFE9",
+"8>	c #0280FF",
+"9>	c #097EF2",
+"0>	c #107CE9",
+"a>	c #0F7DEC",
+"b>	c #86B9E3",
+"c>	c #B1D6E9",
+"d>	c #117CE7",
+"e>	c #0E7DEB",
+"f>	c #0B7CF5",
+"g>	c #047DFA",
+"h>	c #097CFA",
+"i>	c #0381FA",
+"j>	c #0382FB",
+"k>	c #087CFC",
+"l>	c #4294EE",
+"m>	c #E4F4F9",
+"n>	c #FFFEF7",
+"o>	c #F4F3F4",
+"p>	c #484847",
+"q>	c #D9D8D9",
+"r>	c #F6FEFC",
+"s>	c #6FAFEB",
+"t>	c #3B99ED",
+"u>	c #BBDDF5",
+"v>	c #C1DDF3",
+"w>	c #C1DEF5",
+"x>	c #C0DEF6",
+"y>	c #C1DEF2",
+"z>	c #C1DEF4",
+"A>	c #DCF0F9",
+"B>	c #EFFEFD",
+"C>	c #F1FEFD",
+"D>	c #F4FEFD",
+"E>	c #F5FDFF",
+"F>	c #EFFEFF",
+"G>	c #F3FFFD",
+"H>	c #E5FAFA",
+"I>	c #C4DFF4",
+"J>	c #C0DEF5",
+"K>	c #C2DFF3",
+"L>	c #C2DEF1",
+"M>	c #BFDEF5",
+"N>	c #BFDEF1",
+"O>	c #66B3F0",
+"P>	c #67B2EC",
+"Q>	c #F7FDF7",
+"R>	c #2F2C2F",
+"S>	c #020103",
+"T>	c #F7FEFD",
+"U>	c #70B3EC",
+"V>	c #0D80F3",
+"W>	c #78B8ED",
+"X>	c #A9D3F2",
+"Y>	c #1082F2",
+"Z>	c #6EB3E8",
+"`>	c #F5FDFC",
+" ,	c #A2D3F3",
+".,	c #0B84F2",
+"+,	c #0581F9",
+"@,	c #73B5ED",
+"#,	c #FCFFF9",
+"$,	c #78B9F0",
+"%,	c #087EF7",
+"&,	c #74B7EC",
+"*,	c #F6FCFA",
+"=,	c #FFFDFA",
+"-,	c #D4D3D3",
+";,	c #1B1B1B",
+">,	c #A5A5A5",
+",,	c #F9FEFC",
+"',	c #ACD4F1",
+"),	c #1081F3",
+"!,	c #53A4EA",
+"~,	c #E9F6F9",
+"{,	c #F9FBFE",
+"],	c #F8FFFC",
+"^,	c #F9FCF9",
+"/,	c #EEF7F9",
+"(,	c #CCE4F2",
+"_,	c #C7E4F3",
+":,	c #ECF9FB",
+"<,	c #F7FFFE",
+"[,	c #FDFCF8",
+"},	c #FFFBFB",
+"|,	c #F2FDFC",
+"1,	c #6FB8ED",
+"2,	c #087DF7",
+"3,	c #1081F0",
+"4,	c #95C9EE",
+"5,	c #F6FBFD",
+"6,	c #B5B5B6",
+"7,	c #1B1918",
+"8,	c #010100",
+"9,	c #010200",
+"0,	c #2A2C2A",
+"a,	c #6B6B6B",
+"b,	c #EBEDEC",
+"c,	c #FBFCFE",
+"d,	c #ABD8F6",
+"e,	c #0381FC",
+"f,	c #3F98E9",
+"g,	c #EBF7FA",
+"h,	c #81B7E6",
+"i,	c #3697EB",
+"j,	c #1583F0",
+"k,	c #1184F6",
+"l,	c #1384F5",
+"m,	c #0D84F7",
+"n,	c #1184F5",
+"o,	c #1284F5",
+"p,	c #3994EC",
+"q,	c #97C7EC",
+"r,	c #F9FEFD",
+"s,	c #F5FFF7",
+"t,	c #70B2EC",
+"u,	c #0D82F3",
+"v,	c #A7D6F5",
+"w,	c #6C6C6A",
+"x,	c #2B2B2D",
+"y,	c #030202",
+"z,	c #030000",
+"A,	c #000201",
+"B,	c #D9D9DA",
+"C,	c #FDFBFD",
+"D,	c #FEFBFD",
+"E,	c #F6FCFC",
+"F,	c #B4E0F6",
+"G,	c #0082F7",
+"H,	c #3697ED",
+"I,	c #E7F3F6",
+"J,	c #F8FBFB",
+"K,	c #E4F3FA",
+"L,	c #A1CBEE",
+"M,	c #61ADEF",
+"N,	c #3495EE",
+"O,	c #2889E1",
+"P,	c #F2FBFD",
+"Q,	c #F4FEFE",
+"R,	c #8EC2EF",
+"S,	c #90C3ED",
+"T,	c #F0F7F8",
+"U,	c #0C7EEC",
+"V,	c #3594EF",
+"W,	c #61ACF3",
+"X,	c #9CCDEF",
+"Y,	c #E1F3FA",
+"Z,	c #F6FDFB",
+"`,	c #67A9E6",
+" '	c #9DCEF0",
+".'	c #E6E9E9",
+"+'	c #9B9D9E",
+"@'	c #5F5F60",
+"#'	c #232221",
+"$'	c #464646",
+"%'	c #F6FEFD",
+"&'	c #EFFAFC",
+"*'	c #C4DFF1",
+"='	c #82C1F2",
+"-'	c #4199EA",
+";'	c #0E82F4",
+">'	c #3B97EA",
+",'	c #D5EBF6",
+"''	c #D3E8F5",
+")'	c #379AF0",
+"!'	c #D1E7F5",
+"~'	c #DDF0F8",
+"{'	c #1883F0",
+"]'	c #1C87F0",
+"^'	c #DEF0F7",
+"/'	c #B8DEF3",
+"('	c #0480F5",
+"_'	c #077FF3",
+":'	c #3899ED",
+"<'	c #87C1F0",
+"['	c #D2E9F7",
+"}'	c #F7FDFD",
+"|'	c #C9E5F6",
+"1'	c #2E8FF1",
+"2'	c #0282FD",
+"3'	c #0C81F2",
+"4'	c #3D9BEE",
+"5'	c #74BAF2",
+"6'	c #C1E0F4",
+"7'	c #EBF7F9",
+"8'	c #D2D2D2",
+"9'	c #878787",
+"0'	c #454545",
+"a'	c #070707",
+"b'	c #2E2E2E",
+"c'	c #B8B8B8",
+"d'	c #D5EBF8",
+"e'	c #8EC6F0",
+"f'	c #52A5F1",
+"g'	c #228AEE",
+"h'	c #027EFD",
+"i'	c #72B4ED",
+"j'	c #F0F8FB",
+"k'	c #FCFBFA",
+"l'	c #E7F4F8",
+"m'	c #93C5EC",
+"n'	c #3997EF",
+"o'	c #0A7FEC",
+"p'	c #2691EE",
+"q'	c #B5D5EF",
+"r'	c #FBFFFC",
+"s'	c #97C9EF",
+"t'	c #1081EE",
+"u'	c #A9D1F0",
+"v'	c #ACD1F1",
+"w'	c #2B8EF1",
+"x'	c #0B7DF3",
+"y'	c #489EF2",
+"z'	c #A1CDF1",
+"A'	c #E8F3F9",
+"B'	c #F9FDFE",
+"C'	c #EDF9F8",
+"D'	c #73B3EC",
+"E'	c #097FF2",
+"F'	c #1786F3",
+"G'	c #449FEF",
+"H'	c #8EC4EE",
+"I'	c #CEE5F6",
+"J'	c #F1FDFE",
+"K'	c #F3F3F3",
+"L'	c #7B7B7B",
+"M'	c #E5F6FC",
+"N'	c #AAD2F1",
+"O'	c #68B3F2",
+"P'	c #288CEE",
+"Q'	c #087FF7",
+"R'	c #1C8AEF",
+"S'	c #AFD7F2",
+"T'	c #D0E9F8",
+"U'	c #6AB2EE",
+"V'	c #1887F3",
+"W'	c #047FFD",
+"X'	c #258BEF",
+"Y'	c #64B1EE",
+"Z'	c #ABD4F1",
+"`'	c #E1F1F8",
+" )	c #FCFCFE",
+".)	c #F8FFFB",
+"+)	c #F5FCFA",
+"@)	c #7EBFF1",
+"#)	c #0D7FF5",
+"$)	c #0F81F0",
+"%)	c #9ECFED",
+"&)	c #DAEFF9",
+"*)	c #A0D0F3",
+"=)	c #65AEEE",
+"-)	c #258CEF",
+";)	c #027FF9",
+">)	c #1B87ED",
+",)	c #77BAF0",
+"')	c #D1E8F6",
+"))	c #FBFEFB",
+"!)	c #F8FEFB",
+"~)	c #A1CDF3",
+"{)	c #1381F4",
+"])	c #027EFF",
+"^)	c #288CEA",
+"/)	c #5BABF3",
+"()	c #A7D2F1",
+"_)	c #DBEFF7",
+":)	c #EBF1F4",
+"<)	c #6CACE0",
+"[)	c #0880F3",
+"})	c #0082FD",
+"|)	c #DAEEF7",
+"1)	c #D2E7F8",
+"2)	c #5BAAF0",
+"3)	c #0C81F6",
+"4)	c #0083FD",
+"5)	c #268FEB",
+"6)	c #6FB5EC",
+"7)	c #CEE8F6",
+"8)	c #F2FAFD",
+"9)	c #F1FCFE",
+"0)	c #F8FCFB",
+"a)	c #51A6F5",
+"b)	c #127FE9",
+"c)	c #057FF7",
+"d)	c #077FF9",
+"e)	c #127DEA",
+"f)	c #4FA5F2",
+"g)	c #CBE5F6",
+"h)	c #FBFBFD",
+"i)	c #F4FCFE",
+"j)	c #C5DEF2",
+"k)	c #F1FDFF",
+"l)	c #F1FAFC",
+"m)	c #BFE2F5",
+"n)	c #70B5EA",
+"o)	c #278CF0",
+"p)	c #5FA7EF",
+"q)	c #CEE7F5",
+"r)	c #F6FDF9",
+"s)	c #CEECF4",
+"t)	c #2C8FF0",
+"u)	c #62A5E2",
+"v)	c #DDE7EC",
+"w)	c #3E3E3E",
+"x)	c #C6E7F7",
+"y)	c #3D9AEE",
+"z)	c #53A6F0",
+"A)	c #E5F4F6",
+"B)	c #DDF1FA",
+"C)	c #65ADEA",
+"D)	c #107FF2",
+"E)	c #62ADEC",
+"F)	c #BBDDF2",
+"G)	c #FEFAFC",
+"H)	c #E5F2F9",
+"I)	c #AAD3F4",
+"J)	c #6FB5ED",
+"K)	c #3893ED",
+"L)	c #0A80EC",
+"M)	c #087DFA",
+"N)	c #6AAEEE",
+"O)	c #F3FFFE",
+"P)	c #D1E7F7",
+"Q)	c #D0E6F4",
+"R)	c #F1FEFE",
+"S)	c #FBFFF9",
+"T)	c #66B1EB",
+"U)	c #067FF9",
+"V)	c #0C7DEB",
+"W)	c #3395F3",
+"X)	c #6CB4EC",
+"Y)	c #A9D9F0",
+"Z)	c #E9F7FB",
+"`)	c #F6FFFF",
+" !	c #B1D7F2",
+".!	c #62ADEE",
+"+!	c #0E81F1",
+"@!	c #0A7EF4",
+"#!	c #6FB5F0",
+"$!	c #DEF0F8",
+"%!	c #4EA2EA",
+"&!	c #077DFC",
+"*!	c #0680F6",
+"=!	c #3B9AF2",
+"-!	c #B3D6F1",
+";!	c #F9FDFD",
+">!	c #D2D2D1",
+",!	c #DFDEDE",
+"'!	c #FBFDFB",
+")!	c #FAFBFC",
+"!!	c #B2DAF2",
+"~!	c #3093EB",
+"{!	c #59A9EE",
+"]!	c #F0FAFD",
+"^!	c #FFFDFB",
+"/!	c #F0FBFC",
+"(!	c #80BAEE",
+"_!	c #1385F0",
+":!	c #208AF0",
+"<!	c #7DBBEC",
+"[!	c #DBEBF5",
+"}!	c #FDFBF8",
+"|!	c #DBF1F7",
+"1!	c #95C8F0",
+"2!	c #48A1F0",
+"3!	c #1180F2",
+"4!	c #5FACF3",
+"5!	c #E4F2F8",
+"6!	c #56A4EE",
+"7!	c #1181EB",
+"8!	c #49A2EF",
+"9!	c #9AC7ED",
+"0!	c #E5F4F9",
+"a!	c #D6ECF9",
+"b!	c #6AB0EE",
+"c!	c #1182F2",
+"d!	c #1185F2",
+"e!	c #98CBF0",
+"f!	c #F1F9FC",
+"g!	c #59A8EB",
+"h!	c #328FE7",
+"i!	c #9BCEF1",
+"j!	c #FBFCF7",
+"k!	c #DEDDDC",
+"l!	c #6C6F71",
+"m!	c #0E0D0C",
+"n!	c #484848",
+"o!	c #ABABAB",
+"p!	c #888888",
+"q!	c #EFEEEF",
+"r!	c #F0FAFC",
+"s!	c #9CCEF1",
+"t!	c #2790EE",
+"u!	c #0681F9",
+"v!	c #68ADEB",
+"w!	c #F1FBFB",
+"x!	c #C5E3F5",
+"y!	c #3996EB",
+"z!	c #1284F2",
+"A!	c #6EB4EB",
+"B!	c #DFF2F9",
+"C!	c #FCFCF9",
+"D!	c #B7DCF2",
+"E!	c #56A4E8",
+"F!	c #1181F5",
+"G!	c #268BED",
+"H!	c #8AC6F1",
+"I!	c #DEF2F6",
+"J!	c #F8FDFD",
+"K!	c #E0F3F8",
+"L!	c #8AC4F0",
+"M!	c #208CF2",
+"N!	c #1785F4",
+"O!	c #55A5EE",
+"P!	c #B5DCF4",
+"Q!	c #F9FCFD",
+"R!	c #DAEEF9",
+"S!	c #72B3ED",
+"T!	c #0F85F4",
+"U!	c #3495ED",
+"V!	c #5CA9EC",
+"W!	c #1B85F3",
+"X!	c #8DC6ED",
+"Y!	c #EFF9FB",
+"Z!	c #878786",
+"`!	c #000001",
+" ~	c #313131",
+".~	c #C7C7C7",
+"+~	c #161616",
+"@~	c #F9F8F3",
+"#~	c #FDFAF9",
+"$~	c #EEF5FC",
+"%~	c #85C3F2",
+"&~	c #7BB9EB",
+"*~	c #F6FDFA",
+"=~	c #F1F9F9",
+"-~	c #80BEEE",
+";~	c #0F83F1",
+">~	c #59A6E9",
+",~	c #DEEEF6",
+"'~	c #FEFCF6",
+")~	c #F1F9F8",
+"!~	c #94CAF0",
+"~~	c #2D93F0",
+"{~	c #097EF6",
+"]~	c #0280F6",
+"^~	c #067FFA",
+"/~	c #1183F5",
+"(~	c #449FED",
+"_~	c #70B6EC",
+":~	c #8DC7F4",
+"<~	c #92C6F3",
+"[~	c #73B5EA",
+"}~	c #439DF0",
+"|~	c #077DFA",
+"1~	c #3C99EF",
+"2~	c #ECF9F7",
+"3~	c #DCEDF9",
+"4~	c #59A6EC",
+"5~	c #037FF9",
+"6~	c #1484F0",
+"7~	c #86C4F3",
+"8~	c #F0F9FC",
+"9~	c #F9FFFE",
+"0~	c #F5FAFC",
+"a~	c #70B0EA",
+"b~	c #6EAFEE",
+"c~	c #E7F8F5",
+"d~	c #363636",
+"e~	c #AFAFAF",
+"f~	c #E1E1E1",
+"g~	c #A4A4A4",
+"h~	c #585858",
+"i~	c #232328",
+"j~	c #A2A3A7",
+"k~	c #FBFDF9",
+"l~	c #FBFFF8",
+"m~	c #DCEDF5",
+"n~	c #3D99F1",
+"o~	c #B5D9F1",
+"p~	c #F7FDFE",
+"q~	c #FCFBF8",
+"r~	c #99CBF2",
+"s~	c #288CF0",
+"t~	c #268BF3",
+"u~	c #9CCAF0",
+"v~	c #F7FDFC",
+"w~	c #B3D8F1",
+"x~	c #268CEF",
+"y~	c #0580F8",
+"z~	c #4B9FEF",
+"A~	c #DAEFF7",
+"B~	c #FDFDF7",
+"C~	c #B7B8B7",
+"D~	c #AAAAAA",
+"E~	c #747474",
+"F~	c #D8D8D8",
+"G~	c #010201",
+"H~	c #050301",
+"I~	c #383839",
+"J~	c #B0B1B3",
+"K~	c #B1D9F1",
+"L~	c #1C89F2",
+"M~	c #037EFB",
+"N~	c #0A7FF5",
+"O~	c #6DB6F1",
+"P~	c #B5DAF2",
+"Q~	c #3497EF",
+"R~	c #3895EC",
+"S~	c #C5E2F3",
+"T~	c #70B8EC",
+"U~	c #258FF0",
+"V~	c #B6DCF4",
+"W~	c #D2D3CE",
+"X~	c #373638",
+"Y~	c #E9E9E9",
+"Z~	c #9C9C9C",
+"`~	c #010202",
+" {	c #4A4B4B",
+".{	c #8FC5F0",
+"+{	c #238BEF",
+"@{	c #B8DDF3",
+"#{	c #67AEEA",
+"${	c #65B0EE",
+"%{	c #ECF5FB",
+"&{	c #ACD6F3",
+"*{	c #1B88F1",
+"={	c #1083F5",
+"-{	c #9ECBF0",
+";{	c #F8FCFA",
+">{	c #959595",
+",{	c #383838",
+"'{	c #F4FEFF",
+"){	c #7CB9EE",
+"!{	c #459EEE",
+"~{	c #F7FDF9",
+"{{	c #ABD4EF",
+"]{	c #258DF5",
+"^{	c #0181F7",
+"/{	c #0B7DF1",
+"({	c #1986EE",
+"_{	c #1588F2",
+":{	c #0B7FF0",
+"<{	c #0280F8",
+"[{	c #2190F4",
+"}{	c #B3D9F2",
+"|{	c #FBFEF9",
+"1{	c #DCEEF8",
+"2{	c #389AF3",
+"3{	c #0282FB",
+"4{	c #7BBAF3",
+"5{	c #FAFDF9",
+"6{	c #9F9F9F",
+"7{	c #E4E4E4",
+"8{	c #ACACAC",
+"9{	c #212121",
+"0{	c #DADADA",
+"a{	c #79B6EC",
+"b{	c #69B2F0",
+"c{	c #EBF9FA",
+"d{	c #6AB0F1",
+"e{	c #097DF6",
+"f{	c #0082FA",
+"g{	c #0D83F3",
+"h{	c #5BA8EE",
+"i{	c #AED5F2",
+"j{	c #D8F1F8",
+"k{	c #EDF6F9",
+"l{	c #DCF1F8",
+"m{	c #AAD5F5",
+"n{	c #479DEC",
+"o{	c #0580F7",
+"p{	c #0D80F6",
+"q{	c #79BAEF",
+"r{	c #EDF8FC",
+"s{	c #FBFBF9",
+"t{	c #EBF3F8",
+"u{	c #6BADEC",
+"v{	c #73B8EC",
+"w{	c #FAFCF9",
+"x{	c #6F6F6F",
+"y{	c #666666",
+"z{	c #808080",
+"A{	c #CBCBCB",
+"B{	c #9A9A9A",
+"C{	c #F8FFFF",
+"D{	c #6FB4F1",
+"E{	c #0681F6",
+"F{	c #0A81F5",
+"G{	c #88C1EE",
+"H{	c #D4EBF7",
+"I{	c #469BED",
+"J{	c #248CEF",
+"K{	c #C0E1F7",
+"L{	c #C1DFF4",
+"M{	c #419DEE",
+"N{	c #F2FCFB",
+"O{	c #6FB2EF",
+"P{	c #087EF9",
+"Q{	c #4D4D4D",
+"R{	c #999999",
+"S{	c #6CB1EA",
+"T{	c #0E80F5",
+"U{	c #ABD3F1",
+"V{	c #FAFBFB",
+"W{	c #BFDFF4",
+"X{	c #218AEE",
+"Y{	c #067EFA",
+"Z{	c #2C90EE",
+"`{	c #DAF1F9",
+" ]	c #FDFDFF",
+".]	c #D2ECF7",
+"+]	c #278DF0",
+"@]	c #238BEC",
+"#]	c #C9EAF7",
+"$]	c #80BCED",
+"%]	c #0882F6",
+"&]	c #6CB0F1",
+"*]	c #868686",
+"=]	c #77B9EF",
+"-]	c #A9D7EF",
+";]	c #FCFBFD",
+">]	c #A6D0F2",
+",]	c #1686F1",
+"']	c #D8ECF7",
+")]	c #92C5EA",
+"!]	c #6CB3F0",
+"~]	c #70B3ED",
+"{]	c #9ECEED",
+"]]	c #EDF9FC",
+"^]	c #0F85F5",
+"/]	c #1A86F1",
+"(]	c #A4D2F5",
+"_]	c #84BEEC",
+":]	c #0480F4",
+"<]	c #353535",
+"[]	c #202020",
+"}]	c #5C5C5C",
+"|]	c #B0B0B0",
+"1]	c #757575",
+"2]	c #95C9F0",
+"3]	c #0881F8",
+"4]	c #0381F8",
+"5]	c #96C7F0",
+"6]	c #A1CDF0",
+"7]	c #0C82F6",
+"8]	c #057DFC",
+"9]	c #79B9F1",
+"0]	c #BFE0F4",
+"a]	c #2489EB",
+"b]	c #047EF9",
+"c]	c #328FED",
+"d]	c #BDDFF1",
+"e]	c #7BBBED",
+"f]	c #0B82F6",
+"g]	c #A0CFF2",
+"h]	c #F5FCFE",
+"i]	c #0A81F7",
+"j]	c #9CCEF2",
+"k]	c #FCFDF7",
+"l]	c #989898",
+"m]	c #939393",
+"n]	c #131313",
+"o]	c #8C8C8C",
+"p]	c #BBE1F7",
+"q]	c #1383EF",
+"r]	c #85BEF3",
+"s]	c #F9FDFA",
+"t]	c #9CCCEE",
+"u]	c #0A82F3",
+"v]	c #0C7FF3",
+"w]	c #D6EDF5",
+"x]	c #1D89EE",
+"y]	c #1F88E8",
+"z]	c #E4F6FB",
+"A]	c #D6EDF6",
+"B]	c #0982F7",
+"C]	c #0982F8",
+"D]	c #9ECDF3",
+"E]	c #F7FDFB",
+"F]	c #87BDEF",
+"G]	c #1687F4",
+"H]	c #BEE0F1",
+"I]	c #252525",
+"J]	c #B4B4B4",
+"K]	c #DAEFFA",
+"L]	c #2189ED",
+"M]	c #61AAEF",
+"N]	c #F5FEFA",
+"O]	c #B4DAF3",
+"P]	c #0C7EF4",
+"Q]	c #74B5EB",
+"R]	c #83BEEE",
+"S]	c #1C89EF",
+"T]	c #1585F3",
+"U]	c #BFE4F6",
+"V]	c #F7FBFB",
+"W]	c #51A6F0",
+"X]	c #2C8FF3",
+"Y]	c #E1F0F7",
+"Z]	c #9E9E9E",
+"`]	c #0C0C0C",
+" ^	c #A3A3A3",
+".^	c #F7F9FB",
+"+^	c #439BF1",
+"@^	c #3999EB",
+"#^	c #F5FAFD",
+"$^	c #C4E1F7",
+"%^	c #4B9DED",
+"&^	c #2D8DEA",
+"*^	c #439DF1",
+"=^	c #F9FFFF",
+"-^	c #44A0EE",
+";^	c #1785EF",
+">^	c #C4E3F3",
+",^	c #EEF8FA",
+"'^	c #3394EE",
+")^	c #4DA3EE",
+"!^	c #F2FBFB",
+"~^	c #ADADAD",
+"{^	c #84BFEE",
+"]^	c #1E84F3",
+"^^	c #D7EDF5",
+"/^	c #DAF1FA",
+"(^	c #248DEC",
+"_^	c #047EFF",
+":^	c #489FEE",
+"<^	c #F5FDFD",
+"[^	c #2C8DE8",
+"}^	c #4098E8",
+"|^	c #499FEB",
+"1^	c #2E92EE",
+"2^	c #CDE8F7",
+"3^	c #1788F3",
+"4^	c #077EFA",
+"5^	c #91C6EF",
+"6^	c #3A3A3A",
+"7^	c #D2E7F6",
+"8^	c #0C84F3",
+"9^	c #0981F8",
+"0^	c #B0D8F5",
+"a^	c #F1F9FB",
+"b^	c #4199EE",
+"c^	c #439AEF",
+"d^	c #F8FEF9",
+"e^	c #5FADF2",
+"f^	c #0182FA",
+"g^	c #78B9F1",
+"h^	c #258EF1",
+"i^	c #52A4EE",
+"j^	c #F1FAF9",
+"k^	c #A1CDEF",
+"l^	c #CDE9F6",
+"m^	c #FDFCFE",
+"n^	c #656565",
+"o^	c #7A7A7A",
+"p^	c #3E97F1",
+"q^	c #62AFF0",
+"r^	c #7FBAED",
+"s^	c #0D80F4",
+"t^	c #DBF1F6",
+"u^	c #D2E7F4",
+"v^	c #1285F4",
+"w^	c #1782F4",
+"x^	c #DAF1F7",
+"y^	c #E4F1F7",
+"z^	c #0981F4",
+"A^	c #86C1F0",
+"B^	c #F3FCFE",
+"C^	c #55A3EE",
+"D^	c #037FF8",
+"E^	c #4A9EEC",
+"F^	c #4E4E4E",
+"G^	c #C8C8C8",
+"H^	c #B7B7B7",
+"I^	c #C6C6C6",
+"J^	c #FFFDF9",
+"K^	c #92C7EB",
+"L^	c #0580FA",
+"M^	c #278CF1",
+"N^	c #E8F7F7",
+"O^	c #BADFF4",
+"P^	c #0A80F6",
+"Q^	c #0182FD",
+"R^	c #8CC3F2",
+"S^	c #A7D2EF",
+"T^	c #1080EF",
+"U^	c #1A89F4",
+"V^	c #A6D2F3",
+"W^	c #8FC2ED",
+"X^	c #0D83F8",
+"Y^	c #CCE5F4",
+"Z^	c #E0F2F7",
+"`^	c #1E8BF3",
+" /	c #067FFB",
+"./	c #9FCFEE",
+"+/	c #E5F4F7",
+"@/	c #1788F0",
+"#/	c #0581F3",
+"$/	c #B0D8F4",
+"%/	c #E3F7FB",
+"&/	c #298DEF",
+"*/	c #2087F6",
+"=/	c #E4F7FB",
+"-/	c #D7F0F8",
+";/	c #70B2EB",
+">/	c #48A4F5",
+",/	c #4AA3F3",
+"'/	c #7CBBEC",
+")/	c #DAEEF8",
+"!/	c #D7EFF8",
+"~/	c #3495EC",
+"{/	c #96C8EE",
+"]/	c #0A7FF4",
+"^/	c #248FF0",
+"//	c #E5F5FA",
+"(/	c #272727",
+"_/	c #282828",
+":/	c #7FBBED",
+"</	c #48A3F0",
+"[/	c #76B4EC",
+"}/	c #3F9AEC",
+"|/	c #ECF8F8",
+"1/	c #FFFEF8",
+"2/	c #E1F2F9",
+"3/	c #3E97E9",
+"4/	c #7BBBF0",
+"5/	c #3E99EB",
+"6/	c #7CBBEE",
+"7/	c #979797",
+"8/	c #1586F3",
+"9/	c #0D7FF3",
+"0/	c #C9E7F7",
+"a/	c #CBE8F6",
+"b/	c #1583F2",
+"c/	c #0180F9",
+"d/	c #3597F0",
+"e/	c #D9EDF6",
+"f/	c #FFFEF9",
+"g/	c #D7EDF6",
+"h/	c #3C96E7",
+"i/	c #1683F0",
+"j/	c #D9EFF9",
+"k/	c #B5DAF3",
+"l/	c #1884F4",
+"m/	c #E4F4F7",
+"n/	c #5B5B5B",
+"o/	c #5AADF0",
+"p/	c #50A6EF",
+"q/	c #067FF6",
+"r/	c #1788F2",
+"s/	c #7DBBEE",
+"t/	c #CBE7F3",
+"u/	c #C8E6F6",
+"v/	c #63B1EF",
+"w/	c #1183F2",
+"x/	c #55A5ED",
+"y/	c #439DE9",
+"z/	c #047DFC",
+"A/	c #78B9EE",
+"B/	c #B9B9B9",
+"C/	c #676767",
+"D/	c #E3F2FA",
+"E/	c #1485F1",
+"F/	c #D7E9F6",
+"G/	c #C6E2F6",
+"H/	c #097FF7",
+"I/	c #0980F4",
+"J/	c #1484F2",
+"K/	c #2C91ED",
+"L/	c #218AF2",
+"M/	c #1583F7",
+"N/	c #0A80F1",
+"O/	c #C2E3F5",
+"P/	c #C8E5F4",
+"Q/	c #1887F0",
+"R/	c #EAF8FC",
+"S/	c #7D7D7D",
+"T/	c #0182FC",
+"U/	c #56A6EA",
+"V/	c #4CA1ED",
+"W/	c #4BA2ED",
+"X/	c #F8FCFD",
+"Y/	c #499EED",
+"Z/	c #90C5ED",
+"`/	c #F5FBFB",
+" (	c #288DF4",
+".(	c #077DF6",
+"+(	c #BBE1F5",
+"@(	c #C4E0F2",
+"#(	c #0080FC",
+"$(	c #D1EAF7",
+"%(	c #B5D7F2",
+"&(	c #3894EF",
+"*(	c #F3FCFD",
+"=(	c #616161",
+"-(	c #636363",
+";(	c #ABD8F3",
+">(	c #3193F2",
+",(	c #59AAEF",
+"'(	c #66AEEB",
+")(	c #2C8FEC",
+"!(	c #BADEF2",
+"~(	c #232323",
+"{(	c #BDBDBD",
+"](	c #5AA7E7",
+"^(	c #93C5F2",
+"/(	c #0D81EE",
+"((	c #2C8DEB",
+"_(	c #66B3F2",
+":(	c #72B2EA",
+"<(	c #6FB3EB",
+"[(	c #56ABEF",
+"}(	c #1F86F0",
+"|(	c #E7F3F9",
+"1(	c #8BC2F0",
+"2(	c #73B6F1",
+"3(	c #FAFFFC",
+"4(	c #767676",
+"5(	c #898989",
+"6(	c #EBF4FA",
+"7(	c #1886F2",
+"8(	c #0B7DF4",
+"9(	c #DAEEF6",
+"0(	c #8BC2EF",
+"a(	c #1184EF",
+"b(	c #9AD0F5",
+"c(	c #8BC9EF",
+"d(	c #0F81F5",
+"e(	c #98C8EF",
+"f(	c #0A7DF3",
+"g(	c #2489EE",
+"h(	c #C3C3C3",
+"i(	c #ABD6F0",
+"j(	c #0082FF",
+"k(	c #4A9FED",
+"l(	c #F8FEFF",
+"m(	c #2F94ED",
+"n(	c #1C87F2",
+"o(	c #D7EDF7",
+"p(	c #FDFCF7",
+"q(	c #AFDAF3",
+"r(	c #1582EE",
+"s(	c #46A1F0",
+"t(	c #479FF1",
+"u(	c #B9DCF5",
+"v(	c #66B3EF",
+"w(	c #95C7EF",
+"x(	c #D3EAF5",
+"y(	c #0780F8",
+"z(	c #ACD5F4",
+"A(	c #F6FDFC",
+"B(	c #E0F1F6",
+"C(	c #FBFCF4",
+"D(	c #9CCEF4",
+"E(	c #097EF0",
+"F(	c #DFF0F9",
+"G(	c #86BFEF",
+"H(	c #F4FDFD",
+"I(	c #288DEE",
+"J(	c #D1E8F5",
+"K(	c #89C1F1",
+"L(	c #3293EF",
+"M(	c #D8F0F8",
+"N(	c #50A0E9",
+"O(	c #0B7EF2",
+"P(	c #0B7EED",
+"Q(	c #4CA1EC",
+"R(	c #D6F0F9",
+"S(	c #3192F0",
+"T(	c #93C8F1",
+"U(	c #D2E8F5",
+"V(	c #3593F0",
+"W(	c #CDCDCD",
+"X(	c #D4EBF6",
+"Y(	c #2F91EE",
+"Z(	c #F4FCFD",
+"`(	c #4AA0EE",
+" _	c #76BBF2",
+"._	c #F7FCFA",
+"+_	c #479CE7",
+"@_	c #4A9AE4",
+"#_	c #78BAF2",
+"$_	c #56A9EE",
+"%_	c #F3FBFD",
+"&_	c #248CEE",
+"*_	c #0D81F1",
+"=_	c #E0F2F9",
+"-_	c #A8D2F3",
+";_	c #5FA9EE",
+">_	c #0F81F1",
+",_	c #91C6F4",
+"'_	c #0882F7",
+")_	c #DEEFF9",
+"!_	c #8EC5F6",
+"~_	c #1889F2",
+"{_	c #5BAAEF",
+"]_	c #ACD3F3",
+"^_	c #6BB1EB",
+"/_	c #94C8F3",
+"(_	c #BBDDF0",
+"__	c #91C7F4",
+":_	c #D2E8F6",
+"<_	c #0E81F4",
+"[_	c #DDEFF7",
+"}_	c #93C5F4",
+"|_	c #CAE5F5",
+"1_	c #89C2EF",
+"2_	c #7CBAEE",
+"3_	c #3C98F1",
+"4_	c #C8E3F4",
+"5_	c #88C1F1",
+"6_	c #7ABCF1",
+"7_	c #58A5ED",
+"8_	c #F9FFFC",
+"9_	c #71B1F1",
+"0_	c #90C5F3",
+"a_	c #BDDBF0",
+"b_	c #46A2F3",
+"c_	c #595959",
+"d_	c #F2F9FB",
+"e_	c #238AF1",
+"f_	c #0C80F8",
+"g_	c #E4F1F9",
+"h_	c #64AAEE",
+"i_	c #F2F9FA",
+"j_	c #DEEFF8",
+"k_	c #1283F3",
+"l_	c #1682EF",
+"m_	c #5DAAF0",
+"n_	c #F2F9FC",
+"o_	c #3490EE",
+"p_	c #6FB3EE",
+"q_	c #E0F2FB",
+"r_	c #2891F4",
+"s_	c #F5FCFC",
+"t_	c #696969",
+"u_	c #0C7CF0",
+"v_	c #2C90EF",
+"w_	c #F3FEFD",
+"x_	c #419CED",
+"y_	c #9ACCF2",
+"z_	c #E2F5FB",
+"A_	c #E4F5F9",
+"B_	c #8FC5F1",
+"C_	c #49A1EC",
+"D_	c #F2FCFE",
+"E_	c #2490F0",
+"F_	c #0B7DEE",
+"G_	c #C3E5F4",
+"H_	c #3C96EE",
+"I_	c #1084F7",
+"J_	c #1485EE",
+"K_	c #B3D8F4",
+"L_	c #B0DCF5",
+"M_	c #1185F1",
+"N_	c #208BED",
+"O_	c #2F90E7",
+"P_	c #ACD6F4",
+"Q_	c #61B1F6",
+"R_	c #E6F7F6",
+"S_	c #0E81F3",
+"T_	c #8CC2EC",
+"U_	c #EBF8FC",
+"V_	c #E3F5FC",
+"W_	c #83BAEC",
+"X_	c #0F83F2",
+"Y_	c #1184F4",
+"Z_	c #F7FCFE",
+"`_	c #61B0F7",
+" :	c #B1D5F1",
+".:	c #62B1F4",
+"+:	c #C9E2F2",
+"@:	c #1E87F0",
+"#:	c #4CA3F1",
+"$:	c #6BB4EF",
+"%:	c #4EA3EF",
+"&:	c #1282F0",
+"*:	c #64AFF5",
+"=:	c #AFD5F4",
+"-:	c #7FB9E9",
+";:	c #88C2EE",
+">:	c #C6E3F4",
+",:	c #067DF9",
+"':	c #C7E3F3",
+"):	c #A0D1F4",
+"!:	c #73B6EA",
+"~:	c #A0CEEE",
+"{:	c #C6E3F2",
+"]:	c #087EF4",
+"^:	c #C4E3F4",
+"/:	c #65AFF4",
+"(:	c #74B6EA",
+"_:	c #75B4ED",
+"::	c #A0CEEF",
+"<:	c #C7E3F4",
+"[:	c #047EF5",
+"}:	c #0082FB",
+"|:	c #067EF5",
+"1:	c #C6E3F3",
+"2:	c #9ECDED",
+"3:	c #71B5EA",
+"4:	c #047FF5",
+"5:	c #067DFC",
+"6:	c #0A7FF7",
+"7:	c #A1CEED",
+"8:	c #2188ED",
+"9:	c #9DD4F3",
+"0:	c #DEF0F5",
+"a:	c #D3E9F4",
+"b:	c #85C1EF",
+"c:	c #0C80F5",
+"d:	c #88C3F1",
+"e:	c #74B4EC",
+"f:	c #2589E9",
+"g:	c #CEE6F4",
+"h:	c #9ED0F1",
+"i:	c #0B81F7",
+"j:	c #62AFF5",
+"k:	c #8BC3EE",
+"l:	c #6FB2F0",
+"m:	c #C9E3F3",
+"n:	c #047FF6",
+"o:	c #CDE8F8",
+"p:	c #A5D3F2",
+"q:	c #0D82F4",
+"r:	c #087CF8",
+"s:	c #65B0F4",
+"t:	c #ADD5F5",
+"u:	c #AED5F5",
+"v:	c #66B0F4",
+"w:	c #CBE3F1",
+"x:	c #0083FA",
+"y:	c #D2E9F8",
+"z:	c #FCFCF3",
+"A:	c #A9D6F2",
+"B:	c #0B82F5",
+"C:	c #1082F3",
+"D:	c #E7F6F9",
+"E:	c #62B0F4",
+"F:	c #ACD5F5",
+"G:	c #ADD5F3",
+"H:	c #5EAEF6",
+"I:	c #2A8DEB",
+"J:	c #D8EBF6",
+"K:	c #AFD8F1",
+"L:	c #1182F5",
+"M:	c #1384EF",
+"N:	c #459FEA",
+"O:	c #BFDCF2",
+"P:	c #D7EFF6",
+"Q:	c #0780F7",
+"R:	c #308EEA",
+"S:	c #1887EE",
+"T:	c #2F8EEA",
+"U:	c #D7ECF7",
+"V:	c #B1DAF1",
+"W:	c #0F84F5",
+"X:	c #2E96F3",
+"Y:	c #2E90E8",
+"Z:	c #0A7DEF",
+"`:	c #E0F4F9",
+" <	c #0C7EF1",
+".<	c #248DF1",
+"+<	c #47A2ED",
+"@<	c #0282FC",
+"#<	c #2F8FEF",
+"$<	c #FEFFF7",
+"%<	c #B6DCF3",
+"&<	c #1285F2",
+"*<	c #50A0ED",
+"=<	c #E9F4F8",
+"-<	c #1983EE",
+";<	c #E7F8FC",
+"><	c #2E90F5",
+",<	c #DBF1FB",
+"'<	c #6EB7F0",
+")<	c #3090F1",
+"!<	c #DCEFF9",
+"~<	c #D6E9F2",
+"{<	c #EEF7FB",
+"]<	c #B9DFF5",
+"^<	c #1185F3",
+"/<	c #077CFB",
+"(<	c #81BDF5",
+"_<	c #D4EBF9",
+":<	c #3294EF",
+"<<	c #58A8F0",
+"[<	c #ABD3EC",
+"}<	c #9FCEED",
+"|<	c #3491E8",
+"1<	c #E0F0F8",
+"2<	c #FBFEF8",
+"3<	c #D6E6F2",
+"4<	c #2189F0",
+"5<	c #3D99E9",
+"6<	c #E2F5FA",
+"7<	c #FEFBF6",
+"8<	c #BDE0F3",
+"9<	c #AFD4F1",
+"0<	c #A6D0F0",
+"a<	c #64B2F0",
+"b<	c #AEAEAE",
+"c<	c #7EBBEE",
+"d<	c #87C2F3",
+"e<	c #CFE7F1",
+"f<	c #3894EB",
+"g<	c #E2F1F9",
+"h<	c #FFFFF8",
+"i<	c #1C8AEE",
+"j<	c #3C97E8",
+"k<	c #FEFAFE",
+"l<	c #C0E4F5",
+"m<	c #1687F3",
+"n<	c #DDEFF8",
+"o<	c #79B9F0",
+"p<	c #8DC3F0",
+"q<	c #4CA0EC",
+"r<	c #FBFCFF",
+"s<	c #F2FDF8",
+"t<	c #1F88F3",
+"u<	c #3C95EF",
+"v<	c #E4F2F7",
+"w<	c #C6E3F5",
+"x<	c #2088EB",
+"y<	c #3798EE",
+"z<	c #E0F2F6",
+"A<	c #FEFBFC",
+"B<	c #C4E3F5",
+"C<	c #1A88F0",
+"D<	c #2B91F0",
+"E<	c #3F99EB",
+"F<	c #0481F7",
+"G<	c #E0F3F9",
+"H<	c #127FEA",
+"I<	c #1686F3",
+"J<	c #5DA8EF",
+"K<	c #3F98EE",
+"L<	c #F9FDF6",
+"M<	c #FBFDF5",
+"N<	c #1C88F3",
+"O<	c #077CFD",
+"P<	c #3595EE",
+"Q<	c #C5E6F7",
+"R<	c #1C89F0",
+"S<	c #087CFB",
+"T<	c #6BB0F0",
+"U<	c #E6F7FC",
+"V<	c #0D82F1",
+"W<	c #1486F2",
+"X<	c #EBF5F9",
+"Y<	c #737373",
+"Z<	c #429DED",
+"`<	c #B9E0F5",
+" [	c #FEFBFB",
+".[	c #A5D0EF",
+"+[	c #4499E7",
+"@[	c #E5F4FA",
+"#[	c #C0E0F5",
+"$[	c #1A87F2",
+"%[	c #C8E5F6",
+"&[	c #1F89F0",
+"*[	c #B3D7F0",
+"=[	c #FCFCF8",
+"-[	c #AFD6F0",
+";[	c #459DF0",
+">[	c #1E1E1E",
+",[	c #80BDEF",
+"'[	c #76B7EF",
+")[	c #EFFBFA",
+"![	c #1783F4",
+"~[	c #0382FA",
+"{[	c #439AEB",
+"][	c #E9F5FA",
+"^[	c #1A86EE",
+"/[	c #3092E8",
+"([	c #FEF9FD",
+"_[	c #CBEAF7",
+":[	c #1F8BF1",
+"<[	c #69AFEE",
+"[[	c #8DC5F2",
+"}[	c #CDE6F5",
+"|[	c #2B8FEB",
+"1[	c #F4FAFD",
+"2[	c #499BEF",
+"3[	c #EEF6F8",
+"4[	c #F7FFFD",
+"5[	c #BCDCF3",
+"6[	c #1584EE",
+"7[	c #0281F6",
+"8[	c #2A91F0",
+"9[	c #D8EEF5",
+"0[	c #FEFAFD",
+"a[	c #D1EAF8",
+"b[	c #228DF0",
+"c[	c #5FAAF1",
+"d[	c #1D8AEF",
+"e[	c #CDE6F4",
+"f[	c #3698EE",
+"g[	c #CBE4F4",
+"h[	c #AED6ED",
+"i[	c #4D9EEC",
+"j[	c #EDF8FB",
+"k[	c #F7FEF9",
+"l[	c #B8D9F5",
+"m[	c #1384F6",
+"n[	c #1184F8",
+"o[	c #087CFD",
+"p[	c #278FEF",
+"q[	c #FDFBF7",
+"r[	c #D2EDF8",
+"s[	c #268DEE",
+"t[	c #B8DBF2",
+"u[	c #3996EE",
+"v[	c #84BEF0",
+"w[	c #6BB0EC",
+"x[	c #ECFCFC",
+"y[	c #268DED",
+"z[	c #51A0E5",
+"A[	c #B1D9F4",
+"B[	c #7BBBF1",
+"C[	c #D2EBF6",
+"D[	c #298EEA",
+"E[	c #D0ECF6",
+"F[	c #D6ECF8",
+"G[	c #278FEE",
+"H[	c #3390E8",
+"I[	c #F4FBF9",
+"J[	c #61ADEC",
+"K[	c #87BEEE",
+"L[	c #D8EBF7",
+"M[	c #0C81F5",
+"N[	c #1C85F1",
+"O[	c #EAF6FA",
+"P[	c #F8FFFE",
+"Q[	c #85C0EF",
+"R[	c #52A2EC",
+"S[	c #AED6F0",
+"T[	c #1482ED",
+"U[	c #80BFEF",
+"V[	c #D5EDF8",
+"W[	c #278EF0",
+"X[	c #258CEA",
+"Y[	c #FDF9FC",
+"Z[	c #D7EFF9",
+"`[	c #2990EF",
+" }	c #89C3F0",
+".}	c #E5F5FB",
+"+}	c #0D82F2",
+"@}	c #479FEE",
+"#}	c #A0CDF2",
+"$}	c #E9F5F8",
+"%}	c #1084F1",
+"&}	c #56A3EF",
+"*}	c #F2F8F8",
+"=}	c #B0D4F1",
+"-}	c #0E83F1",
+";}	c #087FF1",
+">}	c #81C1F1",
+",}	c #FAFBF9",
+"'}	c #298EF1",
+")}	c #218CF1",
+"!}	c #CEE9F4",
+"~}	c #2A91EF",
+"{}	c #1D88EF",
+"]}	c #EAF7F9",
+"^}	c #83BCED",
+"/}	c #56A7EF",
+"(}	c #AED8F3",
+"_}	c #0183F8",
+":}	c #258FEE",
+"<}	c #F2FAFE",
+"[}	c #6DB5EF",
+"}}	c #0580F9",
+"|}	c #5CA7EB",
+"1}	c #F4FBFB",
+"2}	c #F6FFFB",
+"3}	c #FBFCF5",
+"4}	c #A9D0F3",
+"5}	c #0C81F8",
+"6}	c #DBF0F9",
+"7}	c #2B92F0",
+"8}	c #087BFE",
+"9}	c #1C8AF1",
+"0}	c #CAE6F6",
+"a}	c #FCFBF6",
+"b}	c #DEF2F9",
+"c}	c #3193ED",
+"d}	c #077CFC",
+"e}	c #89C4F2",
+"f}	c #FBFCF9",
+"g}	c #B5D7F1",
+"h}	c #F4FEFA",
+"i}	c #2A90EF",
+"j}	c #99C9EF",
+"k}	c #DCEEF7",
+"l}	c #62A9E6",
+"m}	c #0C82F4",
+"n}	c #8FC5EE",
+"o}	c #3293ED",
+"p}	c #208AEC",
+"q}	c #3396ED",
+"r}	c #248BF1",
+"s}	c #E9F8F9",
+"t}	c #FCFBF9",
+"u}	c #9BCAEC",
+"v}	c #3E9BEE",
+"w}	c #98CBEF",
+"x}	c #268EEF",
+"y}	c #F1F9FA",
+"z}	c #65ACED",
+"A}	c #0982F5",
+"B}	c #93C8EF",
+"C}	c #DFF2FA",
+"D}	c #3295F0",
+"E}	c #1D88EC",
+"F}	c #C2E2F6",
+"G}	c #E1F4FA",
+"H}	c #3797ED",
+"I}	c #077DF9",
+"J}	c #8DC8F3",
+"K}	c #EFF9FA",
+"L}	c #298DEA",
+"M}	c #B6DAF4",
+"N}	c #F5FBFA",
+"O}	c #288FF1",
+"P}	c #067FFD",
+"Q}	c #91C8F3",
+"R}	c #EEF7FC",
+"S}	c #2A8DEC",
+"T}	c #0382F9",
+"U}	c #68ADF0",
+"V}	c #F5FAF9",
+"W}	c #F7FEFC",
+"X}	c #9DC9F1",
+"Y}	c #0B82F3",
+"Z}	c #0C80EF",
+"`}	c #94CBF2",
+" |	c #E0F2FA",
+".|	c #3695F0",
+"+|	c #1A88F2",
+"@|	c #C0E2F3",
+"#|	c #3899EE",
+"$|	c #3696ED",
+"%|	c #F2F7FA",
+"&|	c #91C8F1",
+"*|	c #439EF1",
+"=|	c #9FCDF0",
+"-|	c #218DF4",
+";|	c #ECF6FA",
+">|	c #B1D7F4",
+",|	c #0580F4",
+"'|	c #6BB0EB",
+")|	c #F6FFFC",
+"!|	c #FAFDF8",
+"~|	c #99C7F1",
+"{|	c #097FF8",
+"]|	c #9DCDEF",
+"^|	c #087BFD",
+"/|	c #FBFBF8",
+"(|	c #FFFCF7",
+"_|	c #3C99ED",
+":|	c #077DFD",
+"<|	c #0D81F4",
+"[|	c #B8DDF4",
+"}|	c #E3F1F9",
+"||	c #1584F3",
+"1|	c #C0DCF2",
+"2|	c #44A0F2",
+"3|	c #70B4F1",
+"4|	c #60AAEF",
+"5|	c #73B2E6",
+"6|	c #A3D1F0",
+"7|	c #E8F6FB",
+"8|	c #3C98EB",
+"9|	c #1585EE",
+"0|	c #B7DFF3",
+"a|	c #3E9CED",
+"b|	c #71B3E7",
+"c|	c #62ADE9",
+"d|	c #C1E1F4",
+"e|	c #0E80F4",
+"f|	c #107EF4",
+"g|	c #E1F4FB",
+"h|	c #238DF0",
+"i|	c #057EFF",
+"j|	c #77B4EC",
+"k|	c #8BC3ED",
+"l|	c #0A7FF0",
+"m|	c #0A83F5",
+"n|	c #5BA6E8",
+"o|	c #E8F7FC",
+"p|	c #3C9BEF",
+"q|	c #067EFB",
+"r|	c #1483EE",
+"s|	c #FCFAFA",
+"t|	c #449DEC",
+"u|	c #077DF8",
+"v|	c #3291EE",
+"w|	c #ECF9FC",
+"x|	c #FCFCF7",
+"y|	c #AED9F4",
+"z|	c #0B81F1",
+"A|	c #D8EEF8",
+"B|	c #79B8F1",
+"C|	c #077EFC",
+"D|	c #EEF6F9",
+"E|	c #B9DCF3",
+"F|	c #0883F6",
+"G|	c #0481F6",
+"H|	c #7BB7F0",
+"I|	c #FDFDF6",
+"J|	c #8ABFF0",
+"K|	c #0782F5",
+"L|	c #1082EE",
+"M|	c #A7D4F3",
+"N|	c #DBECF8",
+"O|	c #2B8FF0",
+"P|	c #2F92EB",
+"Q|	c #E9F6FC",
+"R|	c #B2DBF2",
+"S|	c #45A0ED",
+"T|	c #047DFD",
+"U|	c #1386F3",
+"V|	c #C3E0F5",
+"W|	c #E1F2F8",
+"X|	c #248AF0",
+"Y|	c #222222",
+"Z|	c #EFF7FB",
+"`|	c #3494EC",
+" 1	c #87C1EA",
+".1	c #7EBBED",
+"+1	c #F7FFFC",
+"@1	c #87BCEE",
+"#1	c #0780FA",
+"$1	c #1182EF",
+"%1	c #ADD6F1",
+"&1	c #DAEBF6",
+"*1	c #298FF3",
+"=1	c #2C91F0",
+"-1	c #DBEDF7",
+";1	c #1084F4",
+">1	c #ADD8F1",
+",1	c #EEF9FA",
+"'1	c #4BA1EC",
+")1	c #91CAF1",
+"!1	c #5FAAEC",
+"~1	c #3593EA",
+"{1	c #686868",
+"]1	c #BADEF5",
+"^1	c #0E86F7",
+"/1	c #0C7EF0",
+"(1	c #A5D4F4",
+"_1	c #F4FCF9",
+":1	c #60AAF0",
+"<1	c #83BCEA",
+"[1	c #FFFFF9",
+"}1	c #7EBAE9",
+"|1	c #0480F6",
+"11	c #0E85F4",
+"21	c #B0D8F3",
+"31	c #D0EBF9",
+"41	c #268DF0",
+"51	c #4CA0EB",
+"61	c #0F84F1",
+"71	c #AAD7F1",
+"81	c #FDFBFE",
+"91	c #F0FAFA",
+"01	c #4CA4ED",
+"a1	c #66ABEC",
+"b1	c #F8FDFA",
+"c1	c #0680FA",
+"d1	c #1483F1",
+"e1	c #82BCEA",
+"f1	c #1183F4",
+"g1	c #C8E3F3",
+"h1	c #F2FCFC",
+"i1	c #3896EF",
+"j1	c #0880F9",
+"k1	c #8ABFEE",
+"l1	c #F9FEFB",
+"m1	c #F9FFFB",
+"n1	c #79B9EC",
+"o1	c #0980F3",
+"p1	c #1086F4",
+"q1	c #B7DAF1",
+"r1	c #D3E8F7",
+"s1	c #258BED",
+"t1	c #2A8CE7",
+"u1	c #D0ECF8",
+"v1	c #EDF9FD",
+"w1	c #4BA4EF",
+"x1	c #087EFA",
+"y1	c #0E82F2",
+"z1	c #A4D3F2",
+"A1	c #FBFAFA",
+"B1	c #53A6EC",
+"C1	c #459EEB",
+"D1	c #BBDCF2",
+"E1	c #1183F1",
+"F1	c #F5FAF8",
+"G1	c #53AAEE",
+"H1	c #E7F6F8",
+"I1	c #4298ED",
+"J1	c #0882F3",
+"K1	c #FEFEF6",
+"L1	c #F4FCFB",
+"M1	c #78B5F0",
+"N1	c #1685EE",
+"O1	c #B8DCF3",
+"P1	c #CEE6F6",
+"Q1	c #208BF0",
+"R1	c #248DED",
+"S1	c #D3E9F7",
+"T1	c #F1FAFD",
+"U1	c #51A6EF",
+"V1	c #A1D2F2",
+"W1	c #FFFDF7",
+"X1	c #5CA7EC",
+"Y1	c #3C98EC",
+"Z1	c #D8EDF8",
+"`1	c #278DF7",
+" 2	c #F9FBFC",
+".2	c #E5F2F6",
+"+2	c #3193EC",
+"@2	c #EEF7FA",
+"#2	c #A6CEEE",
+"$2	c #F4FDFC",
+"%2	c #75B3ED",
+"&2	c #1885ED",
+"*2	c #BCDEF3",
+"=2	c #C7E6F7",
+"-2	c #2289EF",
+";2	c #218CF0",
+">2	c #CEE7F6",
+",2	c #59A6EB",
+"'2	c #9CCEEF",
+")2	c #F8FBFA",
+"!2	c #F2FAFB",
+"~2	c #86BEEC",
+"{2	c #E6F3F8",
+"]2	c #E8F7FA",
+"^2	c #288CED",
+"/2	c #3D95EB",
+"(2	c #2087EE",
+"_2	c #499CE7",
+":2	c #6EB0E7",
+"<2	c #1687F1",
+"[2	c #BDE1F7",
+"}2	c #C4E4F6",
+"|2	c #1D8BF0",
+"12	c #CEE7F4",
+"22	c #5DA8EB",
+"32	c #9ACEEF",
+"42	c #FBFAFD",
+"52	c #EDF7F8",
+"62	c #1E89F1",
+"72	c #DAF1FC",
+"82	c #C7E6F4",
+"92	c #0A7EF3",
+"02	c #B3D6F0",
+"a2	c #67ACEC",
+"b2	c #1487F2",
+"c2	c #C3E2F4",
+"d2	c #C7E3F5",
+"e2	c #1E88EC",
+"f2	c #59ABEF",
+"g2	c #0981F6",
+"h2	c #95CBEF",
+"i2	c #8AC0E9",
+"j2	c #1D8AEE",
+"k2	c #CBE5F5",
+"l2	c #ACD3F2",
+"m2	c #1781EB",
+"n2	c #FDFFF8",
+"o2	c #65AAEE",
+"p2	c #C9E5F5",
+"q2	c #C5E0F4",
+"r2	c #1988EF",
+"s2	c #C8E4F7",
+"t2	c #F8FDFF",
+"u2	c #60AFEF",
+"v2	c #087DF6",
+"w2	c #91CAF2",
+"x2	c #1881EA",
+"y2	c #CEEAF7",
+"z2	c #6DAAE2",
+"A2	c #1F89EC",
+"B2	c #BBDFF6",
+"C2	c #1885EF",
+"D2	c #1888F0",
+"E2	c #C0E1F4",
+"F2	c #69B0EC",
+"G2	c #98C8EB",
+"H2	c #C7E3F1",
+"I2	c #FAFCF8",
+"J2	c #2890EE",
+"K2	c #218CEE",
+"L2	c #C9E8F8",
+"M2	c #1485F2",
+"N2	c #1787F0",
+"O2	c #C0DFF2",
+"P2	c #077FF8",
+"Q2	c #0481FA",
+"R2	c #3392ED",
+"S2	c #C4E1F5",
+"T2	c #B8D8F1",
+"U2	c #EAF6FB",
+"V2	c #67B3EF",
+"W2	c #067FF4",
+"X2	c #B7DBF4",
+"Y2	c #1586F0",
+"Z2	c #B8DEF4",
+"`2	c #70B6F2",
+" 3	c #0780F4",
+".3	c #69B1EC",
+"+3	c #EBF9FC",
+"@3	c #F7FAFA",
+"#3	c #BBDEF0",
+"$3	c #EDFBFC",
+"%3	c #4EA4F2",
+"&3	c #0A80F4",
+"*3	c #5DACEC",
+"=3	c #FBFBFA",
+"-3	c #B8DDF6",
+";3	c #288CEC",
+">3	c #D2E9F6",
+",3	c #B6D8F3",
+"'3	c #1385F2",
+")3	c #74B7ED",
+"!3	c #3D96E5",
+"~3	c #C3E4F6",
+"{3	c #54A6EE",
+"]3	c #087EF8",
+"^3	c #A0C6E8",
+"/3	c #228CEF",
+"(3	c #F0FBFB",
+"_3	c #E2EFF6",
+":3	c #ADD7F4",
+"<3	c #0F82EF",
+"[3	c #1184F1",
+"}3	c #B0DAF3",
+"|3	c #268AEE",
+"13	c #0481F8",
+"23	c #0B7FF1",
+"33	c #B5D7ED",
+"43	c #93C7EE",
+"53	c #63ADEB",
+"63	c #E1F0F6",
+"73	c #AAD4F2",
+"83	c #1183EF",
+"93	c #B1D8F0",
+"03	c #ECF7F9",
+"a3	c #5FA6E5",
+"b3	c #1785F2",
+"c3	c #A1D0F1",
+"d3	c #FFFCFB",
+"e3	c #D4EBF8",
+"f3	c #3998F2",
+"g3	c #DBEDF6",
+"h3	c #0D84F4",
+"i3	c #ABD5F1",
+"j3	c #7DC0F2",
+"k3	c #4C9EED",
+"l3	c #D8ECF5",
+"m3	c #2D2D2D",
+"n3	c #F3FBFB",
+"o3	c #92C2EF",
+"p3	c #3E97EB",
+"q3	c #DBF1FA",
+"r3	c #FEFEF7",
+"s3	c #FFFBFE",
+"t3	c #A5D0F1",
+"u3	c #0C82F5",
+"v3	c #AAD5F3",
+"w3	c #8FC2EC",
+"x3	c #9BCBF0",
+"y3	c #A0D0F1",
+"z3	c #0980F1",
+"A3	c #A3D2F1",
+"B3	c #9CCCF0",
+"C3	c #0D80F1",
+"D3	c #9CD1F4",
+"E3	c #97C9F1",
+"F3	c #087FF6",
+"G3	c #9FCFED",
+"H3	c #FEFAFB",
+"I3	c #EFF7FA",
+"J3	c #6FB2E6",
+"K3	c #057FFD",
+"L3	c #1B86F1",
+"M3	c #69B0EE",
+"N3	c #D6ECF5",
+"O3	c #E7F8FD",
+"P3	c #9DCBED",
+"Q3	c #439BEF",
+"R3	c #1083F3",
+"S3	c #50A3EF",
+"T3	c #99CBEF",
+"U3	c #DCEDF7",
+"V3	c #95C5F1",
+"W3	c #54A7F2",
+"X3	c #1380EC",
+"Y3	c #077EF5",
+"Z3	c #047EF7",
+"`3	c #1D8AED",
+" 4	c #56A8EF",
+".4	c #A3CDEF",
+"+4	c #C4E2F4",
+"@4	c #8AC3F3",
+"#4	c #5BABED",
+"$4	c #3092EF",
+"%4	c #1482F8",
+"&4	c #0680F5",
+"*4	c #1184F3",
+"=4	c #3093EC",
+"-4	c #99CBF0",
+";4	c #C6E1F0",
+">4	c #CEE3F1",
+",4	c #95C5EE",
+"'4	c #8CC6F4",
+")4	c #60ABE9",
+"!4	c #58A7EA",
+"~4	c #59A7EA",
+"{4	c #54A8F0",
+"]4	c #6EB2EC",
+"^4	c #90C6F4",
+"/4	c #B2DAF4",
+"(4	c #CCE3F0",
+"                                                                                                                                                                                                      . . +                                                                                                                                                                                                     ",
+"                                                                                                                                                                                                      @ #                                                                                                                                                                                                       ",
+"                                                                                                                                                                      + . $ $ +                   + % & * +                       . $                                                                                                                                                                           ",
+"                                                                                                                                                                      + . = @ +                   + - ; > ,                       ' )                                                                                                                                                                           ",
+"                                                                                                                                                                      + . ! ~ {                   . ] ^ ^ / $                 $ ( _ : $ .                                                                                                                                                                       ",
+"                                                                                                                                                                        + < [ } +                 + | 1 ^ 2 %                 . 3 4 5 6 +                                                                                                                                                                       ",
+"                                                                                                                                                                      + 7 8 ^ 1 9 .               0 a 1 ^ 1 b                 c d ^ ^ , .                                                                                                                                                                       ",
+"                                                                                                                                                + +                   + e f g 1 h i +           + j [ k l [ m + +         n o p l ^ 1 q +                 + +                                                                                                                                                   ",
+"                                                                                                                                                r -                     s [ 1 t u v w +       + 7 x y z A B C D $         E F 1 G ^ ^ H +               + $ $ & I                                                                                                                                               ",
+"                                                                                                                                                J K ' + + +           + L B M N O P & . +     + Q R S T U l [ V .     + + W X Y Z ^ ^ ` .             + . 6  .J +                                                                                                                                               ",
+"                                                                                                                                                ..[ +.@.% .             V #.$.%.&.*.4 s $ +   =.-.;.u >.,.'.^ ).7     . !.$.~.{.].^.^  ..           + $ /.(.1 C                                                                                                                                                 ",
+"                                                                                                                                                m [ k _.:.<.. +         ~ [.}.|.1.P 2.3.4.5.+ 6.4 2.7.8.9.0.a.2.b.n + c.d.e.f.g.h.i.j.k.l.      m.n.o.p.q.1 ^ r.                                                                                                                                                ",
+"                                                                                                                                                s.t.u.v.w.x.y..       y.z.4 A.B.C.D.E.F.G.H.$ I.[ a.J.K.L.M.N.O.P.Q.% R.S.T.U.V.W.X.Y.Z.`.       +.+++@+f ^ ^ #+                                                                                                                                                ",
+"                                                                                                                                                $+1 [.%+&+[.*+=++ +   -+[ ;+>+,+'+)+!+;+B ~+{+]+1 ^+/+(+_+:+<+[+f }+|+[ 1 1+2+3+4+5+[ 6+7+  + + 8+9+0+a+;+^ 1 b++                                                                                                                                               ",
+"                                                                                                                                                $+c+d+e+f+S.[ g+h+.   c [ S.i+j+k+l+m+R n+o+(.1 ^ p+q+r+s+t+u+v.u.v+> ^ ^.w+x+y+z+A+~.4 B+  + C+D+0+E+F+G+^ 1 H++                                                                                                                                               ",
+"                                                                                                                    + . + .                     I+1 J+K+L+M+N+[ O+P+. Q+^ R+S+T+U+V+W+X+Y+[.Z+[+`+ @.@+@@@V+#@$@%@&@R *@=@-@;@;@@@>@,@P '@)@!@z.~@{@]@^@/@^ 1 (@+                   + .                                                                                                                         ",
+"                                                                                                                    . . _@:@+                   <@[ [@}@|@1@2@3@4@t.|+& ^ J+5@6@7@k+8@9@0@B l a@b@c@8@d@e@f@g@h@E+i@j@k@l@m@;@;@n@o@p@q@r@s@t@u@u v@w@x@y@^ 1 z@.                   I V A@                                                                                                                      ",
+"                                                                                                                        B@[ C@D@+ .             E@2.F@G@x+H@I@J@O.a.1 K@^ L@M@N@O@P@r+Q@R@S@e.T@U@K.L.K.V@T+L.W@X@Y@Z@`@N@;@;@;@ #.#+#R+@#[+j.##$#%#t+&#*#^ ^ :@        . . . . =#-#d C@                                                                                                                        ",
+"                                                                                                                        ;#[ [ [ >#,#            $ [ t.'#)#V+l+!#~#*.^ ^ ^ G {#N@]#^#/#(#_#:#<#[#}#|#g@1#2# #3#4#5#6#7#8#9#;@;@;@ #0#a#R+b#n+c#d#e#t+V@8#f#^ ^ :@        + $ g#>#8 4 [ h#                                                                                                                        ",
+"                                                                                                                        % i#l f j#k#l#m#n#o#    % k %@p#q#|#r#6@s#t#u#v#w#x#y#H@z#A#B#k+_+C#D#E#F#@@G#H#I#H@J#K#L#M#N#3+3#O#P#O@Q#R#S#T#[ U#V#W#X#L.V@Y#Z#^ ^ w . . $ % `# $q@[@L@^ .$6                                                                                                                         ",
+"                                                                                                                        + +$n+@$w##$$$&+%$&$*$  % i#w#=$-$L.;$_+>$B#,$'$f )$!$t+~${$]$L.V@m@^$/$y+($_$:$<$r+[$V+}$|$1$t+2$3$4$5$V+6$7$[ 8$9$0$l+k+k+@@a$Z#^ ^ .   y.] g+t.b$c$d$e$^ j $                                                                                                                         ",
+"                                                                                                                        . c f$g$'$h$i$j$k$l$m$n$o$K J+p$q$r$s$e@3#V+t$u$v$w$K.y+x$y$z$A$k+4+B$($C$D$E$B F$G$f@J#P@@@_+H$I$J$K$L$M$d@N$O$P$Q$n@3#R$k+k+S$T$^ 5 U$V$W$1 ^ X X$Y$Z$2.4 `$.                                                                                                                         ",
+"                                                                                                                        + .  %Z+$..%+%@%#%n+2.q@$%%%&%*%=%M$k+-%_+;%y+C$>%,%_+V+'%)%S.!%~%($s+;%(${%e.E+p@]%l+^%V+_+/%(%0+_%:%5$<%[%}%|%1%<%r#2%]#r+V+3%4@^ 4%5%~.[ v.L@6%7%8%}.E+5 U$.                                                                                                                         ",
+"                                                                                                                            9%$.#.0%a%b%c%d%e%f%1 u.k 2.g%h%[%i%j%k%@@5$3#r+V+k+l%m%~@n%o%y+V+l+p%q%*.l g r%s%y+s+t+t%u%w#4 v%J#J#3#C$w%t+x%y%z%($z+A%B%C%L@f D%E%e.F%G%H%X#I%J%4 _@+                                                                                                                           ",
+"                                                                                                                            e K%F.L%M%|#U+N%O%d%6+k P%Q%R%m@S%T%U%V%W%[%(#r$<%X%Y%R Z%`% &.&K.|#+&@&f ^ ^.#&$&Q#%&&&*&d$1 4 =&C$;@C$<%_#l+-&;&>&[$<%@@,&6#f Z+'&)&!&~&<%{&4#]&^&2./&                                                                                                                            ",
+"                                                                                                                            (&_&l :&<&Q#C$|#[&}&|&1&2&3&4&5&6&7&[ R 8&9&0&s+a&y+b&^&G j#c&d&e&a$f&R ^ ^.^ U#g&5&h&i&j&k&i@#.l&)#5$k+<%m&n&o&k#p&V@q&5$l%r&Z$s&t&u&v&y+6@_+w&x&J+y&$                                                                                                                             ",
+"                                                                                                  + o$6 + +     +   +       n#z&Z+A&B&x%J#r#y+5$f@C&D&E&F&G&K.H&I&J&J%K&L&M&N&Y#O&P&i@&%g [+Q&R&S&l ^ ^ T&x&U&V&W&t.X&Y&'&,@Z&`&V@<% *.*+*t.2.@*<%s$6$#*$*%*&***K#L.L._+[$=*#%[.-*.     +   + + + + + + 6 o$                                                                                                    ",
+"                                                                                                + $ ;*5 >*,*'*@ $ . +       . ' )*^ !*~*@@<%{*Q@]*y+;%t$^*/*5$(*_*f :*<*[*}*2%|*1*m%^ ^ ^ M o&2*~.L@^ ^ ^ 3*#%4*5*e$^ ^ ^ &@6*7*($8*9*[@b#n+f 0*l+B$<%a*b*/#[&c*V@;@@@k+d*e*f*g*h*.     . $ $ $ h+9 B@i*j*k*                                                                                                    ",
+"                                                                                                  + . l*[ 1 1 [ m*I.n*o*p*+ . . q*1 X&r*J#<%3#S$H@q+[$<%9#x+m@s*t*f 1 n+u*v*:#w*I&x*^ ^ ^ &@[@q@[@T&^ ^ ^ e$f f$f$c+^ ^ ^ 1 +*y*z*A*q@&%Y&^.B*C*@@Q@X#4+D*[$6&E*F*_+<%n@G*H*I*J*(&$ + K*o*L*I.M*[ 1 [ 4 N*y.                                                                                                    ",
+"                                                                                                    + p*O*^ ^ ^ ^ ^ 1 4 8 P**+Q*= [ R R*S*5$[&T*U*V*_+H@ #k+W*X*Y*J%g ^.L@6+Z*`* =[.^ ^ ^ :*Y&1 &@L@^ ^ ^ .=+=d$'&c+^ ^ ^ c#~@@=#=$=Y&&%L@c+%=&=J#[%k+r$'+*===-=8#x+Q@2%;=6#;+>=,=*+P*d 4 [ ^ ^ ^ ^ 4 > '=.                                                                                                     ",
+"                                                                                                      + )=1 l n+M '.j.!=j.k 6#X&1 k k ~={=]=1$^=/=(=_=:=<=H@K.K.[=[@b#T&^.&%X&}=c#^ ^ ^ ^ ^ b#c+l ^ ^ ^ ^ v.:*|=g ^ ^ ^ ^ 1=R Z 1 L@L@R+u.~@2=3=y+a&V@4=5=6=t.7=y+C$@@8=9=0=R k &@[ J%N J%`%f a=^ ^ 4 b=+ +                                                                                                     ",
+"                                                                                                        . c=k d=e=f=g=h=i=j=k=:&l=J+f Y m=]=[%n=o=O.p=q=r=s=t=|#u=&+^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ c+v=w=x=Q#y=z=A=x&B=+*C=L.D=5&E=F=&@&%n+[+G=H=I=J=K=L=M=c+^ b+$                                                                                                         ",
+"                                                                                                        + , N=R #%O=P=Q=R=S=T=U=V=W=X=Y=Z=`=k+_+ -u@.-x*&@P%+-@-#-;.^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^.f $-%-&-*-6+f [ =---;-<%k+8#>-0=,-'-)-!-~-{-]-C$^-/-(-l > /.+                                                                                                         ",
+"                                                                                                        + $ _-N N+M+:-3#;%H@Q@l+<-[-}-|-1-2-X%X%3-,@'&t f ;+4-f*5-F@^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^.J&6-7-,@$=~@L@;.O.8-]=(+y+9-0-a-b-c-q+{*[%m@5$G&d-e-p@4 Q*$ .                                                                                                         ",
+"                                                                                                          + f-g-f :*h-i-n@k+K.@@J#H@[$C$x+r$J#j-k-l-g g R+:*m-v.1 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ g e$v.J+^.c+^.~@n-o-z+L.W*r#k+r+@@V+x%@@@@L$k+p-q-4 U#r-y.  +                                                                                                         ",
+"                                                                                                              s-t-^ u-v-5&5&w-x-3+<%k+ #;@L$(#k+y-z-T&^ ^.c+^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ i@A-&*v&l+k+w%5$z+6&V@<%B-C-P@D-E-<#*@F-G-$                                                                                                             ",
+"                                                                                                              + b [ H-I-J-k+{*<%K-L-M-N-O-1%s+r+x%P-T#&@G Y&^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ w#Q-r$R-S-(+5&T-U-V-W-X-Y-r#3#Z-`-:&f* ;.;                                                                                                              ",
+"                                                                                                                $ *+X&+;@;#;$;_#%;a#&;*;=;-;;;>;,;';);S !;e$^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ *-~;{;];^;/;$-(;_;:;<;{&;$y+[;};l J+|;H.                                                                                                                ",
+"                                                                                      . . + + + + + . . . + + + + =+1;P&S.2;3;J#R-4;<#E+~@.-b#5;6;7;8;9;L@1=^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 0;a;b;c;~@d;e;~@,@f;;-V+5$[$g;h;q@d i;. + + + + + + + + + + + + . +                                                                                     ",
+"                                                                                    + j;k;k;k;k;k;k;k;k;j*l;l;l;l;.$P m;P n;o;[%p;q;r;G=u.[ g ^ O s;t;u;G J+^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ l v;T&^.1 y :*w;x;y;1$_+3+z;A;B;P ]+.$C;l;l;l;K@k;k;k;k;k;k;k;k;j;+                                                                                     ",
+"                                                                                    + . D;a [ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ x*3*`%a@E;F;($5&G;H;f n+T&L@t E.u.G :*Y&^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^.L@L@c+b#d=&@I;J;6$5$_+K;L;v;+*^.^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 4 M;$ +                                                                                     ",
+"                                                                                      . $ N;J ^ ^ ^ L@B*O;p#P;P;P;P;Q;R;S;T;U;V;W;@@v&X;R 1 L@Y;Y&1 J+^.g v.^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1=1=^.b#1=w#t.Z;X#5&w%k+`; >.>+><+P;P;P;@>@>P;#>$>L@^ ^ ^ a %>. . .                                                                                     ",
+"                                                                                        + . &>)*[ ^ *>=>->6&3+x+x+x+;>F#C$R-x+<%5$5$1%>>,>J%e$^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ [@'>)>!>[%@@5$B$r+~>3+Y#x+x+x+x+X#t$X#{>]>^>Y&P&d ;*                                                                                            ",
+"                                                                                          . $ />(>^ l _>:>6$<%;@;@;@;@V+C$5$m@w%w%n@[&Q@<>[>^.^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R }>|>v&X%W*r$s$;$1>@@@@ #;@;@;@_+A%Q$2>3>q@f 4>6.+                                                                                             ",
+"                                                                                              . @ 5>6#d$6>7>Q@;@;@;@C$1$8>|#y+[%[%[%9>0>a>b>^.^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ [+c>d>e>f>g>Q@V@Y#@@h>i>n@;@;@;@j>k>l>m>@$n>o>p>                                                                                                ",
+"                                                                                            + . . e q>d$[.r>s>Y#@@;@@@t>u>v>w>x>y>z>A>B>C>D>^.^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ c+c+^ ^ Y;1=^ c+^.^.1=1=e$e$e$e$:*L@^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ &@E>F>G>H>I>J>K>L>M>N>O>3#m@ #m@6&P>Q>k &@y&R>S>                                                                                                ",
+"                                                                                                + . e 5%1 ^ T>U>V>V+k+~%W>A.1 l ~@~@g ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ g g ^.^ T&1 E.w#D%T&c+L@u.w#w#&%[+1 1=Y&^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ g T&w#n+2.}.X>Y>Q#@@(+2%Z>`>D%:*r.p*                                                                                                    ",
+"                                                                                                + + + o$q*1 &@f* ,.,<%Q@+,@,&.k x*f b#^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^.^ 1 ~@c#<*g ~@X&L@l g g g c+Z+k$:*+=^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ e$#,F.;+U#$,%,t+;%<%W+&,*,=,M -,;,+                                                                                                     ",
+"                                                                                                        w >,B <*,,',),C$Q@9.!,~,'.&%^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 *.G={,+#],^,/,(,_,:,<,<,<,*,[,R+n+^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ Y;:*},|,1,2,5$ #/*3,4,5,w#L@6,7,                                                                                                        ",
+"                                                                                              +   + 8,9,0,a,b,g i@c,d,T-[%X%e,f,g,B 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ c+^ e$^ ^ L@1 [.1 t.T#'.[ =-Z*h,i,j,k,l,m,8#B#Y>n,n,o,p,q,l |=Z+,,r,y ~@=,1 L@^.g ^.c+^ ^ c+1=^ ^ ^ ^ ^ ^ ^ f j.s,t,t$6@<%a&u,v,%@R l ,@w,x,y,z,8,A,+                                                                                               ",
+"                                                                                              % =+&>j B,c,C,D,j#R E%E,F,b%G,k+t+H,I,Y;^ ^ ^ ^ ^ ^ ^ ^ ^ ^ g x*g Y;Z%b#Y&J,K,L,M,N,O,P,{@Q,R,+,s+X%r#;@;@;@n@@@[$C$]*S,g T&T,U,V,W,X,Y,Z,a@Y;&%L@Y&g ^.^ c+^ ^ ^ ^ ^ ^ ^ d$Z.`,;-y+@@w%5& 'i$m%&@n+v.x&Q%.'+'@'#'$ .                                                                                             ",
+"                                                                              . + + + + - $'Q r-1 1 ~@O ;+4 %'&'*'='-';'t$[%[$r+>','g ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^.2.&@X&i.''7=)']-C$Q@Q@S*!'5;&+~'{'L.q&]#;@;@;@;@**5$$;]'^';+f /'('t+S-8#_':'<'['}'+*;.l ^ ^.^.^ ^ ^ ^ ^ ^ ^ [@'.|'1'2'C$k+L.3'4'5'6'7'5;O.+*j$F.n+[+8'9'0'A@+ . . + + +                                                                             ",
+"                                                                              $ a'b'b=c'5 4 1 ^ ^ ^ M %'d'e'f'g'Q=H@r#K.n@h'C#i'j'k'1=^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^.<#l'm'n']-[&k+<%5$x+o'p'q',@r'2.s'^-Q# #;@;@;@@@C$w%t'u'r,&+d$v'w'x'<%m@1%5$O-C&y'z'A'B'1 g ^ ^ ^ ^ ^ ^ ^ ^ [+'&[ C'D'E'[%<%k+Q#t+X#F'G'H'I'J'6+Y;^.^ ^ 1 K'c'L'0 { $ +                                                                             ",
+"                                                                              . H+J [ [ [ ^ l p$M'N'O'P'Q'K.y+ #O@5$_+{*@@R'S';.E.f ^.^ ^ ^ E.j#J+b#Q%B q@T'U'V'C$r#W'3#B#X'Y'Z'`'r> )[,.)[ +)@)#);%V+Q@r+r#y+$)%)0+0=O J%U#G=&)*)=)-)Q=;)x%Q@C$>),)')))k &@m%1 g ^ ^ ^ :*|=e$u.!)~){)y+V+ #C-_+3#])<%+,^)/)()_)i.&@J+1 [ [ [ 9'.                                                                               ",
+"                                                                              . + b'c'4 [ ^ l :)<)[)<-3#@@r+8#@@B$;@O@})];|)l ^ ^ ^ ^ ^ ^ ^ &%n+u.u.h;1)2)3)**4)H@X#5)6)7)8)t.6+:*e%9)L>0)F.P&o+,>a)b)c)d)e)f)g)h)m%P&i)j)k)0)Y&f$p=l)m)n)o)~$k+[%i>~&p)q)#.H-w#$=^ ^ ^ ^ ^ ^ ^ r&r)s)t)s+Q@(#0&;@<%C$V+y+6$F#u)v)c#n+1 4 c'w)w $ +                                                                             ",
+"                                                                              + +     !.W$[ t.w;u@x)y)%,3#V@_+k+J#y+t$z)A)E.^.^ ^ ^ ^ ^ ^ ^ ;+'.f$B)C)%,y+**Q#D)E)F)T#G)x&J%H)I)J)K)L)M)N)v*t.Z%i@m-O)P)Q)R)p=S)Z+[ E,T)U)V)W)X)Y)Z)h)`%[+`) !.!+!1%s+x+@!#!$!0+[.^ ^ ^ ^ ^ ^ ^ f [+Y.l&%!&!6&w-@@{&$;k+*!=!-!+#;!q@;.>!N;+                                   . + . .                                           ",
+"                                                                                      . $ Q+,!x*#$'!)!!!~!8#k+;@@@x@{!]!^!l ^ ^ ^ ^ ^ ^ ^ ^ #./!(!_!G&W'r+:!<![!B'}!<#|!1!2!3!v&e,Q@5&6@U)4!O;~@Z+j#3*w;&@[ :*1 m-5!6!q+|#L.8>5&;>7!8!9!0!m-[.*.a!b!c!k+M$l+d!e!=$^ ^ ^ ^ ^ ^ ^ g :*[+P f!g!a&_+k+3#Q#h!i!e%j!k#F=k!l!m!. +                                   + y.A@.                                           ",
+"                              + . + $ n!o!p!q -+. . .                                       =.b=q!4 ~@A&r!s!t!y+u!v!w!^.e$^.^ ^ ^ ^ 1 :*X ;!x!y!y+k+5$z!A!B!~.C!D>D!E!F!+@[%m@O@@@O@n@;@V+1$G!H!I!p@E+e;m-J!)!K!L!M! #m@;@;@;@;@]#;@;@_+N!O!P!Q!`%*.R!S!T!X#;$Y#U!x!u Y@&@u.T&~@b#c+^ ^.l *-V!]=N@W!X!Y!c+^.;.K@Z!6 `!                                        =#: ).*+ ~$ . +                                   ",
+"                                . <@.~[ 4 [ 1 K@#+k*{++                                       . +~H+@~w#~@#~$~%~&~*~T&^ ^ ^ ^ ^ ^ ^ '&k =~-~;~3#<%9.>~,~J!'~)~!~~~{~<%;%]~1$;@;@;@;@;@;@;@m@5$^~/~(~_~:~<~[~}~/~|~O@;@;@;@;@;@;@;@;@;@;@@@9#B#1~4,2~B;B'3~4~2%5~B$6~7~8~[ J+D%9~L@^ ^ ^ l ~@0~a~b~c~T@[ ^ a j @ . +                                           6 t-[ [ J b+&>$                                   ",
+"                          + % d~e~C ^ ^ ^ ^ ^ ^ ^ ^ ^ f~g~h~;,. $ + $                               i~j~N k~l~t l$r&c+^ ^ ^ ^ ^ ^ ^ F.m~n~H@[%F#|%o~p~q~B*r~s~x+q&Q#<%])a&;%;@;@;@;@;@;@;@[%[%;@V@1$5$B$]);$<%8@r$;@;@;@;@;@;@;@;@;@;@;@@@<%7@7@{&t~u~v~e.n%w~x~C$[%y~z~A~B~'&^&g ^ ^ ^ &@E.G A&5;^&C,$$C~=#                          + . . $                 . D~1 ^ ^ ^ [ 8'E~- . +                           ",
+"                          I I.[ [ 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 [ [ [ F~} 0'(                               G~H~I~J~f$c#J+w;b#^ ^ ^ ^ ^ ^ ^.K~L~M~V@N~O~(=p=A.P~Q~~$y+m@k+O@L.P@s+L$;@;@;@;@;@;@;@O@3#[%V+_+k+ #Q@t+O@Q@V+;@;@;@;@;@;@;@;@;@;@;@O@1%V+r$(+N@G&R~S~p@Z+0!T~[;;%v&U~V~&+:*^ ^ ^ ^ [@<*b#J+2.1 W~X~$ .                             ( /&-++               . q ^ ^ ^ ^ 4 [ 4 Y~p!@                           ",
+"                  + $ I Z~8 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ [ ~ w .                               `~ {[ ^ ^ ^ ^ ^ ^ ^ 1 [@u@.{;~Q@l++{@{0+~._)#{x@t+_+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@r$y+C$a&[%n@ #X%L$@@W* #;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@ #]-${%{6#p$&{*{x+6&={-{;{R+J+n+Y&^ ^ ^ ^ ^ ^ b .                           + . I+M*4 9 +               + -+5 [ ^ ^ ^ ^ ^ ^ ^ J _@!.                      ",
+"                  7 >{8 [ 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ [ [ Q+.                               ,{C;1 ^ ^ ^ ^ ^ ^ ^ 3*'{){D-[%3+!{x;`%~{{{]{<%^{S%m@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@J#_#($L._#/{({_{:{[$O@<{k+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@5$q+[{}{|{))1{2{K.3{X*4{5{9~n>n+^ ^ ^ ^ ^ ^ C;#                           + U$f~[ 4 D~+               + $ 6{[ ^ ^ ^ ^ ^ ^ 1 ^ 7{N;                      ",
+"                + 8{^ ^ ^ ^ ^ ^ ^ 1 4 f~Q I.$%4 [ 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ Y~K*                          + 9{0{^ ^ ^ ^ ^ ^ ^ ^ ^ 6#a{S-{&2%b{M+;!c{d{e{|#<%f{m@**;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@H@g{h{i{j{e-k{l{m{n{o{;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@w%R-C$p{q{r{s{t{u{G&6&Q=v{w{9~u.^ ^ ^ ^ ^ ^ [ y&+~.                       + x{1 ^ [ C;K*                  & 4 ^ ^ ^ ^ ^ ^ [ >,+~.                       ",
+"                . t-^ ^ ^ ^ 1 1 ^ C;y{a'. + ( D z{A{^ 1 1 ^ ^ ^ ^ ^ ^ [ B{                        + U$m 1 ^ ^ ^ ^ ^ ^ ^ c+C{D{E{_+F{G{o&#&H{I{r+y+Q@r#z+P@m@;@;@;@;@;@;@;@;@;@;@;@;@W*;@5$l+J{K{O.#.6#0=J%F.B~f+L{X'm@;@@@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@]#]#5$|#K#M{);6#N{O{-%3#P{_~U#R+c+g b#L@^ ^ [ [ _ + +                     - 7{^ ^ 1 1 |++               + A{1 ^ ^ ^ ^ ^ $%h#$ + +                       ",
+"                D [ ^ ^ ^ 1 4 5 (@7 $ +           . o$Q{R{r.C ^ ^ ^ ^ [ a @..                   + $ Q*4 1 ^ ^ ^ ^ ^ e$:*e%S{F#n@T{U{4 V{W{X{m@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@]#R$V+Y{Z{`{ ]w#H-#.q@k j.Y&:&#,.]+];@y+ #;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@5$B$@]#]S i)$]%]W'K#&]#=:*f X&6+^ ^ ^ ^ 4 a,% .               + $ *][ 1 ^ ^ ^ >#$             . K*).^ ^ ^ ^ ^ g+'                               ",
+"              + / 1 ^ ^ ^ 1 C;' $ + + +           + . . + . j;l;^ ^ ^ [ 1 C@a'                +   D@8 [ 1 ^ ^ ^ ^ ^ J+t.=]G&r+T{-];];.>]3)N@ #;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@ #Q#($,]']k==-~=_*)]!]~]{]]]l k N 5#^]1%@@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@w%V+[%/](]h)}._]:]X#1%u+*@6+&%R+^ ^ ^ ^ 1 J <].               + []d [ 1 ^ ^ ^ J }]% +         + <@^ ^ ^ ^ ^ ^ x{$                               ",
+"              + W$[ ^ ^ ^ 1 |].                               1]4 ^ ^ ^ ^ 4 '*              + $ =+d.[ ^ ^ ^ ^ ^ ^ ^ m%2]3]V@4]5]e.E,6]7]y+8]@@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@]#H@_+9]R #,'>0]a]c)b]C$X-c]d]h;'.#%e]t+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@O@B$@@r$f]g]x&h]9$x+;%i]j]k]J+w#^ ^ ^ ^ ^ ^ g+=.              + l][ ^ ^ ^ ^ ^ [ [ m]w +       + / ^ ^ ^ ^ ^ 1 /..                               ",
+"            + , a 1 ^ ^ ^ 1 |++       + + p*n]+ + + .         - g+1 1 ^ ^ 1 K@n]              . o][ ^ ^ ^ ^ ^ T&l R p]q]@@|@r]s];!t]u]z+5$@@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@r#;@v]w]j.%@A>x];$@@($O@C$6@y]z]s;m%A]B];@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@y+n@k+5$<%C]D]F@E]F]x+P#G]H]B J&^ ^ ^ ^ ^ ^ [ n*+ +       + + I]d 1 ^ ^ ^ ^ ^ 1 1 1 K A@.     . J]^ ^ ^ ^ 1 5 . +                               ",
+"            $ ] ^ ^ ^ ^ ^ ^ 9{+       + $ R.d A{(@<@%         . <]8 [ ^ ^ ^ ^ m].           + /.4 ^ ^ ^ ^ ^ c+G q@K]L]K#y~M]N]5{O]P]O@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@X%n@7*+)`%B'Q]y+O@;@;@;@<%[&Q#R]c#v.E]S];@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@X%r#T]U]6#V]W]G&K.X]Y]E+c+^ ^ ^ ^ ^ 4 ).=#.         . Z]4 1 ^ ^ ^ ^ ^ ^ ^ 1 4 F~@.+   `]Y~^ ^ ^ ^ 4 *+                                  ",
+"            $  ^^ ^ ^ ^ 1 y&. +       . A@> 1 1 1 [ i#+       + + n$1 ^ ^ ^ ^ 8 i;        + % (.1 ^ ^ ^ ^ ^ g 5;.^+^H@V@@^#^N+$^y;h%w%;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@r+%^$$0+`>&^[%;@;@;@;@m@x+[%*^=^T&0+-^;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@W*[%[%;^>^q~,^'^1%[&)^!^c+^ ^ ^ ^ ^ 1 1 #+w       + c )*1 1 ^ ^ ^ ^ ^ ^ ^ 1 1 1 ).] + ,{1 ^ ^ ^ ^ 1 z@                                  ",
+"            a'7{^ ^ ^ 1 [ & $ +       + o*1 ^ ^ ^ 1 ~^            =.C;^ ^ ^ ^ 4 `$      + . y{[ [ ^ ^ ^ ^ ^ ~@;!{^3+h%]^^^c,/^(^@@_^;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@B$y+:^P%k <^[^B$W*;@;@;@m@V+1%}^B=&@C{|^;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@W*J#r+O@1^U.F.2^3^(+4^5^^.^ ^ ^ ^ ^ ^ ^ [ 9       + B{[ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ]+Q*%>[ ^ ^ ^ ^ 4 #                                   ",
+"            6^1 ^ ^ ^ 1 4 q +         . B@1 ^ ^ ^ [ 3             @.C ^ ^ ^ ^ K',         - O*1 ^ ^ e$^ |=1=B 7^8^V@9^0^Z$a^b^ #@@ # #;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@B$;@c^d^@$5;e^y+a&R$C$O@B$f^Y#g^n+X&}'h^;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@k+B$w%5$6$i^j^4 k^X#;$u,l^m^$=Y&^ ^ ^ ^ 1 8'. +     E~1 [ 1 j*6{n^F~[ 1 ^ ^ ^ ^ ^ 1 1 d 1 ^ ^ ^ ^ m*.                                   ",
+"            o^[ ^ ^ ^ 1 $%-           % r.1 ^ ^ ^ 1 []            n$1 ^ ^ ^ ^ #+$         L*1 ^ ^ ^ n+D%L@^.<^p^6@q+q^P }'r^y+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@m@5~s^t^~@g u^v^v&w%B$**L.1%w^x^[@Z%y^z^;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@[%6&A^(-B^C^D^_+E^1+'&A&^ ^ ^ ^ ^ ^ D;.     []7{c=F^K*+ $ `]B@1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ >,.                                   ",
+"            G^1 ^ ^ ^ 1 H^+           # [ ^ ^ ^ ^ F~%         + . I^1 ^ ^ ^ ^ L'+     . -+Y~1 ^ ^ ^ L@J^^&#%K^L^[&M^N^+;O^P^n@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@Q^a$R^d$l 0+S^T^O-L$V+_+U^V^S.x*,@W^R-;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@n@5&X^Y^0+Z^`^V@ /./D,c$^ ^ ^ ^ ^ ^ F~+     + a'+   + +   + . n!(>1 1 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ n^$                                   ",
+"          =+K'[ ^ ^ ^ 1 E~+           z@4 1 ^ ^ ^ '@$ +       . C+.$4 ^ ^ ^ 1 c .   + $ ) ]+1 ^ ^ ^ ^ c#c&+/@/5&#/$/$.%/&/|#<%;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@O@V+R-*/=/~@Z*I*-/;/>/,/'/)/p=t.`%!/R'9#;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@O@+@l+~/,^$.{/]/<%^/// )^ ^ ^ ^ ^ ^ [ I+                      + =.r ]+^ ^ ^ ^ ^ ^ ^ ^ ^ ^ (/$                                   ",
+"        . }]1 ^ ^ ^ ^ [ _/+       + $ 8{^ ^ ^ 1 [ o*+         . q ^ ^ ^ ^ [ m*+       { 0{1 ^ ^ ^ ^ ^.c#T#:/8>Q#</Q!O.[/(+<% #;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@;@J#}/|/k'5{d$m-x*c#1/^&(-J%2/3/@@s+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@w%;@y+4/N %'5/_#N@6/F.c+^.^ Y&^ ^ ^ 0{. +                       . N;(>[ 1 ^ ^ ^ ^ ^ ^ ^ #+;,+ +                               ",
+"        . >,^ ^ ^ ^ ^ 5%. +       + a'd ^ ^ ^ 1 $%U$          . B{^ ^ ^ ^ 4 7/        Q{[ ^ ^ ^ ^ ^ e$B=//8/|#9/0/Y@a/b/v&c/]#;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@Y#d/e/<#:&J^c#E.!;f/U#g/h/R-k+_+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@i/j/h;k/^~h%l/m/T&^ ^ ^ ^ ^ ^ [ $'+                       . $ n]Z~^ ^ ^ ^ ^ ^ ^ ^ 4 Y~n/.                               ",
+"        { M*^ ^ ^ ^ [ M;          + />1 ^ ^ ^ 1 I.+           { (>^ ^ ^ ^ [ D;        I.[ ^ ^ ^ ^ ^ j#p==]5$y+o/C!A.p/q/;@_+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@8#r/s/t/$@1+_%f*u/v/w/@@[%M$w%;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@_+x/0)J!y/z/N@A/;.1 ^ ^.^ ^ ^ 1 ! .                           + $ B/4 ^ ^ ^ ^ ^ ^ ^ ^ ]+Z~U$+                           ",
+"        @.[ ^ ^ ^ 1 [ <@          + ,*1 ^ ^ ^ 1 C/+            ~4 ^ ^ ^ ^ J '       []J [ ^ ^ ^ ^ ^ n+D/E/r$C&F/0=G/H/;%C$;@r$;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@k+;@[%l+I/J/K/L/M/[;L$C$a&_+w%V@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@V@N/O/$.P/t$q+Q/R/B 1=c+^ ^ ^ 1 d +~                          + % $%[ ^ ^ ^ ^ ^ ^ ^ ^ [ 1 P*/.                          ",
+"        z{1 ^ ^ ^ ^ l;-           + W$1 ^ ^ ^ 1 (/+           x{[ ^ ^ ^ ^ >#.     $ S/^ ^ ^ ^.c+g ^.!;F]T/v&U/p@;!V/r+;@@@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@5$1$J#k+B$B$W* #;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@<%k+W/X/0+Y/J#D=Z/ )A&J+^ ^ ^ 1 [ S/$ +                       . &>1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 8 n$w . . `]}]! t-e +       ",
+"        K 1 ^ ^ ^ 1 B/+           @ 4 1 ^ ^ ^ F~{ +           i*[ ^ ^ ^ ^ $+.     $ >*^ ^ ^ 1=T&L@T&`/ (5&.(+(p=@(x%($;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@5$@@@@x+J# ##(B$;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@r$J#C&$(t.%(F#3#&(*(k ^ ^ ^ ^ ^ [ >*. +                       + ! ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 4 H^h#e~.$4 4 [ =(+       ",
+"      C+J [ ^ ^ ^ ^ 1]+       + . -([ 1 ^ [ [ B@. +       + A@.$^ ^ ^ ^ 1 D .     =#C ^ ^ ^ 1=n+~@E+;(4^Y#>(&;~=,(K.;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@[&Q#y+n@5&[% #B$;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@L$C$Q#'(w;N.)(@@2%!(l ^ ^ ^ ^ ^ ^ ]+~(+                       C+a ^ ^ ^ ^ [ {(o![ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 4 l;[]+       ",
+"      ( 0{[ ^ ^ ^ 1 .~+       + . s.4 1 ^ 1 4 :@+         + s ^ ^ ^ ^ ^ ).+ +     (@1 ^ ^ ^ ^ :*[+~.](9#|#^(O _>/(@@ #;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@k+<%V@((_(:(<([(}(5$r+@@5$n@@@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@X%V+w-/]|(F.1(b]R-2(3(J+^ ^ ^ ^ ^ ^ a,+                       -([ ^ ^ ^ ^ 4 I+y.Q+.$^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 [ 4(. +       ",
+"        w))*^ ^ ^ 1 ]+z@. +   + $ `]6.5(: [ j*o$          . M;^ ^ ^ ^ [ 6{        C@[ ^ ^ ^ ^ b#Z+6(7(T/8(9(G=0([%k+k+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@1%1%a(b(1+E.!;E.P ,^c(d(l+1$T/r+m@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@k+e(Z+A~f(V@g(v@[@^ ^ ^ ^ ^ ^ _ .                   + $ i*[ ^ ^ ^ ^ > ,     c.h(4 [ ^ ^ ^ ^ ^ ^ ^ ^ z.-           ",
+"        . 6{^ 1 ^ ^ [ > I +   + + . + + + C+D@+           a'(>^ ^ ^ ^ 4 Q+      s-)*1 ^ ^ ^ b#l l i(0&j(k(l(;.m(X%@@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;%n(o(p(m^%@l=a.5{0+g*q(r(($_+k+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@s(Z$J!t({&~$u([+^ ^ ^ ^ ^ 1 ).A@                  . ' 8 [ ^ ^ ^ ^ B/+     + % E~8 1 ^ ^ ^ ^ ^ 1 1 z@+           ",
+"        . =+5 [ ^ ^ ^ 1 C@w                               I 4 ^ ^ ^ ^ [ o$    . D@^ ^ ^ ^ ^ 1=n+Z+v(5$V@w(1 x(c)C$t+<%;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@y(z(H-v.q@A(B(l{Z*C(#%c#D(2#V+k+ #;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@E(F(A.G(H@6@J)a@^ ^ ^ ^ ^ 1 [ <]                  + a,1 ^ ^ ^ ^ ^ n^$         .  ~>*[ ^ ^ ^ ^ 4 d.=.+           ",
+"        . + Q+[ ^ ^ ^ ^ 1 a,+ + + + +               + + + z{[ ^ ^ ^ ^ (.$     . n*^ ^ ^ ^ ^ g G H(I([%2,J(+=K(k+X%;@W*;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@L(E]~=}=M(N(O(P(Q(R(+=A&w!S(x- #;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@l+T(*@U(y~m@V(T#^ ^ ^ ^ ^ ^ 1 4(+             + + . >#1 ^ ^ ^ 1 C p*+         + + -+g~^ 1 ^ ^ 4 y{.             ",
+"            a'#+^ ^ ^ ^ ^ ]+W(,*D@-+$ +           . . d~~^8 [ ^ ^ ^ ^ z{$     + k;^ ^ ^ ^ ^ ^ c+X(O(V+Y(Z(k~`(;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@ _a.p=._+_N@Q@3#y+@_'.l ~.#_<%W*;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@9#$_}=%_&_W'*_=_^ ^ ^ ^ ^ ^ ^ *+. +       + $ e x{K ]+^ ^ ^ ^ [ I^                . E@4 [ ^ 1 K {               ",
+"            + 9{]+1 ^ ^ ^ ^ 1 1 1 )*>#4(# + + + + !.R.C 1 1 1 ^ ^ 1 1 6^.     a'2 ^ ^ ^ ^ ^ ^.~@-_@@@@;_G=Q,>_;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@,_=-6#0@;-m@K.<%@@'_)_f ^!!_5$k+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@Q@~_u@Y {_h'3#]_^ ^ ^ ^ ^ ^ ^ 0{$ +   + A@L (.a 1 1 1 ^ ^ ^ ^ 4 L*                + `]5 1 1 1 ;#.               ",
+"                n$^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 4 +.o!L*.~4 [ 1 ^ ^ ^ ^ ^ [ f~{ .     c.[ ^ ^ ^ ^ ^ c+0+^_;@6@/_*@(_U);@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@__:*2.:_]-{*<%n@(+<_[_M l }_J#5$;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@X%;>|_x&1_l+q+2_^ ^ ^ ^ ^ ^ ^ )*=+.   + ,{1 ^ ^ ^ ^ ^ ^ ^ ^ ^ [ #                      ^1 4 #+. .               ",
+"                - 5%1 1 ^ ^ ^ ^ ^ ^ ^ ^ 1 1 1 ^ 1 1 1 ^ ^ ^ ^ 1 1 [ B{+ +     6.1 ^ ^ ^ ^ ^ g 6#3_y+c)4_k=5_k+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@6_Y@c$F+J-J#V@r#G&7_8_u.'.9_R$5$m@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@J#b]0_F.a_Y#6@b_Z+&%n+1=^ ^ ^ 1 /.+   + y.0{1 1 [ ^ ^ ^ ^ ^ ^ 4 x{                  + ] [ [ c + +               ",
+"              + . 0'4 [ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ [ I^F^w         c_1 ^ ^ ^ ^ ^ ^&d_e_;%f_g_;.h_@@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@1^i_+#<*j_V!k_l_m_n_6+:*!^o_y+L.;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@V+p_N+q_C&r$r_s_Q%E.Y;^ ^ ^ 1 b +   + . c.'@K@[ 1 ^ ^ ^ ^ ^ [ ..                    ' (.4(.                   ",
+"                + + t_R.Y~[ [ 1 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 1 5>y{% + +         ,*1 ^ ^ ^ ^ ^ g [*u_r#v_w_))x_6@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@1%y_h;F=l(F.z_A_5;Q%p@E+B_R-J#V+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@W*C_e.D_E_J#F_m>6+g 1=^ ^ ^ 1 L +     + + + C+= 2 1 1 1 ^ ^ 1 4 # .                     + +                   ",
+"                    $ + U$;#5(W(4 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ [ 0{H { $ $             >{^ ^ ^ ^ ^ ^ T&G_x@q&H_J!J,I__+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@J_K_c,Z+Z+w;y |=:*(-L_M_3#@@W';@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@ #W*N_6>B'O_z+)#.]0=Y&b#^ ^ ^ 1 m]+           . . a'H -.4 ^ ^ ^ ^ $+$                                           ",
+"                    +   +       - V$R{7{]+[ 1 1 [ [ O*Q*-++                   I.[ ^ ^ ^ ^ ^ c+P_r+Y#Q_^&R_S_$;;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@<%y+3,T_U_6+P&'.2.V_W_X_ #V@@@m@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@k+Q@Y_Z_f `_Q@5$ :2.[@^ ^ ^ ^ ^ >{+                   + n/< 4 [ 1 7{=.                                          ",
+"                                  + . $ I z@|]).l;L*-+. $ +                   W$[ ^ ^ ^ ^ ^ T&q%y+;@.:v.+:e{@@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@C$k+i>@:#:$:t,%:&:M&r+@@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@<%@@H$,~1 *:($B$=:+=u.^.^ ^ ^ 1 .~+                   + . % 9 s.K ) a'                                          ",
+"                                              -+=+                            : 1 ^ ^ ^ ^ ^ ^.-:@@6&;:v.>:,:W*;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@K#K#k+v&a&5$k+@@L._+5&5$;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@B$w%B#':1 *:($<%):O 1 J+^ ^ ^ ^ :                               +                                               ",
+"                                                                              : ^ ^ ^ ^ ^ ^ ^.!:($3+~:.-{:k%]#;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@5$O@y+[%@@k+_+v&]=@@($$;;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@J#$;]:^:l /:($J#(:O. ]c#^ ^ ^ ^ :                                                                               ",
+"                                                                              : ^ ^ ^ ^ ^ ^ L@_:W*_+::e$<:[:;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@V+n@J#<%}:J#H@H@_#L.5&k+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@O@ #|:1:g 2:[%_+3:c#^ ^.^ ^ ^ ^ :                                                                               ",
+"                                                                              : ^ ^ ^ ^ ^ ^ L@_:W*_+::e$<:4:;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@<%**3#s+5:T{6:@@K.k+Q# #;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@O@ #|:1:f 7:_# #3:c#^ ^.^ ^ ^ ^ :                                                                               ",
+"                                                                              : ^ ^ ^ ^ ^ ^ L@_:W*_+::e$<:4:;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@_#m@L.8:9:0:a:b:c:b] #;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@O@ #|:1:p=d:6$ #3:c#^ ^.^ ^ ^ ^ :                                                                               ",
+"                                                                              : ^ ^ ^ ^ ^ ^ L@e:W*_+z=e$<:[:;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@ #;@;@;@;@_+n@f:g:6#`%6#p=h:i:V+ # #O@ #;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@O@W*B#1:v#j:@@y+&~&@^ c+^ ^ ^ ^ :                                                                               ",
+"                                                                              : ^ ^ ^ ^ ^ ^ m-k:O-(+l:!;m:n:W*;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@k+n@<%_+5$6@X'o:1 ^ ^ ^ u.E.p:q:{&w-K.6&;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@m@+@r:':R s:B$[%t:Y;L@Y&^ ^ ^ ^ | +                                                                             ",
+"                                                                              : 1 ^ ^ ^ ^ ^ T&u:Y#V+v:w#w:<-J#;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@<%K.<%x:*=y:z:J+^ ^ ^ n+Y;+*A:B:8]4]1$;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@w%r#C:D:}=E:B$@@F:c#&@n+^ ^ ^ 1 I.+                               +     +                                       ",
+"                                      + $ $ h+o$.                             >{[ ^ ^ ^ ^ ^ L@G:[%x+H:k~_;Y_V@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@{*m@|#I:J:E%p$g ^ ^ ^ X&J^Y;u.K:L:z+r$;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@s+M:J!F+N:])D-O:+*c#L@^ ^ ^ ^ >{                    . w Q{I.6{N;7 . $ $                                       ",
+"                            + + + +   C+t_m 1 5 Z~(/+ + +                     >{[ ^ ^ ^ ^ ^ Y;P:Q:Y{R:H(}'S:m@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@ #;@;@m@<%Q^T:U:,@[.&@D%c+^ Y;d$R ~@l S.V:W:3# # #B$n@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@<%S%X:p@B*Y:O@Z:`:+*b#c+^ ^ ^ ^ >{              + + w 9 (.[ 1 1 1 )*k;t_'=. + + +   +                           ",
+"                          + $ % n]9 ~^> [ 1 ^ ^ ^ )*{(D@=.+                   S/1 ^ ^ ^ ^ ^ e$m> <z+.<I-u#+<B$;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@ #n@<%5&<%@<#<)/J+^ ^ ^ Y&w#$<A&b#G v.g n+n+%<&<a&j(6&**;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@W;3#*<0==<-<r$({;<J^L@1=^ ^ ^ 1 =(.           + . 6^..1 ^ ^ ^ ^ ^ ^ ^ 4 [ >*$+;#( $ .                           ",
+"                    . + + a'/>r j*1 1 1 1 1 ^ ^ ^ 1 1 1 0{n^=++ + + +         D;1 ^ ^ ^ ^ ^ i@<^><[&x@,<E+'<O@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@<%K.@@f^)<!<C(T&^ ^ ^ n+p@~<{<;+;+G J+l &@Z+]<^</<(#8>;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@3#r+(<*._<L^[&:<6+l L@T&^ ^ ^ ^ h~+     + + + /&B/]+[ ^ ^ ^ ^ ^ ^ ^ ^ 1 1 [ 1 1 7{>{D;A@+ .                     ",
+"                    $ I +$5>4 [ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ [ ).5(h+. $         c 1 ^ ^ ^ ^ ^ g V{<<y+Q#[<S.}<_+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@C$@@M&|<1<2<p$T&^ ^ ^ 6+3<4<5<6<7<~@n++*f/T&u.8<b/7@6@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@V@S-9<~.0<t+e,a<J+b#1=^.^ ^ ^ 1 p*.   + . j;i*a 4 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ [ ]+d 5($ .                   ",
+"                  t_: 1 1 1 1 1 ^ ^ ^ ^ ^ 1 1 [ 1 1 ^ ^ ^ 1 1 1 1 b<b'        7 K'^ ^ ^ ^ ^ f S.c<J#b]d<e.e<X#s+w%x-;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@k+;@;@m@<%T+f<g<6#j#T&h<+=T&6#K&i<n@5&j<A*k<#%%@f f 1 X l<m<V@W*@@7@r$;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@a&m&n<Z+o<1%x-p<^.c+Y;^.^ ^ ^ $%6 +   . I.1 [ ^ 1 ^ ^ ^ ^ 1 1 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 1 1 1 ;#.                   ",
+"                '=[ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ [ [ .$4 1 ^ ^ ^ ^ ^ ^ ^ [ *         $ F~^ ^ ^ ^ ^ ^.s;P!Q=p;q<r<s<t<:]L.5:]#;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@n@V@{*y+@<u<v<w#^ ^ ^ T&<,k=w<x<L.Q@C$C$y<z<A<f G L@T&E.u.B<C<s+A%3+F*;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@<%D<B=8_E<W'F<G/^ ^ ^ ^ ^ ^ ^ 5%$ +   h+[ 1 ^ ^ ^ ^ ^ ^ ^ 1 t-A{> ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 >*U$                  ",
+"            . . o!1 ^ ^ ^ ^ ^ 1 1 [ [ 1 Y~l*q =+c_W$[ 1 1 ^ ^ ^ ^ ^ 8 A@.     .  ^^ ^ ^ ^ ^ e$+=G<H<Q@I<_*U#J<}:X%B$r$;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@_+K.m@3{K<K,L<+=^ ^ ^ Y&M<$^N<;%Q@**Q@L.O<P<6;j$s;G J+Y&&@[@Q<R<S<|#m@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@+@T<F.U<V<5&W<X<^ ^ ^ ^ ^ ^ [ M;+ + + 4(1 ^ ^ ^ ^ 1 1 [ 5%) K*+ +~-(H^Y~[ 1 1 1 1 ^ ^ ^ ^ 4 Y<+ +               ",
+"            $ @.C 1 ^ ^ ^ ^ ^ 1 4 4 e~H `]$ . $ . a'!.|]4 ^ ^ ^ ^ ^ ^ h#$     $ n^^ ^ ^ ^ ^ ^ b#'&Z<C$0&`< [.[2%V@n@@@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@3#@@[&+[@[B~T#&%^ ^ ^ Z+#[$[3#[%C$5$r$y+t$J#b-z$j$n+n++*<*b#&@%[&[])V+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@*!*[=[-[i>R-;[0+^ ^ ^ ^ ^ 1 [ )=  + % N*^ ^ ^ ^ ^ 1 k;q { +       . $ - D@B@0{[ [ ^ ^ ^ ^ 4 O*' +               ",
+"            + |]1 ^ ^ ^ [ [ 1 A{z@>[+ +     +   + + + + ~(M*[ ^ ^ ^ ^ g+$     +  ~1 1 ^ ^ ^ ^ R+#%,[t+C$'[2.)[![N@U+P@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@V+;@@@O@Q@~[{[][~@g g h<l Y&f*~#^[L.[%5$;@m@X%@@k+J#(+/[A>([v#d$1 1 g [+_[:[V@V+@@S%r$;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@_+w% #;@d*7-4 <[k+y+[[F.^ ^ ^ ^ ^ 1 4 ~(  + p*4 ^ ^ ^ 1 [ &>+   +                 + % /.z{> [ ^ ^ 1 1 r .               ",
+"            ,{C ^ ^ ^ 1 [ -#h+. $ .                   . $ $+]+^ ^ ^ ^ 4 I]      { M*[ ^ ^ ^ ^.c+~@}[E{n@|[1[p@:>y+V+#(;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@K.{*N@;%2[3[%@^ ^ ^ j#4[E%5[6[L.Q@5&O@Y{w%7[n@;@B$@@V@8[9[0[L@t L@l E.&%a[b[;$2'^-z+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@X%[$3#c[f+A=d[k+9.e[}=^ ^ ^ ^ ^ 1 5>.   + z@[ ^ ^ ^ [ i#a'                          $ . 1][ ^ ^ ^ ^ ]+P+              ",
+"        . . 7/1 ^ ^ ^ 1 +.o$  +       + . $ . +           /.[ ^ ^ ^ ^ [ p!        ! [ ^ ^ ^ ^.n+1 Z$f[C$^-g[@$h[,:($B$;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@_+K.w%M&i[j[k[[.^ ^ ^ Y;C(l[m[T+<%**Q@k+r+4+n[l+<%O@r#[&o[p[a!q[{@t J+c#&@&%r[s[S<Q^@@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@C$;@Y#5[$.t[3+_+u[!;l ^ ^ ^ ^ ^ 1 } +   + e~1 ^ ^ ^ [ p!+           % y.. . . .         { ~ [ [ ^ ^ ^ {(y.+           ",
+"        . I]> [ ^ ^ ^ ^ V$+           + w g#*]w           w K ^ ^ ^ ^ [ f~        )=[ ^ ^ ^ c+1=1 ;.v[L$Q^w[#.x[y[V+]#;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@<%k+x%z[r{B~'.$=^ ^ ^ f A[w/l+5$_+@@r$y+]-B[C[&_x+;@ #[%X#J#D[E[+;L@u.6+c#n+c#F[G[s+V+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@n@V+L.H[I[6#J[V@[%K[E.g ^ ^ ^ ^ ^ ^ Q{.   7 )*1 ^ ^ ^ 1 o*+           w)i#Z~/>-+.         . :@J 1 ^ ^ ^ 1 H +           ",
+"        $ j ^ ^ ^ ^ [ | y.+       + <]} -.[ 4 $'. +       . ) ^ ^ ^ ^ ^ 1 ;#.     C+K'^ ^ ^ ^ ^ ^ ^.L[M[r+N[O[P[Q[1%V+;@;@;@;@;@;@;@;@;@;@;@;@;@;@ #;%;@X%J#9#i>R[8~b#^ ^ d=[@[+n%S[T[n@_+;@k+_+L.~%U[~=&@V[W[[%_+m@@@O@$;X[a[Y[v#u.1 1 g c#Z[`[3#V+$;0&L.;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@ #r$5& }a@.}+}V@n,[_#%n+^ ^ ^ 1 [ j*-+$ . }]4 ^ ^ ^ ^ 5 6 +       + $ 7/[ ^ ^ t-m e +         * [ ^ ^ ^ ^ d.A@          ",
+"        I )*^ ^ ^ ^ [ b $ +       n^C [ 4 [ [ g~$ +       . A@K@^ ^ ^ ^ ^  ^.     $ B/^ ^ ^ ^ ^ ^ ^ B=@}(+6&#}R $}%}W';@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@K.[$6@N@&}*}l$^ ^ ^ g 8_~==}-}n@5${*@@C$@@;}>},}5;n+2.V['}1%w%]#B$k+5$)}!}0[n+G L@&@f w#!<~}])[&K#7@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@V@y+{}]}0+^}3+5$/}J!~@n+^ ^ ^ ^ [ _@. . . j [ [ ^ ^ ^ l].         + U$7{[ ^ ^ 4 [ (/+         c.m*^ ^ ^ 1 [ z{          ",
+"        * [ ^ ^ 4 4 W(+           >[4 1 ^ ^ ^ $%K*            ! [ ^ ^ ^ ^ d o$    . n/4 1 ^ ^ ^ ^ ^ T&(}]/_}:}<}T.[}v&;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@<%K.w%}}|}1}2}k ^ ^ ^ J+3}4}5}f^3#**@@ #y+I/k:[@=^:&n+$=f 6}7}Y#<%]#r#x%8}9}0}a}a+t u.Z%Y&J+b}c}d}($r$;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@ #x+e}f}0~s[$;p%g}h;l u.^ ^ ^ ^ [ q   + -+C;^ ^ ^ 1 4 s           .  ~^ ^ ^ ^ [ g++           - ).^ ^ ^ 1 4 M;          ",
+"        c'[ ^ a .~L', .           + >#1 ^ ^ ^ [ t_            g#4 ^ ^ ^ ^ [ )=    . =.Y~[ ^ ^ ^ ^ ^ 1 h}i}[%K.j}'!k}^<;@m@;@;@;@;@;@;@;@;@;@ #;@;@;@J#k+}}l}l)s;B .=c+^ b#R V#m}y+s+k+@@r$K#%]n}e.l J+L@T&J+y F.A>o}x+;@ #@@R-5$p}G_S.m-3*+*Y&E.x*)>q}a&k+ #m@m@;@;@;@;@;@;@;@;@;@k+;@;@t+r}s}t}u}|#U)v}F+f*l l ^ ^ ^ ^ -.U$    ;*1 ^ ^ ^ 1 ).K*          . *]^ ^ ^ ^ 4 E~            F^[ ^ ^ ^ ^ 4 D@          ",
+"        =(-.Q i;                  + }]1 ^ ^ ^ 1 i*$           y.0{^ ^ ^ ^ [ r-% .     '@1 ^ ^ ^ ^ ^ [@'!w}Q=<%x}y}f*4/N@W'n@@@;@;@;@;@;@;@;@;%;@_+<%9#}}z}%_^ ^ ^ Y;m%q@s]t]t'w%C$ #k+_+(+A}B}r,J+c+^ ^ ^ ^ ^ ^ ^ C}D}1%3#;@@@O@w%E}F}g*O.n+L@g 1 J+G}H}1%V+$;I}@@;@;@;@;@;@;@;@@@c)($[$G&J}p(K}L}A%*!M}^ ^ ^ ^ ^ ^ ^ 1 z{+   + B@1 ^ ^ ^ 1 q*+           w 5>^ ^ ^ ^ [ <]          + j [ ^ ^ ^ ^ 2 {           ",
+"        w =.. +                   + - l;^ ^ ^ 1 [ #           + p!^ ^ ^ ^ 1 8 '=.   + h+a ^ ^ ^ ^ ^ e$}=N}O}S-P}Q}5;R}S};%V@J#;@;@;@;@;@;@;@;@K.3#k+T}U}V}S ^ ^ ^ e$|{W}X}Y}n@5${*@@C$($Z}`}F+c$E.^ ^ ^ ^ ^ ^ ^ ^ F. |.|e,w%O@5$y+5$+|@|r&&@!;:*&@l ~@K,#|s+8#N@]);@;@;@;@;@;@;@r#;@{&S-$|%|G=&|M&5$*|^,^ ^ ^ ^ ^ ^ ^ C e +   { ; [ ^ ^ ^ 1 =(+           I][ ^ ^ ^ ^ d.y.          a'; 1 ^ ^ ^ ^ * .           ",
+"                                  + . *+[ 1 ^ ^ ^ L'. +       .  ~)*4 ^ ^ ^ ^ 9'$     $ B/^ ^ ^ ^ ^ :*c#k$=|Y{V@-|;|E+>|,|k+;@;@;@;@;@;@;@;@X%[$j(;>'|;{)|B ^ ^ ^ J+!|~|{|T+5&**@@n@t+}&]|Z+B=y J+c+^ ^ ^ ^ ^ ^ ^ y m-A*$|8#<%;@V+8#^|8/8</|(|t E.&+R+J+D:_|:|$;W*;@;@;@;@;@;@;@7@r$f^<|[|u@}|||x+q/1|E]^.^ ^ ^ ^ ^ 4 j $ . $ d~[ 1 ^ ^ ^ )*c.+           Y<]+^ ^ ^ ^ Q .         $ j;^ ^ ^ ^ ^ 1 &>.           ",
+"                                    . 6^[ 1 ^ ^ ^ m*{         + . r-1 ^ ^ ^ ^ P*$     + 6^[ ^ ^ ^ ^ ^ c+[.Z*2|y+F#3|;!J!4|q&k+;@m@5$k+;@;@;@5$6@G&5|o&q@k .=Y;e$~@+*n}9.|#7@@@@@n@^-%]6|#.&@1=L@T&e$:*&%1 T&R T&^.c+$=^&7|8|5&w%J#@@;%V@9|0|H-k %@!;Y&:*x*]}a|K. #W*O@m@ #;@;@;@ #**{&b|f*s]c|a&f@1@J!X ^ ^ ^ ^ ^ ^ ]+6^+ . . n*1 1 ^ ^ 1 #+. +         + : [ ^ ^ ^ 1 ;#+         . B@^ ^ ^ ^ ^ C;- +           ",
+"                                      a'z.1 ^ ^ ^ [ <@+           k*[ ^ ^ ^ ^ [ g#      + J][ ^ ^ ^ ^ ^ ^ ^ d|e|[&f|W{p=g|h|Q@t+V@i|r$@@C$_+(+}}j|T>^ ^ ^ c+m%))U#k|l|w%5&@@k+3#r+m|S^p$u.Y&c+^.g },<#[_n|`{~.~@l ^ ^ ^ ^ o|p|q|y+;@O@O@($r|i+s|F.:*L@g f J+:,t|5&k+A%u|@@;@;@;@@@_+v|w|x|y|z|v&|*A|l f ^ ^ ^ ^ ^ 1 J].   + y.r.^ ^ ^ 1 [ 3 $ +       . s-1 ^ ^ ^ [ 7{{           w : ^ ^ ^ 1 [ ~^$ +           ",
+"                                      + H+^ ^ ^ ^ 1 Z~+           n]K'^ ^ ^ ^ 1 * +       <][ ^ ^ ^ ^ ^ ^ ^ k B|H@C|m(D|O E|F|3#q& #n@[$V@@@G|H|._I|^ ^ ^ ^ B~r>J|K|$;5$[$@@C$@@L|M|J!S E.^.^.^ l p$N|O|[%P|j_k J%c+^ ^ ^ q@Q|}~|#@@J#5$r+1$k_R|C,P&Z+:*&@Y&Z+j[S|T|x@Q^B$;@;@;@]=U|V|5{W|X|1$C$Q[;][@&@^ ^ ^ ^ 1 1 {++     I 1 ^ ^ ^ 1 a Y|+ +       + C/^ ^ ^ ^ [ r             <][ ^ ^ ^ ^ [ I++ +           ",
+"                                      + # 1 ^ ^ ^ [ )*6           . q*^ ^ ^ ^ [ Y~-+.     $ |]^ ^ ^ ^ ^ ^ ^ $$Z|`|S%5&p&;!e% 1q+r#J#k+[$w%E'.1f}+12.^ ^ ^ b#!)@1#1V+C$[$@@n@r+$1%1Z+A&A&1=c+c+1 *.&1*1X%k+Q@=1-1J!b#^ ^ c+3*f _*W@2%<%;@k+c)O<;1>1i$J^G E.J^R+b#,1'18]@@W*;@;@;@/*)1}!N}!1**V+~1,^;!k Y;^ ^ ^ ^ ]+b<$ .   + L*1 ^ ^ ^ 1 A{.           .  .1 ^ ^ ^ [ Q{            = 1 ^ ^ ^ ^ 8 7               ",
+"                                      + . c'1 ^ ^ ^ 1 )=+         . b ^ ^ ^ ^ [ 1 {1+       =#l;1 ^ ^ ^ ^ ^ &@k ]1^1i>/1(1B _1:1_#[%1$;%y~<1Q![@i@[1d=i@l ;!}1+,6@^% #@@n@|111212.R+T&L@g L@x*[ 3141@@R-@@a&y+t!r%[+'.Y&^.1=D%v.]]511%n@J#@@6@a&617181[.l$!;T&m-}=91015&3#;@]){*a1b1,@e!c1k+d1|_R F.l L@^ ^ ^ 1 l;>[. +   + I^1 ^ ^ ^ 1 %>+           -+J ^ ^ ^ ^ t--+        + . h(1 ^ ^ ^ ^ #++               ",
+"                                          h#4 1 ^ ^ ^ C@. +       . y.)*^ ^ ^ ^ ^ 4(.       + '@4 ^ ^ ^ ^ ^ ^ ^.6#e1r+C$f1g1u@h1i1X#6@j1k1l1c+^ ^ ^ Z+m1^,n1o1w%[$@@[%l+C$p1q1r,E.T&^ ^.c+[++#r1s1r#;@;@;@;@_+t+t1u14 m-l ^ ^ ^ ^ v1w1x1L.;@O@O@@@y1z1A1[.G :*g n+J+*-B1y+s$Y#C1J'v;D1E1x+l+N$,@^ ^ ^ ^ ^ ^ ^ ^ 9'+       , 4 1 ^ ^ ^ 1 /&+           V$4 ^ ^ ^ ^ *+$         . I 4 [ ^ ^ ^ 1 t_.               ",
+"                                . + . . s-E~[ ^ ^ ^ ^ ]+Y|        . %>^ ^ ^ ^ 1 M*6 +       + =+i#1 1 ^ ^ ^ Y;E.R+F1G1|#1%5)']O H1I1J1(%n%k]^ ^ ^ ^ K1L1M1F<@@V@[$;@L$k+N1O1p$S A&^.^.^ 1 F.P1Q1@@@@;@;@;@V+w%C$($R1S1`%$.^ ^ ^ c+c#T1U1e,k+J#<%;%N&e|V1u W1Z+:*Y&R+Z+*-X16&Y1//B~Z1`1y+|#a- 2Q%^ ^ ^ ^ ^ ^ 1 i#{ +       U$: 1 ^ ^ ^ 1 _ . .         *+[ [ [ 1 [ V$.         . n$[ 1 ^ ^ [ [ ' .               ",
+"                              + $ n]N;{()*4 4 1 ^ ^ ^ [ *]        n]$%^ ^ ^ ^ 4 k*          + $ n!4 1 ^ ^ ^ 1=g &@A&.2+26@1%4'@2'!9=#2v#l1m%c+^ ^ ^ $2%2L^9#_+C$@@P@y+&2*22.J+E.1=g g 1 B'=2-2@@5~ #;@;@;@V@@@n@3#[%;2>2r,^ ^ ^ c+w#[@&',22%Q@;@@@o{N&q:'2)2=,:*'&;+Y&u.!2~2{2;.]2^2Y#<%/2k{l Z+^ ^ ^ ^ ^ ^ 8 0'          + F^1 ^ ^ ^ 1 ]+F^. +       I |+#+d [ .$C+.         . c'^ ^ ^ ^ [ I^$ +               ",
+"                        . . ( 6.g~.$1 1 1 1 1 ^ ^ ^ ^ [ 5>. . + . z{[ ^ ^ ^ ^ f~-+            + $ *+1 ^ ^ ^ ^.c+T&L@[@w<(29#{&_2;<Y=[.~@i@&%J+J+k (=:2[&6@5$n@<% #Q=<2[2[ c#T&^.c+n+F.`%}2L~V+m@ #W*;@;@;@;@<% #;@V@[%|212J%0+Y&b#1=&%v.*(22O-L.J#@@k+5$u]3242S.#%B=&%n+Z%N s]52C1R-r+6272v.n+T&^ ^ ^ ^ 1 [ >{.             w #+[ ^ ^ ^ 1 z.=++       + +   C+n/Y<+ +         ;,a ^ ^ ^ ^ [ %>.                 ",
+"                        6^,*t-[ 4 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 4 :@$ $ ~(j*[ ^ ^ ^ ^ ) +               + -+y&^ ^ ^ ^ ^ ^ ^ Z%h;82616@9202B~b#^ ^ c+Z%$=h}a2;>w%[$X%_+y+t+b2c2'!!;J+^ ^.c+^!+#d2]'q&;@;@;@;@;@;@;@;@;@;@;@;@_+G&e2$*f$m-&@^ ^ ^ ^.*(f2P#($;@O@@@5$g2h2]+x*1=c+c+n+R+F.i2Q$@@j2k2g ^ ^ ^ ^ ^ ^ ^ [ F~6 +           + $ i;8 1 ^ ^ ^ 1 >{+               . .             b=4 ^ ^ ^ ^ 4 _/                  ",
+"                  7 L'< ^ 1 1 ^ ^ ^ ^ ^ ^ ^ ^ 1 [ ^ ^ ^ 1 l*$ y.! ^ 1 ^ ^ 1 ..  +                   E@> 1 ^ ^ ^ ^ ^ e$T&R l2m2z=n2m%L@^ ^ ^ a@H=o2d@k+{&K.;@'+[%E}p2T#=-3*L@^.^ ^&,@q2y;V+m@;@;@;@;@;@;@;@;@;@;@;@y+w%L$@@r2s2S.N+^ ^ ^ 1=c#t2u2G&y+J#k+;%d}v2w2Q![ i@J+A&<*T&'.'|x2y2Z+c+^ ^ ^ ^ ^ ^ ^ > '=                  + >,1 ^ ^ ^ 1 J d~. . .         +           . + o!4 ^ ^ ^ ^ : .                   ",
+"                  9{4 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ a ]+^ ^ ^ ^ .$(@(>4 ^ ^ ^ ^ [ />                      + ) 4 ^ ^ ^ ^ ^ u.$=O o&B(T.%@~@g ^ ^ ^ A.z2l+1%k+_+;@;%|#A2|'F.Y;:*J+g g l B'B2C2J#Q#W*;@;@;@;@;@;@;@;@;@;@;@5$[%n@V@[%D2E25;^ ^ ^ c+w#c#Z(F2q/5$;@@@Q=1$]/G2t2c#J+f n+J+A&s_H2w;u.c+^ ^ ^ ^ ^ ^ [ I+$                   + 9{j*^ ^ ^ 1 4 )*H^z@b'.                   6 L*K'[ ^ ^ ^ ^ ,*+                   ",
+"                  . r-1 ^ ^ ^ ^ ^ 1 1 [ [ A{Q*h+K 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ >#+                       + . ! [ 1 ^ ^ ^ ^ ^.e$e$c+c+^.^ f 3*6#I2F=E2J2V@8>;$y+5&K2L2&@c#T&^.^ f 2.x&i&M2W*;@;@ #;@;@;@;@;@;@;@;@;@;@;@;@@@;@;@<%k+N2O2u@~.&@b#c+c+^.a=p_P2L.V+<%Q2R2S2P h;p=c#^.^.R+Y;1=c+c+^ ^ ^ ^ ^ ^ [ 7/                        . H+4 1 ^ ^ ^ ^ ^ ^ ^ W(z{<@( . + . $ A@Q*$%1 ^ ^ ^ ^ ^ ^ <]+                   ",
+"                    =(1 ^ ^ ^ ^ ^ 1 ; z{{+y.$ + C/^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 0'.                       + $ { W(1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ E.m-j^T2k$O U2V2W2v&l+)}E;[,B=b#^ ^ c+^!J!X2||q&;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@w%_+X#Y2Z2[.m-&@^ ^ ^ b#J,`22%[% 3.3+3;.@3#3~.T&c+^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _ a'                      + . A@5 1 ^ ^ ^ ^ ^ ^ ^ [ [ [ M*r c_;,-(5>[ ^ ^ ^ ^ ^ ^ ^ (>a'+                   ",
+"                    -+l;4 [ [ l;c=/&{         $ o$l;[ 1 ^ ^ ^ ^ ^ ^ ^ [ i*                              + +~g+4 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ O $3%3&3*3m>F==3-3i};3>3+*J&$=b#^ e$^&0+,3Y_H@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@r+w%_+@@'3u(v;~.^ ^ ^ b#u.B')3!3~3h;p=S&{3]3E#p$x&v.^ ^ ^ ^ ^ ^ ^ ^ ^ [ g+C++                           + I+[ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ a ^ ^ ^ ^ ^ ^ ^ 4 [ [ M;                      ",
+"                    . q*)*I.s a'. $ . +       + . Z][ ^ ^ ^ ^ ^ ^ ^ ^ 1 w)                              + $ []5 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ p@^3y(H@5&/3S'a=o+(3_3F=Y&E.J+g g l /=:3<3J#<%#(;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@5$L$w%<%9#[3}36+c+^.c+b#Z+Z+N+J!(-<#&{|3[%132333*.l g ^ ^ ^ ^ ^ ^ ^ ^ -.A@. .                           + . r.^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 4 h(/>.                       ",
+"                      o$+~.                       q ]+^ ^ ^ ^ 4 4 2 ,*j;$                                   + b'O*4 1 ^ ^ ^ ^ ^ ^ ^ A&6+43,]|1@@x@5363k#1 l T&^.^ l 0+#.73+} #;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@<%@@8393v~N+l b#^ ^ ^ 1 03a3p%t+l+b3c3=^^ ^ ^ ^ ^ ^ ^ ^ ^ 4 M*/..                                   s-9 -#$%[ 4 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 4 [ 4 {(0'.                           ",
+"                        . +                       . d.1 ^ ^ l;Z]g#6 . $ $                                   + $ =#; 1 ^ ^ ^ ^ ^ ^ ^ d3'&k#e3f3Q=N@3%g3B;&%g ^.^ ^ [+f*D#p-r+;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@n@_+x+h3i3`%R &@^ ^ ^ Y&h;j3q#Y{k3l3t.&@^ ^ ^ ^ ^ ^ ^ ^ ^ ; m3$ .                                   + . . 6 c 9'-.^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ [ c'/&. . +                           ",
+"                                                  . +$]+b+)=A@                                                  . I 2 4 1 ^ ^ ^ ^ ^ E.+=j#:*n3o3p3q3r3s3v.D%^ c+B /=t3D$x-;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@_+w%[%[%u3v3d+;!^ ^ ^ L@Z+'!w3x3;&0=f g ^ ^ ^ ^ ^ ^ ^ [ z.# .                                                   y.h+L i*4 [ 4 4 4 [ [ R.E@$                                   ",
+"                                                  + =+' + . +                                     + +           + $ h+| 1 ^ ^ ^ ^ ^ g |=E.j#t.6+}.S.E.e$&%e$g [.u#y3z3[%J##(;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@5$L$w%<%[%Y}A3[@:*v.c+^.c#6+'!6#E+P&u.n+^ ^ ^ ^ ^ ^ ^ b+o$$ . +       + +   + +                                 + . + + o$n/! > [ b<{+. . +                                   ",
+"                                                                                              $ . $ - !./&$ +       . `]k;[ 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ e$*.n%B3u&;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@ #;$L.C3D33}Y.&%g ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 4 J]- .     $ P+= g#(/- $ . $ +                                           + . e $                                           ",
+"                                                                              +   + + + + n]E@t_l]~ J [ 1 >,K*      + + U$H+[ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ J+~.E3F33#;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@s+L$<%q;G3H3E.^.^ ^ ^ ^ ^ ^ ^ ^ ^ 1 ^ 1 J $++ + .     x{4 1 1 [ J W(I.M;c_!., w + +                                   + . +                                           ",
+"                                                                              . o$b''*B{< K'4 ^ ^ ^ ^ ^ [ K $           . $ F^l;^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ g I3J3@/K3;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@L.y+|1L3M3N3 )w#T&^ ^ ^ ^ ^ ^ ^ ^ ^ [ 4 Y~0'            / 4 ^ ^ ^ ^ ^ ^ ^ ^ 4 [ (>C@K*+                                                                                 ",
+"                                                                              . l*1 1 1 1 [ 1 ^ ^ ^ ^ 1 > I]+           + . + ~(C@1 1 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ b#w;F.O3P3Q3;>($X%$;;@k+V+W*;@O@m@;@;@W*@@O@O@O@<%5$;@;@;@O@O@B$C$;@;@@@O@J#r+R3S3T3a#6#[+1 1=^.^ ^ ^ ^ ^ ^ ^ 1 ^ 1 i*p*+             a'8{^ 1 ^ ^ ^ ^ ^ ^ 1 1 1 1 l*. +                                                                               ",
+"                                                                              $']+^ ^ ^ ^ ^ ^ ^ ^ ^ 1 [ n^$ +                   a'S/K'[ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ n+A(U3V3W3X3Y3_+k+ #R$V@]=1%X%W*W* # # # # #V+y+W* # # #;@m@5&Z3`3 4.4U2v~}=g ^.^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 l;|+y.+               . +~: [ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 ]+{1$ .                                                                             ",
+"                                                                              a'Q*l;1 1 1 ^ ^ ^ ^ ^ 1 D~y..                       + I N*4 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ e$H-^&+*:$6*+4@4#4$4%4&4d@($y+{&@@;@;@;@5&3#k+V+[%Y#]-*4=4j%-4;4}'6+Z+m%J^Z+L@1=^ ^ ^ ^ ^ ^ ^ ^ [ [ 4 J];,. +                 + + <]).1 1 1 1 ^ ^ ^ ^ ^ ^ 1 d ,{                                                                              ",
+"                                                                              . $ # K [ [ ^ ^ ^ ^ ^ 1 h++                           . . n/0{^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ J+D%g g ~@P%d$[ u ~.|,>4k/,4'4)4!4~4~4~4{4 4]4^40_/4(4)%J!/=L@J+G g Y;u.:*n+g c+^ ^ ^ ^ ^ ^ ^ 1 4 5%V$$ $ +                       . Q{q*-.K'4 ^ ^ ^ ^ ^ ^ ^ 1 i#[]                                                                            ",
+"                                                                              +   + a'z@+.1 1 ^ ^ ^ ^ h~+                             + + o$n$+.1 1 ^ ^ ^ ^ ^ ^ ^ ^ ^.c+1=b#T&g v.n+f 1 1 L@1 v.M :*L@L@L@1 L@L@l R+Y&&@u.1 R+T&^.g ^.^ c+e$T&c+^.^ ^ ^ 1 1 1 [ +.n$a'+   +                         + + + + , w)3 8{> 1 ^ ^ ^ ^ 1 C@w +                                                                         ",
+"                                                                                    + $ ;*4 1 ^ ^ ^ 1 b<+                                   . - H+l;^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 [ m*Y<- . +                                           $ . H [ ^ ^ ^ ^ ^ 1 9'.                                                                         ",
+"                                                                                        $ d.[ ^ ^ ^ 1 C;-                                       + `]x{7{[ 1 1 [ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 [ 1 1 7{3 U$      + + + .                                       + $ B{[ 1 ^ ^ ^ ^ C F^. +                                                                     ",
+"                                                                                        + & 1 ^ ^ ^ 1 [ =(                                          $ a's k;J [ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 d ! g#. . +       + a'j;-++                                     + . { W(1 ^ ^ ^ 1 4 t-@ +                                                                     ",
+"                                                                                          b'1 ^ ^ ^ ^ 1 _ $ +                       + n]j +~. .           + 9{1]r-8 [ [ [ 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 [ [ 8 r-4(+~+           + . @ C@1 5 l]6^$ . . .                               + (/+.[ 1 ^ ^ ^ 1 ~ a'$ +                                                                 ",
+"                                                                                        + $ | ^ ^ ^ ^ ^ $%( +                       + R{4 ; q $             $ . $ p*k*e~m*1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 7{|]-(p*. $ . .           + s 7{1 1 ^ 1 [ b+I+n].                               + $ 0'8 1 ^ ^ ^ 1 [ *+$ +                                                                 ",
+"                                                              + . k*[]$ .                 . ) [ 1 ^ ^ ^ 1 `$+                   + $ q a ^ ^ q*$                         { b'b=Z~W(]+1 [ [ 4 [ 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ [ [ [ 1 [ C ~ Z~) i;{                         z@J ^ ^ ^ ^ ^ ^ ^ ^ $%9'# . . +                           + L'1 ^ ^ ^ ^ ^ 4 />+                                                                 ",
+"                                                              + j;4 $%&>$                 $ >[4 1 ^ ^ ^ 1  ^+                   . s-2 [ ^ ^ >*.                             . . . - '=g#Q**]_@N*N*N*N*N*N*N*N*N*N*_@*]t_g#'=- . . . .                           *][ 1 ^ ^ ^ ^ ^ ^ ^ [ 4 a N*H a'                          + % J]^ ^ ^ ^ ^ 1 /.+                                                                 ",
+"                                                              . !.^ ^ [ m]{ $       + $ +   + D~[ ^ ^ ^ 1 C;a'+ + + + + + ( - - 6 * ^ ^ ^ ^ [ -                                                                                                                 I^^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ [ 2 5(=#. .                       A@i#1 ^ ^ ^ 1 /.+                                                                 ",
+"                                                              . ' 8 ^ [ [ : =(] ] ] b z{M;M;M;i*1 ^ ^ ^ 1 [ ~^_ ~ ~ ~ ~ ~ K@1 ^ 1 [ ^ ^ ^ ^ 4  ~                                                                                                              + A{^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 4 [ [ [ b<;*U$                    + *+1 ^ ^ ^ .$`]                                                                  ",
+"                                                                  m*1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 s                                                                                                               w ^ ^ ^ ^ 1 r.;#c'K'4 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 2 Q*[]. . $             W([ ^ ^ ^ j*. +                                                                 ",
+"                                                                  b<[ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 p!                              +               >[ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~i;Y|                                y.^ ^ ^ ^ 1 ! . . ~(9'Y~^ ^ ^ ^ ^ ^ ^ ^ ^ [ 1 > J]0'%           + m*1 ^ ^ ^ : . +                                                                 ",
+"                                                                  o][ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ [ R.                          + $ I]y&l;K'K'K'K'K'C ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ [ > ;*$                             :@[ ^ ^ ^ ^ m]        ( N; .4 4 4 ^ ^ ^ ^ ^ ^ ^ ^ 4 r.o^o$$ +   + 7{1 ^ ^ ^ _                                                                     ",
+"                                                                  t_[ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 r.. +                       + I ; [ 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ [ [ J b                           + $'1 ^ ^ ^ ^ m]        + . +  ~m]C;1 1 ^ ^ ^ ^ ^ ^ 1 1 1 ]+-#;#$ p*8 1 ^ ^ ^ b<+                                                                   ",
+"                                                                  i;4 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ [ 4 1 ^ [ 4 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ { .                   + $ (/; [ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ [ )*n/$                       + z{1 ^ ^ ^ [ |++               . - a,G^4 4 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ W(= 4 1 ^ ^ ^ 1]$ +                                                                 ",
+"                                                                  7 K'^ ^ 1 1 5 -.-.-.-.W(Z]Z]Z]Z]B/1 ^ ^ ^ ^ ^ ~ '*=(=(=() j Z]Z]Z]7{1 1 1 ^ ^ P+.                 + + n]r-[ 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ [ 1 J H + +                   + 5(1 ^ ^ ^ 1 ] +               . . + . 0'g~).1 1 1 ^ ^ ^ ^ ^ ^ 1 1 1 1 ^ ^ 1 Y<+ +                                                                 ",
+"                                                                  . 2 ^ ^ 4 d /..               + - d.^ ^ ^ ^ ^ K@=++               =+ ^4 4 ^ ^ I+.               + $ =+G^[ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ [ J h#.                   + {(1 ^ ^ ^ 1 e~%                       . % =+o^y&[ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 4 />                                                                    ",
+"                                                                  . |]^ ^ 1 L*. +                 . = 1 1 ^ ^ ^ 1 *]+               + $ =(+.1 1 !.+             + + =+W(1 1 ^ 1 1 1 K@N*N*N*N*N*N*N*N*N*V *]*]*]*]*]*]*]g+1 1 ^ ^ [ 1 ]+C/+ +               + i*1 ^ ^ ^ 1 [ L*+                     + + + + y.:@|]4 1 ^ 1 ^ ^ ^ ^ ^ ^ ^ [ {+                                                                    ",
+"                                                                  + H+^ ^ i*%                       ;,d 1 ^ ^ ^ 1 i#`]                  $ ' D~H+                . a'! [ ^ ^ ^ 1 4 Y~D + + + + + + + + + $ +           % e +.4 ^ ^ ^ ^ 4 4 ) .               + o^[ ^ ^ ^ ^ ^ [ :@                                $ >[5(; [ [ ^ ^ ^ ^ ^ 1 > h+                                                                    ",
+"                                                                  . V$[ O*s-+                         6{1 ^ ^ ^ ^ 1 3 +                 + + + +                 a'D~1 ^ ^ ^ ^ ^ a <@+                                 + + '=m*1 1 ^ ^ 1 1 [ a,              + $ k;[ ^ ^ ^ ^ [ 7{p*.                             + + . % b i*a [ 1 1 [ ~ (/+                                                                     ",
+"                                                                  $ $ `$g#                            /&]+^ ^ ^ ^ ^ W(a'+                                       m]4 ^ ^ ^ ^ ^ J V$.                                       . '=f~4 ^ ^ ^ 1 4 B/              + $ n]f~1 ^ ^ ^ [ 4 b+U$+                                   $ $ <]B@+.[ V `]. +                                                                     ",
+"                                                                    + + +                           + . >#[ ^ ^ ^ ^ 1 b                                         J]1 ^ ^ ^ 1 [ n*+                                         + + 6^d ^ ^ ^ ^ 1 b+                + + 6^)*1 1 ^ 1 ^ [ 5(+ +                                 +   + + =.<]. + +                                                                       ",
+"                                                                                                    + . D;4 1 ^ ^ ^ [ B/+                                       J]^ ^ ^ ^ 1 -#$                                               . B{^ ^ ^ ^ ^ b+                  + $ b=4 1 ^ ^ ^ [ 4 I+%                                                                                                                         ",
+"                                                                                                        . 2 1 ^ ^ ^ 1 4 P+. +                                 + J]1 ^ ^ ^ ^ =(+               + .                 . + $ +     $ m]^ ^ ^ ^ ^ b+                    + + >,[ [ 1 ^ ^ 1 )*m3. . . +                                                                                                                 ",
+"                                                                                                        + x{1 ^ ^ ^ [ [ +.=(+                                   ` 1 ^ ^ ^ 1 1].       - s-s-s-Y|b ] ] ] ] ] ] ] ] x{` `$$     $ V$^ ^ ^ ^ ^ b+                      . ( (.[ ^ ^ ^ ^ [ F~'@b b';,+                                                                                                               ",
+"                                                                                                        . []4 ^ ^ ^ ^ ^ ^ ^ s.~(. $                             L*^ ^ ^ ^ ^ Z]        = ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ & +     + c_^ ^ ^ ^ ^ b+                          Y|$%1 ^ ^ ^ ^ ^ ^ ^ ^ 1 0{b+b'.                                                                                                         ",
+"                                                                                                        + b 1 ^ ^ ^ ^ ^ ^ ^ [ .$t_$                             L*^ ^ ^ ^ ^ Z]        = ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ &         c_^ ^ ^ ^ ^ b+                          + `$]+^ ^ ^ ^ ^ ^ ^ ^ ^ 4 [ -.`]                                                                                                        ",
+"                                                                                                        + g~1 ^ ^ ^ ^ ^ ^ ^ 4 [ C (/                            L*^ ^ ^ ^ ^ Z]        = ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ B{+       c_^ ^ ^ ^ ^ b+                              9'[ 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ [ *+. +                                                                                                     ",
+"                                                                                                        o$> 1 ^ ^ ^ ^ ^ ^ ^ ]+f~1]$                             L*^ ^ ^ ^ ^ Z]        = ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ .~.       c_^ ^ ^ ^ ^ i*                              . C@1 ^ ^ ^ ^ ^ ^ ^ ^ ^ [ [ L .                                                                                                     ",
+"                                                                                                    + . D;[ [ 4 1 1 ).~ ` s _/. +                               L*^ ^ ^ ^ ^ Z]        Q ^ ^ ^ ^ ^ ^ ^ 1 1 1 1 1 1 1 1 .~.       c_^ ^ ^ ^ ^ a                               + 6 Q+(@q*-.+.4 [ [ 4 [ ^ ^ J 6^                                                                                                    ",
+"                                                                                                    + . e~4 0{o!3 /&o$. . + . $ +                               L*^ ^ ^ ^ ^ Z]        @.=(=(=(=(=(=(=('*{+I]I]I]I]I]I]>[.     + c_^ ^ ^ ^ ^ a                               . . + . + + a'I]F^3 Z]m 5>^ 2 6^                                                                                                    ",
+"                                                                                                    + . `$p*.                                                   L*^ ^ ^ ^ ^ Z]                                                $ V$^ ^ ^ ^ ^ a                                                       $ s-- .                                                                                                     ",
+"                                                                                                      . . . +                                                   L*^ ^ ^ ^ ^ j   +                                         +   . m]^ ^ ^ ^ ^ a + +                                                   + + . .                                                                                                     ",
+"                                                                                                                                                                E~[ ^ ^ ^ 1 > q $ +                                       $ % n$4 ^ ^ ^ 1 [ K'$ +                                                                                                                                                               ",
+"                                                                                                                                                              + c [ 1 ^ ^ ^ [ )*;*+ +                                     + 6.1 [ ^ ^ 1 ^ 8 &>. +                                                                                                                                                               ",
+"                                                                                                                                                                U$s.4 [ ^ ^ ^ 1 )*s $ +                                   d~d ^ ^ ^ ^ 4 4 o^.                                                                                                                                                                   ",
+"                                                                                                                                                                + { b<1 1 ^ ^ ^ [ a b .       + +                 7 i; ~/&; 1 ^ ^ ^ ^ [ $+.                                                                                                                                                                     ",
+"                                                                                                                                                                  + { o!4 [ ^ ^ ^ 1 a J]k;k;k;{(.$l;K'K'K'K'K'K'K')*4 [ ]+^ ^ ^ ^ ^ ^ _ y.                                                                                                                                                                      ",
+"                                                                                                                                                                    + % >,[ [ ^ ^ 1 1 ^ ^ ^ ^ 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 1 [ ^ ^ ^ ^ ^ 1 8{a'+                                                                                                                                                                       ",
+"                                                                                                                                                                      + a'* 4 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ g+-                                                                                                                                                                           ",
+"                                                                                                                                                                        + w _@[ [ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 1 W(C++                                                                                                                                                                           ",
+"                                                                                                                                                                          + y.7/4 1 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ +.[]                                                                                                                                                                              ",
+"                                                                                                                                                                              $ o^]+^ ^ ^ ^ ^ ^ ^ ^ ^ 1 1 ^ ^ ^ ^ ^ ^ ^ ^ 1 -.i;+                                                                                                                                                                               ",
+"                                                                                                                                                                              + . =#0 0 0 0 0 0 0 0 0 w)b'+ + + + + + + + . $ $ .                                                                                                                                                                               ",
+"                                                                                                                                                                                                        +                                                                                                                                                                                                       ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                ",
+"                                                                                                                                                                                                                                                                                                                                                                                                                "};
Index: orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui.cc	(revision 3921)
+++ 	(revision )
@@ -1,139 +1,0 @@
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
-
-
-   ### File Specific:
-   main-programmer: Benjamin Grauer
-
-*/
-
-#include <unistd.h>
-
-#include "orxonox_gui.h"
-#include "orxonox_gui_video.h"
-#include "orxonox_gui_audio.h"
-#include "orxonox_gui_exec.h"
-#include "orxonox_gui_flags.h"
-#include "orxonox_gui_banner.h"
-#include "orxonox_gui_keys.h"
-#include "orxonox_gui_update.h"
-
-  Window* orxonoxGUI;
-  OrxonoxGuiVideo* video;
-  OrxonoxGuiAudio* audio;
-  OrxonoxGuiExec* exec;
-  OrxonoxGuiFlags* flags;
-  OrxonoxGuiBanner* banner;
-  OrxonoxGuiKeys* keys;
-  OrxonoxGuiUpdate* update;
-int verbose = 4;
-
-int main(int argc, char *argv[])
-{
-  OrxonoxGui* orxonoxgui = new OrxonoxGui(argc, argv);
-  return 0;
-}
-
-/* ORXONOXGUI */
-
-/**
-   \brief Initializes the Gui
-*/
-OrxonoxGui::OrxonoxGui(int argc, char *argv[])
-{
-  initGUI(argc, argv);
-
-  orxonoxGUI = new Window( "grafical orxonox loader, "PACKAGE_VERSION);
-  
-  Box* windowBox = new Box ('h');
-
-  banner = new OrxonoxGuiBanner();
-  windowBox->fill (banner->getWidget());
-  
-  Box* optionBox = new Box('v');
-  
-  Box* avBox = new Box('h');
-
-  video = new OrxonoxGuiVideo();
-  avBox->fill(video->getWidget());
-  audio = new OrxonoxGuiAudio();
-  avBox->fill(audio->getWidget());
-      
-  optionBox->fill(avBox);
-
-  keys = new OrxonoxGuiKeys();
-  optionBox->fill(keys->getWidget());
-
-  exec = new OrxonoxGuiExec();
-  optionBox->fill(exec->getWidget());
-
-  flags = new OrxonoxGuiFlags();
-
-  optionBox->fill(flags->getWidget());
-  windowBox->fill(optionBox);
-
-  update = new OrxonoxGuiUpdate();
-  optionBox->fill(update->getWidget());
-  
-  orxonoxGUI->fill(windowBox);
-
-  // Reading Values from File
-  exec->setConfFile("~/.orxonox/orxonox.conf");
-  exec->readFromFile(orxonoxGUI);
-  // Merging changes to the Options from appended flags.
-  for (int optCount = 1; optCount < argc; optCount++)
-    orxonoxGUI->walkThrough(Widget::flagCheck, argv[optCount], 0);
-
-  flags->setTextFromFlags(orxonoxGUI);
-  orxonoxGUI->showall();
-
-  //// Handling special Cases. ///
-
-  // case update //
-#ifdef HAVE_CURL
-  if (static_cast<Option*>(orxonoxGUI->findWidgetByName("auto update", 0))->value == 1)
-    {
-      update->checkForUpdates();
-    }
-#endif /* HAVE_CURL */
-
-  // case start-with-gui.
-  if (!access(exec->getConfigFile(), F_OK) && static_cast<Option*>(orxonoxGUI->findWidgetByName("Always Show this Menu", 0))->value == 0)
-    OrxonoxGuiExec::startOrxonox(NULL, exec);
-  else
-    {
-      mainloopGUI();
-    }
-
-}
-
-
-/**
-   \brief Destructor.
-*/
-OrxonoxGui::~OrxonoxGui(void)
-{
-  delete video;
-  delete audio;
-  delete exec;
-  delete flags;
-  delete banner;
-  delete keys;
-  delete update;
-}
Index: orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui.h	(revision 3921)
+++ 	(revision )
@@ -1,32 +1,0 @@
-/*!
- \file orxonox_gui.h
- \brief Creation of the Gui
-
- \todo way to start gui without GTK (textmode) AND IMPROOVE
- \todo curl interface to Download cool stuff
-
- \todo widgets save themselves
- \todo good way to step through all the Widgets
- \todo label -> protected : getlabel function
-*/
-
-#ifndef _ORXONOX_GUI_H
-#define _ORXONOX_GUI_H
-
-#include <iostream>
-using namespace std;
-
-#include "orxonox_gui_gtk.h"
-
-#include <stdlib.h>
-
-//! Class that creates the OrxonoxGui
-class OrxonoxGui
-{
- public:
-  OrxonoxGui(int argc, char *argv[]);
-  ~OrxonoxGui(void);
-
-};
-
-#endif /* _ORXONOX_GUI_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_audio.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_audio.cc	(revision 3921)
+++ 	(revision )
@@ -1,72 +1,0 @@
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
-
-
-   ### File Specific:
-   main-programmer: Benjamin Grauer
-
-*/
-
-#include "orxonox_gui_audio.h"
-
-/**
-   \brief Creates an Audio-Frame
-*/
-OrxonoxGuiAudio::OrxonoxGuiAudio(void)
-{
-  this->audioFrame = new Frame("Audio-Options:");
-  this->audioBox = new Box('v');
-  this->audioFrame->setGroupName("audio");
-  
-  this->enableSound = new CheckButton("Disable Sound");
-  this->enableSound->setFlagName ("no-sound", 0);
-  this->enableSound->saveability();
-  this->audioBox->fill(this->enableSound);
-  Label* musicVolumeLabel = new Label("Music Volume");
-  this->audioBox->fill(musicVolumeLabel);
-  this->musicVolume = new Slider("Music Volume", 0, 100);
-  this->musicVolume->setFlagName("music-volume", "m", 80);
-  this->musicVolume->saveability();
-  this->audioBox->fill (this->musicVolume);
-  Label* effectsVolumeLabel = new Label ("Effects Volume");
-  this->audioBox->fill (effectsVolumeLabel);
-  this->effectsVolume = new Slider ("Effects Volume", 0, 100);
-  this->effectsVolume->setFlagName ("effects-volume", "e", 80);
-  this->effectsVolume->saveability();
-  this->audioBox->fill (this->effectsVolume);
-
-  this->audioFrame->fill (this->audioBox);
-}
-
-/** 
-    \brief Destructs the Audio-Stuff
-*/
-OrxonoxGuiAudio::~OrxonoxGuiAudio(void)
-{
-  // nothing to do here.
-}
-
-/**
-   \brief Return the Frame
-   \return Returns the Audio-frame
-*/
-Widget* OrxonoxGuiAudio::getWidget(void)
-{
-  return this->audioFrame;
-}
Index: orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_audio.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_audio.h	(revision 3921)
+++ 	(revision )
@@ -1,26 +1,0 @@
-/*!
-  \file orxonox_gui_audio.h
-  \brief File that holds the class that creates the Audio-Options.
-*/
-
-#ifndef _ORXONOX_GUI_AUDIO_H
-#define _ORXONOX_GUI_AUDIO_H
-
-#include "orxonox_gui.h"
-
-//! Class that creates the Audio-Options.
-class OrxonoxGuiAudio
-{
- private:
-  Frame* audioFrame;        //!< The Frame that holds the audio Options.
-  Box* audioBox;            //!< The Box that holds the audio Options.
-  CheckButton* enableSound; //!< A Ckeckbutton for enabling Sound.
-  Slider* musicVolume;      //!< A Slider for music volume.
-  Slider* effectsVolume;    //!< A Slider for effects volume.
- public:
-  OrxonoxGuiAudio(void);
-  ~OrxonoxGuiAudio(void);
-  
-  Widget* getWidget(void);
-};
-#endif /* _ORXONOX_GUI_AUDIO_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_banner.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_banner.cc	(revision 3921)
+++ 	(revision )
@@ -1,81 +1,0 @@
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
-
-
-   ### File Specific:
-   main-programmer: Benjamin Grauer
-
-*/
-
-#include "orxonox_gui_banner.h"
-
-/**
-   \brief Creates a new BannerEventBox and its content.
-*/
-OrxonoxGuiBanner::OrxonoxGuiBanner(void)
-{
-  // Banner Itself //
-  this->bannerEventBox = new EventBox("BannerEventBox");
-  this->bannerImage = new Image("banner.xpm");
-  this->bannerEventBox->fill(this->bannerImage);
-
-  // Banner Window //
-  this->logoWindow = new Window("Logo");
-
-#ifdef HAVE_GTK2
-  this->bannerEventBox->connectSignal("button_press_event", this->logoWindow, Window::windowOpen);
-
-  this->logoWindow->connectSignal("destroy", this->logoWindow, Window::windowClose);
-  this->logoWindow->connectSignal("delete_event", this->logoWindow, Window::windowClose);
-#endif /* HAVE_GTK2 */
-  this->logoEventBox = new EventBox();
-  this->logoBox = new Box('v');
-  this->logoLabel = new Label("OrxOnoX, Version: " PACKAGE_VERSION);
-  this->logoImage = new Image("banner.xpm");
-  this->logoEventBox->fill(this->logoImage);
-  
-  this->logoBox->fill(this->logoLabel);
-  this->logoBox->fill(this->logoEventBox);
-#ifdef HAVE_GTK2
-  this->logoEventBox->connectSignal("button_press_event", this->logoWindow, Window::windowClose);
-#endif /* HAVE_GTK2 */
-
-  this->logoWindow->fill(this->logoBox);
-  
-  Window::addWindow(this->logoWindow);
-}
-
-/**
-   \brief Destructs it.
-*/
-OrxonoxGuiBanner::~OrxonoxGuiBanner(void)
-{
-  // nothing to do here
-}
-
-/**
-   \brief Returns an EventBox
-   \return The EventBox, that holds the Banner.
-*/
-Widget* OrxonoxGuiBanner::getWidget(void)
-{
-  return this->bannerEventBox;
-}
-
-
Index: orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_banner.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_banner.h	(revision 3921)
+++ 	(revision )
@@ -1,39 +1,0 @@
-/*!
-  \file orxonox_gui_banner.h
-  \brief  File that holds the class that creates the Banner-Image.\n
-  This is Commercial :-)
-*/
-
-#ifndef _ORXONOX_GUI_BANNER_H
-#define _ORXONOX_GUI_BANNER_H
-
-#include "orxonox_gui.h"
-
-//! Class that creates the Banner-Image
-class OrxonoxGuiBanner
-{
- private:
-  // the banner Frame
-  Frame* bannerFrame;       //!< The frame that holds the Banner.
-  Box* bannerBox;           //!< The box that holds the Banner.
-  EventBox* bannerEventBox; //!< an Image needs an EventBox to catch klicks.
-  Image* bannerImage;       //!< The Image for the Banner.
-  Label* bannerLabel;       //!< The Label of the Banner.
-
-  // the logo Window
-  Window* logoWindow;       //!< The Window that holds the Orxonox-CrewLogo.
-  EventBox* logoEventBox;   //!< The EventBox that holds the Orxonox-CrewLogo. it has to be an eventbox, because Images can not receive clicks.
-  Box* logoBox;             //!< The Box that holds the Orxonox-CrewLogo
-  Image* logoImage;         //!< The Orxonox-CrewLogo-Image
-  Label* logoLabel;         //!< The Label for the Orxonox-CrewLogo
-
- public:
-  OrxonoxGuiBanner(void);
-  ~OrxonoxGuiBanner(void);
-
-  Widget* getWidget(void);
-
-};
-
-
-#endif /* _ORXONOX_GUI_BANNER_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_exec.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_exec.cc	(revision 3921)
+++ 	(revision )
@@ -1,418 +1,0 @@
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
-
-
-   ### File Specific:
-   main-programmer: Benjamin Grauer
-
-*/
-
-#include "orxonox_gui_exec.h"
-
-#include <iostream>
-#include <string>
-
-#include <sys/stat.h>
-#include <sys/types.h>
-
-
-HashTable* orxonoxFlagHash;
-
-/** 
-    \brief Creates the Exec-Frame
-*/
-OrxonoxGuiExec::OrxonoxGuiExec(void)
-{
-  configFile =(char*)malloc(512*sizeof(char));
-
-  this->execFrame = new Frame("Execute-Tags:");
-  this->execBox = new Box('v');
-  this->execFrame->setGroupName("misc");
-  
-  this->start = new Button("Start");
-#ifdef HAVE_GTK2
-  this->start->connectSignal("clicked", this, startOrxonox);
-#endif /* HAVE_GTK2 */
-  this->execBox->fill(start);
-  this->saveSettings = new CheckButton("Save Settings");
-  this->saveSettings->value = 1;
-  this->saveSettings->saveability();
-  this->execBox->fill(this->saveSettings);
-  this->verboseMode = new Menu("verbose mode", "nothing", "error", "warning", "info", "lastItem");
-  this->verboseMode->setFlagName("verbose", "v", 0);
-  this->verboseMode->saveability();
-  this->execBox->fill(this->verboseMode);
-  this->alwaysShow = new CheckButton("Always Show this Menu");
-  this->alwaysShow->setFlagName("gui", "g", 0);
-  this->alwaysShow->saveability();
-  this->execBox->fill(this->alwaysShow);
-  this->quit = new Button("Quit");
-#ifdef HAVE_GTK2
-  this->quit->connectSignal("clicked", this, OrxonoxGuiExec::quitOrxonox);
-  //  Window::mainWindow->connectSignal("remove", this, OrxonoxGuiExec::quitOrxonox);
-  Window::mainWindow->connectSignal("destroy", this, OrxonoxGuiExec::quitOrxonox);
-#endif /* HAVE_GTK2 */
-  this->execBox->fill(this->quit);
-
-  this->execFrame->fill(this->execBox);
-}
-
-/**
-   \brief Destructs the Execution-stuff
-*/
-OrxonoxGuiExec::~OrxonoxGuiExec(void)
-{
-  if(this->configFile)
-    delete []this->configFile;
-}
-
-/**
-   \brief Return the Frame
-   \return Returns the Exec-frame
-*/
-Widget* OrxonoxGuiExec::getWidget(void)
-{
-  return execFrame;
-}
-
-/* FILE HANDLING */
-
-/**
-   \brief sets the confDir and File-name out of an input-string
-*/
-void OrxonoxGuiExec::setConfFile(char* confFile)
-{
-  char splitter = 
-#ifdef __WIN32__ 
-    '\\';
-#else
-  '/';
-#endif
-  char* tmpConfFile = new char[strlen(confFile)+1];
-  strcpy(tmpConfFile, confFile);
-  char* tmp = strrchr(tmpConfFile, splitter);
-  if (tmp)
-    {
-      tmp[0] = '\0';
-      this->setConfDir(tmpConfFile);
-      this->setFileName(tmp+1);
-    }
-  else
-    {
-      this->setConfDir("~/");
-      this->setFileName(tmpConfFile);
-    }
-  delete []tmp;
-  delete []tmpConfFile;
-}
-
-/**
-   \brief sets the Directory of the configuration files
-   \param confDir the Directory for the configuration files
-*/
-void OrxonoxGuiExec::setConfDir(char* confDir)
-{
-  if (!strncmp(confDir, "~/", 2))
-    {
-      char tmp[500];
-#ifdef __WIN32__
-      strcpy(tmp, getenv("USERPROFILE"));
-#else
-      strcpy(tmp, getenv("HOME"));
-#endif
-      this->confDir = new char[strlen(tmp)+strlen(confDir)];
-      sprintf(this->confDir, "%s%s", tmp, confDir+1);
-    }
-  else
-    {
-      this->confDir = new char[strlen(confDir)+1];
-      strcpy(this->confDir, confDir);
-    }
-  PRINTF(3)("Config Directory is: %s.\n", this->confDir);
-  mkdir(this->confDir, 0755);
-}
-
-/**
-   \brief Sets the location of the configuration File.
-   \param fileName the location of the configFile
-
-   \todo: memory allocation could be better.
-
-   The name will be parsed from ~/ to /home/[username] on unix and c:/Documents and Settings/username/Settings/ on Windows
-*/
-void OrxonoxGuiExec::setFileName(char* fileName)
-{
-  if (!this->confDir)
-    this->setConfDir("~/");
-  this->configFile = new char[strlen(this->confDir)+strlen(fileName)+2];
-  sprintf(this->configFile, "%s/%s", this->confDir, fileName);
-  PRINTF(3)("ConfigurationFile is %s.\n", this->configFile);
-}
-
-/**
-   \returns The name of the Configuration-File
-*/
-char* OrxonoxGuiExec::getConfigFile(void) const
-{
-  return this->configFile;
-}
-
-/**
-   \brief checks if a option should be saved.
-   \return 1 if it should 0 if not/
-*/
-int OrxonoxGuiExec::shouldsave()
-{
-  return(static_cast<Option*>(this->saveSettings)->value);
-}
-
-/** 
-    \brief Saves the configuration-file to the Disk.\n
-    \param widget from which Widget on should be saved.
-
-    this Function only opens and closes the file, in between OrxonoxGuiExec::writeFileText(Widget* widget) will execute the real writing process.
-*/
-void OrxonoxGuiExec::writeToFile(Widget* widget)
-{
-  this->CONFIG_FILE = fopen(configFile, "w");
-  if(this->CONFIG_FILE)
-    this->writeFileText(widget, 0);
-  fclose(this->CONFIG_FILE);
-}
-
-/**
-   \brief Actually writes into the configuration file to the disk.
-   \param widget from which Widget on should be saved.
-   \param depth initially "0", and grows higher, while new Groups are bundeled.
-*/
-void OrxonoxGuiExec::writeFileText(Widget* widget, int depth)
-{
-  int counter = 0;
-  while(counter < depth &&((widget->isOption>0
-			      &&(static_cast<Option*>(widget)->isSaveable()))
-			     ||(widget->isOption<0
-				&& static_cast<Packer*>(widget)->getGroupName())))
-    {
-      fprintf(this->CONFIG_FILE, "  ", depth);
-      counter++;
-    }
-  
-  // check if it is a Packer, and if it is, check if it has a name and if there is something in it.
-  if(widget->isOption <0)
-    {
-      if(static_cast<Packer*>(widget)->getGroupName())
-	{
-	  fprintf(CONFIG_FILE, "[%s]\n", static_cast<Packer*>(widget)->getGroupName());
-	  this->writeFileText(static_cast<Packer*>(widget)->down, depth+1);
-	  fprintf(CONFIG_FILE, "\n");
-	}
-      else
-	{
-	  this->writeFileText(static_cast<Packer*>(widget)->down, depth);
-	}
-    } 
-  //  if(widget->isOption == 0)
-  //    printf("%s\n",widget->title);
-  if(widget->isOption >= 1)
-    if (static_cast<Option*>(widget)->isSaveable())
-      {
-	char Buffer[256];
-	char* space2under;
-	strcpy(Buffer, static_cast<Option*>(widget)->title);
-	if(strchr(Buffer, '_'))
-	  cout << "Warning Optionname" << Buffer << " is not Valid for Saving, because it includes an underscore" << endl;
-	while(space2under = strchr(Buffer, ' '))
-	  {
-	    space2under[0] = '_';
-	  }
-	  fprintf(CONFIG_FILE, "%s = %s\n", Buffer, static_cast<Option*>(widget)->save());
-      }
-
-  if(widget->next != NULL)
-    this->writeFileText(widget->next, depth);
-}
-
-/**
-   \brief Reads in Configuration Data.
-   \param widget from which Widget on should be saved.
-*/
-void OrxonoxGuiExec::readFromFile(Widget* widget)
-{
-  this->CONFIG_FILE = fopen(configFile, "r");
-  VarInfo varInfo;
-  if(this->CONFIG_FILE)
-    {
-      Widget* groupWidget = widget;
-      char Buffer[256] = "";
-      char Variable[256]= "";
-      char* Value;
-      while(fscanf(this->CONFIG_FILE, "%s", Buffer) != EOF)
-	{
-	  // group-search //
-	  if(!strncmp(Buffer, "[", 1))
-	    {
-	      if((groupWidget = locateGroup(widget, Buffer, 1))==NULL)
-		{
-		  cout << "!!There is no group called " << Buffer << " in this GUI.\n First best Widget will get the Infos assigned.\n Config-File will be updated in next Save\n";
-		  groupWidget = widget;
-		}
-	      else
-		PRINT(3)("Group %s located.\n", static_cast<Packer*>(groupWidget)->groupName);
-	    }
-	  // option-setting //
-	  if(!strcmp(Buffer, "="))
-	    {
-	      char* under2space;
-	      while(under2space = strchr(Variable, '_'))
-		{
-		  sprintf(under2space, " %s", under2space+1);
-		}
-	      
-	      fscanf(this->CONFIG_FILE, "%s", Buffer);
-	      varInfo.variableName = Variable;
-	      varInfo.variableValue = Buffer;
-	      groupWidget->walkThrough(this->readFileText, &varInfo, 0);
-	      sprintf(Variable, "");
-	    }
-	  sprintf(Variable, "%s", Buffer);
-	}
-      widget->walkThrough(widget->setOptions, 0);
-    }
-}
-
-/**
-   \brief Maps Confugurations to the Options.
-   \param widget which widget downwards
-   \param varInfo Information about the Variable to read
-*/
-void OrxonoxGuiExec::readFileText(Widget* widget, void* varInfo)
-{
-  VarInfo* info =(VarInfo*)varInfo;
-  if(widget->title && !strcmp(widget->title, info->variableName))
-    {
-      PRINT(3)("Located Option %s.\n", widget->title);
-      if(widget->isOption >= 1)
-	  static_cast<Option*>(widget)->load(info->variableValue);
-    }
-}
-
-/**
-   \brief Locates a Group.
-   \param widget The Widget from where to search from
-   \param groupName The GroupName for which to search.
-   \param depth The Depth of the search seen from the first widget we searched from.
-   \returns The Widget that holds the Group, or the NULL if the Group wasn't found.
-
-   \todo do this in gui-gtk.
-*/
-Widget* OrxonoxGuiExec::locateGroup(Widget* widget, char* groupName, int depth)
-{
-  Widget* tmp;
-
-  // removes the trailing and ending [ ].
-  if(!strncmp(groupName, "[", 1))
-    {
-      groupName = groupName+1;
-      groupName[strlen(groupName)-1] = '\0';
-    }
-
-  if(widget->isOption < 0)
-    {
-      if(static_cast<Packer*>(widget)->getGroupName() && !strcmp(groupName, static_cast<Packer*>(widget)->getGroupName()))
-	{
-	  return widget;
-	}
-      else
-	{
-	  if((tmp = locateGroup(static_cast<Packer*>(widget)->down, groupName, depth+1)) != NULL)
-	    return tmp;
-	}
-    } 
-  
-  if(widget->next != NULL && depth != 0)
-    {
-      if((tmp = locateGroup(widget->next, groupName, depth)) != NULL)
-	return tmp;
-    }
-  return NULL;
-}
-
-#ifdef HAVE_GTK2
-/**
-   \brief Starts ORXONOX.(not really implemented yet, but the function is there.\n
-   \param widget the widget that executed the start command
-   \param data additional data
-
-   This is a Signal and can be executed through Widget::signal_connect
-*/
-int OrxonoxGuiExec::startOrxonox(GtkWidget* widget, void* data)
-{
-  OrxonoxGuiExec* exec =(OrxonoxGuiExec*)data;
-  if(exec->shouldsave())
-    exec->writeToFile(Window::mainWindow);
-  cout << "Starting Orxonox" <<endl;
-  gtk_main_quit();
-  system("cd ..;./orxonox"); //!< \todo fix this. should execute orxonox for real(coded not over the shell)
-}
-
-/**
-   \brief Starts ORXONOX.(not really implemented yet, but the function is there.\n
-   \param widget the widget that executed the start command
-   \param data additional data
-
-   This is a Signal and can be executed through Widget::signal_connect
-*/
-int OrxonoxGuiExec::quitOrxonox(GtkWidget* widget, void* data)
-{
-  OrxonoxGuiExec* exec =(OrxonoxGuiExec*)data;
-  PRINT(3)( "Quitting Orxonox %p\n", exec);
-  if(exec->shouldsave())
-    exec->writeToFile(Window::mainWindow);
-  gtk_main_quit();
-}
-#else /* HAVE_GTK2 */
-/**
-   \brief Starts ORXONOX.(not really implemented yet, but the function is there.\n
-   \param widget the widget that executed the start command
-   \param data additional data
-*/
-int OrxonoxGuiExec::startOrxonox(void* widget, void* data)
-{
-  OrxonoxGuiExec* exec =(OrxonoxGuiExec*)data;
-  PRINT(3)("Starting Orxonox\n");
-  if(exec->shouldsave())
-    exec->writeToFile(Window::mainWindow);
-  system("cd ..;./orxonox"); //!< \todo fix this. should execute orxonox for real(coded not over the shell)
-}
-/**
-   \brief Quits ORXONOX.
-   \param widget the widget that executed the Quit command
-   \param data additional data
-
-   This is a Signal and can be executed through Widget::signal_connect
-*/
-int OrxonoxGuiExec::quitOrxonox(void* widget, void* data)
-{
-  OrxonoxGuiExec* exec =(OrxonoxGuiExec*)data;
-  PRINT(3)("Quiting Orxonox");
-  if(exec->shouldsave())
-    exec->writeToFile(Window::mainWindow);
-}
-
-#endif /* HAVE_GTK2 */
Index: orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_exec.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_exec.h	(revision 3921)
+++ 	(revision )
@@ -1,70 +1,0 @@
-/*!
-  \file orxonox_gui_exec.h
-  \brief File that holds the class that creates the execute-Options.
-*/
-
-#ifndef _ORXONOX_GUI_EXEC_H
-#define _ORXONOX_GUI_EXEC_H
-
-#include "orxonox_gui.h"
-#include <stdio.h>
-using namespace std;
-
-//! Class that creates the execute-Options.
-class OrxonoxGuiExec
-{
- private:
-  Frame* execFrame;            //!< The Frame that holds the ExecutionOptions.
-  Box* execBox;                //!< The Box that holds the ExecutionOptions.
-  Button* start;               //!< The start Button of orxonox.
-  CheckButton* saveSettings;   //!< A CheckBox for if the Options should be saved.
-  Menu* verboseMode;           //!< A Menu for setting the verbose-Mode. \todo setting up a verbose-class.
-  CheckButton* alwaysShow;     //!< A CheckButton, for if orxonox should start with or without gui.
-  Button* quit;                //!< A Button to quit the Gui without starting orxonox.
-  char* confDir;               //!< The directory of the orxonox-configuration-files.
-  char* configFile;            //!< The name of the .orxonox.conf(ig)-file.
-  FILE* CONFIG_FILE;           //!< Filehandler for reading and writing.
-  
-  //! A struct that holds informations about variables.
-  struct VarInfo
-  {
-    char* variableName;        //!< The Name of this variable;
-    char* variableValue;       //!< The Value this variable gets.
-  };
-
- public:
-  OrxonoxGuiExec(void);
-  ~OrxonoxGuiExec(void);
-  
-  Widget* getWidget(void);
-
-  void setConfFile(char* confFile);
-  void setConfDir(char* confDir);
-  void setFileName(char* fileName);
-  char* getConfigFile(void) const;
-  int shouldsave(void);
-  void writeToFile(Widget* widget);
-  void writeFileText(Widget* widget, int depth);
-  void readFromFile(Widget* widget);
-  static void readFileText(Widget* widget, void* varInfo);
-  Widget* locateGroup(Widget* widget, char* groupName, int depth);
-
-#ifdef HAVE_GTK2
-  static int startOrxonox(GtkWidget *widget, void* data);
-  static int quitOrxonox(GtkWidget *widget, void* data);
-#else /* HAVE_GTK2 */
-  static int startOrxonox(void* widget, void* data);
-  static int quitOrxonox(void* widget, void* data);
-#endif /* HAVE_GTK2 */
-};
-
-//! A simple hashtable 
-struct HashTable
-{
-  char* name;           //!< name of the entry
-  char* value;          //!< value of the entry
-  HashTable* next;      //!< pointer to the next entry
-};
-
-
-#endif /* _ORXONOX_GUI_EXEC_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_flags.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_flags.cc	(revision 3921)
+++ 	(revision )
@@ -1,106 +1,0 @@
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
-
-
-   ### File Specific:
-   main-programmer: Benjamin Grauer
-
-*/
-
-#include "orxonox_gui_flags.h"
-
-/**
-   \brief Creates the Flags-Frame
-*/
-OrxonoxGuiFlags::OrxonoxGuiFlags(void)
-{
-  this->flagsFrame = new Frame("Orxonox-Startup-Flags:");
-  this->flagsBox = new Box('v');
-
-  this->flagsLabel = new Label();
-  this->flagsLabel->setSize(260,60);
-  this->flagsBox->fill(flagsLabel);
-  this->shortFlags = new CheckButton("shortFlags");
-  this->flagsBox->fill(shortFlags);
-
-  this->flagsFrame->fill(flagsBox);
-}
-
-/**
-   \brief Destructs the Flags-stuff
-*/
-OrxonoxGuiFlags::~OrxonoxGuiFlags(void)
-{
-  // nothing to do here
-}
-
-/**
-   \brief Function to return the Frame that holds the Flagtext.
-   \returns Frame that holds the Flagtext.
-*/
-Widget* OrxonoxGuiFlags::getWidget(void)
-{
-  return this->flagsFrame;
-}
-
-/**
-   \brief Sets the Flags from widget downwards.
-   \param widget the Widget from which on to scan for deeper Options and their settings.
-*/
-void OrxonoxGuiFlags::setTextFromFlags(Widget* widget)
-{
-  FlagInfo flagInfo;
-  flagInfo.shortFlags = this->shortFlags;
-  flagInfo.flagsLabel = this->flagsLabel;
-
-  this->flagsLabel->ereaseText();
-  this->flagsLabel->appendText("orxonox");
-  widget->walkThrough(OrxonoxGuiFlags::flagsText, &flagInfo, 0);
-  //  flagsLabel->setTitle(flagText);
-}
-
-/** 
-    \brief this actually sets the flagtext, and appends it to flagText
-    \param widget like OrxonoxGuiFlags::setTextFromFlags(widget)
-    \param flagInfo Information aboout the Flag that should be updated.
-*/
-void OrxonoxGuiFlags::flagsText(Widget* widget, void* flagInfo)
-{
-  FlagInfo* info =(FlagInfo*)flagInfo;
-  if(widget->isOption >= 1)
-    if (static_cast<Option*>(widget)->value != static_cast<Option*>(widget)->defaultValue )
-      {
-	if(info->shortFlags->isActive() && static_cast<Option*>(widget)->flagNameShort)
-	  {
-	    info->flagsLabel->appendText(" -");
-	    info->flagsLabel->appendText(static_cast<Option*>(widget)->flagNameShort);
-	  }
-	else if(!info->shortFlags->isActive() && static_cast<Option*>(widget)->flagName)
-	  {
-	    info->flagsLabel->appendText(" --");
-	    info->flagsLabel->appendText(static_cast<Option*>(widget)->flagName);
-	  }
-
-	if(static_cast<Option*>(widget)->isOption == 2)
-	  {
-	    info->flagsLabel->appendText("=");
-	    info->flagsLabel->appendInt(static_cast<Option*>(widget)->value);
-	  }
-      }
-}
Index: orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_flags.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_flags.h	(revision 3921)
+++ 	(revision )
@@ -1,35 +1,0 @@
-/*!
-  \file orxonox_gui_flags.h
-  \brief File that holds the class that creates the flags-Text.
-*/
-
-#ifndef _ORXONOX_GUI_FLAGS_H
-#define _ORXONOX_GUI_FLAGS_H
-
-#include "orxonox_gui.h"
-
-//! Class that creates the flags-Text.
-class OrxonoxGuiFlags
-{
- private:
-  Frame* flagsFrame;          //!< The Frame that holds the flagsDisplay.
-  Box* flagsBox;              //!< The Box that holds the flagsDisplay.
-  CheckButton* shortFlags;    //!< CheckButton to change the display of short and long flags \todo show long if long not availible...
-  Label* flagsLabel;          //!< The Label of the Flags
-
- public:
-  OrxonoxGuiFlags(void);
-  ~OrxonoxGuiFlags(void);
-
-  void setTextFromFlags(Widget* widget);
-  static void flagsText(Widget* widget, void* flagInfo);
-  
-  //! Struct that handles flag information.
-  struct FlagInfo
-  {
-    CheckButton* shortFlags;     //!< Button for the flag.
-    Label* flagsLabel;           //!< Label for the flag.
-  };
-  Widget* getWidget(void);
-};
-#endif /* _ORXONOX_GUI_FLAGS_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_gtk.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_gtk.cc	(revision 3921)
+++ 	(revision )
@@ -1,1813 +1,0 @@
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
-
-
-   ### File Specific:
-   main-programmer: Benjamin Grauer
-
-*/
-
-
-#include "orxonox_gui_gtk.h"
-
-#include <stdarg.h>
-#include <iostream>
-
-
-using namespace std;
-
-// temporarily.
-#include "orxonox_gui_flags.h"
-extern Window* orxonoxGUI;
-extern OrxonoxGuiFlags* flags;
-
-/**
-   \brief Initializes the Guis GTK-stuff.
-   \param argc the argument count.
-   \param argv The Argument strings.
-*/
-bool initGUI(int argc, char *argv[])
-{
-#ifdef HAVE_GTK2
-#ifdef HAVE_GTHREAD
-  PRINTF(3)("Initializing the ThreadSystem of the GUI\n");
-  g_thread_init(NULL);
-  gdk_threads_init();
-#endif /* HAVE_GTHREAD */
-  gtk_init(&argc, &argv);
-  gtk_rc_parse( "rc" );
-#endif /* HAVE_GTK2 */
-}
-
-
-/**
-   \brief enters the GUI's main-loop
-*/
-bool mainloopGUI(void)
-{
-#ifdef HAVE_GTK2
-  gdk_threads_enter();
-  gtk_main();
-  gdk_threads_leave();
-  delete Window::mainWindow;
-#else /* HAVE_GTK2 */
-  char boolAns = 'y';
-  char ans[10];
-  PRINT(0)("================================\n");
-  PRINT(0)("= ORXONOX CONFIGURATION WIZARD =\n");
-  PRINT(0)("================================    - version:" PACKAGE_VERSION "\n");
-
-  while(true)
-    {
-      PRINT(0)("\n Listing all the Orxonox Options: \n");
-      PRINT(0)("  #############################\n");
-      Window::mainWindow->walkThrough(Widget::listOptionsAndGroups, 1);
-      
-      PRINT(0)("\nDo you want change any of the above values now? [Yn] ");
-      cin >>boolAns ;
-      if (boolAns =='n' || boolAns=='N')
-	break;
-      
-      PRINT(0)("\n Listing all groups\n");
-      PRINT(0)("  #################\n");
-      int groupCount = 0;
-      Window::mainWindow->walkThrough(Widget::listGroups, &groupCount, 1);
-      
-      PRINT(0)("\nIn which Group? [1-%d] ", groupCount);
-      Packer* group;
-      while(true)
-	{
-	  cin >> ans;
-	  int ansIp = atoi(ans);
-	  if (ansIp <= groupCount)
-	    {
-	      group = static_cast<Packer*>(Window::mainWindow->findGroupByNumber(&ansIp, 1));
-	      break;
-	    }
-	  else
-	    PRINT(0)("\nChoose a smaler Number please: [1-%d] ", groupCount);
-	}
-      PRINT(0)("\n\nGroup: [%s]\n\n", group->groupName);
-      int optionCount = 0;
-      group->walkThrough(Widget::listOptions, &optionCount, 0);
-      PRINT(0)("\nWhich Option? [1-%d] ", optionCount);
-      Option* option;
-      while(true)
-	{
-	  cin >> ans;
-	  int ansIp = atoi(ans);
-	  if (ansIp <= groupCount)
-	    {
-	      option = static_cast<Option*>(group->findOptionByNumber(&ansIp, 0));
-	      break;
-	    }
-	  else
-	    PRINT(0)("\nChoose a smaler Number please: [1-%d] ", optionCount);
-	}
-      PRINT(0)("\n\n:: %s ::\n", option->title);
-      option->changeOption();
-      
-      // here follows the rest.... this will be nasty.
-      //! \todo move this into the gui-gtk-file
-      //! \todo finish it.
-      //! \todo memory leek at save(); and save is a BAD word, use saveString instead, or something like it.
-    }
-#endif /* HAVE_GTK2 */
-  
-}
-
-
-//////////////////////////////
-/// DEFINING WIDGET-CLASES ///
-//////////////////////////////
-
-/* WIDGET */
-/**
-   \brief constructs a Widget
-*/
-Widget::Widget(void)
-{
-  next = NULL;
-  this->title = NULL;
-  return;
-}
-
-/**
-   \brief deletes any given Widget
-   This is still pretty crappy.
-*/
-Widget::~Widget(void)
-{
-    if (this->title)
-    {
-      delete []this->title;
-    }
-  
-  PRINTF(4)("deleting the Widget part.\n");
-
-  PRINTF(4)("deleting recursively\n");
-
-  // deleting next item if existent
-  if (this->next)
-    delete this->next;
-  this->next = NULL;
-  //!  \todo not hiding widget, deleting.
-  //  this->hide();
-  //  delete this->widget;
-}
-
-/**
-   \brief sets a new Title to a Widget
-   \param title The new Title to set to the Widget
-*/
-void Widget::setTitle(const char* title)
-{
-  if (this->title)
-    delete []this->title;
-  this->title = new char[strlen(title)+1];
-  strcpy(this->title, title);
-}
-
-/**
-   \brief makes the widget visible.
-*/
-void Widget::show(void)
-{
-#ifdef HAVE_GTK2
-  gtk_widget_show(this->widget);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief hides the widget.
-*/
-void Widget::hide(void)
-{
-#ifdef HAVE_GTK2
-  gtk_widget_hide(this->widget);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief Sets the resolution of a specific widget to the given size.
-   \param width the width of the widget to set.
-   \param height the height of the widget to set.
-*/
-void Widget::setSize(int width, int height)
-{
-#ifdef HAVE_GTK2
-  gtk_widget_set_usize(this->widget, width, height);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief searches through widgets for a Name.
-*/
-Widget* Widget::findWidgetByName(char* name, unsigned int depth)
-{
-
-  if (this->title && !strcmp(this->title, name))
-    return this;
-
-  if (this->isOption < 0 && static_cast<Packer*>(this)->down)
-    {
-      Widget* tmp = static_cast<Packer*>(this)->down->findWidgetByName(name, depth+1);
-      if (tmp)
-	return tmp;
-    }
-  
-  if (depth>0 && this->next)
-    return this->next->findWidgetByName(name, depth);
-
-  return NULL;
-}
-
-/**
-   \brief Moves through all the Widgets downwards from this and executes the function on them.
-   \param function must be of type void and takes a Widget* as an Input. 
-   \param depth the current depth. if > 0 then the next Widget will also be walked through.
-*/
-void Widget::walkThrough(void(*function)(Widget*), unsigned int depth)
-{
-  function(this);
-  if (this->isOption < 0)
-    {
-      static_cast<Packer*>(this)->down->walkThrough(function, depth+1);
-    } 
-
-  if (this->next && depth != 0)
-    this->next->walkThrough(function, depth);
-}
-
-/**
-   \brief Moves through all the Widgets downwards from this and executes the function on them.
-   \param function must be of type void and takes a Widget* as an Input.
-   \param data Additional Data you want to pass to the function.
-   \param depth the current depth. if > 0 then the next Widget will also be walked through.
-*/
-void Widget::walkThrough(void(*function)(Widget*, void*), void* data, unsigned int depth)
-{
-  function(this, data);
-  if (this->isOption < 0)
-    {
-      static_cast<Packer*>(this)->down->walkThrough(function, data, depth+1);
-    }
-  if (this->next && depth != 0)
-    this->next->walkThrough(function, data, depth);
-}
-
-/** 
-    \brief This is for listing the options of "widget"
-    \param widget specifies the widget that should be listed
-*/
-void Widget::listOptionsAndGroups(Widget* widget)
-{
-  if (widget->isOption < 0 && static_cast<Packer*>(widget)->groupName)
-    PRINT(0)("[%s]\n", static_cast<Packer*>(widget)->groupName);
-  if (widget->isOption >= 1)
-    {
-      Widget::listOptions(widget);
-    }
-}
-
-/** 
-    \brief This is for listing the options of "widget"
-    \param widget specifies the widget that should be listed
-*/
-void Widget::listOptions(Widget* widget)
-{
-  if(widget->isOption >= 1)
-    PRINT(0)("  %s is %s\n", static_cast<Option*>(widget)->title, static_cast<Option*>(widget)->save());
-}
-
-/** 
-    \brief This is for listing the options of "widget"
-    \param widget specifies the widget that should be listed
-    \param data A Counter, that always knows how many Options have been found yet.
-*/
-void Widget::listOptions(Widget* widget, void* data)
-{
-  
-  if (widget->isOption >= 1)
-    {
-      int* count =(int*)data;
-      *count = *count +1;
-      PRINT(0)(" %d:%s is %s\n", *count, static_cast<Option*>(widget)->title, static_cast<Option*>(widget)->save());
-    }
-}
-
-/** 
-    \brief Finds an Option by a given number(the n'th option found away from this Widget)
-    \param number The Count of options to wait(by reference)
-    \param depth The depth of the sarch. if 0 it will not search next pointer
-    
-    \todo should return Option* would be much sexier.
-*/
-Widget* Widget::findOptionByNumber(int* number, unsigned int depth)
-{
-  if (isOption > 0)
-    {
-      --*number;
-      if (*number <= 0)
-	{
-	  return this;
-	}
-    }
-  if (this->isOption < 0 && static_cast<Packer*>(this)->down)
-    {
-      Widget* tmp = static_cast<Packer*>(this)->down->findOptionByNumber(number, depth+1);
-      if (tmp)
-	return tmp;
-    }
-  if (depth>0 && this->next)
-    return this->next->findOptionByNumber(number, depth);
-
-  return NULL;
-}
-
-/** 
-    \brief This is for listing the groups of "widget"
-    \param widget specifies the widget that should be listed
-*/
-void Widget::listGroups(Widget* widget)
-{
-  if (widget->isOption < 0 && static_cast<Packer*>(widget)->groupName)
-    cout << "[" << static_cast<Packer*>(widget)->groupName << "]\n";
-}
-
-/** 
-    \brief This is for listing the Groups of "widget". It also displays the n'th number found.
-    \param widget specifies the widget that should be listed
-    \param data the Counter, that will show the number(this function will raise it by one if a Group is fount.
-*/
-void Widget::listGroups(Widget* widget, void* data)
-{
-  if (widget->isOption < 0 && static_cast<Packer*>(widget)->groupName)
-    {
-      int* count =(int*)data;
-      *count = *count +1;
-      cout << *count <<": [" << static_cast<Packer*>(widget)->groupName << "]\n";
-    }
-}
-
-/** 
-    \brief Finds a Group by a given number(the n'th Group found away from this Widget)
-    \param number The Count of options to wait(by reference)
-    \param depth The depth of the sarch. if 0 it will not search next pointer
-*/
-Widget* Widget::findGroupByNumber(int* number, unsigned int depth)
-{
-  if (isOption < 0 && static_cast<Packer*>(this)->groupName)
-    {
-      --*number;
-      if (*number <= 0)
-	{
-	  return this;
-	}
-    }
-  if (this->isOption < 0 && static_cast<Packer*>(this)->down)
-    {
-      Widget* tmp = static_cast<Packer*>(this)->down->findGroupByNumber(number, depth+1);
-      if (tmp)
-	return tmp;
-    }
-  if (depth>0 && this->next)
-    return this->next->findGroupByNumber(number, depth);
-
-  return NULL;
-}
- 
-/** 
-    \brief This is for setting the option of "widget"
-    \param widget specifies the widget that should be set.
-*/
-void Widget::setOptions(Widget* widget)
-{
-  if (widget->isOption >= 1)
-    static_cast<Option*>(widget)->redraw();
-}
-
-/**
-   \brief Walks through all the Flags given at startuptime.
-*/
-void Widget::flagCheck(Widget* widget, void* flagName)
-{
-  if (widget->isOption>=1)
-    {      
-      Option* option =(Option*)widget;
-      char* name =(char*)flagName;
-      char* value = NULL;
-      bool found = false;
-      // check if long flag matches
-      if ((option->flagName && strlen(name)>2 && !strncmp(name+2, option->flagName, strlen(option->flagName)) &&(name[strlen(option->flagName)+2] == '\0' || name[strlen(option->flagName)+2] == '=') ))
-	{
-	  found = true;
-	  if (name[strlen(option->flagName)+2] == '=')
-	    {
-	      value = name+strlen(option->flagName)+3;
-	    }
-	}
-      else if (option->flagNameShort && strlen(name)>1 && !strncmp(name+1, option->flagNameShort, strlen(option->flagNameShort))&&(name[strlen(option->flagNameShort)+1] == '\0' || name[strlen(option->flagNameShort)+1] == '=')) // check if short flag matches
-	{
-	  found = true;
-	  if (name[strlen(option->flagNameShort)+1] == '=')
-	    {
-	      value = name+strlen(option->flagNameShort)+2;
-	    }	  
-	}
-
-      if (found)
-	{
-	  PRINT(3)("found matching Flag %s\n", name);
-	  if (value)
-	    {
-	      PRINT(3)("with Value %s\n", value);
-	      option->value = atoi(value);
-	    }
-	  else
-	    {
-	      option->value = !option->defaultValue;
-	    }
-	  option->redraw();
-	}
-
-    }
-}
-
-#ifdef HAVE_GTK2
-/** 
-    \brief Connect any signal to any given Sub-widget
-*/
-gulong Widget::connectSignal(char* event, gint(*signal)(GtkWidget*, GdkEvent*, void *))
-{
-  return g_signal_connect(G_OBJECT(this->widget), event, G_CALLBACK(signal), NULL);
-}
-
-/**
-   \brief Connect a signal with additionally passing the whole Object
-*/
-gulong Widget::connectSignal(char* event, gint(*signal)( GtkWidget*, Widget *))
-{
-  return g_signal_connect(G_OBJECT(this->widget), event, G_CALLBACK(signal), this);
-}
-
-/**
-   \brief Connect a signal with additionally passing a whole external Object
-*/
-gulong Widget::connectSignal(char* event, void* extObj, gint(*signal)(GtkWidget*, GdkEvent*, void *))
-{
-  return g_signal_connect(G_OBJECT(this->widget), event, G_CALLBACK(signal), extObj);
-}
-
-/**
-   \brief Connect a signal with additionally passing a whole external Object
-*/
-gulong Widget::connectSignal(char* event, void* extObj, gint(*signal)(GtkWidget*, void *))
-{
-  return g_signal_connect(G_OBJECT(this->widget), event, G_CALLBACK(signal), extObj);
-}
-
-/**
-   \brief Connect a signal with additionally passing a whole external Object
-*/
-gulong Widget::connectSignal(char* event, void* extObj, gint(*signal)(GtkWidget*, GdkEventKey*, void *))
-{
-  return g_signal_connect(G_OBJECT(this->widget), event, G_CALLBACK(signal), extObj);
-}
-
-void Widget::disconnectSignal(gulong signalID)
-{
-  g_signal_handler_disconnect(G_OBJECT(this->widget), signalID);
-}
-
-/**
-   \brief Signal that does absolutely nothing
-   \param widget The widget that initiated the Signal
-   \param event The event-type.
-   \param nothing nothin.
-*/
-gint Widget::doNothingSignal(GtkWidget *widget, GdkEvent* event, void* nothing)
-{
-}
-#endif /* HAVE_GTK2 */
-
-//void deleteWidget(Widget* lastWidget)
-
-
-/* PACKERS */
-/**
-   \brief Constructs a Packer
-*/
-Packer::Packer(void)
-{
-  this->down = NULL;
-  this->groupName = NULL;
-}
-
-/**
-   \brief Destroys a Packer.
-*/
-Packer::~Packer(void)
-{ 
-  PRINTF(4)("deleting the Packer part.\n");
-  
-  if (this->groupName)
-    delete []this->groupName;
-
-  //deleting recursively.
-  if (this->down)
-    delete this->down;
-  this->down = NULL;
-}
-
-/**
-   \brief Sets the group name under which all the lower widgets of this will be saved.
-   \param name The name of the group.
-*/
-void Packer::setGroupName(char* name)
-{
-  if (this->groupName)
-    delete []this->groupName;
-  this->groupName = new char[strlen(name)+1];
-  strcpy(this->groupName, name);
-}
-
-/**
-   \brief Retrieves the group name under which all the lower widgets of this will be saved.
-   \returns name The name of the group.
-*/
-char* Packer::getGroupName(void)
-{
-  return this->groupName;
-}
-
-/* CONTAINERS */
-
-/**
-   \brief Initializes a Container.
-
-   sets the Container-Specific defaults.
-*/
-Container::Container(void)
-{
-  this->isOption = -1;
-}
-
-/**
-   \brief Destroys a Container.
-*/
-Container::~Container(void)
-{ 
-  PRINTF(4)("deleting the Container part.\n");
-}
-
-/**
-   \briefFills a Container with lowerWidget.
-   \param lowerWidget the Widget that should be filled into the Container.
-
-   It does this by filling up the down pointer only if down points to NULL.
-*/
-void Container::fill(Widget *lowerWidget)
-{
-  if (this->down == NULL)
-    {
-#ifdef HAVE_GTK2
-      gtk_container_add(GTK_CONTAINER(this->widget), lowerWidget->widget);
-#endif /* HAVE_GTK2 */
-      this->down = lowerWidget;
-    }
-  else
-    PRINTF(1)("!!error!! You try to put more than one Widget into a Container. \nNot including this item.\nThis is only possible with Boxes.\n");
-}
-
-// gtk_container_set_border_width(GTK_CONTAINER(widget), 5);
-
-/* WINDOW */
-
-Window* Window::mainWindow = NULL;
-
-/**
-   \brief Adds a new Window Windows to the List of Windows.
-   \param windowToAdd The Windows that should be added to the List
-   \todo this instead of windowToAdd(possibly)
-*/
-void Window::addWindow(Window* windowToAdd)
-{
-  if (!mainWindow)
-    {
-      mainWindow = windowToAdd;
-      return;
-    }
-
-  Widget* tmpWindow = mainWindow;
-  while(tmpWindow->next)
-    tmpWindow = tmpWindow->next;
-  tmpWindow->next = windowToAdd;
-  
-  return;
-}
-      
-
-/**
-   \brief Creating a new Window without a Name
-*/
-Window::Window(void)
-{
-  this->init();
-}
-
-/**
-   \brief Creating a Window with a name
-   \param windowName the name the window should get.
-*/
-
-Window::Window(char* windowName)
-{
-  this->init();
-  this->setTitle(windowName);
-}
-
-/**
-   \brief Destructs a Window.
-*/
-Window::~Window(void)
-{
-  if (this->title)
-    PRINTF(3)("deleting the Window: %s\n", this->title);
-  else 
-    PRINTF(3)("deleting the Window.\n");
-  //  this->hide();
-}
-
-/**
-   \brief initializes a new Window
-*/
-void Window::init(void)
-{
-  if (!mainWindow)
-    mainWindow = this;
-  
-  isOpen = false;
-
-#ifdef HAVE_GTK2
-  widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_policy(GTK_WINDOW(widget), TRUE, TRUE, TRUE);
-#if !defined(__WIN32__)
-  //  gtk_window_set_decorated(GTK_WINDOW(widget), FALSE);
-#endif 
-  gtk_container_set_border_width(GTK_CONTAINER(widget), 3);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief Shows all Widgets that are included within this->widget.
-*/
-void Window::showall(void)
-{
-  if (!this->isOpen)
-    {
-      //      printf("showall\n");
-#ifdef HAVE_GTK2
-      gtk_widget_show_all(this->widget);
-#endif /* HAVE_GTK2 */ 
-     this->isOpen = true;
-    }
-  else
-    {
-      //      printf("showone\n");
-#ifdef HAVE_GTK2
-      gtk_widget_show(this->widget);
-#endif /* HAVE_GTK2 */
-    }
-}
-
-/**
-   \brief Set The Window-title to title
-   \param title title the Window should get.
-*/
-void Window::setTitle(const char* title)
-{
-  if (this->title)
-    delete []this->title;
-  this->title = new char[strlen(title)+1];
-  strcpy(this->title, title);
-#ifdef HAVE_GTK2
-  gtk_window_set_title(GTK_WINDOW(widget), title);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief opens up a Window and fixes the Focus to it
-*/
-void Window::open(void)
-{
-  if (this != mainWindow)
-    {
-      isOpen = true;
-#ifdef HAVE_GTK2
-      gtk_widget_show_all(this->widget);
-      gtk_grab_add(this->widget);
-#endif /* HAVE_GTK2 */
-    }
-}
-
-/**
-   \brief closes up a Window and removes the Focus from it
-*/
-void Window::close(void)
-{
-  if (this != mainWindow)
-    {
-      this->isOpen = false;
-#ifdef HAVE_GTK2
-      gtk_grab_remove(this->widget);
-      gtk_widget_hide(this->widget);
-#endif /* HAVE_GTK2 */
-    }
-}
-
-#ifdef HAVE_GTK2
-/**
-   \brief opens up a window(not topmost Window).
-   this is the Signal that does it. !!SIGNALS ARE STATIC!!
-   \param widget the widget that did it.
-   \param event the event that did it.
-   \param window the Window that should be opened
-*/
-gint Window::windowOpen(GtkWidget *widget, GdkEvent* event, void* window)
-{
-  static_cast<Window*>(window)->open();
-}
-
-/**
-   \brief closes a window(not topmost Window).
-   this is the Signal that does it. !!SIGNALS ARE STATIC!!
-   \param widget the widget that did it!
-   \param event the event that did it!
-   \param window the Window that should be closed
-*/
-gint Window::windowClose(GtkWidget *widget, GdkEvent* event, void* window)
-{
-  static_cast<Window*>(window)->close();
-}
-
-#endif /* HAVE_GTK2 */
-
-
-/* FRAME */
-
-/** 
-    \brief Creates a new Frame without a name
-*/
-Frame::Frame(void)
-{
-  this->init();
-}
-
-/**
-   \brief Creates a new Frame with name title
-*/
-Frame::Frame(char* title)
-{
-  this->init();
-  this->setTitle(title);
-}
-
-/**
-   \brief destrcucts a Frame
-*/
-Frame::~Frame(void)
-{
-  if (this->title)
-    PRINTF(3)("deleting the Frame: %s\n", this->title);
-  else 
-    PRINTF(3)("deleting the Frame.\n");
-}
-
-/** 
-    \brief Initializes a new Frame with default settings
-*/
-void Frame::init(void)
-{
-#ifdef HAVE_GTK2
-  this->widget = gtk_frame_new("");
-  gtk_container_set_border_width(GTK_CONTAINER(this->widget), 3);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief Sets the Frames name to title
-   \param title The title the Frame should get.
-*/
-void Frame::setTitle(const char* title)
-{
-  if (this->title)
-    delete []this->title;
-  this->title = new char[strlen(title)+1];
-  strcpy(this->title, title);
-#ifdef HAVE_GTK2
-  gtk_frame_set_label(GTK_FRAME(widget), title);
-#endif /* HAVE_GTK2 */
-}
-
-// EVENTBOX //
-
-/**
-   \brief Creates a new EventBox with default settings.
-*/
-EventBox::EventBox(void)
-{
-  this->init();
-}
-
-/**
-   \brief Creates a new EventBox with name title
-   \param title title the Eventbox should get(only data-structure-internal)
-*/
-EventBox::EventBox(char* title)
-{
-  this->init();
-  this->setTitle(title);
-}
-
-/**
-   \brief destructs an EventBox.
-*/
-EventBox::~EventBox(void)
-{
-  if (this->title)
-    PRINTF(3)("deleting the EventBox: %s\n", this->title);
-  else 
-    PRINTF(3)("deleting the EventBox.\n");
-}
-
-/**
-   \brief Initializes a new EventBox
-*/
-void EventBox::init(void)
-{
-  this->isOption = -1;
-
-#ifdef HAVE_GTK2
-  this->widget = gtk_event_box_new();
-  gtk_container_set_border_width(GTK_CONTAINER(this->widget), 3);
-#endif /* HAVE_GTK2 */
-}
-
-/* BOX */
-
-/**
-   \brief Creates a new horizontal Box
-*/
-Box::Box(void)
-{
-  this->init('h');
-}
-
-/**
-   \brief Creates a new Box of type boxtype
-   \param boxtype if 'v' the Box will be vertically, if 'h' the Box will be horizontally
-*/
-Box::Box(char boxtype)
-{
-  this->init(boxtype);
-}
-
-/**
-   \brief destructs a Box.
-*/
-Box::~Box(void)
-{
-  if (this->title)
-    PRINTF(3)("deleting the Box: %s\n", this->title);
-  else 
-    PRINTF(3)("deleting the Box.\n");
-
-}
-
-/**
-   \brief Initializes a new Box with type boxtype
-   \param boxtype see Box(char boxtype)
-*/
-void Box::init(char boxtype)
-{
-  this->isOption = -2;
-
-#ifdef HAVE_GTK2
-  if (boxtype == 'v')
-    {
-      this->widget = gtk_vbox_new(FALSE, 0);
-    }
-  else
-    {
-      this->widget = gtk_hbox_new(FALSE, 0);
-    }
-#endif /* HAVE_GTK2 */
-}
-
-/** 
-    \brief Fills a box with a given Widget.
-    \param lowerWidget the next Widget that should be appendet to this Box
-
-    It does this by apending the first one to its down-pointer and all its following ones to the preceding next-pointer. The last one will receive a NULL pointer as Next
-*/
-void Box::fill(Widget* lowerWidget)
-{
-#ifdef HAVE_GTK2
-  gtk_box_pack_start(GTK_BOX(this->widget), lowerWidget->widget, TRUE, TRUE, 0);
-#endif /* HAVE_GTK2 */
-  if (this->down == NULL)
-    this->down = lowerWidget;
-  else
-    {
-      Widget* tmp;
-      tmp = this->down;
-      while(tmp->next != NULL)
-	{
-	  tmp = tmp->next;
-	}
-      tmp->next = lowerWidget;
-    }
-}
-
-/* OPTION */
-
-/**
-   \brief Initializes a new Option.
-   sets all Option-Specific-Values to their defaults.
-*/
-Option::Option(void)
-{
-  this->value = 0;
-  this->flagName = NULL;
-  this->flagNameShort = NULL;
-  this->saveable = false;
-  this->defaultValue = 0;
-}
-
-/**
-   \brief Destroys an Option.
-*/
-Option::~Option(void)
-{ 
-  PRINTF(4)("deleting the Option Part.\n");
-  if (this->flagName)
-    delete []this->flagName;
-  if (this->flagNameShort)
-    delete []this->flagNameShort;
-}
-
-/**
-   \brief This sets The FlagName of an Option and defines its default Values
-   !! Options will be saved if flagname is different from NULL !!
-   \param flagname the Name that will be displayed in the output
-   \param defaultvalue the default Value for this Option(see definition of defaultvalue
-*/
-void Option::setFlagName(char* flagname, int defaultvalue)
-{
-  if (this->flagName)
-    delete this->flagName;
-  this->flagName = new char [strlen(flagname)+1];
-  strcpy(this->flagName, flagname);
-  this->defaultValue = defaultvalue;
-
-  //  cout << "Set Flagname of " << this->title << " to " << flagname << endl;
-}
-
-/** 
-    \brief see Option::setFlagName(char* flagname, int defaultvalue)
-    \param flagname the Name that will be displayed in the output
-    \param defaultvalue the default Value for this Option(see definition of defaultvalue
-    \param flagnameshort a short flagname to be displayed in the output
-*/
-void Option::setFlagName(char* flagname, char* flagnameshort,  int defaultvalue)
-{
-  if (this->flagName)
-    delete []this->flagName;
-  this->flagName = new char [strlen(flagname)+1];
-  strcpy(this->flagName, flagname);
-
-  if (this->flagNameShort)
-    delete []this->flagNameShort;
-  this->flagNameShort = new char [strlen(flagnameshort)+1];
-  strcpy(this->flagNameShort, flagnameshort);
-  this->defaultValue = defaultvalue;
-  //  cout << "Set Flagname of " << this->title << " to " << flagname << endl;
-}
-
-/**
-   \brief Sets the saveable-state of the option to true.
-*/
-void Option::saveability(void)
-{
-  this->saveable = true;
-}
-
-/**
-   \brief Sets the saveable-state of the option.
-   \param isSaveable the saveable-state to set.
-*/
-void Option::saveability(bool isSaveable)
-{
-  this->saveable = isSaveable;
-}
-
-/**
-   \brief saves an Option
-   \returns the String that should be saved.
-
-   this is a default Option save
-*/
-char* Option::save(void)
-{
-  char* value = new char [10];
-  sprintf (value, "%d", this->value);
-  return value;
-}
-
-/**
-   \brief loads an Option from of its loadString
-   \param loadString the string from which to load the data from
-*/
-void Option::load(char* loadString)
-{
-  this->value = atoi(loadString);
-  PRINT(3)("Loading %s: %s %d\n", this->title, loadString, value); 
-  this->redraw();
-}
-
-/**
-   \returns The saveable-state.
-*/
-bool Option::isSaveable(void)
-{
-  return this->saveable;
-}
-
-#ifdef HAVE_GTK2
-/** 
-    \brief Signal OptionChange writes the Value from the Slider to its Object-Database.
-    \param widget The widget(Slider) that has a changed Value
-    \param slider the Slider-Object that should receive the change.
-*/
-gint Option::OptionChange(GtkWidget *widget, Widget* option)
-{
-  static_cast<Option*>(option)->changeOption();
-  flags->setTextFromFlags(Window::mainWindow);  //// must be different !!!
-}
-#endif /* HAVE_GTK2 */
-
-
-/* BUTTON */
-
-/**
-   \brief Creates a new Button with a buttonname
-   \param buttonname sets the Name of the Button
-*/
-Button::Button(char* buttonname)
-{
-  this->init();
-  this->setTitle(buttonname);
-}
-
-/**
-   \brief destructs a Button.
-*/
-Button::~Button(void)
-{
-  if (this->title)
-    PRINTF(3)("deleting the Label: %s\n", this->title);
-  else 
-    PRINTF(3)("deleting the Label.\n");
-
-}
-
-/**
-   \brief Initializes a new Button
-*/
-void Button::init(void)
-{
-  isOption = 0;
-
-#ifdef HAVE_GTK2
-  widget = gtk_button_new_with_label("");
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief Sets a new name to the Button
-   \param title The name the Button should get
-*/
-void Button::setTitle(const char *title)
-{
-  if (this->title)
-    delete []this->title;
-  this->title = new char[strlen(title)+1];
-  strcpy(this->title, title);
-#ifdef HAVE_GTK2
-  gtk_button_set_label(GTK_BUTTON(widget), title);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief redraws the Button
-   not implemented yet
-*/
-void Button::redraw(void)
-{
-}
-
-/**
-   \brief Button can not be changed, optionChange is empty)
-
-   \todo Actions for non-GTK-mode
-*/
-void Button::changeOption(void)
-{
-  // This will possibly be used for ACTIONS !
-}
-
-/* CHECKBUTTON */
-
-/**
-   \brief Creates a new CheckButton with an ame 
-   \param buttonname The name the CheckButton should display.
-*/
-CheckButton::CheckButton(char* buttonname)
-{
-  this->init();
-  this->setTitle(buttonname);
-
-#ifdef HAVE_GTK2
-  this->connectSignal("clicked", this->OptionChange);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief destructs a CheckButton.
-*/
-CheckButton::~CheckButton(void)
-{
-  if (this->title)
-    PRINTF(3)("deleting the CheckButton: %s\n", this->title);
-  else 
-    PRINTF(3)("deleting the CheckButton.\n");
-}
-
-/**
-   \brief Initialize a new CheckButton with default settings
-*/
-void CheckButton::init(void)
-{
-  this->isOption = 1;
-
-#ifdef HAVE_GTK2
-  this->widget = gtk_check_button_new_with_label("");
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief Sets a new Title to a CheckButton
-   \param title The new Name the CheckButton should display.
-*/
-void CheckButton::setTitle(const char* title)
-{
-  if (this->title)
-    delete []this->title;
-  this->title = new char[strlen(title)+1];
-  strcpy(this->title, title);
-#ifdef HAVE_GTK2
-  gtk_button_set_label(GTK_BUTTON(widget), title);
-#endif /* HAVE_GTK2 */
-}
-
-bool CheckButton::isActive(void)
-{
-#ifdef HAVE_GTK2
-  return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief Changed the Option, call this Function
-*/
-void CheckButton::changeOption(void)
-{
-#ifdef HAVE_GTK2
-  this->value =(int)gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(this->widget));
-#else /* HAVE_GTK2 */
-  char tmpChar[20];
-  cout << "\nPlease give me a new value for " << this->title << " [0,1](default:" << this->defaultValue << "): ";
-  cin >> tmpChar;
-
-  if ((this->value = atoi(tmpChar))=!0)
-    this->value = 1;
-#endif /* HAVE_GTK2 */
-  cout << this->title << " set to: " << this->value << endl;
-}
-
-
-/**
-   \brief Redraws the CheckButton(if option has changed).
-   Example: if new settings are loaded the Button must be redrawn for the GUI to display that Change
-*/
-void CheckButton::redraw(void)
-{
-#ifdef HAVE_GTK2
-  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(this->widget), value);
-#endif /* HAVE_GTK2 */
-}
-
-/* SLIDER */
-
-/**
-   \brief Creates a new Slider
-   \param slidername The data-structure-name of the slider.
-   \param start The minimal Value of the slider.
-   \param end The maximal Value of the slider.
-*/
-Slider::Slider(char* slidername, int start, int end)
-{
-  this->init(start, end);
-  this->setValue(start);
-  this->setTitle(slidername);
-#ifdef HAVE_GTK2
-  this->connectSignal("value_changed", this->OptionChange);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief destructs a Slider.
-*/
-Slider::~Slider(void)
-{
-  if (this->title)
-    PRINTF(3)("deleting the Slider: %s\n", this->title);
-  else 
-    PRINTF(3)("deleting the Slider.\n");
-}
-
-/**
-   \brief Initializes a Slider with start and end Values
-   params: see Slider::Slider(char* slidername, int start, int end)
-*/
-void Slider::init(int start, int end)
-{
-  this->isOption = 2;
-
-  this->start = start;
-  this->end = end;
-#ifdef HAVE_GTK2
- widget = gtk_hscale_new_with_range(this->start, this->end, 5);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief Setting a new value to the Slider.
-   Maybe you also require a Slider::redraw() for this to display
-*/
-void Slider::setValue(int value)
-{
-  this->value = value;
-}
-
-/**
-   \brief Redraws the widget
-   Example: see void CheckButton::redraw(void)
-*/
-void Slider::redraw(void)
-{
-#ifdef HAVE_GTK2
-  gtk_range_set_value(GTK_RANGE(this->widget), value);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief Changed the Option, call this Function
-*/
-void Slider::changeOption(void)
-{
-#ifdef HAVE_GTK2
-  this->value =(int)gtk_range_get_value(GTK_RANGE(this->widget));
-#else /* HAVE_GTK2 */
-  char tmpChar[20];
-  cout << "\nPlease give me a new value for " << this->title << " [" <<this->start << "-" << this->end << "](default:" << this->defaultValue << "): ";
-  cin >> tmpChar;
-
-  if ((this->value = atoi(tmpChar))> this->end)
-    this->value = this->end;
-  if (this->value <= this->start)
-    this->value = this->start;
-#endif /* HAVE_GTK2 */
-  cout << this->title << " set to: " << this->value << endl;
-}
-
-/* MENU */
-
-/**
-   \brief constructs a new Menu, without adding any items to it.
-   \param menuName the Name the Menu gets.
-*/
-Menu::Menu(const char* menuName)
-{
-  this->init();
-  this->setTitle(menuName);
-}
-
-/** 
-    \brief Creates a Menu-Item-list out of multiple input.
-    !! Consider, that the last input argument has to be "lastItem" for this to work!!
-    \param menuname The Database-Name of this Menu
-    \param ... items to be added to this Menu. !! Consider, that the last input argument has to be "lastItem" for this to work!!
-*/
-Menu::Menu(char* menuname, ...)
-{
-  this->init();
-  this->setTitle(menuname);
-  va_list itemlist;                     //!< The list to readin multiple Options.
-
-  char *itemName;
-
-  va_start(itemlist, menuname);
-  while(strcmp(itemName = va_arg(itemlist, char*), "lastItem"))
-    {
-      this->addItem(itemName);
-    }
-  va_end(itemlist);
-}
-
-/**
-   \brief destructs a Menu.
-*/
-Menu::~Menu(void)
-{
-  if (this->title)
-    PRINTF(3)("deleting the Menu: %s\n", this->title);
-  else 
-    PRINTF(3)("deleting the Menu.\n");
-  //! \todo destroy menu
-  this->currItem = this->firstItem;
-  while(this->currItem)
-    {
-      delete []this->currItem->name;
-      /*
-	#ifdef HAVE_GTK2
-	free(this->currItem->item);
-	#endif /* HAVE_GTK2 */
-      MenuItem* tmpItem = this->currItem;
-      this->currItem = this->currItem->next;
-      delete tmpItem;
-    }
-}
-
-/**
-   \brief Initializes a new Menu with no items
-*/
-void Menu::init(void)
-{
-  this->isOption = 2;
-  this->firstItem = NULL;
-
-#ifdef HAVE_GTK2
-  this->widget = gtk_option_menu_new();
-  this->menu = gtk_menu_new();
-  gtk_option_menu_set_menu(GTK_OPTION_MENU(this->widget), menu);
-  this->connectSignal("changed", this->OptionChange);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief saves the Label of the Menu
-   \returns the name of the selected Menu-Item
-*/
-char* Menu::save(void)
-{
-  MenuItem* tmpItem = this->firstItem;
-  for (int i = 0; i<this->value; i++)
-    tmpItem = tmpItem->next;
-      
-  return tmpItem->name;
-}
-
-/**
-   \brief loads a Menu from of its loadString
-   \param loadString the string from which to load the data from
-*/
-void Menu::load(char* loadString)
-{
-  MenuItem* tmpItem = firstItem;
-  bool foundItem = false;
-  while (tmpItem)
-    {
-      if (!strcmp(loadString, tmpItem->name))
-	{foundItem = true; break;}
-      tmpItem = tmpItem->next;
-    }
-  if (foundItem)
-    this->value = tmpItem->itemNumber;
-  else
-    {
-      this->value = 0;
-      PRINTF(2)("Sorry, but %s has not been found in the Itemlist of %s\n", loadString, this->title);
-    }
-  PRINTF(3)( "Loading %s: setting to %d\n", this->title, this->value); 
-  this->redraw();
-}
-
-/**
-   \brief appends a new Item to the Menu-List.
-   \param itemName the itemName to be appendet.
-*/
-void Menu::addItem(char* itemName)
-{
-  if (!this->firstItem)
-    {
-      this->firstItem = this->currItem = new MenuItem;
-      this->currItem->itemNumber = 0;
-    }
-  else
-    {
-      int tmpI = this->currItem->itemNumber;
-      this->currItem = this->currItem->next = new MenuItem;
-      this->currItem->itemNumber = tmpI+1;
-    }
-
-  this->currItem->name = new char[strlen(itemName)+1];
-  strcpy(this->currItem->name, itemName);
-
-#ifdef HAVE_GTK2
-  this->currItem->item = gtk_menu_item_new_with_label(itemName);
-  gtk_menu_shell_append(GTK_MENU_SHELL(this->menu), this->currItem->item);
-#endif /* HAVE_GTK2 */
-  this->currItem->next = NULL;
-}
-
-/**
-   \brief Redraws the widget
-   Example: see void CheckButton::redraw(void)
-*/
-void Menu::redraw(void)
-{
-#ifdef HAVE_GTK2
- gtk_option_menu_set_history(GTK_OPTION_MENU(this->widget), this->value);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief Changed the Option, call this Function
-*/
-void Menu::changeOption(void)
-{
-#ifdef HAVE_GTK2
-  this->value =(int)gtk_option_menu_get_history(GTK_OPTION_MENU(this->widget));
-#else /* HAVE_GTK2 */
-  char tmpChar[20];
-  cout << "\nPlease give me a new value for " << this->title << "(default:" << this->defaultValue << "): ";
-  cin >> tmpChar;
-  this->value = atoi(tmpChar);
-
-#endif /* HAVE_GTK2 */
-  cout << this->title << " set to: " << this->value << endl;
-}
-
-/* OPTION LABEL */
-
-/**
-   \brief Creates a new OptionLabel with a LabelName and a Value.
-   \param label The name of the OptionLabel.
-   \param value The Value of the OptionLabel(what will be displayed).
-*/
-OptionLabel::OptionLabel(char* label, char* value)
-{
-  this->init();
-  this->setTitle(label);
-  this->setValue(value);
-}
-
-/**
-   \brief destructs an OptionLabel.
-*/
-OptionLabel::~OptionLabel(void)
-{
-  if (this->title)
-    PRINTF(3)("deleting the OptionLabel: %s\n", this->title);
-  else 
-    PRINTF(3)("deleting the OptionLabel.\n");
-  if (this->cValue)
-    delete []this->cValue;
-}
-
-/**
-   \brief Initializes an OptionLabel
-*/
-void OptionLabel::init(void)
-{
-  this->isOption = 5;
-  cValue = NULL;
-
-#ifdef HAVE_GTK2
-  this->widget = gtk_label_new("");
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief Updates the value of an OptionLabel
-   \param newValue The new Name that should be displayed.
-*/
-void OptionLabel::setValue(char* newValue)
-{
-  if (this->cValue)
-    delete []this->cValue;
-  this->cValue = new char [strlen(newValue)+1];
-  strcpy(this->cValue, newValue);
-#ifdef HAVE_GTK2
-  gtk_label_set_text(GTK_LABEL(this->widget), this->cValue);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief Redraws an OptionLabel(not implemented yet, but it works).
-*/
-void OptionLabel::redraw(void)
-{
-#ifdef HAVE_GTK2
-  gtk_label_set_text(GTK_LABEL(widget), title);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief Changed the Option, call this Function
-*/
-void OptionLabel::changeOption(void)
-{
-#ifdef HAVE_GTK2
-  this->cValue =(char*)gtk_label_get_text(GTK_LABEL(this->widget));
-#else /* HAVE_GTK2 */
-  cout << "\nPlease give me a new input for " << this->title << ": ";
-  cin >> this->cValue;
-#endif /* HAVE_GTK2 */
-  cout << this->title << " set to: " << this->cValue << endl;
-}
-
-
-/**
-   \brief creates the Optionlabel save-string
-   \returns the String to save.
-*/
-char* OptionLabel::save(void)
-{
-  return cValue;
-}
-
-/**
-   \brief loads an Option from of its loadString
-   \param loadString the string from which to load the data from
-*/
-void OptionLabel::load(char* loadString)
-{
-  PRINTF(3)( "Loading %s: setting to %s\n", this->title, loadString); 
-  this->setValue(loadString);
-}
-
-/**
-   \brief Creates a new default Label with no Text.
-   You migth consider adding Label::setTitle with this.
-*/
-Label::Label(void)
-{
-  this->init();
-}
-
-/**
-   \brief Creates a new Label with a Text.
-   \param text The text to be displayed.
-*/
-Label:: Label(char* text)
-{
-  this->init();
-  this->setTitle(text);
-}
-
-/**
-   \brief destructs a Label.
-*/
-Label::~Label(void)
-{
-  if (this->title)
-    PRINTF(3)("deleting the Label: %s\n", this->title);
-  else 
-    PRINTF(3)("deleting the Label.\n");
-}
-
-/**
-   \brief initializes a new Label
-*/
-void Label::init(void)
-{
-  this->isOption = 0;
-
-#ifdef HAVE_GTK2
-  this->widget = gtk_label_new("");
-  gtk_label_set_line_wrap(GTK_LABEL(this->widget), TRUE);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief Sets a new Text to a Label.
-   \param text The text to be inserted into the Label.
-*/
-void Label::setTitle(char* text)
-{
-  if (this->title)
-    delete []this->title;
-  this->title = new char[strlen(text)+1];
-  strcpy(this->title, text);
-#ifdef HAVE_GTK2
-  gtk_label_set_text(GTK_LABEL(this->widget), this->title);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief ereases the Text of a Label
-*/
-void Label::ereaseText(void)
-{
-  this->setTitle("");
-}
-
-/** 
-    \brief appends some Text to a Label
-    \param textToAppend The text that will be appended to this Label
-*/
-void Label::appendText(char* textToAppend)
-{
-  if (this->title)
-    {
-      char* tmpTitle = new char[strlen(this->title)+strlen(textToAppend)+1];
-      strcpy(tmpTitle, title);  
-      strcat(tmpTitle, textToAppend);
-      delete []this->title;
-      this->title = tmpTitle;
-    }
-  else
-    {
-      this->title = new char[strlen(textToAppend)];
-    }
-  
-#ifdef HAVE_GTK2
-  gtk_label_set_text(GTK_LABEL(this->widget), title);
-#endif /* HAVE_GTK2 */
-}
-
-/** 
-    \brief Appends some integer to the Label
-    \param intToAppend The Int that will be added.
-    
-    it does this by just converting the int into a char* and send it to appendText
-*/
-void Label::appendInt(int intToAppend)
-{
-  char append [32];
-  sprintf(append, "%d", intToAppend);
-  this->appendText(append);
-}
-
-
-/**
-   \brief get the Text of a Label
-   \return The Text the Label holds.
-*/
-char* Label::getText(void)
-{
-  return this->title;
-}
-
-/**
-   \brief Creates a new ProgressBar.
-*/
-ProgressBar::ProgressBar(void)
-{
-  this->init();
-}
-
-/**
-   \brief Creates a new ProgressBar.
-   \param label The name you want to get the ProgressBar.
-*/
-ProgressBar::ProgressBar(char* label)
-{
-  this->init();
-  this->setTitle(label);
-}
-
-/**
-   \brief destructs a ProgressBar
-*/
-ProgressBar::~ProgressBar(void)
-{
-  if (this->title)
-    PRINTF(3)("deleting the ProgressBar: %s\n", this->title);
-  else 
-    PRINTF(3)("deleting the ProgressBar.\n");
-}
-
-/**
-   \brief Initializes a ProgressBar
-*/
-void ProgressBar::init(void)
-{
-  this->isOption = 0;
-  this->progress = 0.0;
-  this->totalSize = 0.0;
-
-#ifdef HAVE_GTK2
-  this->adjustment =(GtkAdjustment*)gtk_adjustment_new(0, 0, 100, 0, 0, 0);
-  this->widget = gtk_progress_bar_new_with_adjustment(this->adjustment);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief Sets the Total size of the Bar.(ex. The maximum one can download)
-*/
-void ProgressBar::setTotalSize(double totalSize)
-{
-  this->totalSize = totalSize;
-}
-
-/**
-   \brief Sets the progress maximum is this->totalSize
-*/
-void ProgressBar::setProgress(double progress)
-{
-  this->progress = progress;
-
-  if (this->progress > this->totalSize)
-    this->progress = this->totalSize;
-
-#ifdef HAVE_GTK2
-  gtk_progress_set_value(GTK_PROGRESS(widget), this->progress*100.0/this->totalSize);
-#endif /* HAVE_GTK2 */
-  PRINTF(3)("Progress: %f\n", this->progress*100.0/this->totalSize);
-}
-
-/**
-    \brief returns the Progress Status
-*/
-double ProgressBar::getProgress(void)
-{
-  return this->progress;
-}
-
-/* IMAGE */
-
-/**
-   \brief Creates a new Image
-   \param imagename the location of the Image on the Hard Disc
-*/
-Image::Image(char* imagename)
-{
-  this->init();
-  if (this->title)
-    delete []this->title;
-  this->title = new char[strlen(imagename)+1];
-  strcpy(this->title, imagename);
-
-#ifdef HAVE_GTK2
-  widget = gtk_image_new_from_file(imagename);
-#endif /* HAVE_GTK2 */
-}
-
-/**
-   \brief destructs an Image.
-*/
-Image::~Image(void)
-{
-  if (this->title)
-    PRINTF(3)("deleting the Image: %s\n", this->title);
-  else 
-    PRINTF(3)("deleting the Image.\n");
-}
-
-/** 
-    \brief Initializes a new Image
-*/
-void Image::init(void)
-{
-  isOption = 0;
-}
Index: orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_gtk.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_gtk.h	(revision 3921)
+++ 	(revision )
@@ -1,393 +1,0 @@
-/*!
- \file orxonox_gui_gtk.h
- \brief Contains all th different Widgets.
-*/
-#ifndef _ORXONOX_GUI_GTK_H
-#define _ORXONOX_GUI_GTK_H
-
-#if HAVE_CONFIG_H 
-#include <config.h> 
-#endif
-
-#include "debug.h"
-
-#ifdef HAVE_GTK2
-#include <gtk/gtkmain.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtkframe.h>
-#include <gtk/gtkhbox.h>
-#include <gtk/gtkvbox.h>
-#include <gtk/gtkbutton.h>
-#include <gtk/gtkcheckbutton.h>
-#include <gtk/gtkhscale.h>
-#include <gtk/gtkoptionmenu.h>
-#include <gtk/gtkmenu.h>
-#include <gtk/gtkmenuitem.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkimage.h>
-#include <gtk/gtkeventbox.h>
-#include <gtk/gtkprogressbar.h>
-#endif /* HAVE_GTK2 */
-
-bool initGUI(int argc, char* argv[]);
-bool mainloopGUI(void);
-
-//! This is the topmost object that can be displayed all others are derived from it.
-class Widget
-{
- private:
-
- public:
-  Widget(void);
-  virtual ~Widget(void);
-
-  void show(void);
-  void hide(void);
-  void setSize(int width, int height);
-  virtual void setTitle(const char* title);  //!< An abstract Function, that sets the title of Widgets.
-
-  Widget* findWidgetByName(char* name, unsigned int depth);
-  void walkThrough(void(*function)(Widget*), unsigned int depth);
-  void walkThrough(void(*function)(Widget*, void*), void* data, unsigned int depth);
-  static void listOptionsAndGroups(Widget* widget);
-  static void listOptions(Widget* widget);
-  static void listOptions(Widget* widget, void* data);
-  Widget* findOptionByNumber(int* number, unsigned int depth);
-  static void listGroups(Widget* widget);
-  static void listGroups(Widget* widget, void* data);
-  Widget* findGroupByNumber(int* number, unsigned int depth);
-  static void setOptions(Widget* widget);
-  static void flagCheck(Widget* widget, void* flagName);
-  
-#ifdef HAVE_GTK2
-  // Connection - Functions
-
-  gulong connectSignal(char* event, gint(*signal)(GtkWidget*, GdkEvent*, void* ));
-  gulong connectSignal(char* event, gint(*signal)(GtkWidget*, Widget* ));
-  gulong connectSignal(char* event, void* extObj, gint(*signal)(GtkWidget*, GdkEvent*, void* ));
-  gulong connectSignal(char* event, void* extObj, gint(*signal)(GtkWidget*, void* ));
-  gulong connectSignal(char* event, void* extObj, gint(*signal)(GtkWidget*, GdkEventKey*, void* ));
-  void disconnectSignal(gulong signalID);
-
-  // Signals
-  static gint doNothingSignal(GtkWidget* widget, GdkEvent* event, void* nothing);
-#endif /* HAVE_GTK2 */
-
-  Widget* next;                     //!< next always points to the next Widget in the list. Every Widget has a next one, or has NULL as next
-#ifdef HAVE_GTK2
-  GtkWidget* widget;                //!< widget is the gtk_widget that the specific Object Contains.
-#endif /* HAVE_GTK2 */
-  int isOption;                     //!< with this Paramenter one can set the option-type: -2:Container, -1: Box, 0: not an Option, 1: Bool-option, 2: int-option, 3: float option, 4:char option, 5: char* option
-
-  //! defines isOption states
-  enum option { containerType = -2, boxType = -1, nothingType = 0, boolType = 1, intType = 2}; 
-  char* title;                      //!< The name of the Widget. Some do display it, Options need it to save;
-};
-
-//! This is a Packer Object, which has the ability to Pack other Widgets into itself.
-class Packer : public Widget
-{
- public:
-  Packer(void);
-  virtual ~Packer(void);
-
-  Widget* down; //!< this points to the Widget below this.
-  char* groupName; //!< For each Packer you can specify a Groupname under which the lowerWidgets will be saved.
-
-  void setGroupName(char* name);
-  char* getGroupName(void);
-
-  virtual void fill(Widget* lowerWidget) = 0; //!< An abstract function, that fills Packers.
-};
-
-//! This is a Container Class, it can contain one sub-Widget: down.
-/**
- * A Container is a Widget that can hold a subWidget in addition to a next-Widget.
- * The Container can by itself not be displayed created or used.
- * The derived classes of Container can be displayed
-*/
-class Container : public Packer
-{
- private:
-  int borderwidth;          //!< The width of The Container Boarder.
-  int policy;               //!< The Update Policy of a Container.
-  
- public:
-  Container(void);
-  virtual ~Container(void);
-  //  void setBorderWidth(int borderwidth);
-  void fill(Widget* lowerWidget);
-};
-
-//! Window is the class that creates new Windows, and handels them
-/**
- * A Window is a class derived from Container that contains a window-widget.
- * It has the ability to hold one sub-object
- */
-class Window : public Container
-{
- private:
-  bool isOpen;                      //!< A bool Variable that checks if a Window is already open.
- public:
-  static Window* mainWindow;        //!< Pointer to the First Window that was opened. By default this should be the GUI's main-Window.
-  static void addWindow(Window* windowToAdd);
-
-  Window(void);
-  Window(char* windowName);
-  virtual ~Window(void);
-  void init(void);
-  
-  void setTitle(const char* title);
-  void showall(void);
-  void open(void);
-  void close(void);
-
-#ifdef HAVE_GTK2
-  // Signals
-  static gint windowOpen(GtkWidget* widget, GdkEvent* event, void* window);
-  static gint windowClose(GtkWidget* widget, GdkEvent* event, void* window);
-#endif /* HAVE_GTK2 */
-};
-
-//! Frame is the class that handles frames
-/**
- * A Frame is an object, that has a border and if you like a name on it.
- * It can contain a Widget, which means that you can insert anything you like inside of a frame
- */
-class Frame :public Container
-{
- public:
-  Frame(void);
-  Frame(char* frameName);
-  virtual ~Frame(void);
-  void init(void);
-
-  void setTitle(const char* title);
-};
-
-//! EventBox is a Container that can Handle all Events happening inside of it.
-/**
- * Example: if you have a picture, and you want it to catch mouse-clicks, you have to pack it inside a EventBox
- */
-class EventBox : public Container
-{
- public:
-  EventBox(void);
-  EventBox(char* eventBoxName);
-  virtual ~EventBox(void);
-  void init(void);
-};
-
-//! A Box can contain multiple Widgets
-/**
-   A Box can Contain multiple Widgets, that are ordered either horizontally or vertically
-   I defined the standartbox to be horizontally.
-   A Box is always filled left->right(horizontally) or up->down(vertically)
-*/
-class Box : public Packer
-{
- public:
-  Box(void);
-  Box(char boxtype);
-  virtual ~Box(void);
-  void init(char boxtype);
-  
-  void fill(Widget* lowerWidget);
-};
-
-//! An Option is a Widget that contains something that may change its state.
-/**
- * Options are the essence of a GUI, they: Configure, Start, Quit, Execute, and make it worth something
- */
-class Option : public Widget
-{
- protected:
-  bool saveable;  //!< Options can be Saved.
-  
- public:
-  Option(void);
-  virtual ~Option(void);
-  void init(void);
-
-  int value; //!< every option has a value either true or false(0,1) or something else like 25 for 25% of the volume
-  char* flagName; //!< options have a flag name that will be appendet if you start the Program from the GUI.
-  char* flagNameShort; //!< like flag_name but shorter
-  int defaultValue; //!< A default value is good, for hiding a option if it is not needed.(hidden if value == default_value)
-
-  void saveability(void);
-  void saveability(bool isSaveable);
-  virtual char* save(void);
-  virtual void load(char* loadString);
-
-  bool isSaveable(void);
-  void setFlagName(char* flagname, int defaultvalue);
-  void setFlagName(char* flagname, char* flagnameshort, int defaultvalue);
-  virtual void redraw(void) = 0; //!< A Option must be able to redraw itself.
-  virtual void changeOption(void) = 0; //!< What to do, if an Option is Changed. eacht option decides for itself.
-#ifdef HAVE_GTK2
-    // Signals  
-  static gint OptionChange(GtkWidget* widget, Widget* option); //!< Signal for Options that change.
-#endif /* HAVE_GTK2 */
-};
-
-//! Buttons can be pressed, and released.
-/**
- * Buttons are mainly there for executing some action like Starting the Programm, or Quiting it.
- */
-class Button : public Option 
-{
- public:
-  Button(char* buttonname);
-  virtual ~Button(void);
-  void init(void);
-
-  void setTitle(const char* title);
-  void redraw(void);
-  void changeOption(void);
-};
-
-//! CheckButtons are a key in configuring bool Variables
-/** CheckButtons can configure bool Variables like wireframe on/off, enable_sound etc.
- */
-class CheckButton : public Option
-{
- public:
-  CheckButton(char* buttonname);
-  virtual ~CheckButton(void);
-  void init(void);
-
-  void setTitle(const char* title);
-  bool isActive(void);           //!< a Bool value to see, if this CheckButton is active.
-  void redraw(void);
-  void changeOption(void);
-};
-
-//! Sliders are Options that can be modified in their value
-/**
- * good for volume, brightness, etc.
- */
-class Slider : public Option
-{
- private:
-  int start;                            //!< The beginning of the Slider-range.
-  int end;                              //!< The end of the Slider-range.
- public:
-  Slider(char* slidername, int start, int end);
-  virtual ~Slider(void);
-  void init(int start, int end);
-
-  void setValue(int value);
-  void redraw(void);
-  void changeOption(void);
-};
-
-//! A Menu is an Option that has a dropdown menu, where you can chose between different Items
-class Menu : public Option
-{
- private:
-#ifdef HAVE_GTK2
-  GtkWidget* menu;                      //!< The menu That will hold the Options.
-#endif /* HAVE_GTK2 */
-
-  //! A struct to handle the MenuItems
-  struct MenuItem
-  {
-    char* name;                         //!< The name of this entry.
-    int itemNumber;                     //!< The n'th entry of this menu;
-#ifdef HAVE_GTK2
-    GtkWidget* item;                    //!< One Item From a Menu.
-#endif /* HAVE_GTK2 */
-    MenuItem* next;                     //!< Pointer to the next MenuItem.
-  };
-  MenuItem* firstItem;                  //!< Pointer to the first Item.
-  MenuItem* currItem;                   //!< Pointer to the current Item.
-  
- public:
-  Menu(const char* menuName);
-  Menu(char* menuname, ...);
-  virtual ~Menu(void);
-  void init(void);
-
-  virtual char* save(void);
-  virtual void load(char* loadString);
-  
-  void addItem(char* itemName);
-  void redraw(void);
-  void changeOption(void);
-};
-
-//! A OptionLabel is a simple Label, that holds a char*, and will be updated, if changed.
-class OptionLabel : public Option
-{
- private:
-
- public:
-  OptionLabel(char* label, char* value);
-  virtual ~OptionLabel(void);
-  void init(void);
-  
-  void setValue(char* newValue);
-
-  virtual char* save(void);
-  virtual void load(char* loadString);
-
-  void redraw(void);
-  void changeOption(void);
-
-  char* cValue;                          //!< The Value the Label will have. \todo make private
-
-};
-
-//! A label is a Widget, that displays a text
-class Label : public Widget
-{
- public:
-  Label(void);
-  Label(char* text);
-  virtual ~Label(void);
-  void init(void);
-  
-  void setTitle(char* text);
-  void ereaseText(void);
-  void appendText(char* textToAppend);
-  void appendInt(int intToAppend);
-  char* getText(void);
-};
-
-//! A ProgressBar is a Widget, that can display a Progress
-class ProgressBar : public Widget
-{
- public:
-  ProgressBar(void);
-  ProgressBar(char* label);
-  virtual ~ProgressBar(void);
-  void init(void);
-
-  void setProgress(double progress);
-  void setTotalSize(double totalSize);
-  double getProgress(void);
-
- private:
-  double totalSize;         //!< The total Size of a download Bar
-  double progress;          //!< The progress of a Bar.
-#ifdef HAVE_GTK2
-  GtkAdjustment* adjustment;
-#endif /* HAVE_GTK2 */
-};
-
-//! Image is the keeper of one Image 
-/** 
- * Images are mighty cool.
- * Images can help you lighten up the Programming process, and will give everyone a better impression of the Software.
- */
-class Image : public Widget
-{
- public:
-  Image(char* imgaename);
-  virtual ~Image(void);
-  void init(void);
-};
-
-//gint orxonox_gui_quit(GtkWidget* widget, GdkEvent* event, gpointer data);
-
-#endif /* _ORXONOX_GUI_GTK_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_keys.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_keys.cc	(revision 3921)
+++ 	(revision )
@@ -1,276 +1,0 @@
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
-
-
-   ### File Specific:
-   main-programmer: Benjamin Grauer
-
-*/
-
-#include "orxonox_gui_keys.h"
-
-/**
-   \brief Creates an Keyboard-Frame
-*/
-OrxonoxGuiKeys::OrxonoxGuiKeys(void)
-{
-  this->keysFrame = new Frame("Keyboard-Options:");
-  //  keysFrame->setGroupName("Keyboard");
-  this->keysBox = new Box('h');
-  this->player1 = new Player("player1");
-  this->player2 = new Player("player2");
-
-  this->keysBox->fill(this->player1->getOpenButton());
-  this->keysBox->fill(this->player2->getOpenButton());
-
-  this->keysFrame->fill(this->keysBox);
-}
-
-/**
-   \brief Destructs the Keys-stuff
-*/
-OrxonoxGuiKeys::~OrxonoxGuiKeys(void)
-{
-  // nothing to do here.
-}
-
-/**
-   \brief Return the Frame
-   \return Returns the Audio-frame
-*/
-Widget* OrxonoxGuiKeys::getWidget(void)
-{
-  return this->keysFrame;
-}
-
-/* PLAYER */
-
-/**
-   \brief Creates new inputs for a player
-   \param player the name of the Player
-*/
-Player::Player(char* player)
-{
-  char* windowName = new char[strlen(player)+25];
-  strcpy(windowName, "Keyboard settings of ");
-  strcat(windowName, player);
-  this->pKeyWindow = new Window(windowName);
-  this->pKeyFrame = new Frame(windowName);
-   this->pKeysBox = new Box('v');
-   this->pKeysBox->setGroupName(player);
-    this->pKeysBox->fill(addKey(UP, "up"));
-    this->pKeysBox->fill(addKey(DOWN, "down"));
-    this->pKeysBox->fill(addKey(LEFT, "left"));
-    this->pKeysBox->fill(addKey(RIGHT, "right"));
-    this->pKeysBox->fill(addKey(SHOOT, "shoot"));
-    delete windowName;
-    closeButton = new Button("close");
-#ifdef HAVE_GTK2
-    this->closeButton->connectSignal("button_press_event", this->pKeyWindow, Window::windowClose);
-#endif /* HAVE_GTK2 */
-
-    this->pKeysBox->fill(this->closeButton);
-    this->pKeyFrame->fill(this->pKeysBox);
-   this->pKeyWindow->fill(this->pKeyFrame);
-   Window::addWindow(this->pKeyWindow);
-#ifdef HAVE_GTK2
-   this->pKeyWindow->connectSignal("destroy", this->pKeyWindow, Window::windowClose);
-   this->pKeyWindow->connectSignal("delete_event", this->pKeyWindow, Window::windowClose);
-#endif /* HAVE_GTK2 */
-
-  this->openButton = new Button(player);
-#ifdef HAVE_GTK2
-  this->openButton->connectSignal("button_press_event", this->pKeyWindow, Window::windowOpen);
-#endif /* HAVE_GTK2 */
-
-  this->inputWindow = new Window("inputWindow");
-
-  this->inputButton = new Button("test");
-  this->inputWindow->fill(inputButton);
-#ifdef HAVE_GTK2
-  this->inputWindow->connectSignal("destroy",  Widget::doNothingSignal);
-  this->inputWindow->connectSignal("delete_event", Widget::doNothingSignal);
-#endif /* HAVE_GTK2 */
-
-}
-
-/**
-   \brief adds a new Key.
-   \param key the number of the Key
-   \param name The name of the new Key.
-   \returns A widget that has the Key-Box
-*/
-Widget* Player::addKey(KEYS key, char* name)
-{
-  this->inputKey[key] = new InputKey;
-  this->inputKey[key]->pKeyBox = new Box();
-  this->inputKey[key]->pKeyButton = new Button(name);
-  this->inputKey[key]->pKeyOLabel = new OptionLabel(name, name);
-  this->inputKey[key]->pKeyOLabel->saveability();
-
-#ifdef HAVE_GTK2
-  //inputKey[key]->pKeyButton->connectSignal("key_press_event", inputKey[key]->pKeyButton, key_cb);
-  this->inputKey[key]->pKeyButton->connectSignal("button_press_event", this->inputKey[key], inputWindowEvent);
-#endif /* HAVE_GTK2 */
-  this->inputKey[key]->pKeyBox->fill(this->inputKey[key]->pKeyButton);
-  this->inputKey[key]->pKeyBox->fill(this->inputKey[key]->pKeyOLabel);
-  return this->inputKey[key]->pKeyBox;
-}
-
-/**
-   \returns the OpenButton of a Player
-*/
-Button* Player::getOpenButton(void)
-{
-  return this->openButton;
-}
-
-/**
-   \brief sets a new Key(only output)
-   \param key the new Key.
-*/
-void Player::setkey(KEYS key)
-{
-  cout << "setting up Key: "<< key <<endl;
-}
-
-Window* Player::inputWindow = NULL;
-Button* Player::inputButton = NULL;
-long Player::keySignal = 0;
-
-#ifdef HAVE_GTK2
-gint Player::inputWindowEvent(GtkWidget* w, GdkEventKey* event, void* inputKey)
-{
-  inputButton->setTitle("press a Key");
-  keySignal = inputButton->connectSignal("key_press_event", inputKey, key_cb);
-  inputWindow->open();
-}
-  
-/**
-   \brief Function which gets keystrokes
-   \param w the widget that released the Function.
-   \param event The event that happened.
-   \param Widget the Widget which will be applied.
-   \returns Nothing
-*/
-gint Player::key_cb(GtkWidget* w, GdkEventKey* event, void* inputKey)
-{
-  InputKey* inputkey =(InputKey*) inputKey;
-  char title [20];
-
-  switch(event->keyval) 
-    {
-    case GDK_Up:
-      strcpy(title, "up");
-      break;
-    case GDK_Down:
-      strcpy(title, "down");
-      break;
-    case GDK_Left:
-      strcpy(title, "left");
-      break;
-    case GDK_Right:
-      strcpy(title, "right");
-      break;
-      
-    case GDK_space:
-      strcpy(title, "space");
-      break;
-      
-    case 65293:
-      strcpy(title, "enter");
-      break;
-      
-      // Special Keys //
-    case GDK_Escape:
-      strcpy(title, "esc");
-      break;
-    case GDK_Tab:
-      strcpy(title, "tab");
-      break;
-    case GDK_Shift_L:
-      strcpy(title, "l_shift");
-      break;
-    case GDK_Shift_R:
-      strcpy(title, "r_shift");
-      break;
-    case GDK_Control_L:
-      strcpy(title, "l_ctrl");
-      break;
-    case GDK_Control_R:
-      strcpy(title, "r_ctrl");
-      break;
-    case GDK_Alt_L:
-      strcpy(title, "l_alt");
-      break;
-    case GDK_Alt_R:
-      strcpy(title, "r_alt");
-      break;
-      // FXX KEYS //
-    case GDK_F1:
-      strcpy(title, "f1");
-      break;
-    case GDK_F2:
-      strcpy(title, "f2");
-      break;
-    case GDK_F3:
-      strcpy(title, "f3");
-      break;
-    case GDK_F4:
-      strcpy(title, "f4");
-      break;
-    case GDK_F5:
-      strcpy(title, "f5");
-      break;
-    case GDK_F6:
-      strcpy(title, "f6");
-      break;
-    case GDK_F7:
-      strcpy(title, "f7");
-      break;
-    case GDK_F8:
-      strcpy(title, "f8");
-      break;
-    case GDK_F9:
-      strcpy(title, "f9");
-      break;
-    case GDK_F10:
-      strcpy(title, "f10");
-      break;
-    case GDK_F11:
-      strcpy(title, "f11");
-      break;
-    case GDK_F12:
-      strcpy(title, "f12");
-      break;
-      
-      
-    default:
-      char* tmp;
-      sprintf(tmp, "%c", event->keyval);
-      printf("other key %s \n", tmp);
-      strcpy(title, tmp);
-      break;
-    }
-
-  inputkey->pKeyOLabel->setValue(title);
-  inputButton->disconnectSignal(keySignal);
-  inputWindow->close();
-}
-#endif /* HAVE_GTK2 */
Index: orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_keys.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_keys.h	(revision 3921)
+++ 	(revision )
@@ -1,80 +1,0 @@
-/*!
-  \file orxonox_gui_keys.h
-  \brief File that holds the class that creates the Keyboard-Options.
-*/
-
-#ifndef _ORXONOX_GUI_KEYS_H
-#define _ORXONOX_GUI_KEYS_H
-
-#include "orxonox_gui.h"
-#ifdef HAVE_GTK2
-#include <gdk/gdkkeysyms.h>
-#endif /* HAVE_GTK2 */
-
-/**
-   \brief defines the Possible Player Keys
-*/
-enum KEYS {UP, DOWN, LEFT, RIGHT, SHOOT};
-
-class Player;
-//! Class that creates the Keys-Options.
-class OrxonoxGuiKeys
-{
- private:
-  Frame* keysFrame;      //!< The Frame that holds the keyOptions.
-  Box* keysBox;          //!< The Frame that holds the keyOptions.
-  Player* player1;       //!< The first Player's keys.
-  Player* player2;       //!< The seconds Player's keys.
-  Button* misc;          //!< Other keyboeard options come here. \todo include some like pause, quit and so on.
-
- public:
-  OrxonoxGuiKeys(void);
-  ~OrxonoxGuiKeys(void);
-  
-  Widget* getWidget(void);
-};
-
-//! Class to hold infos about a Player
-/**
-   \todo split into subclass and superclass ButtonConfigurator
-*/
-class Player
-{
- private:
-  Window* pKeyWindow;     //!< The Window for a new Key-setting.
-  Frame* pKeyFrame;       //!< The Frame for a new Key-setting.
-  Button* openButton;     //!< The OpenButton for this key-settings.
-  Button* closeButton;    //!< The CloseButton for this key-settings.
-  Box* pKeysBox;          //!< The Box that holds the Key-settings.
-  
-  //! One KeyOption has one InputKey
-  struct InputKey
-  {
-    Box* pKeyBox;           //!< One Box that holds the Keys
-    Button* pKeyButton;     //!< The Button for changing the Key.
-    OptionLabel* pKeyOLabel;//!< The Label for displaying the Key-setting.
-  };
-
-  InputKey* inputKey[10];     //!< Buttons-array. \todo make it dynamic.
-
-  static Window* inputWindow; //!< A Window that gets keyboard clicks. Static, because only one needed.
-  static Button* inputButton; //!< A Button that gets keyboard clicks. Static, because only one needed.
-  static long keySignal;      //!< A keySignal that handles keyboard clicks. Static, because only one needed.
- public:
-  Player(char* player);
-
-  Widget* addKey(KEYS key, char* name);
-
-  Button* getOpenButton(void);
-
-#ifdef HAVE_GTK2
-  static gint inputWindowEvent(GtkWidget* w, GdkEventKey* event, void* widget);
-  static gint key_cb(GtkWidget* w, GdkEventKey* event, void* inputKey);
-#endif /* HAVE_GTK2 */
-  void setkey(KEYS key);
-  
-};
-
-
-
-#endif /* _ORXONOX_GUI_KEYS_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_update.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_update.cc	(revision 3921)
+++ 	(revision )
@@ -1,503 +1,0 @@
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
-
-
-   ### File Specific:
-   main-programmer: Benjamin Grauer
-
-*/
-
-#include "orxonox_gui_update.h"
-#include <iostream>
-#include <string>
-
-#include "orxonox_gui.h"
-#include <stdio.h>
-#include <stdlib.h>
-
-using namespace std;
-
-/**
-   \brief Creates an Update-Frame
-*/
-OrxonoxGuiUpdate::OrxonoxGuiUpdate(void)
-{
-  this->getSystemInfo();
-
-  this->updateFrame = new Frame("Update-Options:");
-  this->updateFrame->setGroupName("update");
-  this->updateBox = new Box('v');
-#ifdef HAVE_CURL
-
-  // the Button for autoUpdating
-  this->autoUpdate = new CheckButton("auto update");
-  this->updateBox->fill(this->autoUpdate);
-  this->autoUpdate->setFlagName("update", "u", 0);
-  this->autoUpdate->saveability();
-
-  this->updateSourceWindowCreate();
-  this->updateBox->fill(this->updateSourceWindowGetButton());
-
-  this->updateDataWindowCreate();
-  this->updateBox->fill(this->updateDataWindowGetButton());
-
-#else /* HAVE_CURL */
-  Label* noCurlLabel = new Label("since you do not have cURL,\nthis option is not availible");
-  this->updateBox->fill(noCurlLabel);  
-#endif /* HAVE_CURL */
-  this->updateFrame->fill(this->updateBox);
-}
-
-/**
-   \brief Destructs the Update-stuff
-*/
-OrxonoxGuiUpdate::~OrxonoxGuiUpdate(void)
-{
-  if(this->tmpDir)
-    delete []this->tmpDir;
-  if(this->homeDir)
-    delete []homeDir;
-  if(this->installDataDir)
-    delete []this->installDataDir;
-  if(this->installSourceDir)
-    delete []this->installSourceDir;
-  if(this->userName)
-    delete []this->userName;
-
-
-}
-
-/**
-   \brief Return the Frame
-   \return Returns the Audio-frame
-*/
-Widget* OrxonoxGuiUpdate::getWidget(void)
-{
-  return this->updateFrame;
-}
-
-/** 
-    \brief Look what info we can get from this system
-*/
-bool OrxonoxGuiUpdate::getSystemInfo(void)
-{
-  PRINTF(3)("Grabbing system information\n");
-  this->tmpDir = getenv("TMPDIR");
-  if(!tmpDir)
-    this->tmpDir = "/tmp";
-  PRINTF(4)("Temporary directory is: %s\n", this->tmpDir);
-
-#ifdef __WIN32__
-  this->homeDir = getenv("USERPROFILE");
-#else
-  this->homeDir = getenv("HOME");
-#endif
-  PRINTF(4)("Home directory is %s\n", homeDir);
-
-  this->installDataDir = "/usr/share/games/orxonox";
-  PRINTF(4)("Installation of orxonox-data will go to this directory: %s\n", this->installDataDir);
-
-  this->installSourceDir = "/usr/games/bin";
-  PRINTF(4)("Installation of orxonox-source will go to this directory: %s\n", this->installSourceDir);
-
-  this->userName = getenv("USER");
-  PRINTF(4)("Logged in username is: %s\n", this->userName);
-}
-
-#ifdef HAVE_CURL
-bool* OrxonoxGuiUpdate::checkForUpdates(void)
-{
-  PRINTF(3)("checking for new version of orxonox\n");
-  FileInfo updateFileInfo;
-  updateFileInfo.fileName = "update_info";
-  updateFileInfo.webRoot = "http://www.orxonox.ethz.ch/files/data";
-  updateFileInfo.localRoot = this->tmpDir;
-  
-  download(&updateFileInfo);
-}
-#endif /* HAVE_CURL */
-#ifdef HAVE_CURL
-/**
-   \brief Creates a window, and all it contains for the Data-update.
-*/
-void OrxonoxGuiUpdate::updateDataWindowCreate(void)
-{
-  this->updateDataWindow = new Window("update orxonox::Data");   
-  this->updateDataBox = new Box('v');
-
-  // the close-Button of the Update Window.
-  //  updateWindowClose = new Button("close");
-#ifdef HAVE_GTK2 
-  //  updateWindowClose->connectSignal("button_press_event", updateWindow, Window::windowClose);
-#endif /* HAVE_GTK2 */
-  //  updateWindowBox->fill(updateWindowClose);
-
-  this->updateDataBar = new ProgressBar();
-  this->updateDataBox->fill(this->updateDataBar);
-
-  FileInfo* dataInfo = new FileInfo;
-  dataInfo->bar = this->updateDataBar;
-
-  this->updateDataBegin = new Button("begin.");
-  dataInfo->stateButton = this->updateDataBegin;
-#ifdef HAVE_GTK2 
-  dataInfo->buttonSignal = updateDataBegin->connectSignal("button_press_event", dataInfo, updateDataFunc);
-#endif /* HAVE_GTK2 */
-  this->updateDataBox->fill(this->updateDataBegin);
-
-  this->updateDataWindow->fill(this->updateDataBox);
-
-  this->updateDataWindowButton = new Button("update orxonox::Data");
-#ifdef HAVE_GTK2 
-  this->updateDataWindowButton->connectSignal("button_press_event", this->updateDataWindow, Window::windowOpen);
-  this->updateDataWindow->connectSignal("destroy", this->updateDataWindow, Window::windowClose);
-  this->updateDataWindow->connectSignal("delete_event", this->updateDataWindow, Window::windowClose);
-#endif /* HAVE_GTK2 */
-
-}
-
-/**
-   \returns A Pointer to the Button of the UpdaterDataWindow
-*/
-Button* OrxonoxGuiUpdate::updateDataWindowGetButton(void)
-{
-  return this->updateDataWindowButton;
-}
-
-/**
-   \brief Creates a window, and all it contains for the Source-update.
-*/
-void OrxonoxGuiUpdate::updateSourceWindowCreate(void)
-{
-  // the button, that opens this Window.
-  this->updateSourceWindowButton = new Button("update orxonox::Source");
-
-  // the Window itself
-  this->updateSourceWindow = new Window("update orxonox::Source");
-
-  this->updateSourceBox = new Box();
-
-  this->updateSourceBar = new ProgressBar();
-  this->updateSourceBox->fill(this->updateSourceBar);
-  test = new Button("increment");
-
-#ifdef HAVE_GTK2 
-  test->connectSignal("button_press_event", updateSourceBar, updateSourceFunc);
-#endif /* HAVE_GTK2 */
-
-  this->updateSourceBox->fill(test);
-  this->updateSourceWindow->fill(updateSourceBox); 
-#ifdef HAVE_GTK2 
-  this->updateSourceWindowButton->connectSignal("button_press_event", this->updateSourceWindow, Window::windowOpen);
-  this->updateSourceWindow->connectSignal("destroy", this->updateSourceWindow, Window::windowClose);
-  this->updateSourceWindow->connectSignal("delete_event", this->updateSourceWindow, Window::windowClose);
-#endif /* HAVE_GTK2 */
-
-}
-
-/**
-   \returns A Pointer to the Button of the UpdaterSourceWindow
-*/
-Button* OrxonoxGuiUpdate::updateSourceWindowGetButton(void)
-{
-  return this->updateSourceWindowButton;
-}
-
-
-#ifdef HAVE_GTK2 
-/**
-   \brief updates the Data of orxonox.
-   \param w The widget, that executed this Function.
-   \param event The event that trigered this Function.
-   \param button The Button, that triggered this event.
-*/
-gint OrxonoxGuiUpdate::updateDataFunc(GtkWidget* w, GdkEventKey* event, void* info)
-{
-  FileInfo* dataInfo =(FileInfo*)info;
-
-  dataInfo->fileName = "02%20orxonox%203.mp3";
-  dataInfo->webRoot  = "http://www.orxonox.ethz.ch/files/";
-  dataInfo->localRoot = "./";
-  PRINTF(3)("Preparing to download file %s.\n", dataInfo->fileName);
-  downloadWithStyle(dataInfo);
-}
-
-/**
-   \brief updates the source of orxonox.
-   \param w The widget, that executed this Function.
-   \param event The event that trigered this Function.
-   \param button The Button, that triggered this event.
-*/
-gint OrxonoxGuiUpdate::updateSourceFunc(GtkWidget* w, GdkEventKey* event, void* bar)
-{
-  ProgressBar* tmpBar = static_cast<ProgressBar*>(bar);
-  tmpBar->setTotalSize(20);
-  tmpBar->setProgress(tmpBar->getProgress()+1);
-}
-#endif /* HAVE_GTK2 */
-
-/**
-   \brief The Function Curl calls to write out the File.
-   \param ptr A Pointer to the date to write.
-   \param size The size in bytes of one nmemb to write.
-   \param nmemb The Count of size to write.
-   \param stream Filehandler to write to.
-*/
-size_t OrxonoxGuiUpdate::curlWriteFunc(void* ptr, size_t size, size_t nmemb, FILE* stream)
-{
-  return fwrite(ptr, size, nmemb, stream);
-}
-
-/**
-   \brief The Function Curl calls to write out the File.
-   \param ptr A Pointer to the date to write to.
-   \param size The size in bytes of one nmemb to write.
-   \param nmemb The Count of size to write.
-   \param stream Filehandler to get data from.
-*/
-size_t OrxonoxGuiUpdate::curlReadFunc(void* ptr, size_t size, size_t nmemb, FILE* stream)
-{
-  return fread(ptr, size, nmemb, stream);
-}
-
-
-/**
-   \brief An update Function for the GUI, to show the progress.
-   \param Bar th ProgressBar to update
-   \param totalSize The total size of the download in bytes.
-   \param progress The current Progress of the download in bytes.
-   \param upTotal not needed
-   \param upProgress not needed
-*/
-int OrxonoxGuiUpdate::curlProgressFunc(ProgressBar* bar, double totalSize, double progress, double upTotal, double upProgress)
-{
-  bar->setProgress(progress);
-  bar->setTotalSize(totalSize);
-#ifdef HAVE_GTK2
-#ifndef HAVE_PTHREAD_H
-  while(gtk_events_pending()) gtk_main_iteration();
-#endif
-#endif
-  return 0;
-}
-
-/**
-   \brief The Curl handle for only one CURL(static).
-*/
-CURL* OrxonoxGuiUpdate::curlHandle = NULL;
-
-#ifdef HAVE_PTHREAD_H
-/** \brief The download Thread ID */
-pthread_t* OrxonoxGuiUpdate::downloadThreadID = new pthread_t;
-/**   \brief The download Thread ID*/
-pthread_t* OrxonoxGuiUpdate::downloadThreadFinishID = new pthread_t;
-#endif /* HAVE_PTHREAD_H */
-/**
-   \brief A bool parameter that shows if we are downloading.
-*/
-bool OrxonoxGuiUpdate::isDownloading = false;
-
-
-/**
-   \brief Initializes a Download without displaying it.
-   \param fileInfo the FileInfo.
-
-   !! BE AWARE THIS WILL NOT BE THREADED. !!
-*/
-bool OrxonoxGuiUpdate::download(void* fileInfo)
-{
-  if(isDownloading)
-    {
-      PRINTF(2)("unable to Download. already getting some file\n");
-      return false;
-    }
-  PRINTF(3)("Downloading.\n");
-  FileInfo* info =(FileInfo*)fileInfo;
-  CURLcode res;
-  CURL* localCurl;
-  localCurl = curl_easy_init();
-  char* fileOnNet = new char [strlen(info->webRoot)+strlen(info->fileName)+2];
-  strcpy(fileOnNet, info->webRoot);
-  if(fileOnNet[strlen(fileOnNet)] != '/') //!< \todo windows-shit
-    strcat(fileOnNet, "/");
-  strcat(fileOnNet, info->fileName);
-  char* fileOnDisk = new char [strlen(info->localRoot)+strlen(info->fileName)+2];
-  strcpy(fileOnDisk, info->localRoot);
-  if(fileOnDisk[strlen(fileOnDisk)] != '/') //!< \todo windows-shit
-    strcat(fileOnDisk, "/");
-  strcat(fileOnDisk, info->fileName);
-  
-  if(localCurl)
-    {
-      
-      info->fileHandle = fopen(fileOnDisk, "w");
-      
-      curl_easy_setopt(localCurl, CURLOPT_URL, fileOnNet);
-      curl_easy_setopt(localCurl, CURLOPT_WRITEDATA, info->fileHandle);
-      curl_easy_setopt(localCurl, CURLOPT_WRITEFUNCTION, curlWriteFunc);
-      curl_easy_setopt(localCurl, CURLOPT_READFUNCTION, curlReadFunc);
-      curl_easy_setopt(localCurl, CURLOPT_NOPROGRESS, true);
-      
-      curl_easy_perform(localCurl);
-
-      curl_easy_cleanup(localCurl);
-      fclose(info->fileHandle);
-    }
-}
-
-/**
-   \brief Initializes a Download with some style.
-   \param fileInfo the FileInfo.
-   \todo release thread-lock.
-
-   Downloading with a Button that gets a different Name while downloading, and a Bar, that gets to be updated. More to be followed
-*/
-bool OrxonoxGuiUpdate::downloadWithStyle(void* fileInfo)
-{
-  if(isDownloading)
-    {
-      PRINTF(2)("unable to Download. already getting some file\n");
-      return false;
-    }
-  PRINTF(3)("Downloading.\n");
-  FileInfo* info =(FileInfo*)fileInfo;
-  CURLcode res;
-  curlHandle = curl_easy_init();
-  char* fileOnNet = new char [strlen(info->webRoot)+strlen(info->fileName)+1];
-  strcpy(fileOnNet, info->webRoot);
-  strcat(fileOnNet, info->fileName);
-  char* fileOnDisk = new char [strlen(info->localRoot)+strlen(info->fileName)+1];
-  strcpy(fileOnDisk, info->localRoot);
-  strcat(fileOnDisk, info->fileName);
-
-  if(curlHandle)
-    {
-      
-      info->fileHandle = fopen(fileOnDisk, "w");
-      
-      curl_easy_setopt(curlHandle, CURLOPT_URL, fileOnNet);
-      curl_easy_setopt(curlHandle, CURLOPT_WRITEDATA, info->fileHandle);
-      curl_easy_setopt(curlHandle, CURLOPT_WRITEFUNCTION, curlWriteFunc);
-      curl_easy_setopt(curlHandle, CURLOPT_READFUNCTION, curlReadFunc);
-      curl_easy_setopt(curlHandle, CURLOPT_NOPROGRESS, false);
-      curl_easy_setopt(curlHandle, CURLOPT_PROGRESSFUNCTION, curlProgressFunc);
-      curl_easy_setopt(curlHandle, CURLOPT_PROGRESSDATA, info->bar);
-
-      if(!isDownloading)
-	{
-#ifdef HAVE_PTHREAD_H	  
-	  pthread_join(*downloadThreadFinishID, NULL);
-#endif /* HAVE_PTHREAD_H */
-#ifdef HAVE_GTK2 
-	  info->stateButton->disconnectSignal(info->buttonSignal);
-	  info->buttonSignal = info->stateButton->connectSignal("button_press_event", info, cancelDownload);
-#endif /* HAVE_GTK2 */
-#ifdef HAVE_PTHREAD_H
-	  info->stateButton->setTitle("cancel");
-#else /* HAVE_PTHREAD_H */
-	  info->stateButton->setTitle("please wait");
-#endif /* HAVE_PTHREAD_H */
-	  
-	  //! \todo check if threads really were created.
-#ifdef HAVE_PTHREAD_H
-	  pthread_create(downloadThreadID, NULL, downloadThread, info);
-	  pthread_create(downloadThreadFinishID, NULL, downloadThreadFinished, info);  
-#else
-	  downloadThread(info);
-	  downloadThreadFinished(info);
-#endif /* HAVE_PTHREAD_H */
-	 
-	  //      res = curl_easy_perform(curlHandle);
-	  
-	  //      fclose(outfile);
-	}
-      else 
-	PRINTF(1)("thread already in use\n");
-
-    }
-  return true;
-}
-
-/**
-   \brief The downloading process(either threaded or not).
-   \param fileInfo the FileInfo.
-
-   \todo Threads get locked, if the cancel button is pressed in to small intervals.
-*/
-void* OrxonoxGuiUpdate::downloadThread(void* fileInfo)
-{
-  isDownloading = true;
-  curl_easy_perform(curlHandle);
-}
-
-/**
-   \brief Finishes a downloading process. 
-   \param fileInfo the FileInfo.
-*/
-void* OrxonoxGuiUpdate::downloadThreadFinished(void* fileInfo)
-{ 
-  FileInfo* info =(FileInfo*)fileInfo;
-#ifdef HAVE_PTHREAD_H
-  pthread_join(*downloadThreadID, NULL);
-#ifdef HAVE_GTK2 
-  gdk_threads_enter();
-#endif /* HAVE_GTK2 */
-#endif /* HAVE_PTHREAD_H */
-  if(curlHandle)
-    curl_easy_cleanup(curlHandle);
- 
-  PRINTF(3)("Closing the downloaded file.\n");
-  fclose(info->fileHandle);
-
-  if(isDownloading)
-    info->stateButton->setTitle("go on");
-  //  else
-  //    info->stateButton->setTitle("done");
-#ifdef HAVE_GTK2 
-  info->stateButton->disconnectSignal(info->buttonSignal);
-  info->buttonSignal = info->stateButton->connectSignal("button_press_event", info, updateDataFunc);
-#endif /* HAVE_GTK2 */
-  isDownloading = false;
-#ifdef HAVE_PTHREAD_H
-#ifdef HAVE_GTK2 
-  gdk_threads_leave();
-#endif /* HAVE_GTK2 */
-#endif /* HAVE_PTHREAD_H */
-
-}
-
-#ifdef HAVE_GTK2
-/**
-   \brief canceles a downloading session.
-   \param w The widget, that executed this Function.
-   \param event The event that trigered this Function.
-   \param bar The Bar, that triggered this event.
-
-   \todo canceling a session in non-threaded mode.
-*/
-gint OrxonoxGuiUpdate::cancelDownload(GtkWidget* w, GdkEventKey* event, void* bar)
-{
-#ifdef HAVE_PTHREAD_H
-  pthread_cancel(*downloadThreadID);
-#else
-  PRINTF(2)("Cannot cancle the Downloading process until after this File, because no threading was enabled");
-#endif /* HAVE_PTHREAD_H*/
-}
-#endif /* HAVE_GTK2 */
-
-#endif /* HAVE_CURL */
Index: orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_update.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_update.h	(revision 3921)
+++ 	(revision )
@@ -1,113 +1,0 @@
-/*!
-  \file orxonox_gui_update.h
-  \brief File that holds the class that creates the update-menu.
-*/
-
-#ifndef _ORXONOX_GUI_UPDATE_H
-#define _ORXONOX_GUI_UPDATE_H
-
-#include "orxonox_gui.h"
-#include <stdio.h>
-#ifdef HAVE_CURL
-#include <curl/curl.h>
-#include <curl/types.h>
-#include <curl/easy.h>
-#endif /* HAVE_CURL */
-#ifdef HAVE_PTHREAD_H
-#define _MULTI_THREADED
-#include <pthread.h>
-#endif /* HAVE_PTHREAD_H */
-using namespace std;
-
-//! Class that creates the execute-Options.
-class OrxonoxGuiUpdate
-{
- private:
-  // Defining Variables
-  char* tmpDir;                         //!< The Temporary directory.
-  char* homeDir;                        //!< The Home directory.
-  char* installDataDir;                 //!< Where to install the Data to.
-  char* installSourceDir;               //!< Where to install the Source to.
-  char* userName;                       //!< The user logged in.
-
-  bool getSystemInfo(void);
- 
-  // Window creation.
-  Frame* updateFrame;                   //!< The Frame that holds the updateOptions.
-  Box* updateBox;                       //!< The Box that holds the updateOptions.
-  CheckButton* autoUpdate;              //!< A Checkbutton to enable the automatic Updating.
-
-  
-  Button* updateDataWindowButton;       //!< A Button to update the Data of orxonox.
-  Window* updateDataWindow;             //!< A Window for the data-update.
-  Box* updateDataBox;                   //!< A Box for the Window for the Data-update.
-  ProgressBar* updateDataBar;           //!< A Bar to display the progress of the download.
-  Button* updateDataBegin;              //!< A Button to start the process.
-
-  Button* updateSourceWindowButton;     //!< A Button to update the Source of orxonox. \todo tricky
-  Window* updateSourceWindow;           //!< A Window for the Source-update.
-  Box* updateSourceBox;                 //!< A Box for the Window for the Source-update.
-  ProgressBar* updateSourceBar;         //!< A Bar to display the progress of the download.
-
-  Button* test;                         //!< will be deleted soon.
-
-#ifdef HAVE_GTK2
-  static gint updateDataFunc(GtkWidget* w, GdkEventKey* event, void* info);
-  static gint updateSourceFunc(GtkWidget* w, GdkEventKey* event, void* info);
-#endif /* HAVE_GTK2 */
-
-#ifdef HAVE_CURL
-  //! A Struct to hold information about one File to download.
-  struct FileInfo
-  {
-    char* fileName;                     //!< The Name of the file we want to get.
-    char* webRoot;                      //!< The Root of the File on The Web
-    char* localRoot;                    //!< The Root directory to put the files on the local disk.
-    FILE* fileHandle;                   //!< A fileHandler.
-
-    Button* stateButton;                //!< A button that shows either start or cancel;
-    long int buttonSignal;              //!< The Signal of the stateButton.
-    ProgressBar* bar;                   //!< The ProgressBar, that sould be updated.
-  };
-
-  static size_t curlWriteFunc(void* ptr, size_t size, size_t nmemb, FILE* stream);
-  static size_t curlReadFunc(void* ptr, size_t size, size_t nmemb, FILE* stream);
-  static int curlProgressFunc(ProgressBar* bar, double totalSize, double progress, double upTotal, double upProgress);
-
-  static CURL* curlHandle;
-#ifdef HAVE_GTK2 
-  static gint cancelDownload(GtkWidget* w, GdkEventKey* event, void* bar);
-#endif /* HAVE_GTK2 */  
-#ifdef HAVE_PTHREAD_H
-  static pthread_t* downloadThreadID;
-  static pthread_t* downloadThreadFinishID;
-#endif /* HAVE_PTHREAD_H */
-  static bool isDownloading;
-
-  static bool download(void* fileInfo);
-  static bool downloadWithStyle(void* fileInfo);
-  static void* downloadThread(void* fileInfo);
-  static void* downloadThreadFinished(void* fileInfo);
-
-  
-#endif /* HAVE_CURL */
-
- public:
-  OrxonoxGuiUpdate(void);
-  ~OrxonoxGuiUpdate(void);
-  
-  Widget* getWidget(void);
-#ifdef HAVE_CURL   
-  void updateDataWindowCreate(void);
-  Button* updateDataWindowGetButton(void);
-
-  void updateSourceWindowCreate(void);
-  Button* updateSourceWindowGetButton(void);
-
-  bool* checkForUpdates(void);
- 
-#endif /* HAVE_CURL */
-
-};
-
-#endif /* _ORXONOX_GUI_UPDATE_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_video.cc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_video.cc	(revision 3921)
+++ 	(revision )
@@ -1,187 +1,0 @@
-/* 
-   orxonox - the future of 3D-vertical-scrollers
-
-   Copyright (C) 2004 orx
-
-   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
-
-
-   ### File Specific:
-   main-programmer: Benjamin Grauer
-
-*/
-
-
-#include "orxonox_gui_video.h"
-
-#include "glincl.h"
-
-/**
-   \brief Creates the Video-Option-Frame
-*/
-OrxonoxGuiVideo::OrxonoxGuiVideo(void)
-{
-  this->videoFrame = new Frame("Video-Options:");
-  this->videoBox = new Box('v');
-  this->videoFrame->setGroupName("video");
-  
-  this->fullscreen = new CheckButton("Fullscreen-mode");
-  this->fullscreen->setFlagName("windowed", "q", 1);
-  this->fullscreen->saveability();
-  this->videoBox->fill(this->fullscreen);
-  this->resolution = new Menu("Resolution");
-  this->getResolutions(this->resolution);
-  this->resolution->saveability();
-  this->videoBox->fill(this->resolution);
-  this->wireframe = new CheckButton("WireFrame-mode");
-  this->wireframe->setFlagName("wireframe", "w", 0);
-  this->wireframe->saveability();
-  this->videoBox->fill(this->wireframe);
-
-  this->advancedWindowCreate();
-  this->videoBox->fill(this->advancedWindowGetButton());
-
-  this->videoFrame->fill(videoBox);
-}
-
-/**
-   \brief Destructs the Video-stuff
-*/
-OrxonoxGuiVideo::~OrxonoxGuiVideo(void)
-{
-  // nothing to do here.
-}
-
-/**
-   \return Returns the Video-frame
-*/
-Widget* OrxonoxGuiVideo::getWidget(void)
-{
-  return this->videoFrame;
-}
-
-
-/**
-   \brief Creates a window, and all it contains for the Source-update.
-*/
-void OrxonoxGuiVideo::advancedWindowCreate(void)
-{
-  // the button, that opens this Window.
-  this->advancedButton = new Button("advanced");
-
-  // the Window itself
-  this->advancedWindow = new Window("Advanced Video Options");
-  this->advancedWindow->setGroupName("advancedVideoOptions");
-
-  this->advancedBox = new Box('v');
-
-  // Advanced Performance Options
-  this->shadows = new CheckButton("Shadows");
-  this->shadows->saveability();
-  this->advancedBox->fill(this->shadows);
-
-  this->fog = new CheckButton("Fog");
-  this->fog->saveability();
-  this->advancedBox->fill(this->fog);
-
-  this->reflections = new CheckButton("Reflections");
-  this->reflections->saveability();
-  this->advancedBox->fill(this->reflections);
-
-  this->textures = new CheckButton("Textures");
-  this->textures->saveability();
-  this->advancedBox->fill(this->textures);
-
-  this->textureDetail = new Menu("Texture Detail", "low", "medium", "high", "lastItem");
-  this->textureDetail->saveability();
-  this->advancedBox->fill(this->textureDetail);
-
-  this->modelDetailLabel = new Label("Model Detail");
-  this->advancedBox->fill(this->modelDetailLabel);
-  this->modelDetail = new Menu("Model Detail", "low", "medium", "high", "lastItem");
-  this->modelDetail->saveability();
-  this->advancedBox->fill(this->modelDetail);
-
-  this->antiAliasingLabel = new Label("Anti-Aliasing-depth:");
-  this->advancedBox->fill(this->antiAliasingLabel);
-  this->antiAliasing = new Menu("Anti Aliasing", "0", "1", "2", "4", "8",  "lastItem");
-  this->antiAliasing->saveability();
-  this->advancedBox->fill(this->antiAliasing);
-
-  this->filterMethodLabel = new Label("Filtering Method:");
-  this->advancedBox->fill(this->filterMethodLabel);
-  this->filterMethod = new Menu("Filtering Method", "none", "linear", "bilinear", "trilinear", "anisortopic", "lastItem");
-  this->filterMethod->saveability();
-  this->advancedBox->fill(this->filterMethod);
-  
-  this->closeButton = new Button("close");
-  this->advancedBox->fill(this->closeButton);
-
-  this->advancedWindow->fill(advancedBox);
-#ifdef HAVE_GTK2 
-  this->advancedButton->connectSignal("button_press_event", this->advancedWindow, Window::windowOpen);
-  this->closeButton->connectSignal("button_press_event", this->advancedWindow, Window::windowClose);
-  this->advancedWindow->connectSignal("destroy", this->advancedWindow, Window::windowClose);
-  this->advancedWindow->connectSignal("delete_event", this->advancedWindow, Window::windowClose);
-#endif /* HAVE_GTK2 */
-   Window::addWindow(this->advancedWindow);
-
-}
-
-/**
-   \returns A Pointer to the Button of the UpdaterSourceWindow
-*/
-Button* OrxonoxGuiVideo::advancedWindowGetButton(void)
-{
-  return this->advancedButton;
-}
-
-void OrxonoxGuiVideo::getResolutions(Menu* menu)
-{
-  SDL_Init(SDL_INIT_VIDEO);
-  SDL_Rect **modes;
-  int i;
-  int x = 0,y =0; // check for difference
-  char tmpChar[100];
-  
-  /* Get available fullscreen/hardware modes */
-  modes=SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_HWSURFACE);
-  
-  /* Check is there are any modes available */
-  if(modes == (SDL_Rect **)0){
-    PRINTF(2)("No video-modes available!\n");
-    exit(-1);
-  }
-  
-  /* Check if our resolution is restricted */
-  if(modes == (SDL_Rect **)-1){
-    PRINTF(2)("All resolutions available.\n");
-  }
-  else{
-    /* Print valid modes */
-    PRINT(4)("Available Modes\n");
-    for(i = 0; modes[i] ;++i)
-      {
-	if (x != modes[i]->w || y != modes[i]->h)
-	  { 
-	    PRINT(4)("  %d x %d\n", modes[i]->w, modes[i]->h);
-	    sprintf(tmpChar, "%dx%d", modes[i]->w, modes[i]->h);
-	    menu->addItem(tmpChar);
-	    x = modes[i]->w; y = modes[i]->h;
-	  }
-      }
-  }
-  SDL_Quit();
-}
Index: orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_video.h
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/orxonox_gui_video.h	(revision 3921)
+++ 	(revision )
@@ -1,54 +1,0 @@
-/*!
-  \file orxonox_gui_video.h
-  \brief File that holds the class that creates the Video-Options.
-*/
-#ifndef _ORXONOX_GUI_VIDEO_H
-#define _ORXONOX_GUI_VIDEO_H
-
-#include "orxonox_gui.h"
-
-//! Class that creates the Video-Options.
-class OrxonoxGuiVideo
-{
- private:
-  Frame* videoFrame;        //!< The Frame that holds the video options.
-  Box* videoBox;            //!< The Box that holds the video options.
-  CheckButton* fullscreen;  //!< CheckButton for fullscreen-mode
-  Menu* resolution;         //!< Menu for the resolution
-  CheckButton* wireframe;   //!< CheckButton for wireframe Mode.
-
-  // advanced-Performance-Options
-  Window* advancedWindow;   //!< A Window to display advanced options.
-  Button* advancedButton;   //!< A Button to open the Advanced Video Performance Window.
-  Box* advancedBox;         //!< A Box to pack the options into.
-  CheckButton* shadows;     //!< CheckButton for shadows
-  CheckButton* fog;         //!< CheckButton for fog.
-  CheckButton* reflections; //!< CheckButton for reflections
-  CheckButton* textures;    //!< CheckButton for textures
-  Menu* textureDetail;      //!< Menu for the Texture-Detail.
-  
-  Label* modelDetailLabel;  //!< Label for model-detail.
-  Menu* modelDetail;        //!< model-detail.
-  
-  Label* antiAliasingLabel; //!< Label for the anti-aliasing mode.
-  Menu* antiAliasing;       //!< Menu for the Antialiasing-mode.
-
-  Label* filterMethodLabel; //!< Label for filtering-Method.
-  Menu* filterMethod;       //!< Menu for filtering Method.
-
-  Button* closeButton;      //!< A Button to close the Advanced-settingsWindow.
-
-  Button* advancedWindowGetButton(void);
-  void advancedWindowCreate(void);
-  
- public:
-  OrxonoxGuiVideo(void);
-  ~OrxonoxGuiVideo(void);
-
-  Widget* getWidget(void);
-
-  void getResolutions(Menu* menu);
-  
-
-};
-#endif /* _ORXONOX_GUI_VIDEO_H */
Index: orxonox/branches/openAL/src/lib/gui/gui/rc
===================================================================
--- orxonox/branches/openAL/src/lib/gui/gui/rc	(revision 3921)
+++ orxonox/branches/openAL/src/lib/gui/gui/rc	(revision 4194)
@@ -1,139 +1,139 @@
-# pixmap_path "<dir 1>:<dir 2>:<dir 3>:..."
-#
-pixmap_path "/usr/include/X11R6/pixmaps:/home/imain/pixmaps"
-#
-# style <name> [= <name>]
-# {
-#   <option>
-# }
-#
-# widget <widget_set> style <style_name>
-# widget_class <widget_class_set> style <style_name>
-
-# Here is a list of all the possible states.  Note that some do not apply to
-# certain widgets.
-#
-# NORMAL - The normal state of a widget, without the mouse over top of
-# it, and not being pressed, etc.
-#
-# PRELIGHT - When the mouse is over top of the widget, colors defined
-# using this state will be in effect.
-#
-# ACTIVE - When the widget is pressed or clicked it will be active, and
-# the attributes assigned by this tag will be in effect.
-#
-# INSENSITIVE - When a widget is set insensitive, and cannot be
-# activated, it will take these attributes.
-#
-# SELECTED - When an object is selected, it takes these attributes.
-#
-# Given these states, we can set the attributes of the widgets in each of
-# these states using the following directives.
-#
-# fg - Sets the foreground color of a widget.
-# bg - Sets the background color of a widget.
-# bg_pixmap - Sets the background of a widget to a tiled pixmap.
-# font - Sets the font to be used with the given widget.
-#
-
-# This sets a style called "button".  The name is not really important, as
-# it is assigned to the actual widgets at the bottom of the file.
-
-style "window"
-{
-  #This sets the padding around the window to the pixmap specified.
-  #bg_pixmap[<STATE>] = "<pixmap filename>"
-  #bg_pixmap[NORMAL] = "warning.xpm"
-  bg[NORMAL] = { 0, 0, 0 }
-  fg[NORMAL] = { 0, 1.0, 0 }
-  base[NORMAL] = { 0, 0, 0 }
-  base[INSENSITIVE] = { 0, 0, 0 }
-}
-
-style "scale"
-{
-  #Sets the foreground color (font color) to red when in the "NORMAL"
-  #state.
-  
-  fg[NORMAL] = { 0, 1.0, 0 }
-  bg[NORMAL] = { 0, 1.0, 0 }
-  bg[INSENSITIVE] = { 0, 1.0, 0 }
-  bg[PRELIGHT] = { 0, 1.0, 0 }
-  bg[ACTIVE] =   {0.2, 0.2, 0.2 }
-  
-  #Sets the background pixmap of this widget to that of its parent.
-  bg_pixmap[NORMAL] = "<parent>"
-}
-
-style "button"
-{
-  # This shows all the possible states for a button.  The only one that
-  # doesn't apply is the SELECTED state.
-  
-  fg[PRELIGHT] = { 0, 0, 0 }
-  bg[PRELIGHT] = { 0, 1.0, 0 }
-  bg[ACTIVE] = { 0, 1.0, 0 }
-  fg[ACTIVE] = { 0, 1.0, 0 }
-  bg[NORMAL] = { 0, 0, 0 }
-  fg[NORMAL] = { 0, 1.0, 0 }
-  bg[INSENSITIVE] = { 1.0, 0, 1.0 }
-  fg[INSENSITIVE] = { 1.0, 0, 1.0 }
-  base[NORMAL] = { 0, 1.0, 0 }
-  base[PRELIGHT] = { 0, 1.0, 0 }
-}
-
-# In this example, we inherit the attributes of the "button" style and then
-# override the font and background color when prelit to create a new
-# "main_button" style.
-
-style "main_button" = "button"
-{
-  font = "-adobe-helvetica-medium-r-normal--*-100-*-*-*-*-*-*"
-  bg[PRELIGHT] = { 0, 0.75, 0 }
-}
-
-style "toggle_button" = "button"
-{
-  fg[NORMAL] = { 0, 1.0, 0 }
-  fg[ACTIVE] = { 0, 1.0, 0 }
-  text[NORMAL] = { 0, 0, 0}
-  # This sets the background pixmap of the toggle_button to that of its
-  # parent widget (as defined in the application).
-  #bg_pixmap[NORMAL] = "<parent>"
-}
-
-style "text"
-{
-  #bg_pixmap[NORMAL] = "marble.xpm"
-  fg[NORMAL] = { 0, 1.0, 0 }
-}
-
-style "ruler"
-{
-  font = "-adobe-helvetica-medium-r-normal--*-20-*-*-*-*-*-*"
-}
-
-# pixmap_path "~/.pixmaps"
-
-# These set the widget types to use the styles defined above.
-# The widget types are listed in the class hierarchy, but could probably be
-# just listed in this document for the users reference.
-
-widget_class "GtkWindow"           style "window"
-widget_class "GtkFrame"            style "window"
-widget_class "Gtk*EventBox"        style "window"
-widget_class "GtkDialog"           style "window"
-widget_class "GtkFileSelection"    style "window"
-widget_class "*Gtk*Scale"          style "scale"
-widget_class "*GtkCheckButton*"    style "toggle_button"
-widget_class "*Gtk*Menu*"          style "toggle_button"
-widget_class "*GtkRadioButton*"    style "toggle_button"
-widget_class "*GtkButton*"         style "button"
-widget_class "*Ruler"              style "ruler"
-widget_class "*GtkText"            style "text"
-widget_class "*GtkLabel"           style "text"
+/*
+ * style <name> [= <name>]
+ * {
+ *   <option>
+ * }
+ *
+ * widget <widget_set> style <style_name>
+ * widget_class <widget_class_set> style <style_name>
+ *
+ * Here is a list of all the possible states.  Note that some do not apply to
+ * certain widgets.
+ *
+ * NORMAL - The normal state of a widget, without the mouse over top of
+ * it, and not being pressed, etc.
+ *
+ * PRELIGHT - When the mouse is over top of the widget, colors defined
+ * using this state will be in effect.
+ *
+ * ACTIVE - When the widget is pressed or clicked it will be active, and
+ * the attributes assigned by this tag will be in effect.
+ *
+ * INSENSITIVE - When a widget is set insensitive, and cannot be
+ * activated, it will take these attributes.
+ *
+ * SELECTED - When an object is selected, it takes these attributes.
+ *
+ * Given these states, we can set the attributes of the widgets in each of
+ * these states using the following directives.
+ *
+ * fg - Sets the foreground color of a widget.
+ * bg - Sets the background color of a widget.
+ * bg_pixmap - Sets the background of a widget to a tiled pixmap.
+ * base - Sets the base of Widgets
+ * font - Sets the font to be used with the given widget.
+*/
 
 
-# This sets all the buttons that are children of the "main window" to
-# the main_button style.  These must be documented to be taken advantage of.
-widget "main window.*GtkButton*" style "main_button"
+
+static const gchar* rc_string =
+(
+"style'orxonox'"
+"{"
+"fg[NORMAL]      = { 0.0, 1.0, 0.0 }"
+"fg[PRELIGHT]    = { 0.0, 1.0, 0.0 }"
+"fg[ACTIVE]      = { 0.0, 1.0, 0.0 }"
+"fg[INSENSITIVE] = { 0.0, 0.8, 0.0 }"
+"fg[SELECTED]    = { 0.0, 1.0, 0.0 }"
+
+"bg[NORMAL]      = { 0.0, 0.0, 0.0 }"
+"bg[PRELIGHT]    = { 0.0, 1.0, 0.0 }"
+"bg[ACTIVE]      = { 0.0, 0.3, 0.0 }"
+"bg[INSENSITIVE] = { 0.0, 0.1, 0.0 }"
+"bg[SELECTED]    = { 0.0, 0.1, 0.0 }"
+
+"base[NORMAL]      = { 0.0, 1.0, 0.0 }"
+"base[PRELIGHT]    = { 0.0, 1.0, 0.0 }"
+"base[ACTIVE]      = { 0.0, 1.0, 0.0 }"
+"base[INSENSITIVE] = { 0.0, 1.0, 0.0 }"
+"base[SELECTED]    = { 0.0, 1.0, 0.0 }"
+
+"font              = '-adobe-helvetica-medium-r-normal--*-100-*-*-*-*-*-*'"
+"}"
+
+"style'window'"
+"{"			
+"bg[NORMAL] = { 0, 0, 0 }"
+"fg[NORMAL] = { 0, 1.0, 0 }"
+"base[NORMAL] = { 0, 0, 0 }"
+"base[INSENSITIVE] = { 0, 0, 0 }"
+"}"
+
+"style'frame'"
+"{"
+"bg[NORMAL]  = { 0.0, 0.4, 0.0 }"
+"}"
+
+"style'scale'"
+"{"
+"fg[NORMAL] = { 0, 1.0, 0 }"
+"bg[NORMAL] = { 0, 1.0, 0 }"
+"bg[INSENSITIVE] = { 0, 1.0, 0 }"
+"bg[PRELIGHT] = { 0, 1.0, 0 }"
+"bg[ACTIVE] =   {0.2, 0.2, 0.2 }"
+"}"
+
+"style'button'"
+"{"
+"fg[PRELIGHT] = { 0, 0, 0 }"
+"bg[PRELIGHT] = { 0, 1.0, 0 }"
+"bg[ACTIVE] = { 0, 1.0, 0 }"
+"fg[ACTIVE] = { 0, 1.0, 0 }"
+"bg[NORMAL] = { 0, 0, 0 }"
+"fg[NORMAL] = { 0, 1.0, 0 }"
+"bg[INSENSITIVE] = { 0.0, 0.2, 0.0 }"
+"fg[INSENSITIVE] = { 0.0, 0.8, 0.0 }"
+"base[NORMAL] = { 0, 1.0, 0 }"
+"base[PRELIGHT] = { 0, 1.0, 0 }"
+"}"
+
+"style'main_button' = 'button'"
+"{"
+"font = '-adobe-helvetica-medium-r-normal--*-100-*-*-*-*-*-*'"
+"bg[PRELIGHT] = { 0, 0.75, 0 }"
+"}"
+
+"style'toggle_button' = 'button'"
+"{"
+"fg[NORMAL] = { 0, 1.0, 0 }"
+"fg[ACTIVE] = { 0, 1.0, 0 }"
+"text[NORMAL] = { 0, 0, 0}"
+"}"
+
+"style'text'"
+"{"
+"fg[NORMAL] = { 0, 1.0, 0 }"
+"}"
+
+"style'ruler'"
+"{"
+"font = '-adobe-helvetica-medium-r-normal--*-20-*-*-*-*-*-*'"
+"}"
+
+"widget'Gtk*'			style'orxonox'"
+"widget'*Gtk*Frame*'              style'frame'"
+"widget'GtkWindow'		style'window'"
+"widget'GtkFileSelection'	style'window'"
+"widget'*Gtk*Scale'		style'scale'"
+"widget'*GtkCheckButton*'	style'toggle_button'"
+"widget'*Gtk*Menu*'		style'toggle_button'"
+"widget'*GtkRadioButton*'	style'toggle_button'"
+"widget'*GtkButton*'		style'button'"
+"widget'*Ruler'			style'ruler'"
+"widget'*GtkText'		style'text'"
+"widget'*GtkLabel'		style'text'"
+
+"widget'main window.*GtkButton*' style 'main_button'"
+
+
+);
Index: orxonox/branches/openAL/src/lib/math/quaternion.h
===================================================================
--- orxonox/branches/openAL/src/lib/math/quaternion.h	(revision 3921)
+++ 	(revision )
@@ -1,413 +1,0 @@
-/*! 
-    \file vector.h
-    \brief A basic 3D math framework
-    
-    Contains classes to handle vectors, lines, rotations and planes
-*/ 
-
-#ifndef _QUATERNION_H
-#define _QUATERNION_H
-
-#include <math.h>
-//! PI the circle-constant
-
-//! Quaternion
-/**
-	Class to handle 3-dimensional rotation efficiently
-*/
-class Quaternion
-{
- public:
-  Vector v;	//!< Imaginary Vector
-  float w;        //!< Real part of the number
-  
-  Quaternion ();
-  Quaternion (float m[4][4]);
-  Quaternion (float angle, const Vector& axis);
-  Quaternion (const Vector& dir, const Vector& up);
-  Quaternion (float roll, float pitch, float yaw);
-  
-  Quaternion operator/ (const float& f) const;
-  Quaternion operator* (const float& f) const;
-  Quaternion operator* (const Quaternion& q) const;
-  Quaternion operator+ (const Quaternion& q) const;
-  Quaternion operator- (const Quaternion& q) const;
-  Quaternion conjugate () const;
-  Quaternion inverse () const;
-  Vector apply (Vector& f) const;
-  float norm () const;
-  void matrix (float m[4][4]) const;
-  void quatSlerp(const Quaternion* from, const Quaternion* to, const float t, Quaternion* res);
-  
-  void debug();
- private:
-  float DELTA;      //!< resolution of calculation
-
-};
-
-
-/**
-	\brief creates a multiplicational identity Quaternion
-*/
-Quaternion::Quaternion ()
-{
-	w = 1;
-	v = Vector(0,0,0);
-}
-
-/**
-	\brief turns a rotation along an axis into a Quaternion
-	\param angle: the amount of radians to rotate
-	\param axis: the axis to rotate around
-*/
-Quaternion::Quaternion (float angle, const Vector& axis)
-{
-	w = cos(angle/2);
-	v = axis * sin(angle/2);
-}
-
-/**
-   \brief calculates a lookAt rotation
-   \param dir: the direction you want to look
-   \param up: specify what direction up should be
-   
-   Mathematically this determines the rotation a (0,0,1)-Vector has to undergo to point
-   the same way as dir. If you want to use this with cameras, you'll have to reverse the
-   dir Vector (Vector(0,0,0) - your viewing direction) or you'll point the wrong way. You
-   can use this for meshes as well (then you do not have to reverse the vector), but keep 
-   in mind that if you do that, the model's front has to point in +z direction, and left 
-   and right should be -x or +x respectively or the mesh wont rotate correctly.
-*/
-Quaternion::Quaternion (const Vector& dir, const Vector& up)
-{
-  Vector z = dir;
-  z.normalize(); 
-  Vector x = up.cross(z);
-  x.normalize(); 
-  Vector y = z.cross(x);
-  
-  float m[4][4];
-  m[0][0] = x.x;
-  m[0][1] = x.y;
-  m[0][2] = x.z;
-  m[0][3] = 0;
-  m[1][0] = y.x;
-  m[1][1] = y.y;
-  m[1][2] = y.z;
-  m[1][3] = 0;
-  m[2][0] = z.x;
-  m[2][1] = z.y;
-  m[2][2] = z.z;
-  m[2][3] = 0;
-  m[3][0] = 0;
-  m[3][1] = 0;
-  m[3][2] = 0;
-  m[3][3] = 1;
-  
-  *this = Quaternion (m);
-}
-
-/**
-	\brief calculates a rotation from euler angles
-	\param roll: the roll in radians
-	\param pitch: the pitch in radians
-	\param yaw: the yaw in radians
-	
-	I DO HONESTLY NOT EXACTLY KNOW WHICH ANGLE REPRESENTS WHICH ROTATION. And I do not know 
-	in what order they are applied,	I just copy-pasted the code.
-*/
-Quaternion::Quaternion (float roll, float pitch, float yaw)
-{
-	float cr, cp, cy, sr, sp, sy, cpcy, spsy;
-	
-	// calculate trig identities
-	cr = cos(roll/2);
-	cp = cos(pitch/2);
-	cy = cos(yaw/2);
-	
-	sr = sin(roll/2);
-	sp = sin(pitch/2);
-	sy = sin(yaw/2);
-	
-	cpcy = cp * cy;
-	spsy = sp * sy;
-	
-	w = cr * cpcy + sr * spsy;
-	v.x = sr * cpcy - cr * spsy;
-	v.y = cr * sp * cy + sr * cp * sy;
-	v.z = cr * cp * sy - sr * sp * cy;
-}
-
-/**
-	\brief rotates one Quaternion by another
-	\param q: another Quaternion to rotate this by
-	\return a quaternion that represents the first one rotated by the second one (WARUNING: this operation is not commutative! e.g. (A*B) != (B*A))
-*/
-Quaternion Quaternion::operator*(const Quaternion& q) const
-{
-	float A, B, C, D, E, F, G, H;
-	Quaternion r;
-	
-	A = (w   + v.x)*(q.w   + q.v.x);
-	B = (v.z - v.y)*(q.v.y - q.v.z);
-	C = (w   - v.x)*(q.v.y + q.v.z); 
-	D = (v.y + v.z)*(q.w   - q.v.x);
-	E = (v.x + v.z)*(q.v.x + q.v.y);
-	F = (v.x - v.z)*(q.v.x - q.v.y);
-	G = (w   + v.y)*(q.w   - q.v.z);
-	H = (w   - v.y)*(q.w   + q.v.z);
-	
-	r.w = B +  (-E - F + G + H)/2;
-	r.v.x = A - (E + F + G + H)/2; 
-	r.v.y = C + (E - F + G - H)/2; 
-	r.v.z = D + (E - F - G + H)/2;
-	
-	return r;
-}
-
-/**
-	\brief add two Quaternions
-	\param q: another Quaternion
-	\return the sum of both Quaternions
-*/
-Quaternion Quaternion::operator+(const Quaternion& q) const
-{
-	Quaternion r(*this);
-	r.w = r.w + q.w;
-	r.v = r.v + q.v;
-	return r;
-}
-
-/**
-	\brief subtract two Quaternions
-	\param q: another Quaternion
-	\return the difference of both Quaternions
-*/
-Quaternion Quaternion::operator- (const Quaternion& q) const
-{
-	Quaternion r(*this);
-	r.w = r.w - q.w;
-	r.v = r.v - q.v;
-	return r;
-}
-
-/**
-	\brief rotate a Vector by a Quaternion
-	\param v: the Vector
-	\return a new Vector representing v rotated by the Quaternion
-*/
-Vector Quaternion::apply (Vector& v) const
-{
-	Quaternion q;
-	q.v = v;
-	q.w = 0;
-	q = *this * q * conjugate();
-	return q.v;
-}
-
-/**
-	\brief multiply a Quaternion with a real value
-	\param f: a real value
-	\return a new Quaternion containing the product
-*/
-Quaternion Quaternion::operator*(const float& f) const
-{
-	Quaternion r(*this);
-	r.w = r.w*f;
-	r.v = r.v*f;
-	return r;
-}
-
-/**
-	\brief divide a Quaternion by a real value
-	\param f: a real value
-	\return a new Quaternion containing the quotient
-*/
-Quaternion Quaternion::operator/(const float& f) const
-{
-	if( f == 0) return Quaternion();
-	Quaternion r(*this);
-	r.w = r.w/f;
-	r.v = r.v/f;
-	return r;
-}
-
-/**
-	\brief calculate the conjugate value of the Quaternion
-	\return the conjugate Quaternion
-*/
-Quaternion Quaternion::conjugate() const
-{
-	Quaternion r(*this);
-	r.v = Vector() - r.v;
-	return r;
-}
-
-/**
-	\brief calculate the norm of the Quaternion
-	\return the norm of The Quaternion
-*/
-float Quaternion::norm() const
-{
-	return w*w + v.x*v.x + v.y*v.y + v.z*v.z;
-}
-
-/**
-	\brief calculate the inverse value of the Quaternion
-	\return the inverse Quaternion
-	
-	Note that this is equal to conjugate() if the Quaternion's norm is 1
-*/
-Quaternion Quaternion::inverse() const
-{
-	float n = norm();
-	if (n != 0)
-	{
-		return conjugate() / norm();
-	}
-	else return Quaternion();
-}
-
-/**
-	\brief convert the Quaternion to a 4x4 rotational glMatrix
-	\param m: a buffer to store the Matrix in
-*/
-void Quaternion::matrix (float m[4][4]) const
-{
-  float wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2; 
-  
-  // calculate coefficients
-  x2 = v.x + v.x;
-  y2 = v.y + v.y; 
-  z2 = v.z + v.z;
-  xx = v.x * x2; xy = v.x * y2; xz = v.x * z2;
-  yy = v.y * y2; yz = v.y * z2; zz = v.z * z2;
-  wx = w * x2; wy = w * y2; wz = w * z2;
-  
-  m[0][0] = 1.0 - (yy + zz); m[1][0] = xy - wz;
-  m[2][0] = xz + wy; m[3][0] = 0.0;
-	
-  m[0][1] = xy + wz; m[1][1] = 1.0 - (xx + zz);
-  m[2][1] = yz - wx; m[3][1] = 0.0;
-  
-  m[0][2] = xz - wy; m[1][2] = yz + wx;
-  m[2][2] = 1.0 - (xx + yy); m[3][2] = 0.0;
-  
-  m[0][3] = 0; m[1][3] = 0;
-  m[2][3] = 0; m[3][3] = 1;
-}
-
-/**
-   \brief performs a smooth move.
-   \param from from where
-   \param to to where
-   \param t the time this transformation should take
-   \param res The approximation-density
-*/
-void Quaternion::quatSlerp(const Quaternion* from, const Quaternion* to, float t, Quaternion* res)
-{
-  float tol[4];
-  double omega, cosom, sinom, scale0, scale1;
-  DELTA = 0.2;
-
-  cosom = from->v.x * to->v.x + from->v.y * to->v.y + from->v.z * to->v.z + from->w * to->w;
-
-  if( cosom < 0.0 ) 
-    { 
-      cosom = -cosom; 
-      tol[0] = -to->v.x;
-      tol[1] = -to->v.y;
-      tol[2] = -to->v.z;
-      tol[3] = -to->w;
-    }
-  else
-    {
-      tol[0] = to->v.x;
-      tol[1] = to->v.y;
-      tol[2] = to->v.z;
-      tol[3] = to->w;
-    }
-  
-  //if( (1.0 - cosom) > DELTA )
-  //{
-      omega = acos(cosom);
-      sinom = sin(omega);
-      scale0 = sin((1.0 - t) * omega) / sinom;
-      scale1 = sin(t * omega) / sinom;
-      //}
-      /*
-  else
-    {
-      scale0 = 1.0 - t;
-      scale1 = t;
-    }
-      */
-  res->v.x = scale0 * from->v.x + scale1 * tol[0];
-  res->v.y = scale0 * from->v.y + scale1 * tol[1];
-  res->v.z = scale0 * from->v.z + scale1 * tol[2];
-  res->w = scale0 * from->w + scale1 * tol[3];
-}
-
-
-/**
-   \brief convert a rotational 4x4 glMatrix into a Quaternion
-   \param m: a 4x4 matrix in glMatrix order
-*/
-Quaternion::Quaternion (float m[4][4])
-{
-	
-  float  tr, s, q[4];
-  int    i, j, k;
-
-  int nxt[3] = {1, 2, 0};
-
-  tr = m[0][0] + m[1][1] + m[2][2];
-
-  	// check the diagonal
-  if (tr > 0.0) 
-  {
-    s = sqrt (tr + 1.0);
-    w = s / 2.0;
-    s = 0.5 / s;
-    v.x = (m[1][2] - m[2][1]) * s;
-    v.y = (m[2][0] - m[0][2]) * s;
-    v.z = (m[0][1] - m[1][0]) * s;
-	} 
-	else 
-	{
- 		// diagonal is negative
-  	i = 0;
-  	if (m[1][1] > m[0][0]) i = 1;
-    if (m[2][2] > m[i][i]) i = 2;
-    j = nxt[i];
-    k = nxt[j];
-
-    s = sqrt ((m[i][i] - (m[j][j] + m[k][k])) + 1.0);
-      
-    q[i] = s * 0.5;
-            
-    if (s != 0.0) s = 0.5 / s;
-	
-	  q[3] = (m[j][k] - m[k][j]) * s;
-    q[j] = (m[i][j] + m[j][i]) * s;
-    q[k] = (m[i][k] + m[k][i]) * s;
-
-  	v.x = q[0];
-  	v.y = q[1];
-  	v.z = q[2];
-  	w = q[3];
-  }
-}
-
-/**
-   \brief outputs some nice formated debug information about this quaternion
-*/
-void Quaternion::debug(void)
-{
-  PRINT(0)("Quaternion Debug Information\n");
-  PRINT(0)("real a=%f; imag: x=%f y=%f z=%f\n", w, v.x, v.y, v.z);
-}
-
-
-
-#endif /* _QUATERNION_H */
Index: orxonox/branches/openAL/src/lib/math/vector.cc
===================================================================
--- orxonox/branches/openAL/src/lib/math/vector.cc	(revision 3921)
+++ orxonox/branches/openAL/src/lib/math/vector.cc	(revision 4194)
@@ -100,17 +100,17 @@
 */
 
-Vector* Vector::getNormalized()
+Vector Vector::getNormalized()
 {
   float l = len();
   if(unlikely(l != 1.0))
     {
-      return this;
+      return *this;
     }
   else if(unlikely(l == 0.0))
     {
-      return 0;
+      return *this;
     }
 
-  return new Vector(x / l, y /l, z / l);
+  return *this / l;
 }
 
@@ -172,5 +172,5 @@
    \brief Outputs the values of the Vector
 */
-void Vector::debug(void)
+void Vector::debug(void) const
 {
   PRINT(0)("Vector Debug information\n");
@@ -435,51 +435,61 @@
 /**
    \brief performs a smooth move.
-   \param from from where
-   \param to to where
-   \param t the time this transformation should take
-   \param res The approximation-density
-*/
-void Quaternion::quatSlerp(const Quaternion* from, const Quaternion* to, float t, Quaternion* res)
+   \param from  where
+   \param to where
+   \param t the time this transformation should take value [0..1]
+
+   \returns the Result of the smooth move
+*/
+Quaternion quatSlerp(const Quaternion& from, const Quaternion& to, float t)
 {
   float tol[4];
   double omega, cosom, sinom, scale0, scale1;
-  DELTA = 0.2;
-
-  cosom = from->v.x * to->v.x + from->v.y * to->v.y + from->v.z * to->v.z + from->w * to->w;
+  //  float DELTA = 0.2;
+
+  cosom = from.v.x * to.v.x + from.v.y * to.v.y + from.v.z * to.v.z + from.w * to.w;
 
   if( cosom < 0.0 ) 
     { 
       cosom = -cosom; 
-      tol[0] = -to->v.x;
-      tol[1] = -to->v.y;
-      tol[2] = -to->v.z;
-      tol[3] = -to->w;
+      tol[0] = -to.v.x;
+      tol[1] = -to.v.y;
+      tol[2] = -to.v.z;
+      tol[3] = -to.w;
     }
   else
     {
-      tol[0] = to->v.x;
-      tol[1] = to->v.y;
-      tol[2] = to->v.z;
-      tol[3] = to->w;
+      tol[0] = to.v.x;
+      tol[1] = to.v.y;
+      tol[2] = to.v.z;
+      tol[3] = to.w;
     }
   
   //if( (1.0 - cosom) > DELTA )
   //{
-      omega = acos(cosom);
-      sinom = sin(omega);
-      scale0 = sin((1.0 - t) * omega) / sinom;
-      scale1 = sin(t * omega) / sinom;
-      //}
-      /*
-  else
+  omega = acos(cosom);
+  sinom = sin(omega);
+  scale0 = sin((1.0 - t) * omega) / sinom;
+  scale1 = sin(t * omega) / sinom;
+  //}
+  /*
+    else
     {
-      scale0 = 1.0 - t;
-      scale1 = t;
+    scale0 = 1.0 - t;
+    scale1 = t;
     }
-      */
-  res->v.x = scale0 * from->v.x + scale1 * tol[0];
-  res->v.y = scale0 * from->v.y + scale1 * tol[1];
-  res->v.z = scale0 * from->v.z + scale1 * tol[2];
-  res->w = scale0 * from->w + scale1 * tol[3];
+  */
+
+
+  /*
+    Quaternion res;
+    res.v.x = scale0 * from.v.x + scale1 * tol[0];
+    res.v.y = scale0 * from.v.y + scale1 * tol[1];
+    res.v.z = scale0 * from.v.z + scale1 * tol[2];
+    res.w = scale0 * from.w + scale1 * tol[3];
+  */
+  return Quaternion(Vector(scale0 * from.v.x + scale1 * tol[0],
+			   scale0 * from.v.y + scale1 * tol[1],
+			   scale0 * from.v.z + scale1 * tol[2]),
+		    scale0 * from.w + scale1 * tol[3]);
 }
 
Index: orxonox/branches/openAL/src/lib/math/vector.h
===================================================================
--- orxonox/branches/openAL/src/lib/math/vector.h	(revision 3921)
+++ orxonox/branches/openAL/src/lib/math/vector.h	(revision 4194)
@@ -31,10 +31,16 @@
 
   inline Vector operator+ (const Vector& v) const { return Vector(x + v.x, y + v.y, z + v.z); }
+  inline const Vector& operator+= (const Vector& v) {this->x += v.x; this->y += v.y; this->z += v.z; return *this;}
   inline Vector operator- (const Vector& v) const { return Vector(x - v.x, y - v.y, z - v.z); }
+  inline const Vector& operator-= (const Vector& v) {this->x -= v.x; this->y -= v.y; this->z -= v.z; return *this;}
   inline float operator* (const Vector& v) const { return x * v.x + y * v.y + z * v.z; }
+  inline const Vector& operator*= (const Vector& v) {this->x *= v.x; this->y *= v.y; this->z *= v.z; return *this;}
   inline Vector operator* (float f) const { return Vector(x * f, y * f, z * f); }
+  inline const Vector& operator*= (float f) {this->x *= f; this->y *= f; this->z *= f; return *this;}
   Vector operator/ (float f) const;
+  inline const Vector& operator/= (float f) {this->x /= f; this->y /= f; this->z /= f; return *this;}
+  inline const Vector& operator= (const Vector& v) {this->x = v.x; this->y = v.y; this->z = v.z; return *this;}
   float dot (const Vector& v) const;
-  inline Vector cross (const Vector& v) const {  return Vector(y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x ); }
+  inline Vector cross (const Vector& v) const { return Vector(y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x ); }
   void scale(const Vector& v);
   inline float len() const { return sqrt (x*x+y*y+z*z); }
@@ -50,8 +56,8 @@
 		      z = z / l; 
                     }
-  Vector* getNormalized();
+  Vector getNormalized();
   Vector abs();
 
-  void debug();
+  void debug() const;
 };
 
@@ -70,5 +76,5 @@
   
   inline Quaternion () { w = 1; v = Vector(0,0,0); }
-  inline Quaternion (const Vector& b, float a) { w = a; v = b; }
+  inline Quaternion (const Vector& v, float f) { this->w = f; this->v = v; }
   Quaternion (float m[4][4]);
   inline Quaternion (float angle, const Vector& axis) { w = cos(angle/2); v = axis * sin(angle/2); }
@@ -76,8 +82,14 @@
   Quaternion (float roll, float pitch, float yaw);
   Quaternion operator/ (const float& f) const;
+  inline const Quaternion operator/= (const float& f) {*this = *this / f; return *this;}
   Quaternion operator* (const float& f) const;
+  inline const Quaternion operator*= (const float& f) {*this = *this * f; return *this;}
   Quaternion operator* (const Quaternion& q) const;
+  inline const Quaternion operator*= (const Quaternion& q) {*this = *this * q; return *this;}
   inline Quaternion operator+ (const Quaternion& q) const { return Quaternion(q.v + v, q.w + w); }
+  inline const Quaternion& operator+= (const Quaternion& q) {this->v += q.v; this->w += q.w; return *this;}
   inline Quaternion operator- (const Quaternion& q) const { return Quaternion(q.v - v, q.w - w); }
+  inline const Quaternion& operator-= (const Quaternion& q) {this->v -= q.v; this->w -= q.w; return *this;}
+  inline Quaternion operator= (const Quaternion& q) {this->v = q.v; this->w = q.w; return *this;}
   Quaternion conjugate () const {  Quaternion r(*this);
   r.v = Vector() - r.v;
@@ -87,11 +99,11 @@
   float norm () const;
   void matrix (float m[4][4]) const;
-  void quatSlerp(const Quaternion* from, const Quaternion* to, const float t, Quaternion* res);
   
   void debug();
- private:
-  float DELTA;      //!< resolution of calculation
+};
 
-};
+Quaternion quatSlerp(const Quaternion& from, const Quaternion& to, float t);
+
+
 
 //! 3D rotation (OBSOLETE)
Index: orxonox/branches/openAL/src/lib/math/vector_new.h
===================================================================
--- orxonox/branches/openAL/src/lib/math/vector_new.h	(revision 3921)
+++ 	(revision )
@@ -1,265 +1,0 @@
-/*! 
-    \file vector.h
-    \brief A basic 3D math framework
-    
-    Contains classes to handle vectors, lines, rotations and planes
-*/ 
-
-#ifndef _VECTOR_H
-#define _VECTOR_H
-
-#include <math.h>
-//! PI the circle-constant
-#define PI 3.14159265359f  /* this is not nice... make a math_def file or something */ 
-
-//! 3D Vector
-/**
-	Class to handle 3D Vectors
-*/
-class Vector {
-
-  public:
- 
-  float x; //!< The x Coordinate of the Vector.
-  float y; //!< The y Coordinate of the Vector.
-  float z; //!< The z Coordinate of the Vector.
-
-  Vector (float x, float y, float z) : x(x), y(y), z(z) {}  //!< assignment constructor
-  Vector () : x(0), y(0), z(0) {}
-  ~Vector () {}
-
-  Vector operator+ (const Vector& v) const;
-  Vector operator- (const Vector& v) const;
-  float operator* (const Vector& v) const;
-  Vector operator* (float f) const;
-  Vector operator/ (float f) const;
-  inline float dot (const Vector& v) const;
-  Vector cross (const Vector& v) const;
-  void scale(const Vector& v);
-  float len() const;
-  void normalize();
-  Vector* getNormalized();
-  Vector abs();
-
-  void debug();
-};
-
-//float angleDeg (const Vector& v1, const Vector& v2);
-//float angleRad (const Vector& v1, const Vector& v2);
-
-
-/**
-   \brief add two vectors
-   \param v: the other vector
-   \return the sum of both vectors
-*/
-Vector Vector::operator+ (const Vector& v) const
-{
-  Vector r;
-
-  r.x = x + v.x;
-  r.y = y + v.y;
-  r.z = z + v.z;
-  
-  return r;
-}
-
-/**
-   \brief subtract a vector from another
-   \param v: the other vector
-   \return the difference between the vectors
-*/
-Vector Vector::operator- (const Vector& v) const
-{
-  Vector r;
-  
-  r.x = x - v.x;
-  r.y = y - v.y;
-  r.z = z - v.z;
-  
-  return r;
-}
-
-/**
-   \brief calculate the dot product of two vectors
-   \param v: the other vector
-   \return the dot product of the vectors
-*/
-float Vector::operator* (const Vector& v) const
-{
-  return x * v.x + y * v.y + z * v.z;
-}
-
-/**
-   \brief multiply a vector with a float
-   \param f: the factor
-   \return the vector multipied by f
-*/
-Vector Vector::operator* (float f) const
-{  
-  Vector r;
-  
-  r.x = x * f;
-  r.y = y * f;
-  r.z = z * f;
-  
-  return r;
-}
-
-/**
-   \brief divide a vector with a float
-   \param f: the divisor
-   \return the vector divided by f   
-*/
-Vector Vector::operator/ (float f) const
-{
-  Vector r;
-  
-  if( f == 0.0)
-  {
-    // Prevent divide by zero
-    return Vector (0,0,0);
-  }
-  
-  r.x = x / f;
-  r.y = y / f;
-  r.z = z / f;
-  
-  return r;
-}
-
-/**
-   \brief calculate the dot product of two vectors
-   \param v: the other vector
-   \return the dot product of the vectors
-*/
-inline float Vector::dot (const Vector& v) const
-{
-  return x*v.x+y*v.y+z*v.z;
-}
-
-/**
-  \brief calculate the cross product of two vectors
-  \param v: the other vector
-	\return the cross product of the vectors
-*/
-Vector Vector::cross (const Vector& v) const
-{
-  Vector r;
-  
-  r.x = y * v.z - z * v.y;
-  r.y = z * v.x - x * v.z;
-  r.z = x * v.y - y * v.x;
-  
-  return r;
-}
-  
-/**
-   \brief normalizes the vector to lenght 1.0
-*/
-void Vector::normalize ()
-{
-  float l = len();
-  
-  if( l == 0.0)
-  {
-    // Prevent divide by zero
-    return;
-  }
-  
-  x = x / l;
-  y = y / l;
-  z = z / l;
-}
-
-
-/**
-   \brief returns the voctor normalized to length 1.0
-*/
-
-Vector* Vector::getNormalized()
-{
-  float l = len();
-  if(l != 1.0)
-    {
-      return this;
-    }
-  else if(l == 0.0)
-    {
-      return 0;
-    }
-  
-  Vector *normalizedVector = new Vector(x / l, y /l, z / l);
-  return normalizedVector;
-}
-
-/**
-   \brief scales this Vector with Vector v.
-   \param v the vector to scale this vector with
-*/
-void Vector::scale(const Vector& v)
-{
-  x *= v.x;
-  y *= v.y;
-  z *= v.z;
-}
-
- 
-/**
-   \brief calculates the lenght of the vector
-   \return the lenght of the vector
-*/
-float Vector::len () const
-{
-  return sqrt (x*x+y*y+z*z);
-}
-
-
-/**
-   \brief Vector is looking in the positive direction on all axes after this
-*/
-Vector Vector::abs() 
-{
-  Vector v(fabs(x), fabs(y), fabs(z));
-  return v;
-}
-
-/**
-   \brief calculate the angle between two vectors in radiances
-   \param v1: a vector
-   \param v2: another vector
-   \return the angle between the vectors in radians
-*/
-float angleRad (const Vector& v1, const Vector& v2)
-{
-  return acos( v1 * v2 / (v1.len() * v2.len()));
-}
-
-
-/**
-   \brief calculate the angle between two vectors in degrees
-   \param v1: a vector
-   \param v2: another vector
-   \return the angle between the vectors in degrees
-*/
-float angleDeg (const Vector& v1, const Vector& v2)
-{
-  float f;
-  f = acos( v1 * v2 / (v1.len() * v2.len()));
-  return f * 180 / PI;
-}
-
-
-/**
-   \brief Outputs the values of the Vector
-*/
-void Vector::debug(void)
-{
-  PRINT(0)("Vector Debug information\n");
-  PRINT(0)("x: %f; y: %f; z: %f", x, y, z);
-  PRINT(3)(" lenght: %f", len());
-  PRINT(0)("\n");
-}
-
-
-#endif /* _VECTOR_H */
Index: orxonox/branches/openAL/src/lib/util/ini_parser.cc
===================================================================
--- orxonox/branches/openAL/src/lib/util/ini_parser.cc	(revision 3921)
+++ orxonox/branches/openAL/src/lib/util/ini_parser.cc	(revision 4194)
@@ -16,20 +16,21 @@
 
 #include "ini_parser.h"
+#include "resource_manager.h"
 
 using namespace std;
 
 /**
-	\brief constructs an IniParser using a file
-	\param filename: the path and name of the file to parse
+   \brief constructs an IniParser using a file
+   \param filename: the path and name of the file to parse
 */
-IniParser::IniParser (char* filename)
+IniParser::IniParser (const char* filename)
 {
   stream = NULL;
   bInSection = false;
-  openFile(filename);
+  this->openFile(filename);
 }
 
 /**
-	\brief removes the IniParser from memory
+   \brief removes the IniParser from memory
 */
 IniParser::~IniParser ()
@@ -43,14 +44,17 @@
    \return zero on success or -1 if an error occured;
 */
-int IniParser::openFile( char* filename)
+int IniParser::openFile(const char* filename)
 {
+  char* tmpName = ResourceManager::homeDirCheck(filename);
   if( filename == NULL) return -1;
   if( stream != NULL)	fclose (stream);
-  if( (stream = fopen (filename, "r")) == NULL)
+  if( (stream = fopen (tmpName, "r")) == NULL)
     {
-      printf("IniParser could not open %s\n", filename);
+      PRINTF(1)("IniParser could not open %s\n", filename);
+      delete tmpName;
       return -1;
     }
   bInSection = false;
+  delete tmpName;
   return 0;
 }
@@ -123,11 +127,16 @@
 	  return -1;
 	}
-      if( (ptr = strchr( linebuffer, '=')) != NULL)
+      sscanf(linebuffer, "%s = %s", name, value);
+      return 0;
+      /*
+	if( (ptr = strchr( tmpBuffer, '=')) != NULL)
 	{
-	  if( ptr == linebuffer) continue;
-	  strcpy (value, &ptr[1]);
-	  strncpy (name, linebuffer, strlen (linebuffer) - strlen (value) - 1);
-	  return 0;
+	if( ptr == linebuffer) continue;
+	strcpy (value, &ptr[1]);
+	strncpy (name, linebuffer, strlen (linebuffer) - strlen (value) - 1);
+	printf ("%s, %s\n", value, name);
+	return 0;
 	}
+      */
     }
   return -1;	
@@ -144,5 +153,5 @@
    lead to unwanted behaviour.
 */
-char* IniParser::getVar( char* name, char* section, char* defvalue = "")
+char* IniParser::getVar(const char* name, char* section, char* defvalue = "")
 {
   strcpy (internbuf, defvalue);
Index: orxonox/branches/openAL/src/lib/util/ini_parser.h
===================================================================
--- orxonox/branches/openAL/src/lib/util/ini_parser.h	(revision 3921)
+++ orxonox/branches/openAL/src/lib/util/ini_parser.h	(revision 4194)
@@ -26,9 +26,9 @@
 	
  public:
-  IniParser (char* filename);
+  IniParser (const char* filename);
   ~IniParser ();
   
-  char* getVar( char* name, char* section, char* defvalue);
-	int openFile( char* name);
+  char* getVar(const char* name, char* section, char* defvalue);
+  int openFile(const char* name);
   int getSection( char* section);
   int nextVar( char* name, char* value);
Index: orxonox/branches/openAL/src/lib/util/substring.cc
===================================================================
--- orxonox/branches/openAL/src/lib/util/substring.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/util/substring.cc	(revision 4194)
@@ -0,0 +1,94 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute 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.
+
+   ### File Specific:
+   main-programmer: Christian Meyer
+   co-programmer: ...
+*/
+
+
+/**
+   \brief breaks a string into parts that were initially seperated by comma
+   \param string the string to break into substrings
+*/
+
+#include "substring.h"
+
+SubString::SubString( const char* string)
+{
+	n = 0;
+	
+	assert( string != NULL);
+	
+	for( int i = 0; i < strlen(string); i++) if( string[i] == ',') n++;
+
+	n += 1;
+	
+	strings = new char*[n];
+	
+	assert( strings != NULL);
+	
+	int i = 0;
+	int l = 0;
+	
+	const char* offset = string;
+	char* end = strchr( string, ',');
+	while( end != NULL)
+	{
+		assert( i < n);
+		l = end - offset;
+		strings[i] = new char[l + 1];
+		assert( strings[i] != NULL);
+		strncpy( strings[i], offset, l);
+		strings[i][l] = 0;
+		i++;
+		end++;
+		offset = end;
+		end = strchr( offset, ',');
+	}
+	
+	strings[i] = new char[l + 1];
+	l = strlen( offset);
+	strncpy( strings[i], offset, l);
+	strings[i][l] = 0;
+}
+
+/**
+   \brief removes the object from memory
+*/
+SubString::~SubString()
+{
+	for( int i = 0; i < n; i++)
+	{
+		delete strings[i];
+	}
+	
+	delete strings;
+}
+
+/**
+   \brief get the amount of substrings
+   \returns the amount of substrings
+*/
+int SubString::getN()
+{
+	return n;
+}
+
+/**
+   \brief get a particular substring
+   \param i the ID of the substring to return
+   \returns the designated substring or NULL if an invalid ID was given
+*/
+const char* SubString::getString( int i)
+{
+	if( i < n && i >= 0) return strings[i];
+	else return NULL;
+}
Index: orxonox/branches/openAL/src/lib/util/substring.h
===================================================================
--- orxonox/branches/openAL/src/lib/util/substring.h	(revision 4194)
+++ orxonox/branches/openAL/src/lib/util/substring.h	(revision 4194)
@@ -0,0 +1,26 @@
+/*! 
+    \file substring.h
+    \brief a small class to get the parts of a string separated by commas
+*/
+
+#ifndef _SUBSTRING_H
+#define _SUBSTRING_H
+
+#include "stdincl.h"
+
+class SubString
+{
+	public:
+	
+		SubString( const char* string);
+		~SubString();
+		
+		int getN();
+		const char* getString( int i);
+		
+	private:
+		char** strings;
+		int n;
+};
+
+#endif /* _SUBSTRING_H */
Index: orxonox/branches/openAL/src/lib/xmlparser/tinystr.cc
===================================================================
--- orxonox/branches/openAL/src/lib/xmlparser/tinystr.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/xmlparser/tinystr.cc	(revision 4194)
@@ -0,0 +1,306 @@
+/*
+www.sourceforge.net/projects/tinyxml
+Original file by Yves Berquin.
+
+This software is provided 'as-is', without any express or implied 
+warranty. In no event will the authors be held liable for any 
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any 
+purpose, including commercial applications, and to alter it and 
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must 
+not claim that you wrote the original software. If you use this 
+software in a product, an acknowledgment in the product documentation 
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source 
+distribution.
+*/
+
+#include "tinyxml.h"
+
+#ifndef TIXML_USE_STL
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "tinystr.h"
+
+// TiXmlString constructor, based on a C string
+TiXmlString::TiXmlString (const char* instring)
+{
+    unsigned newlen;
+    char * newstring;
+
+    if (!instring)
+    {
+        allocated = 0;
+        cstring = NULL;
+        current_length = 0;
+        return;
+    }
+	//*ME:	warning C4267: convert 'size_t' to 'unsigned int'
+	//*ME:	Use Cast: (unsigned)
+    newlen = (unsigned)strlen (instring) + 1;
+    newstring = new char [newlen];
+    memcpy (newstring, instring, newlen);
+    // strcpy (newstring, instring);
+    allocated = newlen;
+    cstring = newstring;
+    current_length = newlen - 1;
+}
+
+// TiXmlString copy constructor
+TiXmlString::TiXmlString (const TiXmlString& copy)
+{
+    unsigned newlen;
+    char * newstring;
+
+	// Prevent copy to self!
+	if ( &copy == this )
+		return;
+
+    if (! copy . allocated)
+    {
+        allocated = 0;
+        cstring = NULL;
+        current_length = 0;
+        return;
+    }
+    newlen = copy . length () + 1;
+    newstring = new char [newlen];
+    // strcpy (newstring, copy . cstring);
+    memcpy (newstring, copy . cstring, newlen);
+    allocated = newlen;
+    cstring = newstring;
+    current_length = newlen - 1;
+}
+
+// TiXmlString = operator. Safe when assign own content
+void TiXmlString ::operator = (const char * content)
+{
+    unsigned newlen;
+    char * newstring;
+
+    if (! content)
+    {
+        empty_it ();
+        return;
+    }
+    newlen = (unsigned)strlen (content) + 1;
+    newstring = new char [newlen];
+    // strcpy (newstring, content);
+    memcpy (newstring, content, newlen);
+    empty_it ();
+    allocated = newlen;
+    cstring = newstring;
+    current_length = newlen - 1;
+}
+
+// = operator. Safe when assign own content
+void TiXmlString ::operator = (const TiXmlString & copy)
+{
+    unsigned newlen;
+    char * newstring;
+
+    if (! copy . length ())
+    {
+        empty_it ();
+        return;
+    }
+    newlen = copy . length () + 1;
+    newstring = new char [newlen];
+    // strcpy (newstring, copy . c_str ());
+    memcpy (newstring, copy . c_str (), newlen);
+    empty_it ();
+    allocated = newlen;
+    cstring = newstring;
+    current_length = newlen - 1;
+}
+
+
+// append a const char * to an existing TiXmlString
+void TiXmlString::append( const char* str, int len )
+{
+    char * new_string;
+    unsigned new_alloc, new_size, size_suffix;
+	
+	// don't use strlen - it can overrun the len passed in!
+	const char* p = str;
+	size_suffix = 0;
+
+	while ( *p && size_suffix < (unsigned)len )
+	{
+		++p;
+		++size_suffix;
+	}
+    if ( !size_suffix)
+        return;
+
+    new_size = length () + size_suffix + 1;
+    // check if we need to expand
+    if (new_size > allocated)
+    {
+        // compute new size
+        new_alloc = assign_new_size (new_size);
+
+        // allocate new buffer
+        new_string = new char [new_alloc];        
+        new_string [0] = 0;
+
+        // copy the previous allocated buffer into this one
+        if (allocated && cstring)
+            // strcpy (new_string, cstring);
+            memcpy (new_string, cstring, length ());
+
+        // append the suffix. It does exist, otherwize we wouldn't be expanding 
+        // strncat (new_string, str, len);
+        memcpy (new_string + length (), 
+                str,
+                size_suffix);
+
+        // return previsously allocated buffer if any
+        if (allocated && cstring)
+            delete [] cstring;
+
+        // update member variables
+        cstring = new_string;
+        allocated = new_alloc;
+    }
+    else
+    {
+        // we know we can safely append the new string
+        // strncat (cstring, str, len);
+        memcpy (cstring + length (), 
+                str,
+                size_suffix);
+    }
+    current_length = new_size - 1;
+    cstring [current_length] = 0;
+}
+
+
+// append a const char * to an existing TiXmlString
+void TiXmlString::append( const char * suffix )
+{
+    char * new_string;
+    unsigned new_alloc, new_size;
+
+    new_size = length () + strlen (suffix) + 1;
+    // check if we need to expand
+    if (new_size > allocated)
+    {
+        // compute new size
+        new_alloc = assign_new_size (new_size);
+
+        // allocate new buffer
+        new_string = new char [new_alloc];        
+        new_string [0] = 0;
+
+        // copy the previous allocated buffer into this one
+        if (allocated && cstring)
+            memcpy (new_string, cstring, 1 + length ());
+            // strcpy (new_string, cstring);
+
+        // append the suffix. It does exist, otherwize we wouldn't be expanding 
+        // strcat (new_string, suffix);
+        memcpy (new_string + length (), 
+                suffix,
+                strlen (suffix) + 1);
+
+        // return previsously allocated buffer if any
+        if (allocated && cstring)
+            delete [] cstring;
+
+        // update member variables
+        cstring = new_string;
+        allocated = new_alloc;
+    }
+    else
+    {
+        // we know we can safely append the new string
+        // strcat (cstring, suffix);
+        memcpy (cstring + length (), 
+                suffix, 
+                strlen (suffix) + 1);
+    }
+    current_length = new_size - 1;
+}
+
+// Check for TiXmlString equuivalence
+//bool TiXmlString::operator == (const TiXmlString & compare) const
+//{
+//    return (! strcmp (c_str (), compare . c_str ()));
+//}
+
+//unsigned TiXmlString::length () const
+//{
+//    if (allocated)
+//        // return strlen (cstring);
+//        return current_length;
+//    return 0;
+//}
+
+
+unsigned TiXmlString::find (char tofind, unsigned offset) const
+{
+	//*ME:	warning C4244: convert '__w64 int' to 'unsigned'
+	//*ME:	Use Array-Arithmetic instead of Pointer
+	//  char * lookup;
+
+    if (offset >= length ())
+        return (unsigned) notfound;
+	//  for (lookup = cstring + offset; * lookup; lookup++)
+	//	if (* lookup == tofind)
+	//	    return lookup - cstring;
+    for( unsigned n=offset ; cstring[n] != '\0' ; n++ )
+	if( cstring[n] == tofind )
+	    return  n ;
+    return (unsigned) notfound;
+}
+
+
+bool TiXmlString::operator == (const TiXmlString & compare) const
+{
+	if ( allocated && compare.allocated )
+	{
+		assert( cstring );
+		assert( compare.cstring );
+		return ( strcmp( cstring, compare.cstring ) == 0 );
+ 	}
+	return false;
+}
+
+
+bool TiXmlString::operator < (const TiXmlString & compare) const
+{
+	if ( allocated && compare.allocated )
+	{
+		assert( cstring );
+		assert( compare.cstring );
+		return ( strcmp( cstring, compare.cstring ) > 0 );
+ 	}
+	return false;
+}
+
+
+bool TiXmlString::operator > (const TiXmlString & compare) const
+{
+	if ( allocated && compare.allocated )
+	{
+		assert( cstring );
+		assert( compare.cstring );
+		return ( strcmp( cstring, compare.cstring ) < 0 );
+ 	}
+	return false;
+}
+
+
+#endif	// TIXML_USE_STL
Index: orxonox/branches/openAL/src/lib/xmlparser/tinystr.h
===================================================================
--- orxonox/branches/openAL/src/lib/xmlparser/tinystr.h	(revision 4194)
+++ orxonox/branches/openAL/src/lib/xmlparser/tinystr.h	(revision 4194)
@@ -0,0 +1,242 @@
+/*
+www.sourceforge.net/projects/tinyxml
+Original file by Yves Berquin.
+
+This software is provided 'as-is', without any express or implied 
+warranty. In no event will the authors be held liable for any 
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any 
+purpose, including commercial applications, and to alter it and 
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must 
+not claim that you wrote the original software. If you use this 
+software in a product, an acknowledgment in the product documentation 
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source 
+distribution.
+*/
+
+#include "tinyxml.h"
+
+
+#ifndef TIXML_USE_STL
+
+#ifndef TIXML_STRING_INCLUDED
+#define TIXML_STRING_INCLUDED
+
+#ifdef _MSC_VER
+#pragma warning( disable : 4786 )	// Debugger truncating names.
+#endif
+
+#include <assert.h>
+
+/*
+   TiXmlString is an emulation of the std::string template.
+   Its purpose is to allow compiling TinyXML on compilers with no or poor STL support.
+   Only the member functions relevant to the TinyXML project have been implemented.
+   The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase
+   a string and there's no more room, we allocate a buffer twice as big as we need.
+*/
+class TiXmlString
+{
+  public :
+    // TiXmlString constructor, based on a string
+    TiXmlString (const char * instring);
+
+    // TiXmlString empty constructor
+    TiXmlString ()
+    {
+        allocated = 0;
+        cstring = NULL;
+        current_length = 0;
+    }
+
+    // TiXmlString copy constructor
+    TiXmlString (const TiXmlString& copy);
+
+    // TiXmlString destructor
+    ~ TiXmlString ()
+    {
+        empty_it ();
+    }
+
+    // Convert a TiXmlString into a classical char *
+    const char * c_str () const
+    {
+        if (allocated)
+            return cstring;
+        return "";
+    }
+
+    // Return the length of a TiXmlString
+    unsigned length () const
+	{
+		return ( allocated ) ? current_length : 0;
+	}
+
+    // TiXmlString = operator
+    void operator = (const char * content);
+
+    // = operator
+    void operator = (const TiXmlString & copy);
+
+    // += operator. Maps to append
+    TiXmlString& operator += (const char * suffix)
+    {
+        append (suffix);
+		return *this;
+    }
+
+    // += operator. Maps to append
+    TiXmlString& operator += (char single)
+    {
+        append (single);
+		return *this;
+    }
+
+    // += operator. Maps to append
+    TiXmlString& operator += (TiXmlString & suffix)
+    {
+        append (suffix);
+		return *this;
+    }
+    bool operator == (const TiXmlString & compare) const;
+    bool operator < (const TiXmlString & compare) const;
+    bool operator > (const TiXmlString & compare) const;
+
+    // Checks if a TiXmlString is empty
+    bool empty () const
+    {
+        return length () ? false : true;
+    }
+
+    // single char extraction
+    const char& at (unsigned index) const
+    {
+        assert( index < length ());
+        return cstring [index];
+    }
+
+    // find a char in a string. Return TiXmlString::notfound if not found
+    unsigned find (char lookup) const
+    {
+        return find (lookup, 0);
+    }
+
+    // find a char in a string from an offset. Return TiXmlString::notfound if not found
+    unsigned find (char tofind, unsigned offset) const;
+
+    /*	Function to reserve a big amount of data when we know we'll need it. Be aware that this
+		function clears the content of the TiXmlString if any exists.
+    */
+    void reserve (unsigned size)
+    {
+        empty_it ();
+        if (size)
+        {
+            allocated = size;
+            cstring = new char [size];
+            cstring [0] = 0;
+            current_length = 0;
+        }
+    }
+
+    // [] operator 
+    char& operator [] (unsigned index) const
+    {
+        assert( index < length ());
+        return cstring [index];
+    }
+
+    // Error value for find primitive 
+    enum {	notfound = 0xffffffff,
+            npos = notfound };
+
+    void append (const char *str, int len );
+
+  protected :
+
+    // The base string
+    char * cstring;
+    // Number of chars allocated
+    unsigned allocated;
+    // Current string size
+    unsigned current_length;
+
+    // New size computation. It is simplistic right now : it returns twice the amount
+    // we need
+    unsigned assign_new_size (unsigned minimum_to_allocate)
+    {
+        return minimum_to_allocate * 2;
+    }
+
+    // Internal function that clears the content of a TiXmlString
+    void empty_it ()
+    {
+        if (cstring)
+            delete [] cstring;
+        cstring = NULL;
+        allocated = 0;
+        current_length = 0;
+    }
+
+    void append (const char *suffix );
+
+    // append function for another TiXmlString
+    void append (const TiXmlString & suffix)
+    {
+        append (suffix . c_str ());
+    }
+
+    // append for a single char.
+    void append (char single)
+    {
+        if ( cstring && current_length < (allocated-1) )
+		{
+			cstring[ current_length ] = single;
+			++current_length;
+			cstring[ current_length ] = 0;
+		}
+		else
+		{
+			char smallstr [2];
+			smallstr [0] = single;
+			smallstr [1] = 0;
+			append (smallstr);
+		}
+    }
+
+} ;
+
+/* 
+   TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString.
+   Only the operators that we need for TinyXML have been developped.
+*/
+class TiXmlOutStream : public TiXmlString
+{
+public :
+    TiXmlOutStream () : TiXmlString () {}
+
+    // TiXmlOutStream << operator. Maps to TiXmlString::append
+    TiXmlOutStream & operator << (const char * in)
+    {
+        append (in);
+        return (* this);
+    }
+
+    // TiXmlOutStream << operator. Maps to TiXmlString::append
+    TiXmlOutStream & operator << (const TiXmlString & in)
+    {
+        append (in . c_str ());
+        return (* this);
+    }
+} ;
+
+#endif	// TIXML_STRING_INCLUDED
+#endif	// TIXML_USE_STL
Index: orxonox/branches/openAL/src/lib/xmlparser/tinyxml.cc
===================================================================
--- orxonox/branches/openAL/src/lib/xmlparser/tinyxml.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/xmlparser/tinyxml.cc	(revision 4194)
@@ -0,0 +1,1592 @@
+/*
+www.sourceforge.net/projects/tinyxml
+Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any
+purpose, including commercial applications, and to alter it and
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must
+not claim that you wrote the original software. If you use this
+software in a product, an acknowledgment in the product documentation
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+distribution.
+*/
+
+#include <ctype.h>
+#include "tinyxml.h"
+
+#ifdef TIXML_USE_STL
+#include <sstream>
+#endif
+
+
+bool TiXmlBase::condenseWhiteSpace = true;
+
+void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_OSTREAM* stream )
+{
+	TIXML_STRING buffer;
+	PutString( str, &buffer );
+	(*stream) << buffer;
+}
+
+void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_STRING* outString )
+{
+	int i=0;
+
+	while( i<(int)str.length() )
+	{
+		unsigned char c = (unsigned char) str[i];
+
+		if (    c == '&' 
+		     && i < ( (int)str.length() - 2 )
+			 && str[i+1] == '#'
+			 && str[i+2] == 'x' )
+		{
+			// Hexadecimal character reference.
+			// Pass through unchanged.
+			// &#xA9;	-- copyright symbol, for example.
+			//
+			// The -1 is a bug fix from Rob Laveaux. It keeps
+			// an overflow from happening if there is no ';'.
+			// There are actually 2 ways to exit this loop -
+			// while fails (error case) and break (semicolon found).
+			// However, there is no mechanism (currently) for
+			// this function to return an error.
+			while ( i<(int)str.length()-1 )
+			{
+				outString->append( str.c_str() + i, 1 );
+				++i;
+				if ( str[i] == ';' )
+					break;
+			}
+		}
+		else if ( c == '&' )
+		{
+			outString->append( entity[0].str, entity[0].strLength );
+			++i;
+		}
+		else if ( c == '<' )
+		{
+			outString->append( entity[1].str, entity[1].strLength );
+			++i;
+		}
+		else if ( c == '>' )
+		{
+			outString->append( entity[2].str, entity[2].strLength );
+			++i;
+		}
+		else if ( c == '\"' )
+		{
+			outString->append( entity[3].str, entity[3].strLength );
+			++i;
+		}
+		else if ( c == '\'' )
+		{
+			outString->append( entity[4].str, entity[4].strLength );
+			++i;
+		}
+		else if ( c < 32 )
+		{
+			// Easy pass at non-alpha/numeric/symbol
+			// Below 32 is symbolic.
+			char buf[ 32 ];
+			sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) );
+			//*ME:	warning C4267: convert 'size_t' to 'int'
+			//*ME:	Int-Cast to make compiler happy ...
+			outString->append( buf, (int)strlen( buf ) );
+			++i;
+		}
+		else
+		{
+			//char realc = (char) c;
+			//outString->append( &realc, 1 );
+			*outString += (char) c;	// somewhat more efficient function call.
+			++i;
+		}
+	}
+}
+
+
+// <-- Strange class for a bug fix. Search for STL_STRING_BUG
+TiXmlBase::StringToBuffer::StringToBuffer( const TIXML_STRING& str )
+{
+	buffer = new char[ str.length()+1 ];
+	if ( buffer )
+	{
+		strcpy( buffer, str.c_str() );
+	}
+}
+
+
+TiXmlBase::StringToBuffer::~StringToBuffer()
+{
+	delete [] buffer;
+}
+// End strange bug fix. -->
+
+
+TiXmlNode::TiXmlNode( NodeType _type ) : TiXmlBase()
+{
+	parent = 0;
+	type = _type;
+	firstChild = 0;
+	lastChild = 0;
+	prev = 0;
+	next = 0;
+}
+
+
+TiXmlNode::~TiXmlNode()
+{
+	TiXmlNode* node = firstChild;
+	TiXmlNode* temp = 0;
+
+	while ( node )
+	{
+		temp = node;
+		node = node->next;
+		delete temp;
+	}	
+}
+
+
+void TiXmlNode::CopyTo( TiXmlNode* target ) const
+{
+	target->SetValue (value.c_str() );
+	target->userData = userData; 
+}
+
+
+void TiXmlNode::Clear()
+{
+	TiXmlNode* node = firstChild;
+	TiXmlNode* temp = 0;
+
+	while ( node )
+	{
+		temp = node;
+		node = node->next;
+		delete temp;
+	}	
+
+	firstChild = 0;
+	lastChild = 0;
+}
+
+
+TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node )
+{
+	node->parent = this;
+
+	node->prev = lastChild;
+	node->next = 0;
+
+	if ( lastChild )
+		lastChild->next = node;
+	else
+		firstChild = node;			// it was an empty list.
+
+	lastChild = node;
+	return node;
+}
+
+
+TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis )
+{
+	TiXmlNode* node = addThis.Clone();
+	if ( !node )
+		return 0;
+
+	return LinkEndChild( node );
+}
+
+
+TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis )
+{	
+	if ( !beforeThis || beforeThis->parent != this )
+		return 0;
+
+	TiXmlNode* node = addThis.Clone();
+	if ( !node )
+		return 0;
+	node->parent = this;
+
+	node->next = beforeThis;
+	node->prev = beforeThis->prev;
+	if ( beforeThis->prev )
+	{
+		beforeThis->prev->next = node;
+	}
+	else
+	{
+		assert( firstChild == beforeThis );
+		firstChild = node;
+	}
+	beforeThis->prev = node;
+	return node;
+}
+
+
+TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis )
+{
+	if ( !afterThis || afterThis->parent != this )
+		return 0;
+
+	TiXmlNode* node = addThis.Clone();
+	if ( !node )
+		return 0;
+	node->parent = this;
+
+	node->prev = afterThis;
+	node->next = afterThis->next;
+	if ( afterThis->next )
+	{
+		afterThis->next->prev = node;
+	}
+	else
+	{
+		assert( lastChild == afterThis );
+		lastChild = node;
+	}
+	afterThis->next = node;
+	return node;
+}
+
+
+TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis )
+{
+	if ( replaceThis->parent != this )
+		return 0;
+
+	TiXmlNode* node = withThis.Clone();
+	if ( !node )
+		return 0;
+
+	node->next = replaceThis->next;
+	node->prev = replaceThis->prev;
+
+	if ( replaceThis->next )
+		replaceThis->next->prev = node;
+	else
+		lastChild = node;
+
+	if ( replaceThis->prev )
+		replaceThis->prev->next = node;
+	else
+		firstChild = node;
+
+	delete replaceThis;
+	node->parent = this;
+	return node;
+}
+
+
+bool TiXmlNode::RemoveChild( TiXmlNode* removeThis )
+{
+	if ( removeThis->parent != this )
+	{	
+		assert( 0 );
+		return false;
+	}
+
+	if ( removeThis->next )
+		removeThis->next->prev = removeThis->prev;
+	else
+		lastChild = removeThis->prev;
+
+	if ( removeThis->prev )
+		removeThis->prev->next = removeThis->next;
+	else
+		firstChild = removeThis->next;
+
+	delete removeThis;
+	return true;
+}
+
+const TiXmlNode* TiXmlNode::FirstChild( const char * _value ) const
+{
+	const TiXmlNode* node;
+	for ( node = firstChild; node; node = node->next )
+	{
+		if ( node->SValue() == TIXML_STRING( _value ))
+			return node;
+	}
+	return 0;
+}
+
+
+TiXmlNode* TiXmlNode::FirstChild( const char * _value )
+{
+	TiXmlNode* node;
+	for ( node = firstChild; node; node = node->next )
+	{
+		if ( node->SValue() == TIXML_STRING( _value ))
+			return node;
+	}
+	return 0;
+}
+
+
+const TiXmlNode* TiXmlNode::LastChild( const char * _value ) const
+{
+	const TiXmlNode* node;
+	for ( node = lastChild; node; node = node->prev )
+	{
+		if ( node->SValue() == TIXML_STRING (_value))
+			return node;
+	}
+	return 0;
+}
+
+TiXmlNode* TiXmlNode::LastChild( const char * _value )
+{
+	TiXmlNode* node;
+	for ( node = lastChild; node; node = node->prev )
+	{
+		if ( node->SValue() == TIXML_STRING (_value))
+			return node;
+	}
+	return 0;
+}
+
+const TiXmlNode* TiXmlNode::IterateChildren( TiXmlNode* previous ) const
+{
+	if ( !previous )
+	{
+		return FirstChild();
+	}
+	else
+	{
+		assert( previous->parent == this );
+		return previous->NextSibling();
+	}
+}
+
+TiXmlNode* TiXmlNode::IterateChildren( TiXmlNode* previous )
+{
+	if ( !previous )
+	{
+		return FirstChild();
+	}
+	else
+	{
+		assert( previous->parent == this );
+		return previous->NextSibling();
+	}
+}
+
+const TiXmlNode* TiXmlNode::IterateChildren( const char * val, TiXmlNode* previous ) const
+{
+	if ( !previous )
+	{
+		return FirstChild( val );
+	}
+	else
+	{
+		assert( previous->parent == this );
+		return previous->NextSibling( val );
+	}
+}
+
+TiXmlNode* TiXmlNode::IterateChildren( const char * val, TiXmlNode* previous )
+{
+	if ( !previous )
+	{
+		return FirstChild( val );
+	}
+	else
+	{
+		assert( previous->parent == this );
+		return previous->NextSibling( val );
+	}
+}
+
+const TiXmlNode* TiXmlNode::NextSibling( const char * _value ) const 
+{
+	const TiXmlNode* node;
+	for ( node = next; node; node = node->next )
+	{
+		if ( node->SValue() == TIXML_STRING (_value))
+			return node;
+	}
+	return 0;
+}
+
+TiXmlNode* TiXmlNode::NextSibling( const char * _value )
+{
+	TiXmlNode* node;
+	for ( node = next; node; node = node->next )
+	{
+		if ( node->SValue() == TIXML_STRING (_value))
+			return node;
+	}
+	return 0;
+}
+
+const TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) const
+{
+	const TiXmlNode* node;
+	for ( node = prev; node; node = node->prev )
+	{
+		if ( node->SValue() == TIXML_STRING (_value))
+			return node;
+	}
+	return 0;
+}
+
+TiXmlNode* TiXmlNode::PreviousSibling( const char * _value )
+{
+	TiXmlNode* node;
+	for ( node = prev; node; node = node->prev )
+	{
+		if ( node->SValue() == TIXML_STRING (_value))
+			return node;
+	}
+	return 0;
+}
+
+void TiXmlElement::RemoveAttribute( const char * name )
+{
+	TiXmlAttribute* node = attributeSet.Find( name );
+	if ( node )
+	{
+		attributeSet.Remove( node );
+		delete node;
+	}
+}
+
+const TiXmlElement* TiXmlNode::FirstChildElement() const
+{
+	const TiXmlNode* node;
+
+	for (	node = FirstChild();
+			node;
+			node = node->NextSibling() )
+	{
+		if ( node->ToElement() )
+			return node->ToElement();
+	}
+	return 0;
+}
+
+TiXmlElement* TiXmlNode::FirstChildElement()
+{
+	TiXmlNode* node;
+
+	for (	node = FirstChild();
+			node;
+			node = node->NextSibling() )
+	{
+		if ( node->ToElement() )
+			return node->ToElement();
+	}
+	return 0;
+}
+
+const TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) const
+{
+	const TiXmlNode* node;
+
+	for (	node = FirstChild( _value );
+			node;
+			node = node->NextSibling( _value ) )
+	{
+		if ( node->ToElement() )
+			return node->ToElement();
+	}
+	return 0;
+}
+
+TiXmlElement* TiXmlNode::FirstChildElement( const char * _value )
+{
+	TiXmlNode* node;
+
+	for (	node = FirstChild( _value );
+			node;
+			node = node->NextSibling( _value ) )
+	{
+		if ( node->ToElement() )
+			return node->ToElement();
+	}
+	return 0;
+}
+
+const TiXmlElement* TiXmlNode::NextSiblingElement() const
+{
+	const TiXmlNode* node;
+
+	for (	node = NextSibling();
+	node;
+	node = node->NextSibling() )
+	{
+		if ( node->ToElement() )
+			return node->ToElement();
+	}
+	return 0;
+}
+
+TiXmlElement* TiXmlNode::NextSiblingElement()
+{
+	TiXmlNode* node;
+
+	for (	node = NextSibling();
+	node;
+	node = node->NextSibling() )
+	{
+		if ( node->ToElement() )
+			return node->ToElement();
+	}
+	return 0;
+}
+
+const TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) const
+{
+	const TiXmlNode* node;
+
+	for (	node = NextSibling( _value );
+	node;
+	node = node->NextSibling( _value ) )
+	{
+		if ( node->ToElement() )
+			return node->ToElement();
+	}
+	return 0;
+}
+
+TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value )
+{
+	TiXmlNode* node;
+
+	for (	node = NextSibling( _value );
+	node;
+	node = node->NextSibling( _value ) )
+	{
+		if ( node->ToElement() )
+			return node->ToElement();
+	}
+	return 0;
+}
+
+
+const TiXmlDocument* TiXmlNode::GetDocument() const
+{
+	const TiXmlNode* node;
+
+	for( node = this; node; node = node->parent )
+	{
+		if ( node->ToDocument() )
+			return node->ToDocument();
+	}
+	return 0;
+}
+
+TiXmlDocument* TiXmlNode::GetDocument()
+{
+	TiXmlNode* node;
+
+	for( node = this; node; node = node->parent )
+	{
+		if ( node->ToDocument() )
+			return node->ToDocument();
+	}
+	return 0;
+}
+
+TiXmlElement::TiXmlElement (const char * _value)
+	: TiXmlNode( TiXmlNode::ELEMENT )
+{
+	firstChild = lastChild = 0;
+	value = _value;
+}
+
+
+#ifdef TIXML_USE_STL
+TiXmlElement::TiXmlElement( const std::string& _value ) 
+	: TiXmlNode( TiXmlNode::ELEMENT )
+{
+	firstChild = lastChild = 0;
+	value = _value;
+}
+#endif
+
+
+TiXmlElement::TiXmlElement( const TiXmlElement& copy)
+	: TiXmlNode( TiXmlNode::ELEMENT )
+{
+	firstChild = lastChild = 0;
+	copy.CopyTo( this );	
+}
+
+
+void TiXmlElement::operator=( const TiXmlElement& base )
+{
+	ClearThis();
+	base.CopyTo( this );
+}
+
+
+TiXmlElement::~TiXmlElement()
+{
+	ClearThis();
+}
+
+
+void TiXmlElement::ClearThis()
+{
+	Clear();
+	while( attributeSet.First() )
+	{
+		TiXmlAttribute* node = attributeSet.First();
+		attributeSet.Remove( node );
+		delete node;
+	}
+}
+
+
+const char * TiXmlElement::Attribute( const char * name ) const
+{
+	const TiXmlAttribute* node = attributeSet.Find( name );
+
+	if ( node )
+		return node->Value();
+
+	return 0;
+}
+
+
+const char * TiXmlElement::Attribute( const char * name, int* i ) const
+{
+	const char * s = Attribute( name );
+	if ( i )
+	{
+		if ( s )
+			*i = atoi( s );
+		else
+			*i = 0;
+	}
+	return s;
+}
+
+
+const char * TiXmlElement::Attribute( const char * name, double* d ) const
+{
+	const char * s = Attribute( name );
+	if ( d )
+	{
+		if ( s )
+			*d = atof( s );
+		else
+			*d = 0;
+	}
+	return s;
+}
+
+
+int TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const
+{
+	const TiXmlAttribute* node = attributeSet.Find( name );
+	if ( !node )
+		return TIXML_NO_ATTRIBUTE;
+
+	return node->QueryIntValue( ival );
+}
+
+
+int TiXmlElement::QueryDoubleAttribute( const char* name, double* dval ) const
+{
+	const TiXmlAttribute* node = attributeSet.Find( name );
+	if ( !node )
+		return TIXML_NO_ATTRIBUTE;
+
+	return node->QueryDoubleValue( dval );
+}
+
+
+void TiXmlElement::SetAttribute( const char * name, int val )
+{	
+	char buf[64];
+	sprintf( buf, "%d", val );
+	SetAttribute( name, buf );
+}
+
+
+void TiXmlElement::SetDoubleAttribute( const char * name, double val )
+{	
+	char buf[128];
+	sprintf( buf, "%f", val );
+	SetAttribute( name, buf );
+}
+
+
+void TiXmlElement::SetAttribute( const char * name, const char * _value )
+{
+	TiXmlAttribute* node = attributeSet.Find( name );
+	if ( node )
+	{
+		node->SetValue( _value );
+		return;
+	}
+
+	TiXmlAttribute* attrib = new TiXmlAttribute( name, _value );
+	if ( attrib )
+	{
+		attributeSet.Add( attrib );
+	}
+	else
+	{
+		TiXmlDocument* document = GetDocument();
+		if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, TIXML_ENCODING_UNKNOWN );
+	}
+}
+
+void TiXmlElement::Print( FILE* cfile, int depth ) const
+{
+	int i;
+	for ( i=0; i<depth; i++ )
+	{
+		fprintf( cfile, "    " );
+	}
+
+	fprintf( cfile, "<%s", value.c_str() );
+
+	const TiXmlAttribute* attrib;
+	for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() )
+	{
+		fprintf( cfile, " " );
+		attrib->Print( cfile, depth );
+	}
+
+	// There are 3 different formatting approaches:
+	// 1) An element without children is printed as a <foo /> node
+	// 2) An element with only a text child is printed as <foo> text </foo>
+	// 3) An element with children is printed on multiple lines.
+	TiXmlNode* node;
+	if ( !firstChild )
+	{
+		fprintf( cfile, " />" );
+	}
+	else if ( firstChild == lastChild && firstChild->ToText() )
+	{
+		fprintf( cfile, ">" );
+		firstChild->Print( cfile, depth + 1 );
+		fprintf( cfile, "</%s>", value.c_str() );
+	}
+	else
+	{
+		fprintf( cfile, ">" );
+
+		for ( node = firstChild; node; node=node->NextSibling() )
+		{
+			if ( !node->ToText() )
+			{
+				fprintf( cfile, "\n" );
+			}
+			node->Print( cfile, depth+1 );
+		}
+		fprintf( cfile, "\n" );
+		for( i=0; i<depth; ++i )
+		fprintf( cfile, "    " );
+		fprintf( cfile, "</%s>", value.c_str() );
+	}
+}
+
+void TiXmlElement::StreamOut( TIXML_OSTREAM * stream ) const
+{
+	(*stream) << "<" << value;
+
+	const TiXmlAttribute* attrib;
+	for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() )
+	{	
+		(*stream) << " ";
+		attrib->StreamOut( stream );
+	}
+
+	// If this node has children, give it a closing tag. Else
+	// make it an empty tag.
+	TiXmlNode* node;
+	if ( firstChild )
+	{ 		
+		(*stream) << ">";
+
+		for ( node = firstChild; node; node=node->NextSibling() )
+		{
+			node->StreamOut( stream );
+		}
+		(*stream) << "</" << value << ">";
+	}
+	else
+	{
+		(*stream) << " />";
+	}
+}
+
+
+void TiXmlElement::CopyTo( TiXmlElement* target ) const
+{
+	// superclass:
+	TiXmlNode::CopyTo( target );
+
+	// Element class: 
+	// Clone the attributes, then clone the children.
+	const TiXmlAttribute* attribute = 0;
+	for(	attribute = attributeSet.First();
+	attribute;
+	attribute = attribute->Next() )
+	{
+		target->SetAttribute( attribute->Name(), attribute->Value() );
+	}
+
+	TiXmlNode* node = 0;
+	for ( node = firstChild; node; node = node->NextSibling() )
+	{
+		target->LinkEndChild( node->Clone() );
+	}
+}
+
+
+TiXmlNode* TiXmlElement::Clone() const
+{
+	TiXmlElement* clone = new TiXmlElement( Value() );
+	if ( !clone )
+		return 0;
+
+	CopyTo( clone );
+	return clone;
+}
+
+
+TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::DOCUMENT )
+{
+	tabsize = 4;
+	ClearError();
+}
+
+TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::DOCUMENT )
+{
+	tabsize = 4;
+	value = documentName;
+	ClearError();
+}
+
+
+#ifdef TIXML_USE_STL
+TiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::DOCUMENT )
+{
+	tabsize = 4;
+    value = documentName;
+	ClearError();
+}
+#endif
+
+
+TiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode::DOCUMENT )
+{
+	copy.CopyTo( this );
+}
+
+
+void TiXmlDocument::operator=( const TiXmlDocument& copy )
+{
+	Clear();
+	copy.CopyTo( this );
+}
+
+
+bool TiXmlDocument::LoadFile( TiXmlEncoding encoding )
+{
+	// See STL_STRING_BUG below.
+	StringToBuffer buf( value );
+
+	if ( buf.buffer && LoadFile( buf.buffer, encoding ) )
+		return true;
+
+	return false;
+}
+
+
+bool TiXmlDocument::SaveFile() const
+{
+	// See STL_STRING_BUG below.
+	StringToBuffer buf( value );
+
+	if ( buf.buffer && SaveFile( buf.buffer ) )
+		return true;
+
+	return false;
+}
+
+bool TiXmlDocument::LoadFile( const char* filename, TiXmlEncoding encoding )
+{
+	// Delete the existing data:
+	Clear();
+	location.Clear();
+
+	// There was a really terrifying little bug here. The code:
+	//		value = filename
+	// in the STL case, cause the assignment method of the std::string to
+	// be called. What is strange, is that the std::string had the same
+	// address as it's c_str() method, and so bad things happen. Looks
+	// like a bug in the Microsoft STL implementation.
+	// See STL_STRING_BUG above.
+	// Fixed with the StringToBuffer class.
+	value = filename;
+
+	FILE* file = fopen( value.c_str (), "r" );
+
+	if ( file )
+	{
+		// Get the file size, so we can pre-allocate the string. HUGE speed impact.
+		long length = 0;
+		fseek( file, 0, SEEK_END );
+		length = ftell( file );
+		fseek( file, 0, SEEK_SET );
+
+		// Strange case, but good to handle up front.
+		if ( length == 0 )
+		{
+			fclose( file );
+			return false;
+		}
+
+		// If we have a file, assume it is all one big XML file, and read it in.
+		// The document parser may decide the document ends sooner than the entire file, however.
+		TIXML_STRING data;
+		data.reserve( length );
+
+		const int BUF_SIZE = 2048;
+		char buf[BUF_SIZE];
+
+		while( fgets( buf, BUF_SIZE, file ) )
+		{
+			data += buf;
+		}
+		fclose( file );
+
+		Parse( data.c_str(), 0, encoding );
+
+		if (  Error() )
+            return false;
+        else
+			return true;
+	}
+	SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN );
+	return false;
+}
+
+bool TiXmlDocument::SaveFile( const char * filename ) const
+{
+	// The old c stuff lives on...
+	FILE* fp = fopen( filename, "w" );
+	if ( fp )
+	{
+		Print( fp, 0 );
+		fclose( fp );
+		return true;
+	}
+	return false;
+}
+
+
+void TiXmlDocument::CopyTo( TiXmlDocument* target ) const
+{
+	TiXmlNode::CopyTo( target );
+
+	target->error = error;
+	target->errorDesc = errorDesc.c_str ();
+
+	TiXmlNode* node = 0;
+	for ( node = firstChild; node; node = node->NextSibling() )
+	{
+		target->LinkEndChild( node->Clone() );
+	}	
+}
+
+
+TiXmlNode* TiXmlDocument::Clone() const
+{
+	TiXmlDocument* clone = new TiXmlDocument();
+	if ( !clone )
+		return 0;
+
+	CopyTo( clone );
+	return clone;
+}
+
+
+void TiXmlDocument::Print( FILE* cfile, int depth ) const
+{
+	const TiXmlNode* node;
+	for ( node=FirstChild(); node; node=node->NextSibling() )
+	{
+		node->Print( cfile, depth );
+		fprintf( cfile, "\n" );
+	}
+}
+
+void TiXmlDocument::StreamOut( TIXML_OSTREAM * out ) const
+{
+	const TiXmlNode* node;
+	for ( node=FirstChild(); node; node=node->NextSibling() )
+	{
+		node->StreamOut( out );
+
+		// Special rule for streams: stop after the root element.
+		// The stream in code will only read one element, so don't
+		// write more than one.
+		if ( node->ToElement() )
+			break;
+	}
+}
+
+
+const TiXmlAttribute* TiXmlAttribute::Next() const
+{
+	// We are using knowledge of the sentinel. The sentinel
+	// have a value or name.
+	if ( next->value.empty() && next->name.empty() )
+		return 0;
+	return next;
+}
+
+TiXmlAttribute* TiXmlAttribute::Next()
+{
+	// We are using knowledge of the sentinel. The sentinel
+	// have a value or name.
+	if ( next->value.empty() && next->name.empty() )
+		return 0;
+	return next;
+}
+
+const TiXmlAttribute* TiXmlAttribute::Previous() const
+{
+	// We are using knowledge of the sentinel. The sentinel
+	// have a value or name.
+	if ( prev->value.empty() && prev->name.empty() )
+		return 0;
+	return prev;
+}
+
+TiXmlAttribute* TiXmlAttribute::Previous()
+{
+	// We are using knowledge of the sentinel. The sentinel
+	// have a value or name.
+	if ( prev->value.empty() && prev->name.empty() )
+		return 0;
+	return prev;
+}
+
+void TiXmlAttribute::Print( FILE* cfile, int /*depth*/ ) const
+{
+	TIXML_STRING n, v;
+
+	PutString( name, &n );
+	PutString( value, &v );
+
+	if (value.find ('\"') == TIXML_STRING::npos)
+		fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() );
+	else
+		fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() );
+}
+
+
+void TiXmlAttribute::StreamOut( TIXML_OSTREAM * stream ) const
+{
+	if (value.find( '\"' ) != TIXML_STRING::npos)
+	{
+		PutString( name, stream );
+		(*stream) << "=" << "'";
+		PutString( value, stream );
+		(*stream) << "'";
+	}
+	else
+	{
+		PutString( name, stream );
+		(*stream) << "=" << "\"";
+		PutString( value, stream );
+		(*stream) << "\"";
+	}
+}
+
+int TiXmlAttribute::QueryIntValue( int* ival ) const
+{
+	if ( sscanf( value.c_str(), "%d", ival ) == 1 )
+		return TIXML_SUCCESS;
+	return TIXML_WRONG_TYPE;
+}
+
+int TiXmlAttribute::QueryDoubleValue( double* dval ) const
+{
+	if ( sscanf( value.c_str(), "%lf", dval ) == 1 )
+		return TIXML_SUCCESS;
+	return TIXML_WRONG_TYPE;
+}
+
+void TiXmlAttribute::SetIntValue( int _value )
+{
+	char buf [64];
+	sprintf (buf, "%d", _value);
+	SetValue (buf);
+}
+
+void TiXmlAttribute::SetDoubleValue( double _value )
+{
+	char buf [64];
+	sprintf (buf, "%lf", _value);
+	SetValue (buf);
+}
+
+const int TiXmlAttribute::IntValue() const
+{
+	return atoi (value.c_str ());
+}
+
+const double  TiXmlAttribute::DoubleValue() const
+{
+	return atof (value.c_str ());
+}
+
+
+TiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::COMMENT )
+{
+	copy.CopyTo( this );
+}
+
+
+void TiXmlComment::operator=( const TiXmlComment& base )
+{
+	Clear();
+	base.CopyTo( this );
+}
+
+
+void TiXmlComment::Print( FILE* cfile, int depth ) const
+{
+	for ( int i=0; i<depth; i++ )
+	{
+		fputs( "    ", cfile );
+	}
+	fprintf( cfile, "<!--%s-->", value.c_str() );
+}
+
+void TiXmlComment::StreamOut( TIXML_OSTREAM * stream ) const
+{
+	(*stream) << "<!--";
+	//PutString( value, stream );
+	(*stream) << value;
+	(*stream) << "-->";
+}
+
+
+void TiXmlComment::CopyTo( TiXmlComment* target ) const
+{
+	TiXmlNode::CopyTo( target );
+}
+
+
+TiXmlNode* TiXmlComment::Clone() const
+{
+	TiXmlComment* clone = new TiXmlComment();
+
+	if ( !clone )
+		return 0;
+
+	CopyTo( clone );
+	return clone;
+}
+
+
+void TiXmlText::Print( FILE* cfile, int /*depth*/ ) const
+{
+	TIXML_STRING buffer;
+	PutString( value, &buffer );
+	fprintf( cfile, "%s", buffer.c_str() );
+}
+
+
+void TiXmlText::StreamOut( TIXML_OSTREAM * stream ) const
+{
+	PutString( value, stream );
+}
+
+
+void TiXmlText::CopyTo( TiXmlText* target ) const
+{
+	TiXmlNode::CopyTo( target );
+}
+
+
+TiXmlNode* TiXmlText::Clone() const
+{	
+	TiXmlText* clone = 0;
+	clone = new TiXmlText( "" );
+
+	if ( !clone )
+		return 0;
+
+	CopyTo( clone );
+	return clone;
+}
+
+
+TiXmlDeclaration::TiXmlDeclaration( const char * _version,
+									const char * _encoding,
+									const char * _standalone )
+	: TiXmlNode( TiXmlNode::DECLARATION )
+{
+	version = _version;
+	encoding = _encoding;
+	standalone = _standalone;
+}
+
+
+#ifdef TIXML_USE_STL
+TiXmlDeclaration::TiXmlDeclaration(	const std::string& _version,
+									const std::string& _encoding,
+									const std::string& _standalone )
+	: TiXmlNode( TiXmlNode::DECLARATION )
+{
+	version = _version;
+	encoding = _encoding;
+	standalone = _standalone;
+}
+#endif
+
+
+TiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy )
+	: TiXmlNode( TiXmlNode::DECLARATION )
+{
+	copy.CopyTo( this );	
+}
+
+
+void TiXmlDeclaration::operator=( const TiXmlDeclaration& copy )
+{
+	Clear();
+	copy.CopyTo( this );
+}
+
+
+void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/ ) const
+{
+	fprintf (cfile, "<?xml ");
+
+	if ( !version.empty() )
+		fprintf (cfile, "version=\"%s\" ", version.c_str ());
+	if ( !encoding.empty() )
+		fprintf (cfile, "encoding=\"%s\" ", encoding.c_str ());
+	if ( !standalone.empty() )
+		fprintf (cfile, "standalone=\"%s\" ", standalone.c_str ());
+	fprintf (cfile, "?>");
+}
+
+void TiXmlDeclaration::StreamOut( TIXML_OSTREAM * stream ) const
+{
+	(*stream) << "<?xml ";
+
+	if ( !version.empty() )
+	{
+		(*stream) << "version=\"";
+		PutString( version, stream );
+		(*stream) << "\" ";
+	}
+	if ( !encoding.empty() )
+	{
+		(*stream) << "encoding=\"";
+		PutString( encoding, stream );
+		(*stream ) << "\" ";
+	}
+	if ( !standalone.empty() )
+	{
+		(*stream) << "standalone=\"";
+		PutString( standalone, stream );
+		(*stream) << "\" ";
+	}
+	(*stream) << "?>";
+}
+
+
+void TiXmlDeclaration::CopyTo( TiXmlDeclaration* target ) const
+{
+	TiXmlNode::CopyTo( target );
+
+	target->version = version;
+	target->encoding = encoding;
+	target->standalone = standalone;
+}
+
+
+TiXmlNode* TiXmlDeclaration::Clone() const
+{	
+	TiXmlDeclaration* clone = new TiXmlDeclaration();
+
+	if ( !clone )
+		return 0;
+
+	CopyTo( clone );
+	return clone;
+}
+
+
+void TiXmlUnknown::Print( FILE* cfile, int depth ) const
+{
+	for ( int i=0; i<depth; i++ )
+		fprintf( cfile, "    " );
+	fprintf( cfile, "<%s>", value.c_str() );
+}
+
+
+void TiXmlUnknown::StreamOut( TIXML_OSTREAM * stream ) const
+{
+	(*stream) << "<" << value << ">";		// Don't use entities here! It is unknown.
+}
+
+
+void TiXmlUnknown::CopyTo( TiXmlUnknown* target ) const
+{
+	TiXmlNode::CopyTo( target );
+}
+
+
+TiXmlNode* TiXmlUnknown::Clone() const
+{
+	TiXmlUnknown* clone = new TiXmlUnknown();
+
+	if ( !clone )
+		return 0;
+
+	CopyTo( clone );
+	return clone;
+}
+
+
+TiXmlAttributeSet::TiXmlAttributeSet()
+{
+	sentinel.next = &sentinel;
+	sentinel.prev = &sentinel;
+}
+
+
+TiXmlAttributeSet::~TiXmlAttributeSet()
+{
+	assert( sentinel.next == &sentinel );
+	assert( sentinel.prev == &sentinel );
+}
+
+
+void TiXmlAttributeSet::Add( TiXmlAttribute* addMe )
+{
+	assert( !Find( addMe->Name() ) );	// Shouldn't be multiply adding to the set.
+
+	addMe->next = &sentinel;
+	addMe->prev = sentinel.prev;
+
+	sentinel.prev->next = addMe;
+	sentinel.prev      = addMe;
+}
+
+void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe )
+{
+	TiXmlAttribute* node;
+
+	for( node = sentinel.next; node != &sentinel; node = node->next )
+	{
+		if ( node == removeMe )
+		{
+			node->prev->next = node->next;
+			node->next->prev = node->prev;
+			node->next = 0;
+			node->prev = 0;
+			return;
+		}
+	}
+	assert( 0 );		// we tried to remove a non-linked attribute.
+}
+
+const TiXmlAttribute*	TiXmlAttributeSet::Find( const char * name ) const
+{
+	const TiXmlAttribute* node;
+
+	for( node = sentinel.next; node != &sentinel; node = node->next )
+	{
+		if ( node->name == name )
+			return node;
+	}
+	return 0;
+}
+
+TiXmlAttribute*	TiXmlAttributeSet::Find( const char * name )
+{
+	TiXmlAttribute* node;
+
+	for( node = sentinel.next; node != &sentinel; node = node->next )
+	{
+		if ( node->name == name )
+			return node;
+	}
+	return 0;
+}
+
+#ifdef TIXML_USE_STL	
+TIXML_ISTREAM & operator >> (TIXML_ISTREAM & in, TiXmlNode & base)
+{
+	TIXML_STRING tag;
+	tag.reserve( 8 * 1000 );
+	base.StreamIn( &in, &tag );
+
+	base.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING );
+	return in;
+}
+#endif
+
+
+TIXML_OSTREAM & operator<< (TIXML_OSTREAM & out, const TiXmlNode & base)
+{
+	base.StreamOut (& out);
+	return out;
+}
+
+
+#ifdef TIXML_USE_STL	
+std::string & operator<< (std::string& out, const TiXmlNode& base )
+{
+   std::ostringstream os_stream( std::ostringstream::out );
+   base.StreamOut( &os_stream );
+   
+   out.append( os_stream.str() );
+   return out;
+}
+#endif
+
+
+TiXmlHandle TiXmlHandle::FirstChild() const
+{
+	if ( node )
+	{
+		TiXmlNode* child = node->FirstChild();
+		if ( child )
+			return TiXmlHandle( child );
+	}
+	return TiXmlHandle( 0 );
+}
+
+
+TiXmlHandle TiXmlHandle::FirstChild( const char * value ) const
+{
+	if ( node )
+	{
+		TiXmlNode* child = node->FirstChild( value );
+		if ( child )
+			return TiXmlHandle( child );
+	}
+	return TiXmlHandle( 0 );
+}
+
+
+TiXmlHandle TiXmlHandle::FirstChildElement() const
+{
+	if ( node )
+	{
+		TiXmlElement* child = node->FirstChildElement();
+		if ( child )
+			return TiXmlHandle( child );
+	}
+	return TiXmlHandle( 0 );
+}
+
+
+TiXmlHandle TiXmlHandle::FirstChildElement( const char * value ) const
+{
+	if ( node )
+	{
+		TiXmlElement* child = node->FirstChildElement( value );
+		if ( child )
+			return TiXmlHandle( child );
+	}
+	return TiXmlHandle( 0 );
+}
+
+
+TiXmlHandle TiXmlHandle::Child( int count ) const
+{
+	if ( node )
+	{
+		int i;
+		TiXmlNode* child = node->FirstChild();
+		for (	i=0;
+				child && i<count;
+				child = child->NextSibling(), ++i )
+		{
+			// nothing
+		}
+		if ( child )
+			return TiXmlHandle( child );
+	}
+	return TiXmlHandle( 0 );
+}
+
+
+TiXmlHandle TiXmlHandle::Child( const char* value, int count ) const
+{
+	if ( node )
+	{
+		int i;
+		TiXmlNode* child = node->FirstChild( value );
+		for (	i=0;
+				child && i<count;
+				child = child->NextSibling( value ), ++i )
+		{
+			// nothing
+		}
+		if ( child )
+			return TiXmlHandle( child );
+	}
+	return TiXmlHandle( 0 );
+}
+
+
+TiXmlHandle TiXmlHandle::ChildElement( int count ) const
+{
+	if ( node )
+	{
+		int i;
+		TiXmlElement* child = node->FirstChildElement();
+		for (	i=0;
+				child && i<count;
+				child = child->NextSiblingElement(), ++i )
+		{
+			// nothing
+		}
+		if ( child )
+			return TiXmlHandle( child );
+	}
+	return TiXmlHandle( 0 );
+}
+
+
+TiXmlHandle TiXmlHandle::ChildElement( const char* value, int count ) const
+{
+	if ( node )
+	{
+		int i;
+		TiXmlElement* child = node->FirstChildElement( value );
+		for (	i=0;
+				child && i<count;
+				child = child->NextSiblingElement( value ), ++i )
+		{
+			// nothing
+		}
+		if ( child )
+			return TiXmlHandle( child );
+	}
+	return TiXmlHandle( 0 );
+}
Index: orxonox/branches/openAL/src/lib/xmlparser/tinyxml.h
===================================================================
--- orxonox/branches/openAL/src/lib/xmlparser/tinyxml.h	(revision 4194)
+++ orxonox/branches/openAL/src/lib/xmlparser/tinyxml.h	(revision 4194)
@@ -0,0 +1,1422 @@
+/*
+www.sourceforge.net/projects/tinyxml
+Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any
+purpose, including commercial applications, and to alter it and
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must
+not claim that you wrote the original software. If you use this
+software in a product, an acknowledgment in the product documentation
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+distribution.
+*/
+
+
+#ifndef TINYXML_INCLUDED
+#define TINYXML_INCLUDED
+
+#ifdef _MSC_VER
+#pragma warning( disable : 4530 )
+#pragma warning( disable : 4786 )
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+// Help out windows:
+#if defined( _DEBUG ) && !defined( DEBUG )
+#define DEBUG
+#endif
+
+#if defined( DEBUG ) && defined( _MSC_VER )
+#include <windows.h>
+#define TIXML_LOG OutputDebugString
+#else
+#define TIXML_LOG printf
+#endif
+
+#ifdef TIXML_USE_STL
+	#include <string>
+ 	#include <iostream>
+	#define TIXML_STRING	std::string
+	#define TIXML_ISTREAM	std::istream
+	#define TIXML_OSTREAM	std::ostream
+#else
+	#include "tinystr.h"
+	#define TIXML_STRING	TiXmlString
+	#define TIXML_OSTREAM	TiXmlOutStream
+#endif
+
+class TiXmlDocument;
+class TiXmlElement;
+class TiXmlComment;
+class TiXmlUnknown;
+class TiXmlAttribute;
+class TiXmlText;
+class TiXmlDeclaration;
+class TiXmlParsingData;
+
+const int TIXML_MAJOR_VERSION = 2;
+const int TIXML_MINOR_VERSION = 3;
+const int TIXML_PATCH_VERSION = 3;
+
+/*	Internal structure for tracking location of items 
+	in the XML file.
+*/
+struct TiXmlCursor
+{
+	TiXmlCursor()		{ Clear(); }
+	void Clear()		{ row = col = -1; }
+
+	int row;	// 0 based.
+	int col;	// 0 based.
+};
+
+
+// Only used by Attribute::Query functions
+enum 
+{ 
+	TIXML_SUCCESS,
+	TIXML_NO_ATTRIBUTE,
+	TIXML_WRONG_TYPE
+};
+
+
+// Used by the parsing routines.
+enum TiXmlEncoding
+{
+	TIXML_ENCODING_UNKNOWN,
+	TIXML_ENCODING_UTF8,
+	TIXML_ENCODING_LEGACY
+};
+
+const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN;
+
+/** TiXmlBase is a base class for every class in TinyXml.
+	It does little except to establish that TinyXml classes
+	can be printed and provide some utility functions.
+
+	In XML, the document and elements can contain
+	other elements and other types of nodes.
+
+	@verbatim
+	A Document can contain:	Element	(container or leaf)
+							Comment (leaf)
+							Unknown (leaf)
+							Declaration( leaf )
+
+	An Element can contain:	Element (container or leaf)
+							Text	(leaf)
+							Attributes (not on tree)
+							Comment (leaf)
+							Unknown (leaf)
+
+	A Decleration contains: Attributes (not on tree)
+	@endverbatim
+*/
+class TiXmlBase
+{
+	friend class TiXmlNode;
+	friend class TiXmlElement;
+	friend class TiXmlDocument;
+
+public:
+	TiXmlBase()	:	userData(0) {}
+	virtual ~TiXmlBase()					{}
+
+	/**	All TinyXml classes can print themselves to a filestream.
+		This is a formatted print, and will insert tabs and newlines.
+		
+		(For an unformatted stream, use the << operator.)
+	*/
+	virtual void Print( FILE* cfile, int depth ) const = 0;
+
+	/**	The world does not agree on whether white space should be kept or
+		not. In order to make everyone happy, these global, static functions
+		are provided to set whether or not TinyXml will condense all white space
+		into a single space or not. The default is to condense. Note changing this
+		values is not thread safe.
+	*/
+	static void SetCondenseWhiteSpace( bool condense )		{ condenseWhiteSpace = condense; }
+
+	/// Return the current white space setting.
+	static bool IsWhiteSpaceCondensed()						{ return condenseWhiteSpace; }
+
+	/** Return the position, in the original source file, of this node or attribute.
+		The row and column are 1-based. (That is the first row and first column is
+		1,1). If the returns values are 0 or less, then the parser does not have
+		a row and column value.
+
+		Generally, the row and column value will be set when the TiXmlDocument::Load(),
+		TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set
+		when the DOM was created from operator>>.
+
+		The values reflect the initial load. Once the DOM is modified programmatically
+		(by adding or changing nodes and attributes) the new values will NOT update to
+		reflect changes in the document.
+
+		There is a minor performance cost to computing the row and column. Computation
+		can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value.
+
+		@sa TiXmlDocument::SetTabSize()
+	*/
+	int Row() const			{ return location.row + 1; }
+	int Column() const		{ return location.col + 1; }	///< See Row()
+
+	void  SetUserData( void* user )			{ userData = user; }
+	void* GetUserData()						{ return userData; }
+
+	// Table that returs, for a given lead byte, the total number of bytes
+	// in the UTF-8 sequence.
+	static const int utf8ByteTable[256];
+
+	virtual const char* Parse(	const char* p, 
+								TiXmlParsingData* data, 
+								TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0;
+
+	enum
+	{
+		TIXML_NO_ERROR = 0,
+		TIXML_ERROR,
+		TIXML_ERROR_OPENING_FILE,
+		TIXML_ERROR_OUT_OF_MEMORY,
+		TIXML_ERROR_PARSING_ELEMENT,
+		TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME,
+		TIXML_ERROR_READING_ELEMENT_VALUE,
+		TIXML_ERROR_READING_ATTRIBUTES,
+		TIXML_ERROR_PARSING_EMPTY,
+		TIXML_ERROR_READING_END_TAG,
+		TIXML_ERROR_PARSING_UNKNOWN,
+		TIXML_ERROR_PARSING_COMMENT,
+		TIXML_ERROR_PARSING_DECLARATION,
+		TIXML_ERROR_DOCUMENT_EMPTY,
+		TIXML_ERROR_EMBEDDED_NULL,
+
+		TIXML_ERROR_STRING_COUNT
+	};
+
+protected:
+
+	// See STL_STRING_BUG
+	// Utility class to overcome a bug.
+	class StringToBuffer
+	{
+	  public:
+		StringToBuffer( const TIXML_STRING& str );
+		~StringToBuffer();
+		char* buffer;
+	};
+
+	static const char*	SkipWhiteSpace( const char*, TiXmlEncoding encoding );
+	inline static bool	IsWhiteSpace( char c )		
+	{ 
+		return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); 
+	}
+
+	virtual void StreamOut (TIXML_OSTREAM *) const = 0;
+
+	#ifdef TIXML_USE_STL
+	    static bool	StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	    static bool StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag );
+	#endif
+
+	/*	Reads an XML name into the string provided. Returns
+		a pointer just past the last character of the name,
+		or 0 if the function has an error.
+	*/
+	static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding );
+
+	/*	Reads text. Returns a pointer past the given end tag.
+		Wickedly complex options, but it keeps the (sensitive) code in one place.
+	*/
+	static const char* ReadText(	const char* in,				// where to start
+									TIXML_STRING* text,			// the string read
+									bool ignoreWhiteSpace,		// whether to keep the white space
+									const char* endTag,			// what ends this text
+									bool ignoreCase,			// whether to ignore case in the end tag
+									TiXmlEncoding encoding );	// the current encoding
+
+	// If an entity has been found, transform it into a character.
+	static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding );
+
+	// Get a character, while interpreting entities.
+	// The length can be from 0 to 4 bytes.
+	inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding )
+	{
+		assert( p );
+		if ( encoding == TIXML_ENCODING_UTF8 )
+		{
+			*length = utf8ByteTable[ *((unsigned char*)p) ];
+			assert( *length >= 0 && *length < 5 );
+		}
+		else
+		{
+			*length = 1;
+		}
+
+		if ( *length == 1 )
+		{
+			if ( *p == '&' )
+				return GetEntity( p, _value, length, encoding );
+			*_value = *p;
+			return p+1;
+		}
+		else if ( *length )
+		{
+			strncpy( _value, p, *length );
+			return p + (*length);
+		}
+		else
+		{
+			// Not valid text.
+			return 0;
+		}
+	}
+
+	// Puts a string to a stream, expanding entities as it goes.
+	// Note this should not contian the '<', '>', etc, or they will be transformed into entities!
+	static void PutString( const TIXML_STRING& str, TIXML_OSTREAM* out );
+
+	static void PutString( const TIXML_STRING& str, TIXML_STRING* out );
+
+	// Return true if the next characters in the stream are any of the endTag sequences.
+	// Ignore case only works for english, and should only be relied on when comparing
+	// to Engilish words: StringEqual( p, "version", true ) is fine.
+	static bool StringEqual(	const char* p,
+								const char* endTag,
+								bool ignoreCase,
+								TiXmlEncoding encoding );
+
+	static const char* errorString[ TIXML_ERROR_STRING_COUNT ];
+
+	TiXmlCursor location;
+
+    /// Field containing a generic user pointer
+	void*			userData;
+	
+	// None of these methods are reliable for any language except English.
+	// Good for approximation, not great for accuracy.
+	static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding );
+	static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding );
+	inline static int ToLower( int v, TiXmlEncoding encoding )
+	{
+		if ( encoding == TIXML_ENCODING_UTF8 )
+		{
+			if ( v < 128 ) return tolower( v );
+			return v;
+		}
+		else
+		{
+			return tolower( v );
+		}
+	}
+	static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length );
+
+private:
+	TiXmlBase( const TiXmlBase& );				// not implemented.
+	void operator=( const TiXmlBase& base );	// not allowed.
+
+	struct Entity
+	{
+		const char*     str;
+		unsigned int	strLength;
+		char		    chr;
+	};
+	enum
+	{
+		NUM_ENTITY = 5,
+		MAX_ENTITY_LENGTH = 6
+
+	};
+	static Entity entity[ NUM_ENTITY ];
+	static bool condenseWhiteSpace;
+};
+
+
+/** The parent class for everything in the Document Object Model.
+	(Except for attributes).
+	Nodes have siblings, a parent, and children. A node can be
+	in a document, or stand on its own. The type of a TiXmlNode
+	can be queried, and it can be cast to its more defined type.
+*/
+class TiXmlNode : public TiXmlBase
+{
+	friend class TiXmlDocument;
+	friend class TiXmlElement;
+
+public:
+	#ifdef TIXML_USE_STL	
+
+	    /** An input stream operator, for every class. Tolerant of newlines and
+		    formatting, but doesn't expect them.
+	    */
+	    friend std::istream& operator >> (std::istream& in, TiXmlNode& base);
+
+	    /** An output stream operator, for every class. Note that this outputs
+		    without any newlines or formatting, as opposed to Print(), which
+		    includes tabs and new lines.
+
+		    The operator<< and operator>> are not completely symmetric. Writing
+		    a node to a stream is very well defined. You'll get a nice stream
+		    of output, without any extra whitespace or newlines.
+		    
+		    But reading is not as well defined. (As it always is.) If you create
+		    a TiXmlElement (for example) and read that from an input stream,
+		    the text needs to define an element or junk will result. This is
+		    true of all input streams, but it's worth keeping in mind.
+
+		    A TiXmlDocument will read nodes until it reads a root element, and
+			all the children of that root element.
+	    */	
+	    friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base);
+
+		/// Appends the XML node or attribute to a std::string.
+		friend std::string& operator<< (std::string& out, const TiXmlNode& base );
+
+	#else
+	    // Used internally, not part of the public API.
+	    friend TIXML_OSTREAM& operator<< (TIXML_OSTREAM& out, const TiXmlNode& base);
+	#endif
+
+	/** The types of XML nodes supported by TinyXml. (All the
+			unsupported types are picked up by UNKNOWN.)
+	*/
+	enum NodeType
+	{
+		DOCUMENT,
+		ELEMENT,
+		COMMENT,
+		UNKNOWN,
+		TEXT,
+		DECLARATION,
+		TYPECOUNT
+	};
+
+	virtual ~TiXmlNode();
+
+	/** The meaning of 'value' changes for the specific type of
+		TiXmlNode.
+		@verbatim
+		Document:	filename of the xml file
+		Element:	name of the element
+		Comment:	the comment text
+		Unknown:	the tag contents
+		Text:		the text string
+		@endverbatim
+
+		The subclasses will wrap this function.
+	*/
+	const char * Value() const { return value.c_str (); }
+
+	/** Changes the value of the node. Defined as:
+		@verbatim
+		Document:	filename of the xml file
+		Element:	name of the element
+		Comment:	the comment text
+		Unknown:	the tag contents
+		Text:		the text string
+		@endverbatim
+	*/
+	void SetValue(const char * _value) { value = _value;}
+
+    #ifdef TIXML_USE_STL
+	/// STL std::string form.
+	void SetValue( const std::string& _value )    
+	{	  
+		StringToBuffer buf( _value );
+		SetValue( buf.buffer ? buf.buffer : "" );    	
+	}	
+	#endif
+
+	/// Delete all the children of this node. Does not affect 'this'.
+	void Clear();
+
+	/// One step up the DOM.
+	TiXmlNode* Parent()							{ return parent; }
+	const TiXmlNode* Parent() const				{ return parent; }
+
+	const TiXmlNode* FirstChild()	const	{ return firstChild; }		///< The first child of this node. Will be null if there are no children.
+	TiXmlNode* FirstChild()					{ return firstChild; }
+	const TiXmlNode* FirstChild( const char * value ) const;			///< The first child of this node with the matching 'value'. Will be null if none found.
+	TiXmlNode* FirstChild( const char * value );						///< The first child of this node with the matching 'value'. Will be null if none found.
+
+	const TiXmlNode* LastChild() const	{ return lastChild; }		/// The last child of this node. Will be null if there are no children.
+	TiXmlNode* LastChild()	{ return lastChild; }
+	const TiXmlNode* LastChild( const char * value ) const;			/// The last child of this node matching 'value'. Will be null if there are no children.
+	TiXmlNode* LastChild( const char * value );	
+
+    #ifdef TIXML_USE_STL
+	const TiXmlNode* FirstChild( const std::string& _value ) const	{	return FirstChild (_value.c_str ());	}	///< STL std::string form.
+	TiXmlNode* FirstChild( const std::string& _value )				{	return FirstChild (_value.c_str ());	}	///< STL std::string form.
+	const TiXmlNode* LastChild( const std::string& _value ) const	{	return LastChild (_value.c_str ());	}	///< STL std::string form.
+	TiXmlNode* LastChild( const std::string& _value )				{	return LastChild (_value.c_str ());	}	///< STL std::string form.
+	#endif
+
+	/** An alternate way to walk the children of a node.
+		One way to iterate over nodes is:
+		@verbatim
+			for( child = parent->FirstChild(); child; child = child->NextSibling() )
+		@endverbatim
+
+		IterateChildren does the same thing with the syntax:
+		@verbatim
+			child = 0;
+			while( child = parent->IterateChildren( child ) )
+		@endverbatim
+
+		IterateChildren takes the previous child as input and finds
+		the next one. If the previous child is null, it returns the
+		first. IterateChildren will return null when done.
+	*/
+	const TiXmlNode* IterateChildren( TiXmlNode* previous ) const;
+	TiXmlNode* IterateChildren( TiXmlNode* previous );
+
+	/// This flavor of IterateChildren searches for children with a particular 'value'
+	const TiXmlNode* IterateChildren( const char * value, TiXmlNode* previous ) const;
+	TiXmlNode* IterateChildren( const char * value, TiXmlNode* previous );
+
+    #ifdef TIXML_USE_STL
+	const TiXmlNode* IterateChildren( const std::string& _value, TiXmlNode* previous ) const	{	return IterateChildren (_value.c_str (), previous);	}	///< STL std::string form.
+	TiXmlNode* IterateChildren( const std::string& _value, TiXmlNode* previous ) {	return IterateChildren (_value.c_str (), previous);	}	///< STL std::string form.
+	#endif
+
+	/** Add a new node related to this. Adds a child past the LastChild.
+		Returns a pointer to the new object or NULL if an error occured.
+	*/
+	TiXmlNode* InsertEndChild( const TiXmlNode& addThis );
+
+
+	/** Add a new node related to this. Adds a child past the LastChild.
+
+		NOTE: the node to be added is passed by pointer, and will be
+		henceforth owned (and deleted) by tinyXml. This method is efficient
+		and avoids an extra copy, but should be used with care as it
+		uses a different memory model than the other insert functions.
+
+		@sa InsertEndChild
+	*/
+	TiXmlNode* LinkEndChild( TiXmlNode* addThis );
+
+	/** Add a new node related to this. Adds a child before the specified child.
+		Returns a pointer to the new object or NULL if an error occured.
+	*/
+	TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis );
+
+	/** Add a new node related to this. Adds a child after the specified child.
+		Returns a pointer to the new object or NULL if an error occured.
+	*/
+	TiXmlNode* InsertAfterChild(  TiXmlNode* afterThis, const TiXmlNode& addThis );
+
+	/** Replace a child of this node.
+		Returns a pointer to the new object or NULL if an error occured.
+	*/
+	TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );
+
+	/// Delete a child of this node.
+	bool RemoveChild( TiXmlNode* removeThis );
+
+	/// Navigate to a sibling node.
+	const TiXmlNode* PreviousSibling() const			{ return prev; }
+	TiXmlNode* PreviousSibling()						{ return prev; }
+
+	/// Navigate to a sibling node.
+	const TiXmlNode* PreviousSibling( const char * ) const;
+	TiXmlNode* PreviousSibling( const char * );
+
+    #ifdef TIXML_USE_STL
+	const TiXmlNode* PreviousSibling( const std::string& _value ) const	{	return PreviousSibling (_value.c_str ());	}	///< STL std::string form.
+	TiXmlNode* PreviousSibling( const std::string& _value ) 			{	return PreviousSibling (_value.c_str ());	}	///< STL std::string form.
+	const TiXmlNode* NextSibling( const std::string& _value) const		{	return NextSibling (_value.c_str ());	}	///< STL std::string form.
+	TiXmlNode* NextSibling( const std::string& _value) 					{	return NextSibling (_value.c_str ());	}	///< STL std::string form.
+	#endif
+
+	/// Navigate to a sibling node.
+	const TiXmlNode* NextSibling() const				{ return next; }
+	TiXmlNode* NextSibling()							{ return next; }
+
+	/// Navigate to a sibling node with the given 'value'.
+	const TiXmlNode* NextSibling( const char * ) const;
+	TiXmlNode* NextSibling( const char * );
+
+	/** Convenience function to get through elements.
+		Calls NextSibling and ToElement. Will skip all non-Element
+		nodes. Returns 0 if there is not another element.
+	*/
+	const TiXmlElement* NextSiblingElement() const;
+	TiXmlElement* NextSiblingElement();
+
+	/** Convenience function to get through elements.
+		Calls NextSibling and ToElement. Will skip all non-Element
+		nodes. Returns 0 if there is not another element.
+	*/
+	const TiXmlElement* NextSiblingElement( const char * ) const;
+	TiXmlElement* NextSiblingElement( const char * );
+
+    #ifdef TIXML_USE_STL
+	const TiXmlElement* NextSiblingElement( const std::string& _value) const	{	return NextSiblingElement (_value.c_str ());	}	///< STL std::string form.
+	TiXmlElement* NextSiblingElement( const std::string& _value)				{	return NextSiblingElement (_value.c_str ());	}	///< STL std::string form.
+	#endif
+
+	/// Convenience function to get through elements.
+	const TiXmlElement* FirstChildElement()	const;
+	TiXmlElement* FirstChildElement();
+
+	/// Convenience function to get through elements.
+	const TiXmlElement* FirstChildElement( const char * value ) const;
+	TiXmlElement* FirstChildElement( const char * value );
+
+    #ifdef TIXML_USE_STL
+	const TiXmlElement* FirstChildElement( const std::string& _value ) const	{	return FirstChildElement (_value.c_str ());	}	///< STL std::string form.
+	TiXmlElement* FirstChildElement( const std::string& _value )				{	return FirstChildElement (_value.c_str ());	}	///< STL std::string form.
+	#endif
+
+	/** Query the type (as an enumerated value, above) of this node.
+		The possible types are: DOCUMENT, ELEMENT, COMMENT,
+								UNKNOWN, TEXT, and DECLARATION.
+	*/
+	virtual int Type() const	{ return type; }
+
+	/** Return a pointer to the Document this node lives in.
+		Returns null if not in a document.
+	*/
+	const TiXmlDocument* GetDocument() const;
+	TiXmlDocument* GetDocument();
+
+	/// Returns true if this node has no children.
+	bool NoChildren() const						{ return !firstChild; }
+
+	const TiXmlDocument* ToDocument()	const		{ return ( this && type == DOCUMENT ) ? (const TiXmlDocument*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	const TiXmlElement*  ToElement() const			{ return ( this && type == ELEMENT  ) ? (const TiXmlElement*)  this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	const TiXmlComment*  ToComment() const			{ return ( this && type == COMMENT  ) ? (const TiXmlComment*)  this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	const TiXmlUnknown*  ToUnknown() const			{ return ( this && type == UNKNOWN  ) ? (const TiXmlUnknown*)  this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	const TiXmlText*	   ToText()    const		{ return ( this && type == TEXT     ) ? (const TiXmlText*)     this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	const TiXmlDeclaration* ToDeclaration() const	{ return ( this && type == DECLARATION ) ? (const TiXmlDeclaration*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+
+	TiXmlDocument* ToDocument()			{ return ( this && type == DOCUMENT ) ? (TiXmlDocument*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	TiXmlElement*  ToElement()			{ return ( this && type == ELEMENT  ) ? (TiXmlElement*)  this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	TiXmlComment*  ToComment()			{ return ( this && type == COMMENT  ) ? (TiXmlComment*)  this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	TiXmlUnknown*  ToUnknown()			{ return ( this && type == UNKNOWN  ) ? (TiXmlUnknown*)  this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	TiXmlText*	   ToText()   			{ return ( this && type == TEXT     ) ? (TiXmlText*)     this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+	TiXmlDeclaration* ToDeclaration()	{ return ( this && type == DECLARATION ) ? (TiXmlDeclaration*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type.
+
+	/** Create an exact duplicate of this node and return it. The memory must be deleted
+		by the caller. 
+	*/
+	virtual TiXmlNode* Clone() const = 0;
+
+protected:
+	TiXmlNode( NodeType _type );
+
+	// Copy to the allocated object. Shared functionality between Clone, Copy constructor,
+	// and the assignment operator.
+	void CopyTo( TiXmlNode* target ) const;
+
+	#ifdef TIXML_USE_STL
+	    // The real work of the input operator.
+	    virtual void StreamIn( TIXML_ISTREAM* in, TIXML_STRING* tag ) = 0;
+	#endif
+
+	// Figure out what is at *p, and parse it. Returns null if it is not an xml node.
+	TiXmlNode* Identify( const char* start, TiXmlEncoding encoding );
+
+	// Internal Value function returning a TIXML_STRING
+	const TIXML_STRING& SValue() const	{ return value ; }
+
+	TiXmlNode*		parent;
+	NodeType		type;
+
+	TiXmlNode*		firstChild;
+	TiXmlNode*		lastChild;
+
+	TIXML_STRING	value;
+
+	TiXmlNode*		prev;
+	TiXmlNode*		next;
+
+private:
+	TiXmlNode( const TiXmlNode& );				// not implemented.
+	void operator=( const TiXmlNode& base );	// not allowed.
+};
+
+
+/** An attribute is a name-value pair. Elements have an arbitrary
+	number of attributes, each with a unique name.
+
+	@note The attributes are not TiXmlNodes, since they are not
+		  part of the tinyXML document object model. There are other
+		  suggested ways to look at this problem.
+*/
+class TiXmlAttribute : public TiXmlBase
+{
+	friend class TiXmlAttributeSet;
+
+public:
+	/// Construct an empty attribute.
+	TiXmlAttribute() : TiXmlBase()
+	{
+		document = 0;
+		prev = next = 0;
+	}
+
+	#ifdef TIXML_USE_STL
+	/// std::string constructor.
+	TiXmlAttribute( const std::string& _name, const std::string& _value )
+	{
+		name = _name;
+		value = _value;
+		document = 0;
+		prev = next = 0;
+	}
+	#endif
+
+	/// Construct an attribute with a name and value.
+	TiXmlAttribute( const char * _name, const char * _value )
+	{
+		name = _name;
+		value = _value;
+		document = 0;
+		prev = next = 0;
+	}
+
+	const char*		Name()  const		{ return name.c_str (); }		///< Return the name of this attribute.
+	const char*		Value() const		{ return value.c_str (); }		///< Return the value of this attribute.
+	const int       IntValue() const;									///< Return the value of this attribute, converted to an integer.
+	const double	DoubleValue() const;								///< Return the value of this attribute, converted to a double.
+
+	/** QueryIntValue examines the value string. It is an alternative to the
+		IntValue() method with richer error checking.
+		If the value is an integer, it is stored in 'value' and 
+		the call returns TIXML_SUCCESS. If it is not
+		an integer, it returns TIXML_WRONG_TYPE.
+
+		A specialized but useful call. Note that for success it returns 0,
+		which is the opposite of almost all other TinyXml calls.
+	*/
+	int QueryIntValue( int* value ) const;
+	/// QueryDoubleValue examines the value string. See QueryIntValue().
+	int QueryDoubleValue( double* value ) const;
+
+	void SetName( const char* _name )	{ name = _name; }				///< Set the name of this attribute.
+	void SetValue( const char* _value )	{ value = _value; }				///< Set the value.
+
+	void SetIntValue( int value );										///< Set the value from an integer.
+	void SetDoubleValue( double value );								///< Set the value from a double.
+
+    #ifdef TIXML_USE_STL
+	/// STL std::string form.
+	void SetName( const std::string& _name )	
+	{	
+		StringToBuffer buf( _name );
+		SetName ( buf.buffer ? buf.buffer : "error" );	
+	}
+	/// STL std::string form.	
+	void SetValue( const std::string& _value )	
+	{	
+		StringToBuffer buf( _value );
+		SetValue( buf.buffer ? buf.buffer : "error" );	
+	}
+	#endif
+
+	/// Get the next sibling attribute in the DOM. Returns null at end.
+	const TiXmlAttribute* Next() const;
+	TiXmlAttribute* Next();
+	/// Get the previous sibling attribute in the DOM. Returns null at beginning.
+	const TiXmlAttribute* Previous() const;
+	TiXmlAttribute* Previous();
+
+	bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; }
+	bool operator<( const TiXmlAttribute& rhs )	 const { return name < rhs.name; }
+	bool operator>( const TiXmlAttribute& rhs )  const { return name > rhs.name; }
+
+	/*	Attribute parsing starts: first letter of the name
+						 returns: the next char after the value end quote
+	*/
+	virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
+
+	// Prints this Attribute to a FILE stream.
+	virtual void Print( FILE* cfile, int depth ) const;
+
+	virtual void StreamOut( TIXML_OSTREAM * out ) const;
+	// [internal use]
+	// Set the document pointer so the attribute can report errors.
+	void SetDocument( TiXmlDocument* doc )	{ document = doc; }
+
+private:
+	TiXmlAttribute( const TiXmlAttribute& );				// not implemented.
+	void operator=( const TiXmlAttribute& base );	// not allowed.
+
+	TiXmlDocument*	document;	// A pointer back to a document, for error reporting.
+	TIXML_STRING name;
+	TIXML_STRING value;
+	TiXmlAttribute*	prev;
+	TiXmlAttribute*	next;
+};
+
+
+/*	A class used to manage a group of attributes.
+	It is only used internally, both by the ELEMENT and the DECLARATION.
+	
+	The set can be changed transparent to the Element and Declaration
+	classes that use it, but NOT transparent to the Attribute
+	which has to implement a next() and previous() method. Which makes
+	it a bit problematic and prevents the use of STL.
+
+	This version is implemented with circular lists because:
+		- I like circular lists
+		- it demonstrates some independence from the (typical) doubly linked list.
+*/
+class TiXmlAttributeSet
+{
+public:
+	TiXmlAttributeSet();
+	~TiXmlAttributeSet();
+
+	void Add( TiXmlAttribute* attribute );
+	void Remove( TiXmlAttribute* attribute );
+
+	const TiXmlAttribute* First()	const	{ return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; }
+	TiXmlAttribute* First()					{ return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; }
+	const TiXmlAttribute* Last() const		{ return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; }
+	TiXmlAttribute* Last()					{ return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; }
+
+	const TiXmlAttribute*	Find( const char * name ) const;
+	TiXmlAttribute*	Find( const char * name );
+
+private:
+	//*ME:	Because of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element),
+	//*ME:	this class must be also use a hidden/disabled copy-constructor !!!
+	TiXmlAttributeSet( const TiXmlAttributeSet& );	// not allowed
+	void operator=( const TiXmlAttributeSet& );	// not allowed (as TiXmlAttribute)
+
+	TiXmlAttribute sentinel;
+};
+
+
+/** The element is a container class. It has a value, the element name,
+	and can contain other elements, text, comments, and unknowns.
+	Elements also contain an arbitrary number of attributes.
+*/
+class TiXmlElement : public TiXmlNode
+{
+public:
+	/// Construct an element.
+	TiXmlElement (const char * in_value);
+
+	#ifdef TIXML_USE_STL
+	/// std::string constructor.
+	TiXmlElement( const std::string& _value );
+	#endif
+
+	TiXmlElement( const TiXmlElement& );
+
+	void operator=( const TiXmlElement& base );
+
+	virtual ~TiXmlElement();
+
+	/** Given an attribute name, Attribute() returns the value
+		for the attribute of that name, or null if none exists.
+	*/
+	const char* Attribute( const char* name ) const;
+
+	/** Given an attribute name, Attribute() returns the value
+		for the attribute of that name, or null if none exists.
+		If the attribute exists and can be converted to an integer,
+		the integer value will be put in the return 'i', if 'i'
+		is non-null.
+	*/
+	const char* Attribute( const char* name, int* i ) const;
+
+	/** Given an attribute name, Attribute() returns the value
+		for the attribute of that name, or null if none exists.
+		If the attribute exists and can be converted to an double,
+		the double value will be put in the return 'd', if 'd'
+		is non-null.
+	*/
+	const char* Attribute( const char* name, double* d ) const;
+
+	/** QueryIntAttribute examines the attribute - it is an alternative to the
+		Attribute() method with richer error checking.
+		If the attribute is an integer, it is stored in 'value' and 
+		the call returns TIXML_SUCCESS. If it is not
+		an integer, it returns TIXML_WRONG_TYPE. If the attribute
+		does not exist, then TIXML_NO_ATTRIBUTE is returned.
+	*/	
+	int QueryIntAttribute( const char* name, int* value ) const;
+	/// QueryDoubleAttribute examines the attribute - see QueryIntAttribute().
+	int QueryDoubleAttribute( const char* name, double* value ) const;
+	/// QueryFloatAttribute examines the attribute - see QueryIntAttribute().
+	int QueryDoubleAttribute( const char* name, float* value ) const {
+		double d;
+		int result = QueryDoubleAttribute( name, &d );
+		*value = (float)d;
+		return result;
+	}
+
+	/** Sets an attribute of name to a given value. The attribute
+		will be created if it does not exist, or changed if it does.
+	*/
+	void SetAttribute( const char* name, const char * value );
+
+    #ifdef TIXML_USE_STL
+	const char* Attribute( const std::string& name ) const				{ return Attribute( name.c_str() ); }
+	const char* Attribute( const std::string& name, int* i ) const		{ return Attribute( name.c_str(), i ); }
+	const char* Attribute( const std::string& name, double* d ) const	{ return Attribute( name.c_str(), d ); }
+	int QueryIntAttribute( const std::string& name, int* value ) const	{ return QueryIntAttribute( name.c_str(), value ); }
+	int QueryDoubleAttribute( const std::string& name, double* value ) const { return QueryDoubleAttribute( name.c_str(), value ); }
+
+	/// STL std::string form.
+	void SetAttribute( const std::string& name, const std::string& _value )	
+	{	
+		StringToBuffer n( name );
+		StringToBuffer v( _value );
+		if ( n.buffer && v.buffer )
+			SetAttribute (n.buffer, v.buffer );	
+	}	
+	///< STL std::string form.
+	void SetAttribute( const std::string& name, int _value )	
+	{	
+		StringToBuffer n( name );
+		if ( n.buffer )
+			SetAttribute (n.buffer, _value);	
+	}	
+	#endif
+
+	/** Sets an attribute of name to a given value. The attribute
+		will be created if it does not exist, or changed if it does.
+	*/
+	void SetAttribute( const char * name, int value );
+
+	/** Sets an attribute of name to a given value. The attribute
+		will be created if it does not exist, or changed if it does.
+	*/
+	void SetDoubleAttribute( const char * name, double value );
+
+	/** Deletes an attribute with the given name.
+	*/
+	void RemoveAttribute( const char * name );
+    #ifdef TIXML_USE_STL
+	void RemoveAttribute( const std::string& name )	{	RemoveAttribute (name.c_str ());	}	///< STL std::string form.
+	#endif
+
+	const TiXmlAttribute* FirstAttribute() const	{ return attributeSet.First(); }		///< Access the first attribute in this element.
+	TiXmlAttribute* FirstAttribute() 				{ return attributeSet.First(); }
+	const TiXmlAttribute* LastAttribute()	const 	{ return attributeSet.Last(); }		///< Access the last attribute in this element.
+	TiXmlAttribute* LastAttribute()					{ return attributeSet.Last(); }
+
+	/// Creates a new Element and returns it - the returned element is a copy.
+	virtual TiXmlNode* Clone() const;
+	// Print the Element to a FILE stream.
+	virtual void Print( FILE* cfile, int depth ) const;
+
+	/*	Attribtue parsing starts: next char past '<'
+						 returns: next char past '>'
+	*/
+	virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
+
+protected:
+
+	void CopyTo( TiXmlElement* target ) const;
+	void ClearThis();	// like clear, but initializes 'this' object as well
+
+	// Used to be public [internal use]
+	#ifdef TIXML_USE_STL
+	    virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	#endif
+	virtual void StreamOut( TIXML_OSTREAM * out ) const;
+
+	/*	[internal use]
+		Reads the "value" of the element -- another element, or text.
+		This should terminate with the current end tag.
+	*/
+	const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding );
+
+private:
+
+	TiXmlAttributeSet attributeSet;
+};
+
+
+/**	An XML comment.
+*/
+class TiXmlComment : public TiXmlNode
+{
+public:
+	/// Constructs an empty comment.
+	TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) {}
+	TiXmlComment( const TiXmlComment& );
+	void operator=( const TiXmlComment& base );
+
+	virtual ~TiXmlComment()	{}
+
+	/// Returns a copy of this Comment.
+	virtual TiXmlNode* Clone() const;
+	/// Write this Comment to a FILE stream.
+	virtual void Print( FILE* cfile, int depth ) const;
+
+	/*	Attribtue parsing starts: at the ! of the !--
+						 returns: next char past '>'
+	*/
+	virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
+
+protected:
+	void CopyTo( TiXmlComment* target ) const;
+
+	// used to be public
+	#ifdef TIXML_USE_STL
+	    virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	#endif
+	virtual void StreamOut( TIXML_OSTREAM * out ) const;
+
+private:
+
+};
+
+
+/** XML text. Contained in an element.
+*/
+class TiXmlText : public TiXmlNode
+{
+	friend class TiXmlElement;
+public:
+	/// Constructor.
+	TiXmlText (const char * initValue) : TiXmlNode (TiXmlNode::TEXT)
+	{
+		SetValue( initValue );
+	}
+	virtual ~TiXmlText() {}
+
+	#ifdef TIXML_USE_STL
+	/// Constructor.
+	TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TEXT)
+	{
+		SetValue( initValue );
+	}
+	#endif
+
+	TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TEXT )	{ copy.CopyTo( this ); }
+	void operator=( const TiXmlText& base )							 	{ base.CopyTo( this ); }
+
+	/// Write this text object to a FILE stream.
+	virtual void Print( FILE* cfile, int depth ) const;
+
+	virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
+
+protected :
+	///  [internal use] Creates a new Element and returns it.
+	virtual TiXmlNode* Clone() const;
+	void CopyTo( TiXmlText* target ) const;
+
+	virtual void StreamOut ( TIXML_OSTREAM * out ) const;
+	bool Blank() const;	// returns true if all white space and new lines
+	// [internal use]
+	#ifdef TIXML_USE_STL
+	    virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	#endif
+
+private:
+};
+
+
+/** In correct XML the declaration is the first entry in the file.
+	@verbatim
+		<?xml version="1.0" standalone="yes"?>
+	@endverbatim
+
+	TinyXml will happily read or write files without a declaration,
+	however. There are 3 possible attributes to the declaration:
+	version, encoding, and standalone.
+
+	Note: In this version of the code, the attributes are
+	handled as special cases, not generic attributes, simply
+	because there can only be at most 3 and they are always the same.
+*/
+class TiXmlDeclaration : public TiXmlNode
+{
+public:
+	/// Construct an empty declaration.
+	TiXmlDeclaration()   : TiXmlNode( TiXmlNode::DECLARATION ) {}
+
+#ifdef TIXML_USE_STL
+	/// Constructor.
+	TiXmlDeclaration(	const std::string& _version,
+						const std::string& _encoding,
+						const std::string& _standalone );
+#endif
+
+	/// Construct.
+	TiXmlDeclaration(	const char* _version,
+						const char* _encoding,
+						const char* _standalone );
+
+	TiXmlDeclaration( const TiXmlDeclaration& copy );
+	void operator=( const TiXmlDeclaration& copy );
+
+	virtual ~TiXmlDeclaration()	{}
+
+	/// Version. Will return an empty string if none was found.
+	const char *Version() const			{ return version.c_str (); }
+	/// Encoding. Will return an empty string if none was found.
+	const char *Encoding() const		{ return encoding.c_str (); }
+	/// Is this a standalone document?
+	const char *Standalone() const		{ return standalone.c_str (); }
+
+	/// Creates a copy of this Declaration and returns it.
+	virtual TiXmlNode* Clone() const;
+	/// Print this declaration to a FILE stream.
+	virtual void Print( FILE* cfile, int depth ) const;
+
+	virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
+
+protected:
+	void CopyTo( TiXmlDeclaration* target ) const;
+	// used to be public
+	#ifdef TIXML_USE_STL
+	    virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	#endif
+	virtual void StreamOut ( TIXML_OSTREAM * out) const;
+
+private:
+
+	TIXML_STRING version;
+	TIXML_STRING encoding;
+	TIXML_STRING standalone;
+};
+
+
+/** Any tag that tinyXml doesn't recognize is saved as an
+	unknown. It is a tag of text, but should not be modified.
+	It will be written back to the XML, unchanged, when the file
+	is saved.
+
+	DTD tags get thrown into TiXmlUnknowns.
+*/
+class TiXmlUnknown : public TiXmlNode
+{
+public:
+	TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN )	{}
+	virtual ~TiXmlUnknown() {}
+
+	TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::UNKNOWN )		{ copy.CopyTo( this ); }
+	void operator=( const TiXmlUnknown& copy )										{ copy.CopyTo( this ); }
+
+	/// Creates a copy of this Unknown and returns it.
+	virtual TiXmlNode* Clone() const;
+	/// Print this Unknown to a FILE stream.
+	virtual void Print( FILE* cfile, int depth ) const;
+
+	virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding );
+
+protected:
+	void CopyTo( TiXmlUnknown* target ) const;
+
+	#ifdef TIXML_USE_STL
+	    virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	#endif
+	virtual void StreamOut ( TIXML_OSTREAM * out ) const;
+
+private:
+
+};
+
+
+/** Always the top level node. A document binds together all the
+	XML pieces. It can be saved, loaded, and printed to the screen.
+	The 'value' of a document node is the xml file name.
+*/
+class TiXmlDocument : public TiXmlNode
+{
+public:
+	/// Create an empty document, that has no name.
+	TiXmlDocument();
+	/// Create a document with a name. The name of the document is also the filename of the xml.
+	TiXmlDocument( const char * documentName );
+
+	#ifdef TIXML_USE_STL
+	/// Constructor.
+	TiXmlDocument( const std::string& documentName );
+	#endif
+
+	TiXmlDocument( const TiXmlDocument& copy );
+	void operator=( const TiXmlDocument& copy );
+
+	virtual ~TiXmlDocument() {}
+
+	/** Load a file using the current document value.
+		Returns true if successful. Will delete any existing
+		document data before loading.
+	*/
+	bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
+	/// Save a file using the current document value. Returns true if successful.
+	bool SaveFile() const;
+	/// Load a file using the given filename. Returns true if successful.
+	bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
+	/// Save a file using the given filename. Returns true if successful.
+	bool SaveFile( const char * filename ) const;
+
+	#ifdef TIXML_USE_STL
+	bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING )			///< STL std::string version.
+	{
+		StringToBuffer f( filename );
+		return ( f.buffer && LoadFile( f.buffer, encoding ));
+	}
+	bool SaveFile( const std::string& filename ) const		///< STL std::string version.
+	{
+		StringToBuffer f( filename );
+		return ( f.buffer && SaveFile( f.buffer ));
+	}
+	#endif
+
+	/** Parse the given null terminated block of xml data. Passing in an encoding to this
+		method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml
+		to use that encoding, regardless of what TinyXml might otherwise try to detect.
+	*/
+	virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
+
+	/** Get the root element -- the only top level element -- of the document.
+		In well formed XML, there should only be one. TinyXml is tolerant of
+		multiple elements at the document level.
+	*/
+	const TiXmlElement* RootElement() const		{ return FirstChildElement(); }
+	TiXmlElement* RootElement()					{ return FirstChildElement(); }
+
+	/** If an error occurs, Error will be set to true. Also,
+		- The ErrorId() will contain the integer identifier of the error (not generally useful)
+		- The ErrorDesc() method will return the name of the error. (very useful)
+		- The ErrorRow() and ErrorCol() will return the location of the error (if known)
+	*/	
+	bool Error() const						{ return error; }
+
+	/// Contains a textual (english) description of the error if one occurs.
+	const char * ErrorDesc() const	{ return errorDesc.c_str (); }
+
+	/** Generally, you probably want the error string ( ErrorDesc() ). But if you
+		prefer the ErrorId, this function will fetch it.
+	*/
+	const int ErrorId()	const				{ return errorId; }
+
+	/** Returns the location (if known) of the error. The first column is column 1, 
+		and the first row is row 1. A value of 0 means the row and column wasn't applicable
+		(memory errors, for example, have no row/column) or the parser lost the error. (An
+		error in the error reporting, in that case.)
+
+		@sa SetTabSize, Row, Column
+	*/
+	int ErrorRow()	{ return errorLocation.row+1; }
+	int ErrorCol()	{ return errorLocation.col+1; }	///< The column where the error occured. See ErrorRow()
+
+	/** By calling this method, with a tab size
+		greater than 0, the row and column of each node and attribute is stored
+		when the file is loaded. Very useful for tracking the DOM back in to
+		the source file.
+
+		The tab size is required for calculating the location of nodes. If not
+		set, the default of 4 is used. The tabsize is set per document. Setting
+		the tabsize to 0 disables row/column tracking.
+
+		Note that row and column tracking is not supported when using operator>>.
+
+		The tab size needs to be enabled before the parse or load. Correct usage:
+		@verbatim
+		TiXmlDocument doc;
+		doc.SetTabSize( 8 );
+		doc.Load( "myfile.xml" );
+		@endverbatim
+
+		@sa Row, Column
+	*/
+	void SetTabSize( int _tabsize )		{ tabsize = _tabsize; }
+
+	int TabSize() const	{ return tabsize; }
+
+	/** If you have handled the error, it can be reset with this call. The error
+		state is automatically cleared if you Parse a new XML block.
+	*/
+	void ClearError()						{	error = false; 
+												errorId = 0; 
+												errorDesc = ""; 
+												errorLocation.row = errorLocation.col = 0; 
+												//errorLocation.last = 0; 
+											}
+
+	/** Dump the document to standard out. */
+	void Print() const						{ Print( stdout, 0 ); }
+
+	/// Print this Document to a FILE stream.
+	virtual void Print( FILE* cfile, int depth = 0 ) const;
+	// [internal use]
+	void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding );
+
+protected :
+	virtual void StreamOut ( TIXML_OSTREAM * out) const;
+	// [internal use]
+	virtual TiXmlNode* Clone() const;
+	#ifdef TIXML_USE_STL
+	    virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag );
+	#endif
+
+private:
+	void CopyTo( TiXmlDocument* target ) const;
+
+	bool error;
+	int  errorId;
+	TIXML_STRING errorDesc;
+	int tabsize;
+	TiXmlCursor errorLocation;
+};
+
+
+/**
+	A TiXmlHandle is a class that wraps a node pointer with null checks; this is
+	an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml
+	DOM structure. It is a separate utility class.
+
+	Take an example:
+	@verbatim
+	<Document>
+		<Element attributeA = "valueA">
+			<Child attributeB = "value1" />
+			<Child attributeB = "value2" />
+		</Element>
+	<Document>
+	@endverbatim
+
+	Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very 
+	easy to write a *lot* of code that looks like:
+
+	@verbatim
+	TiXmlElement* root = document.FirstChildElement( "Document" );
+	if ( root )
+	{
+		TiXmlElement* element = root->FirstChildElement( "Element" );
+		if ( element )
+		{
+			TiXmlElement* child = element->FirstChildElement( "Child" );
+			if ( child )
+			{
+				TiXmlElement* child2 = child->NextSiblingElement( "Child" );
+				if ( child2 )
+				{
+					// Finally do something useful.
+	@endverbatim
+
+	And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity
+	of such code. A TiXmlHandle checks for null	pointers so it is perfectly safe 
+	and correct to use:
+
+	@verbatim
+	TiXmlHandle docHandle( &document );
+	TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).Element();
+	if ( child2 )
+	{
+		// do something useful
+	@endverbatim
+
+	Which is MUCH more concise and useful.
+
+	It is also safe to copy handles - internally they are nothing more than node pointers.
+	@verbatim
+	TiXmlHandle handleCopy = handle;
+	@endverbatim
+
+	What they should not be used for is iteration:
+
+	@verbatim
+	int i=0; 
+	while ( true )
+	{
+		TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).Element();
+		if ( !child )
+			break;
+		// do something
+		++i;
+	}
+	@endverbatim
+
+	It seems reasonable, but it is in fact two embedded while loops. The Child method is 
+	a linear walk to find the element, so this code would iterate much more than it needs 
+	to. Instead, prefer:
+
+	@verbatim
+	TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).Element();
+
+	for( child; child; child=child->NextSiblingElement() )
+	{
+		// do something
+	}
+	@endverbatim
+*/
+class TiXmlHandle
+{
+public:
+	/// Create a handle from any node (at any depth of the tree.) This can be a null pointer.
+	TiXmlHandle( TiXmlNode* node )					{ this->node = node; }
+	/// Copy constructor
+	TiXmlHandle( const TiXmlHandle& ref )			{ this->node = ref.node; }
+	TiXmlHandle operator=( const TiXmlHandle& ref ) { this->node = ref.node; return *this; }
+
+	/// Return a handle to the first child node.
+	TiXmlHandle FirstChild() const;
+	/// Return a handle to the first child node with the given name.
+	TiXmlHandle FirstChild( const char * value ) const;
+	/// Return a handle to the first child element.
+	TiXmlHandle FirstChildElement() const;
+	/// Return a handle to the first child element with the given name.
+	TiXmlHandle FirstChildElement( const char * value ) const;
+
+	/** Return a handle to the "index" child with the given name. 
+		The first child is 0, the second 1, etc.
+	*/
+	TiXmlHandle Child( const char* value, int index ) const;
+	/** Return a handle to the "index" child. 
+		The first child is 0, the second 1, etc.
+	*/
+	TiXmlHandle Child( int index ) const;
+	/** Return a handle to the "index" child element with the given name. 
+		The first child element is 0, the second 1, etc. Note that only TiXmlElements
+		are indexed: other types are not counted.
+	*/
+	TiXmlHandle ChildElement( const char* value, int index ) const;
+	/** Return a handle to the "index" child element. 
+		The first child element is 0, the second 1, etc. Note that only TiXmlElements
+		are indexed: other types are not counted.
+	*/
+	TiXmlHandle ChildElement( int index ) const;
+
+	#ifdef TIXML_USE_STL
+	TiXmlHandle FirstChild( const std::string& _value ) const				{ return FirstChild( _value.c_str() ); }
+	TiXmlHandle FirstChildElement( const std::string& _value ) const		{ return FirstChildElement( _value.c_str() ); }
+
+	TiXmlHandle Child( const std::string& _value, int index ) const			{ return Child( _value.c_str(), index ); }
+	TiXmlHandle ChildElement( const std::string& _value, int index ) const	{ return ChildElement( _value.c_str(), index ); }
+	#endif
+
+	/// Return the handle as a TiXmlNode. This may return null.
+	TiXmlNode* Node() const			{ return node; } 
+	/// Return the handle as a TiXmlElement. This may return null.
+	TiXmlElement* Element() const	{ return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); }
+	/// Return the handle as a TiXmlText. This may return null.
+	TiXmlText* Text() const			{ return ( ( node && node->ToText() ) ? node->ToText() : 0 ); }
+	/// Return the handle as a TiXmlUnknown. This may return null;
+	TiXmlUnknown* Unknown() const			{ return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); }
+
+private:
+	TiXmlNode* node;
+};
+
+
+#endif
+
Index: orxonox/branches/openAL/src/lib/xmlparser/tinyxmlerror.cc
===================================================================
--- orxonox/branches/openAL/src/lib/xmlparser/tinyxmlerror.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/xmlparser/tinyxmlerror.cc	(revision 4194)
@@ -0,0 +1,51 @@
+/*
+www.sourceforge.net/projects/tinyxml
+Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)
+
+This software is provided 'as-is', without any express or implied 
+warranty. In no event will the authors be held liable for any 
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any 
+purpose, including commercial applications, and to alter it and 
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must
+not claim that you wrote the original software. If you use this
+software in a product, an acknowledgment in the product documentation
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+distribution.
+*/
+
+#include "tinyxml.h"
+
+// The goal of the seperate error file is to make the first
+// step towards localization. tinyxml (currently) only supports
+// latin-1, but at least the error messages could now be translated.
+//
+// It also cleans up the code a bit.
+//
+
+const char* TiXmlBase::errorString[ TIXML_ERROR_STRING_COUNT ] =
+{
+	"No error",
+	"Error",
+	"Failed to open file",
+	"Memory allocation failed.",
+	"Error parsing Element.",
+	"Failed to read Element name",
+	"Error reading Element value.",
+	"Error reading Attributes.",
+	"Error: empty tag.",
+	"Error reading end tag.",
+	"Error parsing Unknown.",
+	"Error parsing Comment.",
+	"Error parsing Declaration.",
+	"Error document empty.",
+	"Error null (0) or unexpected EOF found in input stream.",
+};
Index: orxonox/branches/openAL/src/lib/xmlparser/tinyxmlparser.cc
===================================================================
--- orxonox/branches/openAL/src/lib/xmlparser/tinyxmlparser.cc	(revision 4194)
+++ orxonox/branches/openAL/src/lib/xmlparser/tinyxmlparser.cc	(revision 4194)
@@ -0,0 +1,1503 @@
+/*
+www.sourceforge.net/projects/tinyxml
+Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)
+
+This software is provided 'as-is', without any express or implied 
+warranty. In no event will the authors be held liable for any 
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any 
+purpose, including commercial applications, and to alter it and 
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must 
+not claim that you wrote the original software. If you use this
+software in a product, an acknowledgment in the product documentation
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and 
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source 
+distribution.
+*/
+
+#include "tinyxml.h"
+#include <ctype.h>
+
+//#define DEBUG_PARSER
+
+// Note tha "PutString" hardcodes the same list. This
+// is less flexible than it appears. Changing the entries
+// or order will break putstring.	
+TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] = 
+{
+	{ "&amp;",  5, '&' },
+	{ "&lt;",   4, '<' },
+	{ "&gt;",   4, '>' },
+	{ "&quot;", 6, '\"' },
+	{ "&apos;", 6, '\'' }
+};
+
+// Bunch of unicode info at:
+//		http://www.unicode.org/faq/utf_bom.html
+// Including the basic of this table, which determines the #bytes in the
+// sequence from the lead byte. 1 placed for invalid sequences --
+// although the result will be junk, pass it through as much as possible.
+// Beware of the non-characters in UTF-8:	
+//				ef bb bf (Microsoft "lead bytes")
+//				ef bf be
+//				ef bf bf 
+
+const char TIXML_UTF_LEAD_0 = (const char)0xef;
+const char TIXML_UTF_LEAD_1 = (const char)0xbb;
+const char TIXML_UTF_LEAD_2 = (const char)0xbf;
+
+const int TiXmlBase::utf8ByteTable[256] = 
+{
+	//	0	1	2	3	4	5	6	7	8	9	a	b	c	d	e	f
+		1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	// 0x00
+		1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	// 0x10
+		1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	// 0x20
+		1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	// 0x30
+		1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	// 0x40
+		1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	// 0x50
+		1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	// 0x60
+		1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	// 0x70	End of ASCII range
+		1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	// 0x80 0x80 to 0xc1 invalid
+		1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	// 0x90 
+		1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	// 0xa0 
+		1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	// 0xb0 
+		1,	1,	2,	2,	2,	2,	2,	2,	2,	2,	2,	2,	2,	2,	2,	2,	// 0xc0 0xc2 to 0xdf 2 byte
+		2,	2,	2,	2,	2,	2,	2,	2,	2,	2,	2,	2,	2,	2,	2,	2,	// 0xd0
+		3,	3,	3,	3,	3,	3,	3,	3,	3,	3,	3,	3,	3,	3,	3,	3,	// 0xe0 0xe0 to 0xef 3 byte
+		4,	4,	4,	4,	4,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1,	1	// 0xf0 0xf0 to 0xf4 4 byte, 0xf5 and higher invalid
+};
+
+
+void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length )
+{
+	const unsigned long BYTE_MASK = 0xBF;
+	const unsigned long BYTE_MARK = 0x80;
+	const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
+
+	if (input < 0x80) 
+		*length = 1;
+	else if ( input < 0x800 )
+		*length = 2;
+	else if ( input < 0x10000 )
+		*length = 3;
+	else if ( input < 0x200000 )
+		*length = 4;
+	else
+		{ *length = 0; return; }	// This code won't covert this correctly anyway.
+
+	output += *length;
+
+	// Scary scary fall throughs.
+	switch (*length) 
+	{
+		case 4:
+			--output; 
+			*output = (char)((input | BYTE_MARK) & BYTE_MASK); 
+			input >>= 6;
+		case 3:
+			--output; 
+			*output = (char)((input | BYTE_MARK) & BYTE_MASK); 
+			input >>= 6;
+		case 2:
+			--output; 
+			*output = (char)((input | BYTE_MARK) & BYTE_MASK); 
+			input >>= 6;
+		case 1:
+			--output; 
+			*output = (char)(input | FIRST_BYTE_MARK[*length]);
+	}
+}
+
+
+/*static*/ int TiXmlBase::IsAlpha( unsigned char anyByte, TiXmlEncoding )
+{
+	// This will only work for low-ascii, everything else is assumed to be a valid
+	// letter. I'm not sure this is the best approach, but it is quite tricky trying
+	// to figure out alhabetical vs. not across encoding. So take a very 
+	// conservative approach.
+
+//	if ( encoding == TIXML_ENCODING_UTF8 )
+//	{
+		if ( anyByte < 127 )
+			return isalpha( anyByte );
+		else
+			return 1;	// What else to do? The unicode set is huge...get the english ones right.
+//	}
+//	else
+//	{
+//		return isalpha( anyByte );
+//	}
+}
+
+
+/*static*/ int TiXmlBase::IsAlphaNum( unsigned char anyByte, TiXmlEncoding )
+{
+	// This will only work for low-ascii, everything else is assumed to be a valid
+	// letter. I'm not sure this is the best approach, but it is quite tricky trying
+	// to figure out alhabetical vs. not across encoding. So take a very 
+	// conservative approach.
+
+//	if ( encoding == TIXML_ENCODING_UTF8 )
+//	{
+		if ( anyByte < 127 )
+			return isalnum( anyByte );
+		else
+			return 1;	// What else to do? The unicode set is huge...get the english ones right.
+//	}
+//	else
+//	{
+//		return isalnum( anyByte );
+//	}
+}
+
+
+class TiXmlParsingData
+{
+	friend class TiXmlDocument;
+  public:
+	void Stamp( const char* now, TiXmlEncoding encoding );
+
+	const TiXmlCursor& Cursor()	{ return cursor; }
+
+  private:
+	// Only used by the document!
+	TiXmlParsingData( const char* start, int _tabsize, int row, int col )
+	{
+		assert( start );
+		stamp = start;
+		tabsize = _tabsize;
+		cursor.row = row;
+		cursor.col = col;
+	}
+
+	TiXmlCursor		cursor;
+	const char*		stamp;
+	int				tabsize;
+};
+
+
+void TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding )
+{
+	assert( now );
+
+	// Do nothing if the tabsize is 0.
+	if ( tabsize < 1 )
+	{
+		return;
+	}
+
+	// Get the current row, column.
+	int row = cursor.row;
+	int col = cursor.col;
+	const char* p = stamp;
+	assert( p );
+
+	while ( p < now )
+	{
+		// Code contributed by Fletcher Dunn: (modified by lee)
+		switch (*p) {
+			case 0:
+				// We *should* never get here, but in case we do, don't
+				// advance past the terminating null character, ever
+				return;
+
+			case '\r':
+				// bump down to the next line
+				++row;
+				col = 0;				
+				// Eat the character
+				++p;
+
+				// Check for \r\n sequence, and treat this as a single character
+				if (*p == '\n') {
+					++p;
+				}
+				break;
+
+			case '\n':
+				// bump down to the next line
+				++row;
+				col = 0;
+
+				// Eat the character
+				++p;
+
+				// Check for \n\r sequence, and treat this as a single
+				// character.  (Yes, this bizarre thing does occur still
+				// on some arcane platforms...)
+				if (*p == '\r') {
+					++p;
+				}
+				break;
+
+			case '\t':
+				// Eat the character
+				++p;
+
+				// Skip to next tab stop
+				col = (col / tabsize + 1) * tabsize;
+				break;
+
+			case TIXML_UTF_LEAD_0:
+				if ( encoding == TIXML_ENCODING_UTF8 )
+				{
+					if ( *(p+1) && *(p+2) )
+					{
+						// In these cases, don't advance the column. These are
+						// 0-width spaces.
+						if ( *(p+1)==TIXML_UTF_LEAD_1 && *(p+2)==TIXML_UTF_LEAD_2 )
+							p += 3;	
+						else if ( *(p+1)==(char)(0xbf) && *(p+2)==(char)(0xbe) )
+							p += 3;	
+						else if ( *(p+1)==(char)(0xbf) && *(p+2)==(char)(0xbf) )
+							p += 3;	
+						else
+							{ p +=3; ++col; }	// A normal character.
+					}
+				}
+				else
+				{
+					++p;
+					++col;
+				}
+				break;
+
+			default:
+				if ( encoding == TIXML_ENCODING_UTF8 )
+				{
+					// Eat the 1 to 4 byte utf8 character.
+					int step = TiXmlBase::utf8ByteTable[*((unsigned char*)p)];
+					if ( step == 0 )
+						step = 1;		// Error case from bad encoding, but handle gracefully.
+					p += step;
+
+					// Just advance one column, of course.
+					++col;
+				}
+				else
+				{
+					++p;
+					++col;
+				}
+				break;
+		}
+	}
+	cursor.row = row;
+	cursor.col = col;
+	assert( cursor.row >= -1 );
+	assert( cursor.col >= -1 );
+	stamp = p;
+	assert( stamp );
+}
+
+
+const char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding )
+{
+	if ( !p || !*p )
+	{
+		return 0;
+	}
+	if ( encoding == TIXML_ENCODING_UTF8 )
+	{
+		while ( *p )
+		{
+			// Skip the stupid Microsoft UTF-8 Byte order marks
+			if (	*(p+0)==TIXML_UTF_LEAD_0
+				 && *(p+1)==TIXML_UTF_LEAD_1 
+				 && *(p+2)==TIXML_UTF_LEAD_2 )
+			{
+				p += 3;
+				continue;
+			}
+			else if(*(p+0)==TIXML_UTF_LEAD_0
+				 && *(p+1)==(const char) 0xbf
+				 && *(p+2)==(const char) 0xbe )
+			{
+				p += 3;
+				continue;
+			}
+			else if(*(p+0)==TIXML_UTF_LEAD_0
+				 && *(p+1)==(const char) 0xbf
+				 && *(p+2)==(const char) 0xbf )
+			{
+				p += 3;
+				continue;
+			}
+
+			if ( IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' )		// Still using old rules for white space.
+				++p;
+			else
+				break;
+		}
+	}
+	else
+	{
+		while ( *p && IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' )
+			++p;
+	}
+
+	return p;
+}
+
+#ifdef TIXML_USE_STL
+/*static*/ bool TiXmlBase::StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag )
+{
+	for( ;; )
+	{
+		if ( !in->good() ) return false;
+
+		int c = in->peek();
+		// At this scope, we can't get to a document. So fail silently.
+		if ( !IsWhiteSpace( c ) || c <= 0 )
+			return true;
+
+		*tag += (char) in->get();
+	}
+}
+
+/*static*/ bool TiXmlBase::StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag )
+{
+	//assert( character > 0 && character < 128 );	// else it won't work in utf-8
+	while ( in->good() )
+	{
+		int c = in->peek();
+		if ( c == character )
+			return true;
+		if ( c <= 0 )		// Silent failure: can't get document at this scope
+			return false;
+
+		in->get();
+		*tag += (char) c;
+	}
+	return false;
+}
+#endif
+
+const char* TiXmlBase::ReadName( const char* p, TIXML_STRING * name, TiXmlEncoding encoding )
+{
+	*name = "";
+	assert( p );
+
+	// Names start with letters or underscores.
+	// Of course, in unicode, tinyxml has no idea what a letter *is*. The
+	// algorithm is generous.
+	//
+	// After that, they can be letters, underscores, numbers,
+	// hyphens, or colons. (Colons are valid ony for namespaces,
+	// but tinyxml can't tell namespaces from names.)
+	if (    p && *p 
+		 && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) )
+	{
+		while(		p && *p
+				&&	(		IsAlphaNum( (unsigned char ) *p, encoding ) 
+						 || *p == '_'
+						 || *p == '-'
+						 || *p == '.'
+						 || *p == ':' ) )
+		{
+			(*name) += *p;
+			++p;
+		}
+		return p;
+	}
+	return 0;
+}
+
+const char* TiXmlBase::GetEntity( const char* p, char* value, int* length, TiXmlEncoding encoding )
+{
+	// Presume an entity, and pull it out.
+    TIXML_STRING ent;
+	int i;
+	*length = 0;
+
+	if ( *(p+1) && *(p+1) == '#' && *(p+2) )
+	{
+		unsigned long ucs = 0;
+		//*ME:	warning C4244: convert '__w64 int' to 'unsigned'
+		//*ME:	Use size_t instead of unsigned (pointer-arithmetic)
+		size_t delta = 0;
+		unsigned mult = 1;
+
+		if ( *(p+2) == 'x' )
+		{
+			// Hexadecimal.
+			if ( !*(p+3) ) return 0;
+
+			const char* q = p+3;
+			q = strchr( q, ';' );
+
+			if ( !q || !*q ) return 0;
+
+			delta = q-p;
+			--q;
+
+			while ( *q != 'x' )
+			{
+				if ( *q >= '0' && *q <= '9' )
+					ucs += mult * (*q - '0');
+				else if ( *q >= 'a' && *q <= 'f' )
+					ucs += mult * (*q - 'a' + 10);
+				else if ( *q >= 'A' && *q <= 'F' )
+					ucs += mult * (*q - 'A' + 10 );
+				else 
+					return 0;
+				mult *= 16;
+				--q;
+			}
+		}
+		else
+		{
+			// Decimal.
+			if ( !*(p+2) ) return 0;
+
+			const char* q = p+2;
+			q = strchr( q, ';' );
+
+			if ( !q || !*q ) return 0;
+
+			delta = q-p;
+			--q;
+
+			while ( *q != '#' )
+			{
+				if ( *q >= '0' && *q <= '9' )
+					ucs += mult * (*q - '0');
+				else 
+					return 0;
+				mult *= 10;
+				--q;
+			}
+		}
+		if ( encoding == TIXML_ENCODING_UTF8 )
+		{
+			// convert the UCS to UTF-8
+			ConvertUTF32ToUTF8( ucs, value, length );
+		}
+		else
+		{
+			*value = (char)ucs;
+			*length = 1;
+		}
+		return p + delta + 1;
+	}
+
+	// Now try to match it.
+	for( i=0; i<NUM_ENTITY; ++i )
+	{
+		if ( strncmp( entity[i].str, p, entity[i].strLength ) == 0 )
+		{
+			assert( strlen( entity[i].str ) == entity[i].strLength );
+			*value = entity[i].chr;
+			*length = 1;
+			return ( p + entity[i].strLength );
+		}
+	}
+
+	// So it wasn't an entity, its unrecognized, or something like that.
+	*value = *p;	// Don't put back the last one, since we return it!
+	return p+1;
+}
+
+
+bool TiXmlBase::StringEqual( const char* p,
+							 const char* tag,
+							 bool ignoreCase,
+							 TiXmlEncoding encoding )
+{
+	assert( p );
+	assert( tag );
+	if ( !p || !*p )
+	{
+		assert( 0 );
+		return false;
+	}
+
+	const char* q = p;
+
+	if ( ignoreCase )
+	{
+		while ( *q && *tag && ToLower( *q, encoding ) == ToLower( *tag, encoding ) )
+		{
+			++q;
+			++tag;
+		}
+
+		if ( *tag == 0 )
+			return true;
+	}
+	else
+	{
+		while ( *q && *tag && *q == *tag )
+		{
+			++q;
+			++tag;
+		}
+
+		if ( *tag == 0 )		// Have we found the end of the tag, and everything equal?
+			return true;
+	}
+	return false;
+}
+
+const char* TiXmlBase::ReadText(	const char* p, 
+									TIXML_STRING * text, 
+									bool trimWhiteSpace, 
+									const char* endTag, 
+									bool caseInsensitive,
+									TiXmlEncoding encoding )
+{
+    *text = "";
+	if (    !trimWhiteSpace			// certain tags always keep whitespace
+		 || !condenseWhiteSpace )	// if true, whitespace is always kept
+	{
+		// Keep all the white space.
+		while (	   p && *p
+				&& !StringEqual( p, endTag, caseInsensitive, encoding )
+			  )
+		{
+			int len;
+			char cArr[4] = { 0, 0, 0, 0 };
+			p = GetChar( p, cArr, &len, encoding );
+			text->append( cArr, len );
+		}
+	}
+	else
+	{
+		bool whitespace = false;
+
+		// Remove leading white space:
+		p = SkipWhiteSpace( p, encoding );
+		while (	   p && *p
+				&& !StringEqual( p, endTag, caseInsensitive, encoding ) )
+		{
+			if ( *p == '\r' || *p == '\n' )
+			{
+				whitespace = true;
+				++p;
+			}
+			else if ( IsWhiteSpace( *p ) )
+			{
+				whitespace = true;
+				++p;
+			}
+			else
+			{
+				// If we've found whitespace, add it before the
+				// new character. Any whitespace just becomes a space.
+				if ( whitespace )
+				{
+					(*text) += ' ';
+					whitespace = false;
+				}
+				int len;
+				char cArr[4] = { 0, 0, 0, 0 };
+				p = GetChar( p, cArr, &len, encoding );
+				if ( len == 1 )
+					(*text) += cArr[0];	// more efficient
+				else
+					text->append( cArr, len );
+			}
+		}
+	}
+	return p + strlen( endTag );
+}
+
+#ifdef TIXML_USE_STL
+
+void TiXmlDocument::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag )
+{
+	// The basic issue with a document is that we don't know what we're
+	// streaming. Read something presumed to be a tag (and hope), then
+	// identify it, and call the appropriate stream method on the tag.
+	//
+	// This "pre-streaming" will never read the closing ">" so the
+	// sub-tag can orient itself.
+
+	if ( !StreamTo( in, '<', tag ) ) 
+	{
+		SetError( TIXML_ERROR_PARSING_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN );
+		return;
+	}
+
+	while ( in->good() )
+	{
+		int tagIndex = (int) tag->length();
+		while ( in->good() && in->peek() != '>' )
+		{
+			int c = in->get();
+			if ( c <= 0 )
+			{
+				SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN );
+				break;
+			}
+			(*tag) += (char) c;
+		}
+
+		if ( in->good() )
+		{
+			// We now have something we presume to be a node of 
+			// some sort. Identify it, and call the node to
+			// continue streaming.
+			TiXmlNode* node = Identify( tag->c_str() + tagIndex, TIXML_DEFAULT_ENCODING );
+
+			if ( node )
+			{
+				node->StreamIn( in, tag );
+				bool isElement = node->ToElement() != 0;
+				delete node;
+				node = 0;
+
+				// If this is the root element, we're done. Parsing will be
+				// done by the >> operator.
+				if ( isElement )
+				{
+					return;
+				}
+			}
+			else
+			{
+				SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN );
+				return;
+			}
+		}
+	}
+	// We should have returned sooner.
+	SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN );
+}
+
+#endif
+
+const char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiXmlEncoding encoding )
+{
+	ClearError();
+
+	// Parse away, at the document level. Since a document
+	// contains nothing but other tags, most of what happens
+	// here is skipping white space.
+	if ( !p || !*p )
+	{
+		SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN );
+		return 0;
+	}
+
+	// Note that, for a document, this needs to come
+	// before the while space skip, so that parsing
+	// starts from the pointer we are given.
+	location.Clear();
+	if ( prevData )
+	{
+		location.row = prevData->cursor.row;
+		location.col = prevData->cursor.col;
+	}
+	else
+	{
+		location.row = 0;
+		location.col = 0;
+	}
+	TiXmlParsingData data( p, TabSize(), location.row, location.col );
+	location = data.Cursor();
+
+	if ( encoding == TIXML_ENCODING_UNKNOWN )
+	{
+		// Check for the Microsoft UTF-8 lead bytes.
+		if (	*(p+0) && *(p+0) == TIXML_UTF_LEAD_0
+			 && *(p+1) && *(p+1) == TIXML_UTF_LEAD_1
+			 && *(p+2) && *(p+2) == TIXML_UTF_LEAD_2 )
+		{
+			encoding = TIXML_ENCODING_UTF8;
+		}
+	}
+
+    p = SkipWhiteSpace( p, encoding );
+	if ( !p )
+	{
+		SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN );
+		return 0;
+	}
+
+	while ( p && *p )
+	{
+		TiXmlNode* node = Identify( p, encoding );
+		if ( node )
+		{
+			p = node->Parse( p, &data, encoding );
+			LinkEndChild( node );
+		}
+		else
+		{
+			break;
+		}
+
+		// Did we get encoding info?
+		if (    encoding == TIXML_ENCODING_UNKNOWN
+			 && node->ToDeclaration() )
+		{
+			TiXmlDeclaration* dec = node->ToDeclaration();
+			const char* enc = dec->Encoding();
+			assert( enc );
+
+			if ( *enc == 0 )
+				encoding = TIXML_ENCODING_UTF8;
+			else if ( StringEqual( enc, "UTF-8", true, TIXML_ENCODING_UNKNOWN ) )
+				encoding = TIXML_ENCODING_UTF8;
+			else if ( StringEqual( enc, "UTF8", true, TIXML_ENCODING_UNKNOWN ) )
+				encoding = TIXML_ENCODING_UTF8;	// incorrect, but be nice
+			else 
+				encoding = TIXML_ENCODING_LEGACY;
+		}
+
+		p = SkipWhiteSpace( p, encoding );
+	}
+
+	// Was this empty?
+	if ( !firstChild ) {
+		SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, encoding );
+		return 0;
+	}
+
+	// All is well.
+	return p;
+}
+
+void TiXmlDocument::SetError( int err, const char* pError, TiXmlParsingData* data, TiXmlEncoding encoding )
+{	
+	// The first error in a chain is more accurate - don't set again!
+	if ( error )
+		return;
+
+	assert( err > 0 && err < TIXML_ERROR_STRING_COUNT );
+	error   = true;
+	errorId = err;
+	errorDesc = errorString[ errorId ];
+
+	errorLocation.Clear();
+	if ( pError && data )
+	{
+		//TiXmlParsingData data( pError, prevData );
+		data->Stamp( pError, encoding );
+		errorLocation = data->Cursor();
+	}
+}
+
+
+TiXmlNode* TiXmlNode::Identify( const char* p, TiXmlEncoding encoding )
+{
+	TiXmlNode* returnNode = 0;
+
+	p = SkipWhiteSpace( p, encoding );
+	if( !p || !*p || *p != '<' )
+	{
+		return 0;
+	}
+
+	TiXmlDocument* doc = GetDocument();
+	p = SkipWhiteSpace( p, encoding );
+
+	if ( !p || !*p )
+	{
+		return 0;
+	}
+
+	// What is this thing? 
+	// - Elements start with a letter or underscore, but xml is reserved.
+	// - Comments: <!--
+	// - Decleration: <?xml
+	// - Everthing else is unknown to tinyxml.
+	//
+
+	const char* xmlHeader = { "<?xml" };
+	const char* commentHeader = { "<!--" };
+	const char* dtdHeader = { "<!" };
+
+	if ( StringEqual( p, xmlHeader, true, encoding ) )
+	{
+		#ifdef DEBUG_PARSER
+			TIXML_LOG( "XML parsing Declaration\n" );
+		#endif
+		returnNode = new TiXmlDeclaration();
+	}
+	else if ( StringEqual( p, commentHeader, false, encoding ) )
+	{
+		#ifdef DEBUG_PARSER
+			TIXML_LOG( "XML parsing Comment\n" );
+		#endif
+		returnNode = new TiXmlComment();
+	}
+	else if ( StringEqual( p, dtdHeader, false, encoding ) )
+	{
+		#ifdef DEBUG_PARSER
+			TIXML_LOG( "XML parsing Unknown(1)\n" );
+		#endif
+		returnNode = new TiXmlUnknown();
+	}
+	else if (    IsAlpha( *(p+1), encoding )
+			  || *(p+1) == '_' )
+	{
+		#ifdef DEBUG_PARSER
+			TIXML_LOG( "XML parsing Element\n" );
+		#endif
+		returnNode = new TiXmlElement( "" );
+	}
+	else
+	{
+		#ifdef DEBUG_PARSER
+			TIXML_LOG( "XML parsing Unknown(2)\n" );
+		#endif
+		returnNode = new TiXmlUnknown();
+	}
+
+	if ( returnNode )
+	{
+		// Set the parent, so it can report errors
+		returnNode->parent = this;
+	}
+	else
+	{
+		if ( doc )
+			doc->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, TIXML_ENCODING_UNKNOWN );
+	}
+	return returnNode;
+}
+
+#ifdef TIXML_USE_STL
+
+void TiXmlElement::StreamIn (TIXML_ISTREAM * in, TIXML_STRING * tag)
+{
+	// We're called with some amount of pre-parsing. That is, some of "this"
+	// element is in "tag". Go ahead and stream to the closing ">"
+	while( in->good() )
+	{
+		int c = in->get();
+		if ( c <= 0 )
+		{
+			TiXmlDocument* document = GetDocument();
+			if ( document )
+				document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN );
+			return;
+		}
+		(*tag) += (char) c ;
+		
+		if ( c == '>' )
+			break;
+	}
+
+	if ( tag->length() < 3 ) return;
+
+	// Okay...if we are a "/>" tag, then we're done. We've read a complete tag.
+	// If not, identify and stream.
+
+	if (    tag->at( tag->length() - 1 ) == '>' 
+		 && tag->at( tag->length() - 2 ) == '/' )
+	{
+		// All good!
+		return;
+	}
+	else if ( tag->at( tag->length() - 1 ) == '>' )
+	{
+		// There is more. Could be:
+		//		text
+		//		closing tag
+		//		another node.
+		for ( ;; )
+		{
+			StreamWhiteSpace( in, tag );
+
+			// Do we have text?
+			if ( in->good() && in->peek() != '<' ) 
+			{
+				// Yep, text.
+				TiXmlText text( "" );
+				text.StreamIn( in, tag );
+
+				// What follows text is a closing tag or another node.
+				// Go around again and figure it out.
+				continue;
+			}
+
+			// We now have either a closing tag...or another node.
+			// We should be at a "<", regardless.
+			if ( !in->good() ) return;
+			assert( in->peek() == '<' );
+			int tagIndex = tag->length();
+
+			bool closingTag = false;
+			bool firstCharFound = false;
+
+			for( ;; )
+			{
+				if ( !in->good() )
+					return;
+
+				int c = in->peek();
+				if ( c <= 0 )
+				{
+					TiXmlDocument* document = GetDocument();
+					if ( document )
+						document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN );
+					return;
+				}
+				
+				if ( c == '>' )
+					break;
+
+				*tag += (char) c;
+				in->get();
+
+				if ( !firstCharFound && c != '<' && !IsWhiteSpace( c ) )
+				{
+					firstCharFound = true;
+					if ( c == '/' )
+						closingTag = true;
+				}
+			}
+			// If it was a closing tag, then read in the closing '>' to clean up the input stream.
+			// If it was not, the streaming will be done by the tag.
+			if ( closingTag )
+			{
+				if ( !in->good() )
+					return;
+
+				int c = in->get();
+				if ( c <= 0 )
+				{
+					TiXmlDocument* document = GetDocument();
+					if ( document )
+						document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN );
+					return;
+				}
+				assert( c == '>' );
+				*tag += (char) c;
+
+				// We are done, once we've found our closing tag.
+				return;
+			}
+			else
+			{
+				// If not a closing tag, id it, and stream.
+				const char* tagloc = tag->c_str() + tagIndex;
+				TiXmlNode* node = Identify( tagloc, TIXML_DEFAULT_ENCODING );
+				if ( !node )
+					return;
+				node->StreamIn( in, tag );
+				delete node;
+				node = 0;
+
+				// No return: go around from the beginning: text, closing tag, or node.
+			}
+		}
+	}
+}
+#endif
+
+const char* TiXmlElement::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding )
+{
+	p = SkipWhiteSpace( p, encoding );
+	TiXmlDocument* document = GetDocument();
+
+	if ( !p || !*p )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_PARSING_ELEMENT, 0, 0, encoding );
+		return 0;
+	}
+
+//	TiXmlParsingData data( p, prevData );
+	if ( data )
+	{
+		data->Stamp( p, encoding );
+		location = data->Cursor();
+	}
+
+	if ( *p != '<' )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_PARSING_ELEMENT, p, data, encoding );
+		return 0;
+	}
+
+	p = SkipWhiteSpace( p+1, encoding );
+
+	// Read the name.
+	const char* pErr = p;
+
+    p = ReadName( p, &value, encoding );
+	if ( !p || !*p )
+	{
+		if ( document )	document->SetError( TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, pErr, data, encoding );
+		return 0;
+	}
+
+    TIXML_STRING endTag ("</");
+	endTag += value;
+	endTag += ">";
+
+	// Check for and read attributes. Also look for an empty
+	// tag or an end tag.
+	while ( p && *p )
+	{
+		pErr = p;
+		p = SkipWhiteSpace( p, encoding );
+		if ( !p || !*p )
+		{
+			if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding );
+			return 0;
+		}
+		if ( *p == '/' )
+		{
+			++p;
+			// Empty tag.
+			if ( *p  != '>' )
+			{
+				if ( document ) document->SetError( TIXML_ERROR_PARSING_EMPTY, p, data, encoding );		
+				return 0;
+			}
+			return (p+1);
+		}
+		else if ( *p == '>' )
+		{
+			// Done with attributes (if there were any.)
+			// Read the value -- which can include other
+			// elements -- read the end tag, and return.
+			++p;
+			p = ReadValue( p, data, encoding );		// Note this is an Element method, and will set the error if one happens.
+			if ( !p || !*p )
+				return 0;
+
+			// We should find the end tag now
+			if ( StringEqual( p, endTag.c_str(), false, encoding ) )
+			{
+				p += endTag.length();
+				return p;
+			}
+			else
+			{
+				if ( document ) document->SetError( TIXML_ERROR_READING_END_TAG, p, data, encoding );
+				return 0;
+			}
+		}
+		else
+		{
+			// Try to read an attribute:
+			TiXmlAttribute* attrib = new TiXmlAttribute();
+			if ( !attrib )
+			{
+				if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, pErr, data, encoding );
+				return 0;
+			}
+
+			attrib->SetDocument( document );
+			const char* pErr = p;
+			p = attrib->Parse( p, data, encoding );
+
+			if ( !p || !*p )
+			{
+				if ( document ) document->SetError( TIXML_ERROR_PARSING_ELEMENT, pErr, data, encoding );
+				delete attrib;
+				return 0;
+			}
+
+			// Handle the strange case of double attributes:
+			TiXmlAttribute* node = attributeSet.Find( attrib->Name() );
+			if ( node )
+			{
+				node->SetValue( attrib->Value() );
+				delete attrib;
+				return 0;
+			}
+
+			attributeSet.Add( attrib );
+		}
+	}
+	return p;
+}
+
+
+const char* TiXmlElement::ReadValue( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding )
+{
+	TiXmlDocument* document = GetDocument();
+
+	const char* pWithWhiteSpace = p;
+	// Read in text and elements in any order.
+	p = SkipWhiteSpace( p, encoding );
+	while ( p && *p )
+	{
+		if ( *p != '<' )
+		{
+			// Take what we have, make a text element.
+			TiXmlText* textNode = new TiXmlText( "" );
+
+			if ( !textNode )
+			{
+				if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, encoding );
+				    return 0;
+			}
+
+			if ( TiXmlBase::IsWhiteSpaceCondensed() )
+			{
+				p = textNode->Parse( p, data, encoding );
+			}
+			else
+			{
+				// Special case: we want to keep the white space
+				// so that leading spaces aren't removed.
+				p = textNode->Parse( pWithWhiteSpace, data, encoding );
+			}
+
+			if ( !textNode->Blank() )
+				LinkEndChild( textNode );
+			else
+				delete textNode;
+		} 
+		else 
+		{
+			// We hit a '<'
+			// Have we hit a new element or an end tag?
+			if ( StringEqual( p, "</", false, encoding ) )
+			{
+				return p;
+			}
+			else
+			{
+				TiXmlNode* node = Identify( p, encoding );
+				if ( node )
+				{
+					p = node->Parse( p, data, encoding );
+					LinkEndChild( node );
+				}				
+				else
+				{
+					return 0;
+				}
+			}
+		}
+		p = SkipWhiteSpace( p, encoding );
+	}
+
+	if ( !p )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_READING_ELEMENT_VALUE, 0, 0, encoding );
+	}	
+	return p;
+}
+
+
+#ifdef TIXML_USE_STL
+void TiXmlUnknown::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag )
+{
+	while ( in->good() )
+	{
+		int c = in->get();	
+		if ( c <= 0 )
+		{
+			TiXmlDocument* document = GetDocument();
+			if ( document )
+				document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN );
+			return;
+		}
+		(*tag) += (char) c;
+
+		if ( c == '>' )
+		{
+			// All is well.
+			return;		
+		}
+	}
+}
+#endif
+
+
+const char* TiXmlUnknown::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding )
+{
+	TiXmlDocument* document = GetDocument();
+	p = SkipWhiteSpace( p, encoding );
+
+//	TiXmlParsingData data( p, prevData );
+	if ( data )
+	{
+		data->Stamp( p, encoding );
+		location = data->Cursor();
+	}
+	if ( !p || !*p || *p != '<' )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_PARSING_UNKNOWN, p, data, encoding );
+		return 0;
+	}
+	++p;
+    value = "";
+
+	while ( p && *p && *p != '>' )
+	{
+		value += *p;
+		++p;
+	}
+
+	if ( !p )
+	{
+		if ( document )	document->SetError( TIXML_ERROR_PARSING_UNKNOWN, 0, 0, encoding );
+	}
+	if ( *p == '>' )
+		return p+1;
+	return p;
+}
+
+#ifdef TIXML_USE_STL
+void TiXmlComment::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag )
+{
+	while ( in->good() )
+	{
+		int c = in->get();	
+		if ( c <= 0 )
+		{
+			TiXmlDocument* document = GetDocument();
+			if ( document )
+				document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN );
+			return;
+		}
+
+		(*tag) += (char) c;
+
+		if ( c == '>' 
+			 && tag->at( tag->length() - 2 ) == '-'
+			 && tag->at( tag->length() - 3 ) == '-' )
+		{
+			// All is well.
+			return;		
+		}
+	}
+}
+#endif
+
+
+const char* TiXmlComment::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding )
+{
+	TiXmlDocument* document = GetDocument();
+	value = "";
+
+	p = SkipWhiteSpace( p, encoding );
+
+//	TiXmlParsingData data( p, prevData );
+	if ( data )
+	{
+		data->Stamp( p, encoding );
+		location = data->Cursor();
+	}
+	const char* startTag = "<!--";
+	const char* endTag   = "-->";
+
+	if ( !StringEqual( p, startTag, false, encoding ) )
+	{
+		document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding );
+		return 0;
+	}
+	p += strlen( startTag );
+	p = ReadText( p, &value, false, endTag, false, encoding );
+	return p;
+}
+
+
+const char* TiXmlAttribute::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding )
+{
+	p = SkipWhiteSpace( p, encoding );
+	if ( !p || !*p ) return 0;
+
+	int tabsize = 4;
+	if ( document )
+		tabsize = document->TabSize();
+
+//	TiXmlParsingData data( p, prevData );
+	if ( data )
+	{
+		data->Stamp( p, encoding );
+		location = data->Cursor();
+	}
+	// Read the name, the '=' and the value.
+	const char* pErr = p;
+	p = ReadName( p, &name, encoding );
+	if ( !p || !*p )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding );
+		return 0;
+	}
+	p = SkipWhiteSpace( p, encoding );
+	if ( !p || !*p || *p != '=' )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding );
+		return 0;
+	}
+
+	++p;	// skip '='
+	p = SkipWhiteSpace( p, encoding );
+	if ( !p || !*p )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding );
+		return 0;
+	}
+	
+	const char* end;
+
+	if ( *p == '\'' )
+	{
+		++p;
+		end = "\'";
+		p = ReadText( p, &value, false, end, false, encoding );
+	}
+	else if ( *p == '"' )
+	{
+		++p;
+		end = "\"";
+		p = ReadText( p, &value, false, end, false, encoding );
+	}
+	else
+	{
+		// All attribute values should be in single or double quotes.
+		// But this is such a common error that the parser will try
+		// its best, even without them.
+		value = "";
+		while (    p && *p										// existence
+				&& !IsWhiteSpace( *p ) && *p != '\n' && *p != '\r'	// whitespace
+				&& *p != '/' && *p != '>' )						// tag end
+		{
+			value += *p;
+			++p;
+		}
+	}
+	return p;
+}
+
+#ifdef TIXML_USE_STL
+void TiXmlText::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag )
+{
+	while ( in->good() )
+	{
+		int c = in->peek();	
+		if ( c == '<' )
+			return;
+		if ( c <= 0 )
+		{
+			TiXmlDocument* document = GetDocument();
+			if ( document )
+				document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN );
+			return;
+		}
+
+		(*tag) += (char) c;
+		in->get();
+	}
+}
+#endif
+
+const char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding )
+{
+	value = "";
+//	TiXmlParsingData data( p, prevData );
+	if ( data )
+	{
+		data->Stamp( p, encoding );
+		location = data->Cursor();
+	}
+	bool ignoreWhite = true;
+
+	const char* end = "<";
+	p = ReadText( p, &value, ignoreWhite, end, false, encoding );
+	if ( p )
+		return p-1;	// don't truncate the '<'
+	return 0;
+}
+
+#ifdef TIXML_USE_STL
+void TiXmlDeclaration::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag )
+{
+	while ( in->good() )
+	{
+		int c = in->get();
+		if ( c <= 0 )
+		{
+			TiXmlDocument* document = GetDocument();
+			if ( document )
+				document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN );
+			return;
+		}
+		(*tag) += (char) c;
+
+		if ( c == '>' )
+		{
+			// All is well.
+			return;
+		}
+	}
+}
+#endif
+
+const char* TiXmlDeclaration::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding _encoding )
+{
+	p = SkipWhiteSpace( p, _encoding );
+	// Find the beginning, find the end, and look for
+	// the stuff in-between.
+	TiXmlDocument* document = GetDocument();
+	if ( !p || !*p || !StringEqual( p, "<?xml", true, _encoding ) )
+	{
+		if ( document ) document->SetError( TIXML_ERROR_PARSING_DECLARATION, 0, 0, _encoding );
+		return 0;
+	}
+//	TiXmlParsingData data( p, prevData );
+	if ( data )
+	{
+		data->Stamp( p, _encoding );
+		location = data->Cursor();
+	}
+	p += 5;
+
+	version = "";
+	encoding = "";
+	standalone = "";
+
+	while ( p && *p )
+	{
+		if ( *p == '>' )
+		{
+			++p;
+			return p;
+		}
+
+		p = SkipWhiteSpace( p, _encoding );
+		if ( StringEqual( p, "version", true, _encoding ) )
+		{
+			TiXmlAttribute attrib;
+			p = attrib.Parse( p, data, _encoding );		
+			version = attrib.Value();
+		}
+		else if ( StringEqual( p, "encoding", true, _encoding ) )
+		{
+			TiXmlAttribute attrib;
+			p = attrib.Parse( p, data, _encoding );		
+			encoding = attrib.Value();
+		}
+		else if ( StringEqual( p, "standalone", true, _encoding ) )
+		{
+			TiXmlAttribute attrib;
+			p = attrib.Parse( p, data, _encoding );		
+			standalone = attrib.Value();
+		}
+		else
+		{
+			// Read over whatever it is.
+			while( p && *p && *p != '>' && !IsWhiteSpace( *p ) )
+				++p;
+		}
+	}
+	return 0;
+}
+
+bool TiXmlText::Blank() const
+{
+	for ( unsigned i=0; i<value.length(); i++ )
+		if ( !IsWhiteSpace( value[i] ) )
+			return false;
+	return true;
+}
+
Index: orxonox/branches/openAL/src/orxonox.cc
===================================================================
--- orxonox/branches/openAL/src/orxonox.cc	(revision 3921)
+++ orxonox/branches/openAL/src/orxonox.cc	(revision 4194)
@@ -22,19 +22,25 @@
    main-programmer: Patrick Boenzli
    co-programmer: Christian Meyer
-   co-programmer: Benjamin Grauer: injected ResourceManager/GraphicsEngine
+   co-programmer: Benjamin Grauer: injected ResourceManager/GraphicsEngine/GUI
 */
 
 #include "orxonox.h"
+
+#include "gui.h"
 
 #include "world.h"
 #include "data_tank.h"
 #include "command_node.h"
+#include "ini_parser.h"
 #include "game_loader.h"
 #include "graphics_engine.h"
 #include "resource_manager.h"
 #include "text_engine.h"
+#include "factory.h"
+#include "benchmark.h"
 
 #include <string.h>
-int verbose = 3;
+
+int verbose = 4;
 
 using namespace std;
@@ -42,8 +48,17 @@
 /**
    \brief create a new Orxonox
+
+   In this funcitons only global values are set. The game will not be started here.
 */
 Orxonox::Orxonox ()
 {
-  pause = false;
+  this->pause = false;
+
+  this->world = NULL;
+  this->resources = NULL;
+  this->localinput = NULL;
+
+  this->argc = 0;
+  this->argv = NULL;
 }
 
@@ -53,7 +68,8 @@
 Orxonox::~Orxonox () 
 {
+  int i =0;
   Orxonox::singletonRef = NULL;
   if( world != NULL) delete world;
-  if( localinput != NULL) delete world;
+  if( localinput != NULL) delete localinput;
   if( resources != NULL) delete resources;
   delete GraphicsEngine::getInstance(); // deleting the Graphics
@@ -84,5 +100,5 @@
 void Orxonox::getConfigFile (int argc, char** argv)
 {
-  strcpy (configfilename, "orxonox.conf");
+  strcpy (configfilename, "~/.orxonox/orxonox.conf");
 }
 
@@ -92,4 +108,6 @@
 int Orxonox::init (int argc, char** argv)
 {
+  this->argc = argc;
+  this->argv = argv;
   // parse command line
   // config file
@@ -98,4 +116,7 @@
   SDL_Init (SDL_INIT_TIMER);
   // initialize everything
+  printf("> Initializing resources\n");
+  if( initResources () == -1) return -1;
+
   if( initVideo() == -1) return -1;
   if( initSound() == -1) return -1;
@@ -104,6 +125,4 @@
   printf("> Initializing networking\n");
   if( initNetworking () == -1) return -1;
-  printf("> Initializing resources\n");
-  if( initResources () == -1) return -1;
   //printf("> Initializing world\n");
   //if( init_world () == -1) return -1; PB: world will be initialized when started
@@ -120,5 +139,5 @@
   
   GraphicsEngine::getInstance();
-  
+    
   return 0;
 }
@@ -143,5 +162,5 @@
 {
   // create localinput
-  localinput = new CommandNode( configfilename);
+  localinput = new CommandNode(configfilename);
   
   return 0;
@@ -164,11 +183,50 @@
 int Orxonox::initResources() 
 {
-  //  printf("Not yet implemented\n");
   PRINT(3)("initializing ResourceManager\n");
   resourceManager = ResourceManager::getInstance();
-  resourceManager->setDataDir("../data/");
-  return 0;
+
+  // create parser
+  IniParser parser (DEFAULT_CONFIG_FILE);
+  if( parser.getSection (CONFIG_SECTION_DATA) == -1)
+    {
+      PRINTF(1)("Could not find Section %s in %s\n", CONFIG_SECTION_DATA, DEFAULT_CONFIG_FILE);
+      return -1;
+    }
+  char namebuf[256];
+  char valuebuf[256];
+  memset (namebuf, 0, 256);
+  memset (valuebuf, 0, 256);
+  
+  while( parser.nextVar (namebuf, valuebuf) != -1)
+    {
+      if (!strcmp(namebuf, CONFIG_NAME_DATADIR))
+	{
+	  //  printf("Not yet implemented\n");
+	  if (!resourceManager->setDataDir(valuebuf))
+	    {
+	      PRINTF(1)("Data Could not be located\n");
+	      exit(-1);
+	    }
+	}
+      
+      memset (namebuf, 0, 256);
+      memset (valuebuf, 0, 256);
+    }
+  
+  if (!resourceManager->checkDataDir(DEFAULT_DATA_DIR_CHECKFILE))
+    {
+      PRINTF(1)("The DataDirectory %s could not be verified\nPlease Change in File %s Section %s Entry %s to a suitable value\n",
+		resourceManager->getDataDir(),
+		DEFAULT_CONFIG_FILE,
+		CONFIG_SECTION_DATA,
+		CONFIG_NAME_DATADIR);
+      exit(-1);
+    }
+
+
   PRINT(3)("initializing TextEngine\n");
   TextEngine::getInstance();
+
+  return 0;
 }
 
@@ -200,5 +258,6 @@
   
   this->gameLoader = GameLoader::getInstance();
-  this->gameLoader->loadDebugCampaign(DEBUG_CAMPAIGN_0);
+  this->gameLoader->loadCampaign("worlds/DefaultCampaign.oxc");
+  //  this->gameLoader->loadDebugCampaign(DEBUG_CAMPAIGN_0);
   this->gameLoader->init();
   this->gameLoader->start();
@@ -279,4 +338,5 @@
 
 
+bool showGui = false;
 
 /**
@@ -286,25 +346,16 @@
 */
 int main(int argc, char** argv) 
-{  
-  
-  /* reading arguments 
-     
-     currently supported arguments are:
-     <no args>                   ::    just starts orxonox
-     --benchmark                 ::    start the benchmark without starting orxonox
-     
-     this is a preselection: it matches to one of the start* functions, the
-     finetuning is made in those functions.
-  */
-
-
+{ 
+
+  // here the pre-arguments are loaded, these are needed to go either to orxonx itself, Help, or Benchmark.
   int i;
-  for(i = 0; i < argc; ++i)
-    {
-      if(! strcmp( "--help", argv[i])) return startHelp();
-      else if(! strcmp( "--benchmark", argv[i])) return startBenchmarks();
-    }
-
-  PRINTF(2)("Orxonox does not understand the arguments");
+  for(i = 1; i < argc; ++i)
+    {
+      if(! strcmp( "--help", argv[i]) || !strcmp("-h", argv[i])) return startHelp(argc, argv);
+      else if(!strcmp( "--benchmark", argv[i]) || !strcmp("-b", argv[i])) return startBenchmarks();
+      else if(!strcmp( "--gui", argv[i]) || !strcmp("-g", argv[i])) showGui = true;
+      //      else PRINTF(2)("Orxonox does not understand the arguments %s\n", argv[i]);
+    }
+
   return startOrxonox(argc, argv);
 }
@@ -312,11 +363,16 @@
 
 
-int startHelp()
-{
-  printf("orxonox: starts the orxonox game - rules\n");
-  printf("usage: orxonox [arg]\n\n");
-  printf("valid options:\n");
-  printf(" --benchmark\tstarts the orxonox benchmark\n");
-  printf(" --help \tshows this menu\n");
+int startHelp(int argc, char** argv)
+{
+  PRINT(0)("orxonox: starts the orxonox game - rules\n");
+  PRINT(0)("usage: orxonox [arg [arg...]]\n\n");
+  PRINT(0)("valid options:\n");
+  {
+    Gui* gui = new Gui(argc, argv);
+    gui->printHelp();
+    delete gui;
+  }
+  PRINT(0)(" -b|--benchmark:\t\tstarts the orxonox benchmark\n");
+  PRINT(0)(" -h|--help:\t\t\tshows this help\n");
 }
 
@@ -324,10 +380,31 @@
 int startOrxonox(int argc, char** argv)
 {
-  printf(">>> Starting Orxonox <<<\n");
+  // checking for existence of the configuration-files
+  if (showGui ||
+      !ResourceManager::isFile("~/.orxonox/orxonox.conf") ||
+      ResourceManager::isFile("~/.orxonox/orxonox.lock"))
+    {
+      if (ResourceManager::isFile("~/.orxonox/orxonox.lock"))
+	ResourceManager::deleteFile("~/.orxonox/orxonox.lock");
+      
+      // starting the GUI
+      Gui* gui = new Gui(argc, argv);
+      gui->startGui();
+
+      if (! gui->startOrxonox)
+	return 0;
+      
+      delete gui;
+    }
+  
+  PRINT(0)(">>> Starting Orxonox <<<\n");
+
+  ResourceManager::touchFile("~/.orxonox/orxonox.lock");
+
   Orxonox *orx = Orxonox::getInstance();
   
   if((*orx).init(argc, argv) == -1)
     {
-      printf("! Orxonox initialization failed\n");
+      PRINTF(1)("! Orxonox initialization failed\n");
       return -1;
     }
@@ -336,447 +413,5 @@
   
   delete orx;
-  
-}
-
-#if defined __linux__ 
-
-#include "list.h"
-#include "world_entity.h"
-#include "vector.h"
-#include "player.h"
-#include "base_object.h"
-#include <asm/msr.h>
-#include <linux/timex.h>
-
-
-#define LIST_MAX 1000
-#define VECTOR_MAX 1000000
-#define ITERATIONS 10000
-
-
-int startBenchmarks()
-{
-
-  printf("===========================================================\n");
-  printf("=                      BENCHMARKS                         =\n");
-  printf("===========================================================\n");
-  printf(" the author is not paying any attention to cacheing effects\n");
-  printf(" of the CPU.\n\n");
-  printf("[title]\t\t\t\t\t     [cycles]\t[loops]\n\n");
-  //  printf("------------------------------------------------------------\n\n");
-
-  // first measure the time overhead:
-  unsigned long ini, end, dt, tmp;
-  rdtscl(ini); rdtscl(end);
-  dt = end - ini;
-
-  int type = -1; 
-  /* type   -1 == all 
-     type    0 == framework
-     type    1 == vector
-     type    2 == quaternion
-     type    3 == lists
-  */
-  if(type == 0 || type == -1)
-    {
-      /* framework test*/
-      
-      printf("Generating Objects:\t\t\t\t\t%i\n", ITERATIONS);
-      /* ************WorldEntity class test************** */
-      WorldEntity* w = NULL;
-      int i = 0;
-      unsigned long mittel = 0;
-      
-      for(i = 0; i < ITERATIONS; ++i)
-	{
-	  rdtscl(ini);
-	  
-	  WorldEntity* w = new WorldEntity();
-	  
-	  rdtscl(end);
-	  delete w;
-	  mittel += (end - ini - dt);
-	}
-      float mi = mittel / (float)ITERATIONS;
-      printf(" Generate a WorldEntity object:\t\t%11.2f\n", mi);
-      
-      /*
-	mittel = 0;
-	for(i = 0; i < ITERATIONS; ++i)
-	{
-	rdtscl(ini);
-	
-	WorldEntity* w = new Primitive(P_SPHERE);
-	
-	rdtscl(end);
-	delete w;
-	mittel += (end - ini - dt);
-	}
-	mi = mittel / (float)ITERATIONS;
-	printf(" Generate a Primitive  object:\t\t%11.2f\n", mi);
-      */
-
-      mittel = 0;
-      for(i = 0; i < ITERATIONS; ++i)
-	{
-	  rdtscl(ini);
-	  
-	  Vector* v = new Vector();
-	  
-	  rdtscl(end);
-	  delete v;
-	  mittel += (end - ini - dt);
-	}
-      mi = mittel / (float)ITERATIONS;
-      printf(" Generate a Vector object:\t\t%11.2f\n", mi);
-
-
-     mittel = 0;
-      for(i = 0; i < ITERATIONS; ++i)
-	{
-	  rdtscl(ini);
-	  
-	  Quaternion* q = new Quaternion();
-	  
-	  rdtscl(end);
-	  delete q;
-	  mittel += (end - ini - dt);
-	}
-      mi = mittel / (float)ITERATIONS;
-      printf(" Generate a Quaternion object:\t\t%11.2f\n", mi);
-
-
-
-
-      printf("\nCalling function inline &| virtual, \t\t\t%i\n", ITERATIONS);
-      mittel = 0;
-      w = new WorldEntity();
-      for(i = 0; i < ITERATIONS; ++i)
-	{
-	  rdtscl(ini);
-	  
-	  w->tick(0.0f);
-
-	  rdtscl(end);
-	  mittel += (end - ini - dt);
-	  }
-      //delete w;
-      mi = mittel / (float)ITERATIONS;
-      printf(" Virt funct tick() of WE: \t\t%11.2f\n", mi);
-
-
-      mittel = 0;
-      WorldEntity wo;
-      for(i = 0; i < ITERATIONS; ++i)
-	{
-	  rdtscl(ini);
-	  
-	  wo.tick(0.0f);
-	   
-	  rdtscl(end);
-	  mittel += (end - ini - dt);
-	  }
-      //delete w;
-      mi = mittel / (float)ITERATIONS;
-      printf(" Inl virt funct tick() of WE v2: \t%11.2f\n", mi);
-
-      
-      mittel = 0;
-      BaseObject* bo = new BaseObject();
-      for(i = 0; i < ITERATIONS; ++i)
-	{
-	  rdtscl(ini);
-	  
-	  bo->isFinalized();
-	   
-	  rdtscl(end);
-	  mittel += (end - ini - dt);
-	  }
-      //delete w;
-      mi = mittel / (float)ITERATIONS;
-      printf(" Inl funct BaseObject::isFinazlized(): \t%11.2f\n", mi);
-
-      
-      tList<WorldEntity>* list = new tList<WorldEntity>();
-
-      
-      /* ************Primitvie class test************** */
-      list = new tList<WorldEntity>();
- 
-      
-      /*
-	mittel = 0;
-	w = new Primitive(P_SPHERE);
-	for(i = 0; i < ITERATIONS; ++i)
-	{
-	rdtscl(ini);
-	
-	w->tick(0.0f);
-	
-	rdtscl(end);
-	mittel += (end - ini - dt);
-	}
-	mi = mittel / (float)ITERATIONS;
-	printf(" Call function tick() of Prim:\t\t%11.2f\n", mi);
-      */
-      
-    }
-  
-  if(type == 1 || type == -1)
-    {
-      printf("\nDoing some simple vector operations: \t\t\t%i\n", VECTOR_MAX);
-      /* vector test */
-      Vector* a = new Vector(1.3, 5.3, 4.1);
-      Vector* b = new Vector(0.4, 2.5, 6.2);
-      Vector* c = new Vector();
-      
-      unsigned long mittel, ini, end;
-      float mi;
-      int i = 0;
-      // addition
-      mittel = 0;
-      for(i = 0; i < VECTOR_MAX; ++i)
-	{
-	  rdtscl(ini);
-	  
-	  *c = *a + *b;
-	   
-	  rdtscl(end);
-	  mittel += (end - ini - dt);
-	}
-      mi = mittel / (float)VECTOR_MAX;
-      printf(" Addition of two vectors:\t\t%11.2f\n", mi);
-      
-      // multiplikation
-
-      mittel = 0;
-      for(i = 0; i < VECTOR_MAX; ++i)
-	{
-	  rdtscl(ini);
-	  
-	  *c = a->cross( *b);
-	   
-	  rdtscl(end);
-	  mittel += (end - ini - dt);
-	}
-      mi = mittel / (float)VECTOR_MAX;
-      printf(" CrossMult of two vectors:\t\t%11.2f\n", mi);
-
-    }
-  if( type == 2 || type == -1)
-    {
-      /* quaternion test */
-      printf("\nDoing some simple quaternion operations: \t\t%i\n", VECTOR_MAX);
-      /* vector test */
-      Quaternion* a = new Quaternion();
-      Quaternion* b = new Quaternion();
-      Quaternion* c = new Quaternion();
-      
-      unsigned long mittel, ini, end;
-      float mi;
-      int i = 0;
-      // quaternion generieren mit spez konstruktor
-      mittel = 0;
-      Vector* qa = new Vector(4.6, 9.3, 0.4);
-      Vector* qb = new Vector(3.5, 6.1, 4.3);
-      for(i = 0; i < VECTOR_MAX; ++i)
-	{
-	  rdtscl(ini);
-	  
-	  Quaternion* qu = new Quaternion(*qa, *qb);
-	  
-	  rdtscl(end);
-	  delete qu;
-	  mittel += (end - ini - dt);
-	}
-      delete a;
-      delete b;
-      mi = mittel / (float)VECTOR_MAX;
-      printf(" Gen. quatern. betw. two vectors:\t%11.2f\n", mi);
-      
-      
-      // multiplication
-      mittel = 0;
-      for(i = 0; i < VECTOR_MAX; ++i)
-	{
-	  rdtscl(ini);
-	  
-	  *c = *a * *b;
-	  
-	  rdtscl(end);
-	  mittel += (end - ini - dt);
-	}
-      mi = mittel / (float)VECTOR_MAX;
-      printf(" Multiplying two quat.(=rot): a * b\t%11.2f\n", mi);
-      
-      
-      
-      // rotating a vector by a quaternion
-      mittel = 0;
-      for(i = 0; i < VECTOR_MAX; ++i)
-	{
-	  rdtscl(ini);
-	  
-	  *qa = a->apply(*qb);
-	  
-	  rdtscl(end);
-	  mittel += (end - ini - dt);
-	}
-      mi = mittel / (float)VECTOR_MAX;
-      printf(" Rot a vec by a quat: q->apply(v)\t%11.2f\n", mi);
-      
-      
-      
-      // generate rotation matrix
-      mittel = 0;
-      float matrix[4][4];
-      for(i = 0; i < VECTOR_MAX; ++i)
-	{
-	  rdtscl(ini);
-	  
-	  a->matrix(matrix);
-	  
-	  rdtscl(end);
-	  mittel += (end - ini - dt);
-	}
-      mi = mittel / (float)VECTOR_MAX;
-      printf(" Generate rot matrix: q->matrix(m)\t%11.2f\n", mi);
-    }
-  if( type == 3 || type == -1)
-    {
-      /* list tests*/
-      printf("\nList operations tests: \t\t\t\t\t%i\n", LIST_MAX);
-      tList<char>* list = new tList<char>();
-      char* name;
-      
-      printf(" Adding[1..10] elements to list, found:\n");
-      list->add("1");
-      list->add("2");
-      list->add("3");
-      list->add("4");
-      list->add("5");
-      list->add("6");
-      list->add("7");
-      list->add("8");
-      list->add("9");
-      list->add("10");
-      
-      /*give list out */
-      tIterator<char>* iterator = list->getIterator();
-      name = iterator->nextElement();
-      printf("  List Elements: \t\t");
-      while( name != NULL)
-	{
-	  printf("%s,", name);
-	  name = iterator->nextElement();
-	}
-      delete iterator;
-      printf("\n");
-      
-      
-      /*removing some elements from the list*/
-      printf(" Removing elements [2,3,6,8,10], adding [11] now found:\n");
-      list->remove("2");
-      list->remove("3");
-      list->remove("6");
-      list->remove("8");
-      list->remove("10");
-      list->add("11");
-      /*give list out */
-      iterator = list->getIterator();
-      name = iterator->nextElement();
-      printf("  List Elements: \t\t");
-      while( name != NULL)
-	{
-	  printf("%s,", name);
-	  name = iterator->nextElement();
-	}
-      delete iterator;
-      printf("\n");
-      
-      delete list;
-      printf("\nChecking list performance:\t\t\t\t%i\n", LIST_MAX);
-      
-      tList<int>* plist = new tList<int>();
-      unsigned long mittel, ini, end;
-      float mi;
-      int i = 0;
-      mittel = 0;
-      for(i = 0; i < LIST_MAX; ++i)
-	{
-	  rdtscl(ini);
-	  
-	  plist->add(&i);
-	  
-	  rdtscl(end);
-	  mittel += (end - ini - dt);
-	}
-      mi = mittel / (float)LIST_MAX;
-      printf(" Adding reference to list:\t\t%11.2f\n", mi);
-      
-      mittel = 0;
-      for(i = 0; i < LIST_MAX; ++i)
-	{
-	  rdtscl(ini);
-	  
-	  plist->remove(&i);
-	  
-	  rdtscl(end);
-	  mittel += (end - ini - dt);
-	}
-      mi = mittel / (float)LIST_MAX;
-      printf(" Removing 1st reference from list:\t%11.2f\n", mi);
-      
-
-      printf("\nList operations tests: \t\t\t\t\t%i\n", LIST_MAX);
-      list = new tList<char>();
-      printf(" Adding[1..10] elements to list, found:\n");
-      list->add("1");
-      list->add("2");
-      list->add("3");
-      list->add("4");
-      list->add("5");
-      list->add("6");
-      list->add("7");
-      list->add("8");
-      list->add("9");
-      list->add("10");
-      
-      /*give list out */
-      iterator = list->getIterator();
-      name = iterator->nextElement();
-      printf("  List Elements: \t\t");
-      while( name != NULL)
-	{
-	  printf("%s,", name);
-	  name = iterator->nextElement();
-	}
-      delete iterator;
-      printf("\n");
-      
-      
-      int c = 0;
-      printf(" Going trough list with nextElement(el) func: ");
-      name = list->firstElement();
-      while(c < 20)
-	{
-	  printf("%s,", name);
-	  name = list->nextElement(name);
-	  c++;
-	}
-      printf("\n");
-      
-
-      
-    }
-  
-}
-
-#else
-
-int startBenchmarks()
-{
-  PRINTF(1)("Benchmark is not implemented in this system\n");
-}
-
-#endif
+  ResourceManager::deleteFile("~/.orxonox/orxonox.lock");
+  
+}
Index: orxonox/branches/openAL/src/orxonox.conf
===================================================================
--- orxonox/branches/openAL/src/orxonox.conf	(revision 3921)
+++ 	(revision )
@@ -1,20 +1,0 @@
-[Bindings]
-UP=up
-DOWN=down
-LEFT=left
-RIGHT=right
-SPACE=fire
-m=mode
-ESCAPE=quit
-p=pause
-q=quit
-BUTTON_LEFT=fire
-BUTTON_RIGHT=altfire
-x=up_world
-z=down_world
-1=view0
-2=view1
-3=view2
-4=view3
-5=view4
-6=view5
Index: orxonox/branches/openAL/src/orxonox.h
===================================================================
--- orxonox/branches/openAL/src/orxonox.h	(revision 3921)
+++ orxonox/branches/openAL/src/orxonox.h	(revision 4194)
@@ -39,14 +39,10 @@
   Uint32 lastframe;           //!< Time of the last Frame
   
+  unsigned int argc;          //!< Count of Arguments of orxonox
+  char** argv;                //!< Values of th Arguments of orxonox.
+  
   void getConfigFile (int argc, char** argv);
   
-  // main loop functions
-  //  void synchronize ();
-  //void handle_input ();
-  //void time_slice ();
-  //void collision ();
-  //void display ();
-  
-  	// subsystem initialization
+  // subsystem initialization
   int initVideo ();
   int initSound ();
@@ -75,7 +71,6 @@
 };
 
-int startHelp(void);
+int startHelp(int argc, char** argv);
 int startOrxonox(int argc, char** argv);
-int startBenchmarks(void);
 
 #endif /* _ORXONOX_H */
Index: orxonox/branches/openAL/src/proto/proto_class.cc
===================================================================
--- orxonox/branches/openAL/src/proto/proto_class.cc	(revision 3921)
+++ orxonox/branches/openAL/src/proto/proto_class.cc	(revision 4194)
@@ -1,4 +1,2 @@
-
-
 /* 
    orxonox - the future of 3D-vertical-scrollers
@@ -16,9 +14,7 @@
 */
 
-#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD_ENTITY
+//#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_
 
 #include "proto_class.h"
-
-#include "stdincl.h" // maybe
 
 using namespace std;
@@ -43,11 +39,2 @@
   // delete what has to be deleted here
 }
-
-/**
-   \brief nonsense - delete this method
-   \param realy nothing to give
-   \returns true or false - probably nothing?
-
-   this is just to show the doxygen abilities (this for example is an extension for a long comment)
-*/
-bool ProtoClass::doNonSense (int nothing) {}
Index: orxonox/branches/openAL/src/proto/proto_class.h
===================================================================
--- orxonox/branches/openAL/src/proto/proto_class.h	(revision 3921)
+++ orxonox/branches/openAL/src/proto/proto_class.h	(revision 4194)
@@ -1,9 +1,6 @@
 /*! 
     \file proto_class.h
-    \brief Definition of the proto class template, used quickly start work
-    \todo Example: this shows how to use simply add a Marker that here has to be done something.
+    \brief Definition of ...
 
-    The Protoclass exists, to help you quikly getting the run for how to develop in orxonox.
-    It is an example for the CODING-CONVENTION, and a starting-point for every class.
 */
 
@@ -11,17 +8,11 @@
 #define _PROTO_CLASS_H
 
-#include "what realy has to be included"
 #include "base_object.h"
 
-// FORWARD DEFINITION \\
-class someClassWeNeed;
+// FORWARD DEFINITION
 
 
-/*class Test;*/ /* forward definition of class Test (without including it here!)*/
 
-//! A default class that aids you to start creating a new class
-/**
-   here can be some longer description of this class
-*/
+//! A class for ...
 class ProtoClass : public BaseObject {
 
@@ -30,8 +21,6 @@
   virtual ~ProtoClass();
 
-  bool doNonSense (int nothing);
 
  private:
-  int nonSense;  //!< doxygen tag here like this for all the variables - delete this variable if you use this
 
 };
Index: orxonox/branches/openAL/src/proto/proto_singleton.h
===================================================================
--- orxonox/branches/openAL/src/proto/proto_singleton.h	(revision 3921)
+++ orxonox/branches/openAL/src/proto/proto_singleton.h	(revision 4194)
@@ -1,7 +1,6 @@
 /*! 
     \file proto_singleton.h
-    \brief Definition of the proto class template, used quickly start work
+    \brief Definition of the ... singleton Class
     
-    a simple file to copy and create a singleton-class from
 */
 
@@ -11,5 +10,5 @@
 #include "base_object.h"
 
-// FORWARD DEFINITION \\
+// FORWARD DEFINITION
 
 //! A default singleton class.
Index: orxonox/branches/openAL/src/story_entities/campaign.cc
===================================================================
--- orxonox/branches/openAL/src/story_entities/campaign.cc	(revision 3921)
+++ orxonox/branches/openAL/src/story_entities/campaign.cc	(revision 4194)
@@ -19,4 +19,5 @@
 #include "campaign.h"
 
+#include "game_loader.h"
 #include "story_entity.h"
 
@@ -34,5 +35,58 @@
   this->isInit = false;
 }
-
+Campaign::Campaign ( TiXmlElement* root) 
+{
+  TiXmlElement* element;
+  const char* string;
+  int id;
+  
+  PRINTF(3)("Loading Campaign...\n");
+  
+  assert( root != NULL);
+  GameLoader* loader = GameLoader::getInstance();
+  
+  this->entities = new tList<StoryEntity>();
+  this->isInit = false;
+  
+  // grab all the necessary parameters
+  string = grabParameter( root, "identifier");
+  if( string == NULL || sscanf(string, "%d", &id) != 1)
+    {
+      PRINTF(2)("Campaign is missing a proper 'identifier'\n");
+      this->setStoryID( -1);
+    }
+  else this->setStoryID( id);
+  
+  // find WorldList
+  element = root->FirstChildElement( "WorldList");
+  if( element == NULL)
+    {
+      PRINTF(2)("Campaign is missing a proper 'WorldList'\n");
+    }
+  else
+    element = element->FirstChildElement();
+  
+  // load Worlds/Subcampaigns/Whatever
+  StoryEntity* lastCreated = NULL;
+  while( element != NULL)
+    {
+      printf("Campaign: Constructor: adding a world\n");
+      StoryEntity* created = (StoryEntity*) loader->fabricate( element);
+      /*
+      if( lastCreated != NULL) 
+	created->setNextStoryID( lastCreated->getStoryID());
+      else
+	created->setNextStoryID( WORLD_ID_GAMEEND);
+      */
+      if( created != NULL)
+	{
+	  this->addEntity( created);	
+	  lastCreated = created;
+	}
+      element = element->NextSiblingElement();
+    }
+  //if( lastCreated != NULL) 
+  //lastCreated->setStoryID( WORLD_ID_GAMEEND);
+}
 
 Campaign::~Campaign () {}
Index: orxonox/branches/openAL/src/story_entities/campaign.h
===================================================================
--- orxonox/branches/openAL/src/story_entities/campaign.h	(revision 3921)
+++ orxonox/branches/openAL/src/story_entities/campaign.h	(revision 4194)
@@ -14,4 +14,5 @@
  public:
   Campaign ();
+  Campaign ( TiXmlElement* root);
   virtual ~Campaign ();
 
Index: orxonox/branches/openAL/src/story_entities/world.cc
===================================================================
--- orxonox/branches/openAL/src/story_entities/world.cc	(revision 3921)
+++ orxonox/branches/openAL/src/story_entities/world.cc	(revision 4194)
@@ -1,2 +1,3 @@
+
 
 /* 
@@ -39,13 +40,16 @@
 #include "garbage_collector.h"
 #include "animation_player.h"
+#include "particle_engine.h"
 
 #include "command_node.h"
 #include "glmenu_imagescreen.h"
 #include "list.h"
-
-
+#include "game_loader.h"
+
+#include "animation3d.h"
+
+#include "substring.h"
 
 using namespace std;
-
 
 WorldInterface* WorldInterface::singletonRef = 0;
@@ -113,5 +117,49 @@
 }
 
-
+CREATE_FACTORY(World);
+
+World::World( TiXmlElement* root)
+{
+  this->constuctorInit("", -1);
+  this->path = NULL;
+  const char *string;
+  char *name;
+  int id;
+  
+  PRINTF0("Creating a World\n");
+  
+  // identifier
+  string = grabParameter( root, "identifier");
+  if( string == NULL || sscanf(string, "%d", &id) != 1)
+    {
+      PRINTF0("World is missing a proper 'identifier'\n");
+      this->setStoryID( -1);
+    }
+  else setStoryID( id);
+
+  // next id
+  string = grabParameter( root, "nextid");
+  if( string == NULL || sscanf(string, "%d", &id) != 1)
+    {
+      PRINTF0("World is missing a proper 'nextid'\n");
+      this->setStoryID( -1);
+    }
+  else setNextStoryID( id);
+  
+
+  // path
+  string = grabParameter( root, "path");
+  if( string == NULL)
+    {
+      PRINTF0("World is missing a proper 'path'\n");
+      this->setPath( NULL);
+    }
+  else
+    {
+      name = new char[strlen(string + 2)];
+      strcpy( name, string);
+      this->setPath( name);
+    }
+}
 
 /** 
@@ -122,5 +170,6 @@
 World::World (char* name)
 {
-  this->init(name, -1);
+  this->path = NULL;
+  this->constuctorInit(name, -1);
   //NullParent* np = NullParent::getInstance();
 }
@@ -132,5 +181,6 @@
 World::World (int worldID)
 {
-  this->init(NULL, worldID);
+  this->path = NULL;
+  this->constuctorInit(NULL, worldID);
 }
 
@@ -148,8 +198,4 @@
   cn->reset();
 
-  ResourceManager::getInstance()->debug();
-  ResourceManager::getInstance()->unloadAllByPriority(RP_LEVEL);
-  ResourceManager::getInstance()->debug();
-
   delete WorldInterface::getInstance();
 
@@ -158,12 +204,12 @@
   delete this->lightMan;
   delete this->trackManager;
+  delete this->particleEngine;
   TextEngine::getInstance()->flush();
 
-  AnimationPlayer::getInstance()->debug();
   delete AnimationPlayer::getInstance(); // this should be at the end of the unloading sequence.
   //delete garbagecollecor
   //delete animator
 
-
+  ResourceManager::getInstance()->unloadAllByPriority(RP_LEVEL);
 }
 
@@ -177,12 +223,13 @@
    NO LEVEL LOADING HERE - NEVER!
 */
-void World::init(char* name, int worldID)
+void World::constuctorInit(char* name, int worldID)
 {
   this->setClassName ("World");
 
-  this->worldName = name;
+  //this->worldName = name;
+  //this->worldName = new char[strlen(name)+1];
+  //strcpy(this->worldName, name);
   this->debugWorldNr = worldID;
   this->entities = new tList<WorldEntity>();
-  AnimationPlayer::getInstance(); // initializes the animationPlayer
 }
 
@@ -200,4 +247,15 @@
   wi->init(this);
   this->garbageCollector = GarbageCollector::getInstance();
+
+  this->particleEngine = ParticleEngine::getInstance();
+  this->trackManager = TrackManager::getInstance();
+  this->lightMan = LightManager::getInstance();
+  this->nullParent = NullParent::getInstance ();
+  this->nullParent->setName ("NullParent");
+
+  AnimationPlayer::getInstance(); // initializes the animationPlayer
+
+  this->localCamera = new Camera();
+  this->localCamera->setName ("camera");
 }
 
@@ -207,12 +265,133 @@
 */
 ErrorMessage World::load()
-{
-  //  BezierCurve* tmpCurve = new BezierCurve();
-  if(this->debugWorldNr != -1)
-    {
-      // initializing Font
-      this->glmis->step();
+{	
+  PRINTF(3)("> Loading world: '%s'\n", getPath());
+  TiXmlElement* element;
+  GameLoader* loader = GameLoader::getInstance();
+  
+  if( getPath() == NULL)
+    {
+      PRINTF(1)("World has no path specified for loading");
+      return (ErrorMessage){213,"Path not specified","World::load()"};
+    }
+  
+  TiXmlDocument* XMLDoc = new TiXmlDocument( path);
+  // load the campaign document
+  if( !XMLDoc->LoadFile())  
+  {
+    // report an error
+    PRINTF(1)("loading XML File: %s @ %d:%d\n", XMLDoc->ErrorDesc(), XMLDoc->ErrorRow(), XMLDoc->ErrorCol());
+    delete XMLDoc;
+    return (ErrorMessage){213,"XML File parsing error","World::load()"};
+  }
+  
+  // check basic validity
+  TiXmlElement* root = XMLDoc->RootElement();
+  assert( root != NULL);
+  
+  if( root == NULL || root->Value() == NULL || strcmp( root->Value(), "WorldDataFile"))
+    {
+      // report an error
+      PRINTF(1)("Specified XML File is not an orxonox world data file (WorldDataFile element missing)\n");
+      delete XMLDoc;
+      return (ErrorMessage){213,"Path not a WorldDataFile","World::load()"};
+    }
+  
+  // load the parameters
+  // name
+  char* temp;
+  const char* string = grabParameter( root, "name");
+  if( string == NULL)
+    {
+      PRINTF(2)("World is missing a proper 'name'\n");
+      string = "Unknown";
+      temp = new char[strlen(string + 2)];
+      strcpy( temp, string);
+      this->worldName = temp;
+    }
+  else
+    {
+      temp = new char[strlen(string + 2)];
+      strcpy( temp, string);
+      this->worldName = temp;
+    }
+  ////////////////
+  // LOADSCREEN //
+  ////////////////
+  element = root->FirstChildElement("LoadScreen");
+  if (element == NULL)
+    {
+      PRINTF(2)("no LoadScreen specified, loading default\n");
+
+      glmis->setBackgroundImage("pictures/load_screen.jpg");
+      this->glmis->setMaximum(8);
+      this->glmis->draw();
+    }
+  else
+    {
+      this->glmis->load(element);
+      this->glmis->draw();
+    }
+  this->glmis->draw();
+  // find WorldEntities
+  element = root->FirstChildElement("WorldEntities");
+  
+  if( element == NULL)
+    {
+      PRINTF(1)("World is missing 'WorldEntities'\n");
+    }
+  else
+    {
+      element = element->FirstChildElement();
+      // load Players/Objects/Whatever
+      PRINTF(4)("Loading WorldEntities\n");
+      while( element != NULL)
+	{
+	  WorldEntity* created = (WorldEntity*) loader->fabricate( element);
+	  if( created != NULL) this->spawn( created);
+	  // if we load a 'Player' we use it as localPlayer
+	  //todo do this more elegant 
+	  if( element->Value() != NULL && !strcmp( element->Value(), "Player")) localPlayer = (Player*) created;
+	  if( element->Value() != NULL && !strcmp( element->Value(), "SkyBox")) sky = (SkyBox*) created;
+	  element = element->NextSiblingElement();
+	  glmis->step(); //! \todo temporary
+	}
+      PRINTF(4)("Done loading WorldEntities\n");
+    }
+  
+  // find Track
+  /*element = root->FirstChildElement( "Track");
+  if( element == NULL)
+    {
+      PRINTF0("============>>>>>>>>>>>>>>>>>World is missing a 'Track'\n");
+    }
+  else
+    {	
+      //load track
+      PRINTF0("============>>>>>>>>>>>>>>>>Loading Track\n");
+
+      trackManager->loadTrack( element);
+      trackManager->finalize();
+      PRINTF0("============>>>>>>>>>>>>>>>>Done loading Track\n");
+    }*/
+  
+  // free the XML data
+
+  delete XMLDoc;
+  /* GENERIC LOADING PROCESS FINISHED */
+  
+  // bind input
+  Orxonox *orx = Orxonox::getInstance ();
+  orx->getLocalInput()->bind (localPlayer);
+  
+  // bind camera
+  //this->localCamera->bind (localPlayer);
+  this->localPlayer->addChild (this->localCamera);
+  
+  
+  // stuff beyond this point remains to be loaded properly
+ 
       // initializing the TrackManager
-      trackManager = TrackManager::getInstance();
+  this->trackManager = TrackManager::getInstance();
       //trackManager->addPoint(Vector(0,0,0));
       trackManager->addPoint(Vector(150, -35, 5));
@@ -272,298 +451,332 @@
 
       
-      /*monitor progress*/
-      this->glmis->step();
-
-      // LIGHT initialisation
-      lightMan = LightManager::getInstance();
-      lightMan->setAmbientColor(.1,.1,.1);
-      lightMan->addLight();
-      //      lightMan->setAttenuation(1.0, .01, 0.0);
-      //      lightMan->setDiffuseColor(1,1,1);
-      //  lightMan->addLight(1);
-      //  lightMan->setPosition(20, 10, -20);
-      //  lightMan->setDiffuseColor(0,0,0);
-      lightMan->debug();
-
-      switch(this->debugWorldNr)
-	{
-	  /*
-	    this loads the hard-coded debug world. this only for simplicity and will be 
-	    removed by a reald world-loader, which interprets a world-file.
-	    if you want to add an own debug world, just add a case DEBUG_WORLD_[nr] and
-	    make whatever you want...
-	   */
-	case DEBUG_WORLD_0:
-	  {
-	    lightMan->setPosition(-5.0, 10.0, -40.0);
-	    this->nullParent = NullParent::getInstance ();
-	    this->nullParent->setName ("NullParent");
-
-	    // !\todo old track-system has to be removed
-
-	    //create helper for player
-	    //HelperParent* hp = new HelperParent ();
-	    /* the player has to be added to this helper */
-
-	    // create a player
-	    this->localPlayer = new Player ();
-	    this->localPlayer->setName ("player");
-	    this->spawn (this->localPlayer);
-	    /*monitor progress*/
-	    //this->glmis->step();
-	    this->glmis->step();
-
-	    // bind input
-	    Orxonox *orx = Orxonox::getInstance ();
-	    orx->getLocalInput()->bind (this->localPlayer);
+  lightMan->setAmbientColor(.1,.1,.1);
+  lightMan->addLight();
+  //      lightMan->setAttenuation(1.0, .01, 0.0);
+  //      lightMan->setDiffuseColor(1,1,1);
+  //  lightMan->addLight(1);
+  //  lightMan->setPosition(20, 10, -20);
+  //  lightMan->setDiffuseColor(0,0,0);
+  lightMan->debug();
+  lightMan->setPosition(-5.0, 10.0, -40.0);
+  
+  //	    trackManager->setBindSlave(env);
+  PNode* tn = trackManager->getTrackNode();
+  tn->addChild(this->localPlayer);
+  
+  //localCamera->setParent(TrackNode::getInstance());
+  tn->addChild(this->localCamera);
+  localCamera->lookAt(tn);
+  localCamera->setMode(PNODE_MOVEMENT);
+  this->localPlayer->setMode(PNODE_ALL);
+  Vector* cameraOffset = new Vector (0, 5, -10);
+  trackManager->condition(2, LEFTRIGHT, this->localPlayer);
+  
+  this->sky->setParent(this->localCamera);
+
+  // initialize debug coord system
+  objectList = glGenLists(1);
+  glNewList (objectList, GL_COMPILE);
+  
+  //  trackManager->drawGraph(.01);
+  trackManager->debug(2);
+  glEndList();
+
+  terrain = new Terrain("worlds/newGround.obj");
+  terrain->setRelCoor(Vector(0,-10,0));
+  this->spawn(terrain);
+
+
+  ParticleSystem* system = new ParticleSystem(1000, PARTICLE_SPRITE);
+  system->setLifeSpan(.5);
+  system->setConserve(.99);
+  system->setRadius(2, 0, 2, 0);
+
+  ParticleEmitter* emitter = new ParticleEmitter(Vector(-1, 0, 0), M_PI_4, 100, .05);
+  emitter->setParent(this->localPlayer);
+  
+  particleEngine->addConnection(emitter, system);
+}
+
+void World::loadDebugWorld(int worldID)
+{
+  /*monitor progress*/
+  this->glmis->step();
+
+  // LIGHT initialisation
+
+  lightMan->setAmbientColor(.1,.1,.1);
+  lightMan->addLight();
+  //      lightMan->setAttenuation(1.0, .01, 0.0);
+  //      lightMan->setDiffuseColor(1,1,1);
+  //  lightMan->addLight(1);
+  //  lightMan->setPosition(20, 10, -20);
+  //  lightMan->setDiffuseColor(0,0,0);
+  lightMan->debug();
+
+  switch(this->debugWorldNr)
+    {
+      /*
+	this loads the hard-coded debug world. this only for simplicity and will be 
+	removed by a reald world-loader, which interprets a world-file.
+	if you want to add an own debug world, just add a case DEBUG_WORLD_[nr] and
+	make whatever you want...
+      */
+    case DEBUG_WORLD_0:
+      {
+	lightMan->setPosition(-5.0, 10.0, -40.0);
+
+	// !\todo old track-system has to be removed
+
+	//create helper for player
+	//HelperParent* hp = new HelperParent ();
+	/* the player has to be added to this helper */
+
+	// create a player
+	this->localPlayer = new Player ();
+	this->localPlayer->setName ("player");
+	this->spawn (this->localPlayer);
+	/*monitor progress*/
+	//this->glmis->step();
+	this->glmis->step();
+
+	// bind input
+	Orxonox *orx = Orxonox::getInstance ();
+	orx->getLocalInput()->bind (this->localPlayer);
 	    
-	    // bind camera
-	    this->localCamera = new Camera();
-	    this->localCamera->setName ("camera");
+	// bind camera
+	this->localCamera = new Camera();
+	this->localCamera->setName ("camera");
 	    
-	    /*monitor progress*/
-	    this->glmis->step();
-
-	    // Create SkySphere
-	    //	    this->skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
-	    //	    this->skySphere->setName("SkySphere");
-	    //	    this->localCamera->addChild(this->skySphere);
-	    //	    this->spawn(this->skySphere);
-	    skyBox = new SkyBox();
-	    skyBox->setTexture("pictures/sky/skybox", "jpg");
-	    skyBox->setParent(localCamera);
-	    this->spawn(skyBox);
-
-	    /*monitor progress*/
-	    this->glmis->step();
+	/*monitor progress*/
+	this->glmis->step();
+
+	sky = new SkyBox();
+	//	(SkyBox*)(sky)->setTexture("pictures/sky/skybox", "jpg");
+	sky->setParent(localCamera);
+	this->spawn(sky);
+
+	/*monitor progress*/
+	this->glmis->step();
 
 	    
-	    WorldEntity* env = new Environment();
-	    env->setName ("env");
-	    this->spawn(env);
+	WorldEntity* env = new Environment();
+	env->setName ("env");
+	this->spawn(env);
 
 	   
-	    /*
-	    Vector* es = new Vector (10, 5, 0);
-	    Quaternion* qs = new Quaternion ();
-	    WorldEntity* pr = new Primitive(P_CYLINDER);
-	    pr->setName("primitive");
-	    this->spawn(pr, this->localPlayer, es, qs, PNODE_MOVEMENT);
-	    */
-
-	    /*monitor progress*/
-	    this->glmis->step();
-
-	    //	    trackManager->setBindSlave(env);
-	    PNode* tn = trackManager->getTrackNode();
-	    tn->addChild(this->localPlayer);
-	    this->localCamera->lookAt(tn);
-
-	    //localCamera->setParent(TrackNode::getInstance());
-	    tn->addChild(this->localCamera);
-	    //	    localCamera->lookAt(tn);
-	    this->localPlayer->setMode(PNODE_ALL);
-	    //Vector* cameraOffset = new Vector (0, 5, -10);
-	    trackManager->condition(2, LEFTRIGHT, this->localPlayer);
-	    this->glmis->step();
-	    break;
-	  }
-	case DEBUG_WORLD_1:
-	  {
-	    lightMan->setPosition(.0, .0, .0);
-	    lightMan->setAttenuation(1.0, .01, 0.0);
-	    lightMan->setSpecularColor(1,0,0);
-	    this->nullParent = NullParent::getInstance ();
-	    this->nullParent->setName ("NullParent");
-
-	    // create a player
-	    WorldEntity* myPlayer = new Player();
-	    myPlayer->setName ("player");
-	    this->spawn(myPlayer);
-	    this->localPlayer = myPlayer;	    
+	/*
+	  Vector* es = new Vector (10, 5, 0);
+	  Quaternion* qs = new Quaternion ();
+	  WorldEntity* pr = new Primitive(P_CYLINDER);
+	  pr->setName("primitive");
+	  this->spawn(pr, this->localPlayer, es, qs, PNODE_MOVEMENT);
+	*/
+
+	/*monitor progress*/
+	this->glmis->step();
+
+	//	    trackManager->setBindSlave(env);
+	PNode* tn = trackManager->getTrackNode();
+	tn->addChild(this->localPlayer);
+	this->localCamera->lookAt(tn);
+
+	//localCamera->setParent(TrackNode::getInstance());
+	tn->addChild(this->localCamera);
+	//	    localCamera->lookAt(tn);
+	this->localPlayer->setMode(PNODE_ALL);
+	//Vector* cameraOffset = new Vector (0, 5, -10);
+	trackManager->condition(2, LEFTRIGHT, this->localPlayer);
+	this->glmis->step();
+	break;
+      }
+    case DEBUG_WORLD_1:
+      {
+	lightMan->setPosition(.0, .0, .0);
+	lightMan->setAttenuation(1.0, .01, 0.0);
+	lightMan->setSpecularColor(1,0,0);
+	this->nullParent = NullParent::getInstance ();
+	this->nullParent->setName ("NullParent");
+
+	// create a player
+	WorldEntity* myPlayer = new Player();
+	myPlayer->setName ("player");
+	this->spawn(myPlayer);
+	this->localPlayer = myPlayer;	    
 	    
-	    // bind input
-	    Orxonox *orx = Orxonox::getInstance();
-	    orx->getLocalInput()->bind (myPlayer);
+	// bind input
+	Orxonox *orx = Orxonox::getInstance();
+	orx->getLocalInput()->bind (myPlayer);
 	    
-	    // bind camera
-	    this->localCamera = new Camera ();
-	    this->localCamera->setName ("camera");
-	    this->localCamera->lookAt(LightManager::getInstance()->getLight(0));
-	    this->localCamera->setParent(this->localPlayer);
-
-	    // Create SkySphere
-	    skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
-	    this->localPlayer->addChild(this->skySphere);
-	    this->spawn(this->skySphere);
-	    Vector* es = new Vector (20, 0, 0);
-	    Quaternion* qs = new Quaternion ();
-
-	    lightMan->getLight(0)->setParent(trackManager->getTrackNode());
-	    break;
-	  }
-	case DEBUG_WORLD_2:
-	  {
-	    lightMan->setAmbientColor(.1,.1,.1);
-	    lightMan->addLight();
-	    lightMan->setPosition(-5.0, 10.0, -40.0);
-	    this->nullParent = NullParent::getInstance ();
-	    this->nullParent->setName ("NullParent");
-
-	    // !\todo old track-system has to be removed
-
-	    //create helper for player
-	    //HelperParent* hp = new HelperParent ();
-	    /* the player has to be added to this helper */
-
-	    // create a player
-	    this->localPlayer = new Player ();
-	    this->localPlayer->setName ("player");
-	    this->spawn (this->localPlayer);
-	    /*monitor progress*/
-	    //this->glmis->step();	    
-	    this->glmis->step();
-
-	    // bind input
-	    Orxonox *orx = Orxonox::getInstance ();
-	    orx->getLocalInput()->bind (this->localPlayer);
+	// bind camera
+	this->localCamera = new Camera ();
+	this->localCamera->setName ("camera");
+	this->localCamera->lookAt(LightManager::getInstance()->getLight(0));
+	this->localCamera->setParent(this->localPlayer);
+
+	// Create SkySphere
+	sky = new Skysphere("pictures/sky-replace.jpg");
+	this->localPlayer->addChild(this->sky);
+	this->spawn(this->sky);
+	Vector* es = new Vector (20, 0, 0);
+	Quaternion* qs = new Quaternion ();
+
+	lightMan->getLight(0)->setParent(trackManager->getTrackNode());
+	break;
+      }
+    case DEBUG_WORLD_2:
+      {
+	lightMan->setAmbientColor(.1,.1,.1);
+	lightMan->addLight();
+	lightMan->setPosition(-5.0, 10.0, -40.0);
+	this->nullParent = NullParent::getInstance ();
+	this->nullParent->setName ("NullParent");
+
+	// !\todo old track-system has to be removed
+
+	//create helper for player
+	//HelperParent* hp = new HelperParent ();
+	/* the player has to be added to this helper */
+
+	// create a player
+	this->localPlayer = new Player ();
+	this->localPlayer->setName ("player");
+	this->spawn (this->localPlayer);
+	/*monitor progress*/
+	//this->glmis->step();	    
+	this->glmis->step();
+
+	// bind input
+	Orxonox *orx = Orxonox::getInstance ();
+	orx->getLocalInput()->bind (this->localPlayer);
 	    
-	    // bind camera
-	    this->localCamera = new Camera();
-	    this->localCamera->setName ("camera");
-	    this->localCamera->lookAt(this->localPlayer);
-	    this->localCamera->setParent(this->localPlayer);
+	// bind camera
+	this->localCamera = new Camera();
+	this->localCamera->setName ("camera");
+	this->localCamera->lookAt(this->localPlayer);
+	this->localCamera->setParent(this->localPlayer);
 	    
-	    /*monitor progress*/
-	    this->glmis->step();
-
-	    // Create SkySphere
-	    this->skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
-	    this->skySphere->setName("SkySphere");
-	    this->spawn(this->skySphere);
-	    this->localCamera->addChild(this->skySphere);
-	    this->skySphere->setMode(PNODE_MOVEMENT);
-	    /*monitor progress*/
-	    this->glmis->step();
-
-
- 	    WorldEntity* baseNode = new Satellite(Vector(1,0,1), 1.2);
-	    this->localPlayer->addChild(baseNode);
-	    baseNode->setRelCoor(Vector(10.0, 2.0, 1.0));
-	    this->spawn(baseNode);
-
- 	    WorldEntity* secondNode = new Satellite(Vector(0,0,1), 2.0);
-	    baseNode->addChild(secondNode);
-	    secondNode->setRelCoor(Vector(0.0, 0.0, 3.0));
-	    this->spawn(secondNode);
-
-
- 	    WorldEntity* thirdNode = new Satellite(Vector(0,0,1), 1.0);
-	    secondNode->addChild(thirdNode);
-	    thirdNode->setRelCoor(Vector(2.0, 0.0, 0.0));
-	    this->spawn(thirdNode);
+	/*monitor progress*/
+	this->glmis->step();
+
+	// Create SkySphere
+	this->sky = new Skysphere("pictures/sky-replace.jpg");
+	this->sky->setName("SkySphere");
+	this->spawn(this->sky);
+	this->localCamera->addChild(this->sky);
+	this->sky->setMode(PNODE_MOVEMENT);
+	/*monitor progress*/
+	this->glmis->step();
+
+
+	WorldEntity* baseNode = new Satellite(Vector(1,0,1), 1.2);
+	this->localPlayer->addChild(baseNode);
+	baseNode->setRelCoor(Vector(10.0, 2.0, 1.0));
+	this->spawn(baseNode);
+
+	WorldEntity* secondNode = new Satellite(Vector(0,0,1), 2.0);
+	baseNode->addChild(secondNode);
+	secondNode->setRelCoor(Vector(0.0, 0.0, 3.0));
+	this->spawn(secondNode);
+
+
+	WorldEntity* thirdNode = new Satellite(Vector(0,0,1), 1.0);
+	secondNode->addChild(thirdNode);
+	thirdNode->setRelCoor(Vector(2.0, 0.0, 0.0));
+	this->spawn(thirdNode);
 
 	    
+   
+	WorldEntity* c = new Environment();
+	this->localPlayer->addChild(c);
+	c->setRelCoor(Vector(10.0, 2.0, -1.0));
+	this->spawn(c);
+
+
 	    
-
-	    WorldEntity* b = new Environment();
-	    this->localPlayer->addChild(b);
-	    b->setRelCoor(Vector(10.0, 1.0, 1.0));
-	    this->spawn(b);
-
-	   
-	    WorldEntity* c = new Environment();
-	    this->localPlayer->addChild(c);
-	    c->setRelCoor(Vector(10.0, 2.0, -1.0));
-	    this->spawn(c);
-	    
-	    /*	   
-		  KeyFrame* f1 = new KeyFrame;
-		  f1->position = new Vector(-1.1, 0.0, 2.6);
-		  f1->direction = new Quaternion();
-		  f1->time = 1.0;
-		  f1->mode = NEG_EXP;
+	Animation3D* animation = new Animation3D(c);
+	animation->setInfinity(ANIM_INF_REPLAY);
+
+
+	animation->addKeyFrame(Vector(0, 0, 0), Quaternion(0, Vector(0,1,0)), 1.0, ANIM_NEG_EXP, ANIM_LINEAR); 
+	animation->addKeyFrame(Vector(0, 2, 0), Quaternion(M_PI, Vector(0,1,0)), 1.0, ANIM_NEG_EXP, ANIM_LINEAR); 
+	animation->addKeyFrame(Vector(0, 0, 0), Quaternion(0, Vector(0,1,0)), 1.0, ANIM_NEG_EXP, ANIM_LINEAR); 
+
+
+
+
+
+
+	/*	   
+	  KeyFrame* f1 = new KeyFrame;
+	  f1->position = new Vector(-1.1, 0.0, 2.6);
+	  f1->direction = new Quaternion();
+	  f1->time = 1.0;
+	  f1->mode = NEG_EXP;
 		  
 		  
-		  KeyFrame* f2 = new KeyFrame;
-		  f2->position = new Vector(-2.1, 0.0, 2.6);
-		  f2->direction = new Quaternion();
-		  f2->time = 0.1;
-		  f2->mode = NEG_EXP;
+	  KeyFrame* f2 = new KeyFrame;
+	  f2->position = new Vector(-2.1, 0.0, 2.6);
+	  f2->direction = new Quaternion();
+	  f2->time = 0.1;
+	  f2->mode = NEG_EXP;
 		  
-		  KeyFrame* f3 = new KeyFrame;
-		  f3->position = new Vector(10.0, 2.0, -1.0);
-		  f3->direction = new Quaternion();
-		  f3->time = 0.2;
-		  f3->mode = NEG_EXP;
+	  KeyFrame* f3 = new KeyFrame;
+	  f3->position = new Vector(10.0, 2.0, -1.0);
+	  f3->direction = new Quaternion();
+	  f3->time = 0.2;
+	  f3->mode = NEG_EXP;
 		  
-		  KeyFrame* f4 = new KeyFrame;
-		  f4->position = new Vector(10.0, 5.0, -1.0);
-		  f4->direction = new Quaternion();
-		  f4->time = 1.0;
-		  f4->mode = NEG_EXP;
+	  KeyFrame* f4 = new KeyFrame;
+	  f4->position = new Vector(10.0, 5.0, -1.0);
+	  f4->direction = new Quaternion();
+	  f4->time = 1.0;
+	  f4->mode = NEG_EXP;
 		  
 		  
 		  
-		  this->simpleAnimation->animatorBegin();
-		  this->simpleAnimation->selectObject(b);
-		  this->simpleAnimation->setAnimationMode(SINGLE);
-		  this->simpleAnimation->addKeyFrame(f1);
-		  this->simpleAnimation->addKeyFrame(f2);
-		  this->simpleAnimation->start();
-		  this->simpleAnimation->selectObject(c);
-		  this->simpleAnimation->addKeyFrame(f3);
-		  this->simpleAnimation->addKeyFrame(f4);
-		  this->simpleAnimation->start();
-		  this->simpleAnimation->animatorEnd();
-	    */
-
-	    /*
-	    Vector* es = new Vector (10, 5, 0);
-	    Quaternion* qs = new Quaternion ();
-	    WorldEntity* pr = new Primitive(P_CYLINDER);
-	    pr->setName("primitive");
-	    this->spawn(pr, this->localPlayer, es, qs, PNODE_MOVEMENT);
-	    */
-
-	    /*monitor progress*/
-	    this->glmis->step();
-
-	    //	    trackManager->setBindSlave(env);
-	    PNode* tn = trackManager->getTrackNode();
-	    tn->addChild(this->localPlayer);
-
-	    //localCamera->setParent(TrackNode::getInstance());
-	    tn->addChild(this->localCamera);
-	    //	    localCamera->lookAt(tn);
-	    this->localPlayer->setMode(PNODE_ALL);
-	    //Vector* cameraOffset = new Vector (0, 5, -10);
-	    trackManager->condition(2, LEFTRIGHT, this->localPlayer);
-	    this->glmis->step();
-
-	    break;
-	  }
-	default:
-	  printf("World::load() - no world with ID %i found", this->debugWorldNr );
-	}
-    }
-  else if(this->worldName != NULL)
-    {
-
-    }
-
-  // initialize debug coord system
-  objectList = glGenLists(1);
-  glNewList (objectList, GL_COMPILE);
- 
-  //  trackManager->drawGraph(.01);
-  trackManager->debug(2);
-  glEndList();
-
-  terrain = new Terrain("../data/worlds/newGround.obj");
-  terrain->setRelCoor(Vector(0,-10,0));
-  this->spawn(terrain);
-
-}
+	  this->simpleAnimation->animatorBegin();
+	  this->simpleAnimation->selectObject(b);
+	  this->simpleAnimation->setAnimationMode(SINGLE);
+	  this->simpleAnimation->addKeyFrame(f1);
+	  this->simpleAnimation->addKeyFrame(f2);
+	  this->simpleAnimation->start();
+	  this->simpleAnimation->selectObject(c);
+	  this->simpleAnimation->addKeyFrame(f3);
+	  this->simpleAnimation->addKeyFrame(f4);
+	  this->simpleAnimation->start();
+	  this->simpleAnimation->animatorEnd();
+	*/
+
+	/*
+	  Vector* es = new Vector (10, 5, 0);
+	  Quaternion* qs = new Quaternion ();
+	  WorldEntity* pr = new Primitive(P_CYLINDER);
+	  pr->setName("primitive");
+	  this->spawn(pr, this->localPlayer, es, qs, PNODE_MOVEMENT);
+	*/
+
+	/*monitor progress*/
+	this->glmis->step();
+
+	//	    trackManager->setBindSlave(env);
+	PNode* tn = trackManager->getTrackNode();
+	tn->addChild(this->localPlayer);
+
+	//localCamera->setParent(TrackNode::getInstance());
+	tn->addChild(this->localCamera);
+	//	    localCamera->lookAt(tn);
+	this->localPlayer->setMode(PNODE_ALL);
+	//Vector* cameraOffset = new Vector (0, 5, -10);
+	trackManager->condition(2, LEFTRIGHT, this->localPlayer);
+	this->glmis->step();
+
+	break;
+      }
+    default:
+      printf("World::load() - no world with ID %i found", this->debugWorldNr );
+    }
+}
+
 
 
@@ -637,8 +850,8 @@
   
   //GLMenuImageScreen* 
-  this->glmis = GLMenuImageScreen::getInstance();
+  this->glmis = new GLMenuImageScreen();
   this->glmis->init();
   this->glmis->setMaximum(8);
-  this->glmis->draw();
+  //  this->glmis->draw();
  
   PRINTF(3)("World::displayLoadScreen - end\n"); 
@@ -654,6 +867,6 @@
   PRINTF(3)("World::releaseLoadScreen - start\n"); 
   this->glmis->setValue(this->glmis->getMaximum());
-  //SDL_Delay(500);
   PRINTF(3)("World::releaseLoadScreen - end\n"); 
+  delete this->glmis;
 }
 
@@ -745,4 +958,6 @@
 
   TextEngine::getInstance()->draw();
+  particleEngine->draw(this->dtS); //!< \todo should be dts like in the Trunk;
+
   lightMan->draw(); // must be at the end of the drawing procedure, otherwise Light cannot be handled as PNodes //
 }
@@ -840,5 +1055,5 @@
       this->tick ();
       // Update the state
-      this->update ();      
+      this->update ();     
       // Process collision
       this->collide ();
@@ -912,6 +1127,6 @@
       
       /* function to let all entities tick (iterate through list) */
-      float seconds = this->dt / 1000.0;      
-      this->gameTime += seconds;
+      this->dtS = (float)this->dt / 1000.0;      
+      this->gameTime += this->dtS;
       //entity = entities->enumerate(); 
       tIterator<WorldEntity>* iterator = this->entities->getIterator();
@@ -919,16 +1134,16 @@
       while( entity != NULL) 
 	{ 
-	  entity->tick (seconds);
+	  entity->tick (this->dtS);
 	  entity = iterator->nextElement();
 	}
       delete iterator;
-      //skySphere->updatePosition(localCamera->absCoordinate);
-      
+
       /* update tick the rest */
       this->trackManager->tick(this->dt);
       this->localCamera->tick(this->dt);
-      this->garbageCollector->tick(seconds);
-
-      AnimationPlayer::getInstance()->tick(seconds);
+      this->garbageCollector->tick(this->dtS);
+
+      AnimationPlayer::getInstance()->tick(this->dtS);
+      particleEngine->tick(this->dtS);
     }
   this->lastFrame = currentFrame;
@@ -945,5 +1160,5 @@
 {
   this->garbageCollector->update();
-  this->nullParent->update (dt);
+  this->nullParent->update (this->dtS);
 }
 
@@ -1033,12 +1248,32 @@
 bool World::command(Command* cmd)
 {
-  if( !strcmp( cmd->cmd, "view0")) this->localCamera->setViewMode(VIEW_NORMAL);
-  else if( !strcmp( cmd->cmd, "view1")) this->localCamera->setViewMode(VIEW_BEHIND);
-  else if( !strcmp( cmd->cmd, "view2")) this->localCamera->setViewMode(VIEW_FRONT);
-  else if( !strcmp( cmd->cmd, "view3")) this->localCamera->setViewMode(VIEW_LEFT);
-  else if( !strcmp( cmd->cmd, "view4")) this->localCamera->setViewMode(VIEW_RIGHT);
-  else if( !strcmp( cmd->cmd, "view5")) this->localCamera->setViewMode(VIEW_TOP);
+  if( !strcmp( cmd->cmd, CONFIG_NAME_VIEW0)) this->localCamera->setViewMode(VIEW_NORMAL);
+  else if( !strcmp( cmd->cmd, CONFIG_NAME_VIEW1)) this->localCamera->setViewMode(VIEW_BEHIND);
+  else if( !strcmp( cmd->cmd, CONFIG_NAME_VIEW2)) this->localCamera->setViewMode(VIEW_FRONT);
+  else if( !strcmp( cmd->cmd, CONFIG_NAME_VIEW3)) this->localCamera->setViewMode(VIEW_LEFT);
+  else if( !strcmp( cmd->cmd, CONFIG_NAME_VIEW4)) this->localCamera->setViewMode(VIEW_RIGHT);
+  else if( !strcmp( cmd->cmd, CONFIG_NAME_VIEW5)) this->localCamera->setViewMode(VIEW_TOP);
 
   return false;
 }
 
+void World::setPath( const char* name)
+{
+  if (this->path)
+    delete this->path;
+  if (ResourceManager::isFile(name))
+  {
+    this->path = new char[strlen(name)+1];
+    strcpy(this->path, name);
+  }
+  else
+    {
+      this->path = new char[strlen(ResourceManager::getInstance()->getDataDir()) + strlen(name) +1];
+      sprintf(this->path, "%s%s", ResourceManager::getInstance()->getDataDir(), name);
+    }
+}
+
+const char* World::getPath( void)
+{
+  return path;
+}
Index: orxonox/branches/openAL/src/story_entities/world.h
===================================================================
--- orxonox/branches/openAL/src/story_entities/world.h	(revision 3921)
+++ orxonox/branches/openAL/src/story_entities/world.h	(revision 4194)
@@ -11,5 +11,5 @@
 #include "story_entity.h"
 #include "p_node.h"
-
+#include "xmlparser/tinyxml.h"
 
 class World;
@@ -19,7 +19,6 @@
 class PNode;
 class GLMenuImageScreen;
-class Skysphere;
-class SkyBox;
 class LightManager;
+class ParticleEngine;
 class Terrain;
 class GarbageCollector;
@@ -57,4 +56,5 @@
   World (char* name);
   World (int worldID);
+  World (TiXmlElement* root);
   virtual ~World ();
 
@@ -70,4 +70,6 @@
   virtual ErrorMessage resume ();
   virtual ErrorMessage destroy ();
+
+  void loadDebugWorld(int worldID);
 
   virtual void displayLoadScreen();
@@ -85,10 +87,13 @@
 	     int parentingMode);
 
+  const char* getPath();
+  void setPath( const char* name);
 
  private:
-  void init(char* name, int worldID);
+  void constuctorInit(char* name, int worldID);
 
   Uint32 lastFrame;                   //!< last time of frame
   Uint32 dt;                          //!< time needed to calculate this frame
+  float dtS;                          //!< The time needed for caluculations in seconds
   double gameTime;                    //!< this is where the game time is saved
   bool bQuitOrxonox;                  //!< quit this application
@@ -100,10 +105,11 @@
   char* worldName;                    //!< The name of this World
   int debugWorldNr;                   //!< The Debug Nr. needed, if something goes wrong
+  char* path;                         //!< The file from which this world is loaded
 
   PNode* nullParent;                  //!< The zero-point, that everything has as its parent.
   TrackManager* trackManager;         //!< The reference of the TrackManager that handles the course through the Level.
+  ParticleEngine* particleEngine;     //!< The ParticleEngine of the World.
   Camera* localCamera;                //!< The current Camera
-  Skysphere* skySphere;               //!< The Environmental Heaven of orxonox \todo insert this to environment insted
-  SkyBox* skyBox;
+  WorldEntity* sky;                   //!< The Environmental Heaven of orxonox \todo insert this to environment insted
   LightManager* lightMan;             //!< The Lights of the Level
   Terrain* terrain;                   //!< The Terrain of the World.
Index: orxonox/branches/openAL/src/subprojects/Makefile.in
===================================================================
--- orxonox/branches/openAL/src/subprojects/Makefile.in	(revision 3921)
+++ orxonox/branches/openAL/src/subprojects/Makefile.in	(revision 4194)
@@ -89,12 +89,8 @@
 EXEEXT = @EXEEXT@
 GPROF = @GPROF@
-GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
-GTHREAD_LIBS = @GTHREAD_LIBS@
 GTK2_CFLAGS = @GTK2_CFLAGS@
 GTK2_LIBS = @GTK2_LIBS@
 HAVE_CURL_FALSE = @HAVE_CURL_FALSE@
 HAVE_CURL_TRUE = @HAVE_CURL_TRUE@
-HAVE_GTHREAD_FALSE = @HAVE_GTHREAD_FALSE@
-HAVE_GTHREAD_TRUE = @HAVE_GTHREAD_TRUE@
 HAVE_GTK2_FALSE = @HAVE_GTK2_FALSE@
 HAVE_GTK2_TRUE = @HAVE_GTK2_TRUE@
@@ -117,4 +113,6 @@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -125,4 +123,5 @@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
Index: orxonox/branches/openAL/src/subprojects/benchmark.cc
===================================================================
--- orxonox/branches/openAL/src/subprojects/benchmark.cc	(revision 4194)
+++ orxonox/branches/openAL/src/subprojects/benchmark.cc	(revision 4194)
@@ -0,0 +1,472 @@
+/* 
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+
+   ### File Specific:
+   main-programmer: Patrick Boenzli
+   co-programmer: ...
+
+*/
+
+
+#if defined __linux__ 
+
+#include "list.h"
+#include "world_entity.h"
+#include "vector.h"
+#include "player.h"
+#include "base_object.h"
+
+#include <asm/msr.h>
+#include <linux/timex.h>
+
+
+#define LIST_MAX 1000
+#define VECTOR_MAX 1000000
+#define ITERATIONS 10000
+
+
+int startBenchmarks()
+{
+
+  printf("===========================================================\n");
+  printf("=                      BENCHMARKS                         =\n");
+  printf("===========================================================\n");
+  printf(" the author is not paying any attention to cacheing effects\n");
+  printf(" of the CPU.\n\n");
+  printf("[title]\t\t\t\t\t     [cycles]\t[loops]\n\n");
+  //  printf("------------------------------------------------------------\n\n");
+
+  // first measure the time overhead:
+  unsigned long ini, end, dt, tmp;
+  rdtscl(ini); rdtscl(end);
+  dt = end - ini;
+
+  int type = -1; 
+  /* type   -1 == all 
+     type    0 == framework
+     type    1 == vector
+     type    2 == quaternion
+     type    3 == lists
+  */
+  if(type == 0 || type == -1)
+    {
+      /* framework test*/
+      
+      printf("Generating Objects:\t\t\t\t\t%i\n", ITERATIONS);
+      /* ************WorldEntity class test************** */
+      WorldEntity* w = NULL;
+      int i = 0;
+      unsigned long mittel = 0;
+      
+      for(i = 0; i < ITERATIONS; ++i)
+	{
+	  rdtscl(ini);
+	  
+	  WorldEntity* w = new WorldEntity();
+	  
+	  rdtscl(end);
+	  delete w;
+	  mittel += (end - ini - dt);
+	}
+      float mi = mittel / (float)ITERATIONS;
+      printf(" Generate a WorldEntity object:\t\t%11.2f\n", mi);
+      
+      /*
+	mittel = 0;
+	for(i = 0; i < ITERATIONS; ++i)
+	{
+	rdtscl(ini);
+	
+	WorldEntity* w = new Primitive(P_SPHERE);
+	
+	rdtscl(end);
+	delete w;
+	mittel += (end - ini - dt);
+	}
+	mi = mittel / (float)ITERATIONS;
+	printf(" Generate a Primitive  object:\t\t%11.2f\n", mi);
+      */
+
+      mittel = 0;
+      for(i = 0; i < ITERATIONS; ++i)
+	{
+	  rdtscl(ini);
+	  
+	  Vector* v = new Vector();
+	  
+	  rdtscl(end);
+	  delete v;
+	  mittel += (end - ini - dt);
+	}
+      mi = mittel / (float)ITERATIONS;
+      printf(" Generate a Vector object:\t\t%11.2f\n", mi);
+
+
+     mittel = 0;
+      for(i = 0; i < ITERATIONS; ++i)
+	{
+	  rdtscl(ini);
+	  
+	  Quaternion* q = new Quaternion();
+	  
+	  rdtscl(end);
+	  delete q;
+	  mittel += (end - ini - dt);
+	}
+      mi = mittel / (float)ITERATIONS;
+      printf(" Generate a Quaternion object:\t\t%11.2f\n", mi);
+
+
+
+
+      printf("\nCalling function inline &| virtual, \t\t\t%i\n", ITERATIONS);
+      mittel = 0;
+      w = new WorldEntity();
+      for(i = 0; i < ITERATIONS; ++i)
+	{
+	  rdtscl(ini);
+	  
+	  w->tick(0.0f);
+
+	  rdtscl(end);
+	  mittel += (end - ini - dt);
+	  }
+      //delete w;
+      mi = mittel / (float)ITERATIONS;
+      printf(" Virt funct tick() of WE: \t\t%11.2f\n", mi);
+
+
+      mittel = 0;
+      WorldEntity wo;
+      for(i = 0; i < ITERATIONS; ++i)
+	{
+	  rdtscl(ini);
+	  
+	  wo.tick(0.0f);
+	   
+	  rdtscl(end);
+	  mittel += (end - ini - dt);
+	  }
+      //delete w;
+      mi = mittel / (float)ITERATIONS;
+      printf(" Inl virt funct tick() of WE v2: \t%11.2f\n", mi);
+
+      
+      mittel = 0;
+      BaseObject* bo = new BaseObject();
+      for(i = 0; i < ITERATIONS; ++i)
+	{
+	  rdtscl(ini);
+	  
+	  bo->isFinalized();
+	   
+	  rdtscl(end);
+	  mittel += (end - ini - dt);
+	  }
+      //delete w;
+      mi = mittel / (float)ITERATIONS;
+      printf(" Inl funct BaseObject::isFinazlized(): \t%11.2f\n", mi);
+
+      
+      tList<WorldEntity>* list = new tList<WorldEntity>();
+
+      
+      /* ************Primitvie class test************** */
+      list = new tList<WorldEntity>();
+ 
+      
+      /*
+	mittel = 0;
+	w = new Primitive(P_SPHERE);
+	for(i = 0; i < ITERATIONS; ++i)
+	{
+	rdtscl(ini);
+	
+	w->tick(0.0f);
+	
+	rdtscl(end);
+	mittel += (end - ini - dt);
+	}
+	mi = mittel / (float)ITERATIONS;
+	printf(" Call function tick() of Prim:\t\t%11.2f\n", mi);
+      */
+      
+    }
+  
+  if(type == 1 || type == -1)
+    {
+      printf("\nDoing some simple vector operations: \t\t\t%i\n", VECTOR_MAX);
+      /* vector test */
+      Vector* a = new Vector(1.3, 5.3, 4.1);
+      Vector* b = new Vector(0.4, 2.5, 6.2);
+      Vector* c = new Vector();
+      
+      unsigned long mittel, ini, end;
+      float mi;
+      int i = 0;
+      // addition
+      mittel = 0;
+      for(i = 0; i < VECTOR_MAX; ++i)
+	{
+	  rdtscl(ini);
+	  
+	  *c = *a + *b;
+	   
+	  rdtscl(end);
+	  mittel += (end - ini - dt);
+	}
+      mi = mittel / (float)VECTOR_MAX;
+      printf(" Addition of two vectors:\t\t%11.2f\n", mi);
+      
+      // multiplikation
+
+      mittel = 0;
+      for(i = 0; i < VECTOR_MAX; ++i)
+	{
+	  rdtscl(ini);
+	  
+	  *c = a->cross( *b);
+	   
+	  rdtscl(end);
+	  mittel += (end - ini - dt);
+	}
+      mi = mittel / (float)VECTOR_MAX;
+      printf(" CrossMult of two vectors:\t\t%11.2f\n", mi);
+
+    }
+  if( type == 2 || type == -1)
+    {
+      /* quaternion test */
+      printf("\nDoing some simple quaternion operations: \t\t%i\n", VECTOR_MAX);
+      /* vector test */
+      Quaternion* a = new Quaternion();
+      Quaternion* b = new Quaternion();
+      Quaternion* c = new Quaternion();
+      
+      unsigned long mittel, ini, end;
+      float mi;
+      int i = 0;
+      // quaternion generieren mit spez konstruktor
+      mittel = 0;
+      Vector* qa = new Vector(4.6, 9.3, 0.4);
+      Vector* qb = new Vector(3.5, 6.1, 4.3);
+      for(i = 0; i < VECTOR_MAX; ++i)
+	{
+	  rdtscl(ini);
+	  
+	  Quaternion* qu = new Quaternion(*qa, *qb);
+	  
+	  rdtscl(end);
+	  delete qu;
+	  mittel += (end - ini - dt);
+	}
+      delete a;
+      delete b;
+      mi = mittel / (float)VECTOR_MAX;
+      printf(" Gen. quatern. betw. two vectors:\t%11.2f\n", mi);
+      
+      
+      // multiplication
+      mittel = 0;
+      for(i = 0; i < VECTOR_MAX; ++i)
+	{
+	  rdtscl(ini);
+	  
+	  *c = *a * *b;
+	  
+	  rdtscl(end);
+	  mittel += (end - ini - dt);
+	}
+      mi = mittel / (float)VECTOR_MAX;
+      printf(" Multiplying two quat.(=rot): a * b\t%11.2f\n", mi);
+      
+      
+      
+      // rotating a vector by a quaternion
+      mittel = 0;
+      for(i = 0; i < VECTOR_MAX; ++i)
+	{
+	  rdtscl(ini);
+	  
+	  *qa = a->apply(*qb);
+	  
+	  rdtscl(end);
+	  mittel += (end - ini - dt);
+	}
+      mi = mittel / (float)VECTOR_MAX;
+      printf(" Rot a vec by a quat: q->apply(v)\t%11.2f\n", mi);
+      
+      
+      
+      // generate rotation matrix
+      mittel = 0;
+      float matrix[4][4];
+      for(i = 0; i < VECTOR_MAX; ++i)
+	{
+	  rdtscl(ini);
+	  
+	  a->matrix(matrix);
+	  
+	  rdtscl(end);
+	  mittel += (end - ini - dt);
+	}
+      mi = mittel / (float)VECTOR_MAX;
+      printf(" Generate rot matrix: q->matrix(m)\t%11.2f\n", mi);
+    }
+  if( type == 3 || type == -1)
+    {
+      /* list tests*/
+      printf("\nList operations tests: \t\t\t\t\t%i\n", LIST_MAX);
+      tList<char>* list = new tList<char>();
+      char* name;
+      
+      printf(" Adding[1..10] elements to list, found:\n");
+      list->add("1");
+      list->add("2");
+      list->add("3");
+      list->add("4");
+      list->add("5");
+      list->add("6");
+      list->add("7");
+      list->add("8");
+      list->add("9");
+      list->add("10");
+      
+      /*give list out */
+      tIterator<char>* iterator = list->getIterator();
+      name = iterator->nextElement();
+      printf("  List Elements: \t\t");
+      while( name != NULL)
+	{
+	  printf("%s,", name);
+	  name = iterator->nextElement();
+	}
+      delete iterator;
+      printf("\n");
+      
+      
+      /*removing some elements from the list*/
+      printf(" Removing elements [2,3,6,8,10], adding [11] now found:\n");
+      list->remove("2");
+      list->remove("3");
+      list->remove("6");
+      list->remove("8");
+      list->remove("10");
+      list->add("11");
+      /*give list out */
+      iterator = list->getIterator();
+      name = iterator->nextElement();
+      printf("  List Elements: \t\t");
+      while( name != NULL)
+	{
+	  printf("%s,", name);
+	  name = iterator->nextElement();
+	}
+      delete iterator;
+      printf("\n");
+      
+      delete list;
+      printf("\nChecking list performance:\t\t\t\t%i\n", LIST_MAX);
+      
+      tList<int>* plist = new tList<int>();
+      unsigned long mittel, ini, end;
+      float mi;
+      int i = 0;
+      mittel = 0;
+      for(i = 0; i < LIST_MAX; ++i)
+	{
+	  rdtscl(ini);
+	  
+	  plist->add(&i);
+	  
+	  rdtscl(end);
+	  mittel += (end - ini - dt);
+	}
+      mi = mittel / (float)LIST_MAX;
+      printf(" Adding reference to list:\t\t%11.2f\n", mi);
+      
+      mittel = 0;
+      for(i = 0; i < LIST_MAX; ++i)
+	{
+	  rdtscl(ini);
+	  
+	  plist->remove(&i);
+	  
+	  rdtscl(end);
+	  mittel += (end - ini - dt);
+	}
+      mi = mittel / (float)LIST_MAX;
+      printf(" Removing 1st reference from list:\t%11.2f\n", mi);
+      
+
+      printf("\nList operations tests: \t\t\t\t\t%i\n", LIST_MAX);
+      list = new tList<char>();
+      printf(" Adding[1..10] elements to list, found:\n");
+      list->add("1");
+      list->add("2");
+      list->add("3");
+      list->add("4");
+      list->add("5");
+      list->add("6");
+      list->add("7");
+      list->add("8");
+      list->add("9");
+      list->add("10");
+      
+      /*give list out */
+      iterator = list->getIterator();
+      name = iterator->nextElement();
+      printf("  List Elements: \t\t");
+      while( name != NULL)
+	{
+	  printf("%s,", name);
+	  name = iterator->nextElement();
+	}
+      delete iterator;
+      printf("\n");
+      
+      
+      int c = 0;
+      printf(" Going trough list with nextElement(el) func: ");
+      name = list->firstElement();
+      while(c < 20)
+	{
+	  printf("%s,", name);
+	  name = list->nextElement(name);
+	  c++;
+	}
+      printf("\n");
+      
+
+      
+    }
+  
+}
+
+#else
+
+#include "debug.h"
+
+int startBenchmarks()
+{
+  PRINTF(1)("Benchmark is not implemented in this system\n");
+}
+
+#endif
Index: orxonox/branches/openAL/src/subprojects/benchmark.h
===================================================================
--- orxonox/branches/openAL/src/subprojects/benchmark.h	(revision 4194)
+++ orxonox/branches/openAL/src/subprojects/benchmark.h	(revision 4194)
@@ -0,0 +1,13 @@
+/*! 
+    \file benchmark.h
+    \brief benchmark functions
+*/ 
+
+
+#ifndef _BENCHMARK_H
+#define _BENCHMARK_H
+
+int startBenchmarks(void);
+
+
+#endif /* _BENCHMARK_H */
Index: orxonox/branches/openAL/src/subprojects/testmain/Makefile.in
===================================================================
--- orxonox/branches/openAL/src/subprojects/testmain/Makefile.in	(revision 3921)
+++ orxonox/branches/openAL/src/subprojects/testmain/Makefile.in	(revision 4194)
@@ -104,12 +104,8 @@
 EXEEXT = @EXEEXT@
 GPROF = @GPROF@
-GTHREAD_CFLAGS = @GTHREAD_CFLAGS@
-GTHREAD_LIBS = @GTHREAD_LIBS@
 GTK2_CFLAGS = @GTK2_CFLAGS@
 GTK2_LIBS = @GTK2_LIBS@
 HAVE_CURL_FALSE = @HAVE_CURL_FALSE@
 HAVE_CURL_TRUE = @HAVE_CURL_TRUE@
-HAVE_GTHREAD_FALSE = @HAVE_GTHREAD_FALSE@
-HAVE_GTHREAD_TRUE = @HAVE_GTHREAD_TRUE@
 HAVE_GTK2_FALSE = @HAVE_GTK2_FALSE@
 HAVE_GTK2_TRUE = @HAVE_GTK2_TRUE@
@@ -132,4 +128,6 @@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
@@ -140,4 +138,5 @@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_CXX = @ac_ct_CXX@
+ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
Index: orxonox/branches/openAL/src/track_manager.cc
===================================================================
--- orxonox/branches/openAL/src/track_manager.cc	(revision 3921)
+++ orxonox/branches/openAL/src/track_manager.cc	(revision 4194)
@@ -312,5 +312,5 @@
   PNode* tmpNode = (PNode*)node;
 
-  if (tmpNode->getRelCoor()->z < 0)
+  if (tmpNode->getRelCoor().z < 0)
     return 0;
   else 
@@ -333,5 +333,5 @@
   PNode* tmpNode = (PNode*)node;
 
-  Vector nodeRelCoord = *tmpNode->getRelCoor();
+  Vector nodeRelCoord = tmpNode->getRelCoor();
   float minDist = 100000000;
   int childNumber = 0;
@@ -396,4 +396,17 @@
   this->textAnimation->setInfinity(ANIM_INF_CONSTANT);
 }
+
+
+/**
+   \brief loads a trackElement from a TiXmlElement
+   \param root the TiXmlElement to load the Data from
+
+*/
+bool TrackManager::load( TiXmlElement* root)
+{
+
+}
+
+
 
 /**
Index: orxonox/branches/openAL/src/track_manager.h
===================================================================
--- orxonox/branches/openAL/src/track_manager.h	(revision 3921)
+++ orxonox/branches/openAL/src/track_manager.h	(revision 4194)
@@ -153,4 +153,6 @@
   static TrackManager* getInstance(void);
 
+  bool load(TiXmlElement* root);
+
   // Methods to change the Path (initialisation)
   void workOn(unsigned int trackID);
Index: orxonox/branches/openAL/src/track_node.cc
===================================================================
--- orxonox/branches/openAL/src/track_node.cc	(revision 3921)
+++ orxonox/branches/openAL/src/track_node.cc	(revision 4194)
@@ -41,10 +41,10 @@
 
 
-TrackNode::TrackNode (Vector* absCoordinate)
+TrackNode::TrackNode (const Vector& absCoordinate)
 {
   this->parent = NullParent::getInstance();
   this->trackManager = TrackManager::getInstance();
   this->setMode(PNODE_ALL);
-  this->absCoordinate = absCoordinate;
+  this->setAbsCoor(absCoordinate);
 }
 
Index: orxonox/branches/openAL/src/track_node.h
===================================================================
--- orxonox/branches/openAL/src/track_node.h	(revision 3921)
+++ orxonox/branches/openAL/src/track_node.h	(revision 4194)
@@ -22,5 +22,5 @@
  public:
   TrackNode ();
-  TrackNode (Vector* absCoordinate);
+  TrackNode (const Vector& absCoordinate);
 
   virtual ~TrackNode ();
Index: orxonox/branches/openAL/src/util/animation/animation.cc
===================================================================
--- orxonox/branches/openAL/src/util/animation/animation.cc	(revision 3921)
+++ orxonox/branches/openAL/src/util/animation/animation.cc	(revision 4194)
@@ -34,6 +34,7 @@
 
   // setting default values
+  this->keyFramesToPlay = -1;
   this->localTime = 0.0;
-  this->bRunning = true;
+  this->bRunning = false;
 
   AnimationPlayer::getInstance()->addAnimation(this);
@@ -83,5 +84,6 @@
       break;
     case ANIM_INF_REPLAY:
-      this->replay();
+      this->rewind();
+      this->bRunning = true;
       break;
     case ANIM_INF_REWIND:
@@ -99,4 +101,15 @@
 void Animation::play()
 {
+  this->keyFramesToPlay = -1;
+  this->bRunning = true;
+}
+
+/**
+   \brief plays the Next n keyframes
+   \param n the Count of keyFrames to play.
+*/
+void Animation::playNextKeyframes(int n)
+{
+  this->keyFramesToPlay = n-1;
   this->bRunning = true;
 }
@@ -107,4 +120,5 @@
 void Animation::stop()
 {
+  this->keyFramesToPlay = -1;
   this->rewind();
   this->bRunning = true;
@@ -127,4 +141,4 @@
 {
   this->rewind();
-  this->bRunning = true;
+  this->play();
 }
Index: orxonox/branches/openAL/src/util/animation/animation.h
===================================================================
--- orxonox/branches/openAL/src/util/animation/animation.h	(revision 3921)
+++ orxonox/branches/openAL/src/util/animation/animation.h	(revision 4194)
@@ -25,5 +25,7 @@
    ANIM_NEG_EXP: fast, slow
    ANIM_RANDOM: eratic
-   
+
+   ANIM_NULL: !!DO NOT USE THIS!! only for internal handling
+
    deprecated QUADRATIC
 */
@@ -35,5 +37,7 @@
 			    ANIM_NEG_EXP,
 			    ANIM_QUADRATIC,
-			    ANIM_RANDOM};
+			    ANIM_RANDOM,
+			    ANIM_NULL};
+#define ANIM_DEFAULT_FUNCTION ANIM_LINEAR      //!< A default function to choose from the above set
 
 //! An enumerator describing what the animation should do after the last keyframe.
@@ -69,4 +73,5 @@
 
   void play(); // equals resume();
+  void playNextKeyframes(int n = 1);
   void stop();
   void pause();
@@ -95,4 +100,5 @@
   BaseObject* baseObject;         //!< The same as object in the derived classes, but with reference to BaseObject
   unsigned int keyFrameCount;     //!< The Count of KeyFrames.
+  int keyFramesToPlay;            //!< How many more Keyframes to play. if negative it will be ignored if 0 stop.
   bool bHandled;                  //!< If this Animation is handled by the AnimationPlayer.
   bool bRunning;                  //!< If the animation is running
Index: orxonox/branches/openAL/src/util/animation/animation3d.cc
===================================================================
--- orxonox/branches/openAL/src/util/animation/animation3d.cc	(revision 3921)
+++ orxonox/branches/openAL/src/util/animation/animation3d.cc	(revision 4194)
@@ -15,4 +15,6 @@
    2005-04-17: Benjamin Grauer
           Rewritte all functions, so it will fit into the Animation-class
+   2005-04-25: Patrick Boenzli
+          Extended the framework to support quatSlerp rotations. Each frame now supports diff mov/rot types. Implemented mov/rot functions
 */
 
@@ -42,5 +44,7 @@
   this->nextKeyFrame = tmpKeyFrame;
 
-  this->animFunc = &Animation3D::linear;
+  this->animFuncMov = &Animation3D::mLinear;
+  this->animFuncRot = &Animation3D::rLinear;
+
 }
 
@@ -72,5 +76,6 @@
   this->nextKeyFrame = keyFrameList->nextElement(keyFrameList->firstElement());
   this->localTime = 0.0;
-  this->setAnimFunc(this->currentKeyFrame->animFunc);
+  this->setAnimFuncMov(this->currentKeyFrame->animFuncMov);
+  this->setAnimFuncRot(this->currentKeyFrame->animFuncRot);
 }
 
@@ -80,11 +85,17 @@
    \param direction The direction of the new Keyframe.
    \param duration The duration from the new KeyFrame to the next one
-   \param animFunc The function to animate between this keyFrame and the next one
-*/
-void Animation3D::addKeyFrame(Vector position, Quaternion direction, float duration, ANIM_FUNCTION animFunc)
+   \param animFuncMov The function to animate position between this keyFrame and the next one
+   \param animFuncMov The function to animate rotation between this keyFrame and the next one
+*/
+void Animation3D::addKeyFrame(Vector position, Quaternion direction, float duration, ANIM_FUNCTION animFuncMov, ANIM_FUNCTION animFuncRot)
 {
   // some small check
   if (duration <= 0.0)
     duration = 1.0;
+  // if the Rotation-Animation-function is set ANIM_NULL, animFuncRot will match animFuncRot
+  if (animFuncMov == ANIM_NULL)
+    animFuncMov = ANIM_DEFAULT_FUNCTION;
+  if (animFuncRot == ANIM_NULL)
+    animFuncRot = animFuncMov;
 
   KeyFrame3D* tmpKeyFrame;
@@ -94,5 +105,6 @@
     {
       tmpKeyFrame = this->keyFrameList->firstElement();
-      this->setAnimFunc(animFunc);
+      //this->setAnimFuncMov(animFuncMov);
+      //this->setAnimFuncRot(animFuncRot);
     }
   else
@@ -106,9 +118,13 @@
 
   tmpKeyFrame->position = position;
+  //tmpKeyFrame->lastPosition = position;
   tmpKeyFrame->direction = direction;
   tmpKeyFrame->duration = duration;
-  tmpKeyFrame->animFunc = animFunc;
+  tmpKeyFrame->animFuncMov = animFuncMov;
+  tmpKeyFrame->animFuncRot = animFuncRot;
   this->keyFrameCount++;
 }
+
+
 
 /**
@@ -123,96 +139,80 @@
       if (localTime >= this->currentKeyFrame->duration)
 	{
-	  // switching to the next Key-Frame
-	  this->localTime -= this->currentKeyFrame->duration;
-	  this->currentKeyFrame = this->nextKeyFrame;
-	  // checking, if we should still Play the animation
-	  if (this->currentKeyFrame == this->keyFrameList->lastElement())
-	    this->handleInfinity();
-	  this->nextKeyFrame = this->keyFrameList->nextElement(this->currentKeyFrame);
-	  this->setAnimFunc(this->currentKeyFrame->animFunc);	  
-	  
-	  if( this->currentKeyFrame->animFunc == ANIM_NEG_EXP)
+	  if (likely(this->keyFramesToPlay != 0))
 	    {
-	      this->tmpVect = this->nextKeyFrame->position - this->currentKeyFrame->position;
-	      this->deltaT = 1/this->currentKeyFrame->duration * logf(1.0 + 600.0/this->tmpVect.len());
+	      if (unlikely(this->keyFramesToPlay > 0))
+		--this->keyFramesToPlay;
+	      // switching to the next Key-Frame
+	      this->localTime -= this->currentKeyFrame->duration;
+	      this->currentKeyFrame = this->nextKeyFrame;
+	      // checking, if we should still Play the animation
+	      if (this->currentKeyFrame == this->keyFrameList->lastElement())
+		this->handleInfinity();
+	      this->nextKeyFrame = this->keyFrameList->nextElement(this->currentKeyFrame);
+	      this->setAnimFuncMov(this->currentKeyFrame->animFuncMov);
+	      this->setAnimFuncRot(this->currentKeyFrame->animFuncRot);
 	    }
-	}
-
+	  else
+	    this->pause();
+	}      
       /* now animate it */
-      (this->*animFunc)(this->localTime);
-      /*
-      switch( this->movMode)
-	{
-	case LINEAR:
-	  *this->tmpVect = *this->currentFrame->position - *this->lastFrame->position;
-	  *this->tmpVect = *this->tmpVect * this->localTime / this->currentFrame->time;
-	  this->currentFrame->object->setRelCoor(*this->lastFrame->position + *this->tmpVect);
-	  *this->lastPosition = *this->tmpVect;
-	  break;
-	case EXP:
-	      
-	  break;
-	case NEG_EXP:
-	  *this->tmpVect = *this->currentFrame->position - *this->lastFrame->position;
-	  *this->tmpVect = *this->tmpVect * (1 - expf(- this->localTime * this->deltaT));     
-	  this->currentFrame->object->setRelCoor(*this->lastFrame->position + *this->tmpVect);
-	  *this->lastPosition = *this->tmpVect;
-	  break;
-	case SIN:
-	  *this->tmpVect = *this->currentFrame->position - *this->lastFrame->position;
-	  *this->tmpVect = *this->tmpVect * 0.5*(1 - cos(M_PI * this->localTime / this->currentFrame->time));     
-	  this->currentFrame->object->setRelCoor(*this->lastFrame->position + *this->tmpVect);
-	  *this->lastPosition = *this->tmpVect;
-	  break;
-	case COS:
-	      
-	  break;
-	case QUADRATIC:
-	  *this->tmpVect = *this->currentFrame->position - *this->lastFrame->position;
-	  *this->tmpVect = *this->tmpVect * 1/3 * ldexpf(this->localTime, 3);
-	  break;
-	default:
-	  break;
-	}
-      */
-    }
-}
-
-
-/**
-   \brief Sets The kind of Animation between this keyframe and the next one
+      (this->*animFuncMov)(this->localTime);
+      (this->*animFuncRot)(this->localTime);
+    }
+}
+
+
+/*==Movement Section==========================================================*/
+
+/**
+   \brief Sets The kind of movment Animation between this keyframe and the next one
    \param animFunc The Type of Animation to set
 */
-void Animation3D::setAnimFunc(ANIM_FUNCTION animFunc)
-{
-  switch (animFunc)
+void Animation3D::setAnimFuncMov(ANIM_FUNCTION animFuncMov)
+{
+  switch (animFuncMov)
     {
+    case ANIM_CONSTANT:
+      this->animFuncMov = &Animation3D::mConstant;
+      break;
+    case ANIM_LINEAR:
+      this->animFuncMov = &Animation3D::mLinear;
+      this->object->setRelCoor(this->currentKeyFrame->position);
+      this->currentKeyFrame->lastPosition = Vector();
+      break;
+    case ANIM_SINE:
+      this->animFuncMov = &Animation3D::mSine;
+      this->object->setRelCoor(this->currentKeyFrame->position);
+      this->currentKeyFrame->lastPosition = Vector();
+      break;
+    case ANIM_COSINE:
+      this->animFuncMov = &Animation3D::mCosine;
+      this->object->setRelCoor(this->currentKeyFrame->position);
+      this->currentKeyFrame->lastPosition = Vector();
+      break;
+    case ANIM_EXP:
+      this->object->setRelCoor(this->currentKeyFrame->position);
+      this->animFuncMov = &Animation3D::mExp;
+      break;
+    case ANIM_NEG_EXP:
+      this->animFuncMov = &Animation3D::mNegExp;
+      this->object->setRelCoor(this->currentKeyFrame->position);
+      this->expFactorMov = -1.0 / this->currentKeyFrame->duration * logf(DELTA_X_3D);
+      this->currentKeyFrame->lastPosition = Vector();
+      break;
+    case ANIM_QUADRATIC:
+      this->object->setRelCoor(this->currentKeyFrame->position);
+      this->animFuncMov = &Animation3D::mQuadratic;
+      break;
+    case ANIM_RANDOM:
+      this->object->setRelCoor(this->currentKeyFrame->position);
+      this->animFuncMov = &Animation3D::mRandom;
+      break;
     default:
-    case ANIM_CONSTANT:
-      this->animFunc = &Animation3D::constant;
-      break;
-    case ANIM_LINEAR:
-      this->animFunc = &Animation3D::linear;
-      break;
-    case ANIM_SINE:
-      this->animFunc = &Animation3D::sine;
-      break;
-    case ANIM_COSINE:
-      this->animFunc = &Animation3D::cosine;
-      break;
-    case ANIM_EXP:
-      this->animFunc = &Animation3D::exp;
-      break;
-    case ANIM_NEG_EXP:
-      this->animFunc = &Animation3D::negExp;
-      break;
-    case ANIM_QUADRATIC:
-      this->animFunc = &Animation3D::quadratic;
-      break;
-    case ANIM_RANDOM:
-      this->animFunc = &Animation3D::random;
-      break;
-    }
-}
+      break;
+    }
+}
+
+
 
 /**
@@ -220,7 +220,7 @@
    \param timePassed The time passed since this Keyframe began
 */
-void Animation3D::constant(float timePassed) const
-{
-  this->object->setRelCoor(this->currentKeyFrame->position);
+void Animation3D::mConstant(float timePassed) const
+{
+  //this->object->setRelCoor(this->currentKeyFrame->position);
 
   /*
@@ -238,9 +238,9 @@
    \todo implement also do this for direction
 */
-void Animation3D::linear(float timePassed) const
-{
-  this->object->setRelCoor(this->currentKeyFrame->position +
-			  (this->nextKeyFrame->position - this->currentKeyFrame->position) * 
-			  (timePassed/this->currentKeyFrame->duration));
+void Animation3D::mLinear(float timePassed) const
+{
+  Vector v = (this->nextKeyFrame->position - this->currentKeyFrame->position) * (timePassed/this->currentKeyFrame->duration);
+  this->object->shiftCoor(v - this->currentKeyFrame->lastPosition);
+  this->currentKeyFrame->lastPosition = v;
 }
 
@@ -251,8 +251,16 @@
    \todo implement
 */
-void Animation3D::sine(float timePassed) const
-{
-  this->linear(timePassed);
-}
+void Animation3D::mSine(float timePassed) const
+{
+  Vector v;
+  if( timePassed  < this->currentKeyFrame->duration/2.0)
+    v = (this->nextKeyFrame->position - this->currentKeyFrame->position) * sin( M_PI * timePassed /this->currentKeyFrame->duration) / 2.0;
+  else
+    v = (this->nextKeyFrame->position - this->currentKeyFrame->position) * (2.0 + sin( M_PI * (- timePassed /this->currentKeyFrame->duration)) )/ 2.0;
+  
+  this->object->shiftCoor(v - this->currentKeyFrame->lastPosition);
+  this->currentKeyFrame->lastPosition = v;
+}
+
 
 /**
@@ -262,8 +270,20 @@
    \todo implement
 */
-void Animation3D::cosine(float timePassed) const
-{
-  this->linear(timePassed);
-}
+void Animation3D::mCosine(float timePassed) const
+{
+  Vector v;
+  v = (this->nextKeyFrame->position - this->currentKeyFrame->position) * (1.0 + cos( M_PI * timePassed / this->currentKeyFrame->duration))/2.0;
+  this->object->shiftCoor(v - this->currentKeyFrame->lastPosition);
+  this->currentKeyFrame->lastPosition = v;
+
+
+  /*
+  this->object->setRelCoor( this->nextKeyFrame->position -
+			    (this->nextKeyFrame->position - this->currentKeyFrame->position) *
+			    (1.0 + cos( M_PI * timePassed / this->currentKeyFrame->duration))/2.0);
+  */
+}
+
+
 
 /**
@@ -271,7 +291,8 @@
    \param timePassed The time passed since this Keyframe began
 */
-void Animation3D::exp(float timePassed) const
-{
-  this->linear(timePassed);
+void Animation3D::mExp(float timePassed) const
+{
+  PRINTF(0)("no exp animation3d defined\n");
+  this->mLinear(timePassed);
 }
 
@@ -279,11 +300,19 @@
    \brief a negative exponential interpolation between this keyframe and the next one
    \param timePassed The time passed since this Keyframe began
-
-   \todo implement
-*/
-void Animation3D::negExp(float timePassed) const
-{
-  this->linear(timePassed);
-}
+*/
+void Animation3D::mNegExp(float timePassed) const
+{
+  Vector v;
+  v = (this->nextKeyFrame->position - this->currentKeyFrame->position) * (1.0 - expf(- timePassed * expFactorMov));
+  this->object->shiftCoor(v - this->currentKeyFrame->lastPosition);
+  this->currentKeyFrame->lastPosition = v;
+
+  /*
+  this->object->setRelCoor( this->currentKeyFrame->position +
+			    (this->nextKeyFrame->position - this->currentKeyFrame->position) * 
+			    (1.0 - expf(- timePassed * expFactorMov)) );
+  */
+}
+
 
 /**
@@ -293,7 +322,8 @@
    \todo implement
 */
-void Animation3D::quadratic(float timePassed) const
-{
-  this->linear(timePassed);
+void Animation3D::mQuadratic(float timePassed) const
+{
+  PRINTF(0)("no quadratic animation3d defined\n");
+  this->mLinear(timePassed);
 }
 
@@ -302,9 +332,154 @@
    \param timePassed The time passed since this Keyframe began
 */
-void Animation3D::random(float timePassed) const
-{
+void Animation3D::mRandom(float timePassed) const
+{
+  /*
   this->object->setRelCoor(this->currentKeyFrame->position + 
 			   (this->nextKeyFrame->position - this->currentKeyFrame->position) * (float)rand()/(float)RAND_MAX);
   this->object->setRelDir(this->currentKeyFrame->direction +
 			  (this->nextKeyFrame->direction - this->currentKeyFrame->direction)* (float)rand()/(float)RAND_MAX);
-}
+  */
+}
+
+
+/*==Rotation Section==========================================================*/
+
+
+/**
+   \brief Sets The kind of rotation Animation between this keyframe and the next one
+   \param animFunc The Type of Animation to set
+*/
+void Animation3D::setAnimFuncRot(ANIM_FUNCTION animFuncRot)
+{
+  switch (animFuncRot)
+    {
+    default:
+    case ANIM_CONSTANT:
+      this->animFuncRot = &Animation3D::rConstant;
+      break;
+    case ANIM_LINEAR:
+      this->animFuncRot = &Animation3D::rLinear;
+      break;
+    case ANIM_SINE:
+      this->animFuncRot = &Animation3D::rSine;
+      break;
+    case ANIM_COSINE:
+      this->animFuncRot = &Animation3D::rCosine;
+      break;
+    case ANIM_EXP:
+      this->animFuncRot = &Animation3D::rExp;
+      break;
+    case ANIM_NEG_EXP:
+      this->animFuncRot = &Animation3D::rNegExp;
+      this->expFactorRot = -1.0 / this->currentKeyFrame->duration * logf(DELTA_X_3D);
+      break;
+    case ANIM_QUADRATIC:
+      this->animFuncRot = &Animation3D::rQuadratic;
+      break;
+    case ANIM_RANDOM:
+      this->animFuncRot = &Animation3D::rRandom;
+      break;
+
+    }
+}
+
+
+/**
+   \brief stays at the value of the currentKeyFrame
+   \param timePassed The time passed since this Keyframe began
+*/
+void Animation3D::rConstant(float timePassed) const
+{
+  this->object->setRelDir(this->currentKeyFrame->direction);
+}
+
+/**
+   \brief linear interpolation between this keyframe and the next one
+   \param timePassed The time passed since this Keyframe began
+
+   \todo implement also do this for direction
+*/
+void Animation3D::rLinear(float timePassed) const
+{
+  this->object->setRelDir(quatSlerp( this->nextKeyFrame->direction, 
+				     this->currentKeyFrame->direction, 
+				     timePassed/this->currentKeyFrame->duration) );
+}
+
+/**
+   \brief a Sinusodial Interpolation between this keyframe and the next one
+   \param timePassed The time passed since this Keyframe began
+
+   \todo implement
+*/
+void Animation3D::rSine(float timePassed) const
+{
+  float scale;
+  if( timePassed < this->currentKeyFrame->duration / 2.0)
+    scale = sin( M_PI * timePassed / this->currentKeyFrame->duration);
+  else
+    scale = 1.0 - sin( M_PI * timePassed / this->currentKeyFrame->duration);
+
+  this->object->setRelDir(quatSlerp( this->nextKeyFrame->direction, 
+				     this->currentKeyFrame->direction, 
+				     scale) );
+}
+
+
+/**
+   \brief a cosine interpolation between this keyframe and the next one
+   \param timePassed The time passed since this Keyframe began
+
+   \todo implement
+*/
+void Animation3D::rCosine(float timePassed) const
+{
+  float scale = cos(M_PI * timePassed / this->currentKeyFrame->duration);
+  this->object->setRelDir(quatSlerp( this->nextKeyFrame->direction, 
+				     this->currentKeyFrame->direction, 
+				     scale) );
+}
+
+
+
+/**
+   \brief an exponential interpolation between this keyframe and the next one
+   \param timePassed The time passed since this Keyframe began
+*/
+void Animation3D::rExp(float timePassed) const
+{
+  PRINTF(0)("exp rotation function not implemented\n");
+}
+
+/**
+   \brief a negative exponential interpolation between this keyframe and the next one
+   \param timePassed The time passed since this Keyframe began
+*/
+void Animation3D::rNegExp(float timePassed) const
+{
+  float scale = (1.0 - expf(- timePassed * expFactorRot));
+  this->object->setRelDir(quatSlerp( this->nextKeyFrame->direction, 
+				     this->currentKeyFrame->direction, 
+				     scale) );
+}
+
+
+/**
+   \brief a quadratic interpolation between this keyframe and the next one
+   \param timePassed The time passed since this Keyframe began
+
+   \todo implement
+*/
+void Animation3D::rQuadratic(float timePassed) const
+{
+  PRINTF(0)("quadratic rotation alg not implemented\n");
+}
+
+/**
+   \brief some random animation (fluctuating)
+   \param timePassed The time passed since this Keyframe began
+*/
+void Animation3D::rRandom(float timePassed) const
+{
+  PRINTF(0)("random rotation alg not implemented\n");
+}
Index: orxonox/branches/openAL/src/util/animation/animation3d.h
===================================================================
--- orxonox/branches/openAL/src/util/animation/animation3d.h	(revision 3921)
+++ orxonox/branches/openAL/src/util/animation/animation3d.h	(revision 4194)
@@ -9,4 +9,6 @@
 class PNode;
 
+#define DELTA_X_3D 0.05  //!< the percentag of the distance that doesnt have to be done by neg_exp (asymptotical) ~ maschinendelta
+
 //! KeyFrame3D Struct
 /**
@@ -16,6 +18,8 @@
   float duration;                   //!< The duration of this KeyFrame
   Vector position;                  //!< The position of this KeyFrame
+  Vector lastPosition;
   Quaternion direction;             //!< The direction of this KeyFrame
-  ANIM_FUNCTION animFunc;           //!< with whitch function to iterate to the next KeyFrame3D
+  ANIM_FUNCTION animFuncMov;        //!< with whitch function to iterate movement to the next KeyFrame3D
+  ANIM_FUNCTION animFuncRot;        //!< with whitch function to iterate rotation to the next KeyFrame3D
 };
 
@@ -32,22 +36,32 @@
   virtual void rewind(void);
 
-  void addKeyFrame(Vector position, Quaternion direction, float time, ANIM_FUNCTION animFunc = ANIM_LINEAR);
+  void addKeyFrame(Vector position, Quaternion direction, float time, ANIM_FUNCTION animFuncMov = ANIM_DEFAULT_FUNCTION, ANIM_FUNCTION animFuncRot = ANIM_NULL);
   //  void addKeyFrame(KeyFrame3D* frame);
 
   virtual void tick(float dt);
-
+ 
  private:
   // animation functions
-  void setAnimFunc(ANIM_FUNCTION animFunc);
-  void constant(float timePassed) const;
-  void linear(float timePassed) const;
-  void sine(float timePassed) const;
-  void cosine(float timePassed) const;
-  void exp(float timePassed) const;
-  void negExp(float timePassed) const;
-  void quadratic(float timePassed) const;
-  void random(float timePassed) const;
+  void setAnimFuncMov(ANIM_FUNCTION animFunc);
+  void setAnimFuncRot(ANIM_FUNCTION animFunc);
+  void mConstant(float timePassed) const;
+  void mLinear(float timePassed) const;
+  void mSine(float timePassed) const;
+  void mCosine(float timePassed) const;
+  void mExp(float timePassed) const;
+  void mNegExp(float timePassed) const;
+  void mQuadratic(float timePassed) const;
+  void mRandom(float timePassed) const;
+  void rConstant(float timePassed) const;
+  void rLinear(float timePassed) const;
+  void rSine(float timePassed) const;
+  void rCosine(float timePassed) const;
+  void rExp(float timePassed) const;
+  void rNegExp(float timePassed) const;
+  void rQuadratic(float timePassed) const;
+  void rRandom(float timePassed) const;
   //  ANIM_FUNCTION animFunc;
-  void (Animation3D::*animFunc)(float) const;      //!< A Function for the AnimationType
+  void (Animation3D::*animFuncMov)(float) const;      //!< A Function for the AnimationType
+  void (Animation3D::*animFuncRot)(float) const;      //!< A Function for the AnimationType
 
   KeyFrame3D* currentKeyFrame;                     //!< The current KeyFrame
@@ -60,3 +74,5 @@
   Vector tmpVect;        //!< what for??
   float deltaT;          //!< ??
+  float expFactorMov;
+  float expFactorRot;
 };
Index: orxonox/branches/openAL/src/util/animation/t_animation.h
===================================================================
--- orxonox/branches/openAL/src/util/animation/t_animation.h	(revision 3921)
+++ orxonox/branches/openAL/src/util/animation/t_animation.h	(revision 4194)
@@ -43,5 +43,5 @@
   void setFuncToAnim(T* object, void (T::*funcToAnim)(float));
 
-  void addKeyFrame(float value, float duration, ANIM_FUNCTION animFunc = ANIM_LINEAR);
+  void addKeyFrame(float value, float duration, ANIM_FUNCTION animFunc = ANIM_DEFAULT_FUNCTION);
 
   virtual void rewind();
@@ -154,4 +154,6 @@
   if (duration <= 0.0)
     duration = 1.0;
+  if (animFunc == ANIM_NULL)
+    animFunc = ANIM_DEFAULT_FUNCTION;
 
   KeyFrameF* tmpKeyFrame;
@@ -190,15 +192,22 @@
       if (localTime >= this->currentKeyFrame->duration)
 	{
-	  // switching to the next Key-Frame
-	  this->localTime -= this->currentKeyFrame->duration;
-
-	  this->currentKeyFrame = this->nextKeyFrame;
-	  // checking, if we should still Play the animation
-	  if (this->currentKeyFrame == this->keyFrameList->lastElement())
-	    this->handleInfinity();
-	  this->nextKeyFrame = this->keyFrameList->nextElement(this->currentKeyFrame);
-
-	  printf("%p from:%f to:%f\n", this->currentKeyFrame,this->currentKeyFrame->value, this->nextKeyFrame->value);
-	  this->setAnimFunc(this->currentKeyFrame->animFunc);	  
+	  if (likely(this->keyFramesToPlay != 0))
+	    {
+	      if (unlikely(this->keyFramesToPlay > 0))
+		--this->keyFramesToPlay;
+	      // switching to the next Key-Frame
+	      this->localTime -= this->currentKeyFrame->duration;
+	      
+	      this->currentKeyFrame = this->nextKeyFrame;
+	      // checking, if we should still Play the animation
+	      if (this->currentKeyFrame == this->keyFrameList->lastElement())
+		this->handleInfinity();
+	      this->nextKeyFrame = this->keyFrameList->nextElement(this->currentKeyFrame);
+	      
+	      printf("%p from:%f to:%f\n", this->currentKeyFrame,this->currentKeyFrame->value, this->nextKeyFrame->value);
+	      this->setAnimFunc(this->currentKeyFrame->animFunc);	  
+	    }
+	  else
+	    this->pause();
 	}
       
@@ -235,5 +244,4 @@
       {
 	this->animFunc = &tAnimation<T>::negExp;
-	float d = fabs(this->currentKeyFrame->value - this->nextKeyFrame->value);
 	expFactor =  - 1.0 / this->currentKeyFrame->duration * logf(DELTA_X);
 	break;
Index: orxonox/branches/openAL/src/util/resource_manager.cc
===================================================================
--- orxonox/branches/openAL/src/util/resource_manager.cc	(revision 3921)
+++ orxonox/branches/openAL/src/util/resource_manager.cc	(revision 4194)
@@ -92,9 +92,31 @@
       this->dataDir = new char[strlen(dataDir)+1];
       strcpy(this->dataDir, dataDir);
+      return true;
     }
   else
     {
       PRINTF(1)("%s is not a Directory, and can not be the Data Directory, leaving as %s \n", dataDir, this->dataDir);
-    }
+      return false;
+    }
+}
+
+/**
+   \brief checks for the DataDirectory, by looking if 
+   \param fileInside is inisde??
+*/
+bool ResourceManager::checkDataDir(const char* fileInside)
+{
+  bool retVal;
+  if (!isDir(this->dataDir))
+    {
+      PRINTF(1)("%s is not a directory\n", this->dataDir);
+      return false;
+    }
+  
+  char* testFile = new char[strlen(this->dataDir)+strlen(fileInside)+1];
+  sprintf(testFile, "%s%s", this->dataDir, fileInside);
+  retVal = isFile(testFile);
+  delete testFile;
+  return retVal;
 }
 
@@ -180,5 +202,5 @@
   // searching if the resource was loaded before.
   Resource* tmpResource = this->locateResourceByInfo(fileName, type, param1, param2,param3);
-  if (tmpResource) // if the resource was not loaded before.
+  if (tmpResource) // if the resource was loaded before.
     {
       PRINTF(4)("not loading cached resource %s\n", tmpResource->name);
@@ -199,7 +221,6 @@
 
       // creating the full name. (directoryName + FileName)
-      char* fullName = new char[strlen(dataDir)+strlen(fileName)+1];
-      sprintf(fullName, "%s%s", this->dataDir, fileName);
-      
+      char* fullName = new char[strlen(this->getDataDir())+strlen(fileName)+1];
+      sprintf(fullName, "%s%s", this->getDataDir(), fileName);
       // Checking for the type of resource \see ResourceType
       switch(type)
@@ -211,5 +232,5 @@
 	    tmpResource->modelSize = 1.0;
 
-	  if(isFile(fullName))
+	  if(ResourceManager::isFile(fullName))
 	    tmpResource->pointer = new OBJModel(fullName, tmpResource->modelSize);
 	  else
@@ -508,19 +529,23 @@
     }
 
-  stat(tmpDirName, &status);
-  if (status.st_mode & (S_IFDIR
+  if(!stat(tmpDirName, &status))
+    {
+      if (status.st_mode & (S_IFDIR
 #ifndef __WIN32__
-			| S_IFLNK
+			    | S_IFLNK
 #endif
-			))
-    {
-      delete tmpDirName;
-      return true;
-    }
-  else
-    {
-      delete tmpDirName;
-      return false;
-    }
+			    ))
+	{
+	  delete tmpDirName;
+	  return true;
+	}
+      else
+	{
+	  delete tmpDirName;
+	  return false;
+	}
+    }
+  else
+    return false;
 }
 
@@ -532,15 +557,106 @@
 bool ResourceManager::isFile(const char* fileName)
 {
+  char* tmpFileName = ResourceManager::homeDirCheck(fileName);
+  // actually checks the File
   struct stat status;
-  stat(fileName, &status);
-  if (status.st_mode & (S_IFREG 
+  if (!stat(tmpFileName, &status))
+    {
+      if (status.st_mode & (S_IFREG 
 #ifndef __WIN32__
-			| S_IFLNK
+			    | S_IFLNK
 #endif
-			))
-    return true;
-  else
-    return false;
-}
+			    ))
+	{
+	  delete tmpFileName;
+	  return true;
+	}
+      else
+	{
+	  delete tmpFileName;
+	  return false;
+	}
+    }
+  else 
+    {
+      delete tmpFileName;
+      return false;
+    }
+}
+
+/**
+   \brief touches a File on the disk (thereby creating it)
+   \param fileName The file to touch
+*/
+bool ResourceManager::touchFile(const char* fileName)
+{
+  char* tmpName = ResourceManager::homeDirCheck(fileName);
+
+  FILE* stream;
+  if( (stream = fopen (tmpName, "w")) == NULL)
+    {
+      PRINTF(1)("could not open %s fro writing\n", fileName);
+      return false;
+    }
+  fclose(stream);
+    
+  delete tmpName; 
+}
+
+/**
+   \brief deletes a File from disk
+   \param fileName the File to delete
+*/
+bool ResourceManager::deleteFile(const char* fileName)
+{
+  char* tmpName = ResourceManager::homeDirCheck(fileName);
+  unlink(tmpName);
+  delete tmpName;
+}
+
+/** 
+    \param fileName the Name of the file to check
+    \returns The name of the file, including the HomeDir
+    IMPORTANT: this has to be deleted from the outside
+*/
+char* ResourceManager::homeDirCheck(const char* name)
+{
+  char* retName;
+  if (!strncmp(name, "~/", 2))
+    {
+      char tmpFileName[500];
+#ifdef __WIN32__
+      strcpy(tmpFileName, getenv("USERPROFILE"));
+#else
+      strcpy(tmpFileName, getenv("HOME"));
+#endif
+      retName = new char[strlen(tmpFileName)+strlen(name)];
+      sprintf(retName, "%s%s", tmpFileName, name+1);
+    }
+  else
+    {
+      retName = new char[strlen(name)+1];
+      strcpy(retName, name);
+    }
+  return retName;
+}
+
+/** 
+    \param fileName the Name of the File to check
+    \returns The full name of the file, including the DataDir, and NULL if the file does not exist
+    IMPORTANT: this has to be deleted from the outside
+*/
+char* ResourceManager::getFullName(const char* fileName)
+{
+  char* retName = new char[strlen(ResourceManager::getInstance()->getDataDir()) + strlen(fileName)+1];
+  sprintf(retName, "%s%s", ResourceManager::getInstance()->getDataDir(), fileName);
+  if (ResourceManager::isFile(retName))
+    return retName;
+  else
+    {
+      delete retName;
+      return NULL;
+    }
+}
+
 
 /**
Index: orxonox/branches/openAL/src/util/resource_manager.h
===================================================================
--- orxonox/branches/openAL/src/util/resource_manager.h	(revision 3921)
+++ orxonox/branches/openAL/src/util/resource_manager.h	(revision 4194)
@@ -18,5 +18,11 @@
 
 //! An eumerator for different fileTypes the resourceManager supports \todo WAV, MP3, OGG support
-enum ResourceType {OBJ, PRIM, WAV, MP3, OGG, TTF, IMAGE};
+enum ResourceType {OBJ,
+		   PRIM,
+		   WAV,
+		   MP3,
+		   OGG,
+		   TTF,
+		   IMAGE};
 //! An enumerator for different UNLOAD-types. 
 /**
@@ -26,5 +32,8 @@
    RP_GAME: will be unloaded at the end of the whole Game (when closing orxonox)
 */
-enum ResourcePriority {RP_NO = 0, RP_LEVEL = 1, RP_CAMPAIGN = 2, RP_GAME = 3};
+enum ResourcePriority {RP_NO = 0,
+		       RP_LEVEL = 1,
+		       RP_CAMPAIGN = 2,
+		       RP_GAME = 3};
 
 //! A Struct that keeps track about A resource its name its Type, and so on
@@ -65,4 +74,8 @@
 
   bool setDataDir(const char* dataDir);
+  /** \returns the Name of the data directory */
+  inline const char* getDataDir(void) const {return this->dataDir;}
+
+  bool checkDataDir(const char* fileInside);
   bool addImageDir(char* imageDir);
   void* load(const char* fileName, ResourcePriority prio = RP_NO,
@@ -73,5 +86,14 @@
   bool unload(Resource* resource, ResourcePriority = RP_NO);
   bool unloadAllByPriority(ResourcePriority prio);
+
   void debug(void);
+
+  // utility functions of this class
+  static bool isDir(const char* directory);
+  static bool isFile(const char* fileName);
+  static bool touchFile(const char* fileName);
+  static bool deleteFile(const char* fileName);
+  static char* homeDirCheck(const char* fileName);
+  static char* getFullName(const char* fileName);
 
  private:
@@ -87,7 +109,4 @@
   Resource* locateResourceByPointer(const void* pointer);
   
-  bool isDir(const char* directory);
-  bool isFile(const char* directory);
-
 };
 
Index: orxonox/branches/openAL/src/world_entities/camera.cc
===================================================================
--- orxonox/branches/openAL/src/world_entities/camera.cc	(revision 3921)
+++ orxonox/branches/openAL/src/world_entities/camera.cc	(revision 4194)
@@ -139,8 +139,8 @@
   if (tmpFovy > .001)
     this->fovy += (this->toFovy - this->fovy) * dt;
-  Vector tmpPos = (this->toRelCoor - *this->getRelCoor()) * dt;
+  Vector tmpPos = (this->toRelCoor - this->getRelCoor()) * dt;
   if (tmpPos.len() >= .001)
     {
-      tmpPos = tmpPos + *this->getRelCoor();
+      tmpPos = tmpPos + this->getRelCoor();
       this->setRelCoor(tmpPos);
     }
Index: orxonox/branches/openAL/src/world_entities/environment.cc
===================================================================
--- orxonox/branches/openAL/src/world_entities/environment.cc	(revision 3921)
+++ orxonox/branches/openAL/src/world_entities/environment.cc	(revision 4194)
@@ -30,5 +30,4 @@
 {
   this->model = (Model*) ResourceManager::getInstance()->load("cube", RP_LEVEL);
-  //  this->model = new OBJModel("../data/models/fighter.obj");
 }
 
@@ -50,4 +49,6 @@
 void Environment::draw () 
 {
+  //this->getRelCoor().debug();
+
   glMatrixMode(GL_MODELVIEW);
   glPushMatrix();
Index: orxonox/branches/openAL/src/world_entities/player.cc
===================================================================
--- orxonox/branches/openAL/src/world_entities/player.cc	(revision 3921)
+++ orxonox/branches/openAL/src/world_entities/player.cc	(revision 4194)
@@ -1,4 +1,2 @@
-
-
 /* 
    orxonox - the future of 3D-vertical-scrollers
@@ -31,4 +29,6 @@
 
 using namespace std;
+
+CREATE_FACTORY(Player);
 
 /**
@@ -52,9 +52,9 @@
   //weapons:
   this->weaponMan = new WeaponManager();
-  Weapon* wpRight = new TestGun(this,Vector(-2.6, 0.1, 3.0), Quaternion(), 0);
+  Weapon* wpRight = new TestGun(this, Vector(-2.6, 0.1, 3.0), Quaternion(), 0);
   Weapon* wpLeft = new TestGun(this, Vector(-2.6, 0.1, -3.0), Quaternion(), 1);
   
-  this->weaponMan->addWeapon(wpRight, W_CONFIG0);
-  this->weaponMan->addWeapon(wpLeft, W_CONFIG1);
+  this->weaponMan->addWeapon(wpRight, W_CONFIG0, W_SLOT0);
+  this->weaponMan->addWeapon(wpLeft, W_CONFIG1, W_SLOT1);
   this->weaponMan->addWeapon(wpRight, W_CONFIG2);
   this->weaponMan->addWeapon(wpLeft, W_CONFIG2);
@@ -74,4 +74,35 @@
 }
 
+/**
+   \brief creates a new Player from Xml Data
+   \param root the xml element containing player data
+   
+   \todo add more parameters to load
+*/
+Player::Player(TiXmlElement* root) : WorldEntity(root)
+{
+  this->weapons = new tList<Weapon>();
+  this->activeWeapon = NULL;
+  /*
+    this is the debug player - actualy we would have to make a new
+     class derivated from Player for each player. for now, we just use
+     the player.cc for debug also
+  */
+  travelSpeed = 15.0;
+  velocity = new Vector();
+  bUp = bDown = bLeft = bRight = bAscend = bDescend = false;
+  bFire = false;
+  this->bWeaponChange = false;
+  acceleration = 10.0;
+  //weapons:
+  this->weaponMan = new WeaponManager();
+  Weapon* wpRight = new TestGun(this, Vector(-2.6, 0.1, 3.0), Quaternion(), 0);
+  Weapon* wpLeft = new TestGun(this, Vector(-2.6, 0.1, -3.0), Quaternion(), 1);
+  
+  this->weaponMan->addWeapon(wpRight, W_CONFIG0, W_SLOT0);
+  this->weaponMan->addWeapon(wpLeft, W_CONFIG1, W_SLOT1);
+  this->weaponMan->addWeapon(wpRight, W_CONFIG2);
+  this->weaponMan->addWeapon(wpLeft, W_CONFIG2);
+}
 
 /**
@@ -188,11 +219,11 @@
   //orthDirection = orthDirection.cross (direction);
 
-  if( this->bUp && this->getRelCoor()->x < 20)
+  if( this->bUp && this->getRelCoor().x < 20)
     accel = accel+(direction*acceleration);
-  if( this->bDown && this->getRelCoor()->x > -5)
+  if( this->bDown && this->getRelCoor().x > -5)
     accel = accel-(direction*acceleration);
-  if( this->bLeft &&  TrackManager::getInstance()->getWidth() > -this->getRelCoor()->z*2)
+  if( this->bLeft &&  TrackManager::getInstance()->getWidth() > -this->getRelCoor().z*2)
     accel = accel - (orthDirection*acceleration); 
-  if( this->bRight &&  TrackManager::getInstance()->getWidth() > this->getRelCoor()->z*2)
+  if( this->bRight &&  TrackManager::getInstance()->getWidth() > this->getRelCoor().z*2)
     accel = accel + (orthDirection*acceleration);
   if( this->bAscend )
@@ -230,9 +261,9 @@
 {
   PRINTF(3)("recieved command [%s]\n", cmd->cmd);
-  if( !strcmp( cmd->cmd, "up")) this->bUp = !cmd->bUp;
-  if( !strcmp( cmd->cmd, "down")) this->bDown = !cmd->bUp;
-  if( !strcmp( cmd->cmd, "left")) this->bLeft = !cmd->bUp;
-  if( !strcmp( cmd->cmd, "right")) this->bRight = !cmd->bUp;
-  if( !strcmp( cmd->cmd, "fire")) this->bFire = !cmd->bUp;
-  if( !strcmp( cmd->cmd, "mode")) if(cmd->bUp) this->bWeaponChange = !this->bWeaponChange;
-}
+  if( !strcmp( cmd->cmd, CONFIG_NAME_PLAYER_UP)) this->bUp = !cmd->bUp;
+  if( !strcmp( cmd->cmd, CONFIG_NAME_PLAYER_DOWN)) this->bDown = !cmd->bUp;
+  if( !strcmp( cmd->cmd, CONFIG_NAME_PLAYER_LEFT)) this->bLeft = !cmd->bUp;
+  if( !strcmp( cmd->cmd, CONFIG_NAME_PLAYER_RIGHT)) this->bRight = !cmd->bUp;
+  if( !strcmp( cmd->cmd, CONFIG_NAME_PLAYER_FIRE)) this->bFire = !cmd->bUp;
+  if( !strcmp( cmd->cmd, CONFIG_NAME_PLAYER_NEXT_WEAPON)) if(cmd->bUp) this->bWeaponChange = !this->bWeaponChange;
+}
Index: orxonox/branches/openAL/src/world_entities/player.h
===================================================================
--- orxonox/branches/openAL/src/world_entities/player.h	(revision 3921)
+++ orxonox/branches/openAL/src/world_entities/player.h	(revision 4194)
@@ -22,4 +22,5 @@
  public:
   Player();
+  Player(TiXmlElement* root);
   virtual ~Player();
 
Index: orxonox/branches/openAL/src/world_entities/skybox.cc
===================================================================
--- orxonox/branches/openAL/src/world_entities/skybox.cc	(revision 3921)
+++ orxonox/branches/openAL/src/world_entities/skybox.cc	(revision 4194)
@@ -28,5 +28,7 @@
 
 #include "skybox.h"
+
 #include "stdincl.h"
+#include "factory.h"
 
 #include "material.h"
@@ -36,4 +38,5 @@
 //#include "world_entity.h"
 
+CREATE_FACTORY(SkyBox);
 
 using namespace std;
@@ -45,7 +48,35 @@
 SkyBox::SkyBox(char* fileName)
 {
+  this->preInit();
+  this->postInit();
+}
+
+SkyBox::SkyBox(TiXmlElement* root) : WorldEntity(root)
+{
+  this->preInit();
+
+  const char* string;
+
+  // Model Loading	
+  string = grabParameter( root, "materialset");
+  if( string != NULL)
+    this->setTexture(string, "jpg");
+  else
+    {
+      PRINTF(0)("SkyBox is missing a proper 'MaterialSet'\n");
+    }
+  if( this->skyModel == NULL)
+    {
+      PRINTF(0)("SkyBox model '%s' could not be loaded\n", string);
+    }
+  this->postInit();
+}
+
+void SkyBox::preInit(void)
+{
   this->setClassName("SkyBox");
+  this->skyModel = NULL;
   this->material = new Material*[6];
-  for (int i = 0; i <6; i++) 
+  for (int i = 0; i < 6; i++) 
     {
       this->material[i] = new Material();
@@ -56,6 +87,10 @@
     }
   this->setMode(PNODE_MOVEMENT);
-
+}
+
+void SkyBox::postInit(void)
+{
   this->setSize(1900.0);
+  this->rebuild();
 }
 
@@ -66,6 +101,5 @@
 SkyBox::~SkyBox()
 {
-  PRINTF(5)("Deleting the SkyBox\n");
-  
+  PRINTF(5)("Deleting SkyBox\n");
   for (int i = 0; i < 6; i++)
     delete this->material[i];
@@ -84,10 +118,10 @@
 void SkyBox::setTexture(const char* name, const char* extension)
 {
-  char* top    = new char[strlen(name)+strlen(extension)+ 6];
-  char* bottom = new char[strlen(name)+strlen(extension)+ 9];
-  char* left   = new char[strlen(name)+strlen(extension)+ 7];
-  char* right  = new char[strlen(name)+strlen(extension)+ 8];
-  char* front  = new char[strlen(name)+strlen(extension)+ 8];
-  char* back   = new char[strlen(name)+strlen(extension)+ 7];
+  char* top    = new char[strlen(name)+strlen(extension)+ 10];
+  char* bottom = new char[strlen(name)+strlen(extension)+ 10];
+  char* left   = new char[strlen(name)+strlen(extension)+ 10];
+  char* right  = new char[strlen(name)+strlen(extension)+ 10];
+  char* front  = new char[strlen(name)+strlen(extension)+ 10];
+  char* back   = new char[strlen(name)+strlen(extension)+ 10];
 
   sprintf(top, "%s_top.%s", name, extension);
@@ -100,4 +134,5 @@
   this->setTextures(top, bottom, left, right, front, back);
 
+  // deleted alocated memory of this function
   delete []top;
   delete []bottom;
@@ -125,6 +160,4 @@
   this->material[4]->setDiffuseMap(front);
   this->material[5]->setDiffuseMap(back);
-
-  this->rebuild();
 }
 
@@ -135,6 +168,4 @@
 {
   this->size = size;
-
-  this->rebuild();
 }
 
@@ -149,5 +180,5 @@
   glTranslatef(r.x, r.y, r.z);
 
-  this->model->draw();
+  this->skyModel->draw();
 
   glPopMatrix();
@@ -162,42 +193,42 @@
 void SkyBox::rebuild()
 {
-  if (this->model)
-    delete model;
-  model = new Model();
-
-  model->addVertex (-0.5*size, -0.5*size, 0.5*size);  
-  model->addVertex (0.5*size, -0.5*size, 0.5*size);
-  model->addVertex (-0.5*size, 0.5*size, 0.5*size);
-  model->addVertex (0.5*size, 0.5*size, 0.5*size);
-  model->addVertex (-0.5*size, 0.5*size, -0.5*size);
-  model->addVertex (0.5*size, 0.5*size, -0.5*size);
-  model->addVertex (-0.5*size, -0.5*size, -0.5*size);
-  model->addVertex (0.5*size, -0.5*size, -0.5*size);
-
-  model->addVertexTexture (0.0, 0.0);
-  model->addVertexTexture (1.0, 0.0);
-  model->addVertexTexture (1.0, 1.0);
-  model->addVertexTexture (0.0, 1.0);
-
-  model->addVertexNormal (0.0, 0.0, 1.0);
-  model->addVertexNormal (0.0, 1.0, 0.0);
-  model->addVertexNormal (0.0, 0.0, -1.0);
-  model->addVertexNormal (0.0, -1.0, 0.0);
-  model->addVertexNormal (1.0, 0.0, 0.0);
-  model->addVertexNormal (-1.0, 0.0, 0.0);
-
-  model->setMaterial(material[0]);
-  model->addFace (4, VERTEX_TEXCOORD_NORMAL, 3,2,4, 4,3,4, 6,4,4, 5,1,4); // top
-  model->setMaterial(material[1]);
-  model->addFace (4, VERTEX_TEXCOORD_NORMAL, 7,4,2, 8,1,2, 2,2,2, 1,3,2); // bottom
-  model->setMaterial(material[2]);
-  model->addFace (4, VERTEX_TEXCOORD_NORMAL, 1,1,3, 2,2,3, 4,3,3, 3,4,3); // left
-  model->setMaterial(material[3]);
-  model->addFace (4, VERTEX_TEXCOORD_NORMAL, 5,3,1, 6,4,1, 8,1,1, 7,2,1); // right
-  model->setMaterial(material[4]);
-  model->addFace (4, VERTEX_TEXCOORD_NORMAL, 2,1,6, 8,2,6, 6,3,6, 4,4,6); // front
-  model->setMaterial(material[5]);
-  model->addFace (4, VERTEX_TEXCOORD_NORMAL, 7,1,5, 1,2,5, 3,3,5, 5,4,5); // back
+  if (this->skyModel)
+    delete skyModel;
+  skyModel = new Model();
+
+  this->skyModel->addVertex (-0.5*size, -0.5*size, 0.5*size);  
+  this->skyModel->addVertex (0.5*size, -0.5*size, 0.5*size);
+  this->skyModel->addVertex (-0.5*size, 0.5*size, 0.5*size);
+  this->skyModel->addVertex (0.5*size, 0.5*size, 0.5*size);
+  this->skyModel->addVertex (-0.5*size, 0.5*size, -0.5*size);
+  this->skyModel->addVertex (0.5*size, 0.5*size, -0.5*size);
+  this->skyModel->addVertex (-0.5*size, -0.5*size, -0.5*size);
+  this->skyModel->addVertex (0.5*size, -0.5*size, -0.5*size);
+
+  this->skyModel->addVertexTexture (0.0, 0.0);
+  this->skyModel->addVertexTexture (1.0, 0.0);
+  this->skyModel->addVertexTexture (1.0, 1.0);
+  this->skyModel->addVertexTexture (0.0, 1.0);
+
+  this->skyModel->addVertexNormal (0.0, 0.0, 1.0);
+  this->skyModel->addVertexNormal (0.0, 1.0, 0.0);
+  this->skyModel->addVertexNormal (0.0, 0.0, -1.0);
+  this->skyModel->addVertexNormal (0.0, -1.0, 0.0);
+  this->skyModel->addVertexNormal (1.0, 0.0, 0.0);
+  this->skyModel->addVertexNormal (-1.0, 0.0, 0.0);
+
+  this->skyModel->setMaterial(material[0]);
+  this->skyModel->addFace (4, VERTEX_TEXCOORD_NORMAL, 2,1,3, 3,2,3, 5,3,3, 4,0,3); // top
+  this->skyModel->setMaterial(material[1]);
+  this->skyModel->addFace (4, VERTEX_TEXCOORD_NORMAL, 6,3,1, 7,0,1, 1,1,1, 0,2,1); // bottom
+  this->skyModel->setMaterial(material[2]);
+  this->skyModel->addFace (4, VERTEX_TEXCOORD_NORMAL, 0,0,2, 1,1,2, 3,2,2, 2,3,2); // left
+  this->skyModel->setMaterial(material[3]);
+  this->skyModel->addFace (4, VERTEX_TEXCOORD_NORMAL, 4,2,0, 5,3,0, 7,0,0, 6,1,0); // right
+  this->skyModel->setMaterial(material[4]);
+  this->skyModel->addFace (4, VERTEX_TEXCOORD_NORMAL, 1,0,5, 7,1,5, 5,2,5, 3,3,6); // front
+  this->skyModel->setMaterial(material[5]);
+  this->skyModel->addFace (4, VERTEX_TEXCOORD_NORMAL, 6,0,4, 0,1,4, 2,2,4, 4,3,4); // back
   
-  model->finalize();
-}
+  this->skyModel->finalize();
+}
Index: orxonox/branches/openAL/src/world_entities/skybox.h
===================================================================
--- orxonox/branches/openAL/src/world_entities/skybox.h	(revision 3921)
+++ orxonox/branches/openAL/src/world_entities/skybox.h	(revision 4194)
@@ -22,5 +22,11 @@
  public:
   SkyBox(char* fileName = NULL);
+  SkyBox(TiXmlElement* root);
+
   virtual ~SkyBox();
+
+  void preInit(void);
+  void postInit(void);
+
 
   void setSize(float size);
@@ -33,4 +39,5 @@
   void rebuild();
 
+  Model* skyModel;        //!< A Model for the Sky. This must not be the same as the Model from WorldEntity, because it is not alocated through the ResourceManager.
   Material **material;    //!< Materials for the SkyBox. sorted by number (0-5) top, bottom, left, right, front, back
   float size;             //!< Size of the SkyBox. This should match the frustum maximum range.
Index: orxonox/branches/openAL/src/world_entities/skysphere.cc
===================================================================
--- orxonox/branches/openAL/src/world_entities/skysphere.cc	(revision 3921)
+++ orxonox/branches/openAL/src/world_entities/skysphere.cc	(revision 4194)
@@ -44,5 +44,5 @@
 {
   if (fileName == NULL)
-    this->initialize("../data/pictures/sky-replace.jpg");
+    this->initialize("pictures/sky-replace.jpg");
   else
     this->initialize(fileName);
Index: orxonox/branches/openAL/src/world_entities/terrain.cc
===================================================================
--- orxonox/branches/openAL/src/world_entities/terrain.cc	(revision 3921)
+++ orxonox/branches/openAL/src/world_entities/terrain.cc	(revision 4194)
@@ -77,7 +77,7 @@
 void Terrain::init(void)
 {
-   this->setClassName ("Terrain");
-
-   this->objectList = 0;
+  this->setClassName ("Terrain");
+  
+  this->objectList = 0;
 }
 
@@ -98,9 +98,8 @@
   glMultMatrixf((float*)matrix);
 
-  if (objectList)
-    glCallList(objectList);
-  else if (model)
-    model->draw();
-  //  this->model->draw();
+  if (this->objectList)
+    glCallList(this->objectList);
+  else if (this->model)
+    this->model->draw();
   glPopMatrix();
 }
Index: orxonox/branches/openAL/src/world_entities/test_gun.cc
===================================================================
--- orxonox/branches/openAL/src/world_entities/test_gun.cc	(revision 3921)
+++ orxonox/branches/openAL/src/world_entities/test_gun.cc	(revision 4194)
@@ -49,15 +49,25 @@
   this->objectComponent1 = new PNode();
   this->animation1 = new Animation3D(this->objectComponent1);
-  parent->addChild(this->objectComponent1, PNODE_ALL);
+  this->animation2 = new Animation3D(this);
+  this->animation3 = new Animation3D(this);
+  //parent->addChild(this->objectComponent1, PNODE_ALL);
+  this->addChild(this->objectComponent1, PNODE_ALL);
 
   this->animation1->setInfinity(ANIM_INF_CONSTANT);
-  // ANIM_LINEAR was ANIM_NEG_EXP
+  this->animation2->setInfinity(ANIM_INF_CONSTANT);
+  this->animation3->setInfinity(ANIM_INF_CONSTANT);
   if( this->leftRight == W_LEFT)
     {
       this->projectileOffset = Vector(1.0, 0.0, -0.35);
 
-      this->animation1->addKeyFrame(Vector(-2.6, 0.1, 3.0), Quaternion(), 0.1, ANIM_LINEAR); 
-      this->animation1->addKeyFrame(Vector(-3.0, 0.1, 3.0), Quaternion(), 0.5, ANIM_LINEAR);
-      this->animation1->addKeyFrame(Vector(-2.6, 0.1, 3.0), Quaternion(), 0.1, ANIM_LINEAR);
+      this->animation1->addKeyFrame(Vector(0, 0, 0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT); 
+      this->animation1->addKeyFrame(Vector(-0.4, 0, 0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT);
+      this->animation1->addKeyFrame(Vector(0, 0, 0), Quaternion(), 0.0, ANIM_LINEAR, ANIM_CONSTANT);
+
+      this->animation2->addKeyFrame(Vector(-2.6, 0.1, 2.0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT); 
+      this->animation2->addKeyFrame(Vector(-2.6, 0.1, 3.0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT);
+
+      this->animation3->addKeyFrame(Vector(-2.6, 0.1, 3.0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT);
+      this->animation3->addKeyFrame(Vector(-2.6, 0.1, 2.0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT); 
     }
   else if( this->leftRight == W_RIGHT)
@@ -65,8 +75,16 @@
       this->projectileOffset = Vector(1.0, 0.0, 0.5);
 
-      this->animation1->addKeyFrame(Vector(-2.6, 0.1, -2.5), Quaternion(), 0.1, ANIM_LINEAR);
-      this->animation1->addKeyFrame(Vector(-3.0, 0.1, -2.5), Quaternion(), 0.5, ANIM_LINEAR);
-      this->animation1->addKeyFrame(Vector(-2.6, 0.1, -2.5), Quaternion(), 0.1, ANIM_LINEAR);
+      this->objectComponent1->setRelCoor(Vector(0,0,0.35));
+      this->animation1->addKeyFrame(Vector(0, 0, .5), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT); 
+      this->animation1->addKeyFrame(Vector(-0.4, 0, .5), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT);
+      this->animation1->addKeyFrame(Vector(0, 0, .5), Quaternion(), 0.0, ANIM_LINEAR, ANIM_CONSTANT);
+
+      this->animation2->addKeyFrame(Vector(-2.6, 0.1, -2.0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT); 
+      this->animation2->addKeyFrame(Vector(-2.6, 0.1, -3.0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT);
+
+      this->animation3->addKeyFrame(Vector(-2.6, 0.1, -3.0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT);
+      this->animation3->addKeyFrame(Vector(-2.6, 0.1, -2.0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_CONSTANT); 
     }
+
 }
 
@@ -89,5 +107,7 @@
 */
 void TestGun::activate()
-{}
+{
+  this->animation2->replay();
+}
 
 
@@ -100,5 +120,7 @@
 */
 void TestGun::deactivate()
-{}
+{
+  this->animation3->replay();
+}
 
 
Index: orxonox/branches/openAL/src/world_entities/weapon.cc
===================================================================
--- orxonox/branches/openAL/src/world_entities/weapon.cc	(revision 3921)
+++ orxonox/branches/openAL/src/world_entities/weapon.cc	(revision 4194)
@@ -110,22 +110,36 @@
 void WeaponManager::nextWeaponConf() 
 {
-  PRINTF(4)("Changing weapon configuration: from %i\n", this->currConfID);
-
-  Weapon* w;
-  for(int i = 0; i < W_MAX_SLOTS; ++i)
-    {
-      w = this->configs[this->currConfID].slots[i];
-      if( w != NULL) w->deactivate();
-    }
-  int i;
+  PRINTF(4)("Changing weapon configuration: from %i to next\n", this->currConfID);
+
+  int i, lastConfID;
+  lastConfID = this->currConfID;
   for(i = this->currConfID + 1; i < W_MAX_CONFIGS && !this->configs[i].bUsed; ++i);
   if( i == W_MAX_CONFIGS) this->currConfID = W_CONFIG0;
   else this->currConfID = i;  
-  PRINTF(4)("\tto %i\n", this->currConfID);
-
-  for(int i = 0; i < W_MAX_SLOTS; ++i)
-    {
-      w = this->configs[this->currConfID].slots[i];
-      if( w != NULL) w->activate();
+
+  
+  Weapon *w1, *w2;
+  for(int j = 0; j < W_MAX_SLOTS; ++j)
+    {
+      w1 = this->configs[lastConfID].slots[j];
+      w2 = this->configs[this->currConfID].slots[j];
+      
+      if( w1 == w2)
+	{
+	  printf("no need for change\n");
+	}
+      else
+	{
+	if( w1 != NULL )
+	  {
+	    w1->deactivate();
+	    printf("deactivating %i,%i\n", j,lastConfID);
+	  }
+	if( w2 != NULL)
+	  {
+	    w2->activate();
+	    printf("activating %i,%i\n", j, this->currConfID);
+	  }
+	}
     }
 }
Index: orxonox/branches/openAL/src/world_entities/world_entity.cc
===================================================================
--- orxonox/branches/openAL/src/world_entities/world_entity.cc	(revision 3921)
+++ orxonox/branches/openAL/src/world_entities/world_entity.cc	(revision 4194)
@@ -30,13 +30,6 @@
 /**
    \brief standard constructor
-   
-   Every derived contructor HAS to call the previous one supplying the isFree parameter. This is necessary to distunguish
-   between free and bound entities. The difference between them is simply the fact that the movement of a free entity is
-   not bound to the track of a world. Use this to implement projectile or effect classes that do not have to travel along the track.
-   To specify an entity to be free or bound set the default parameter in the declaration of the constructor.
-   Theoretically you should never have to call the constructor of an Entity directly, for it is called by the spawn() function of the World
-   class. So if you want to create a new entity at any time, call World::spawn(). It will handle everything that is necessary.
-*/
-WorldEntity::WorldEntity (bool isFree) : bFree(isFree)
+*/
+WorldEntity::WorldEntity ()
 {
   this->setClassName ("WorldEntity");
@@ -47,4 +40,44 @@
 
 /**
+   \brief Loads the WordEntity-specific Part of any derived Class
+*/
+WorldEntity::WorldEntity(TiXmlElement* root)
+{
+  // Name Setup
+  char* temp;
+  const char* string;
+  string = grabParameter( root, "name");
+  if( string == NULL)
+    {
+      PRINTF(2)("WorldEntity is missing a proper 'name'\n");
+      string = "Unknown";
+      temp = new char[strlen(string + 2)];
+      strcpy( temp, string);
+      this->setName( temp);
+    }
+  else
+    {
+      temp = new char[strlen(string + 2)];
+      strcpy( temp, string);
+      this->setName( temp);
+    }
+  // Model Loading	
+  this->model = NULL;
+  string = grabParameter( root, "model");
+  if( string != NULL)
+    this->model = (Model*)ResourceManager::getInstance()->load(string, OBJ, RP_CAMPAIGN);
+  else
+    {
+      PRINTF(2)("WorldEntity is missing a proper 'model'\n");
+      this->model = NULL;
+    }
+  if( this->model == NULL)
+    {
+      PRINTF(2)("WorldEntity model '%s' could not be loaded\n", string);
+    }
+  this->bDraw = true;
+}
+
+/**
    \brief standard destructor
 */
@@ -73,13 +106,4 @@
 {}
 
-
-/**
-   \brief query whether the WorldEntity in question is free
-   \return true if the WorldEntity is free or false if it isn't
-*/
-bool WorldEntity::isFree ()
-{
-  return bFree;
-}
 
 /**
Index: orxonox/branches/openAL/src/world_entities/world_entity.h
===================================================================
--- orxonox/branches/openAL/src/world_entities/world_entity.h	(revision 3921)
+++ orxonox/branches/openAL/src/world_entities/world_entity.h	(revision 4194)
@@ -23,5 +23,6 @@
 
  public:
-  WorldEntity (bool isFree = false);
+  WorldEntity (void);
+  WorldEntity(TiXmlElement* root);
   virtual ~WorldEntity ();
 
@@ -32,5 +33,4 @@
   //void removeAbility(Ability* ability);
   void setDrawable (bool bDraw);  
-  bool isFree ();
   void setCharacterAttributes(CharacterAttributes* charAttr);
   CharacterAttributes* getCharacterAttributes();
@@ -52,5 +52,4 @@
   
  private:
-  const bool bFree;	              //!< If the entity is free.
   bool bCollide;                      //!< If it should be considered for the collisiontest.
   bool bDraw;                         //!< If it should be visible.
