 ----
 Download
 ----
~~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.

Download NPanday

  NPanday is distributed under the {{{http://www.apache.org/licenses/LICENSE-2.0} Apache License, version 2.0}}.


* Current Release: NPanday ${npandayReleaseVersion}

  This is the currently recommended version of NPanday.

  []

*-------------------------------+---------+----------+-----------+
| NPanday ${npandayReleaseVersion}                 | Mirrors | Checksum | Signature |
*-------------------------------+---------+----------+-----------+
| NPanday ${npandayReleaseVersion} MSI        | {{{http://www.apache.org/dyn/closer.cgi/incubator/npanday/binaries/npanday-installer-${npandayReleaseVersion}.msi} msi}} | {{{ http://www.apache.org/dist/incubator/npanday/binaries/npanday-installer-${npandayReleaseVersion}.msi.md5} md5}} | {{{ http://www.apache.org/dist/incubator/npanday/binaries/npanday-installer-${npandayReleaseVersion}.msi.asc} asc}} |
*-------------------------------+---------+----------+-----------+
| NPanday ${npandayReleaseVersion} Binaries               | {{{http://www.apache.org/dyn/closer.cgi/incubator/npanday/binaries/npanday-repository-builder-${npandayReleaseVersion}-bin.tar.gz} tar.gz}} | {{{ http://www.apache.org/dist/incubator/npanday/binaries/npanday-repository-builder-${npandayReleaseVersion}-bin.tar.gz.md5} md5}} | {{{ http://www.apache.org/dist/incubator/npanday/binaries/npanday-repository-builder-${npandayReleaseVersion}-bin.tar.gz.asc} asc}} |
*-------------------------------+---------+----------+-----------+
| NPanday ${npandayReleaseVersion} Sources           |
{{{http://www.apache.org/dyn/closer.cgi/incubator/npanday/sources/apache-npanday-${npandayReleaseVersion}-src.zip} source zip}} | {{{http://www.apache.org/dist/incubator/npanday/sources/apache-npanday-${npandayReleaseVersion}-src.zip.md5} md5}} | {{{ http://www.apache.org/dist/incubator/npanday/sources/apache-npanday-${npandayReleaseVersion}-src.zip.asc} asc}} |
*-------------------------------+---------+----------+-----------+


* Previous Versions

  More releases are available in the {{{http://archive.apache.org/dist/incubator/npanday/binaries/} NPanday Archives}}

* Verify the integrity of the files

 We recommend that you verify the integrity of the downloaded files using the PGP signatures and MD5 checksums.

 The PGP signatures can be verified using PGP or GPG. First download the {{{http://archive.apache.org/dist/incubator/npanday/KEYS}KEYS}}
 as well as the asc signature file for the particular distribution. Make sure you get these files from
 {{{http://www.apache.org/dist/incubator/npanday/}the main distribution directory}},
 rather than from a mirror. Then verify the signatures using


 % pgpk -a KEYS

 % pgpv ${filename}.tar.gz.asc

 or

 % pgp -ka KEYS

 % pgp ${filename}.tar.gz.asc

 or

 % gpg --import KEYS

 % gpg --verify ${filename}.tar.gz.asc

 You can also verify the MD5 signature on the files. A Unix program called md5 or md5sum is included in many
 Unix distributions. It is also available as part of {{{http://www.gnu.org/software/coreutils/}GNU Coreutils}}.
 Windows users can get binary md5 programs from {{{http://www.fourmilab.ch/md5/}Fourmilab}},
 {{{http://www.pc-tools.net/win32/freeware/console}PC-Tools}} or {{{http://www.slavasoft.com/fsum/}SlavaSoft}}.
