<!--
 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="Log4j Flume Appender"
         xmlns="http://maven.apache.org/DECORATION/1.4.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/DECORATION/1.4.0 http://maven.apache.org/xsd/decoration-1.4.0.xsd">
  <body>
    <links>
      <item name="Apache" href="http://www.apache.org/" />
      <item name="Logging Services" href="http://logging.apache.org/"/>
      <item name="Log4j" href="../index.html"/>
    </links>

    <!-- Component-specific reports -->
    <menu ref="reports"/>

	<!-- Overall Project Info -->
    <menu name="Log4j Project Information" img="icon-info-sign">
      <item name="Dependencies" href="../dependencies.html" />
      <item name="Dependency Convergence" href="../dependency-convergence.html" />
      <item name="Dependency Management" href="../dependency-management.html" />
      <item name="Project Team" href="../team-list.html" />
      <item name="Mailing Lists" href="../mail-lists.html" />
      <item name="Issue Tracking" href="../issue-tracking.html" />
      <item name="Project License" href="../license.html" />
      <item name="Source Repository" href="../source-repository.html" />
      <item name="Project Summary" href="../project-summary.html" />
    </menu>

    <menu name="Log4j Project Reports" img="icon-cog">
      <item name="Changes Report" href="../changes-report.html" />
      <item name="JIRA Report" href="../jira-report.html" />
      <item name="Surefire Report" href="../surefire-report.html" />
      <item name="RAT Report" href="../rat-report.html" />
    </menu>
  </body>
</project>
