<!--
     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.
-->
<!DOCTYPE html>
<html lang="en-gb">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link id="favicon" rel="icon" href="<%= BASE_URL %>cloud.ico">
    <title id="title" >Apache CloudStack</title>
    <style>
      .loader {
        border: 16px solid #F3F3F3;
        border-top: 16px solid #39A7DE;
        border-radius: 50%;
        width: 80px;
        height: 80px;
        animation: spin 1s linear infinite;
        position: fixed;
        left: 0; right: 0;
        top: 0; bottom: 0;
        margin: auto;
        max-width: 100%;
        max-height: 100%;
        overflow: hidden;
      }
      @keyframes spin {
        0% { transform: rotate(0deg); }
        100% { transform: rotate(360deg); }
      }
    </style>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but CloudStack UI needs JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app">
      <div class="loader"></div>
    </div>
  </body>
  <script type="text/javascript">
    fetch('./config.json')
      .then(response => response.json())
      .then(data => {
        document.getElementById("favicon").setAttribute("href", data.loginPageFavicon);
        document.getElementById("title").innerHTML = data.loginPageTitle;
      }).catch((err) => {});
  </script>
</html>
