<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->
<h1>${artifactIdWithFirstLetterscapitalized} v${version}.</h1>

<p>This is the ${version} version of ${artifactId}. It is available in both binary and source distributions.</p>


<p><font color="red" size="+2">Note:</font>
    The tar files in the distribution use GNU tar extensions
    and must be untarred with a GNU compatible version of tar. The version
    of tar on Solaris and Mac OS X will not work with these files</p>

<a name="changes"><h2>Changes</h2></a>

<p>The changes in this release are detailed in the release notes.</p>

<p>Thank you for using <a href="${siteUrl}">${artifactShortName}</a>.</p>

<p>From the Apache Commons Project<br><a href="https://commons.apache.org/">https://commons.apache.org/</a></p>

<h2><a name="mirrors">Download from your
    <a href="http://www.apache.org/dyn/closer.cgi/commons/">nearest mirror site!</a></a></h2>

<p>
    Do not download from www.apache.org.  Please use a mirror site
    to help us save apache.org bandwidth.
    <a href="http://www.apache.org/dyn/closer.cgi/commons/">Go
        here to find your nearest mirror.</a>
</p>

<a name="sig"><h2>Signatures</h2></a>

<p>Many of the files have been digitally signed using GnuPG.  If so,
    there will be an accompanying <samp><em>file</em>.asc</samp> signature
    file in the same directory as the file (binaries/ or source/).  The
    signing keys can be found in the distribution directory at &lt;<a
            HREF="http://www.apache.org/dist/commons/KEYS"><samp>http://www.apache.org/dist/commons/KEYS</samp></a>&gt;.</p>

<p><b>Always download the KEYS file directly from the Apache site, never from a mirror site.</b></p>


<pre>Always test available signatures, <i>e.g.</i>,
$ pgpk -a KEYS
$ pgpv ${artifactId}-${version}-bin.tar.gz.asc
or,
$ pgp -ka KEYS
$ pgp ${artifactId}-${version}-bin.tar.gz.asc
or,
$ gpg --import KEYS
$ gpg --verify ${artifactId}-${version}-bin.tar.gz.asc
</pre>
<p>