<!DOCTYPE html>
<!--
   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.
-->
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Samza {% if page.title %}- {{page.title}}{% endif %}</title>
    <link href='/css/ropa-sans.css' rel='stylesheet' type='text/css'/>
    <link href="/css/bootstrap.min.css" rel="stylesheet"/>
    <link href="/css/font-awesome.min.css" rel="stylesheet"/>
    <link href="/css/main.css" rel="stylesheet"/>
    <link href="/css/syntax.css" rel="stylesheet"/>
    <link rel="icon" type="image/png" href="/img/samza-icon.png">
  </head>
  <body>
    <div class="wrapper">
      <div class="wrapper-content">

        <div class="masthead">
          <div class="container">
            <div class="masthead-logo">
              <a href="/" class="logo">samza</a>
            </div>
            <div class="masthead-icons">
              <div class="pull-right">
                <a href="/startup/download"><i class="fa fa-arrow-circle-o-down masthead-icon"></i></a>
                <a href="https://git-wip-us.apache.org/repos/asf?p=incubator-samza.git;a=tree" target="_blank"><i class="fa fa-code masthead-icon" style="font-weight: bold;"></i></a>
                <a href="https://twitter.com/samzastream" target="_blank"><i class="fa fa-twitter masthead-icon"></i></a>
                {% if page.url contains "0.7.0" %}
                  <a href="{{site.baseurl}}/{% if site.version == "latest" %}{{page.url | replace:'versioned', site.latest-release | replace_first: '/', ''}}{% else %}{{page.url | replace:'0.7.0', 'latest' | replace_first: '/', ''}}{% endif %}"><i class="fa fa-history masthead-icon"></i></a>
                {% endif %}
              </div>
            </div>
          </div><!-- /.container -->
        </div>

        <div class="container">
          <div class="menu">
            <h1><i class="fa fa-rocket"></i> Getting Started</h1>
            <ul>
              <li><a href="/startup/hello-samza/0.7.0">Hello Samza</a></li>
              <li><a href="/startup/download">Download</a></li>
            </ul>

            <h1><i class="fa fa-book"></i> Learn</h1>
            <ul>
              <li><a href="/learn/documentation/0.7.0">Documentation</a></li>
              <li><a href="/learn/tutorials/0.7.0">Tutorials</a></li>
              <li><a href="http://wiki.apache.org/samza/FAQ">FAQ</a></li>
              <li><a href="http://wiki.apache.org/samza">Wiki</a></li>
              <li><a href="http://wiki.apache.org/samza/PapersAndTalks">Papers &amp; Talks</a></li>
              <li><a href="http://blogs.apache.org/samza">Blog</a></li>
            </ul>

            <h1><i class="fa fa-comments"></i> Community</h1>
            <ul>
              <li><a href="/community/mailing-lists.html">Mailing Lists</a></li>
              <li><a href="/community/irc.html">IRC</a></li>
              <li><a href="https://issues.apache.org/jira/browse/SAMZA">Bugs</a></li>
              <li><a href="http://wiki.apache.org/samza/PoweredBy">Powered by</a></li>
              <li><a href="http://wiki.apache.org/samza/Ecosystem">Ecosystem</a></li>
              <li><a href="/community/committers.html">Committers</a></li>
            </ul>

            <h1><i class="fa fa-code"></i> Contribute</h1>
            <ul>
              <li><a href="/contribute/rules.html">Rules</a></li>
              <li><a href="/contribute/coding-guide.html">Coding Guide</a></li>
              <li><a href="/contribute/projects.html">Projects</a></li>
              <li><a href="/contribute/seps.html">SEPs</a></li>
              <li><a href="/contribute/code.html">Code</a></li>
              <li><a href="https://reviews.apache.org/groups/samza">Review Board</a></li>
              <li><a href="https://builds.apache.org/">Unit Tests</a></li>
              <li><a href="/contribute/disclaimer.html">Disclaimer</a></li>
            </ul>

            <h1><i class="fa fa-history"></i> Archive</h1>
            <ul>
              <li><a href="/archive/index.html">0.7.0</a></li>
            </ul>
          </div>

          <div class="content">
            {{content}}
          </div>
        </div>

      </div><!-- /.wrapper-content -->
    </div><!-- /.wrapper -->

    <div class="footer">
      <div class="container">
        <!-- nothing for now. -->
      </div>
    </div>

    <!-- 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>
  </body>
</html>
