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