.. 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
   https://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: https://docs.cloudstack.apache.org/projects/cloudstack-installation
.. _CloudStack Administrator's Guide: https://docs.cloudstack.apache.org/projects/cloudstack-administration
.. _CloudStack Apidocs: https://cloudstack.apache.org/api.html

.. |documentation_home| replace:: https://docs.cloudstack.apache.org/

.. Latest version systemvm template name

.. |sysvm64-version|     replace:: 4.15.1
.. |sysvm64-name-xen|    replace:: systemvm-xenserver-4.15.1
.. |sysvm64-name-kvm|    replace:: systemvm-kvm-4.15.1
.. |sysvm64-name-vmware| replace:: systemvm-vmware-4.15.1
.. |sysvm64-name-hyperv| replace:: systemvm-hyperv-4.15.1
.. |sysvm64-name-ovm|    replace:: systemvm-ovm-4.15.1

.. Latest version systemvm template URL
.. |sysvm64-url-xen|    replace:: https://download.cloudstack.org/systemvm/4.15/systemvmtemplate-4.15.1-xen.vhd.bz2
.. |sysvm64-url-kvm|    replace:: https://download.cloudstack.org/systemvm/4.15/systemvmtemplate-4.15.1-kvm.qcow2.bz2
.. |sysvm64-url-vmware| replace:: https://download.cloudstack.org/systemvm/4.15/systemvmtemplate-4.15.1-vmware.ova
.. |sysvm64-url-hyperv| replace:: https://download.cloudstack.org/systemvm/4.15/systemvmtemplate-4.15.1-hyperv.vhd.zip
.. |sysvm64-url-ovm|    replace:: https://download.cloudstack.org/systemvm/4.15/systemvmtemplate-4.15.1-ovm.raw.bz2

.. Version specific: 4.5 systemvm template URL
.. |acs45-sysvm64-url-xen|    replace:: https://download.cloudstack.org/systemvm/4.5/systemvm64template-4.5-xen.vhd.bz2
.. |acs45-sysvm64-url-kvm|    replace:: https://download.cloudstack.org/systemvm/4.5/systemvm64template-4.5-kvm.qcow2.bz2
.. |acs45-sysvm64-url-vmware| replace:: https://download.cloudstack.org/systemvm/4.5/systemvm64template-4.5-vmware.ova
.. |acs45-sysvm64-url-hyperv| replace:: https://download.cloudstack.org/systemvm/4.5/systemvm64template-4.5-hyperv.vhd.zip

.. Images


.. |vpn-icon.png| image:: /_static/images/vpn-icon.png
.. |sysmanager.png| image:: /_static/images/sysmanager.png
.. |software-license.png| image:: /_static/images/software-license.png
.. |change-admin-password.png| image:: /_static/images/change-admin-password.png
.. |menu_acs_logo| image:: /_static/acslogo.png

.. |br| raw:: html

   <br/>
