<!DOCTYPE html>

<!--
  Copyright 2018 The Chromium Authors. All rights reserved.
  Use of this source code is governed by a BSD-style license that can be
  found in the LICENSE file.
-->

<html>

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <!-- Note: This tag is replaced when served through DDS! -->
  <base href="/">

  <title></title>
  <link href="favicon.png" rel="icon" sizes="64x64">

  <!-- Global site tag (gtag.js) - Google Analytics -->
  <script>
    const GA_DEVTOOLS_PROPERTY = 'UA-26406144-34'; // Dart DevTools GA Property UA.

    function getDevToolsPropertyID() {
      return GA_DEVTOOLS_PROPERTY;
    }
  </script>
  <!-- The below URI ?id= must match the GA_DEVTOOLS_PROPERTY above. -->
  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-26406144-34"></script>
  <script src="devtools_analytics.js"></script>
  <!-- End of DevTools Google Analytics -->

  <!-- DO NOT REMOVE: -->
  <!-- OBSERVER SCRIPT PLACEHOLDER -->

  <script>
    function supportsES6Classes() {
      "use strict";
      try { eval("class Foo {}"); }
      catch (e) { return false; }
      return true;
    }

    if (!supportsES6Classes()) {
      window.location.href = '/unsupported-browser.html';
    }
  </script>
</head>

<body>
  <!-- This script installs service_worker.js to provide PWA functionality to
       application. For more information, see:
       https://developers.google.com/web/fundamentals/primers/service-workers -->
  <script>
    var version = `2.22.2-${Math.random()}`;
    var scriptLoaded = false;
    function loadMainDartJs() {
      if (scriptLoaded) {
        return;
      }
      scriptLoaded = true;
      var scriptTag = document.createElement('script');
      scriptTag.src = 'main.dart.js';
      scriptTag.type = 'application/javascript';
      document.body.append(scriptTag);
    }

    if ('serviceWorker' in navigator) {
      if (window.location.href.includes('index.ddc.html')) {
        // If we are running DevTools locally, immediately load `main.dart.js` and
        // unregister any service workers:
        loadMainDartJs();
        navigator.serviceWorker.getRegistrations().then(function (registrations) {
          for (let registration of registrations) {
            registration.unregister();
          }
        });
      } else {
        // Service workers are supported. Use them.
        window.addEventListener('load', function () {
          // Wait for registration to finish before dropping the <script> tag.
          // Otherwise, the browser will load the script multiple times,
          // potentially different versions.
          var serviceWorkerUrl = 'service_worker.js?v=' + version;
          navigator.serviceWorker.register(serviceWorkerUrl)
            .then((reg) => {
              function waitForActivation(serviceWorker) {
                serviceWorker.addEventListener('statechange', () => {
                  if (serviceWorker.state == 'activated') {
                    loadMainDartJs();
                  }
                });
              }
              if (!reg.active && (reg.installing || reg.waiting)) {
                // No active web worker and we have installed or are installing
                // one for the first time. Simply wait for it to activate.
                waitForActivation(reg.installing || reg.waiting);
              } else if (!reg.active.scriptURL.endsWith(version)) {
                // When the app updates the version changes, so we
                // need to ask the service worker to update.
                reg.update();
                waitForActivation(reg.installing);
              } else {
                // Existing service worker is still good.
                loadMainDartJs();
              }
            })
            .catch((err) => {
              console.warn(
                ` Falling back to plain <script> tag. Error loading service worker: ${err}`);
              loadMainDartJs();
            });

          // If service worker doesn't succeed in a reasonable amount of time,
          // fallback to plain <script> tag.
          setTimeout(() => {
            if (!scriptLoaded) {
              console.warn(
                'Failed to load app from service worker. Falling back to plain <script> tag.',
              );
              loadMainDartJs();
            }
          }, 4000);
        });
      }
    } else {
      // Service workers not supported. Just drop the <script> tag.
      loadMainDartJs();
    }
  </script>
</body>

</html>
