====
    Licensed to jclouds, Inc. (jclouds) under one or more
    contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  jclouds 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.
====

jclouds
Copyright 2009-2012 jclouds, Inc.

This product includes software developed at
jclouds, Inc. (http://www.jclouds.org/).

This product includes Common Annotations (JSR 250, https://jsr250.dev.java.net/)
distributed under the CDDL Version 1.0 license.

This product includes Jersey (https://jersey.dev.java.net/)
distributed under the CDDL Version 1.0 license.

This product includes net.oauth.core 
distributed under the Apache Software License, Version 2.0.

This product includes Gson (http://code.google.com/p/google-gson)
distributed under the Apache Software License, Version 2.0.

This product includes Guice (http://code.google.com/p/google-guice)
distributed under the Apache Software License, Version 2.0.

This product includes Guava (http://code.google.com/p/guava-libraries)
distributed under the Apache Software License, Version 2.0.

org.jclouds.util.Suppliers2 and Suppliers2Test contain pieces of Guava's Suppliers
distributed under the Apache Software License, Version 2.0.
(c) 2010 Google Inc.

This product includes BouncyCastle (http://www.bouncycastle.org/licence.html)
distributed with the following notice:
  "Copyright (c) 2000 - 2011 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)

   Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

   The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."

This product includes findbugs jsr305 (http://code.google.com/p/findbugs)
distributed under the GNU Lesser GPL License, Version 3.0.

This product includes aopalliance (http://aopalliance.sourceforge.net/)
distributed in the Public Domain

This product includes software developed at Hewlett-Packard
Copyright (c) 2011-2012 Hewlett-Packard Development Company, L.P

