{{ partial "header.html" . }}

<div class="body">
    <main role="main">
        <article class="static doc">
            <h1>{{ .Title }}</h1>

            <h2>Latest releases</h2>

            <p>Apache Camel community provides support for the latest three major versions. Latest version receives new features, next two supported versions receive only bug fixes.</p>

            <ul>
            {{ $releases := ((where (where .Site.Pages "Type" "release-note") ".Params.rc" "ne" "true").ByParam "version").Reverse }}
            {{ $major := "" }}
            {{ $cnt := 1 }}
            {{ range $releases }}
                {{ $this_major := .Params.version | replaceRE "\\.\\d+$" "" }}
                {{ if (and (le $cnt 3) (or (eq $major "") (ne $major $this_major ))) }}
                    <li>The latest {{ if eq $major "" }}feature{{ else }}bugfix{{ end }} release of Camel {{ $this_major }}.x is <a href="{{ .RelPermalink }}">{{ .Params.version }}</a></li>
                    {{ $cnt = add $cnt 1 }}
                {{ end }}
                {{ $major = .Params.version | replaceRE "\\.\\d+$" "" }}
            {{ end }}
            </ul>
 
            <h2>Getting the latest distributions</h2>

            <h3>Binary Distribution</h3>

            {{ $major := "" }}
            {{ $cnt := 1 }}
            <div class="table-wrapper">
            <table class="tableblock frame-all grid-all stretch">
                <thead>
                    <tr>
                        <th>Version</th>
                        <th>Description</th>
                        <th>Download Link</th>
                        <th>PGP Signature file of download</th>
                        <th>SHA512 Checksum file of download</th>
                    </tr>
                </thead>

                {{ range $releases }}
                    {{ $this_major := .Params.version | replaceRE "\\.\\d+$" "" }}
                    {{ if (and (le $cnt 3) (or (eq $major "") (ne $major $this_major ))) }}
                        <tbody>
                            <tr>
                              <td rowspan="2"><strong>{{ .Params.version }}</strong><br><small>{{ if eq $major "" }}feature{{ else }}bugfix{{ end }}</small></td>
                                <td>Windows Distribution</td>
                                <td><a href="http://www.apache.org/dyn/closer.lua?filename=camel/apache-camel/{{ .Params.version }}/apache-camel-{{ .Params.version }}.zip&action=download">apache-camel-{{ .Params.version }}.zip</a></td>
                                <td><a href="https://www.apache.org/dist/camel/apache-camel/{{ .Params.version }}/apache-camel-{{ .Params.version }}.zip.asc">apache-camel-{{ .Params.version }}.zip.asc</a></td>
                                <td><a href="https://www.apache.org/dist/camel/apache-camel/{{ .Params.version }}/apache-camel-{{ .Params.version }}.zip.sha512">apache-camel-{{ .Params.version }}.zip.sha512</a></td>
                            </tr>
                            <tr>
                                <td>Unix/Linux/Cygwin Distribution</td>
                                <td><a href="http://www.apache.org/dyn/closer.lua?filename=camel/apache-camel/{{ .Params.version }}/apache-camel-{{ .Params.version }}.tar.gz&action=download">apache-camel-{{ .Params.version }}.tar.gz</a></td>
                                <td><a href="https://www.apache.org/dist/camel/apache-camel/{{ .Params.version }}/apache-camel-{{ .Params.version }}.tar.gz.asc">apache-camel-{{ .Params.version }}.tar.gz.asc</a></td>
                                <td><a href="https://www.apache.org/dist/camel/apache-camel/{{ .Params.version }}/apache-camel-{{ .Params.version }}.tar.gz.sha512">apache-camel-{{ .Params.version }}.tar.gz.sha512</a></td>
                            </tr>
                        </tbody>
                        {{ $cnt = add $cnt 1 }}
                    {{ end }}
                    {{ $major = .Params.version | replaceRE "\\.\\d+$" "" }}
                {{ end }}
            </table>
            </div>

            <h3>Source Distribution</h3>

            {{ $major := "" }}
            {{ $cnt := 1 }}
            <div class="table-wrapper">
            <table class="tableblock frame-all grid-all stretch">
                <thead>
                    <tr>
                        <th>Version</th>
                        <th>Description</th>
                        <th>Download Link</th>
                        <th>PGP Signature file of download</th>
                        <th>SHA512 Checksum file of download</th>
                    </tr>
                </thead>

                {{ range $releases }}
                    {{ $this_major := .Params.version | replaceRE "\\.\\d+$" "" }}
                    {{ if (and (le $cnt 3) (or (eq $major "") (ne $major $this_major ))) }}
                        <tbody>
                            <tr>
                              <td><strong>{{ .Params.version }}</strong><br><small>{{ if eq $major "" }}feature{{ else }}bugfix{{ end }}</small></td>
                                <td>Source ZIP file</td>
                                <td><a href="http://www.apache.org/dyn/closer.lua?filename=camel/apache-camel/{{ .Params.version }}/apache-camel-{{ .Params.version }}-src.zip&action=download">apache-camel-{{ .Params.version }}-src.zip</a></td>
                                <td><a href="https://www.apache.org/dist/camel/apache-camel/{{ .Params.version }}/apache-camel-{{ .Params.version }}-src.zip.asc">apache-camel-{{ .Params.version }}-src.zip.asc</a></td>
                                <td><a href="https://www.apache.org/dist/camel/apache-camel/{{ .Params.version }}/apache-camel-{{ .Params.version }}-src.zip.sha512">apache-camel-{{ .Params.version }}-src.zip.sha512</a></td>
                            </tr>
                        </tbody>
                        {{ $cnt = add $cnt 1 }}
                    {{ end }}
                    {{ $major = .Params.version | replaceRE "\\.\\d+$" "" }}
                {{ end }}
            </table>
            </div>
            <h3>Older releases</h3>

            All releases are listed on the <a href="{{ "/releases/" | relURL}}">Releases</a> archive, here you will also find releases that are no longer supported.

            {{ .Content }}

        </article>
    </main>
</div>

{{ partial "footer.html" . }}
