
Apache UIMA Ruta Eclipse: ruta-ep-engine
Copyright 2011 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

Portions of UIMA Ruta were originally developed by
the Universität Würzburg.
Copyright (c) 2006, 2011 Universität Würzburg.

This product contains htmlparser libraries (http://htmlparser.sourceforge.net/), 
licensed under the Common Public License.

Apache Commons Logging (http://commons.apache.org/proper/commons-logging/):
This product includes/uses software(s) developed by 'an unknown organization'
  - Unnamed - avalon-framework:avalon-framework:jar:4.1.3
  - Unnamed - log4j:log4j:jar:1.2.12
  - Unnamed - logkit:logkit:jar:1.0.1

This product contains uimaFIT - Core: 
Copyright 2009-2012 Regents of the University of Colorado.
All rights reserved,
Copyright 2009-2012 Ubiquitous Knowledge Processing (UKP) Lab.
Technische Universität Darmstadt.
All rights reserved.

This product contains Spring Framework 3.1:
Copyright (c) 2002-2011 SpringSource, a division of VMware, Inc.
This product may include a number of subcomponents with separate
copyright notices and license terms. 
Your use of the source code for the these subcomponents is subject to
the terms and conditions of the subcomponent's license, as noted in the
LICENSE file.

This product contains Apache Commons Math (http://commons.apache.org/proper/commons-math/):
===============================================================================
The BracketFinder (package org.apache.commons.math3.optimization.univariate)
and PowellOptimizer (package org.apache.commons.math3.optimization.general)
classes are based on the Python code in module "optimize.py" (version 0.5)
developed by Travis E. Oliphant for the SciPy library (http://www.scipy.org/)
Copyright © 2003-2009 SciPy Developers.
===============================================================================
The LinearConstraint, LinearObjectiveFunction, LinearOptimizer,
RelationShip, SimplexSolver and SimplexTableau classes in package
org.apache.commons.math3.optimization.linear include software developed by
Benjamin McCann (http://www.benmccann.com) and distributed with
the following copyright: Copyright 2009 Google Inc.
===============================================================================
This product includes software developed by the
University of Chicago, as Operator of Argonne National
Laboratory.
The LevenbergMarquardtOptimizer class in package
org.apache.commons.math3.optimization.general includes software
translated from the lmder, lmpar and qrsolv Fortran routines
from the Minpack package
Minpack Copyright Notice (1999) University of Chicago.  All rights reserved
===============================================================================
The GraggBulirschStoerIntegrator class in package
org.apache.commons.math3.ode.nonstiff includes software translated
from the odex Fortran routine developed by E. Hairer and G. Wanner.
Original source copyright:
Copyright (c) 2004, Ernst Hairer
===============================================================================
The EigenDecompositionImpl class in package
org.apache.commons.math3.linear includes software translated
from some LAPACK Fortran routines.  Original source copyright:
Copyright (c) 1992-2008 The University of Tennessee.  All rights reserved.
===============================================================================
The MersenneTwister class in package org.apache.commons.math3.random
includes software translated from the 2002-01-26 version of
the Mersenne-Twister generator written in C by Makoto Matsumoto and Takuji
Nishimura. Original source copyright:
Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
All rights reserved
===============================================================================
The LocalizedFormatsTest class in the unit tests is an adapted version of
the OrekitMessagesTest class from the orekit library distributed under the
terms of the Apache 2 licence. Original source copyright:
Copyright 2010 CS Communication & Systèmes
===============================================================================
The complete text of licenses and disclaimers associated with the the original
sources enumerated above at the time of code translation are in the LICENSE.txt
file.