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

------------------------------------------------------------------------
See the file LICENSE.txt
See licenses for accompanying products in the "/licenses" subdirectory.
------------------------------------------------------------------------

This software also includes code from Facelets (https://facelets.dev.java.net/)
for the purpose of making components and facelet artifacts reloadable from
other source directories.

This product also includes the ASM bytecode library (http://asm.ow2.org/) for the purpose of
dependency bytecode scanning.

This product also includes the Groovy runtime http://groovy.codehaus.org/ library (ASL2 license) in binary form as well as
the Scala http://www.scala-lang.org/ runtime in binary form.
