Copyright (c) 2014 The Apache Software Foundation


                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS
            

This distribution contains third party resources.
Within the console-proxy/js directory
    licensed under the MIT License http://www.opensource.org/licenses/mit-license.php  (as follows)

            Copyright (c) 2009, John Resig 
            
            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.
                        
        from John Resig   
            jquery.js 


Within the patches/systemvm/debian/config/etc directory
    placed in the public domain
        by Adiscon GmbH  http://www.adiscon.com/ 
            rsyslog.conf 
        by Simon Kelley   
            dnsmasq.conf 
            vpcdnsmasq.conf 

Within the patches/systemvm/debian/config/etc/apache2 directory
    licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt  (as above)
    Copyright (c) 2012 The Apache Software Foundation
        from The Apache Software Foundation  http://www.apache.org/ 
            httpd.conf 
            vhost.template

Within the patches/systemvm/debian/config/etc/ssh/ directory
    licensed under the BSD (2-clause) http://www.opensource.org/licenses/BSD-2-Clause  (as follows)
 
            
            Redistribution and use in source and binary forms, with or without modification,
            are permitted provided that the following conditions are met:
            
            Redistributions of source code must retain the above copyright notice, this list
            of  conditions and the following disclaimer. Redistributions in binary form must
            reproduce the above copyright notice, this list  of conditions and the following
            disclaimer in the documentation and/or other materials  provided with the
            distribution.
            
            Neither the name of the author nor the names of contributors may be used to
            endorse  or promote products derived from this software without specific prior
            written permission.
            
            THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
            ANY  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
            WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
            DISCLAIMED. IN NO EVENT SHALL THE  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
            ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL DAMAGES
            (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE  GOODS OR SERVICES;
            LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  AND ON
            ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
            (INCLUDING  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
            SOFTWARE, EVEN IF ADVISED  OF THE POSSIBILITY OF SUCH DAMAGE.
                        
        from OpenSSH Project  http://www.openssh.org/ 
            sshd_config 

Within the patches/systemvm/debian/config/root/redundant_router directory
    placed in the public domain
        by The netfilter.org project  http://www.netfilter.org/ 
            conntrackd.conf.templ 

Within the scripts/storage/secondary directory
    licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt  (as above)
    Copyright (c) 2010-2011 OpenStack, LLC.
        from OpenStack, LLC  http://www.openstack.org 
            swift 

Within the scripts/vm/hypervisor/xenserver directory
    licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt  (as above)
    Copyright (c) 2010-2011 OpenStack, LLC.
        from OpenStack, LLC  http://www.openstack.org 
            swift 

Within the tools/appliance/definitions/{devcloud,systemvmtemplate,systemvmtemplate64} directory
    licensed under the MIT License http://www.opensource.org/licenses/mit-license.php  (as follows)

            Copyright (c) 2010-2012 Patrick Debois 
            
            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.
                        
        from Patrick Debois  http://www.jedi.be/blog/ 
            base.sh  from https://github.com/jedi4ever/veewee
            cleanup.sh  from https://github.com/jedi4ever/veewee
            definition.rb  from https://github.com/jedi4ever/veewee
            preseed.cfg  from https://github.com/jedi4ever/veewee
            zerodisk.sh  from https://github.com/jedi4ever/veewee

Within the tools/devcloud/src/deps/boxes/basebox-build directory
    licensed under the MIT License http://www.opensource.org/licenses/mit-license.php  (as follows)

            Copyright (c) 2010-2012 Patrick Debois 
            
            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.
                        
        from Patrick Debois  http://www.jedi.be/blog/ 
            definition.rb  from https://github.com/jedi4ever/veewee
            preseed.cfg  from https://github.com/jedi4ever/veewee

Within the ui/lib directory
    placed in the public domain
        by Eric Meyer  http://meyerweb.com/eric/ 
            reset.css  from http://meyerweb.com/eric/tools/css/reset/

    licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt  (as above)
    Copyright (c) 2006 Google Inc.
        from Google Inc.  http://google.com 
            excanvas.js  from http://code.google.com/p/explorercanvas/

    licensed under the BSD (2-clause) http://www.opensource.org/licenses/BSD-2-Clause  (as follows)

            Copyright (c) 2008 George McGinley Smith
            All rights reserved. 
            
            Redistribution and use in source and binary forms, with or without modification,
            are permitted provided that the following conditions are met:
            
            Redistributions of source code must retain the above copyright notice, this list
            of  conditions and the following disclaimer. Redistributions in binary form must
            reproduce the above copyright notice, this list  of conditions and the following
            disclaimer in the documentation and/or other materials  provided with the
            distribution.
            
            Neither the name of the author nor the names of contributors may be used to
            endorse  or promote products derived from this software without specific prior
            written permission.
            
            THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
            ANY  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
            WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
            DISCLAIMED. IN NO EVENT SHALL THE  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
            ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL DAMAGES
            (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE  GOODS OR SERVICES;
            LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  AND ON
            ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
            (INCLUDING  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
            SOFTWARE, EVEN IF ADVISED  OF THE POSSIBILITY OF SUCH DAMAGE.
                        
        from George McGinley Smith   
            jquery.easing.js 

    licensed under the MIT License http://www.opensource.org/licenses/mit-license.php  (as follows)
 
            
            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.
                        
        from The Dojo Foundation  http://dojofoundation.org/ 
            require.js  from http://github.com/jrburke/requirejs

    licensed under the MIT License http://www.opensource.org/licenses/mit-license.php  (as follows)

            Copyright (c) 2011, John Resig 
            
            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.
                        
        from John Resig   
            jquery.js 

    licensed under the MIT License http://www.opensource.org/licenses/mit-license.php  (as follows)

            Copyright (c) 2014 Jörn Zaefferer
            
            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.
                        
        from Jorn Zaefferer   
            jquery.validate.js 

    licensed under the MIT License http://www.opensource.org/licenses/mit-license.php  (as follows)

            Copyright (c) 2014 Jörn Zaefferer

            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.

        from Jorn Zaefferer
            jquery.validate.additional-methods.js

    licensed under the MIT License http://www.opensource.org/licenses/mit-license.php  (as follows)

            Copyright (c) 2010, Sebastian Tschan 
            
            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.
                        
        from Sebastian Tschan  https://blueimp.net 
            jquery.md5.js 

    licensed under the MIT License http://www.opensource.org/licenses/mit-license.php  (as follows)

            Copyright (c) 2006 Klaus Hartl (stilbuero.de) 
            
            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.
                        
        from Klaus Hartl  http://stilbuero.de 
            jquery.cookies.js 

Within the ui/lib/flot directory
    licensed under the MIT License http://www.opensource.org/licenses/mit-license.php  (as follows)

            Released under the MIT license by IOLA, December 2007. 
            
            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.
                        
        from IOLA  http://www.iola.dk/ 
            jquery.flot.crosshair.js 
            jquery.flot.fillbetween.js 
            jquery.flot.image.js 
            jquery.flot.js 
            jquery.flot.navigate.js 
            jquery.flot.resize.js 
            jquery.flot.selection.js 
            jquery.flot.stack.js 
            jquery.flot.symbol.js 
            jquery.flot.threshold.js 

    licensed under the MIT License http://www.opensource.org/licenses/mit-license.php  (as follows)

            Created by Brian Medendorp, June 2009
            Updated November 2009 with contributions from: btburnett3, Anthony Aragues and Xavi Ivars 
            
            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.
                        
        from Brian Medendorp   
            jquery.pie.js 

    licensed under the MIT License http://www.opensource.org/licenses/mit-license.php  (as follows)
 
            
            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.
                        
        from Ole Laursen   
            jquery.colorhelpers.js 

Within the ui/lib/jquery-ui directory
    licensed under the MIT License http://www.opensource.org/licenses/mit-license.php  (as follows)
 
            
            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.
                        
        from jQuery UI Developers  http://jqueryui.com/about 
            css/jquery-ui.css 
            index.html 
            js/jquery-ui.js 

Within the ui/lib/qunit directory
    licensed under the MIT License http://www.opensource.org/licenses/mit-license.php  (as follows)

            Copyright (c) 2012 John Resig, Jörn Zaefferer 
            
            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.
                        
        from Jorn Zaefferer   
            qunit.css  from http://docs.jquery.com/QUnit
            qunit.js  from http://docs.jquery.com/QUnit

Within the utils/src/com/cloud/utils/db directory
    licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt  (as above)
    Copyright (c) 2004 Clinton Begin
        from Clinton Begin  http://code.google.com/p/mybatis/ 
            ScriptRunner.java  from http://code.google.com/p/mybatis/

Within the utils/src/org/apache/commons/httpclient/contrib/ssl directory
    licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt  (as above)
    Copyright (c) 2007 The Apache Software Foundation
        from The Apache Software Foundation  http://www.apache.org/ 
            EasySSLProtocolSocketFactory.java 
            EasyX509TrustManager.java 

