~~ 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.

    ---------------
     Documentation
    ---------------

  The following documentation for the Axiom framework is available:
  
    * A {{{./userguide.html}User Guide}} explaining how to use
      Axiom in your project.
    
    * A {{{./devguide/devguide.html}Developer Guide}} containing information
      for committers and contributors.
    
    * The {{{./apidocs/index.html}Javadoc}} for the Axiom API.
  
  The user and developer guides are also available in PDF format in the
  binary distribution and as individual Maven artifacts that can be downloaded from
  the central repository or the Apache snapshot repository.
