 Apache UIMA-DUCC
Copyright 2012 The Apache Software Foundation

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

Portions of Apache UIMA were originally developed by
International Business Machines Corporation and are
licensed to the Apache Software Foundation under the
"Software Grant License Agreement", informally known as the
"IBM UIMA License Agreement".
Copyright (c) 2003, 2006 IBM Corporation.

Portions of UIMA-DUCC were originally developed by
International Business Machines Corporation and are
licensed to the Apache Software Foundation under the
"Software Grant License Agreement", informally known as the 
"IBM UIMA-DUCC License Agreement".
Copyright (c) 2012 IBM Corporation

Portions of UIMA-AS were originally developed by
International Business Machines Corporation and are
licensed to the Apache Software Foundation under the
"Software Grant License Agreement", informally known as the 
"IBM UIMA-EE License Agreement".
Copyright (c) 2007, 2008 IBM Corporation

========================================================================= 
------------------ Saxon Notice
========================================================================= 
This product includes software known as 
"The Saxon XSLT and XQuery Processor from Saxonica Limited", whose
home page URL is http://www.saxonica.com/ 

Saxon includes the org.apache.xerces.util.XMLChar module from the Apache 
Xerces product, renamed as net.sf.saxon.om.XMLChar but otherwise unchanged. 
See the copyright statements included in the source code of that module for
conditions of use.

Saxon includes code for performing Unicode normalization that is derived 
from the sample code published for this purpose by the Unicode consortium. 
For the terms of use of this code, see http://www.unicode.org/terms_of_use.html, 
which should be regarded as forming part of these conditions of use, and part 
of the Saxon documentation. 

========================================================================= 
------------------ SVG Notice
========================================================================= 

This product contains icons developed by the SVG Icons project 
(http://sourceforge.net/projects/svgicons), licensed under the 
BSD license (see LICENSE file).


=========================== DUCC IMAGES ================================ 

1. image......... 120px-Anas_platyrhynchos_-United_Kingdom_-adult_female_and_ducklings-8.jpg
   source........ http://commons.wikimedia.org/wiki/File:Anas_platyrhynchos_-United_Kingdom_-adult_female_and_ducklings-8.jpg#metadata
   license....... http://creativecommons.org/licenses/by/2.0/deed.en
   attribution... © jans canon / Wikimedia Commons / CC-BY-2.0
   
2. image......... 120px-Ducks_eating.jpg
   source........ http://commons.wikimedia.org/wiki/File:Ducks_eating.jpg
   license....... http://creativecommons.org/licenses/by/2.0/deed.en
   attribution... © Neil Phillips / Wikimedia Commons / CC-BY-2.0
   
3. image......... 120px-Head_of_a_white_domesticated_duck.jpg
   source........ http://commons.wikimedia.org/wiki/File:Head_of_a_white_domesticated_duck.jpg
   license....... http://creativecommons.org/licenses/by-sa/2.0/deed.en
   attribution... © Ernst Vikne / Wikimedia Commons / CC-BY-SA-2.0   
      
4. image......... 120px-Rubber_duckies_So_many_ducks.jpg
   source........ http://commons.wikimedia.org/wiki/File:Rubber_duckies_So_many_ducks.jpg
   license....... http://creativecommons.org/licenses/by/2.0/deed.en
   attribution... © Gaetan Lee / Wikimedia Commons / CC-BY-2.0   
         
5. image......... 120px-Thermal_image_of_four_ducks_swimming.jpg
   source........ http://commons.wikimedia.org/wiki/File:Thermal_image_of_four_ducks_swimming.jpg
   license....... http://creativecommons.org/publicdomain/zero/1.0/deed.en
   attribution... N/A
          
6. image......... 120px-Tracks_duck.gif
   source........ http://commons.wikimedia.org/wiki/File:Tracks_duck.gif
   license....... This work is in the public domain in the United States because it is a work prepared by an officer or employee of the United States Government
                  as part of that person's official duties under the terms of Title 17, Chapter 1, Section 105 of the US Code. See Copyright.
   attribution... N/A

7. image......... refresh.png
   source........ http://commons.wikimedia.org/wiki/File:Human-gnome-session-reboot.svg
   license....... http://creativecommons.org/licenses/by-sa/2.5/deed.en
   attribution... User:Pander / Wikimedia Commons / CC BY-SA 2.5  
          
8. image......... 144x144Stick_figure_-_choosing.jpg
   source........ http://commons.wikimedia.org/wiki/File:Stick_figure_-_choosing.jpg
   license....... http://creativecommons.org/licenses/by-sa/3.0/deed.en
   attribution... © User:Obsidian Soul / Wikimedia Commons / CC-BY-SA-3.0  
               
9. image......... 2x1.33in-Bariken_kid.JPG
   source........ http://commons.wikimedia.org/wiki/File:Bariken_kid.JPG
   license....... http://creativecommons.org/licenses/by-sa/3.0/deed.en
   attribution... © User:Materialscientist / Wikimedia Commons / CC-BY-SA-3.0  
           
10. image........ 800px-Duck_crossing_Louisiana.2x1.4.jpg
   source........ http://commons.wikimedia.org/wiki/File:Duck_crossing_Louisiana_2010-10-15.JPG
   license....... I, the copyright holder of this work, release this work into the public domain. This applies worldwide.
                  In some countries this may not be legally possible; if so:
                  I grant anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law.
   attribution... User:Richard David Ramsey    
      
11. image........ 800px-Leg_Of_White_Duck.2x1.6.jpg
   source........ http://commons.wikimedia.org/wiki/File:Leg_Of_White_Duck.jpg
   license....... http://creativecommons.org/licenses/by-sa/3.0/deed.en
   attribution... © User:Ezhuttukari / Wikimedia Commons / CC-BY-SA-3.0         
            
12. image........ 90px-Swimming_white_domesticated_ducks.jpg
   source........ http://commons.wikimedia.org/wiki/File:Swimming_white_domesticated_ducks.jpg
   license....... http://creativecommons.org/licenses/by-sa/2.0/deed.en
   attribution... © Ernst Vikne / Wikimedia Commons / CC-BY-SA-2.0
         
13. image........ Ducklings_in_Shaw_Creek.jpg
   source........ http://commons.wikimedia.org/wiki/File:Ducklings_in_Shaw_Creek.jpg
   license....... http://creativecommons.org/licenses/by/2.0/deed.en
   attribution... © Author:Peggy2012CREATIVELENZ / Wikimedia Commons / CC-BY-2.0   
         
14. image........ Flying_mallard_duck_-_female_2.0x1.4.jpg
   source........ http://commons.wikimedia.org/wiki/File:Flying_mallard_duck_-_female.jpg
   license....... http://creativecommons.org/licenses/by-sa/3.0/deed.en
   attribution... © Author:Martin Correns / Wikimedia Commons / CC-BY-SA-3.0   

15. image........ indicator.gif
   source........ http://commons.wikimedia.org/wiki/File:Birdleft.gif
   license....... I, the copyright holder of this work, release this work into the public domain. This applies worldwide.
                  In some countries this may not be legally possible; if so:
                  I grant anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law.
   attribution... User:Pigpen
    
16. image........ propeller_hat_large.svg.png, propeller_hat_small.svg.png
   source........ http://commons.wikimedia.org/wiki/File:Propeller.svg
   license....... http://creativecommons.org/publicdomain/zero/1.0/deed.en
   attribution... N/A 

17. image........ RCA_Indian_Head_test_pattern.JPG
   source........ http://commons.wikimedia.org/wiki/File:RCA_Indian_Head_test_pattern.JPG
   license....... This work is in the public domain in that it was published in the United States between 1923 and 1977 and without a copyright notice. 
                  Unless its author has been dead for several years, it is copyrighted in jurisdictions that do not apply the rule of the shorter term 
                  for US works, such as Canada (50 p.m.a.), Mainland China (50 p.m.a., not Hong Kong or Macao), Germany (70 p.m.a.), Mexico (100 p.m.a.), 
                  Switzerland (70 p.m.a.), and other countries with individual treaties.
   attribution... N/A
   
18. image........ ts-2.0x1.3.jpeg
   source........ http://commons.wikimedia.org/wiki/File:Mallard_close-up.jpg
   license....... This work has been released into the public domain by its author, Frankyboy5 at the wikipedia project. This applies worldwide.
                  In case this is not legally possible: Frankyboy5 grants anyone the right to use this work for any purpose, without any conditions, unless
                  such conditions are required by law.
   attribution... N/A
      
19. image........ Delena-cancerides-huntsman-spider.jpg
   source........ http://commons.wikimedia.org/wiki/File:Delena-cancerides-huntsman-spider.jpg
   license....... http://creativecommons.org/licenses/by-sa/2.0/deed.en
   attribution... © Bryce McQuillan / Wikimedia Commons / CC-BY-SA-2.0
      
20. image........ 120px-BURROUGH_AUDUBON_SOCIETY_MEMBERS_USE_BINOCULARS_TO_IDENTIFY_MIGRATORY_SHORE_BIRDS_DURING_A_SCHEDULED_OUTING_AT_THE..._-_NARA_-_557179.jpg
   source........ http://commons.wikimedia.org/wiki/File:BURROUGH_AUDUBON_SOCIETY_MEMBERS_USE_BINOCULARS_TO_IDENTIFY_MIGRATORY_SHORE_BIRDS_DURING_A_SCHEDULED_OUTING_AT_THE..._-_NARA_-_557179.jpg
   license....... This work is in the public domain in the United States because it is a work prepared by an officer or employee of the United States Government as part of that person's official 
                  duties under the terms of Title 17, Chapter 1, Section 105 of the US Code. See Copyright.
   attribution... Duncan, Patricia D.
      
21. image........ Cygnet_in_Hyde_Park.jpg
   source........ http://commons.wikimedia.org/wiki/File:Cygnet_in_Hyde_Park.jpg
   license....... http://creativecommons.org/licenses/by-sa/2.0/deed.en
   attribution... Files from Keven Law Flickr stream


==============================================================
 Jetty Web Container
 Copyright 1995-2006 Mort Bay Consulting Pty Ltd
==============================================================

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

The javax.servlet package used by Jetty is copyright
Sun Microsystems, Inc and Apache Software Foundation. It is
distributed under the Common Development and Distribution License.
You can obtain a copy of the license at
https://glassfish.dev.java.net/public/CDDLv1.0.html.

The UnixCrypt.java code ~Implements the one way cryptography used by
Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
modified April 2001  by Iris Van den Broeke, Daniel Deville.

The default JSP implementation is provided by the Glassfish JSP engine
from project Glassfish http://glassfish.dev.java.net.  Copyright 2005
Sun Microsystems, Inc. and portions Copyright Apache Software Foundation.

Some portions of the code are Copyright:
  2006 Tim Vernum
  1999 Jason Gilbert.


===============================================================================
webserver/lib/jsp/org.eclipse.jetty.orbit.javax.servlet.jsp.jstl-1.2.0.v201105211821.jar
===============================================================================

JavaServer Pages Standard Tag Library API 2.1 from Glassfish
The plug-in includes software developed by Sun as part of the Glassfish project.

Your use of the library code is subject to the terms and conditions of the Apache Software License 2.0 and the Common Development and Distribution License("CDDL") license.
A copy of the Apache Software License 2.0 is contained in the file LICENSE_ASL20.txt and is also available at http://www.apache.org/licenses/LICENSE-2.0.html.

A copy of the Common Development and Distribution License is contained in the file about_files/LICENSE_CDDL.txt and is also
available at http://www.sun.com/cddl/cddl.html">http://www.sun.com/cddl/cddl.html

Original binaries and source are available from the http://glassfish.dev.java.net


===============================================
Java Authentication SPI for Containers
Copyright 2003-2009 The Apache Software Foundation

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

===============================================
Apache Tomcat
Copyright 1999-2014 The Apache Software Foundation

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

==============================================

=====================================
==== Apache Commons Codec NOTICE
=====================================

Copyright 2002-2011 The Apache Software Foundation

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

--------------------------------------------------------------------------------
src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java contains
test data from http://aspell.sourceforge.net/test/batch0.tab.

Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org). Verbatim copying
and distribution of this entire article is permitted in any medium,
provided this notice is preserved.
--------------------------------------------------------------------------------

=========================================================================
------------------- www.ibatis.com Notice -------
=========================================================================
This product also includes software developed by
Clinton Begin (http://www.ibatis.com).

=========================================================================
------------------- GlassFish JSP Notice -------
=========================================================================
The default JSP implementation is provided by the Glassfish JSP engine
from project Glassfish http://glassfish.dev.java.net.  Copyright 2005
Sun Microsystems, Inc. and portions Copyright Apache Software Foundation.

Some portions of the code are Copyright:
  2006 Tim Vernum
  1999 Jason Gilbert.

=========================================================================
==  ActiveMQ Notice                                                      ==
=========================================================================

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


=========================================================================
----------- Spring Notice --------------
=========================================================================
This product includes software, Spring Framework developed by
Spring Framework (http://www.springframework.org/).

The end-user documentation included with a redistribution, if any,
must include the following acknowledgement:

 "This product includes software developed by the Spring Framework
  Project (http://www.springframework.org)."

Alternately, this acknowledgement may appear in the software itself,
if and wherever such third-party acknowledgements normally appear.

The names "Spring" and "Spring Framework" must not be used to
endorse or promote products derived from this software without
prior written permission. For written permission, please contact
rod.johnson@interface21.com or juergen.hoeller@interface21.com.

This product includes software, QDox, developed by
ThoughtWorks, Inc (http://www.thoughtworks.com/).

=========================================================================
------- jaxb-api, jaxb-impl Package Notice ----------
=========================================================================
The jaxb-api, jaxb-impl,javax.servlet is distributed under the 
Common Development and Distribution License v1.0.

You can obtain a copy of the license at
https://glassfish.dev.java.net/public/CDDLv1.0.html.

Source code for jaxb-api, jaxb-impl is at http://jaxb.java.net/

==================================================
==== Apache HttpComponents HttpCore (httpcore-4.4.4.jar)
==================================================

Copyright 2005-2013 The Apache Software Foundation

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

This project contains annotations derived from JCIP-ANNOTATIONS
Copyright (c) 2005 Brian Goetz and Tim Peierls. See http://www.jcip.net

==================================================
=== Servlet 3.0 (geronimo-servlet_3.0_spec-1.0.jar)
==================================================

Copyright 2003-2010 The Apache Software Foundation

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



This product includes software developed by
The W3C Consortium (http://www.w3.org/).

Copyright © 1994-2002 World Wide Web Consortium,
(Massachusetts Institute of Technology, Institut National
de Recherche en Informatique et en Automatique, Keio
University). All Rights Reserved.
http://www.w3.org/Consortium/Legal/


=========================================================================
-------- ASM 3.1 library Notice
=========================================================================

Copyright (c) 2000-2005 INRIA, France Telecom.

=========================================================================
-------- JavaServer Pages Expression Language 2.1 library Notice
=========================================================================
JavaServer Pages Expression Language 2.1 Reference Implementation from Glassfish

The plug-in includes software developed by Sun as part of the Glassfish project.

Your use of the library code is subject to the terms and conditions of the Common Development and Distribution License("CDDL") license.

A copy of the Common Development and Distribution License is available at http://www.sun.com/cddl/cddl.html

Original binaries and source are available from the Glassfish website http://glassfish.dev.java.net

=========================================================================
-------- JavaServer Pages Expression Language API 2.1 library Notice
=========================================================================
JavaServer Pages Expression Language API 2.1 from Glassfish

The plug-in includes software developed by Sun as part of the Glassfish project.

Your use of the library code is subject to the terms and conditions of the Apache Software License 2.0 and the Common Development and Distribution License("CDDL") license.
A copy of the Apache Software License 2.0 is contained is available at http://www.apache.org/licenses/LICENSE-2.0.html.

A copy of the Common Development and Distribution License is available at http://www.sun.com/cddl/cddl.html.

Original binaries and source are available from the Glassfish website http://glassfish.dev.java.net

=========================================================================
-------- JavaServer Pages Standard Tag Library library Notice
=========================================================================
JavaServer Pages Standard Tag Library Implementation for the 1.2 version of the JSTL spec

The plug-in includes software developed by Sun as part of the Glassfish project.

Your use of the library code is subject to the terms and conditions of the Apache Software License 2.0 and the Common Development and Distribution License("CDDL") license.
A copy of the Apache Software License 2.0 is contained is available at http://www.apache.org/licenses/LICENSE-2.0.html.

A copy of the Common Development and Distribution License is available at http://www.sun.com/cddl/cddl.html.

Original binaries and source are available from the Glassfish website http://glassfish.dev.java.net

=========================================================================
-------- Java Mail 1.4.1 library Notice
=========================================================================
Your use of the Java Mail code is subject to the terms and
conditions of the Common Development and Distribution License (CDDL) Version 1.0. A
copy of the license is available
at https://glassfish.dev.java.net/public/CDDL+GPL.html

The Eclipse Foundation elects to include this software in this distribution 
under the CDDL license.
	
The original source for this javax.mail bundle is available on
the Glassfish website at 
    https://glassfish.dev.java.net/downloads/v2-b58g.html

=========================================================================
---------------------- Mina Notice
=========================================================================
Data compression support is provided by the JZLib library package,
which is open source software, written by JCraft, and copyright
by JCraft.  The original software is available from

   http://www.jcraft.com/jzlib/
   
=========================================================================
-------------------- Joda library Notice
=========================================================================
This product includes software developed by
Joda.org (http://www.joda.org/).

(C) Copyright 1997,2004 International Business Machines Corporation.  All rights reserved.

(C) Copyright IBM Corp. 2003. 

=========================================================================
==  XMLBeans Notice                                                      ==
=========================================================================

This product includes Apache XMLBeans software, developed at the Apache Software
Foundation (http://www.apache.org/). From binary distribution of XMLBeans NOTICE
file:
Portions of this software were originally based on the following:
     - software copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/>.

   Aside from contributions to the Apache XMLBeans project, this
   software also includes:

    - one or more source files from the Apache Xerces-J and Apache Axis
      products, Copyright (c) 1999-2003 Apache Software Foundation

    - W3C XML Schema documents Copyright 2001-2003 (c) World Wide Web
      Consortium (Massachusetts Institute of Technology, European Research
      Consortium for Informatics and Mathematics, Keio University)

=========================================================================

