<!--
 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_Audit"
         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="Logging Wiki" href="https://cwiki.apache.org/confluence/display/LOGGING/Home"/>
      <item name="Apache" href="https://www.apache.org/"/>
      <item name="Logging Services" href="https://logging.apache.org/"/>
      <item name="GitHub" href="https://github.com/apache/logging-log4j-audit"/>
    </links>

    <menu name="Apache Log4j Audit™" inherit="top" img="icon-home">
      <item name="About" href="/index.html"/>
      <item name="Download" href="/download.html"/>
      <item name="Getting Started" href="/gettingStarted.html"/>
      <item name="Audit Catalog" href="catalog.html"/>
      <item name="RequestContext" href="/requestContext.html"/>
      <item name="Sample Project" href="sample.html"/>
      <item name="Changelog" href="/changelog.html"/>
      <item name="Javadoc" href="/apidocs/index.html"/>
    </menu>

    <menu name="For Contributors" inherit="top" img="icon-pencil">
      <item name="Building Log4j Audit from Source" href="/build.html"/>
      <item name="Guidelines" href="/guidelines.html"/>
      <item name="Style Guide" href="/javastyle.html"/>
    </menu>

    <menu name="Component Reports" inherit="top" img="icon-cog">
      <item name="Audit API" href="log4j-audit/log4j-audit-api/index.html"/>
      <item name="Audit Service" href="log4j-audit/log4j-audit-war/index.html"/>
      <item name="Maven Plugin" href="log4j-audit/log4j-audit-maven-plugin/index.html"/>
      <item name="Catalog API" href="log4j-catalog/log4j-catalog-api/index.html"/>
      <item name="Git Catalog Access" href="log4j-catalog/log4j-catalog-git/index.html"/>
      <item name="JPA Catalog Access" href="log4j-catalog/log4j-catalog-jpa/index.html"/>
      <item name="Catalog Editor" href="log4j-catalog/log4j-catalog-war/index.html"/>
    </menu>

    <menu name="Project Information" img="icon-info-sign">
      <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="Project Reports" img="icon-cog">
      <item name="Changes Report" href="/changes-report.html" />
      <item name="JIRA Report" href="/jira-report.html" />
      <item name="RAT Report" href="/rat-report.html" />
    </menu>
  </body>
</project>