<!--

Licensed 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.

-->

{% extends "layout.html" %}
{% set title = 'Download' %}
{% set url = 'https://media.readthedocs.org/%s/couchdb/%s/couchdb.%s' %}

{% block body %}
<h1>Download Apache CouchDB™ {{ release }} Documentation</h1>

<p>To download an archive containing all the documents for this version of
CouchDB in one of various formats, follow one of links in this table</p>

<table class="docutils">
  <tr>
     <td>PDF (A4 paper size)</td>
     <td><a href="{{ url|format('pdf', rtd_ver, 'pdf') }}">Download</a> (~1 MB)</td>
  </tr>
  <tr>
     <td>HTML</td>
     <td><a href="{{ url|format('htmlzip', rtd_ver, 'zip') }}">Download</a> (~5 MB)</td>
  </tr>
  <tr>
    <td>EPUB</td>
    <td><a href="{{ url|format('epub', rtd_ver, 'epub') }}">Download</a> (~1 MB)</td>
  </tr>
</table>

<p>These archives contain all the content of the documentation.</p>

{% endblock %}
