<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
  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.
-->
<project name="Apache Hama">
  <bannerLeft>
    <name>Apache Hama</name>
    <src>http://www.apache.org/images/feather-small.gif</src>
    <href>/index.html</href>
  </bannerLeft>
  <bannerRight>
    <name>Apache Hama</name>
  </bannerRight>
  
  <publishDate position="none"/>
  <version position="none"/>

  <skin>
    <groupId>org.apache.maven.skins</groupId>
    <artifactId>maven-fluido-skin</artifactId>
    <version>1.4</version>
  </skin>

  <custom>
    <fluidoSkin>
      <topBarEnabled>true</topBarEnabled>
      <sideBarEnabled>false</sideBarEnabled>
      <googlePlusOne />
      <facebookLike />
    </fluidoSkin>
  </custom>

  <body>
  <head>
  <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-46300992-1', 'apache.org');
  ga('send', 'pageview');
  </script>
  </head>
  
    <breadcrumbs position="none"/>

    <menu name="Information">
      <item name="Overview" href="index.html"/>
      <item name="Downloads" href="downloads.html"/>
      <item name="Who We Are" href="team-list.html" />
      <item name="Privacy Policy" href="privacy_policy.html" />
    </menu>

    <menu name="Resources">
      <item name="Developers" href="developers.html" />
      <item name="Mailing Lists" href="mail-lists.html" />
      <item name="Issue Tracking" href="issue-tracking.html" />
      <item name="IRC channel" href="irc-channel.html" />
    </menu>

    <menu name="Documentation">
      <item name="Getting Started" href="getting_started_with_hama.html" />
      <item name="Run Examples" href="run_examples.html" />
      <item name="BSP tutorial" href="hama_bsp_tutorial.html" />
      <item name="Graph tutorial" href="hama_graph_tutorial.html" />
      <item name="Wiki for more stuff" href="http://wiki.apache.org/hama" />
    </menu>

    <menu name="Art works">
      <item name="Artwork and Clothing" href="artwork.html" />
    </menu>
    
    
    <footer>
      <div style="font-size:80%;">Apache Hama, Apache, the Apache feather logo, and
          the Apache Hama project logos are trademarks of The Apache Software
          Foundation. All other marks mentioned may be trademarks or registered
          trademarks of their respective owners.</div>
    </footer>
  </body>
  
</project>
