<?xml version="1.0" encoding="UTF-8"?>

<!--
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 xmlns="http://maven.apache.org/DECORATION/1.8.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/DECORATION/1.8.0 http://maven.apache.org/xsd/decoration-1.8.0.xsd">

<!-- Start copy/paste of src/site/site.xml: inheritance does not work here because of src/site-docs hack -->
  <bannerLeft>
    <name>${project.name}</name>
    <src>https://maven.apache.org/images/apache-maven-project.png</src>
    <href>https://www.apache.org/</href>
  </bannerLeft>

  <bannerRight>
    <src>https://maven.apache.org/images/maven-logo-black-on-white.png</src>
    <href>https://maven.apache.org/</href>
  </bannerRight>

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

  <edit>${project.scm.url}</edit>
  <googleAnalyticsAccountId>UA-140879-1</googleAnalyticsAccountId>

  <custom>
    <fluidoSkin>
      <sourceLineNumbersEnabled>true</sourceLineNumbersEnabled>
      <twitter>
        <user>ASFMavenProject</user>
        <showUser>true</showUser>
      </twitter>
      <googleSearch>
        <sitesearch/>
      </googleSearch>
    </fluidoSkin>
  </custom>

  <publishDate position="right" />
  <version position="right" />
<!-- End copy/paste of src/site/site.xml -->

  <body>

    <breadcrumbs>
      <item name="Apache" href="https://www.apache.org/" />
      <item name="Maven"  href="https://maven.apache.org/index.html" />
      <item name="Parent POMs" href="https://maven.apache.org/pom/index.html" />
      <item name="Maven"  href="https://maven.apache.org/pom/maven/index.html" />
    </breadcrumbs>

    <menu name="Overview">
      <item name="Introduction" href="index.html"/>
      <!-- According to https://issues.apache.org/jira/browse/MNGSITE-152 -->
      <item name="License" href="https://www.apache.org/licenses/"/>
      <item name="Download" href="download.html"/>
    </menu>

    <menu name="Maven Parent POMs">
      <item name="Maven" href="index.html"/>
      <item name="Plugins" href="maven-plugins/index.html"/>
      <item name="Shared Components" href="maven-shared-components/index.html"/>
      <item name="Skins" href="maven-skins/index.html"/>
      <item name="Doxia Tools" href="doxia-tools/index.html"/>
    </menu>

    <menu ref="reports" inherit="bottom" />

  </body>
</project>