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


.. This file contain Variables shared across other .rst files in this project


.. _CloudStack Installation Guide: http://docs.cloudstack.apache.org/projects/cloudstack-installation
.. _CloudStack Administrator's Guide: http://docs.cloudstack.apache.org/projects/cloudstack-administration
.. _CloudStack Apidocs: http://cloudstack.apache.org/docs/api/

.. Latest version systemvm template URL
.. |sysvm64-url-xen|    replace:: http://cloudstack.apt-get.eu/systemvm/4.6/systemvm64template-4.6.0-xen.vhd.bz2
.. |sysvm64-url-kvm|    replace:: http://cloudstack.apt-get.eu/systemvm/4.6/systemvm64template-4.6.0-kvm.qcow2.bz2
.. |sysvm64-url-vmware| replace:: http://cloudstack.apt-get.eu/systemvm/4.6/systemvm64template-4.6.0-vmware.ova
.. |sysvm64-url-hyperv| replace:: http://cloudstack.apt-get.eu/systemvm/4.6/systemvm64template-4.6.0-hyperv.vhd.zip
