<!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">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <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 type="text/javascript" src="devtools_analytics.js"></script>	
    <!-- End of DevTools Google Analytics -->

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

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

        // Handle URLs that pass all variables directly on a querystring without
        // the fragment (for ex. VS Code while it has some encoding bugs preventing
        // building the correct URLs using fragments
        // https://github.com/microsoft/vscode/issues/85930).
        if (window.location.search && window.location.search.length > 1) {
          // Ensure each component is encoded, because if the URI contains / slashes
          // Flutter will split on them and try to push multiple routes.
          const params = new URLSearchParams(unescape(window.location.search));
          params.forEach(function(v, k) { params.set(k, encodeURIComponent(v)) });
          window.location.replace(window.location.origin + '/#/?' + params.toString());
        }
    </script>
</head>

<body>
  <script>
    // Remove any previously registered service workers as DevTools does not use them anymore.
    if ('serviceWorker' in navigator) {
      navigator.serviceWorker.getRegistrations()
        .then(function(registrations) {
          for(let registration of registrations) {
            registration.unregister();
          }
        });
    }
  </script>

  <!-- Script to fail gracefully when CanvasKit crashes. -->
  <script>
    var realWarn = window.console.warn.bind(console);
    var tryingToClose = false;
    window.console.warn = function(obj) {
      if( typeof obj == "string" && obj.indexOf("CanvasKit") != -1 && obj.indexOf("font") != -1) {
        if (!tryingToClose) {
          tryingToClose = true;
          window.alert(
            "The Flutter web backend ('CanvasKit') has encountered a fatal error and needs to restart. \n" +
            "Press OK to restart devtools. We are aware of this bug and working hard on a fix.\n" + obj
          );
        }
        window.location.reload();
        return;
      }
      realWarn(obj);
    }
  </script>
  <script src="main.dart.js" type="application/javascript"></script>
</body>
</html>
