=========================================================================
==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
==  Version 2.0.                                                       ==
=========================================================================

The Apache Open For Business Project (Apache OFBiz)
Copyright 2001-2011 The Apache Software Foundation

=========================================================================
==  Apache General Notice (Covers OFBiz and all ASF libraries)         ==
=========================================================================

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

=========================================================================
==  Apache Ant Notice                                                  ==
=========================================================================

This product includes also software developed by :
  - the W3C consortium (http://www.w3c.org) ,
  - the SAX project (http://www.saxproject.org)

The <sync> task is based on code Copyright (c) 2002, Landmark
Graphics Corp that has been kindly donated to the Apache Software
Foundation.

=========================================================================
==  Apache Avalon Notice                                               ==
=========================================================================

This product is developed by the Apache Avalon Project.
http://avalon.apache.org

The names "Avalon" and "Merlin" must not be used to endorse or promote
products derived from this software without prior written permission.
For written permission, please contact pmc@avalon.apache.org.

=========================================================================
==  Apache Batik Notice                                                ==
=========================================================================

This software contains code from the World Wide Web Consortium (W3C) for the
Document Object Model API (DOM API) and SVG Document Type Definition (DTD).

This software contains code from the International Organisation for Standardization
for the definition of character entities used in the software's documentation.

=========================================================================
==  Apache Derby Notice                                                ==
=========================================================================

Portions of Derby were originally developed by
International Business Machines Corporation and are
licensed to the Apache Software Foundation under the
"Software Grant and Corporate Contribution License Agreement",
informally known as the "Derby CLA".
The following copyright notice(s) were affixed to portions of the code
with which this file is now or was at one time distributed
and are placed here unaltered.

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

(C) Copyright IBM Corp. 2003.

The portion of the functionTests under 'nist' was originally
developed by the National Institute of Standards and Technology (NIST),
an agency of the United States Department of Commerce, and adapted by
International Business Machines Corporation in accordance with the NIST
Software Acknowledgment and Redistribution document at
http://www.itl.nist.gov/div897/ctg/sql_form.htm

=========================================================================
==  Apache FOP Notice                                                  ==
=========================================================================

This software consists of voluntary contributions made by many individuals
on behalf of The Apache Software Foundation and was originally created by
James Tauber <jtauber@jtauber.com>.

=========================================================================
==  Apache Geronimo Notice                                             ==
=========================================================================

Portions of the Web Console were orginally developed by
International Business Machines Corporation and are
licensed to the Apache Software Foundation under the
"Software Grant and Corporate Contribution License Agreement",
informally known as the "IBM Console CLA".

The following copyright notice(s) were affixed to portions of the code
with which this file is now or was at one time distributed
and are placed here unaltered.

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

=========================================================================
==  Apache Log4J Notice                                                ==
=========================================================================

This product includes source code based on Sun
Microsystems' book titled "Java Nativer Interface:
Programmer's Guide and Specification" and freely available
to the public at http://java.sun.com/docs/books/jni.

=========================================================================
==  Apache Lucene Notice                                               ==
=========================================================================

The snowball stemmers in
  contrib/snowball/src/java/net/sf/snowball
were developed by Martin Porter and Richard Boulton.
The full snowball package is available from
  http://snowball.tartarus.org/

=========================================================================
==  Apache Tomcat Notice                                               ==
=========================================================================

Java compilation software for JSP pages is provided by Eclipse,
which is open source software.  The orginal software and
related infomation is available at
http://www.eclipse.org.

=========================================================================
==  Apache Xerces Java Notice                                          ==
=========================================================================

Portions of this software were originally based on the following:
  - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
  - software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
  - voluntary contributions made by Paul Eng on behalf of the
    Apache Software Foundation that were originally developed at iClick, Inc.,
    software copyright (c) 1999.

=========================================================================
==  Apache Xalan distribution.                                         ==
=========================================================================

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

Portions of this software was originally based on the following:
 - software copyright (c) 1999-2002, Lotus Development Corporation.,
   http://www.lotus.com.
 - software copyright (c) 2001-2002, Sun Microsystems.,
   http://www.sun.com.
 - software copyright (c) 2003, IBM Corporation., http://www.ibm.com.
 - voluntary contributions made by Ovidiu Predescu <ovidiu@cup.hp.com> on
   behalf of the Apache Software Foundation that was originally developed
   at Hewlett Packard Company.
The binary distribution package (ie. jars, samples and documentation) of
this product includes software developed by the following:

 - The Apache Software Foundation
     - Xerces Java - see xercesImpl.README.txt
     - JAXP 1.3 APIs - see xml-apis.README.txt
     - Bytecode Engineering Library - see BCEL.README.txt
     - Regular Expression - see regexp.README.txt

 - Scott Hudson, Frank Flannery, C. Scott Ananian
     - CUP Parser Generator runtime (javacup\runtime) - see runtime.README.txt

The source distribution package (ie. all source and tools required to build
Xalan Java) of this product includes software developed by the following:

 - The Apache Software Foundation
     - Xerces Java - see xercesImpl.README.txt
     - JAXP 1.3 APIs - see xml-apis.README.txt
     - Bytecode Engineering Library - see BCEL.README.txt
     - Regular Expression - see regexp.README.txt
     - Ant - see ant.README.txt
     - Stylebook doc tool - see stylebook-1.0-b3_xalan-2.README.txt

 - Elliot Joel Berk and C. Scott Ananian
     - Lexical Analyzer Generator (JLex) - see JLex.README.txt

=========================================================================
==  Apache Xalan serializer                                            ==
=========================================================================

This product includes software developed by IBM Corporation (http://www.ibm.com)
and The Apache Software Foundation (http://www.apache.org/).

Portions of this software was originally based on the following:
  - software copyright (c) 1999-2002, Lotus Development Corporation.,
    http://www.lotus.com.
  - software copyright (c) 2001-2002, Sun Microsystems.,
    http://www.sun.com.
  - software copyright (c) 2003, IBM Corporation., http://www.ibm.com.

=========================================================================
==  Barcode4J Notice                                                   ==
=========================================================================

This product includes software developed for project
Krysalis (http://www.krysalis.org/).

This product includes software developed by the
JDOM Project (http://www.jdom.org/).

=========================================================================
==  Freemarker Notice                                                  ==
=========================================================================

This product includes software developed by the
Visigoth Software Society (http://www.visigoths.org/).

=========================================================================
==  JDBM Notice                                                        ==
=========================================================================

This product includes software developed by the JDBM Project
(http://jdbm.sourceforge.net/).

=========================================================================
==  Jetty Notice                                                       ==
=========================================================================

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

The Jetty Web Container is Copyright Mort Bay Consulting Pty Ltd
unless otherwise noted. It is licensed under the apache 2.0
license.

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.
Permission to use, copy, modify and distribute UnixCrypt
for non-commercial or commercial purposes and without fee is
granted provided that the copyright notice appears in all copies.

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.

The jboss integration module contains some LGPL code.

=========================================================================
==  MX4J Notice                                                        ==
=========================================================================

This software consists of voluntary contributions made by many
individuals on behalf of the MX4J project.  For more information on
MX4J, please see <http://mx4j.sourceforge.net>

=========================================================================
==  PNG Behavior Notice                                                ==
=========================================================================

This product includes software developed by
WebFX (webfx.eae.net):

framework/images/webapp/images/pngbehavior.htc

=========================================================================
==  JSON-LIB Notice                                                    ==
=========================================================================

This product includes software developed by
Douglas Crockford (http://www.crockford.com).

=========================================================================
==  DataVision Notice                                                  ==
=========================================================================

Icons

DataVision uses graphic images developed by Sun. The image files are copied
into DataVision.jar.

Copyright 2000 by Sun Microsystems, Inc. All Rights Reserved.

Sun grants you (``Licensee'') a non-exclusive, royalty free, license to use,
and redistribute this software graphics artwork, as individual graphics or
as a collection, as part of software code or programs that you develop,
provided that i) this copyright notice and license accompany the software
graphics artwork; and ii) you do not utilize the software graphics artwork
in a manner which is disparaging to Sun. Unless enforcement is prohibited
by applicable law, you may not modify the graphics, and must use them true
to color and unmodified in every way.

This software graphics artwork is provided ``AS IS,'' without a warranty of
any kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR
A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS
LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A
RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE GRAPHICS ARTWORK.

IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE,
PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL
OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE GRAPHICS
ARTWORK, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

If any of the above provisions are held to be in violation of applicable
law, void, or unenforceable in any jurisdiction, then such provisions are
waived to the extent necessary for this Disclaimer to be otherwise
enforceable in such jurisdiction.

=========================================================================
==  CoolTips Notice                                                    ==
=========================================================================
This product includes software developed by
Andrej Okonetschnikow (http://code.google.com/p/tooltips/).

========================================================================
==  JPIM Notice                                                       ==
========================================================================
This product includes software developed by jpim development team (
http://jpim.sourceforge.net/index.html)
-------------------------------------------
jpim is released under a modified BSD style license.

Java PIM Library (jpim)
Copyright (c) 2001-2003 jpim development team.
=========================================================================
==  JavaCC Notice                                                      ==
=========================================================================

This product includes software developed by the javacc team
(http://javacc.dev.java.net/).  The included version is 4.1.
=========================================================================
==  XPP3   Notice                                                      ==
=========================================================================

This product includes software developed by the Indiana University
Extreme! Lab (http://www.extreme.indiana.edu/).
=========================================================================
==  jline Notice                                                       ==
=========================================================================

This product includes software developed by Marc Prud'hommeaux 
<mwp1@cornell.edu> 
=========================================================================
==  FamFamFam Notice                                                   ==
=========================================================================

This product includes images delevoped by Mark James <mjames@gmail.com>
Birmingham, UK. www.famfamfam.com

Creative Commons Attribution 2.5 License.
http://creativecommons.org/licenses/by/2.5/

You are free:

    * to Share â€” to copy, distribute and transmit the work
    * to Remix â€” to adapt the work

Under the following conditions:

    * Attribution. You must attribute the work in the manner specified 
      by the author or licensor (but not in any way that suggests that 
	  they endorse you or your use of the work).
    * For any reuse or distribution, you must make clear to 
      others the license terms of this work. The best way to do 
	  this is with a link to this web page.
    * Any of the above conditions can be waived if you get 
    * For any reuse or distribution, you must make clear to 
      permission from the copyright holder.
    * Nothing in this license impairs or restricts the 
    * For any reuse or distribution, you must make clear to 
      author's moral rights.
