=========================================================================
==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
==  Version 2.0, in this case for the Apache Geronimo distribution.    ==
=========================================================================

Apache Geronimo 
Copyright 2003-2010 The Apache Software Foundation

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

For the server adapter code (in plugins/org.apache.geronimo.st.*):

Portions of the Eclipse Geronimo Server Adapter 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 "Eclipse Geronimo Server Adapter CLA".

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

/*******************************************************************************
 * Copyright (c) 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - Initial API and implementation
 *******************************************************************************/

For the geronimo-util jar in org.apache.geronimo.runtime.v20,
and the geronimo-crypto jar in org.apache.geronimo.runtime.v21:

=========================================================================
==  Bouncy Castle Notice                                               ==
=========================================================================

This product includes software (the ASN1 codec in the org.apache.geronimo.asn1
package) which was developed by the Bouncy Castle project. 
(http://www.bouncycastle.org/) 

     Copyright (c) 2000-2005 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)

For jaxb-api and jaxb-impl jars in org.apache.geronimo.runtime.common.jar:

=========================================================================
==  Sun CDDL Notice                                                    ==
=========================================================================

This product includes software developed for the JAXB Reference 
Implementation project. (https://jaxb.dev.java.net/)

For plexus-archiver-1.0-alpha-7.jar in org.apache.geronimo.runtime.v21.jar:

=========================================================================
==  Plexus Notice                                                      ==
=========================================================================

This product includes software developed by the Plexus project
(http://plexus.codehaus.org/)

The source code for the Plexus project can be downloaded from:

http://plexus.codehaus.org/source-repository.html





     
