What is Apache Forrest
----------------------
Apache Forrest (tm) software is a publishing framework that transforms
input from various sources into a unified presentation in one or more
output formats. The modular and extensible plug-in architecture of
Apache Forrest is based on Apache Cocoon and the relevant industry
standards that separate presentation from content. Forrest can generate
static documents, or be used as a dynamic server, or be deployed by its
automated facility.

Requirements
------------
Forrest is implemented both as a Java servlet and a Java command line
application. The following requirements exist for installing it:

  * A Java 1.5 or later compatible virtual machine for your operating system.

Installation Instructions and Documentation
-------------------------------------------
Read the index.html file in this directory for the installation instructions.
The documentation relevant for your version is included with Forrest.
The Forrest website has documentation for the current development version.

Licensing and legal issues and credits
--------------------------------------
Forrest is licensed under the Apache License, version 2.0
See the files in the top-level of the Forrest distribution called
LICENSE.txt and NOTICE.txt and see licenses for accompanying products
in the "lib" directory.

Cryptographic Software Notice
-----------------------------
This distribution may include software that has been designed for use
with cryptographic software.  The country in which you currently reside
may have restrictions on the import, possession, use, and/or re-export
to another country, of encryption software.  BEFORE using any encryption
software, please check your country's laws, regulations and policies
concerning the import, possession, or use, and re-export of encryption
software, to see if this is permitted.  See <http://www.wassenaar.org/>
for more information.

The U.S. Government Department of Commerce, Bureau of Industry and
Security (BIS), has classified this software as Export Commodity 
Control Number (ECCN) 5D002.C.1, which includes information security
software using or performing cryptographic functions with asymmetric
algorithms.  The form and manner of this Apache Software Foundation
distribution makes it eligible for export under the License Exception
ENC Technology Software Unrestricted (TSU) exception (see the BIS 
Export Administration Regulations, Section 740.13) for both object 
code and source code.

See http://www.apache.org/licenses/exports/

The following provides more details on the included files that
may be subject to export controls on cryptographic software:

  The Apache Forrest facility "forrestbot" uses and includes the JSch
  library <http://www.jcraft.com/jsch/> to enable deployment via "scp".

--------
Thanks for using Apache Forrest ... http://forrest.apache.org/
