[SCM] GeoGebra: Dynamic mathematics software for education branch, patch/build.xml, updated. upstream/3.2.42.0+dfsg1-58-g2c8ae92

Giovanni Mascellani gio at alioth.debian.org
Fri Jul 23 19:25:16 UTC 2010


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GeoGebra: Dynamic mathematics software for education".

The branch, patch/build.xml has been updated
       via  2c8ae9217f09210920011c8ea626ab54e9734c30 (commit)
       via  6d6be1c05f816787d4e1f3d5ffd494cd6edde0db (commit)
       via  1e6de0192b23b204354e43c6d828082148d6b0f5 (commit)
       via  5ba78c0a46567b13b856917d6cfa4c3b5d2c8351 (commit)
       via  5db07a5b54cc3726e0f4767d27ff1bcd8cf89dc8 (commit)
       via  6dd3466d60b66180dbb1e5586208cc242e96d333 (commit)
       via  cfe4e31f0bdad9370fc89fd365ff4007bb9576e4 (commit)
       via  f0cc56c9d21261d85703bc0b83c4c52a8de774f5 (commit)
       via  7be5b785fb939d9564d8a0c5860807d7d5104bdc (commit)
       via  f15aebdb5b7d2b1af3ad35291a9437816acf932d (commit)
       via  d166eb9deff12523fc7db78757ab2bddeed04de1 (commit)
       via  7cb633565eaa82b2c1a48b6956e3d5458a56bfed (commit)
       via  854fa0b45cb80e5948e498b8270fe1556e269699 (commit)
       via  27c5d222d2aead3c6388bc86ce516153439c2831 (commit)
       via  b0799855c03f52e561c5864e4811ea83b8c56d0a (commit)
       via  46f0f82d37ba799c87a3d5974525b9cec88f1303 (commit)
       via  361f8d062ffe07ec70e811cb04ddbe1c27e4b241 (commit)
       via  ba5668b50c566701b5865c1f44e27ba0942634f7 (commit)
       via  27701c0cd0fc7e08fb80a8cbeb3aa04330f1c625 (commit)
       via  80478aff2756cfbd5133691b1840c0632b07d76e (commit)
       via  4db1d44f173442b63da8a29064cdcc2d2c311aec (commit)
       via  2b8ac88b8d2364f9036a730aec1870b6f08df748 (commit)
       via  eaecf21df3c6ec911d7a0c70dbaa1e966fbf6d32 (commit)
       via  61dde1aa84ed8171ffa488d1ce74d1c590549dd6 (commit)
       via  86c47de03acc09650bb7c68d26161cf50408de3d (commit)
       via  6fea0dd872d47f355458eacf9fd0c5afa9c39826 (commit)
       via  b31c396c179dcdd99603edaa1a81250f7f6e97f5 (commit)
       via  dc98c1c051a0d0f1cfea47b6b791d87f51c5f0dc (commit)
       via  7db013ea1b0b2dcb9a9d0610dda4ca83aa79d1c2 (commit)
      from  0fe10d987d2d82cee19edbe6b8893ff7b0c636a2 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 2c8ae9217f09210920011c8ea626ab54e9734c30
Merge: 1e6de01 6d6be1c
Author: Giovanni Mascellani <mascellani at poisson.phc.unipi.it>
Date:   Fri Jul 23 10:00:26 2010 +0200

    Merge commit 'refs/top-bases/patch/build.xml' into patch/build.xml
    
    Conflicts:
    	build.xml

commit 1e6de0192b23b204354e43c6d828082148d6b0f5
Merge: 0fe10d9 5db07a5
Author: Giovanni Mascellani <mascellani at poisson.phc.unipi.it>
Date:   Fri Jul 23 09:57:04 2010 +0200

    Merge commit 'refs/top-bases/patch/build.xml' into patch/build.xml

-----------------------------------------------------------------------

Summary of changes:
 build.pro                                          |   12 +-
 build.xml                                          |    2 +-
 debian/README.source                               |   30 +-
 debian/TODO                                        |    5 +-
 debian/changelog                                   |    4 +-
 debian/control                                     |   11 +-
 debian/copyright                                   |  584 ++++++++++-
 debian/docs                                        |    1 -
 debian/geogebra.desktop                            |   11 +
 debian/geogebra.png                                |  Bin 0 -> 2344 bytes
 debian/geogebra.sharedmimeinfo                     |   11 +
 debian/get_orig_source.sh                          |   25 +-
 debian/install                                     |    2 +
 debian/rules                                       |    5 +
 debian/source/format                               |    1 +
 debian/source/include-binaries                     |    1 +
 geogebra/GeoGebra.java                             |    5 +-
 geogebra/euclidian/DrawRay.java                    |   43 +-
 geogebra/euclidian/EuclidianController.java        |    2 +
 geogebra/gui/ContextMenuGeoElement.java            |    6 +-
 geogebra/gui/PropertiesDialogGeoElement.java       |    1 +
 geogebra/gui/TextInputDialog.java                  |    4 +-
 geogebra/gui/menubar/MenubarImpl.java              |   34 +-
 geogebra/kernel/AlgoAppend.java                    |    2 +-
 geogebra/kernel/AlgoBinomial.java                  |    2 +-
 geogebra/kernel/AlgoDefined.java                   |    2 +-
 geogebra/kernel/AlgoDeterminant.java               |    2 +-
 geogebra/kernel/AlgoExpand.java                    |    2 +-
 geogebra/kernel/AlgoFactor.java                    |    2 +-
 geogebra/kernel/AlgoFirst.java                     |    2 +-
 geogebra/kernel/AlgoGCD.java                       |    2 +-
 geogebra/kernel/AlgoInsert.java                    |    2 +-
 geogebra/kernel/AlgoIntersection.java              |    2 +-
 geogebra/kernel/AlgoInvert.java                    |    2 +-
 geogebra/kernel/AlgoIsInteger.java                 |    2 +-
 geogebra/kernel/AlgoJoin.java                      |    2 +-
 geogebra/kernel/AlgoKeepIf.java                    |    2 +-
 geogebra/kernel/AlgoLCM.java                       |    2 +-
 geogebra/kernel/AlgoLast.java                      |    2 +-
 geogebra/kernel/AlgoListGCD.java                   |    2 +-
 geogebra/kernel/AlgoListLCM.java                   |    2 +-
 geogebra/kernel/AlgoPolynomialFromCoordinates.java |    2 +-
 geogebra/kernel/AlgoPolynomialFromFunction.java    |    2 +-
 geogebra/kernel/AlgoRemoveUndefined.java           |    2 +-
 geogebra/kernel/AlgoReverse.java                   |    2 +-
 geogebra/kernel/AlgoSimplify.java                  |    2 +-
 geogebra/kernel/AlgoSort.java                      |    2 +-
 geogebra/kernel/AlgoTake.java                      |    2 +-
 geogebra/kernel/AlgoTranspose.java                 |    2 +-
 geogebra/kernel/AlgoUnion.java                     |    2 +-
 geogebra/kernel/GeoElement.java                    |   20 +-
 geogebra/kernel/GeoList.java                       |    5 +-
 geogebra/kernel/GeoPolygon.java                    |    2 +-
 geogebra/kernel/Kernel.java                        |   10 +-
 .../kernel/integration/GaussQuadIntegration.java   |  116 ---
 geogebra/kernel/jama/CholeskyDecomposition.java    |  199 ----
 geogebra/kernel/jama/EigenvalueDecomposition.java  |  955 ------------------
 geogebra/kernel/jama/LUDecomposition.java          |  311 ------
 geogebra/kernel/jama/Matrix.java                   | 1049 --------------------
 geogebra/kernel/jama/QRDecomposition.java          |  218 ----
 .../kernel/jama/SingularValueDecomposition.java    |  547 ----------
 geogebra/kernel/jama/util/Maths.java               |   20 -
 geogebra/kernel/parser/Parser.jj                   |    2 +-
 geogebra/kernel/statistics/AlgoFitLineX.java       |    2 +-
 geogebra/kernel/statistics/AlgoFitLineY.java       |    2 +-
 geogebra/kernel/statistics/AlgoInverseNormal.java  |    2 +-
 geogebra/kernel/statistics/AlgoMedian.java         |    2 +-
 geogebra/kernel/statistics/AlgoMode.java           |    2 +-
 geogebra/kernel/statistics/AlgoNormal.java         |    2 +-
 geogebra/kernel/statistics/AlgoQ1.java             |    2 +-
 geogebra/kernel/statistics/AlgoQ3.java             |    2 +-
 geogebra/kernel/statistics/AlgoRandom.java         |    2 +-
 geogebra/kernel/statistics/AlgoRandomBinomial.java |    2 +-
 geogebra/kernel/statistics/AlgoRandomNormal.java   |    2 +-
 geogebra/kernel/statistics/AlgoRandomPoisson.java  |    2 +-
 geogebra/main/Application.java                     |   61 +-
 unix/debcontrol/postinst                           |   22 +
 unix/debcontrol/postrm                             |   16 +
 unix/debrelease/Packages                           |   21 +
 unix/debrelease/Release                            |   10 +
 unix/usr/bin/geogebra                              |    4 +
 unix/usr/bin/ggthumb                               |   13 +
 unix/usr/share/applications/geogebra.desktop       |   24 +
 unix/usr/share/doc/geogebra/README.Debian          |    8 +
 unix/usr/share/doc/geogebra/changelog.gz           |  Bin 0 -> 152 bytes
 unix/usr/share/doc/geogebra/copyright              |   36 +
 unix/usr/share/gconf/defaults/10_geogebra          |    3 +
 .../share/icons/hicolor/48x48/apps/geogebra.png    |  Bin 0 -> 4489 bytes
 .../mimetypes/application-vnd.geogebra.file.png    |  Bin 0 -> 4489 bytes
 .../mimetypes/application-vnd.geogebra.tool.png    |  Bin 0 -> 4489 bytes
 unix/usr/share/man/man1/geogebra.1.gz              |  Bin 0 -> 613 bytes
 unix/usr/share/man/man1/ggthumb.1.gz               |  Bin 0 -> 435 bytes
 unix/usr/share/mime/packages/geogebra.xml          |   25 +
 unix/usr/share/pixmaps/geogebra.png                |  Bin 0 -> 4489 bytes
 94 files changed, 977 insertions(+), 3598 deletions(-)

diff --git a/build.pro b/build.pro
index ce90ee5..69469b4 100644
--- a/build.pro
+++ b/build.pro
@@ -3,13 +3,13 @@
 #
 # Oct 23rd 2008
 #
--injars ../build/geogebra.jar
--injars ../build/geogebra_main.jar
--injars ../build/geogebra_gui.jar
--injars ../build/geogebra_export.jar
--injars ../build/geogebra_cas.jar
+-injars ../buildggb32/geogebra.jar
+-injars ../buildggb32/geogebra_main.jar
+-injars ../buildggb32/geogebra_gui.jar
+-injars ../buildggb32/geogebra_export.jar
+-injars ../buildggb32/geogebra_cas.jar
 
--outjars ../build/temp
+-outjars ../buildggb32/temp
 
 -libraryjars ../java142-rt.jar
 -libraryjars netscape_javascript.jar
diff --git a/build.xml b/build.xml
index 1cff9bc..b6749ba 100644
--- a/build.xml
+++ b/build.xml
@@ -100,7 +100,7 @@ office at geogebra.org
 		<mkdir dir="${build.dir}/unsigned/unpacked"/>
 		<mkdir dir="${propertiestemp.dir}"/>
 		<delete>
-		    <fileset dir="${build.dir}" includes="**/geogebra*.jar, **/gluegen-rt.jar, **/jogl.jar, **/jlatexmath.jar ,**/*.jar.pack.gz, **/*.html"/>
+		    <fileset dir="${build.dir}" includes="**/geogebra*.jar, **/gluegen-rt.jar, **/jogl.jar, **/jlatexmath.jar, **/jlm_*.jar,**/*.jar.pack.gz, **/*.html"/>
 		</delete>		
 	</target>
 
diff --git a/debian/README.source b/debian/README.source
index 4823a9a..6362e72 100644
--- a/debian/README.source
+++ b/debian/README.source
@@ -1,9 +1,35 @@
 geogebra for Debian
 -------------------
 
-<this file describes information about the source package, see Debian policy
-manual section 4.14. You WILL either need to modify or delete this file>
+The upstream source tarball is obtained by the script get_orig_source.sh
+by exporing a copy of the SVN tag corresponding to the desired version
+and then:
+ * Deleting all precompiled JAR files;
+ * Deleting the installer/ directory, which is non free (Creative Commons
+   Attribution-Non Commercial-Share Alike 3.0 or later)
+ * Deleting the files:
+   + geogebra/kernel/complex/Complex.java
+   + geogebra/kernel/complex/ComplexPoly.java
+   + geogebra/kernel/roots/RealRoot.java
+   + geogebra/kernel/roots/RealRootFunction.java
+   + geogebra/kernel/integration/GaussQuadIntegration.java
+   These files are non free (they use an ad-hoc license which, for instance,
+   doesn't allow commercial use).
+ * Deleting the org/ directory, which contains copies of other software
+   already package in Debian (which is used instead of the embedded copy).
+ * Deleting the geogebra/kernel/jama/ directory, except
+   the geogebra/kernel/jama/GgbMat.java file, which is a copy of
+   another software already in Debian.
 
 
+QUILT
 
+This package uses quilt to manage all modifications to the upstream
+source.  Changes are stored in the source package as diffs in
+debian/patches and applied during the build.  Please see:
+
+    /usr/share/doc/quilt/README.source
+
+for more information on how to apply the patches, modify patches, or
+remove a patch.
 
diff --git a/debian/TODO b/debian/TODO
index 81f4519..769e324 100644
--- a/debian/TODO
+++ b/debian/TODO
@@ -1,2 +1,5 @@
- * Verify hoteqn and jasymca (embedded copies?)
  * verify exportable JARs
+ * add a menu entry
+ * check jama patch (inverse of a singular matrix)
+ * additional patch provided by Markus
+ * additional resources in http://groups.google.com/group/geogebra-dev/browse_thread/thread/77c6736ed48688ae
diff --git a/debian/changelog b/debian/changelog
index 4c2bf90..8e8bd71 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,5 +1,5 @@
-geogebra (3.2.40.0+dfsg1-1) unstable; urgency=low
+geogebra (3.2.42.0+dfsg1-1) unstable; urgency=low
 
   * Initial release (Closes: #505704)
 
- -- Giovanni Mascellani <mascellani at poisson.phc.unipi.it>  Fri, 12 Mar 2010 16:12:24 +0100
+ -- Giovanni Mascellani <gio at debian.org>  Tue, 06 Jul 2010 15:03:50 +0200
diff --git a/debian/control b/debian/control
index 89207ec..a0b704f 100644
--- a/debian/control
+++ b/debian/control
@@ -1,7 +1,8 @@
 Source: geogebra
 Section: java
 Priority: extra
-Maintainer: Giovanni Mascellani <mascellani at poisson.phc.unipi.it>
+Maintainer: Debian Java Maintainers <pkg-java-maintainers at lists.alioth.debian.org>
+Uploaders: Giovanni Mascellani <gio at debian.org>
 Build-Depends:
  cdbs,
  debhelper (>= 7),
@@ -11,6 +12,8 @@ Build-Depends:
  default-jdk,
  quilt,
  mathpiper,
+ libcommons-math-java,
+ libjama-java,
  libfreehep-xml-java,
  libfreehep-util-java,
  libfreehep-graphics2d-java,
@@ -18,14 +21,18 @@ Build-Depends:
  libfreehep-graphicsio-svg-java,
  libfreehep-graphicsio-pdf-java,
  libfreehep-graphicsio-emf-java
-Standards-Version: 3.8.4
+Standards-Version: 3.9.0
 Homepage: http://www.geogebra.org/
+Vcs-Git: git://git.debian.org/git/pkg-java/geogebra.git
+Vcs-Browser: http://git.debian.org/?p=pkg-java/geogebra.git
 
 Package: geogebra
 Architecture: all
 Depends:
  default-jre | java5-runtime,
  mathpiper,
+ libcommons-math-java,
+ libjama-java,
  libfreehep-xml-java,
  libfreehep-util-java,
  libfreehep-graphics2d-java,
diff --git a/debian/copyright b/debian/copyright
index 8fef2c2..bc9cf7a 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,18 +1,156 @@
+Format-Specification: http://dep.debian.net/deps/dep5/
+Name: GeoGebra
+Source: http://www.geogebra.org/
+
 Files: *
-Copyright: 2001 - 
+Copyright:
+ 2001-2010, Markus Hohenwarter
+ 2007-2010, Michael Borcherds
+ 2005-2010, Yves Kreis
+ 2006, Loïc Le Coq
+ 2007, Joan Carles Naranjo
+ 2007, Victor Franco
+ 2007, Eloi Puertas
+ 2007, Philipp Weissenbacher
+ 2007-2009, Cong Liu
+ 2007-2009, Amy Varkey
+ 2007-2009, Quan Yuan
+ 2008, Hans-Petter Ulven
+ 2008, Florian Sonner
+ 2009, George Sturr
 License: GPL-2+
+X-Comments: Some files have a GPL-2 only header: this has already been
+ discussed with upstream and fixed in the upstream repository, so they can
+ be considered GPL-2+. The correct headers, of course, will be merged
+ with the next release.
 
 Files: jasymca/*
 Copyright: 2006, Helmut Dersch <der at hs-furtwangen.de>
 License: GPL-2+
 
 Files: geogebra/gui/hoteqn/*
-Copyright: 2006, Stefan Möller and Christian Schmid
+Copyright: 2006, Stefan Möller
+           2006, Christian Schmid
+License: GPL
+
+File: geogebra/properties/*
+Copyright:
+ Brahim Boulakbech
+ Haboubi Abdessalem
+ Maha Ah
+ Gonzalo Elcano Vizcay
+ Maja Hrbat
+ Hristo Stoyanov
+ Jaume Bartroli
+ Pep Bujosa
+ Josep Lluis Canadilla
+ Carlos Gimenez
+ Antoni Goma
+ Jorge Sanchez
+ Roser Sebastian (Spain)
+ Fu-Kwun Hwang
+ Chen-Hui Lin
+ Pegasus Roe
+ Joe Chen
+ Chen Xing
+ Sime Suljic
+ Ela Rac
+ Josip Klicinovic
+ Marie Pokorna
+ Pavel Sokol
+ Steen Grode
+ Beatrijs Versichel
+ Ivan De Winne
+ Pedro Tytgat
+ Carel van de Giessen
+ Markus Hohenwarter
+ Judith Hohenwarter
+ Yves Kreis
+ Michael Borcherds
+ Jane Albre
+ Hannu Korhonen
+ Juha Leino
+ Kirsi Malinen
+ Noel Lambert
+ Jesus Garcia Otero
+ Irene Arias Lopez
+ Lasha Kokilashvili
+ Nicholas Mousoulides
+ Constantinos Christou
+ Spiros Mavrogiannis
+ Manolis Koutlis
+ Fergadiotis Athanasios
+ Guy Hed
+ Zsuzsanna Papp-Varga
+ Andras Hrasko
+ Peter Csiba
+ Major Zoltan
+ Freyja Hreinsdottir
+ Aam Sudrajat
+ Alessandra Tomasi
+ Simona Riva
+ Akihito Wachi
+ Kazuhiro Hasegawa
+ Kyeong-Sik Choi
+ Rokas Tamosiunas
+ Linda Fahlberg-Stojanovska
+ OIKT, Faculty of Technical Sciences, UKLO
+ Sigbjorn Hals
+ Saeed Aminorroaya
+ Ali SafarNavadeh
+ Azam Zabihi
+ Ania Borkowska
+ Marzanna Miasko
+ Malgorzata Paliga
+ Ewa Piwek
+ Edyta Pobiega
+ Kasia Winkowska-Nowak
+ Humberto Bortolossi
+ Herminio Borges Neto
+ Alana Paula
+ Luciana de Lima
+ Araujo Freitas
+ Alana Souza de Olivieira
+ Jorge Geraldes
+ Antonio Ribeiro
+ Anatoly Scherbakov
+ Beatrice Versichel
+ Djordje Herceg
+ Dragoslav Herceg
+ Peter Csiba
+ Iveta Kohanova
+ Stanislav Senveter
+ Jonas Enlund
+ Thomas Lingefjard
+ Liliana Saidon
+ Erol Karakirik
+ Mustafa Dogan
+ Suleyman Cengiz
+ Nguyen Thanh Trung
+ Quang Nguyen
+ Uned Gyfieithu Translation Unit, Prifysgol Bangor University
+ Gwyn Jones
+License: CC-BY-SA-3.0+
+
+Files: geogebra/export/epsgraphics/*
+Copyright: 2001-2004, Paul James Mutton
 License: GPL
 
+Files: geogebra/euclidian/clipping/*
+Copyright: 2009, Jeremy Wood
+License: BSD
+X-Original-Source: https://javagraphics.dev.java.net/
+
+Files: geogebra/euclidian/clipping/ClipLine.java
+Copyright: 2000, Andreas M. Rammelt <rammi at caff.de>
+License: PD
+ This source code is in the public domain. 
+ USE AT YOUR OWN RISK!
+X-Original-Source: http://caff.de/dxfviewer/
+
 Files: geogebra/gui/inputbar/AutoComplete.java
 Copyright: 1999-2001, Matt Welsh
-License: ??
+License: GPL-2+
 
 Files: geogebra/kernel/optimization/ExtremumFinder.java
 Copyright: 1998, Steve Verrill <steve at www1.fpl.fs.fed.us>
@@ -22,28 +160,16 @@ License: PD
  to Java by a US government employee on official time.  
  Thus this software is also in the public domain.
 
-Files: geogebra/kernel/complex/Complex.java,
-       geogebra/kernel/complex/ComplexPoly.java,
-       geogebra/kernel/roots/RealRootFunction.java,
-       geogebra/kernel/roots/RealRoot.java
-Copyright:  2002-2004, Michael Thomas Flanagan <m.flanagan at ee.ucl.ac.uk>
-License: non-free !!!
- PERMISSION TO COPY:
- Permission to use, copy and modify this software and its documentation for
- NON-COMMERCIAL purposes is granted, without fee, provided that an acknowledgement
- to the author, Michael Thomas Flanagan at www.ee.ucl.ac.uk/~mflanaga, appears in all copies.
- .
- Dr Michael Thomas Flanagan makes no representations about the suitability
- or fitness of the software for any or for a particular purpose.
- Michael Thomas Flanagan shall not be liable for any damages suffered
- as a result of using, modifying or distributing this software or its derivatives.
-
 Files: geogebra/util/Base64.java
 Copyright: 2003, Casey Marshall <rsdio at metastatic.org>
            1996, Internet Software Consortium
            1995, International Business Machines, Inc.
+License: GPL-2+-link and ISC and IBM
+
+Files: geogebra/util/ScientificFormat.java
+Copyright: Paul Spence
+           Mark Donszelmann
 License: GPL-2+
- With exception... blah blah...
 
 Files: geogebra/SplashWindow.java
 Copyright: 1999-2003, Werner Randelshofer
@@ -51,23 +177,40 @@ License: GPL-2+
 
 Files: jasymca/MPN.java, jasymca/Random.java
 Copyright: 1998, 1999, 2000, 2001, 2002, Free Software Foundation, Inc
+License: GPL-2+-link
+
+Files: debian/*
+Copyright: 2010, Giovanni Mascellani <gio at debian.org>
+License: GPL-2+
+
+Files: debian/geogebra.png,
+       debian/geogebra.sharedmimeinfo,
+       debian/geogebra.desktop
+Copyright: 2010, Gabor Ancsin <gabor at geogebra.org>
+License: GPL-2+
+
 License: GPL-2+
- This file is part of GNU Classpath.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ .
+ On Debian systems, the full text of the GPL-2 license can be found in the file
+ `/usr/share/common-licenses/GPL-2'.
+
+License: GPL
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation.
  .
- GNU Classpath is free software; you can redistribute it and/or modify
+ On Debian systems, the full text of the GPL-2 license can be found in the file
+ `/usr/share/common-licenses/GPL-2'.
+
+License: GPL-2+-link
+ This program is free software; you can redistribute 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.
-  .
- GNU Classpath is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- General Public License for more details.
- .
- You should have received a copy of the GNU General Public License
- along with GNU Classpath; see the file COPYING.  If not, write to the
- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA.
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
  .
  Linking this library statically or dynamically with other modules is
  making a combined work based on this library.  Thus, the terms and
@@ -85,26 +228,357 @@ License: GPL-2+
  this exception to your version of the library, but you are not
  obligated to do so.  If you do not wish to do so, delete this
  exception statement from your version.
+ .
+ On Debian systems, the full text of the GPL-2 license can be found in the file
+ `/usr/share/common-licenses/GPL-2'.
 
-Files: geogebra/kernel/AlgoCurvature.java,
-       geogebra/kernel/AlgoLengthFunction.java,
-       geogebra/kernel/AlgoLengthFunction2Points.java,
-       geogebra/kernel/AlgoTangentCurve.java,
-       geogebra/kernel/AlgoCurvatureCurve.java,
-       geogebra/kernel/AlgoLengthCurve.java,
-       geogebra/kernel/AlgoCurvatureVectorCurve.java,
-       geogebra/kernel/AlgoLengthCurve2Points.java
-Copyright: 2007, Victor Franco Espino
-           Markus Hohenwarter
-License: ??
-
-Files: geogebra/kernel/AlgoListLCM.java,
-       geogebra/kernel/AlgoFactor.java,
-       geogebra/kernel/AlgoTake.java,
-       geogebra/kernel/AlgoBinomial.java
-Copyright: 2008, Michael Borcherds
-License: GPL-2
+License: IBM
+ International Business Machines, Inc. (hereinafter called IBM) grants
+ permission under its copyrights to use, copy, modify, and distribute
+ this Software with or without fee, provided that the above copyright
+ notice and all paragraphs of this notice appear in all copies, and
+ that the name of IBM not be used in connection with the marketing of
+ any product incorporating the Software or modifications thereof,
+ without specific, written prior permission.
+ .
+ To the extent it has a right to do so, IBM grants an immunity from
+ suit under its patents, if any, for the use, sale or manufacture of
+ products to the extent that such products are used for performing
+ Domain Name System dynamic updates in TCP/IP networks by means of the
+ Software.  No immunity is granted for any product per se or for any
+ other function of any product.
+ .
+ THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
+ INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ PARTICULAR PURPOSE.  IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
+ DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ SOFTWARE, EVEN IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH
+ DAMAGES.
 
-Files: debian/*
-Copyright: 2010, Giovanni Mascellani <mascellani at poisson.phc.unipi.it>
-License: GPL-3+
+License: BSD
+ All rights reserved.
+ .
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ .
+  * Redistributions of source code must retain the above copyright notice, this
+    list of conditions and the following disclaimer.
+  * Redistributions in binary form must reproduce the above copyright notice,
+    this list of conditions and the following disclaimer in the documentation
+    and/or other materials provided with the distribution.
+  * Neither the name of the author nor the names of its contributors
+    may be used to endorse or promote products derived from this software
+    without specific prior written permission.
+ .
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+License: CC-BY-SA-3.0+
+ These contents are subject to the Creative Commons Attribution-Share Alike
+ license, either version 3.0 or (at your option) any later version; the
+ complete text of the version 3.0 follows.
+ .
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL
+ SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT
+ RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS.
+ CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND
+ DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. 
+ .
+ License
+ .
+ THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
+ COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
+ COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
+ AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
+ .
+ BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO
+ BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE
+ CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED
+ HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
+ .
+ 1. Definitions
+   a. "Adaptation" means a work based upon the Work, or upon the Work and other
+ pre-existing works, such as a translation, adaptation, derivative work,
+ arrangement of music or other alterations of a literary or artistic work,
+ or phonogram or performance and includes cinematographic adaptations or any
+ other form in which the Work may be recast, transformed, or adapted including
+ in any form recognizably derived from the original, except that a work that
+ constitutes a Collection will not be considered an Adaptation for the purpose
+ of this License. For the avoidance of doubt, where the Work is a musical work,
+ performance or phonogram, the synchronization of the Work in timed-relation
+ with a moving image ("synching") will be considered an Adaptation for the
+ purpose of this License.
+   b. "Collection" means a collection of literary or artistic works, such as
+ encyclopedias and anthologies, or performances, phonograms or broadcasts, or
+ other works or subject matter other than works listed in Section 1(f) below,
+ which, by reason of the selection and arrangement of their contents,
+ constitute intellectual creations, in which the Work is included in its
+ entirety in unmodified form along with one or more other contributions, each
+ constituting separate and independent works in themselves, which together are
+ assembled into a collective whole. A work that constitutes a Collection will
+ not be considered an Adaptation (as defined below) for the purposes of this
+ License.
+   c. "Creative Commons Compatible License" means a license that is listed at
+ http://creativecommons.org/compatiblelicenses that has been approved by
+ Creative Commons as being essentially equivalent to this License, including,
+ at a minimum, because that license: (i) contains terms that have the same
+ purpose, meaning and effect as the License Elements of this License; and,
+ (ii) explicitly permits the relicensing of adaptations of works made available
+ under that license under this License or a Creative Commons jurisdiction
+ license with the same License Elements as this License.
+   d. "Distribute" means to make available to the public the original and copies
+ of the Work or Adaptation, as appropriate, through sale or other transfer of
+ ownership.
+   e. "License Elements" means the following high-level license attributes as
+ selected by Licensor and indicated in the title of this License: Attribution,
+ ShareAlike.
+   f. "Licensor" means the individual, individuals, entity or entities that
+ offer(s) the Work under the terms of this License.
+   g. "Original Author" means, in the case of a literary or artistic work, the
+ individual, individuals, entity or entities who created the Work or if no
+ individual or entity can be identified, the publisher; and in addition
+ (i) in the case of a performance the actors, singers, musicians, dancers,
+ and other persons who act, sing, deliver, declaim, play in, interpret or
+ otherwise perform literary or artistic works or expressions of folklore;
+ (ii) in the case of a phonogram the producer being the person or legal
+ entity who first fixes the sounds of a performance or other sounds; and,
+ (iii) in the case of broadcasts, the organization that transmits the broadcast.
+   h. "Work" means the literary and/or artistic work offered under the terms of
+ this License including without limitation any production in the literary,
+ scientific and artistic domain, whatever may be the mode or form of its
+ expression including digital form, such as a book, pamphlet and other
+ writing; a lecture, address, sermon or other work of the same nature;
+ a dramatic or dramatico-musical work; a choreographic work or entertainment in
+ dumb show; a musical composition with or without words; a cinematographic work
+ to which are assimilated works expressed by a process analogous to
+ cinematography; a work of drawing, painting, architecture, sculpture,
+ engraving or lithography; a photographic work to which are assimilated works
+ expressed by a process analogous to photography; a work of applied art; an
+ illustration, map, plan, sketch or three-dimensional work relative to
+ geography, topography, architecture or science; a performance; a broadcast;
+ a phonogram; a compilation of data to the extent it is protected as a
+ copyrightable work; or a work performed by a variety or circus performer to the
+ extent it is not otherwise considered a literary or artistic work.
+   i. "You" means an individual or entity exercising rights under this License
+ who has not previously violated the terms of this License with respect to the
+ Work, or who has received express permission from the Licensor to exercise
+ rights under this License despite a previous violation.
+   j. "Publicly Perform" means to perform public recitations of the Work and to
+ communicate to the public those public recitations, by any means or process,
+ including by wire or wireless means or public digital performances; to make
+ available to the public Works in such a way that members of the public may
+ access these Works from a place and at a place individually chosen by them;
+ to perform the Work to the public by any means or process and the communication
+ to the public of the performances of the Work, including by public digital
+ performance; to broadcast and rebroadcast the Work by any means including
+ signs, sounds or images.
+   k. "Reproduce" means to make copies of the Work by any means including
+ without limitation by sound or visual recordings and the right of fixation
+ and reproducing fixations of the Work, including storage of a protected
+ performance or phonogram in digital form or other electronic medium.
+ .
+ 2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit,
+ or restrict any uses free from copyright or rights arising from limitations
+ or exceptions that are provided for in connection with the copyright protection
+ under copyright law or other applicable laws.
+ .
+ 3. License Grant. Subject to the terms and conditions of this License, Licensor
+ hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the
+ duration of the applicable copyright) license to exercise the rights in the
+ Work as stated below:
+   a. to Reproduce the Work, to incorporate the Work into one or more
+ Collections, and to Reproduce the Work as incorporated in the Collections;
+   b. to create and Reproduce Adaptations provided that any such Adaptation,
+ including any translation in any medium, takes reasonable steps to clearly
+ label, demarcate or otherwise identify that changes were made to the original
+ Work. For example, a translation could be marked "The original work was
+ translated from English to Spanish," or a modification could indicate
+ "The original work has been modified.";
+   c. to Distribute and Publicly Perform the Work including as incorporated
+ in Collections; and,
+   d. to Distribute and Publicly Perform Adaptations.
+   e. For the avoidance of doubt:
+         i. Non-waivable Compulsory License Schemes. In those jurisdictions in
+            which the right to collect royalties through any statutory or
+            compulsory licensing scheme cannot be waived, the Licensor reserves
+            the exclusive right to collect such royalties for any exercise by
+            You of the rights granted under this License;
+        ii. Waivable Compulsory License Schemes. In those jurisdictions in which
+            the right to collect royalties through any statutory or compulsory
+            licensing scheme can be waived, the Licensor waives the exclusive
+            right to collect such royalties for any exercise by You of the
+            rights granted under this License; and,
+       iii. Voluntary License Schemes. The Licensor waives the right to collect
+            royalties, whether individually or, in the event that the Licensor
+            is a member of a collecting society that administers voluntary
+            licensing schemes, via that society, from any exercise by You of
+            the rights granted under this License.
+ The above rights may be exercised in all media and formats whether now known or
+ hereafter devised. The above rights include the right to make such
+ modifications as are technically necessary to exercise the rights in other
+ media and formats. Subject to Section 8(f), all rights not expressly granted
+ by Licensor are hereby reserved.
+ .
+ 4. Restrictions. The license granted in Section 3 above is expressly made
+ subject to and limited by the following restrictions:
+   a. You may Distribute or Publicly Perform the Work only under the terms of
+ this License. You must include a copy of, or the Uniform Resource Identifier
+ (URI) for, this License with every copy of the Work You Distribute or Publicly
+ Perform. You may not offer or impose any terms on the Work that restrict the
+ terms of this License or the ability of the recipient of the Work to exercise
+ the rights granted to that recipient under the terms of the License. You may
+ not sublicense the Work. You must keep intact all notices that refer to this
+ License and to the disclaimer of warranties with every copy of the Work You
+ Distribute or Publicly Perform. When You Distribute or Publicly Perform the
+ Work, You may not impose any effective technological measures on the Work that
+ restrict the ability of a recipient of the Work from You to exercise the rights
+ granted to that recipient under the terms of the License. This Section 4(a)
+ applies to the Work as incorporated in a Collection, but this does not require
+ the Collection apart from the Work itself to be made subject to the terms of
+ this License. If You create a Collection, upon notice from any Licensor You
+ must, to the extent practicable, remove from the Collection any credit as
+ required by Section 4(c), as requested. If You create an Adaptation, upon
+ notice from any Licensor You must, to the extent practicable, remove from
+ the Adaptation any credit as required by Section 4(c), as requested.
+   b. You may Distribute or Publicly Perform an Adaptation only under the terms
+ of: (i) this License; (ii) a later version of this License with the same
+ License Elements as this License; (iii) a Creative Commons jurisdiction
+ license (either this or a later license version) that contains the same License
+ Elements as this License (e.g., Attribution-ShareAlike 3.0 US)); (iv) a
+ Creative Commons Compatible License. If you license the Adaptation under one of
+ the licenses mentioned in (iv), you must comply with the terms of that license.
+ If you license the Adaptation under the terms of any of the licenses mentioned
+ in (i), (ii) or (iii) (the "Applicable License"), you must comply with the
+ terms of the Applicable License generally and the following provisions:
+ (I) You must include a copy of, or the URI for, the Applicable License with
+ every copy of each Adaptation You Distribute or Publicly Perform; (II) You may
+ not offer or impose any terms on the Adaptation that restrict the terms of the
+ Applicable License or the ability of the recipient of the Adaptation to
+ exercise the rights granted to that recipient under the terms of the Applicable
+ License; (III) You must keep intact all notices that refer to the Applicable
+ License and to the disclaimer of warranties with every copy of the Work as
+ included in the Adaptation You Distribute or Publicly Perform; (IV) when You
+ Distribute or Publicly Perform the Adaptation, You may not impose any effective
+ technological measures on the Adaptation that restrict the ability of a
+ recipient of the Adaptation from You to exercise the rights granted to that
+ recipient under the terms of the Applicable License. This Section 4(b) applies
+ to the Adaptation as incorporated in a Collection, but this does not require
+ the Collection apart from the Adaptation itself to be made subject to the terms
+ of the Applicable License.
+   c. If You Distribute, or Publicly Perform the Work or any Adaptations or
+ Collections, You must, unless a request has been made pursuant to Section 4(a),
+ keep intact all copyright notices for the Work and provide, reasonable to the
+ medium or means You are utilizing: (i) the name of the Original Author (or
+ pseudonym, if applicable) if supplied, and/or if the Original Author and/or
+ Licensor designate another party or parties (e.g., a sponsor institute,
+ publishing entity, journal) for attribution ("Attribution Parties") in
+ Licensor's copyright notice, terms of service or by other reasonable means,
+ the name of such party or parties; (ii) the title of the Work if supplied;
+ (iii) to the extent reasonably practicable, the URI, if any, that Licensor
+ specifies to be associated with the Work, unless such URI does not refer to the
+ copyright notice or licensing information for the Work; and (iv) , consistent
+ with Ssection 3(b), in the case of an Adaptation, a credit identifying the use
+ of the Work in the Adaptation (e.g., "French translation of the Work by
+ Original Author," or "Screenplay based on original Work by Original Author").
+ The credit required by this Section 4(c) may be implemented in any reasonable
+ manner; provided, however, that in the case of a Adaptation or Collection, at a
+ minimum such credit will appear, if a credit for all contributing authors of
+ the Adaptation or Collection appears, then as part of these credits and in a
+ manner at least as prominent as the credits for the other contributing authors.
+ For the avoidance of doubt, You may only use the credit required by this
+ Section for the purpose of attribution in the manner set out above and, by
+ exercising Your rights under this License, You may not implicitly or explicitly
+ assert or imply any connection with, sponsorship or endorsement by the Original
+ Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use
+ of the Work, without the separate, express prior written permission of the
+ Original Author, Licensor and/or Attribution Parties.
+   d. Except as otherwise agreed in writing by the Licensor or as may be
+ otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly
+ Perform the Work either by itself or as part of any Adaptations or Collections,
+ You must not distort, mutilate, modify or take other derogatory action in
+ relation to the Work which would be prejudicial to the Original Author's honor
+ or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in
+ which any exercise of the right granted in Section 3(b) of this License (the
+ right to make Adaptations) would be deemed to be a distortion, mutilation,
+ modification or other derogatory action prejudicial to the Original Author's
+ honor and reputation, the Licensor will waive or not assert, as appropriate,
+ this Section, to the fullest extent permitted by the applicable national law,
+ to enable You to reasonably exercise Your right under Section 3(b) of this
+ License (right to make Adaptations) but not otherwise.
+ .
+ 5. Representations, Warranties and Disclaimer
+ UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS
+ THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND
+ CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A
+ PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS,
+ ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE.
+ SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH
+ EXCLUSION MAY NOT APPLY TO YOU.
+ .
+ 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW,
+ IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL,
+ INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS
+ LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGES.
+ .
+ 7. Termination
+   a. This License and the rights granted hereunder will terminate automatically
+ upon any breach by You of the terms of this License. Individuals or entities
+ who have received Adaptations or Collections from You under this License,
+ however, will not have their licenses terminated provided such individuals or
+ entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7,
+ and 8 will survive any termination of this License.
+   b. Subject to the above terms and conditions, the license granted here is
+ perpetual (for the duration of the applicable copyright in the Work).
+ Notwithstanding the above, Licensor reserves the right to release the Work
+ under different license terms or to stop distributing the Work at any time;
+ provided, however that any such election will not serve to withdraw this
+ License (or any other license that has been, or is required to be, granted
+ under the terms of this License), and this License will continue in full force
+ and effect unless terminated as stated above.
+ .
+ 8. Miscellaneous
+   a. Each time You Distribute or Publicly Perform the Work or a Collection, the
+ Licensor offers to the recipient a license to the Work on the same terms and
+ conditions as the license granted to You under this License.
+   b. Each time You Distribute or Publicly Perform an Adaptation, Licensor
+ offers to the recipient a license to the original Work on the same terms and
+ conditions as the license granted to You under this License.
+   c. If any provision of this License is invalid or unenforceable under
+ applicable law, it shall not affect the validity or enforceability of the
+ remainder of the terms of this License, and without further action by the
+ parties to this agreement, such provision shall be reformed to the minimum
+ extent necessary to make such provision valid and enforceable.
+   d. No term or provision of this License shall be deemed waived and no breach
+ consented to unless such waiver or consent shall be in writing and signed by
+ the party to be charged with such waiver or consent.
+   e. This License constitutes the entire agreement between the parties with
+ respect to the Work licensed here. There are no understandings, agreements or
+ representations with respect to the Work not specified here. Licensor shall not
+ be bound by any additional provisions that may appear in any communication from
+ You. This License may not be modified without the mutual written agreement of
+ the Licensor and You.
+   f. The rights granted under, and the subject matter referenced, in this
+ License were drafted utilizing the terminology of the Berne Convention for the
+ Protection of Literary and Artistic Works (as amended on September 28, 1979),
+ the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO
+ Performances and Phonograms Treaty of 1996 and the Universal Copyright
+ Convention (as revised on July 24, 1971). These rights and subject matter take
+ effect in the relevant jurisdiction in which the License terms are sought to be
+ enforced according to the corresponding provisions of the implementation of
+ those treaty provisions in the applicable national law. If the standard suite
+ of rights granted under applicable copyright law includes additional rights not
+ granted under this License, such additional rights are deemed to be included in
+ the License; this License is not intended to restrict the license of any rights
+ under applicable law.
diff --git a/debian/docs b/debian/docs
index 6858f83..44620c5 100644
--- a/debian/docs
+++ b/debian/docs
@@ -1,3 +1,2 @@
 _LICENSE.txt
-preload.txt
 _README.txt
diff --git a/debian/geogebra.desktop b/debian/geogebra.desktop
new file mode 100644
index 0000000..08721fc
--- /dev/null
+++ b/debian/geogebra.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Name=GeoGebra
+Comment=Create interactive mathematical constructions and applets 
+Exec=geogebra %f
+Icon=geogebra.png
+Terminal=false
+Type=Application
+StartupNotify=true
+Categories=Math;Education
+MimeType=application/vnd.geogebra.file;application/vnd.geogebra.tool;
+
diff --git a/debian/geogebra.png b/debian/geogebra.png
new file mode 100644
index 0000000..51654ca
Binary files /dev/null and b/debian/geogebra.png differ
diff --git a/debian/geogebra.sharedmimeinfo b/debian/geogebra.sharedmimeinfo
new file mode 100644
index 0000000..5608011
--- /dev/null
+++ b/debian/geogebra.sharedmimeinfo
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+  <mime-type type="application/vnd.geogebra.file">
+         <comment>GeoGebra File</comment>
+         <glob pattern="*.ggb"/>
+  </mime-type>
+  <mime-type type="application/vnd.geogebra.tool">
+         <comment>GeoGebra Tool</comment>
+         <glob pattern="*.ggt"/>
+  </mime-type>
+</mime-info>
diff --git a/debian/get_orig_source.sh b/debian/get_orig_source.sh
index 769a384..5507aea 100755
--- a/debian/get_orig_source.sh
+++ b/debian/get_orig_source.sh
@@ -1,9 +1,12 @@
 #!/bin/bash
 
-# Input: $TAG, $VERSION
+# Input:
+# $TAG - the SVN tag to export
+# $VERSION - the upstream version of the generated tarball
 
 DESTDIR="../tarballs/geogebra-$VERSION"
 DESTTGZ="../tarballs/geogebra_$VERSION.orig.tar.gz"
+TEMPDIR="$(mktemp -d)"
 
 # Downloads code from SVN repository
 test -d ../tarballs/. || mkdir -p ../tarballs
@@ -13,17 +16,23 @@ svn export "http://geogebra.uni.lu/svn/tags/$TAG/geogebra/" "$DESTDIR"
 find "$DESTDIR" -name '*.jar' | xargs rm -vf
 
 # Removes code with problematic license
-rm -fr "$DESTDIR/installer"
-rm -fr "$DESTDIR/geogebra/kernel/complex"
-rm -f "$DESTDIR/geogebra/kernel/roots/RealRoot.java"
-rm -f "$DESTDIR/geogebra/kernel/roots/RealRootFunction.java"
+rm -vfr "$DESTDIR/installer"
+rm -vfr "$DESTDIR/geogebra/kernel/complex/Complex.java"
+rm -vfr "$DESTDIR/geogebra/kernel/complex/ComplexPoly.java"
+rm -vf "$DESTDIR/geogebra/kernel/roots/RealRoot.java"
+rm -vf "$DESTDIR/geogebra/kernel/roots/RealRootFunction.java"
+rm -vf "$DESTDIR/geogebra/kernel/integration/GaussQuadIntegration.java"
 
 # Removes embedded copies of other software
-rm -fr "$DESTDIR/org"
+rm -vfr "$DESTDIR/org"
+mv -v "$DESTDIR/geogebra/kernel/jama/GgbMat.java" "$TEMPDIR"
+rm -vfr "$DESTDIR/geogebra/kernel/jama/"*
+mv -v "$TEMPDIR/GgbMat.java" "$DESTDIR/geogebra/kernel/jama"
 
 # Builds tarball
-tar czf "$DESTTGZ" -C `dirname "$DESTDIR"` `basename "$DESTDIR"`
+tar czfv "$DESTTGZ" -C `dirname "$DESTDIR"` `basename "$DESTDIR"`
 
-# Deletes snapshot dir
+# Deletes snapshot and temporary dir
 rm -fr "$DESTDIR"
+rm -fr "$TEMPDIR"
 
diff --git a/debian/install b/debian/install
index c9e25e7..6a1e8de 100644
--- a/debian/install
+++ b/debian/install
@@ -1 +1,3 @@
 build/geogebra.jar build/geogebra_main.jar build/geogebra_gui.jar build/geogebra_cas.jar build/geogebra_export.jar build/geogebra_properties.jar usr/share/geogebra
+debian/geogebra.desktop usr/share/applications
+debian/geogebra.png usr/share/pixmaps
diff --git a/debian/rules b/debian/rules
index 1d8d87b..cdd4bbe 100755
--- a/debian/rules
+++ b/debian/rules
@@ -14,6 +14,8 @@ DEB_JARS := /usr/share/java/ant-nodeps.jar
 
 # Dependencies
 DEB_JARS += /usr/share/java/mathpiper.jar
+DEB_JARS += /usr/share/java/commons-math.jar
+DEB_JARS += /usr/share/java/jama.jar
 DEB_JARS += /usr/share/java/freehep-xml.jar
 DEB_JARS += /usr/share/java/freehep-util.jar
 DEB_JARS += /usr/share/java/freehep-graphics2d.jar
@@ -25,3 +27,6 @@ DEB_JARS += /usr/share/java/freehep-graphicsio-emf.jar
 install/geogebra::
 	install -m 755 $(CURDIR)/debian/geogebra.sh $(CURDIR)/debian/geogebra/usr/bin/geogebra
 
+get-orig-source:
+	./debian/get_orig_source.sh
+
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000..163aaf8
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/debian/source/include-binaries b/debian/source/include-binaries
new file mode 100644
index 0000000..c89dcaa
--- /dev/null
+++ b/debian/source/include-binaries
@@ -0,0 +1 @@
+debian/geogebra.png
diff --git a/geogebra/GeoGebra.java b/geogebra/GeoGebra.java
index 2fc7cce..e042af5 100644
--- a/geogebra/GeoGebra.java
+++ b/geogebra/GeoGebra.java
@@ -19,8 +19,9 @@ import java.net.URL;
 public class GeoGebra extends Object {
 	
 	// GeoGebra version
-	public static final String BUILD_DATE = "June 19, 2010";
-	public static final String VERSION_STRING = "3.2.42.0";
+	public static final String BUILD_DATE = "July 21, 2010";
+	
+	public static final String VERSION_STRING = "3.2.43.0";
 	public static final String SHORT_VERSION_STRING = "3.2"; // used for online archive
 		
 	// File format versions
diff --git a/geogebra/euclidian/DrawRay.java b/geogebra/euclidian/DrawRay.java
index 5e6553d..64d9f71 100644
--- a/geogebra/euclidian/DrawRay.java
+++ b/geogebra/euclidian/DrawRay.java
@@ -18,6 +18,7 @@ the Free Software Foundation.
 
 package geogebra.euclidian;
 
+import geogebra.euclidian.clipping.ClipLine;
 import geogebra.kernel.ConstructionDefaults;
 import geogebra.kernel.GeoElement;
 import geogebra.kernel.GeoLine;
@@ -55,8 +56,7 @@ implements Previewable {
     	this.view = view;
     	this.ray = ray;
     	geo = ray;
-    	    	
-    	
+
         update();
     }
     
@@ -79,18 +79,7 @@ implements Previewable {
         if (isVisible) { 
 			labelVisible = showLabel && geo.isLabelVisible();       
 			updateStrokes(ray);
-			
-			A = ray.getStartPoint();			
-			
-			// calc start point of ray in screen coords
-			a[0] = A.inhomX;
-			a[1] = A.inhomY;
-			view.toScreenCoords(a);
-
-			// calc direction vector of ray in screen coords
-			v[0] = ray.y * view.xscale;
-			v[1] = ray.x * view.yscale;
-			
+						
 			setClippedLine();
 			
 			 // line on screen?		
@@ -135,6 +124,16 @@ implements Previewable {
     }
     
     private void setClippedLine() {
+    	A = ray.getStartPoint();			
+		
+		// calc start point of ray in screen coords
+		A.getInhomCoords(a);
+		boolean onscreenA = view.toScreenCoords(a);
+
+		// calc direction vector of ray in screen coords
+		v[0] = ray.y * view.xscale;
+		v[1] = ray.x * view.yscale;
+		    	    	
 		// calc clip point C = a + lambda * v
 		double lambda;
 		if (Math.abs(v[0]) > Math.abs(v[1])) {
@@ -154,7 +153,21 @@ implements Previewable {
 			return;
 		}
 
-		line.setLine( a[0], a[1],  a[0] + 100*lambda * v[0], a[1] + 100*lambda * v[1]);		  
+		if (onscreenA ) {
+			// A on screen
+			line.setLine(a[0], a[1],  a[0] + lambda * v[0], a[1] + lambda * v[1]);
+		} else {
+			// A off screen
+			// clip ray at screen, that's important for huge coordinates of A
+			Point2D.Double [] clippedPoints = 
+				ClipLine.getClipped(a[0], a[1],  a[0] + lambda * v[0], a[1] + lambda * v[1], -EuclidianView.CLIP_DISTANCE, view.width + EuclidianView.CLIP_DISTANCE, -EuclidianView.CLIP_DISTANCE, view.height + EuclidianView.CLIP_DISTANCE);
+			if (clippedPoints == null) {
+				isVisible = false;	
+			} else {
+				line.setLine(clippedPoints[0].x, clippedPoints[0].y, clippedPoints[1].x, clippedPoints[1].y);
+			}
+		}
+		
     }
     
     final public void draw(Graphics2D g2) {
diff --git a/geogebra/euclidian/EuclidianController.java b/geogebra/euclidian/EuclidianController.java
index b65b0bd..0ad753f 100644
--- a/geogebra/euclidian/EuclidianController.java
+++ b/geogebra/euclidian/EuclidianController.java
@@ -1016,6 +1016,7 @@ MouseMotionListener, MouseWheelListener, ComponentListener {
 			// important for electronic whiteboards
 			if (movedGeoBoolean.isCheckboxFixed()) {
 				movedGeoBoolean.setValue(!movedGeoBoolean.getBoolean());
+				app.removeSelectedGeo(movedGeoBoolean); // make sure it doesn't get selected
 				movedGeoBoolean.updateCascade();
 
 			} 
@@ -1502,6 +1503,7 @@ MouseMotionListener, MouseWheelListener, ComponentListener {
 					GeoBoolean bool = (GeoBoolean)(hits.get(0));
 					if (!bool.isCheckboxFixed()) { // otherwise changed on mouse down
 						bool.setValue(!bool.getBoolean());
+						app.removeSelectedGeo(bool); // make sure doesn't get selected
 						bool.updateCascade();
 					}
 				}
diff --git a/geogebra/gui/ContextMenuGeoElement.java b/geogebra/gui/ContextMenuGeoElement.java
index 8e98e11..630565c 100644
--- a/geogebra/gui/ContextMenuGeoElement.java
+++ b/geogebra/gui/ContextMenuGeoElement.java
@@ -364,7 +364,7 @@ public class ContextMenuGeoElement extends JPopupMenu {
     		final GeoText geoText = (GeoText) geo;
     		 // show object
         	JCheckBoxMenuItem cbItem = new JCheckBoxMenuItem(app.getPlain("AbsoluteScreenLocation"));
-        	cbItem.setIcon(app.getEmptyIcon());
+        	app.setEmptyIcon(cbItem);
             cbItem.setSelected(geoText.isAbsoluteScreenLocActive());
             cbItem.addActionListener(new ActionListener() {
         		public void actionPerformed(ActionEvent e) {
@@ -457,7 +457,7 @@ public class ContextMenuGeoElement extends JPopupMenu {
             //  animation
             if (geo.isAnimatable()) {            	
                 cbItem = new JCheckBoxMenuItem( app.getPlain("Animating"));
-                cbItem.setIcon(app.getEmptyIcon());
+                app.setEmptyIcon(cbItem);
                 cbItem.setSelected(((GeoNumeric) geo).isAnimating() && app.getKernel().getAnimatonManager().isRunning());
                 cbItem.addActionListener(new ActionListener() {
                 	public void actionPerformed(ActionEvent e) {
@@ -498,7 +498,7 @@ public class ContextMenuGeoElement extends JPopupMenu {
             if (geo.isFixable() && (geo.isGeoText() || geo.isGeoImage())) {   
             	
             	cbItem = new JCheckBoxMenuItem( app.getPlain("FixObject"));
-                cbItem.setIcon(app.getEmptyIcon());
+                app.setEmptyIcon(cbItem);
                 cbItem.setSelected(geo.isFixed());
                 cbItem.addActionListener(new ActionListener() {
                 	public void actionPerformed(ActionEvent e) {
diff --git a/geogebra/gui/PropertiesDialogGeoElement.java b/geogebra/gui/PropertiesDialogGeoElement.java
index 9ed7cb0..9d57076 100644
--- a/geogebra/gui/PropertiesDialogGeoElement.java
+++ b/geogebra/gui/PropertiesDialogGeoElement.java
@@ -5248,6 +5248,7 @@ class ColorFunctionPanel
 				for (int i=0; i < geos.length; i++) {
 					GeoElement geo = (GeoElement) geos[i];	
 					geo.removeColorFunction();
+					geo.setObjColor(geo.getObjectColor());
 					geo.updateRepaint();
 				}
 				tfRed.setText("");
diff --git a/geogebra/gui/TextInputDialog.java b/geogebra/gui/TextInputDialog.java
index cd8aff7..c8f50e4 100644
--- a/geogebra/gui/TextInputDialog.java
+++ b/geogebra/gui/TextInputDialog.java
@@ -153,11 +153,11 @@ public class TextInputDialog extends InputDialog {
 						break;
 						
 					case 8: // 2x2 matrix
-						insertString("\\left(\\begin{array} a & b \\\\ c & d \\\\ \\end{array}\\right)");						
+						insertString("\\left(\\begin{array}{} a & b \\\\ c & d \\\\ \\end{array}\\right)");						
 						break;
 						
 					case 9: // 3x3 matrix
-						insertString("\\left(\\begin{array} a & b & c \\\\ d & e & f \\\\ g & h & i \\\\ \\end{array}\\right)");						
+						insertString("\\left(\\begin{array}{} a & b & c \\\\ d & e & f \\\\ g & h & i \\\\ \\end{array}\\right)");						
 						break;
 						
 					default:
diff --git a/geogebra/gui/menubar/MenubarImpl.java b/geogebra/gui/menubar/MenubarImpl.java
index 3658f3c..7a24880 100644
--- a/geogebra/gui/menubar/MenubarImpl.java
+++ b/geogebra/gui/menubar/MenubarImpl.java
@@ -331,45 +331,50 @@ public abstract class MenubarImpl extends JMenuBar implements Menubar {
 		menu.addSeparator();
 
 		cbShowAlgebraView = new JCheckBoxMenuItem(showAlgebraViewAction);		
-		cbShowAlgebraView.setIcon(app.getEmptyIcon());
+		app.setEmptyIcon(cbShowAlgebraView);
 		cbShowAlgebraView.setSelected(app.showAlgebraView());
 		setMenuShortCutShiftAccelerator(cbShowAlgebraView, 'A');
 		menu.add(cbShowAlgebraView);
 
 	    // Michael Borcherds 2008-01-14
 		cbShowSpreadsheet = new JCheckBoxMenuItem(showSpreadsheetAction);		
-		cbShowSpreadsheet.setIcon(app.getEmptyIcon());
+		app.setEmptyIcon(cbShowSpreadsheet);
 		cbShowSpreadsheet.setSelected(app.showSpreadsheetView());	
 		setMenuShortCutShiftAccelerator(cbShowSpreadsheet, 'S');
 		menu.add(cbShowSpreadsheet);		
 		
 		cbShowAuxiliaryObjects = new JCheckBoxMenuItem(
 				showAuxiliaryObjectsAction);
-		cbShowAuxiliaryObjects.setIcon(app.getEmptyIcon());
+		app.setEmptyIcon(cbShowAuxiliaryObjects);
 		cbShowAuxiliaryObjects.setSelected(app.showAuxiliaryObjects());
 		menu.add(cbShowAuxiliaryObjects);
 
 		cbHorizontalSplit = new JCheckBoxMenuItem(horizontalSplitAction);				
-		cbHorizontalSplit.setIcon(app.getEmptyIcon());
+		app.setEmptyIcon(cbHorizontalSplit);
 		menu.add(cbHorizontalSplit);
 
 		menu.addSeparator();
 
 		// show/hide cmdlist, algebra input
-		cbShowAlgebraInput = new JCheckBoxMenuItem(showAlgebraInputAction);		
+		cbShowAlgebraInput = new JCheckBoxMenuItem(showAlgebraInputAction);	
+		app.setEmptyIcon(cbShowAlgebraInput);
 		menu.add(cbShowAlgebraInput);
 
-		cbShowCmdList = new JCheckBoxMenuItem(showCmdListAction);		
+		cbShowCmdList = new JCheckBoxMenuItem(showCmdListAction);	
+		app.setEmptyIcon(cbShowCmdList);
 		menu.add(cbShowCmdList);
 		menu.addSeparator();
 
 		// Construction Protocol
 		cbShowConsProtNavigation = new JCheckBoxMenuItem(
 				showConsProtNavigationAction);
+		app.setEmptyIcon(cbShowConsProtNavigation);
 		cbShowConsProtNavigationPlay = new JCheckBoxMenuItem(
 				showConsProtNavigationPlayAction);
+		app.setEmptyIcon(cbShowConsProtNavigationPlay);
 		cbShowConsProtNavigationOpenProt = new JCheckBoxMenuItem(
 				showConsProtNavigationOpenProtAction);	
+		app.setEmptyIcon(cbShowConsProtNavigationOpenProt);
 		menu.add(constProtocolAction);
 		menu.add(cbShowConsProtNavigation);
 		menu.add(cbShowConsProtNavigationPlay);
@@ -690,8 +695,7 @@ public abstract class MenubarImpl extends JMenuBar implements Menubar {
 			}
 		};
 
-		showAlgebraInputAction = new AbstractAction(app.getMenu("InputField"),
-				app.getEmptyIcon()) {
+		showAlgebraInputAction = new AbstractAction(app.getMenu("InputField")) {
 			private static final long serialVersionUID = 1L;
 
 			public void actionPerformed(ActionEvent e) {
@@ -702,8 +706,7 @@ public abstract class MenubarImpl extends JMenuBar implements Menubar {
 			}
 		};
 
-		showCmdListAction = new AbstractAction(app.getMenu("CmdList"),
-				app.getEmptyIcon()) {
+		showCmdListAction = new AbstractAction(app.getMenu("CmdList")) {
 			private static final long serialVersionUID = 1L;
 
 			public void actionPerformed(ActionEvent e) {
@@ -739,8 +742,7 @@ public abstract class MenubarImpl extends JMenuBar implements Menubar {
 		};
 
 		showConsProtNavigationAction = new AbstractAction(
-				app.getPlain("ConstructionProtocolNavigation"),
-				app.getEmptyIcon()) {
+				app.getPlain("ConstructionProtocolNavigation")) {
 			private static final long serialVersionUID = 1L;
 
 			public void actionPerformed(ActionEvent e) {
@@ -753,8 +755,7 @@ public abstract class MenubarImpl extends JMenuBar implements Menubar {
 		};
 
 		showConsProtNavigationPlayAction = new AbstractAction(
-				app.getPlain("PlayButton"),
-				app.getEmptyIcon()) {
+				app.getPlain("PlayButton")) {
 			private static final long serialVersionUID = 1L;
 
 			public void actionPerformed(ActionEvent e) {
@@ -770,8 +771,7 @@ public abstract class MenubarImpl extends JMenuBar implements Menubar {
 		};
 
 		showConsProtNavigationOpenProtAction = new AbstractAction(
-				app.getPlain("ConstructionProtocolButton"),
-				app.getEmptyIcon()) {
+				app.getPlain("ConstructionProtocolButton")) {
 			private static final long serialVersionUID = 1L;
 
 			public void actionPerformed(ActionEvent e) {
@@ -1755,6 +1755,6 @@ public abstract class MenubarImpl extends JMenuBar implements Menubar {
         }
     }
     
-    
+
   
 }
diff --git a/geogebra/kernel/AlgoAppend.java b/geogebra/kernel/AlgoAppend.java
index ddc7508..4a42cd0 100644
--- a/geogebra/kernel/AlgoAppend.java
+++ b/geogebra/kernel/AlgoAppend.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoBinomial.java b/geogebra/kernel/AlgoBinomial.java
index 2416f74..8bdab5e 100644
--- a/geogebra/kernel/AlgoBinomial.java
+++ b/geogebra/kernel/AlgoBinomial.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoDefined.java b/geogebra/kernel/AlgoDefined.java
index 3b4fddf..13c5388 100644
--- a/geogebra/kernel/AlgoDefined.java
+++ b/geogebra/kernel/AlgoDefined.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoDeterminant.java b/geogebra/kernel/AlgoDeterminant.java
index 93a3106..af4c8e7 100644
--- a/geogebra/kernel/AlgoDeterminant.java
+++ b/geogebra/kernel/AlgoDeterminant.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoExpand.java b/geogebra/kernel/AlgoExpand.java
index e04a8ff..4046af8 100644
--- a/geogebra/kernel/AlgoExpand.java
+++ b/geogebra/kernel/AlgoExpand.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoFactor.java b/geogebra/kernel/AlgoFactor.java
index 2e84177..5ac9aa3 100644
--- a/geogebra/kernel/AlgoFactor.java
+++ b/geogebra/kernel/AlgoFactor.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoFirst.java b/geogebra/kernel/AlgoFirst.java
index 1c5faf7..c8c61ec 100644
--- a/geogebra/kernel/AlgoFirst.java
+++ b/geogebra/kernel/AlgoFirst.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoGCD.java b/geogebra/kernel/AlgoGCD.java
index 1088cf6..0f368a8 100644
--- a/geogebra/kernel/AlgoGCD.java
+++ b/geogebra/kernel/AlgoGCD.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoInsert.java b/geogebra/kernel/AlgoInsert.java
index 8cc255d..c3e62b6 100644
--- a/geogebra/kernel/AlgoInsert.java
+++ b/geogebra/kernel/AlgoInsert.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoIntersection.java b/geogebra/kernel/AlgoIntersection.java
index bc64162..8e5107b 100644
--- a/geogebra/kernel/AlgoIntersection.java
+++ b/geogebra/kernel/AlgoIntersection.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoInvert.java b/geogebra/kernel/AlgoInvert.java
index 0934f2f..b7493eb 100644
--- a/geogebra/kernel/AlgoInvert.java
+++ b/geogebra/kernel/AlgoInvert.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoIsInteger.java b/geogebra/kernel/AlgoIsInteger.java
index 1a502fc..f577369 100644
--- a/geogebra/kernel/AlgoIsInteger.java
+++ b/geogebra/kernel/AlgoIsInteger.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoJoin.java b/geogebra/kernel/AlgoJoin.java
index e40a242..0dd7921 100644
--- a/geogebra/kernel/AlgoJoin.java
+++ b/geogebra/kernel/AlgoJoin.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
  */
diff --git a/geogebra/kernel/AlgoKeepIf.java b/geogebra/kernel/AlgoKeepIf.java
index fb68ed7..4bfe9f0 100644
--- a/geogebra/kernel/AlgoKeepIf.java
+++ b/geogebra/kernel/AlgoKeepIf.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoLCM.java b/geogebra/kernel/AlgoLCM.java
index 4b5ae1c..96c36bd 100644
--- a/geogebra/kernel/AlgoLCM.java
+++ b/geogebra/kernel/AlgoLCM.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoLast.java b/geogebra/kernel/AlgoLast.java
index df84d65..22ec5aa 100644
--- a/geogebra/kernel/AlgoLast.java
+++ b/geogebra/kernel/AlgoLast.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoListGCD.java b/geogebra/kernel/AlgoListGCD.java
index 6ff6c29..fdd8575 100644
--- a/geogebra/kernel/AlgoListGCD.java
+++ b/geogebra/kernel/AlgoListGCD.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoListLCM.java b/geogebra/kernel/AlgoListLCM.java
index d61845c..34081dc 100644
--- a/geogebra/kernel/AlgoListLCM.java
+++ b/geogebra/kernel/AlgoListLCM.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoPolynomialFromCoordinates.java b/geogebra/kernel/AlgoPolynomialFromCoordinates.java
index 5d2c7e8..78caa0b 100644
--- a/geogebra/kernel/AlgoPolynomialFromCoordinates.java
+++ b/geogebra/kernel/AlgoPolynomialFromCoordinates.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoPolynomialFromFunction.java b/geogebra/kernel/AlgoPolynomialFromFunction.java
index afdcc9c..9522ab7 100644
--- a/geogebra/kernel/AlgoPolynomialFromFunction.java
+++ b/geogebra/kernel/AlgoPolynomialFromFunction.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoRemoveUndefined.java b/geogebra/kernel/AlgoRemoveUndefined.java
index c551d59..2aa4c66 100644
--- a/geogebra/kernel/AlgoRemoveUndefined.java
+++ b/geogebra/kernel/AlgoRemoveUndefined.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoReverse.java b/geogebra/kernel/AlgoReverse.java
index be0a5bb..9ce27bd 100644
--- a/geogebra/kernel/AlgoReverse.java
+++ b/geogebra/kernel/AlgoReverse.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoSimplify.java b/geogebra/kernel/AlgoSimplify.java
index 6f754c2..bd8f21e 100644
--- a/geogebra/kernel/AlgoSimplify.java
+++ b/geogebra/kernel/AlgoSimplify.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoSort.java b/geogebra/kernel/AlgoSort.java
index 87e38bf..b228dc2 100644
--- a/geogebra/kernel/AlgoSort.java
+++ b/geogebra/kernel/AlgoSort.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoTake.java b/geogebra/kernel/AlgoTake.java
index 04b83c7..7fa3bc6 100644
--- a/geogebra/kernel/AlgoTake.java
+++ b/geogebra/kernel/AlgoTake.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoTranspose.java b/geogebra/kernel/AlgoTranspose.java
index 282466c..4147a4f 100644
--- a/geogebra/kernel/AlgoTranspose.java
+++ b/geogebra/kernel/AlgoTranspose.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/AlgoUnion.java b/geogebra/kernel/AlgoUnion.java
index 1234c5d..299b685 100644
--- a/geogebra/kernel/AlgoUnion.java
+++ b/geogebra/kernel/AlgoUnion.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/GeoElement.java b/geogebra/kernel/GeoElement.java
index e4f43e0..bb5ccd9 100644
--- a/geogebra/kernel/GeoElement.java
+++ b/geogebra/kernel/GeoElement.java
@@ -2051,10 +2051,24 @@ public abstract class GeoElement
 		// remove this object from List
 		if (isIndependent()) 
 			cons.removeFromConstructionList(this);
+		
+		// remove Listeners
+		AlgoElement algo = getParentAlgorithm();
+		if (algo instanceof EuclidianViewAlgo) {
+			cons.unregisterEuclidianViewAlgo((EuclidianViewAlgo)algo);
+		}
+
+		if (condShowObject != null) {
+			condShowObject.unregisterConditionListener(this);
+		}
+				
+		if (colFunction != null) {
+			colFunction.unregisterColorFunctionListener(this);
+		}
+
 
 		// remove all dependent algorithms		
 		if (algorithmList != null) {
-			AlgoElement algo;
 			Object[] algos = algorithmList.toArray();
 			for (int i = 0; i < algos.length; i++) {
 				algo = (AlgoElement) algos[i];
@@ -2068,8 +2082,8 @@ public abstract class GeoElement
 		}
 
 		// remove from selection
-		app.removeSelectedGeo(this, false);					
-				
+		app.removeSelectedGeo(this, false);		
+		
 		// notify views before we change labelSet
 		notifyRemove();
 		
diff --git a/geogebra/kernel/GeoList.java b/geogebra/kernel/GeoList.java
index c2bfc75..b3cf03d 100644
--- a/geogebra/kernel/GeoList.java
+++ b/geogebra/kernel/GeoList.java
@@ -163,6 +163,8 @@ public class GeoList extends GeoElement implements ListValue, LineProperties, Po
 			// copy color function
 			if (this.colFunction != null) {
 				geo.setColorFunction(this.colFunction);
+			} else {
+				geo.removeColorFunction();
 			}
 			
 			geo.setLineThickness(this.getLineThickness());
@@ -204,8 +206,9 @@ public class GeoList extends GeoElement implements ListValue, LineProperties, Po
     	int size = geoList.size();	        
         for (int i=0; i < size; i++) {
 			GeoElement geo = (GeoElement)geoList.get(i);
-			if (!geo.isLabelSet())
+			if (!geo.isLabelSet()) {
         		geo.removeColorFunction();
+			}
         }
 	}
 	
diff --git a/geogebra/kernel/GeoPolygon.java b/geogebra/kernel/GeoPolygon.java
index d83bf7c..554a423 100644
--- a/geogebra/kernel/GeoPolygon.java
+++ b/geogebra/kernel/GeoPolygon.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/Kernel.java b/geogebra/kernel/Kernel.java
index 0e4d7fe..d0256ab 100644
--- a/geogebra/kernel/Kernel.java
+++ b/geogebra/kernel/Kernel.java
@@ -4939,17 +4939,17 @@ public class Kernel {
 	}
 
 	/**
-	 * Returns whether x is greater than y
+	 * Returns whether x is greater than y	 	 
 	 */
 	final public boolean isGreater(double x, double y) {
-		return x > y;
+		return x > y + EPSILON;
 	}
-
+	
 	/**
-	 * Returns whether x is greater than or equal to y
+	 * Returns whether x is greater than or equal to y	 	 
 	 */
 	final public boolean isGreaterEqual(double x, double y) {
-		return x > y || isEqual(x, y);
+		return x + EPSILON > y;
 	}
 
 	// compares double arrays:
diff --git a/geogebra/kernel/integration/GaussQuadIntegration.java b/geogebra/kernel/integration/GaussQuadIntegration.java
deleted file mode 100644
index 6dc35a0..0000000
--- a/geogebra/kernel/integration/GaussQuadIntegration.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- *   changed by: Markus Hohenwarter (10. August 2004)
- * base on the following 
- *
-*   Class Integration
-*       interface RealRootFunction also required
-*
-*   Contains the methods for Gaussian-Legendre quadrature
-*
-*
-*   WRITTEN BY: Michael Thomas Flanagan
-*
-*   DATE:	 February 2002
-*   UPDATE:  22 June 2003
-*
-*   DOCUMENTATION:
-*   See Michael Thomas Flanagan's JAVA library on-line web page:
-*   Integration.html
-*
-*   Copyright (c) April 2004
-*
-*   PERMISSION TO COPY:
-*   Permission to use, copy and modify this software and its documentation for
-*   NON-COMMERCIAL purposes is granted, without fee, provided that an acknowledgement
-*   to the author, Michael Thomas Flanagan at www.ee.ucl.ac.uk/~mflanaga, appears in all copies.
-*
-*   Dr Michael Thomas Flanagan makes no representations about the suitability
-*   or fitness of the software for any or for a particular purpose.
-*   Michael Thomas Flanagan shall not be liable for any damages suffered
-*   as a result of using, modifying or distributing this software or its derivatives.
-*
-***************************************************************************************/
-
-package geogebra.kernel.integration;
-
-import geogebra.kernel.roots.RealRootFunction;
-
-// Numerical integration class
-public class GaussQuadIntegration{
-
-		private int nPoints;
-		private double[] gaussQuadDist;
-		private double[] gaussQuadWeight;
-		
-        public GaussQuadIntegration(int points){
-			nPoints = points;
-			gaussQuadDist = new double[nPoints];
-			gaussQuadWeight = new double[nPoints];
-			
-			// Calculate coefficients
-			gaussQuadCoeff(gaussQuadDist, gaussQuadWeight, nPoints);
-        }
-
-    	// Numerical integration using n point Gaussian-Legendre quadrature
-    	final public double integrate(RealRootFunction g, double lowerLimit, double upperLimit){ 
-        	double sum=0.0D;
-        	double xplus = 0.5D*(upperLimit + lowerLimit);
-        	double xminus = 0.5D*(upperLimit - lowerLimit);
-        	double dx = 0.0D;
-
-        	// Perform summation
-        	for(int i=0; i<nPoints; i++){
-            		dx = xminus*gaussQuadDist[i];
-            		sum += gaussQuadWeight[i]*g.evaluate(xplus+dx);
-        	}
-        	return sum*xminus;   // rescale and return
-    	}
-
-    	// Returns the distance (guassQuadDist) and weight coefficients (gaussQuadCoeff)
-    	// for an n point Gauss-Legendre Quadrature.
-    	// The Gauss-Legendre distances, gaussQuadDist, are scaled to -1 to 1
-    	// See Numerical Recipes for details
-    	final public void gaussQuadCoeff(double[] guassQuadDist, double[] guassQuadWeight, int n){
-
-	    	double	z=0.0D, z1=0.0D;
-		    double  pp=0.0D, p1=0.0D, p2=0.0D, p3=0.0D;
-
-	    	double 	eps = 3e-11;	// set required precision
-	    	double	x1 = -1.0D;		// lower limit
-	    	double	x2 = 1.0D;		// upper limit
-
-	    	//  Calculate roots
-	    	// Roots are symmetrical - only half calculated
-	    	int m  = (n+1)/2;
-	    	double	xm = 0.5D*(x2+x1);
-	    	double	xl = 0.5D*(x2-x1);
-
-	    	// Loop for  each root
-	    	for(int i=1; i<=m; i++){
-			// Approximation of ith root
-		    	z = Math.cos(Math.PI*(i-0.25D)/(n+0.5D));
-
-		    	// Refinement on above using Newton's method
-		    	do{
-			    	p1 = 1.0D;
-			    	p2 = 0.0D;
-
-			    	// Legendre polynomial (p1, evaluated at z, p2 is polynomial of
-			    	//  one order lower) recurrence relationsip
-			    	for(int j=1; j<=n; j++){
-				    	p3 = p2;
-				    	p2 = p1;
-				    	p1= ((2.0D*j - 1.0D)*z*p2 - (j - 1.0D)*p3)/j;
-			    	}
-			    	pp = n*(z*p1 - p2)/(z*z - 1.0D);    // Derivative of p1
-			    	z1 = z;
-			    	z = z1 - p1/pp;			            // Newton's method
-		    	} while(Math.abs(z - z1) > eps);
-
-		    	guassQuadDist[i-1] = xm - xl*z;		    // Scale root to desired interval
-		    	guassQuadDist[n-i] = xm + xl*z;		    // Symmetric counterpart
-		    	guassQuadWeight[i-1] = 2.0*xl/((1.0 - z*z)*pp*pp);	// Compute weight
-		    	guassQuadWeight[n-i] = guassQuadWeight[i-1];		// Symmetric counterpart
-	    	}
-    	}
-}
diff --git a/geogebra/kernel/jama/CholeskyDecomposition.java b/geogebra/kernel/jama/CholeskyDecomposition.java
deleted file mode 100644
index c24b073..0000000
--- a/geogebra/kernel/jama/CholeskyDecomposition.java
+++ /dev/null
@@ -1,199 +0,0 @@
-package geogebra.kernel.jama;
-
-   /** Cholesky Decomposition.
-   <P>
-   For a symmetric, positive definite matrix A, the Cholesky decomposition
-   is an lower triangular matrix L so that A = L*L'.
-   <P>
-   If the matrix is not symmetric or positive definite, the constructor
-   returns a partial decomposition and sets an internal flag that may
-   be queried by the isSPD() method.
-   */
-
-public class CholeskyDecomposition implements java.io.Serializable {
-
-/* ------------------------
-   Class variables
- * ------------------------ */
-
-   /** Array for internal storage of decomposition.
-   @serial internal array storage.
-   */
-   private double[][] L;
-
-   /** Row and column dimension (square matrix).
-   @serial matrix dimension.
-   */
-   private int n;
-
-   /** Symmetric and positive definite flag.
-   @serial is symmetric and positive definite flag.
-   */
-   private boolean isspd;
-
-/* ------------------------
-   Constructor
- * ------------------------ */
-
-   /** Cholesky algorithm for symmetric and positive definite matrix.
-   @param  A   Square, symmetric matrix.
-   @return     Structure to access L and isspd flag.
-   */
-
-   public CholeskyDecomposition (Matrix Arg) {
-
-
-     // Initialize.
-      double[][] A = Arg.getArray();
-      n = Arg.getRowDimension();
-      L = new double[n][n];
-      isspd = (Arg.getColumnDimension() == n);
-      // Main loop.
-      for (int j = 0; j < n; j++) {
-         double[] Lrowj = L[j];
-         double d = 0.0;
-         for (int k = 0; k < j; k++) {
-            double[] Lrowk = L[k];
-            double s = 0.0;
-            for (int i = 0; i < k; i++) {
-               s += Lrowk[i]*Lrowj[i];
-            }
-            Lrowj[k] = s = (A[j][k] - s)/L[k][k];
-            d = d + s*s;
-            isspd = isspd & (A[k][j] == A[j][k]); 
-         }
-         d = A[j][j] - d;
-         isspd = isspd & (d > 0.0);
-         L[j][j] = Math.sqrt(Math.max(d,0.0));
-         for (int k = j+1; k < n; k++) {
-            L[j][k] = 0.0;
-         }
-      }
-   }
-
-/* ------------------------
-   Temporary, experimental code.
- * ------------------------ *\
-
-   \** Right Triangular Cholesky Decomposition.
-   <P>
-   For a symmetric, positive definite matrix A, the Right Cholesky
-   decomposition is an upper triangular matrix R so that A = R'*R.
-   This constructor computes R with the Fortran inspired column oriented
-   algorithm used in LINPACK and MATLAB.  In Java, we suspect a row oriented,
-   lower triangular decomposition is faster.  We have temporarily included
-   this constructor here until timing experiments confirm this suspicion.
-   *\
-
-   \** Array for internal storage of right triangular decomposition. **\
-   private transient double[][] R;
-
-   \** Cholesky algorithm for symmetric and positive definite matrix.
-   @param  A           Square, symmetric matrix.
-   @param  rightflag   Actual value ignored.
-   @return             Structure to access R and isspd flag.
-   *\
-
-   public CholeskyDecomposition (Matrix Arg, int rightflag) {
-      // Initialize.
-      double[][] A = Arg.getArray();
-      n = Arg.getColumnDimension();
-      R = new double[n][n];
-      isspd = (Arg.getColumnDimension() == n);
-      // Main loop.
-      for (int j = 0; j < n; j++) {
-         double d = 0.0;
-         for (int k = 0; k < j; k++) {
-            double s = A[k][j];
-            for (int i = 0; i < k; i++) {
-               s = s - R[i][k]*R[i][j];
-            }
-            R[k][j] = s = s/R[k][k];
-            d = d + s*s;
-            isspd = isspd & (A[k][j] == A[j][k]); 
-         }
-         d = A[j][j] - d;
-         isspd = isspd & (d > 0.0);
-         R[j][j] = Math.sqrt(Math.max(d,0.0));
-         for (int k = j+1; k < n; k++) {
-            R[k][j] = 0.0;
-         }
-      }
-   }
-
-   \** Return upper triangular factor.
-   @return     R
-   *\
-
-   public Matrix getR () {
-      return new Matrix(R,n,n);
-   }
-
-\* ------------------------
-   End of temporary code.
- * ------------------------ */
-
-/* ------------------------
-   Public Methods
- * ------------------------ */
-
-   /** Is the matrix symmetric and positive definite?
-   @return     true if A is symmetric and positive definite.
-   */
-
-   public boolean isSPD () {
-      return isspd;
-   }
-
-   /** Return triangular factor.
-   @return     L
-   */
-
-   public Matrix getL () {
-      return new Matrix(L,n,n);
-   }
-
-   /** Solve A*X = B
-   @param  B   A Matrix with as many rows as A and any number of columns.
-   @return     X so that L*L'*X = B
-   @exception  IllegalArgumentException  Matrix row dimensions must agree.
-   @exception  RuntimeException  Matrix is not symmetric positive definite.
-   */
-
-   public Matrix solve (Matrix B) {
-      if (B.getRowDimension() != n) {
-         throw new IllegalArgumentException("Matrix row dimensions must agree.");
-      }
-      if (!isspd) {
-         throw new RuntimeException("Matrix is not symmetric positive definite.");
-      }
-
-      // Copy right hand side.
-      double[][] X = B.getArrayCopy();
-      int nx = B.getColumnDimension();
-
-	      // Solve L*Y = B;
-	      for (int k = 0; k < n; k++) {
-	        for (int j = 0; j < nx; j++) {
-	           for (int i = 0; i < k ; i++) {
-	               X[k][j] -= X[i][j]*L[k][i];
-	           }
-	           X[k][j] /= L[k][k];
-	        }
-	      }
-	
-	      // Solve L'*X = Y;
-	      for (int k = n-1; k >= 0; k--) {
-	        for (int j = 0; j < nx; j++) {
-	           for (int i = k+1; i < n ; i++) {
-	               X[k][j] -= X[i][j]*L[i][k];
-	           }
-	           X[k][j] /= L[k][k];
-	        }
-	      }
-      
-      
-      return new Matrix(X,n,nx);
-   }
-}
-
diff --git a/geogebra/kernel/jama/EigenvalueDecomposition.java b/geogebra/kernel/jama/EigenvalueDecomposition.java
deleted file mode 100644
index d4dd03c..0000000
--- a/geogebra/kernel/jama/EigenvalueDecomposition.java
+++ /dev/null
@@ -1,955 +0,0 @@
-package geogebra.kernel.jama;
-import geogebra.kernel.jama.util.*;
-
-/** Eigenvalues and eigenvectors of a real matrix. 
-<P>
-    If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is
-    diagonal and the eigenvector matrix V is orthogonal.
-    I.e. A = V.times(D.times(V.transpose())) and 
-    V.times(V.transpose()) equals the identity matrix.
-<P>
-    If A is not symmetric, then the eigenvalue matrix D is block diagonal
-    with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues,
-    lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda].  The
-    columns of V represent the eigenvectors in the sense that A*V = V*D,
-    i.e. A.times(V) equals V.times(D).  The matrix V may be badly
-    conditioned, or even singular, so the validity of the equation
-    A = V*D*inverse(V) depends upon V.cond().
-**/
-
-public class EigenvalueDecomposition implements java.io.Serializable {
-
-/* ------------------------
-   Class variables
- * ------------------------ */
-
-   /** Row and column dimension (square matrix).
-   @serial matrix dimension.
-   */
-   private int n;
-
-   /** Symmetry flag.
-   @serial internal symmetry flag.
-   */
-   private boolean issymmetric;
-
-   /** Arrays for internal storage of eigenvalues.
-   @serial internal storage of eigenvalues.
-   */
-   private double[] d, e;
-
-   /** Array for internal storage of eigenvectors.
-   @serial internal storage of eigenvectors.
-   */
-   private double[][] V;
-
-   /** Array for internal storage of nonsymmetric Hessenberg form.
-   @serial internal storage of nonsymmetric Hessenberg form.
-   */
-   private double[][] H;
-
-   /** Working storage for nonsymmetric algorithm.
-   @serial working storage for nonsymmetric algorithm.
-   */
-   private double[] ort;
-
-/* ------------------------
-   Private Methods
- * ------------------------ */
-
-   // Symmetric Householder reduction to tridiagonal form.
-
-   private void tred2 () {
-
-   //  This is derived from the Algol procedures tred2 by
-   //  Bowdler, Martin, Reinsch, and Wilkinson, Handbook for
-   //  Auto. Comp., Vol.ii-Linear Algebra, and the corresponding
-   //  Fortran subroutine in EISPACK.
-
-      for (int j = 0; j < n; j++) {
-         d[j] = V[n-1][j];
-      }
-
-      // Householder reduction to tridiagonal form.
-   
-      for (int i = n-1; i > 0; i--) {
-   
-         // Scale to avoid under/overflow.
-   
-         double scale = 0.0;
-         double h = 0.0;
-         for (int k = 0; k < i; k++) {
-            scale = scale + Math.abs(d[k]);
-         }
-         if (scale == 0.0) {
-            e[i] = d[i-1];
-            for (int j = 0; j < i; j++) {
-               d[j] = V[i-1][j];
-               V[i][j] = 0.0;
-               V[j][i] = 0.0;
-            }
-         } else {
-   
-            // Generate Householder vector.
-   
-            for (int k = 0; k < i; k++) {
-               d[k] /= scale;
-               h += d[k] * d[k];
-            }
-            double f = d[i-1];
-            double g = Math.sqrt(h);
-            if (f > 0) {
-               g = -g;
-            }
-            e[i] = scale * g;
-            h = h - f * g;
-            d[i-1] = f - g;
-            for (int j = 0; j < i; j++) {
-               e[j] = 0.0;
-            }
-   
-            // Apply similarity transformation to remaining columns.
-   
-            for (int j = 0; j < i; j++) {
-               f = d[j];
-               V[j][i] = f;
-               g = e[j] + V[j][j] * f;
-               for (int k = j+1; k <= i-1; k++) {
-                  g += V[k][j] * d[k];
-                  e[k] += V[k][j] * f;
-               }
-               e[j] = g;
-            }
-            f = 0.0;
-            for (int j = 0; j < i; j++) {
-               e[j] /= h;
-               f += e[j] * d[j];
-            }
-            double hh = f / (h + h);
-            for (int j = 0; j < i; j++) {
-               e[j] -= hh * d[j];
-            }
-            for (int j = 0; j < i; j++) {
-               f = d[j];
-               g = e[j];
-               for (int k = j; k <= i-1; k++) {
-                  V[k][j] -= (f * e[k] + g * d[k]);
-               }
-               d[j] = V[i-1][j];
-               V[i][j] = 0.0;
-            }
-         }
-         d[i] = h;
-      }
-   
-      // Accumulate transformations.
-   
-      for (int i = 0; i < n-1; i++) {
-         V[n-1][i] = V[i][i];
-         V[i][i] = 1.0;
-         double h = d[i+1];
-         if (h != 0.0) {
-            for (int k = 0; k <= i; k++) {
-               d[k] = V[k][i+1] / h;
-            }
-            for (int j = 0; j <= i; j++) {
-               double g = 0.0;
-               for (int k = 0; k <= i; k++) {
-                  g += V[k][i+1] * V[k][j];
-               }
-               for (int k = 0; k <= i; k++) {
-                  V[k][j] -= g * d[k];
-               }
-            }
-         }
-         for (int k = 0; k <= i; k++) {
-            V[k][i+1] = 0.0;
-         }
-      }
-      for (int j = 0; j < n; j++) {
-         d[j] = V[n-1][j];
-         V[n-1][j] = 0.0;
-      }
-      V[n-1][n-1] = 1.0;
-      e[0] = 0.0;
-   } 
-
-   // Symmetric tridiagonal QL algorithm.
-   
-   private void tql2 () {
-
-   //  This is derived from the Algol procedures tql2, by
-   //  Bowdler, Martin, Reinsch, and Wilkinson, Handbook for
-   //  Auto. Comp., Vol.ii-Linear Algebra, and the corresponding
-   //  Fortran subroutine in EISPACK.
-   
-      for (int i = 1; i < n; i++) {
-         e[i-1] = e[i];
-      }
-      e[n-1] = 0.0;
-   
-      double f = 0.0;
-      double tst1 = 0.0;
-      double eps = Math.pow(2.0,-52.0);
-      for (int l = 0; l < n; l++) {
-
-         // Find small subdiagonal element
-   
-         tst1 = Math.max(tst1,Math.abs(d[l]) + Math.abs(e[l]));
-         int m = l;
-         while (m < n) {
-            if (Math.abs(e[m]) <= eps*tst1) {
-               break;
-            }
-            m++;
-         }
-   
-         // If m == l, d[l] is an eigenvalue,
-         // otherwise, iterate.
-   
-         if (m > l) {
-            int iter = 0;
-            do {
-               iter = iter + 1;  // (Could check iteration count here.)
-   
-               // Compute implicit shift
-   
-               double g = d[l];
-               double p = (d[l+1] - g) / (2.0 * e[l]);
-               double r = Maths.hypot(p,1.0);
-               if (p < 0) {
-                  r = -r;
-               }
-               d[l] = e[l] / (p + r);
-               d[l+1] = e[l] * (p + r);
-               double dl1 = d[l+1];
-               double h = g - d[l];
-               for (int i = l+2; i < n; i++) {
-                  d[i] -= h;
-               }
-               f = f + h;
-   
-               // Implicit QL transformation.
-   
-               p = d[m];
-               double c = 1.0;
-               double c2 = c;
-               double c3 = c;
-               double el1 = e[l+1];
-               double s = 0.0;
-               double s2 = 0.0;
-               for (int i = m-1; i >= l; i--) {
-                  c3 = c2;
-                  c2 = c;
-                  s2 = s;
-                  g = c * e[i];
-                  h = c * p;
-                  r = Maths.hypot(p,e[i]);
-                  e[i+1] = s * r;
-                  s = e[i] / r;
-                  c = p / r;
-                  p = c * d[i] - s * g;
-                  d[i+1] = h + s * (c * g + s * d[i]);
-   
-                  // Accumulate transformation.
-   
-                  for (int k = 0; k < n; k++) {
-                     h = V[k][i+1];
-                     V[k][i+1] = s * V[k][i] + c * h;
-                     V[k][i] = c * V[k][i] - s * h;
-                  }
-               }
-               p = -s * s2 * c3 * el1 * e[l] / dl1;
-               e[l] = s * p;
-               d[l] = c * p;
-   
-               // Check for convergence.
-   
-            } while (Math.abs(e[l]) > eps*tst1);
-         }
-         d[l] = d[l] + f;
-         e[l] = 0.0;
-      }
-     
-      // Sort eigenvalues and corresponding vectors.
-   
-      for (int i = 0; i < n-1; i++) {
-         int k = i;
-         double p = d[i];
-         for (int j = i+1; j < n; j++) {
-            if (d[j] < p) {
-               k = j;
-               p = d[j];
-            }
-         }
-         if (k != i) {
-            d[k] = d[i];
-            d[i] = p;
-            for (int j = 0; j < n; j++) {
-               p = V[j][i];
-               V[j][i] = V[j][k];
-               V[j][k] = p;
-            }
-         }
-      }
-   }
-
-   // Nonsymmetric reduction to Hessenberg form.
-
-   private void orthes () {
-   
-      //  This is derived from the Algol procedures orthes and ortran,
-      //  by Martin and Wilkinson, Handbook for Auto. Comp.,
-      //  Vol.ii-Linear Algebra, and the corresponding
-      //  Fortran subroutines in EISPACK.
-   
-      int low = 0;
-      int high = n-1;
-   
-      for (int m = low+1; m <= high-1; m++) {
-   
-         // Scale column.
-   
-         double scale = 0.0;
-         for (int i = m; i <= high; i++) {
-            scale = scale + Math.abs(H[i][m-1]);
-         }
-         if (scale != 0.0) {
-   
-            // Compute Householder transformation.
-   
-            double h = 0.0;
-            for (int i = high; i >= m; i--) {
-               ort[i] = H[i][m-1]/scale;
-               h += ort[i] * ort[i];
-            }
-            double g = Math.sqrt(h);
-            if (ort[m] > 0) {
-               g = -g;
-            }
-            h = h - ort[m] * g;
-            ort[m] = ort[m] - g;
-   
-            // Apply Householder similarity transformation
-            // H = (I-u*u'/h)*H*(I-u*u')/h)
-   
-            for (int j = m; j < n; j++) {
-               double f = 0.0;
-               for (int i = high; i >= m; i--) {
-                  f += ort[i]*H[i][j];
-               }
-               f = f/h;
-               for (int i = m; i <= high; i++) {
-                  H[i][j] -= f*ort[i];
-               }
-           }
-   
-           for (int i = 0; i <= high; i++) {
-               double f = 0.0;
-               for (int j = high; j >= m; j--) {
-                  f += ort[j]*H[i][j];
-               }
-               f = f/h;
-               for (int j = m; j <= high; j++) {
-                  H[i][j] -= f*ort[j];
-               }
-            }
-            ort[m] = scale*ort[m];
-            H[m][m-1] = scale*g;
-         }
-      }
-   
-      // Accumulate transformations (Algol's ortran).
-
-      for (int i = 0; i < n; i++) {
-         for (int j = 0; j < n; j++) {
-            V[i][j] = (i == j ? 1.0 : 0.0);
-         }
-      }
-
-      for (int m = high-1; m >= low+1; m--) {
-         if (H[m][m-1] != 0.0) {
-            for (int i = m+1; i <= high; i++) {
-               ort[i] = H[i][m-1];
-            }
-            for (int j = m; j <= high; j++) {
-               double g = 0.0;
-               for (int i = m; i <= high; i++) {
-                  g += ort[i] * V[i][j];
-               }
-               // Double division avoids possible underflow
-               g = (g / ort[m]) / H[m][m-1];
-               for (int i = m; i <= high; i++) {
-                  V[i][j] += g * ort[i];
-               }
-            }
-         }
-      }
-   }
-
-
-   // Complex scalar division.
-
-   private transient double cdivr, cdivi;
-   private void cdiv(double xr, double xi, double yr, double yi) {
-      double r,d;
-      if (Math.abs(yr) > Math.abs(yi)) {
-         r = yi/yr;
-         d = yr + r*yi;
-         cdivr = (xr + r*xi)/d;
-         cdivi = (xi - r*xr)/d;
-      } else {
-         r = yr/yi;
-         d = yi + r*yr;
-         cdivr = (r*xr + xi)/d;
-         cdivi = (r*xi - xr)/d;
-      }
-   }
-
-
-   // Nonsymmetric reduction from Hessenberg to real Schur form.
-
-   private void hqr2 () {
-   
-      //  This is derived from the Algol procedure hqr2,
-      //  by Martin and Wilkinson, Handbook for Auto. Comp.,
-      //  Vol.ii-Linear Algebra, and the corresponding
-      //  Fortran subroutine in EISPACK.
-   
-      // Initialize
-   
-      int nn = this.n;
-      int n = nn-1;
-      int low = 0;
-      int high = nn-1;
-      double eps = Math.pow(2.0,-52.0);
-      double exshift = 0.0;
-      double p=0,q=0,r=0,s=0,z=0,t,w,x,y;
-   
-      // Store roots isolated by balanc and compute matrix norm
-   
-      double norm = 0.0;
-      for (int i = 0; i < nn; i++) {
-         if (i < low | i > high) {
-            d[i] = H[i][i];
-            e[i] = 0.0;
-         }
-         for (int j = Math.max(i-1,0); j < nn; j++) {
-            norm = norm + Math.abs(H[i][j]);
-         }
-      }
-   
-      // Outer loop over eigenvalue index
-   
-      int iter = 0;
-      while (n >= low) {
-   
-         // Look for single small sub-diagonal element
-   
-         int l = n;
-         while (l > low) {
-            s = Math.abs(H[l-1][l-1]) + Math.abs(H[l][l]);
-            if (s == 0.0) {
-               s = norm;
-            }
-            if (Math.abs(H[l][l-1]) < eps * s) {
-               break;
-            }
-            l--;
-         }
-       
-         // Check for convergence
-         // One root found
-   
-         if (l == n) {
-            H[n][n] = H[n][n] + exshift;
-            d[n] = H[n][n];
-            e[n] = 0.0;
-            n--;
-            iter = 0;
-   
-         // Two roots found
-   
-         } else if (l == n-1) {
-            w = H[n][n-1] * H[n-1][n];
-            p = (H[n-1][n-1] - H[n][n]) / 2.0;
-            q = p * p + w;
-            z = Math.sqrt(Math.abs(q));
-            H[n][n] = H[n][n] + exshift;
-            H[n-1][n-1] = H[n-1][n-1] + exshift;
-            x = H[n][n];
-   
-            // Real pair
-   
-            if (q >= 0) {
-               if (p >= 0) {
-                  z = p + z;
-               } else {
-                  z = p - z;
-               }
-               d[n-1] = x + z;
-               d[n] = d[n-1];
-               if (z != 0.0) {
-                  d[n] = x - w / z;
-               }
-               e[n-1] = 0.0;
-               e[n] = 0.0;
-               x = H[n][n-1];
-               s = Math.abs(x) + Math.abs(z);
-               p = x / s;
-               q = z / s;
-               r = Math.sqrt(p * p+q * q);
-               p = p / r;
-               q = q / r;
-   
-               // Row modification
-   
-               for (int j = n-1; j < nn; j++) {
-                  z = H[n-1][j];
-                  H[n-1][j] = q * z + p * H[n][j];
-                  H[n][j] = q * H[n][j] - p * z;
-               }
-   
-               // Column modification
-   
-               for (int i = 0; i <= n; i++) {
-                  z = H[i][n-1];
-                  H[i][n-1] = q * z + p * H[i][n];
-                  H[i][n] = q * H[i][n] - p * z;
-               }
-   
-               // Accumulate transformations
-   
-               for (int i = low; i <= high; i++) {
-                  z = V[i][n-1];
-                  V[i][n-1] = q * z + p * V[i][n];
-                  V[i][n] = q * V[i][n] - p * z;
-               }
-   
-            // Complex pair
-   
-            } else {
-               d[n-1] = x + p;
-               d[n] = x + p;
-               e[n-1] = z;
-               e[n] = -z;
-            }
-            n = n - 2;
-            iter = 0;
-   
-         // No convergence yet
-   
-         } else {
-   
-            // Form shift
-   
-            x = H[n][n];
-            y = 0.0;
-            w = 0.0;
-            if (l < n) {
-               y = H[n-1][n-1];
-               w = H[n][n-1] * H[n-1][n];
-            }
-   
-            // Wilkinson's original ad hoc shift
-   
-            if (iter == 10) {
-               exshift += x;
-               for (int i = low; i <= n; i++) {
-                  H[i][i] -= x;
-               }
-               s = Math.abs(H[n][n-1]) + Math.abs(H[n-1][n-2]);
-               x = y = 0.75 * s;
-               w = -0.4375 * s * s;
-            }
-
-            // MATLAB's new ad hoc shift
-
-            if (iter == 30) {
-                s = (y - x) / 2.0;
-                s = s * s + w;
-                if (s > 0) {
-                    s = Math.sqrt(s);
-                    if (y < x) {
-                       s = -s;
-                    }
-                    s = x - w / ((y - x) / 2.0 + s);
-                    for (int i = low; i <= n; i++) {
-                       H[i][i] -= s;
-                    }
-                    exshift += s;
-                    x = y = w = 0.964;
-                }
-            }
-   
-            iter = iter + 1;   // (Could check iteration count here.)
-   
-            // Look for two consecutive small sub-diagonal elements
-   
-            int m = n-2;
-            while (m >= l) {
-               z = H[m][m];
-               r = x - z;
-               s = y - z;
-               p = (r * s - w) / H[m+1][m] + H[m][m+1];
-               q = H[m+1][m+1] - z - r - s;
-               r = H[m+2][m+1];
-               s = Math.abs(p) + Math.abs(q) + Math.abs(r);
-               p = p / s;
-               q = q / s;
-               r = r / s;
-               if (m == l) {
-                  break;
-               }
-               if (Math.abs(H[m][m-1]) * (Math.abs(q) + Math.abs(r)) <
-                  eps * (Math.abs(p) * (Math.abs(H[m-1][m-1]) + Math.abs(z) +
-                  Math.abs(H[m+1][m+1])))) {
-                     break;
-               }
-               m--;
-            }
-   
-            for (int i = m+2; i <= n; i++) {
-               H[i][i-2] = 0.0;
-               if (i > m+2) {
-                  H[i][i-3] = 0.0;
-               }
-            }
-   
-            // Double QR step involving rows l:n and columns m:n
-   
-            for (int k = m; k <= n-1; k++) {
-               boolean notlast = (k != n-1);
-               if (k != m) {
-                  p = H[k][k-1];
-                  q = H[k+1][k-1];
-                  r = (notlast ? H[k+2][k-1] : 0.0);
-                  x = Math.abs(p) + Math.abs(q) + Math.abs(r);
-                  if (x != 0.0) {
-                     p = p / x;
-                     q = q / x;
-                     r = r / x;
-                  }
-               }
-               if (x == 0.0) {
-                  break;
-               }
-               s = Math.sqrt(p * p + q * q + r * r);
-               if (p < 0) {
-                  s = -s;
-               }
-               if (s != 0) {
-                  if (k != m) {
-                     H[k][k-1] = -s * x;
-                  } else if (l != m) {
-                     H[k][k-1] = -H[k][k-1];
-                  }
-                  p = p + s;
-                  x = p / s;
-                  y = q / s;
-                  z = r / s;
-                  q = q / p;
-                  r = r / p;
-   
-                  // Row modification
-   
-                  for (int j = k; j < nn; j++) {
-                     p = H[k][j] + q * H[k+1][j];
-                     if (notlast) {
-                        p = p + r * H[k+2][j];
-                        H[k+2][j] = H[k+2][j] - p * z;
-                     }
-                     H[k][j] = H[k][j] - p * x;
-                     H[k+1][j] = H[k+1][j] - p * y;
-                  }
-   
-                  // Column modification
-   
-                  for (int i = 0; i <= Math.min(n,k+3); i++) {
-                     p = x * H[i][k] + y * H[i][k+1];
-                     if (notlast) {
-                        p = p + z * H[i][k+2];
-                        H[i][k+2] = H[i][k+2] - p * r;
-                     }
-                     H[i][k] = H[i][k] - p;
-                     H[i][k+1] = H[i][k+1] - p * q;
-                  }
-   
-                  // Accumulate transformations
-   
-                  for (int i = low; i <= high; i++) {
-                     p = x * V[i][k] + y * V[i][k+1];
-                     if (notlast) {
-                        p = p + z * V[i][k+2];
-                        V[i][k+2] = V[i][k+2] - p * r;
-                     }
-                     V[i][k] = V[i][k] - p;
-                     V[i][k+1] = V[i][k+1] - p * q;
-                  }
-               }  // (s != 0)
-            }  // k loop
-         }  // check convergence
-      }  // while (n >= low)
-      
-      // Backsubstitute to find vectors of upper triangular form
-
-      if (norm == 0.0) {
-         return;
-      }
-   
-      for (n = nn-1; n >= 0; n--) {
-         p = d[n];
-         q = e[n];
-   
-         // Real vector
-   
-         if (q == 0) {
-            int l = n;
-            H[n][n] = 1.0;
-            for (int i = n-1; i >= 0; i--) {
-               w = H[i][i] - p;
-               r = 0.0;
-               for (int j = l; j <= n; j++) {
-                  r = r + H[i][j] * H[j][n];
-               }
-               if (e[i] < 0.0) {
-                  z = w;
-                  s = r;
-               } else {
-                  l = i;
-                  if (e[i] == 0.0) {
-                     if (w != 0.0) {
-                        H[i][n] = -r / w;
-                     } else {
-                        H[i][n] = -r / (eps * norm);
-                     }
-   
-                  // Solve real equations
-   
-                  } else {
-                     x = H[i][i+1];
-                     y = H[i+1][i];
-                     q = (d[i] - p) * (d[i] - p) + e[i] * e[i];
-                     t = (x * s - z * r) / q;
-                     H[i][n] = t;
-                     if (Math.abs(x) > Math.abs(z)) {
-                        H[i+1][n] = (-r - w * t) / x;
-                     } else {
-                        H[i+1][n] = (-s - y * t) / z;
-                     }
-                  }
-   
-                  // Overflow control
-   
-                  t = Math.abs(H[i][n]);
-                  if ((eps * t) * t > 1) {
-                     for (int j = i; j <= n; j++) {
-                        H[j][n] = H[j][n] / t;
-                     }
-                  }
-               }
-            }
-   
-         // Complex vector
-   
-         } else if (q < 0) {
-            int l = n-1;
-
-            // Last vector component imaginary so matrix is triangular
-   
-            if (Math.abs(H[n][n-1]) > Math.abs(H[n-1][n])) {
-               H[n-1][n-1] = q / H[n][n-1];
-               H[n-1][n] = -(H[n][n] - p) / H[n][n-1];
-            } else {
-               cdiv(0.0,-H[n-1][n],H[n-1][n-1]-p,q);
-               H[n-1][n-1] = cdivr;
-               H[n-1][n] = cdivi;
-            }
-            H[n][n-1] = 0.0;
-            H[n][n] = 1.0;
-            for (int i = n-2; i >= 0; i--) {
-               double ra,sa,vr,vi;
-               ra = 0.0;
-               sa = 0.0;
-               for (int j = l; j <= n; j++) {
-                  ra = ra + H[i][j] * H[j][n-1];
-                  sa = sa + H[i][j] * H[j][n];
-               }
-               w = H[i][i] - p;
-   
-               if (e[i] < 0.0) {
-                  z = w;
-                  r = ra;
-                  s = sa;
-               } else {
-                  l = i;
-                  if (e[i] == 0) {
-                     cdiv(-ra,-sa,w,q);
-                     H[i][n-1] = cdivr;
-                     H[i][n] = cdivi;
-                  } else {
-   
-                     // Solve complex equations
-   
-                     x = H[i][i+1];
-                     y = H[i+1][i];
-                     vr = (d[i] - p) * (d[i] - p) + e[i] * e[i] - q * q;
-                     vi = (d[i] - p) * 2.0 * q;
-                     if (vr == 0.0 & vi == 0.0) {
-                        vr = eps * norm * (Math.abs(w) + Math.abs(q) +
-                        Math.abs(x) + Math.abs(y) + Math.abs(z));
-                     }
-                     cdiv(x*r-z*ra+q*sa,x*s-z*sa-q*ra,vr,vi);
-                     H[i][n-1] = cdivr;
-                     H[i][n] = cdivi;
-                     if (Math.abs(x) > (Math.abs(z) + Math.abs(q))) {
-                        H[i+1][n-1] = (-ra - w * H[i][n-1] + q * H[i][n]) / x;
-                        H[i+1][n] = (-sa - w * H[i][n] - q * H[i][n-1]) / x;
-                     } else {
-                        cdiv(-r-y*H[i][n-1],-s-y*H[i][n],z,q);
-                        H[i+1][n-1] = cdivr;
-                        H[i+1][n] = cdivi;
-                     }
-                  }
-   
-                  // Overflow control
-
-                  t = Math.max(Math.abs(H[i][n-1]),Math.abs(H[i][n]));
-                  if ((eps * t) * t > 1) {
-                     for (int j = i; j <= n; j++) {
-                        H[j][n-1] = H[j][n-1] / t;
-                        H[j][n] = H[j][n] / t;
-                     }
-                  }
-               }
-            }
-         }
-      }
-   
-      // Vectors of isolated roots
-   
-      for (int i = 0; i < nn; i++) {
-         if (i < low | i > high) {
-            for (int j = i; j < nn; j++) {
-               V[i][j] = H[i][j];
-            }
-         }
-      }
-   
-      // Back transformation to get eigenvectors of original matrix
-   
-      for (int j = nn-1; j >= low; j--) {
-         for (int i = low; i <= high; i++) {
-            z = 0.0;
-            for (int k = low; k <= Math.min(j,high); k++) {
-               z = z + V[i][k] * H[k][j];
-            }
-            V[i][j] = z;
-         }
-      }
-   }
-
-
-/* ------------------------
-   Constructor
- * ------------------------ */
-
-   /** Check for symmetry, then construct the eigenvalue decomposition
-   @param A    Square matrix
-   @return     Structure to access D and V.
-   */
-
-   public EigenvalueDecomposition (Matrix Arg) {
-      double[][] A = Arg.getArray();
-      n = Arg.getColumnDimension();
-      V = new double[n][n];
-      d = new double[n];
-      e = new double[n];
-
-      issymmetric = true;
-      for (int j = 0; (j < n) & issymmetric; j++) {
-         for (int i = 0; (i < n) & issymmetric; i++) {
-            issymmetric = (A[i][j] == A[j][i]);
-         }
-      }
-
-      if (issymmetric) {
-         for (int i = 0; i < n; i++) {
-            for (int j = 0; j < n; j++) {
-               V[i][j] = A[i][j];
-            }
-         }
-   
-         // Tridiagonalize.
-         tred2();
-   
-         // Diagonalize.
-         tql2();
-
-      } else {
-         H = new double[n][n];
-         ort = new double[n];
-         
-         for (int j = 0; j < n; j++) {
-            for (int i = 0; i < n; i++) {
-               H[i][j] = A[i][j];
-            }
-         }
-   
-         // Reduce to Hessenberg form.
-         orthes();
-   
-         // Reduce Hessenberg to real Schur form.
-         hqr2();
-      }
-   }
-
-/* ------------------------
-   Public Methods
- * ------------------------ */
-
-   /** Return the eigenvector matrix
-   @return     V
-   */
-
-   public Matrix getV () {
-      return new Matrix(V,n,n);
-   }
-
-   /** Return the real parts of the eigenvalues
-   @return     real(diag(D))
-   */
-
-   public double[] getRealEigenvalues () {
-      return d;
-   }
-
-   /** Return the imaginary parts of the eigenvalues
-   @return     imag(diag(D))
-   */
-
-   public double[] getImagEigenvalues () {
-      return e;
-   }
-
-   /** Return the block diagonal eigenvalue matrix
-   @return     D
-   */
-
-   public Matrix getD () {
-      Matrix X = new Matrix(n,n);
-      double[][] D = X.getArray();
-      for (int i = 0; i < n; i++) {
-         for (int j = 0; j < n; j++) {
-            D[i][j] = 0.0;
-         }
-         D[i][i] = d[i];
-         if (e[i] > 0) {
-            D[i][i+1] = e[i];
-         } else if (e[i] < 0) {
-            D[i][i-1] = e[i];
-         }
-      }
-      return X;
-   }
-}
diff --git a/geogebra/kernel/jama/LUDecomposition.java b/geogebra/kernel/jama/LUDecomposition.java
deleted file mode 100644
index 1badc15..0000000
--- a/geogebra/kernel/jama/LUDecomposition.java
+++ /dev/null
@@ -1,311 +0,0 @@
-package geogebra.kernel.jama;
-
-   /** LU Decomposition.
-   <P>
-   For an m-by-n matrix A with m >= n, the LU decomposition is an m-by-n
-   unit lower triangular matrix L, an n-by-n upper triangular matrix U,
-   and a permutation vector piv of length m so that A(piv,:) = L*U.
-   If m < n, then L is m-by-m and U is m-by-n.
-   <P>
-   The LU decompostion with pivoting always exists, even if the matrix is
-   singular, so the constructor will never fail.  The primary use of the
-   LU decomposition is in the solution of square systems of simultaneous
-   linear equations.  This will fail if isNonsingular() returns false.
-   */
-
-public class LUDecomposition implements java.io.Serializable {
-
-/* ------------------------
-   Class variables
- * ------------------------ */
-
-   /** Array for internal storage of decomposition.
-   @serial internal array storage.
-   */
-   private double[][] LU;
-
-   /** Row and column dimensions, and pivot sign.
-   @serial column dimension.
-   @serial row dimension.
-   @serial pivot sign.
-   */
-   private int m, n, pivsign; 
-
-   /** Internal storage of pivot vector.
-   @serial pivot vector.
-   */
-   private int[] piv;
-
-/* ------------------------
-   Constructor
- * ------------------------ */
-
-   /** LU Decomposition
-   @param  A   Rectangular matrix
-   @return     Structure to access L, U and piv.
-   */
-
-   public LUDecomposition (Matrix A) {
-
-   // Use a "left-looking", dot-product, Crout/Doolittle algorithm.
-
-      LU = A.getArrayCopy();
-      m = A.getRowDimension();
-      n = A.getColumnDimension();
-      piv = new int[m];
-      for (int i = 0; i < m; i++) {
-         piv[i] = i;
-      }
-      pivsign = 1;
-      double[] LUrowi;
-      double[] LUcolj = new double[m];
-
-      // Outer loop.
-
-      for (int j = 0; j < n; j++) {
-
-         // Make a copy of the j-th column to localize references.
-
-         for (int i = 0; i < m; i++) {
-            LUcolj[i] = LU[i][j];
-         }
-
-         // Apply previous transformations.
-
-         for (int i = 0; i < m; i++) {
-            LUrowi = LU[i];
-
-            // Most of the time is spent in the following dot product.
-
-            int kmax = Math.min(i,j);
-            double s = 0.0;
-            for (int k = 0; k < kmax; k++) {
-               s += LUrowi[k]*LUcolj[k];
-            }
-
-            LUrowi[j] = LUcolj[i] -= s;
-         }
-   
-         // Find pivot and exchange if necessary.
-
-         int p = j;
-         for (int i = j+1; i < m; i++) {
-            if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {
-               p = i;
-            }
-         }
-         if (p != j) {
-            for (int k = 0; k < n; k++) {
-               double t = LU[p][k]; LU[p][k] = LU[j][k]; LU[j][k] = t;
-            }
-            int k = piv[p]; piv[p] = piv[j]; piv[j] = k;
-            pivsign = -pivsign;
-         }
-
-         // Compute multipliers.
-         
-         if (j < m & LU[j][j] != 0.0) {
-            for (int i = j+1; i < m; i++) {
-               LU[i][j] /= LU[j][j];
-            }
-         }
-      }
-   }
-
-/* ------------------------
-   Temporary, experimental code.
-   ------------------------ *\
-
-   \** LU Decomposition, computed by Gaussian elimination.
-   <P>
-   This constructor computes L and U with the "daxpy"-based elimination
-   algorithm used in LINPACK and MATLAB.  In Java, we suspect the dot-product,
-   Crout algorithm will be faster.  We have temporarily included this
-   constructor until timing experiments confirm this suspicion.
-   <P>
-   @param  A             Rectangular matrix
-   @param  linpackflag   Use Gaussian elimination.  Actual value ignored.
-   @return               Structure to access L, U and piv.
-   *\
-
-   public LUDecomposition (Matrix A, int linpackflag) {
-      // Initialize.
-      LU = A.getArrayCopy();
-      m = A.getRowDimension();
-      n = A.getColumnDimension();
-      piv = new int[m];
-      for (int i = 0; i < m; i++) {
-         piv[i] = i;
-      }
-      pivsign = 1;
-      // Main loop.
-      for (int k = 0; k < n; k++) {
-         // Find pivot.
-         int p = k;
-         for (int i = k+1; i < m; i++) {
-            if (Math.abs(LU[i][k]) > Math.abs(LU[p][k])) {
-               p = i;
-            }
-         }
-         // Exchange if necessary.
-         if (p != k) {
-            for (int j = 0; j < n; j++) {
-               double t = LU[p][j]; LU[p][j] = LU[k][j]; LU[k][j] = t;
-            }
-            int t = piv[p]; piv[p] = piv[k]; piv[k] = t;
-            pivsign = -pivsign;
-         }
-         // Compute multipliers and eliminate k-th column.
-         if (LU[k][k] != 0.0) {
-            for (int i = k+1; i < m; i++) {
-               LU[i][k] /= LU[k][k];
-               for (int j = k+1; j < n; j++) {
-                  LU[i][j] -= LU[i][k]*LU[k][j];
-               }
-            }
-         }
-      }
-   }
-
-\* ------------------------
-   End of temporary code.
- * ------------------------ */
-
-/* ------------------------
-   Public Methods
- * ------------------------ */
-
-   /** Is the matrix nonsingular?
-   @return     true if U, and hence A, is nonsingular.
-   */
-
-   public boolean isNonsingular () {
-      for (int j = 0; j < n; j++) {
-         if (LU[j][j] == 0)
-            return false;
-      }
-      return true;
-   }
-
-   /** Return lower triangular factor
-   @return     L
-   */
-
-   public Matrix getL () {
-      Matrix X = new Matrix(m,n);
-      double[][] L = X.getArray();
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            if (i > j) {
-               L[i][j] = LU[i][j];
-            } else if (i == j) {
-               L[i][j] = 1.0;
-            } else {
-               L[i][j] = 0.0;
-            }
-         }
-      }
-      return X;
-   }
-
-   /** Return upper triangular factor
-   @return     U
-   */
-
-   public Matrix getU () {
-      Matrix X = new Matrix(n,n);
-      double[][] U = X.getArray();
-      for (int i = 0; i < n; i++) {
-         for (int j = 0; j < n; j++) {
-            if (i <= j) {
-               U[i][j] = LU[i][j];
-            } else {
-               U[i][j] = 0.0;
-            }
-         }
-      }
-      return X;
-   }
-
-   /** Return pivot permutation vector
-   @return     piv
-   */
-
-   public int[] getPivot () {
-      int[] p = new int[m];
-      for (int i = 0; i < m; i++) {
-         p[i] = piv[i];
-      }
-      return p;
-   }
-
-   /** Return pivot permutation vector as a one-dimensional double array
-   @return     (double) piv
-   */
-
-   public double[] getDoublePivot () {
-      double[] vals = new double[m];
-      for (int i = 0; i < m; i++) {
-         vals[i] = (double) piv[i];
-      }
-      return vals;
-   }
-
-   /** Determinant
-   @return     det(A)
-   @exception  IllegalArgumentException  Matrix must be square
-   */
-
-   public double det () {
-      if (m != n) {
-         throw new IllegalArgumentException("Matrix must be square.");
-      }
-      double d = (double) pivsign;
-      for (int j = 0; j < n; j++) {
-         d *= LU[j][j];
-      }
-      return d;
-   }
-
-   /** Solve A*X = B
-   @param  B   A Matrix with as many rows as A and any number of columns.
-   @return     X so that L*U*X = B(piv,:)
-   @exception  IllegalArgumentException Matrix row dimensions must agree.
-   @exception  RuntimeException  Matrix is singular.
-   */
-
-   public Matrix solve (Matrix B) {
-      if (B.getRowDimension() != m) {
-         throw new IllegalArgumentException("Matrix row dimensions must agree.");
-      }
-      if (!this.isNonsingular()) {
-         throw new RuntimeException("Matrix is singular.");
-      }
-
-      // Copy right hand side with pivoting
-      int nx = B.getColumnDimension();
-      Matrix Xmat = B.getMatrix(piv,0,nx-1);
-      double[][] X = Xmat.getArray();
-
-      // Solve L*Y = B(piv,:)
-      for (int k = 0; k < n; k++) {
-         for (int i = k+1; i < n; i++) {
-            for (int j = 0; j < nx; j++) {
-               X[i][j] -= X[k][j]*LU[i][k];
-            }
-         }
-      }
-      // Solve U*X = Y;
-      for (int k = n-1; k >= 0; k--) {
-         for (int j = 0; j < nx; j++) {
-            X[k][j] /= LU[k][k];
-         }
-         for (int i = 0; i < k; i++) {
-            for (int j = 0; j < nx; j++) {
-               X[i][j] -= X[k][j]*LU[i][k];
-            }
-         }
-      }
-      return Xmat;
-   }
-}
diff --git a/geogebra/kernel/jama/Matrix.java b/geogebra/kernel/jama/Matrix.java
deleted file mode 100644
index a795173..0000000
--- a/geogebra/kernel/jama/Matrix.java
+++ /dev/null
@@ -1,1049 +0,0 @@
-package geogebra.kernel.jama;
-
-import geogebra.kernel.jama.util.*;
-
-import java.text.NumberFormat;
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.util.Locale;
-import java.text.FieldPosition;
-import java.io.PrintWriter;
-import java.io.BufferedReader;
-import java.io.StreamTokenizer;
-
-/**
-   Jama = Java Matrix class.
-<P>
-   The Java Matrix Class provides the fundamental operations of numerical
-   linear algebra.  Various constructors create Matrices from two dimensional
-   arrays of double precision floating point numbers.  Various "gets" and
-   "sets" provide access to submatrices and matrix elements.  Several methods 
-   implement basic matrix arithmetic, including matrix addition and
-   multiplication, matrix norms, and element-by-element array operations.
-   Methods for reading and printing matrices are also included.  All the
-   operations in this version of the Matrix Class involve real matrices.
-   Complex matrices may be handled in a future version.
-<P>
-   Five fundamental matrix decompositions, which consist of pairs or triples
-   of matrices, permutation vectors, and the like, produce results in five
-   decomposition classes.  These decompositions are accessed by the Matrix
-   class to compute solutions of simultaneous linear equations, determinants,
-   inverses and other matrix functions.  The five decompositions are:
-<P><UL>
-   <LI>Cholesky Decomposition of symmetric, positive definite matrices.
-   <LI>LU Decomposition of rectangular matrices.
-   <LI>QR Decomposition of rectangular matrices.
-   <LI>Singular Value Decomposition of rectangular matrices.
-   <LI>Eigenvalue Decomposition of both symmetric and nonsymmetric square matrices.
-</UL>
-<DL>
-<DT><B>Example of use:</B></DT>
-<P>
-<DD>Solve a linear system A x = b and compute the residual norm, ||b - A x||.
-<P><PRE>
-      double[][] vals = {{1.,2.,3},{4.,5.,6.},{7.,8.,10.}};
-      Matrix A = new Matrix(vals);
-      Matrix b = Matrix.random(3,1);
-      Matrix x = A.solve(b);
-      Matrix r = A.times(x).minus(b);
-      double rnorm = r.normInf();
-</PRE></DD>
-</DL>
-
- at author The MathWorks, Inc. and the National Institute of Standards and Technology.
- at version 5 August 1998
-*/
-
-public class Matrix implements Cloneable, java.io.Serializable {
-
-/* ------------------------
-   Class variables
- * ------------------------ */
-
-   /** Array for internal storage of elements.
-   @serial internal array storage.
-   */
-   protected double[][] A;
-
-   /** Row and column dimensions.
-   @serial row dimension.
-   @serial column dimension.
-   */
-   protected int m, n;
-
-/* ------------------------
-   Constructors
- * ------------------------ */
-
-   public Matrix () {
-	   }
-
-   /** Construct an m-by-n matrix of zeros. 
-   @param m    Number of rows.
-   @param n    Number of colums.
-   */
-
-   public Matrix (int m, int n) {
-      this.m = m;
-      this.n = n;
-      A = new double[m][n];
-   }
-
-   /** Construct an m-by-n constant matrix.
-   @param m    Number of rows.
-   @param n    Number of colums.
-   @param s    Fill the matrix with this scalar value.
-   */
-
-   public Matrix (int m, int n, double s) {
-      this.m = m;
-      this.n = n;
-      A = new double[m][n];
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            A[i][j] = s;
-         }
-      }
-   }
-
-   /** Construct a matrix from a 2-D array.
-   @param A    Two-dimensional array of doubles.
-   @exception  IllegalArgumentException All rows must have the same length
-   @see        #constructWithCopy
-   */
-
-   public Matrix (double[][] A) {
-      m = A.length;
-      n = A[0].length;
-      for (int i = 0; i < m; i++) {
-         if (A[i].length != n) {
-            throw new IllegalArgumentException("All rows must have the same length.");
-         }
-      }
-      this.A = A;
-   }
-
-   /** Construct a matrix quickly without checking arguments.
-   @param A    Two-dimensional array of doubles.
-   @param m    Number of rows.
-   @param n    Number of colums.
-   */
-
-   public Matrix (double[][] A, int m, int n) {
-      this.A = A;
-      this.m = m;
-      this.n = n;
-   }
-
-   /** Construct a matrix from a one-dimensional packed array
-   @param vals One-dimensional array of doubles, packed by columns (ala Fortran).
-   @param m    Number of rows.
-   @exception  IllegalArgumentException Array length must be a multiple of m.
-   */
-
-   public Matrix (double vals[], int m) {
-      this.m = m;
-      n = (m != 0 ? vals.length/m : 0);
-      if (m*n != vals.length) {
-         throw new IllegalArgumentException("Array length must be a multiple of m.");
-      }
-      A = new double[m][n];
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            A[i][j] = vals[i+j*m];
-         }
-      }
-   }
-
-/* ------------------------
-   Public Methods
- * ------------------------ */
-
-   /** Construct a matrix from a copy of a 2-D array.
-   @param A    Two-dimensional array of doubles.
-   @exception  IllegalArgumentException All rows must have the same length
-   */
-
-   public static Matrix constructWithCopy(double[][] A) {
-      int m = A.length;
-      int n = A[0].length;
-      Matrix X = new Matrix(m,n);
-      double[][] C = X.getArray();
-      for (int i = 0; i < m; i++) {
-         if (A[i].length != n) {
-            throw new IllegalArgumentException
-               ("All rows must have the same length.");
-         }
-         for (int j = 0; j < n; j++) {
-            C[i][j] = A[i][j];
-         }
-      }
-      return X;
-   }
-
-   /** Make a deep copy of a matrix
-   */
-
-   public Matrix copy () {
-      Matrix X = new Matrix(m,n);
-      double[][] C = X.getArray();
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            C[i][j] = A[i][j];
-         }
-      }
-      return X;
-   }
-
-   /** Clone the Matrix object.
-   */
-
-   public Object clone () {
-      return this.copy();
-   }
-
-   /** Access the internal two-dimensional array.
-   @return     Pointer to the two-dimensional array of matrix elements.
-   */
-
-   public double[][] getArray () {
-      return A;
-   }
-
-   /** Copy the internal two-dimensional array.
-   @return     Two-dimensional array copy of matrix elements.
-   */
-
-   public double[][] getArrayCopy () {
-      double[][] C = new double[m][n];
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            C[i][j] = A[i][j];
-         }
-      }
-      return C;
-   }
-
-   /** Make a one-dimensional column packed copy of the internal array.
-   @return     Matrix elements packed in a one-dimensional array by columns.
-   */
-
-   public double[] getColumnPackedCopy () {
-      double[] vals = new double[m*n];
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            vals[i+j*m] = A[i][j];
-         }
-      }
-      return vals;
-   }
-
-   /** Make a one-dimensional row packed copy of the internal array.
-   @return     Matrix elements packed in a one-dimensional array by rows.
-   */
-
-   public double[] getRowPackedCopy () {
-      double[] vals = new double[m*n];
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            vals[i*n+j] = A[i][j];
-         }
-      }
-      return vals;
-   }
-
-   /** Get row dimension.
-   @return     m, the number of rows.
-   */
-
-   public int getRowDimension () {
-      return m;
-   }
-
-   /** Get column dimension.
-   @return     n, the number of columns.
-   */
-
-   public int getColumnDimension () {
-      return n;
-   }
-
-   /** Get a single element.
-   @param i    Row index.
-   @param j    Column index.
-   @return     A(i,j)
-   @exception  ArrayIndexOutOfBoundsException
-   */
-
-   public double get (int i, int j) {
-      return A[i][j];
-   }
-
-   /** Get a submatrix.
-   @param i0   Initial row index
-   @param i1   Final row index
-   @param j0   Initial column index
-   @param j1   Final column index
-   @return     A(i0:i1,j0:j1)
-   @exception  ArrayIndexOutOfBoundsException Submatrix indices
-   */
-
-   public Matrix getMatrix (int i0, int i1, int j0, int j1) {
-      Matrix X = new Matrix(i1-i0+1,j1-j0+1);
-      double[][] B = X.getArray();
-      try {
-         for (int i = i0; i <= i1; i++) {
-            for (int j = j0; j <= j1; j++) {
-               B[i-i0][j-j0] = A[i][j];
-            }
-         }
-      } catch(ArrayIndexOutOfBoundsException e) {
-         throw new ArrayIndexOutOfBoundsException("Submatrix indices");
-      }
-      return X;
-   }
-
-   /** Get a submatrix.
-   @param r    Array of row indices.
-   @param c    Array of column indices.
-   @return     A(r(:),c(:))
-   @exception  ArrayIndexOutOfBoundsException Submatrix indices
-   */
-
-   public Matrix getMatrix (int[] r, int[] c) {
-      Matrix X = new Matrix(r.length,c.length);
-      double[][] B = X.getArray();
-      try {
-         for (int i = 0; i < r.length; i++) {
-            for (int j = 0; j < c.length; j++) {
-               B[i][j] = A[r[i]][c[j]];
-            }
-         }
-      } catch(ArrayIndexOutOfBoundsException e) {
-         throw new ArrayIndexOutOfBoundsException("Submatrix indices");
-      }
-      return X;
-   }
-
-   /** Get a submatrix.
-   @param i0   Initial row index
-   @param i1   Final row index
-   @param c    Array of column indices.
-   @return     A(i0:i1,c(:))
-   @exception  ArrayIndexOutOfBoundsException Submatrix indices
-   */
-
-   public Matrix getMatrix (int i0, int i1, int[] c) {
-      Matrix X = new Matrix(i1-i0+1,c.length);
-      double[][] B = X.getArray();
-      try {
-         for (int i = i0; i <= i1; i++) {
-            for (int j = 0; j < c.length; j++) {
-               B[i-i0][j] = A[i][c[j]];
-            }
-         }
-      } catch(ArrayIndexOutOfBoundsException e) {
-         throw new ArrayIndexOutOfBoundsException("Submatrix indices");
-      }
-      return X;
-   }
-
-   /** Get a submatrix.
-   @param r    Array of row indices.
-   @param i0   Initial column index
-   @param i1   Final column index
-   @return     A(r(:),j0:j1)
-   @exception  ArrayIndexOutOfBoundsException Submatrix indices
-   */
-
-   public Matrix getMatrix (int[] r, int j0, int j1) {
-      Matrix X = new Matrix(r.length,j1-j0+1);
-      double[][] B = X.getArray();
-      try {
-         for (int i = 0; i < r.length; i++) {
-            for (int j = j0; j <= j1; j++) {
-               B[i][j-j0] = A[r[i]][j];
-            }
-         }
-      } catch(ArrayIndexOutOfBoundsException e) {
-         throw new ArrayIndexOutOfBoundsException("Submatrix indices");
-      }
-      return X;
-   }
-
-   /** Set a single element.
-   @param i    Row index.
-   @param j    Column index.
-   @param s    A(i,j).
-   @exception  ArrayIndexOutOfBoundsException
-   */
-
-   public void set (int i, int j, double s) {
-      A[i][j] = s;
-   }
-
-   /** Set a submatrix.
-   @param i0   Initial row index
-   @param i1   Final row index
-   @param j0   Initial column index
-   @param j1   Final column index
-   @param X    A(i0:i1,j0:j1)
-   @exception  ArrayIndexOutOfBoundsException Submatrix indices
-   */
-
-   public void setMatrix (int i0, int i1, int j0, int j1, Matrix X) {
-      try {
-         for (int i = i0; i <= i1; i++) {
-            for (int j = j0; j <= j1; j++) {
-               A[i][j] = X.get(i-i0,j-j0);
-            }
-         }
-      } catch(ArrayIndexOutOfBoundsException e) {
-         throw new ArrayIndexOutOfBoundsException("Submatrix indices");
-      }
-   }
-
-   /** Set a submatrix.
-   @param r    Array of row indices.
-   @param c    Array of column indices.
-   @param X    A(r(:),c(:))
-   @exception  ArrayIndexOutOfBoundsException Submatrix indices
-   */
-
-   public void setMatrix (int[] r, int[] c, Matrix X) {
-      try {
-         for (int i = 0; i < r.length; i++) {
-            for (int j = 0; j < c.length; j++) {
-               A[r[i]][c[j]] = X.get(i,j);
-            }
-         }
-      } catch(ArrayIndexOutOfBoundsException e) {
-         throw new ArrayIndexOutOfBoundsException("Submatrix indices");
-      }
-   }
-
-   /** Set a submatrix.
-   @param r    Array of row indices.
-   @param j0   Initial column index
-   @param j1   Final column index
-   @param X    A(r(:),j0:j1)
-   @exception  ArrayIndexOutOfBoundsException Submatrix indices
-   */
-
-   public void setMatrix (int[] r, int j0, int j1, Matrix X) {
-      try {
-         for (int i = 0; i < r.length; i++) {
-            for (int j = j0; j <= j1; j++) {
-               A[r[i]][j] = X.get(i,j-j0);
-            }
-         }
-      } catch(ArrayIndexOutOfBoundsException e) {
-         throw new ArrayIndexOutOfBoundsException("Submatrix indices");
-      }
-   }
-
-   /** Set a submatrix.
-   @param i0   Initial row index
-   @param i1   Final row index
-   @param c    Array of column indices.
-   @param X    A(i0:i1,c(:))
-   @exception  ArrayIndexOutOfBoundsException Submatrix indices
-   */
-
-   public void setMatrix (int i0, int i1, int[] c, Matrix X) {
-      try {
-         for (int i = i0; i <= i1; i++) {
-            for (int j = 0; j < c.length; j++) {
-               A[i][c[j]] = X.get(i-i0,j);
-            }
-         }
-      } catch(ArrayIndexOutOfBoundsException e) {
-         throw new ArrayIndexOutOfBoundsException("Submatrix indices");
-      }
-   }
-
-   /** Matrix transpose.
-   @return    A'
-   */
-
-   public Matrix transpose () {
-      Matrix X = new Matrix(n,m);
-      double[][] C = X.getArray();
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            C[j][i] = A[i][j];
-         }
-      }
-      return X;
-   }
-
-   /** One norm
-   @return    maximum column sum.
-   */
-
-   public double norm1 () {
-      double f = 0;
-      for (int j = 0; j < n; j++) {
-         double s = 0;
-         for (int i = 0; i < m; i++) {
-            s += Math.abs(A[i][j]);
-         }
-         f = Math.max(f,s);
-      }
-      return f;
-   }
-
-   /** Two norm
-   @return    maximum singular value.
-   */
-
-   public double norm2 () {
-      return (new SingularValueDecomposition(this).norm2());
-   }
-
-   /** Infinity norm
-   @return    maximum row sum.
-   */
-
-   public double normInf () {
-      double f = 0;
-      for (int i = 0; i < m; i++) {
-         double s = 0;
-         for (int j = 0; j < n; j++) {
-            s += Math.abs(A[i][j]);
-         }
-         f = Math.max(f,s);
-      }
-      return f;
-   }
-
-   /** Frobenius norm
-   @return    sqrt of sum of squares of all elements.
-   */
-
-   public double normF () {
-      double f = 0;
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            f = Maths.hypot(f,A[i][j]);
-         }
-      }
-      return f;
-   }
-
-   /**  Unary minus
-   @return    -A
-   */
-
-   public Matrix uminus () {
-      Matrix X = new Matrix(m,n);
-      double[][] C = X.getArray();
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            C[i][j] = -A[i][j];
-         }
-      }
-      return X;
-   }
-
-   /** C = A + B
-   @param B    another matrix
-   @return     A + B
-   */
-
-   public Matrix plus (Matrix B) {
-      checkMatrixDimensions(B);
-      Matrix X = new Matrix(m,n);
-      double[][] C = X.getArray();
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            C[i][j] = A[i][j] + B.A[i][j];
-         }
-      }
-      return X;
-   }
-
-   /** A = A + B
-   @param B    another matrix
-   @return     A + B
-   */
-
-   public Matrix plusEquals (Matrix B) {
-      checkMatrixDimensions(B);
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            A[i][j] = A[i][j] + B.A[i][j];
-         }
-      }
-      return this;
-   }
-
-   /** C = A - B
-   @param B    another matrix
-   @return     A - B
-   */
-
-   public Matrix minus (Matrix B) {
-      checkMatrixDimensions(B);
-      Matrix X = new Matrix(m,n);
-      double[][] C = X.getArray();
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            C[i][j] = A[i][j] - B.A[i][j];
-         }
-      }
-      return X;
-   }
-
-   /** A = A - B
-   @param B    another matrix
-   @return     A - B
-   */
-
-   public Matrix minusEquals (Matrix B) {
-      checkMatrixDimensions(B);
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            A[i][j] = A[i][j] - B.A[i][j];
-         }
-      }
-      return this;
-   }
-
-   /** Element-by-element multiplication, C = A.*B
-   @param B    another matrix
-   @return     A.*B
-   */
-
-   public Matrix arrayTimes (Matrix B) {
-      checkMatrixDimensions(B);
-      Matrix X = new Matrix(m,n);
-      double[][] C = X.getArray();
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            C[i][j] = A[i][j] * B.A[i][j];
-         }
-      }
-      return X;
-   }
-
-   /** Element-by-element multiplication in place, A = A.*B
-   @param B    another matrix
-   @return     A.*B
-   */
-
-   public Matrix arrayTimesEquals (Matrix B) {
-      checkMatrixDimensions(B);
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            A[i][j] = A[i][j] * B.A[i][j];
-         }
-      }
-      return this;
-   }
-
-   /** Element-by-element right division, C = A./B
-   @param B    another matrix
-   @return     A./B
-   */
-
-   public Matrix arrayRightDivide (Matrix B) {
-      checkMatrixDimensions(B);
-      Matrix X = new Matrix(m,n);
-      double[][] C = X.getArray();
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            C[i][j] = A[i][j] / B.A[i][j];
-         }
-      }
-      return X;
-   }
-
-   /** Element-by-element right division in place, A = A./B
-   @param B    another matrix
-   @return     A./B
-   */
-
-   public Matrix arrayRightDivideEquals (Matrix B) {
-      checkMatrixDimensions(B);
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            A[i][j] = A[i][j] / B.A[i][j];
-         }
-      }
-      return this;
-   }
-
-   /** Element-by-element left division, C = A.\B
-   @param B    another matrix
-   @return     A.\B
-   */
-
-   public Matrix arrayLeftDivide (Matrix B) {
-      checkMatrixDimensions(B);
-      Matrix X = new Matrix(m,n);
-      double[][] C = X.getArray();
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            C[i][j] = B.A[i][j] / A[i][j];
-         }
-      }
-      return X;
-   }
-
-   /** Element-by-element left division in place, A = A.\B
-   @param B    another matrix
-   @return     A.\B
-   */
-
-   public Matrix arrayLeftDivideEquals (Matrix B) {
-      checkMatrixDimensions(B);
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            A[i][j] = B.A[i][j] / A[i][j];
-         }
-      }
-      return this;
-   }
-
-   /** Multiply a matrix by a scalar, C = s*A
-   @param s    scalar
-   @return     s*A
-   */
-
-   public Matrix times (double s) {
-      Matrix X = new Matrix(m,n);
-      double[][] C = X.getArray();
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            C[i][j] = s*A[i][j];
-         }
-      }
-      return X;
-   }
-
-   /** Multiply a matrix by a scalar in place, A = s*A
-   @param s    scalar
-   @return     replace A by s*A
-   */
-
-   public Matrix timesEquals (double s) {
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            A[i][j] = s*A[i][j];
-         }
-      }
-      return this;
-   }
-
-   /** Linear algebraic matrix multiplication, A * B
-   @param B    another matrix
-   @return     Matrix product, A * B
-   @exception  IllegalArgumentException Matrix inner dimensions must agree.
-   */
-
-   public Matrix times (Matrix B) {
-      if (B.m != n) {
-         throw new IllegalArgumentException("Matrix inner dimensions must agree.");
-      }
-      Matrix X = new Matrix(m,B.n);
-      double[][] C = X.getArray();
-      double[] Bcolj = new double[n];
-      for (int j = 0; j < B.n; j++) {
-         for (int k = 0; k < n; k++) {
-            Bcolj[k] = B.A[k][j];
-         }
-         for (int i = 0; i < m; i++) {
-            double[] Arowi = A[i];
-            double s = 0;
-            for (int k = 0; k < n; k++) {
-               s += Arowi[k]*Bcolj[k];
-            }
-            C[i][j] = s;
-         }
-      }
-      return X;
-   }
-
-   /** LU Decomposition
-   @return     LUDecomposition
-   @see LUDecomposition
-   */
-
-   public LUDecomposition lu () {
-      return new LUDecomposition(this);
-   }
-
-   /** QR Decomposition
-   @return     QRDecomposition
-   @see QRDecomposition
-   */
-
-   public QRDecomposition qr () {
-      return new QRDecomposition(this);
-   }
-
-   /** Cholesky Decomposition
-   @return     CholeskyDecomposition
-   @see CholeskyDecomposition
-   */
-
-   public CholeskyDecomposition chol () {
-      return new CholeskyDecomposition(this);
-   }
-
-   /** Singular Value Decomposition
-   @return     SingularValueDecomposition
-   @see SingularValueDecomposition
-   */
-
-   public SingularValueDecomposition svd () {
-      return new SingularValueDecomposition(this);
-   }
-
-   /** Eigenvalue Decomposition
-   @return     EigenvalueDecomposition
-   @see EigenvalueDecomposition
-   */
-
-   public EigenvalueDecomposition eig () {
-      return new EigenvalueDecomposition(this);
-   }
-
-   /** Solve A*X = B
-   @param B    right hand side
-   @return     solution if A is square, least squares solution otherwise
-   */
-
-   public Matrix solve (Matrix B) {
-      return (m == n ? (new LUDecomposition(this)).solve(B) :
-                       (new QRDecomposition(this)).solve(B));
-   }
-
-   /** Solve X*A = B, which is also A'*X' = B'
-   @param B    right hand side
-   @return     solution if A is square, least squares solution otherwise.
-   */
-
-   public Matrix solveTranspose (Matrix B) {
-      return transpose().solve(B.transpose());
-   }
-
-   /** Matrix inverse or pseudoinverse
-   @return     inverse(A) if A is square, pseudoinverse otherwise.
-   */
-
-   public Matrix inverse () {
-      return solve(identity(m,m));
-   }
-
-   /** Matrix determinant
-   @return     determinant
-   */
-
-   public double det () {
-      return new LUDecomposition(this).det();
-   }
-
-   /** Matrix rank
-   @return     effective numerical rank, obtained from SVD.
-   */
-
-   public int rank () {
-      return new SingularValueDecomposition(this).rank();
-   }
-
-   /** Matrix condition (2 norm)
-   @return     ratio of largest to smallest singular value.
-   */
-
-   public double cond () {
-      return new SingularValueDecomposition(this).cond();
-   }
-
-   /** Matrix trace.
-   @return     sum of the diagonal elements.
-   */
-
-   public double trace () {
-      double t = 0;
-      for (int i = 0; i < Math.min(m,n); i++) {
-         t += A[i][i];
-      }
-      return t;
-   }
-
-   /** Generate matrix with random elements
-   @param m    Number of rows.
-   @param n    Number of colums.
-   @return     An m-by-n matrix with uniformly distributed random elements.
-   */
-
-   public static Matrix random (int m, int n) {
-      Matrix A = new Matrix(m,n);
-      double[][] X = A.getArray();
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            X[i][j] = Math.random();
-         }
-      }
-      return A;
-   }
-
-   /** Generate identity matrix
-   @param m    Number of rows.
-   @param n    Number of colums.
-   @return     An m-by-n matrix with ones on the diagonal and zeros elsewhere.
-   */
-
-   public static Matrix identity (int m, int n) {
-      Matrix A = new Matrix(m,n);
-      double[][] X = A.getArray();
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            X[i][j] = (i == j ? 1.0 : 0.0);
-         }
-      }
-      return A;
-   }
-
-
-   /** Print the matrix to stdout.   Line the elements up in columns
-     * with a Fortran-like 'Fw.d' style format.
-   @param w    Column width.
-   @param d    Number of digits after the decimal.
-   */
-
-   public void print (int w, int d) {
-      print(new PrintWriter(System.out,true),w,d); }
-
-   /** Print the matrix to the output stream.   Line the elements up in
-     * columns with a Fortran-like 'Fw.d' style format.
-   @param output Output stream.
-   @param w      Column width.
-   @param d      Number of digits after the decimal.
-   */
-
-   public void print (PrintWriter output, int w, int d) {
-      DecimalFormat format = new DecimalFormat();
-      format.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US));
-      format.setMinimumIntegerDigits(1);
-      format.setMaximumFractionDigits(d);
-      format.setMinimumFractionDigits(d);
-      format.setGroupingUsed(false);
-      print(output,format,w+2);
-   }
-
-   /** Print the matrix to stdout.  Line the elements up in columns.
-     * Use the format object, and right justify within columns of width
-     * characters.
-     * Note that is the matrix is to be read back in, you probably will want
-     * to use a NumberFormat that is set to US Locale.
-   @param format A  Formatting object for individual elements.
-   @param width     Field width for each column.
-   @see java.text.DecimalFormat#setDecimalFormatSymbols
-   */
-
-   public void print (NumberFormat format, int width) {
-      print(new PrintWriter(System.out,true),format,width); }
-
-   // DecimalFormat is a little disappointing coming from Fortran or C's printf.
-   // Since it doesn't pad on the left, the elements will come out different
-   // widths.  Consequently, we'll pass the desired column width in as an
-   // argument and do the extra padding ourselves.
-
-   /** Print the matrix to the output stream.  Line the elements up in columns.
-     * Use the format object, and right justify within columns of width
-     * characters.
-     * Note that is the matrix is to be read back in, you probably will want
-     * to use a NumberFormat that is set to US Locale.
-   @param output the output stream.
-   @param format A formatting object to format the matrix elements 
-   @param width  Column width.
-   @see java.text.DecimalFormat#setDecimalFormatSymbols
-   */
-
-   public void print (PrintWriter output, NumberFormat format, int width) {
-      output.println();  // start on new line.
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            String s = format.format(A[i][j]); // format the number
-            int padding = Math.max(1,width-s.length()); // At _least_ 1 space
-            for (int k = 0; k < padding; k++)
-               output.print(' ');
-            output.print(s);
-         }
-         output.println();
-      }
-      output.println();   // end with blank line.
-   }
-
-   /** Read a matrix from a stream.  The format is the same the print method,
-     * so printed matrices can be read back in (provided they were printed using
-     * US Locale).  Elements are separated by
-     * whitespace, all the elements for each row appear on a single line,
-     * the last row is followed by a blank line.
-   @param input the input stream.
-   */
-
-   public static Matrix read (BufferedReader input) throws java.io.IOException {
-      StreamTokenizer tokenizer= new StreamTokenizer(input);
-
-      // Although StreamTokenizer will parse numbers, it doesn't recognize
-      // scientific notation (E or D); however, Double.valueOf does.
-      // The strategy here is to disable StreamTokenizer's number parsing.
-      // We'll only get whitespace delimited words, EOL's and EOF's.
-      // These words should all be numbers, for Double.valueOf to parse.
-
-      tokenizer.resetSyntax();
-      tokenizer.wordChars(0,255);
-      tokenizer.whitespaceChars(0, ' ');
-      tokenizer.eolIsSignificant(true);
-      java.util.Vector v = new java.util.Vector();
-
-      // Ignore initial empty lines
-      while (tokenizer.nextToken() == StreamTokenizer.TT_EOL);
-      if (tokenizer.ttype == StreamTokenizer.TT_EOF)
-	throw new java.io.IOException("Unexpected EOF on matrix read.");
-      do {
-         v.addElement(Double.valueOf(tokenizer.sval)); // Read & store 1st row.
-      } while (tokenizer.nextToken() == StreamTokenizer.TT_WORD);
-
-      int n = v.size();  // Now we've got the number of columns!
-      double row[] = new double[n];
-      for (int j=0; j<n; j++)  // extract the elements of the 1st row.
-         row[j]=((Double)v.elementAt(j)).doubleValue();
-      v.removeAllElements();
-      v.addElement(row);  // Start storing rows instead of columns.
-      while (tokenizer.nextToken() == StreamTokenizer.TT_WORD) {
-         // While non-empty lines
-         v.addElement(row = new double[n]);
-         int j = 0;
-         do {
-            if (j >= n) throw new java.io.IOException
-               ("Row " + v.size() + " is too long.");
-            row[j++] = Double.valueOf(tokenizer.sval).doubleValue();
-         } while (tokenizer.nextToken() == StreamTokenizer.TT_WORD);
-         if (j < n) throw new java.io.IOException
-            ("Row " + v.size() + " is too short.");
-      }
-      int m = v.size();  // Now we've got the number of rows.
-      double[][] A = new double[m][];
-      v.copyInto(A);  // copy the rows out of the vector
-      return new Matrix(A);
-   }
-
-
-/* ------------------------
-   Private Methods
- * ------------------------ */
-
-   /** Check if size(A) == size(B) **/
-
-   private void checkMatrixDimensions (Matrix B) {
-      if (B.m != m || B.n != n) {
-         throw new IllegalArgumentException("Matrix dimensions must agree.");
-      }
-   }
-
-}
diff --git a/geogebra/kernel/jama/QRDecomposition.java b/geogebra/kernel/jama/QRDecomposition.java
deleted file mode 100644
index 0f71bbc..0000000
--- a/geogebra/kernel/jama/QRDecomposition.java
+++ /dev/null
@@ -1,218 +0,0 @@
-package geogebra.kernel.jama;
-import geogebra.kernel.jama.util.*;
-
-/** QR Decomposition.
-<P>
-   For an m-by-n matrix A with m >= n, the QR decomposition is an m-by-n
-   orthogonal matrix Q and an n-by-n upper triangular matrix R so that
-   A = Q*R.
-<P>
-   The QR decompostion always exists, even if the matrix does not have
-   full rank, so the constructor will never fail.  The primary use of the
-   QR decomposition is in the least squares solution of nonsquare systems
-   of simultaneous linear equations.  This will fail if isFullRank()
-   returns false.
-*/
-
-public class QRDecomposition implements java.io.Serializable {
-
-/* ------------------------
-   Class variables
- * ------------------------ */
-
-   /** Array for internal storage of decomposition.
-   @serial internal array storage.
-   */
-   private double[][] QR;
-
-   /** Row and column dimensions.
-   @serial column dimension.
-   @serial row dimension.
-   */
-   private int m, n;
-
-   /** Array for internal storage of diagonal of R.
-   @serial diagonal of R.
-   */
-   private double[] Rdiag;
-
-/* ------------------------
-   Constructor
- * ------------------------ */
-
-   /** QR Decomposition, computed by Householder reflections.
-   @param A    Rectangular matrix
-   @return     Structure to access R and the Householder vectors and compute Q.
-   */
-
-   public QRDecomposition (Matrix A) {
-      // Initialize.
-      QR = A.getArrayCopy();
-      m = A.getRowDimension();
-      n = A.getColumnDimension();
-      Rdiag = new double[n];
-
-      // Main loop.
-      for (int k = 0; k < n; k++) {
-         // Compute 2-norm of k-th column without under/overflow.
-         double nrm = 0;
-         for (int i = k; i < m; i++) {
-            nrm = Maths.hypot(nrm,QR[i][k]);
-         }
-
-         if (nrm != 0.0) {
-            // Form k-th Householder vector.
-            if (QR[k][k] < 0) {
-               nrm = -nrm;
-            }
-            for (int i = k; i < m; i++) {
-               QR[i][k] /= nrm;
-            }
-            QR[k][k] += 1.0;
-
-            // Apply transformation to remaining columns.
-            for (int j = k+1; j < n; j++) {
-               double s = 0.0; 
-               for (int i = k; i < m; i++) {
-                  s += QR[i][k]*QR[i][j];
-               }
-               s = -s/QR[k][k];
-               for (int i = k; i < m; i++) {
-                  QR[i][j] += s*QR[i][k];
-               }
-            }
-         }
-         Rdiag[k] = -nrm;
-      }
-   }
-
-/* ------------------------
-   Public Methods
- * ------------------------ */
-
-   /** Is the matrix full rank?
-   @return     true if R, and hence A, has full rank.
-   */
-
-   public boolean isFullRank () {
-      for (int j = 0; j < n; j++) {
-         if (Rdiag[j] == 0)
-            return false;
-      }
-      return true;
-   }
-
-   /** Return the Householder vectors
-   @return     Lower trapezoidal matrix whose columns define the reflections
-   */
-
-   public Matrix getH () {
-      Matrix X = new Matrix(m,n);
-      double[][] H = X.getArray();
-      for (int i = 0; i < m; i++) {
-         for (int j = 0; j < n; j++) {
-            if (i >= j) {
-               H[i][j] = QR[i][j];
-            } else {
-               H[i][j] = 0.0;
-            }
-         }
-      }
-      return X;
-   }
-
-   /** Return the upper triangular factor
-   @return     R
-   */
-
-   public Matrix getR () {
-      Matrix X = new Matrix(n,n);
-      double[][] R = X.getArray();
-      for (int i = 0; i < n; i++) {
-         for (int j = 0; j < n; j++) {
-            if (i < j) {
-               R[i][j] = QR[i][j];
-            } else if (i == j) {
-               R[i][j] = Rdiag[i];
-            } else {
-               R[i][j] = 0.0;
-            }
-         }
-      }
-      return X;
-   }
-
-   /** Generate and return the (economy-sized) orthogonal factor
-   @return     Q
-   */
-
-   public Matrix getQ () {
-      Matrix X = new Matrix(m,n);
-      double[][] Q = X.getArray();
-      for (int k = n-1; k >= 0; k--) {
-         for (int i = 0; i < m; i++) {
-            Q[i][k] = 0.0;
-         }
-         Q[k][k] = 1.0;
-         for (int j = k; j < n; j++) {
-            if (QR[k][k] != 0) {
-               double s = 0.0;
-               for (int i = k; i < m; i++) {
-                  s += QR[i][k]*Q[i][j];
-               }
-               s = -s/QR[k][k];
-               for (int i = k; i < m; i++) {
-                  Q[i][j] += s*QR[i][k];
-               }
-            }
-         }
-      }
-      return X;
-   }
-
-   /** Least squares solution of A*X = B
-   @param B    A Matrix with as many rows as A and any number of columns.
-   @return     X that minimizes the two norm of Q*R*X-B.
-   @exception  IllegalArgumentException  Matrix row dimensions must agree.
-   @exception  RuntimeException  Matrix is rank deficient.
-   */
-
-   public Matrix solve (Matrix B) {
-      if (B.getRowDimension() != m) {
-         throw new IllegalArgumentException("Matrix row dimensions must agree.");
-      }
-      if (!this.isFullRank()) {
-         throw new RuntimeException("Matrix is rank deficient.");
-      }
-      
-      // Copy right hand side
-      int nx = B.getColumnDimension();
-      double[][] X = B.getArrayCopy();
-
-      // Compute Y = transpose(Q)*B
-      for (int k = 0; k < n; k++) {
-         for (int j = 0; j < nx; j++) {
-            double s = 0.0; 
-            for (int i = k; i < m; i++) {
-               s += QR[i][k]*X[i][j];
-            }
-            s = -s/QR[k][k];
-            for (int i = k; i < m; i++) {
-               X[i][j] += s*QR[i][k];
-            }
-         }
-      }
-      // Solve R*X = Y;
-      for (int k = n-1; k >= 0; k--) {
-         for (int j = 0; j < nx; j++) {
-            X[k][j] /= Rdiag[k];
-         }
-         for (int i = 0; i < k; i++) {
-            for (int j = 0; j < nx; j++) {
-               X[i][j] -= X[k][j]*QR[i][k];
-            }
-         }
-      }
-      return (new Matrix(X,n,nx).getMatrix(0,n-1,0,nx-1));
-   }
-}
diff --git a/geogebra/kernel/jama/SingularValueDecomposition.java b/geogebra/kernel/jama/SingularValueDecomposition.java
deleted file mode 100644
index ea7054b..0000000
--- a/geogebra/kernel/jama/SingularValueDecomposition.java
+++ /dev/null
@@ -1,547 +0,0 @@
-package geogebra.kernel.jama;
-import geogebra.kernel.jama.util.*;
-
-   /** Singular Value Decomposition.
-   <P>
-   For an m-by-n matrix A with m >= n, the singular value decomposition is
-   an m-by-n orthogonal matrix U, an n-by-n diagonal matrix S, and
-   an n-by-n orthogonal matrix V so that A = U*S*V'.
-   <P>
-   The singular values, sigma[k] = S[k][k], are ordered so that
-   sigma[0] >= sigma[1] >= ... >= sigma[n-1].
-   <P>
-   The singular value decompostion always exists, so the constructor will
-   never fail.  The matrix condition number and the effective numerical
-   rank can be computed from this decomposition.
-   */
-
-public class SingularValueDecomposition implements java.io.Serializable {
-
-/* ------------------------
-   Class variables
- * ------------------------ */
-
-   /** Arrays for internal storage of U and V.
-   @serial internal storage of U.
-   @serial internal storage of V.
-   */
-   private double[][] U, V;
-
-   /** Array for internal storage of singular values.
-   @serial internal storage of singular values.
-   */
-   private double[] s;
-
-   /** Row and column dimensions.
-   @serial row dimension.
-   @serial column dimension.
-   */
-   private int m, n;
-
-/* ------------------------
-   Constructor
- * ------------------------ */
-
-   /** Construct the singular value decomposition
-   @param A    Rectangular matrix
-   @return     Structure to access U, S and V.
-   */
-
-   public SingularValueDecomposition (Matrix Arg) {
-
-      // Derived from LINPACK code.
-      // Initialize.
-      double[][] A = Arg.getArrayCopy();
-      m = Arg.getRowDimension();
-      n = Arg.getColumnDimension();
-
-      /* Apparently the failing cases are only a proper subset of (m<n), 
-	 so let's not throw error.  Correct fix to come later?
-      if (m<n) {
-	  throw new IllegalArgumentException("Jama SVD only works for m >= n"); }
-      */
-      int nu = Math.min(m,n);
-      s = new double [Math.min(m+1,n)];
-      U = new double [m][nu];
-      V = new double [n][n];
-      double[] e = new double [n];
-      double[] work = new double [m];
-      boolean wantu = true;
-      boolean wantv = true;
-
-      // Reduce A to bidiagonal form, storing the diagonal elements
-      // in s and the super-diagonal elements in e.
-
-      int nct = Math.min(m-1,n);
-      int nrt = Math.max(0,Math.min(n-2,m));
-      for (int k = 0; k < Math.max(nct,nrt); k++) {
-         if (k < nct) {
-
-            // Compute the transformation for the k-th column and
-            // place the k-th diagonal in s[k].
-            // Compute 2-norm of k-th column without under/overflow.
-            s[k] = 0;
-            for (int i = k; i < m; i++) {
-               s[k] = Maths.hypot(s[k],A[i][k]);
-            }
-            if (s[k] != 0.0) {
-               if (A[k][k] < 0.0) {
-                  s[k] = -s[k];
-               }
-               for (int i = k; i < m; i++) {
-                  A[i][k] /= s[k];
-               }
-               A[k][k] += 1.0;
-            }
-            s[k] = -s[k];
-         }
-         for (int j = k+1; j < n; j++) {
-            if ((k < nct) & (s[k] != 0.0))  {
-
-            // Apply the transformation.
-
-               double t = 0;
-               for (int i = k; i < m; i++) {
-                  t += A[i][k]*A[i][j];
-               }
-               t = -t/A[k][k];
-               for (int i = k; i < m; i++) {
-                  A[i][j] += t*A[i][k];
-               }
-            }
-
-            // Place the k-th row of A into e for the
-            // subsequent calculation of the row transformation.
-
-            e[j] = A[k][j];
-         }
-         if (wantu & (k < nct)) {
-
-            // Place the transformation in U for subsequent back
-            // multiplication.
-
-            for (int i = k; i < m; i++) {
-               U[i][k] = A[i][k];
-            }
-         }
-         if (k < nrt) {
-
-            // Compute the k-th row transformation and place the
-            // k-th super-diagonal in e[k].
-            // Compute 2-norm without under/overflow.
-            e[k] = 0;
-            for (int i = k+1; i < n; i++) {
-               e[k] = Maths.hypot(e[k],e[i]);
-            }
-            if (e[k] != 0.0) {
-               if (e[k+1] < 0.0) {
-                  e[k] = -e[k];
-               }
-               for (int i = k+1; i < n; i++) {
-                  e[i] /= e[k];
-               }
-               e[k+1] += 1.0;
-            }
-            e[k] = -e[k];
-            if ((k+1 < m) & (e[k] != 0.0)) {
-
-            // Apply the transformation.
-
-               for (int i = k+1; i < m; i++) {
-                  work[i] = 0.0;
-               }
-               for (int j = k+1; j < n; j++) {
-                  for (int i = k+1; i < m; i++) {
-                     work[i] += e[j]*A[i][j];
-                  }
-               }
-               for (int j = k+1; j < n; j++) {
-                  double t = -e[j]/e[k+1];
-                  for (int i = k+1; i < m; i++) {
-                     A[i][j] += t*work[i];
-                  }
-               }
-            }
-            if (wantv) {
-
-            // Place the transformation in V for subsequent
-            // back multiplication.
-
-               for (int i = k+1; i < n; i++) {
-                  V[i][k] = e[i];
-               }
-            }
-         }
-      }
-
-      // Set up the final bidiagonal matrix or order p.
-
-      int p = Math.min(n,m+1);
-      if (nct < n) {
-         s[nct] = A[nct][nct];
-      }
-      if (m < p) {
-         s[p-1] = 0.0;
-      }
-      if (nrt+1 < p) {
-         e[nrt] = A[nrt][p-1];
-      }
-      e[p-1] = 0.0;
-
-      // If required, generate U.
-
-      if (wantu) {
-         for (int j = nct; j < nu; j++) {
-            for (int i = 0; i < m; i++) {
-               U[i][j] = 0.0;
-            }
-            U[j][j] = 1.0;
-         }
-         for (int k = nct-1; k >= 0; k--) {
-            if (s[k] != 0.0) {
-               for (int j = k+1; j < nu; j++) {
-                  double t = 0;
-                  for (int i = k; i < m; i++) {
-                     t += U[i][k]*U[i][j];
-                  }
-                  t = -t/U[k][k];
-                  for (int i = k; i < m; i++) {
-                     U[i][j] += t*U[i][k];
-                  }
-               }
-               for (int i = k; i < m; i++ ) {
-                  U[i][k] = -U[i][k];
-               }
-               U[k][k] = 1.0 + U[k][k];
-               for (int i = 0; i < k-1; i++) {
-                  U[i][k] = 0.0;
-               }
-            } else {
-               for (int i = 0; i < m; i++) {
-                  U[i][k] = 0.0;
-               }
-               U[k][k] = 1.0;
-            }
-         }
-      }
-
-      // If required, generate V.
-
-      if (wantv) {
-         for (int k = n-1; k >= 0; k--) {
-            if ((k < nrt) & (e[k] != 0.0)) {
-               for (int j = k+1; j < nu; j++) {
-                  double t = 0;
-                  for (int i = k+1; i < n; i++) {
-                     t += V[i][k]*V[i][j];
-                  }
-                  t = -t/V[k+1][k];
-                  for (int i = k+1; i < n; i++) {
-                     V[i][j] += t*V[i][k];
-                  }
-               }
-            }
-            for (int i = 0; i < n; i++) {
-               V[i][k] = 0.0;
-            }
-            V[k][k] = 1.0;
-         }
-      }
-
-      // Main iteration loop for the singular values.
-
-      int pp = p-1;
-      int iter = 0;
-      double eps = Math.pow(2.0,-52.0);
-      double tiny = Math.pow(2.0,-966.0);
-      while (p > 0) {
-         int k,kase;
-
-         // Here is where a test for too many iterations would go.
-
-         // This section of the program inspects for
-         // negligible elements in the s and e arrays.  On
-         // completion the variables kase and k are set as follows.
-
-         // kase = 1     if s(p) and e[k-1] are negligible and k<p
-         // kase = 2     if s(k) is negligible and k<p
-         // kase = 3     if e[k-1] is negligible, k<p, and
-         //              s(k), ..., s(p) are not negligible (qr step).
-         // kase = 4     if e(p-1) is negligible (convergence).
-
-         for (k = p-2; k >= -1; k--) {
-            if (k == -1) {
-               break;
-            }
-            if (Math.abs(e[k]) <=
-                  tiny + eps*(Math.abs(s[k]) + Math.abs(s[k+1]))) {
-               e[k] = 0.0;
-               break;
-            }
-         }
-         if (k == p-2) {
-            kase = 4;
-         } else {
-            int ks;
-            for (ks = p-1; ks >= k; ks--) {
-               if (ks == k) {
-                  break;
-               }
-               double t = (ks != p ? Math.abs(e[ks]) : 0.) + 
-                          (ks != k+1 ? Math.abs(e[ks-1]) : 0.);
-               if (Math.abs(s[ks]) <= tiny + eps*t)  {
-                  s[ks] = 0.0;
-                  break;
-               }
-            }
-            if (ks == k) {
-               kase = 3;
-            } else if (ks == p-1) {
-               kase = 1;
-            } else {
-               kase = 2;
-               k = ks;
-            }
-         }
-         k++;
-
-         // Perform the task indicated by kase.
-
-         switch (kase) {
-
-            // Deflate negligible s(p).
-
-            case 1: {
-               double f = e[p-2];
-               e[p-2] = 0.0;
-               for (int j = p-2; j >= k; j--) {
-                  double t = Maths.hypot(s[j],f);
-                  double cs = s[j]/t;
-                  double sn = f/t;
-                  s[j] = t;
-                  if (j != k) {
-                     f = -sn*e[j-1];
-                     e[j-1] = cs*e[j-1];
-                  }
-                  if (wantv) {
-                     for (int i = 0; i < n; i++) {
-                        t = cs*V[i][j] + sn*V[i][p-1];
-                        V[i][p-1] = -sn*V[i][j] + cs*V[i][p-1];
-                        V[i][j] = t;
-                     }
-                  }
-               }
-            }
-            break;
-
-            // Split at negligible s(k).
-
-            case 2: {
-               double f = e[k-1];
-               e[k-1] = 0.0;
-               for (int j = k; j < p; j++) {
-                  double t = Maths.hypot(s[j],f);
-                  double cs = s[j]/t;
-                  double sn = f/t;
-                  s[j] = t;
-                  f = -sn*e[j];
-                  e[j] = cs*e[j];
-                  if (wantu) {
-                     for (int i = 0; i < m; i++) {
-                        t = cs*U[i][j] + sn*U[i][k-1];
-                        U[i][k-1] = -sn*U[i][j] + cs*U[i][k-1];
-                        U[i][j] = t;
-                     }
-                  }
-               }
-            }
-            break;
-
-            // Perform one qr step.
-
-            case 3: {
-
-               // Calculate the shift.
-   
-               double scale = Math.max(Math.max(Math.max(Math.max(
-                       Math.abs(s[p-1]),Math.abs(s[p-2])),Math.abs(e[p-2])), 
-                       Math.abs(s[k])),Math.abs(e[k]));
-               double sp = s[p-1]/scale;
-               double spm1 = s[p-2]/scale;
-               double epm1 = e[p-2]/scale;
-               double sk = s[k]/scale;
-               double ek = e[k]/scale;
-               double b = ((spm1 + sp)*(spm1 - sp) + epm1*epm1)/2.0;
-               double c = (sp*epm1)*(sp*epm1);
-               double shift = 0.0;
-               if ((b != 0.0) | (c != 0.0)) {
-                  shift = Math.sqrt(b*b + c);
-                  if (b < 0.0) {
-                     shift = -shift;
-                  }
-                  shift = c/(b + shift);
-               }
-               double f = (sk + sp)*(sk - sp) + shift;
-               double g = sk*ek;
-   
-               // Chase zeros.
-   
-               for (int j = k; j < p-1; j++) {
-                  double t = Maths.hypot(f,g);
-                  double cs = f/t;
-                  double sn = g/t;
-                  if (j != k) {
-                     e[j-1] = t;
-                  }
-                  f = cs*s[j] + sn*e[j];
-                  e[j] = cs*e[j] - sn*s[j];
-                  g = sn*s[j+1];
-                  s[j+1] = cs*s[j+1];
-                  if (wantv) {
-                     for (int i = 0; i < n; i++) {
-                        t = cs*V[i][j] + sn*V[i][j+1];
-                        V[i][j+1] = -sn*V[i][j] + cs*V[i][j+1];
-                        V[i][j] = t;
-                     }
-                  }
-                  t = Maths.hypot(f,g);
-                  cs = f/t;
-                  sn = g/t;
-                  s[j] = t;
-                  f = cs*e[j] + sn*s[j+1];
-                  s[j+1] = -sn*e[j] + cs*s[j+1];
-                  g = sn*e[j+1];
-                  e[j+1] = cs*e[j+1];
-                  if (wantu && (j < m-1)) {
-                     for (int i = 0; i < m; i++) {
-                        t = cs*U[i][j] + sn*U[i][j+1];
-                        U[i][j+1] = -sn*U[i][j] + cs*U[i][j+1];
-                        U[i][j] = t;
-                     }
-                  }
-               }
-               e[p-2] = f;
-               iter = iter + 1;
-            }
-            break;
-
-            // Convergence.
-
-            case 4: {
-
-               // Make the singular values positive.
-   
-               if (s[k] <= 0.0) {
-                  s[k] = (s[k] < 0.0 ? -s[k] : 0.0);
-                  if (wantv) {
-                     for (int i = 0; i <= pp; i++) {
-                        V[i][k] = -V[i][k];
-                     }
-                  }
-               }
-   
-               // Order the singular values.
-   
-               while (k < pp) {
-                  if (s[k] >= s[k+1]) {
-                     break;
-                  }
-                  double t = s[k];
-                  s[k] = s[k+1];
-                  s[k+1] = t;
-                  if (wantv && (k < n-1)) {
-                     for (int i = 0; i < n; i++) {
-                        t = V[i][k+1]; V[i][k+1] = V[i][k]; V[i][k] = t;
-                     }
-                  }
-                  if (wantu && (k < m-1)) {
-                     for (int i = 0; i < m; i++) {
-                        t = U[i][k+1]; U[i][k+1] = U[i][k]; U[i][k] = t;
-                     }
-                  }
-                  k++;
-               }
-               iter = 0;
-               p--;
-            }
-            break;
-         }
-      }
-   }
-
-/* ------------------------
-   Public Methods
- * ------------------------ */
-
-   /** Return the left singular vectors
-   @return     U
-   */
-
-   public Matrix getU () {
-      return new Matrix(U,m,Math.min(m+1,n));
-   }
-
-   /** Return the right singular vectors
-   @return     V
-   */
-
-   public Matrix getV () {
-      return new Matrix(V,n,n);
-   }
-
-   /** Return the one-dimensional array of singular values
-   @return     diagonal of S.
-   */
-
-   public double[] getSingularValues () {
-      return s;
-   }
-
-   /** Return the diagonal matrix of singular values
-   @return     S
-   */
-
-   public Matrix getS () {
-      Matrix X = new Matrix(n,n);
-      double[][] S = X.getArray();
-      for (int i = 0; i < n; i++) {
-         for (int j = 0; j < n; j++) {
-            S[i][j] = 0.0;
-         }
-         S[i][i] = this.s[i];
-      }
-      return X;
-   }
-
-   /** Two norm
-   @return     max(S)
-   */
-
-   public double norm2 () {
-      return s[0];
-   }
-
-   /** Two norm condition number
-   @return     max(S)/min(S)
-   */
-
-   public double cond () {
-      return s[0]/s[Math.min(m,n)-1];
-   }
-
-   /** Effective numerical matrix rank
-   @return     Number of nonnegligible singular values.
-   */
-
-   public int rank () {
-      double eps = Math.pow(2.0,-52.0);
-      double tol = Math.max(m,n)*s[0]*eps;
-      int r = 0;
-      for (int i = 0; i < s.length; i++) {
-         if (s[i] > tol) {
-            r++;
-         }
-      }
-      return r;
-   }
-}
diff --git a/geogebra/kernel/jama/util/Maths.java b/geogebra/kernel/jama/util/Maths.java
deleted file mode 100644
index 1776a51..0000000
--- a/geogebra/kernel/jama/util/Maths.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package geogebra.kernel.jama.util;
-
-public class Maths {
-
-   /** sqrt(a^2 + b^2) without under/overflow. **/
-
-   public static double hypot(double a, double b) {
-      double r;
-      if (Math.abs(a) > Math.abs(b)) {
-         r = b/a;
-         r = Math.abs(a)*Math.sqrt(1+r*r);
-      } else if (b != 0) {
-         r = a/b;
-         r = Math.abs(b)*Math.sqrt(1+r*r);
-      } else {
-         r = 0.0;
-      }
-      return r;
-   }
-}
diff --git a/geogebra/kernel/parser/Parser.jj b/geogebra/kernel/parser/Parser.jj
index 7d88d89..21d1002 100644
--- a/geogebra/kernel/parser/Parser.jj
+++ b/geogebra/kernel/parser/Parser.jj
@@ -173,7 +173,7 @@ TOKEN : {
         | "." <INTEGER> 
         | <INTEGER> "."
         >
- |     < EFLOAT: <FLOAT> "E"  (<MINUS>)? <INTEGER> >
+ |     < EFLOAT: <FLOAT> "E"  (<PLUS>|<MINUS>)? <INTEGER> >
   |     < #INTEGER: ( <DIGIT> )+ >
   |     < #DIGIT:                                     // unicode digits
        [
diff --git a/geogebra/kernel/statistics/AlgoFitLineX.java b/geogebra/kernel/statistics/AlgoFitLineX.java
index 44ce8f7..ca6692c 100644
--- a/geogebra/kernel/statistics/AlgoFitLineX.java
+++ b/geogebra/kernel/statistics/AlgoFitLineX.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/statistics/AlgoFitLineY.java b/geogebra/kernel/statistics/AlgoFitLineY.java
index 6f6984b..4cb53ee 100644
--- a/geogebra/kernel/statistics/AlgoFitLineY.java
+++ b/geogebra/kernel/statistics/AlgoFitLineY.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/statistics/AlgoInverseNormal.java b/geogebra/kernel/statistics/AlgoInverseNormal.java
index 9fc9dac..a2a4f81 100644
--- a/geogebra/kernel/statistics/AlgoInverseNormal.java
+++ b/geogebra/kernel/statistics/AlgoInverseNormal.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/statistics/AlgoMedian.java b/geogebra/kernel/statistics/AlgoMedian.java
index 922d66a..8114511 100644
--- a/geogebra/kernel/statistics/AlgoMedian.java
+++ b/geogebra/kernel/statistics/AlgoMedian.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/statistics/AlgoMode.java b/geogebra/kernel/statistics/AlgoMode.java
index cfd9c35..03b7d3b 100644
--- a/geogebra/kernel/statistics/AlgoMode.java
+++ b/geogebra/kernel/statistics/AlgoMode.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/statistics/AlgoNormal.java b/geogebra/kernel/statistics/AlgoNormal.java
index 45ba9a0..92f30ec 100644
--- a/geogebra/kernel/statistics/AlgoNormal.java
+++ b/geogebra/kernel/statistics/AlgoNormal.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/statistics/AlgoQ1.java b/geogebra/kernel/statistics/AlgoQ1.java
index dee4c14..f461d67 100644
--- a/geogebra/kernel/statistics/AlgoQ1.java
+++ b/geogebra/kernel/statistics/AlgoQ1.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/statistics/AlgoQ3.java b/geogebra/kernel/statistics/AlgoQ3.java
index 96decf2..5cf4659 100644
--- a/geogebra/kernel/statistics/AlgoQ3.java
+++ b/geogebra/kernel/statistics/AlgoQ3.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
 */
diff --git a/geogebra/kernel/statistics/AlgoRandom.java b/geogebra/kernel/statistics/AlgoRandom.java
index 0f59fcf..71759f3 100644
--- a/geogebra/kernel/statistics/AlgoRandom.java
+++ b/geogebra/kernel/statistics/AlgoRandom.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
  */
diff --git a/geogebra/kernel/statistics/AlgoRandomBinomial.java b/geogebra/kernel/statistics/AlgoRandomBinomial.java
index 7bc18ee..c7cc926 100644
--- a/geogebra/kernel/statistics/AlgoRandomBinomial.java
+++ b/geogebra/kernel/statistics/AlgoRandomBinomial.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
  */
diff --git a/geogebra/kernel/statistics/AlgoRandomNormal.java b/geogebra/kernel/statistics/AlgoRandomNormal.java
index 21f2257..e173696 100644
--- a/geogebra/kernel/statistics/AlgoRandomNormal.java
+++ b/geogebra/kernel/statistics/AlgoRandomNormal.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
  */
diff --git a/geogebra/kernel/statistics/AlgoRandomPoisson.java b/geogebra/kernel/statistics/AlgoRandomPoisson.java
index 883513c..6de8a9b 100644
--- a/geogebra/kernel/statistics/AlgoRandomPoisson.java
+++ b/geogebra/kernel/statistics/AlgoRandomPoisson.java
@@ -5,7 +5,7 @@ http://www.geogebra.org
 This file is part of GeoGebra.
 
 This program is free software; you can redistribute it and/or modify it 
-under the terms of the GNU General Public License v2 as published by 
+under the terms of the GNU General Public License as published by 
 the Free Software Foundation.
 
  */
diff --git a/geogebra/main/Application.java b/geogebra/main/Application.java
index 6da86a4..d613cfa 100644
--- a/geogebra/main/Application.java
+++ b/geogebra/main/Application.java
@@ -88,6 +88,7 @@ import javax.imageio.ImageIO;
 import javax.swing.BorderFactory;
 import javax.swing.ImageIcon;
 import javax.swing.JApplet;
+import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JComponent;
 import javax.swing.JDialog;
 import javax.swing.JFrame;
@@ -119,9 +120,7 @@ public abstract class Application implements KeyEventDispatcher {
 	// supported GUI languages (from properties files)
 	public static ArrayList supportedLocales = new ArrayList();
 	static {
-		// TODO: remove IS_PRE_RELEASE
-		if (GeoGebra.IS_PRE_RELEASE)
-			supportedLocales.add(new Locale("sq")); // Albanian
+		supportedLocales.add(new Locale("sq")); // Albanian
 		
 		supportedLocales.add(new Locale("ar")); // Arabic
 		supportedLocales.add(new Locale("eu")); // Basque
@@ -168,23 +167,17 @@ public abstract class Application implements KeyEventDispatcher {
 		supportedLocales.add(new Locale("ro")); // Romanian
 		supportedLocales.add(new Locale("ru")); // Russian
 		supportedLocales.add(new Locale("sr")); // Serbian
-		// TODO: remove IS_PRE_RELEASE
-		if (GeoGebra.IS_PRE_RELEASE)
-			supportedLocales.add(new Locale("si")); // Sinhala (Sri Lanka)
+		supportedLocales.add(new Locale("si")); // Sinhala (Sri Lanka)
 		
 		supportedLocales.add(new Locale("sk")); // Slovakian
 		supportedLocales.add(new Locale("sl")); // Slovenian
 		supportedLocales.add(new Locale("es")); // Spanish
 		supportedLocales.add(new Locale("sv")); // Swedish
 		// supportedLocales.add(new Locale("ty")); // Tahitian
-		// TODO: remove IS_PRE_RELEASE
-		if (GeoGebra.IS_PRE_RELEASE)
-			supportedLocales.add(new Locale("ta")); // Tamil
+		supportedLocales.add(new Locale("ta")); // Tamil
 		
 		// supportedLocales.add(new Locale("te")); // Telugu
-		// TODO: remove IS_PRE_RELEASE
-		if (GeoGebra.IS_PRE_RELEASE)
-			supportedLocales.add(new Locale("th")); // Thai
+		supportedLocales.add(new Locale("th")); // Thai
 
 		supportedLocales.add(new Locale("tr")); // Turkish
 		// supportedLocales.add(new Locale("uk")); // Ukrainian
@@ -3065,12 +3058,48 @@ public abstract class Application implements KeyEventDispatcher {
 	}
 
 	// check if we are on a mac
-	public static boolean MAC_OS = System.getProperty("os.name").toLowerCase(
-			Locale.US).startsWith("mac");
-	public static boolean WINDOWS = System.getProperty("os.name").toLowerCase(
-			Locale.US).startsWith("windows"); // Michael Borcherds 2008-03-21
+	public static String OS = System.getProperty("os.name").toLowerCase(Locale.US);
+	public static boolean MAC_OS = OS.startsWith("mac");
+	public static boolean WINDOWS = OS.startsWith("windows"); // Michael Borcherds 2008-03-21
+	
+			/* current possible values http://mindprod.com/jgloss/properties.html
+			 * AIX
+		Digital Unix
+		FreeBSD
+		HP UX
+		Irix
+		Linux
+		Mac OS
+		Mac OS X
+		MPE/iX
+		Netware 4.11
+		OS/2
+		Solaris
+		Windows 2000
+		Windows 7
+		Windows 95
+		Windows 98
+		Windows NT
+		Windows Vista
+		Windows XP */
+	
+	// make sure still works in the future on eg Windows 9 
+	public static boolean WINDOWS_VISTA_OR_LATER = WINDOWS && !OS.startsWith("windows 2000")
+														   && !OS.startsWith("windows 95")
+														   && !OS.startsWith("windows 98")
+														   && !OS.startsWith("windows nt")
+														   && !OS.startsWith("windows xp");
 
 	/*
+	 * needed for padding in Windows XP or earlier
+	 * without check, checkbox isn't shown in Vista, Win 7
+	 */
+    public void setEmptyIcon(JCheckBoxMenuItem cb) {
+        if (!WINDOWS_VISTA_OR_LATER)
+                cb.setIcon(getEmptyIcon());
+    }
+
+    /*
 	 * check for alt pressed (but not ctrl) (or ctrl but not alt on MacOS)
 	 */
 	public static boolean isAltDown(InputEvent e) {
diff --git a/unix/debcontrol/postinst b/unix/debcontrol/postinst
new file mode 100755
index 0000000..195b1b0
--- /dev/null
+++ b/unix/debcontrol/postinst
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+set -e
+
+if [ "$1" = "configure" ] ; then
+  # update desktop database
+  if [ -x /usr/bin/update-desktop-database ]; then
+    update-desktop-database -q /usr/share/applications
+  fi
+fi
+ # Automatically added by dh_installmime
+if [ "$1" = "configure" ] && [ -x "`which update-mime-database 2>/dev/null`" ]; then
+	update-mime-database /usr/share/mime
+fi
+# End automatically added section
+# Automatically added by dh_gconf
+if [ "$1" = "configure" ] && which update-gconf-defaults >/dev/null 2>&1; then
+	update-gconf-defaults 
+fi
+# End automatically added section
+
+
diff --git a/unix/debcontrol/postrm b/unix/debcontrol/postrm
new file mode 100755
index 0000000..7737dbe
--- /dev/null
+++ b/unix/debcontrol/postrm
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+set -e
+
+ # Automatically added by dh_gconf
+if which update-gconf-defaults >/dev/null 2>&1; then
+	update-gconf-defaults 
+fi
+# End automatically added section
+# Automatically added by dh_installmime
+if [ -x "`which update-mime-database 2>/dev/null`" ]; then
+	update-mime-database /usr/share/mime
+fi
+# End automatically added section
+
+
diff --git a/unix/debrelease/Packages b/unix/debrelease/Packages
new file mode 100644
index 0000000..9e37258
--- /dev/null
+++ b/unix/debrelease/Packages
@@ -0,0 +1,21 @@
+*Package: geogebra
+*Version: [[version]]
+*Architecture: all
+*Maintainer: Markus Hohenwarter <markus at geogebra.org>
+*Installed-Size: [[installed.kb]]
+*Depends: sun-java6-jre | sun-java5-jre | default-jre
+*Recommends: sun-java6-jre | sun-java5-jre, imagemagick
+Filename: ./geogebra_[[version]]_all.deb
+Size: [[size]]
+MD5sum: [[md5]]
+SHA1: [[sha1]]
+SHA256: [[sha256]]
+*Section: math
+*Priority: optional
+*Description: Dynamic mathematics software for all levels of education
+ GeoGebra joins arithmetic, geometry, algebra and calculus. It offers multiple
+ representations of objects in its graphics, algebra, and spreadsheet views
+ that are all dynamically linked.
+ This package also contains a thumbnailer for .ggb files which runs only when
+ imagemagick is installed.
+
diff --git a/unix/debrelease/Release b/unix/debrelease/Release
new file mode 100644
index 0000000..d04a7cd
--- /dev/null
+++ b/unix/debrelease/Release
@@ -0,0 +1,10 @@
+Origin: GeoGebra unofficial repo
+Label: GeoGebra
+Codename: lucid
+Date: Sun, 04 Apr 2010 09:08:27 +0000
+Architectures: i386
+Components: main
+Description: GeoGebra -- Dynamic mathematics for everyone
+MD5Sum:
+ [[plain.md5]] [[plain.size]] main/binary-i386/Packages
+ [[gz.md5]] [[gz.size]] main/binary-i386/Packages.gz
diff --git a/unix/usr/bin/geogebra b/unix/usr/bin/geogebra
new file mode 100755
index 0000000..eee626a
--- /dev/null
+++ b/unix/usr/bin/geogebra
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+java -jar /usr/share/geogebra/lib/geogebra.jar "$@"
+
diff --git a/unix/usr/bin/ggthumb b/unix/usr/bin/ggthumb
new file mode 100755
index 0000000..67c9de8
--- /dev/null
+++ b/unix/usr/bin/ggthumb
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+urldecode(){
+  echo -e "$(sed 'y/+/ /; s/%/\\x/g')"
+}
+
+mkdir /tmp/ggthumb
+f=`echo -n $3| sed 's/file:\/\///'|urldecode`
+cp "$f" /tmp/ggthumb/ggt.zip
+unzip -qq /tmp/ggthumb/ggt.zip -d /tmp/ggthumb
+convert -resize $2 /tmp/ggthumb/geogebra_thumbnail.png $4 2>/dev/null
+echo "$3 $f $?">>/tmp/glog
+rm -rf /tmp/ggthumb
diff --git a/unix/usr/share/applications/geogebra.desktop b/unix/usr/share/applications/geogebra.desktop
new file mode 100644
index 0000000..1631774
--- /dev/null
+++ b/unix/usr/share/applications/geogebra.desktop
@@ -0,0 +1,24 @@
+[Desktop Entry]
+Name=GeoGebra
+GenericName=Dynamic mathematics software
+GenericName[cs]=Dynamický matematický software
+GenericName[de]=Dynamische Mathematiksoftware
+GenericName[es]=Programa de matemáticas dinámico
+GenericName[fr]=Logiciel de Mathématiques dynamiques
+GenericName[hi]=सक्रिय गणितीय सॉफ्टवेर 
+GenericName[it]=Software di matematica dinamica
+GenericName[pt_BR]=Programa de Matemática Dinâmica
+Comment=Create interactive mathematical constructions and applets. 
+Comment[cs]=Vytvořte interaktivní konstrukce a aplety.
+Comment[de]=Erstelle interaktive Konstruktionen und Applets.
+Comment[fr]=Créer des constructions mathématiques et des appliquettes.
+Comment[hi]=संवादात्मक गणितीय निर्माण और एप्लेट बनाएँ
+Comment[it]=Creazione di costruzioni matematiche e applet interattive.
+Comment[pt_BR]=Crie construções matemáticas interativas e applets.
+Exec=geogebra
+Icon=geogebra.png
+Terminal=false
+Type=Application
+StartupNotify=true
+Categories=Science;Math;Education
+MimeType=application/vnd.geogebra.file;application/vnd.geogebra.tool;
diff --git a/unix/usr/share/doc/geogebra/README.Debian b/unix/usr/share/doc/geogebra/README.Debian
new file mode 100644
index 0000000..1f791c9
--- /dev/null
+++ b/unix/usr/share/doc/geogebra/README.Debian
@@ -0,0 +1,8 @@
+geogebra for Debian
+-------------------
+
+For GeoGebra to work properly, you may have to replace the openjdk by
+sun-java6. For more details see 
+http://www.geogebra.org/en/wiki/index.php/GeoGebra_in_Linux
+
+ -- Zbynek Konecny (Kondr) <kondr at lesnimoudrost.cz>  Mon, 29 Mar 2010 00:12:03 +0200
diff --git a/unix/usr/share/doc/geogebra/changelog.gz b/unix/usr/share/doc/geogebra/changelog.gz
new file mode 100644
index 0000000..6a23cff
Binary files /dev/null and b/unix/usr/share/doc/geogebra/changelog.gz differ
diff --git a/unix/usr/share/doc/geogebra/copyright b/unix/usr/share/doc/geogebra/copyright
new file mode 100644
index 0000000..a0bb4b7
--- /dev/null
+++ b/unix/usr/share/doc/geogebra/copyright
@@ -0,0 +1,36 @@
+This package was debianized by George Sturr <george at geogebra.org> 
+Sat, 03 Apr 2010 21:39:06 +0100.
+
+It was downloaded from http://www.geogebra.org/
+
+Upstream Authors:
+
+    Markus Hohenwarter <markus at geogebra.org>
+    Michael Borcherds  <michael at geogebra.org>
+    Mathieu Blosier <mathieu at geogebra.org>
+    Judith Hohenwarter <judith at geogebra.org> 
+    Zoltan Kovacs <zoltan at geogebra.org>
+    Yves Kreis <yves at geogebra.org>
+    Florian Sonner <florian at geogebra.org>
+    George Sturr <george at geogebra.org>
+    
+Copyright:
+
+    Copyright (C) 2010 International GeoGebra Institute
+
+License:
+
+    GPL v2 and Creative Commons Attribution-Share Alike 3.0
+
+The Debian packaging is:
+
+    Copyright (C) 2010 George Sturr <george at geogebra.org>
+
+and is licensed under the GPL version 3, 
+see `/usr/share/common-licenses/GPL-3'.
+
+All GeoGebra language and documentation files are subject to 
+   the following Creative Commons Attribution-Share Alike License; 
+   either version 3.0 of the License, or (at your option) any later 
+   version (see http://creativecommons.org/licenses/by-sa/3.0/):
+
diff --git a/unix/usr/share/gconf/defaults/10_geogebra b/unix/usr/share/gconf/defaults/10_geogebra
new file mode 100644
index 0000000..e7b1a74
--- /dev/null
+++ b/unix/usr/share/gconf/defaults/10_geogebra
@@ -0,0 +1,3 @@
+/desktop/gnome/thumbnailers/application at geogebra.vnd.file/command /usr/bin/ggthumb -s %s %u %o
+/desktop/gnome/thumbnailers/application at geogebra.vnd.file/enable true
+
diff --git a/unix/usr/share/icons/hicolor/48x48/apps/geogebra.png b/unix/usr/share/icons/hicolor/48x48/apps/geogebra.png
new file mode 100644
index 0000000..fbd66e6
Binary files /dev/null and b/unix/usr/share/icons/hicolor/48x48/apps/geogebra.png differ
diff --git a/unix/usr/share/icons/hicolor/48x48/mimetypes/application-vnd.geogebra.file.png b/unix/usr/share/icons/hicolor/48x48/mimetypes/application-vnd.geogebra.file.png
new file mode 100644
index 0000000..fbd66e6
Binary files /dev/null and b/unix/usr/share/icons/hicolor/48x48/mimetypes/application-vnd.geogebra.file.png differ
diff --git a/unix/usr/share/icons/hicolor/48x48/mimetypes/application-vnd.geogebra.tool.png b/unix/usr/share/icons/hicolor/48x48/mimetypes/application-vnd.geogebra.tool.png
new file mode 100644
index 0000000..fbd66e6
Binary files /dev/null and b/unix/usr/share/icons/hicolor/48x48/mimetypes/application-vnd.geogebra.tool.png differ
diff --git a/unix/usr/share/man/man1/geogebra.1.gz b/unix/usr/share/man/man1/geogebra.1.gz
new file mode 100644
index 0000000..4b76848
Binary files /dev/null and b/unix/usr/share/man/man1/geogebra.1.gz differ
diff --git a/unix/usr/share/man/man1/ggthumb.1.gz b/unix/usr/share/man/man1/ggthumb.1.gz
new file mode 100644
index 0000000..74aeb28
Binary files /dev/null and b/unix/usr/share/man/man1/ggthumb.1.gz differ
diff --git a/unix/usr/share/mime/packages/geogebra.xml b/unix/usr/share/mime/packages/geogebra.xml
new file mode 100644
index 0000000..e908dab
--- /dev/null
+++ b/unix/usr/share/mime/packages/geogebra.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+  <mime-type type="application/vnd.geogebra.file">
+         <comment>GeoGebra worksheet</comment>
+         <comment xml:lang="cs">Pracovní list GeoGebry</comment>
+         <comment xml:lang="de">GeoGebra Arbeitsblatt</comment>
+         <comment xml:lang="es">Archivo GeoGebra</comment>
+         <comment xml:lang="fr">Feuille de travail GeoGebra </comment>
+         <comment xml:lang="hi">जीओ-जेब्रा कार्य-पत्र</comment>
+         <comment xml:lang="it">Foglio di lavoro GeoGebra </comment>
+         <comment xml:lang="pt-BR">Planilha GeoGebra</comment>
+         <glob pattern="*.ggb"/>
+  </mime-type>
+  <mime-type type="application/vnd.geogebra.tool">
+         <comment>GeoGebra tool</comment>
+         <comment xml:lang="cs">Nástroj GeoGebry</comment>
+         <comment xml:lang="de">GeoGebra Werkzeug</comment>
+         <comment xml:lang="es">Herramienta GeoGebra</comment>
+         <comment xml:lang="fr">Outil GeoGebra</comment>
+         <comment xml:lang="hi">जीओ-जेब्रा साधन</comment>
+         <comment xml:lang="it">Strumento GeoGebra</comment>
+         <comment xml:lang="pt-BR">Ferramenta GeoGebra</comment>
+         <glob pattern="*.ggt"/>
+  </mime-type>
+</mime-info>
diff --git a/unix/usr/share/pixmaps/geogebra.png b/unix/usr/share/pixmaps/geogebra.png
new file mode 100644
index 0000000..fbd66e6
Binary files /dev/null and b/unix/usr/share/pixmaps/geogebra.png differ


hooks/post-receive
-- 
GeoGebra: Dynamic mathematics software for education



More information about the pkg-java-commits mailing list