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

<footer>
  <div class="footer-inner">
    <div class="side-by-side">
      <div>
        <div class="footer__heading">Learn More</div>
        <div class="footer__items">
          <a class="footer__item" href="/meetups/">Meetups</a>
          <a class="footer__item" href="/blog/">Blog</a>
          <a class="footer__item" href="/learn/documentation/{{site.version}}/introduction/background.html">About</a>
        </div>
      </div>
      <div>
        <div class="footer__heading">Community</div>
        <div class="footer__items">
          <a class="footer__item" href="/community/contact-us.html">Contact Us</a>
          <a class="footer__item" href="/contribute/contributors-corner.html">Contributors' Corner</a>
          <a class="footer__item" href="/community/committers.html">PMC members and committers</a>
          <a class="footer__item" href="/powered-by/">Powered By</a>
        </div>
      </div>

      <div>
        <div class="quick-links">
          <a class="quick-link" href="/startup/download" target="_blank">
            <i class="icon ion-md-download"></i>
          </a>
          <a class="quick-link" href="https://git-wip-us.apache.org/repos/asf?p=samza.git;a=tree" target="_blank">
            <i class="icon ion-md-code"></i>
          </a>
          <a class="quick-link" href="https://twitter.com/samzastream" target="_blank">
            <i class="icon ion-logo-twitter"></i>
          </a>
        </div>

        <p>
          <script>document.write(new Date().getFullYear());</script> &copy; samza.apache.org</p>
      </div>

    </div>
  </div>

</footer>

{% if page.url contains "versioned" %}
<script>
  var tryFile = function (url, cb) {
    var myRequest = new Request(url);
    fetch(myRequest).then((response, cb) => {
      console.log(response.status); // returns 200
      cb(response.status != 404);
    });
  }

  tryFile(window.location.pathname, function (status) {
    // do something with the status
    console.log(status);
  });
</script>
{% endif %}

<!-- Google Analytics -->
<script>
  (function (i, s, o, g, r, a, m) {
    i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () {
      (i[r].q = i[r].q || []).push(arguments)
    }, i[r].l = 1 * new Date(); a = s.createElement(o),
      m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m)
  })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');

  ga('create', 'UA-43122768-1', 'apache.org');
  ga('send', 'pageview');

</script>
<script src="/js/main.new.js"></script>