chiark / gitweb /
clock: wip svg, dump from game
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 16 Mar 2021 18:36:23 +0000 (18:36 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 19 Mar 2021 20:05:30 +0000 (20:05 +0000)
We dump a pile of stuff c&p out of firefox

This lets us hack on the svg with low edit/test/review.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
server dummy - alice - Otter.html [new file with mode: 0644]
server dummy - alice - Otter_files/script.js [new file with mode: 0644]
server dummy - alice - Otter_files/wasm.js [new file with mode: 0644]

diff --git a/server dummy - alice - Otter.html b/server dummy - alice - Otter.html
new file mode 100644 (file)
index 0000000..bae1583
--- /dev/null
@@ -0,0 +1,922 @@
+<!-- Copyright 2020-2021 Ian Jackson and contributors to Otter
+     SPDX-License-Identifier: AGPL-3.0-or-later
+     There is NO WARRANTY. -->
+<html><head>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+    <title>server::dummy - alice - Otter
+    </title>
+<link rel="license" href="http://localhost:8000/_/libre"><script>
+    orig_console = window.console;
+    window.console = (function(){
+      var new_console = { saved: [] };
+      for (k of ['log','error','warn','info']) {
+        (function(k){
+          var orig = orig_console[k];
+          new_console[k] = function() {
+            let args = [].slice.call(arguments);
+            new_console.saved.push([k, [args.map(s => (
+             s === undefined ? "<undefined>" :
+               s === null ? "<null>" :
+               s.toString()
+           ))]]);
+            orig.apply(orig_console, arguments);
+          }
+        })(k);
+      }
+      return new_console;
+    })();
+    console.log('wdriver.rs console log starts');
+</script>
+
+<script defer="defer">let wasm_input = fetch('/_/wasm.wasm');</script>
+<script src="server%20dummy%20-%20alice%20-%20Otter_files/wasm.js" defer="defer"></script>
+<script id="global-info" data-layout="Portrait"></script>
+<script src="server%20dummy%20-%20alice%20-%20Otter_files/script.js" defer="defer"></script>
+</head>
+<!-- Copyright 2020u Ian Jackson
+     SPDX-License-Identifier: AGPL-3.0-or-later
+     There is NO WARRANTY. --><head>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8"></head><body id="main-body" data-ctoken="TdWGr534zPXTH8v9wp0FF15bHs7R9bxyhFY2soYoN2Fg7U1R8RU09JQgasqN4jTC" data-us="1#1" data-gen="538" data-sse-url-prefix="" style="transform-origin: top left;">
+<style>
+  html {
+    background-color: #eef;
+  }
+  .footer {
+    background-color: #ddf;
+  }
+  div[id=infopane] {
+    display: flex;
+    flex-direction: column;
+    background-color: white;
+    overflow-y: scroll;
+  }
+  div[class=uos] {
+    flex: initial;
+  }
+  div[id=uos] {
+    flex: auto;
+  }
+  div[class=somepane] {
+    flex: auto;
+    display: flex;
+    flex-direction: column;
+  }
+  div[id=player_list_columns] {
+  }
+</style>
+
+<style>
+  body {
+    min-height: 100vw;
+  }
+  div[class=uos] { display: flex; flex-wrap: wrap; }
+  div[class|=uokey] {
+    outline: 1px solid #000;
+    margin: 1px;
+    padding-left: 5px;
+    padding-right: 6.5px;
+    align-self: start;
+  }
+  table[id=log] {
+    width: 100%;
+  }
+  td[class=logts] {
+    padding-left: 5px;
+    text-align: right;
+  }
+  div[class=uokey-r] {
+    align-self: end;
+  }
+  div[id=infopane] {
+    height: 100px;
+  }
+  .uos-mid {
+    flex-grow: 1;
+  }
+  div[id=player_list_columns] {
+    columns: 3;
+  }
+</style>
+<div class="upper">
+
+Hi alice
+
+|
+g
+<span id="wresting-warning"></span>
+
+|
+<strong>FAKING RANDOMNESS!</strong>
+<span id="status">server online 1#1 1C1 G538 U1 K1</span>
+
+|
+<a href="http://localhost:8000/l?kmqAKPwK4TfReFjMor8MJhdRPBcwIBpe">switch to landscape view</a> |
+<span id="links">links: <a href="https://jitsi.example.com/initial">Voice</a> <a href="http://localhost:8000/_/shapelib.html">Shapelib</a> |</span>
+
+<span style="white-space: nowrap;"><button id="zoom-btn" disabled="disabled" onclick="zoom_activate()">Zoom</button><input id="zoom-val" type="number" max="1000" min="10" step="5" size="4" value="100" oninput="zoom_enable()">%</span>
+
+
+<pre id="error"></pre>
+
+
+
+    <svg id="space" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 200" width="1800" height="1200">
+      <rect fill="#bbd" x="0" y="0" width="300" height="200"></rect>
+      <g id="pieces_marker"></g>
+      <use id="use170.5" href="#piece170.5" x="150" y="100" data-piece="170.5"></use>
+      <use id="use166.7" href="#piece166.7" x="115" y="135" data-piece="166.7"></use>
+      <use id="use111.7" href="#piece111.7" x="125" y="135" data-piece="111.7"></use>
+      <use id="use155.7" href="#piece155.7" x="135" y="135" data-piece="155.7"></use>
+      <use id="use72.7" href="#piece72.7" x="145" y="135" data-piece="72.7"></use>
+      <use id="use82.7" href="#piece82.7" x="155" y="135" data-piece="82.7"></use>
+      <use id="use54.7" href="#piece54.7" x="165" y="135" data-piece="54.7"></use>
+      <use id="use126.7" href="#piece126.7" x="175" y="135" data-piece="126.7"></use>
+      <use id="use81.7" href="#piece81.7" x="185" y="135" data-piece="81.7"></use>
+      <use id="use125.7" href="#piece125.7" x="115" y="65" data-piece="125.7"></use>
+      <use id="use94.7" href="#piece94.7" x="125" y="65" data-piece="94.7"></use>
+      <use id="use141.7" href="#piece141.7" x="135" y="65" data-piece="141.7"></use>
+      <use id="use47.7" href="#piece47.7" x="145" y="65" data-piece="47.7"></use>
+      <use id="use134.7" href="#piece134.7" x="155" y="65" data-piece="134.7"></use>
+      <use id="use163.7" href="#piece163.7" x="165" y="65" data-piece="163.7"></use>
+      <use id="use66.7" href="#piece66.7" x="175" y="65" data-piece="66.7"></use>
+      <use id="use161.7" href="#piece161.7" x="185" y="65" data-piece="161.7"></use>
+      <use id="use36.7" href="#piece36.7" x="115" y="125" data-piece="36.7"></use>
+      <use id="use20.7" href="#piece20.7" x="125" y="125" data-piece="20.7"></use>
+      <use id="use27.7" href="#piece27.7" x="135" y="125" data-piece="27.7"></use>
+      <use id="use29.7" href="#piece29.7" x="145" y="125" data-piece="29.7"></use>
+      <use id="use130.7" href="#piece130.7" x="155" y="125" data-piece="130.7"></use>
+      <use id="use146.7" href="#piece146.7" x="165" y="125" data-piece="146.7"></use>
+      <use id="use19.7" href="#piece19.7" x="175" y="125" data-piece="19.7"></use>
+      <use id="use149.7" href="#piece149.7" x="185" y="125" data-piece="149.7"></use>
+      <use id="use34.7" href="#piece34.7" x="115" y="75" data-piece="34.7"></use>
+      <use id="use70.7" href="#piece70.7" x="125" y="75" data-piece="70.7"></use>
+      <use id="use159.7" href="#piece159.7" x="135" y="75" data-piece="159.7"></use>
+      <use id="use89.7" href="#piece89.7" x="145" y="75" data-piece="89.7"></use>
+      <use id="use132.7" href="#piece132.7" x="155" y="75" data-piece="132.7"></use>
+      <use id="use160.7" href="#piece160.7" x="165" y="75" data-piece="160.7"></use>
+      <use id="use124.7" href="#piece124.7" x="175" y="75" data-piece="124.7"></use>
+      <use id="use30.7" href="#piece30.7" x="185" y="75" data-piece="30.7"></use>
+      <use id="use123.7" href="#piece123.7" x="20" y="75" data-piece="123.7"></use>
+      <use id="use140.7" href="#piece140.7" x="30" y="75" data-piece="140.7"></use>
+      <use id="use49.7" href="#piece49.7" x="40" y="75" data-piece="49.7"></use>
+      <use id="use63.7" href="#piece63.7" x="50" y="75" data-piece="63.7"></use>
+      <use id="use46.7" href="#piece46.7" x="60" y="75" data-piece="46.7"></use>
+      <use id="use18.7" href="#piece18.7" x="70" y="75" data-piece="18.7"></use>
+      <use id="use88.7" href="#piece88.7" x="80" y="75" data-piece="88.7"></use>
+      <use id="use165.7" href="#piece165.7" x="90" y="75" data-piece="165.7"></use>
+      <use id="use39.7" href="#piece39.7" x="20" y="85" data-piece="39.7"></use>
+      <use id="use9.7" href="#piece9.7" x="30" y="85" data-piece="9.7"></use>
+      <use id="use145.7" href="#piece145.7" x="40" y="85" data-piece="145.7"></use>
+      <use id="use139.7" href="#piece139.7" x="50" y="85" data-piece="139.7"></use>
+      <use id="use43.7" href="#piece43.7" x="60" y="85" data-piece="43.7"></use>
+      <use id="use122.7" href="#piece122.7" x="70" y="85" data-piece="122.7"></use>
+      <use id="use32.7" href="#piece32.7" x="80" y="85" data-piece="32.7"></use>
+      <use id="use26.7" href="#piece26.7" x="90" y="85" data-piece="26.7"></use>
+      <use id="use93.7" href="#piece93.7" x="20" y="95" data-piece="93.7"></use>
+      <use id="use154.7" href="#piece154.7" x="30" y="95" data-piece="154.7"></use>
+      <use id="use38.7" href="#piece38.7" x="40" y="95" data-piece="38.7"></use>
+      <use id="use25.7" href="#piece25.7" x="50" y="95" data-piece="25.7"></use>
+      <use id="use129.7" href="#piece129.7" x="60" y="95" data-piece="129.7"></use>
+      <use id="use48.7" href="#piece48.7" x="70" y="95" data-piece="48.7"></use>
+      <use id="use158.7" href="#piece158.7" x="80" y="95" data-piece="158.7"></use>
+      <use id="use164.7" href="#piece164.7" x="90" y="95" data-piece="164.7"></use>
+      <use id="use51.7" href="#piece51.7" x="20" y="100" data-piece="51.7"></use>
+      <use id="use69.7" href="#piece69.7" x="30" y="100" data-piece="69.7"></use>
+      <use id="use113.7" href="#piece113.7" x="40" y="100" data-piece="113.7"></use>
+      <use id="use14.7" href="#piece14.7" x="50" y="100" data-piece="14.7"></use>
+      <use id="use10.7" href="#piece10.7" x="60" y="100" data-piece="10.7"></use>
+      <use id="use110.7" href="#piece110.7" x="70" y="100" data-piece="110.7"></use>
+      <use id="use28.7" href="#piece28.7" x="80" y="100" data-piece="28.7"></use>
+      <use id="use102.7" href="#piece102.7" x="90" y="100" data-piece="102.7"></use>
+      <use id="use153.7" href="#piece153.7" x="17" y="110" data-piece="153.7"></use>
+      <use id="use33.7" href="#piece33.7" x="22" y="110" data-piece="33.7"></use>
+      <use id="use119.7" href="#piece119.7" x="27" y="110" data-piece="119.7"></use>
+      <use id="use169.7" href="#piece169.7" x="32" y="110" data-piece="169.7"></use>
+      <use id="use57.7" href="#piece57.7" x="37" y="110" data-piece="57.7"></use>
+      <use id="use91.7" href="#piece91.7" x="42" y="110" data-piece="91.7"></use>
+      <use id="use118.7" href="#piece118.7" x="47" y="110" data-piece="118.7"></use>
+      <use id="use78.7" href="#piece78.7" x="52" y="110" data-piece="78.7"></use>
+      <use id="use120.7" href="#piece120.7" x="57" y="110" data-piece="120.7"></use>
+      <use id="use148.7" href="#piece148.7" x="62" y="110" data-piece="148.7"></use>
+      <use id="use90.7" href="#piece90.7" x="67" y="110" data-piece="90.7"></use>
+      <use id="use138.7" href="#piece138.7" x="72" y="110" data-piece="138.7"></use>
+      <use id="use35.7" href="#piece35.7" x="77" y="110" data-piece="35.7"></use>
+      <use id="use40.7" href="#piece40.7" x="82" y="110" data-piece="40.7"></use>
+      <use id="use99.7" href="#piece99.7" x="87" y="110" data-piece="99.7"></use>
+      <use id="use168.7" href="#piece168.7" x="92" y="110" data-piece="168.7"></use>
+      <use id="use11.7" href="#piece11.7" x="20" y="125" data-piece="11.7"></use>
+      <use id="use31.7" href="#piece31.7" x="30" y="125" data-piece="31.7"></use>
+      <use id="use45.7" href="#piece45.7" x="40" y="125" data-piece="45.7"></use>
+      <use id="use77.7" href="#piece77.7" x="50" y="125" data-piece="77.7"></use>
+      <use id="use84.7" href="#piece84.7" x="60" y="125" data-piece="84.7"></use>
+      <use id="use65.7" href="#piece65.7" x="70" y="125" data-piece="65.7"></use>
+      <use id="use68.7" href="#piece68.7" x="80" y="125" data-piece="68.7"></use>
+      <use id="use42.7" href="#piece42.7" x="90" y="125" data-piece="42.7"></use>
+      <use id="use167.7" href="#piece167.7" x="20" y="135" data-piece="167.7"></use>
+      <use id="use127.7" href="#piece127.7" x="30" y="135" data-piece="127.7"></use>
+      <use id="use62.7" href="#piece62.7" x="40" y="135" data-piece="62.7"></use>
+      <use id="use101.7" href="#piece101.7" x="50" y="135" data-piece="101.7"></use>
+      <use id="use17.7" href="#piece17.7" x="60" y="135" data-piece="17.7"></use>
+      <use id="use44.7" href="#piece44.7" x="70" y="135" data-piece="44.7"></use>
+      <use id="use100.7" href="#piece100.7" x="80" y="135" data-piece="100.7"></use>
+      <use id="use144.7" href="#piece144.7" x="90" y="135" data-piece="144.7"></use>
+      <use id="use117.7" href="#piece117.7" x="20" y="145" data-piece="117.7"></use>
+      <use id="use71.7" href="#piece71.7" x="30" y="145" data-piece="71.7"></use>
+      <use id="use60.7" href="#piece60.7" x="40" y="145" data-piece="60.7"></use>
+      <use id="use15.7" href="#piece15.7" x="50" y="145" data-piece="15.7"></use>
+      <use id="use157.7" href="#piece157.7" x="60" y="145" data-piece="157.7"></use>
+      <use id="use41.7" href="#piece41.7" x="70" y="145" data-piece="41.7"></use>
+      <use id="use83.7" href="#piece83.7" x="80" y="145" data-piece="83.7"></use>
+      <use id="use115.7" href="#piece115.7" x="90" y="145" data-piece="115.7"></use>
+      <use id="use86.7" href="#piece86.7" x="210" y="55" data-piece="86.7"></use>
+      <use id="use59.7" href="#piece59.7" x="220" y="55" data-piece="59.7"></use>
+      <use id="use73.7" href="#piece73.7" x="230" y="55" data-piece="73.7"></use>
+      <use id="use136.7" href="#piece136.7" x="240" y="55" data-piece="136.7"></use>
+      <use id="use121.7" href="#piece121.7" x="250" y="55" data-piece="121.7"></use>
+      <use id="use80.7" href="#piece80.7" x="260" y="55" data-piece="80.7"></use>
+      <use id="use23.7" href="#piece23.7" x="270" y="55" data-piece="23.7"></use>
+      <use id="use151.7" href="#piece151.7" x="280" y="55" data-piece="151.7"></use>
+      <use id="use162.7" href="#piece162.7" x="210" y="65" data-piece="162.7"></use>
+      <use id="use108.7" href="#piece108.7" x="220" y="65" data-piece="108.7"></use>
+      <use id="use135.7" href="#piece135.7" x="230" y="65" data-piece="135.7"></use>
+      <use id="use142.7" href="#piece142.7" x="240" y="65" data-piece="142.7"></use>
+      <use id="use107.7" href="#piece107.7" x="250" y="65" data-piece="107.7"></use>
+      <use id="use55.7" href="#piece55.7" x="260" y="65" data-piece="55.7"></use>
+      <use id="use53.7" href="#piece53.7" x="270" y="65" data-piece="53.7"></use>
+      <use id="use143.7" href="#piece143.7" x="280" y="65" data-piece="143.7"></use>
+      <use id="use67.7" href="#piece67.7" x="210" y="75" data-piece="67.7"></use>
+      <use id="use52.7" href="#piece52.7" x="220" y="75" data-piece="52.7"></use>
+      <use id="use76.7" href="#piece76.7" x="230" y="75" data-piece="76.7"></use>
+      <use id="use112.7" href="#piece112.7" x="240" y="75" data-piece="112.7"></use>
+      <use id="use22.7" href="#piece22.7" x="250" y="75" data-piece="22.7"></use>
+      <use id="use85.7" href="#piece85.7" x="260" y="75" data-piece="85.7"></use>
+      <use id="use13.7" href="#piece13.7" x="270" y="75" data-piece="13.7"></use>
+      <use id="use56.7" href="#piece56.7" x="280" y="75" data-piece="56.7"></use>
+      <use id="use92.7" href="#piece92.7" x="210" y="45" data-piece="92.7"></use>
+      <use id="use106.7" href="#piece106.7" x="220" y="45" data-piece="106.7"></use>
+      <use id="use21.7" href="#piece21.7" x="230" y="45" data-piece="21.7"></use>
+      <use id="use114.7" href="#piece114.7" x="240" y="45" data-piece="114.7"></use>
+      <use id="use97.7" href="#piece97.7" x="250" y="45" data-piece="97.7"></use>
+      <use id="use147.7" href="#piece147.7" x="260" y="45" data-piece="147.7"></use>
+      <use id="use137.7" href="#piece137.7" x="270" y="45" data-piece="137.7"></use>
+      <use id="use133.7" href="#piece133.7" x="280" y="45" data-piece="133.7"></use>
+      <use id="use96.7" href="#piece96.7" x="205" y="125" data-piece="96.7"></use>
+      <use id="use87.7" href="#piece87.7" x="215" y="125" data-piece="87.7"></use>
+      <use id="use156.7" href="#piece156.7" x="225" y="125" data-piece="156.7"></use>
+      <use id="use75.7" href="#piece75.7" x="235" y="125" data-piece="75.7"></use>
+      <use id="use95.7" href="#piece95.7" x="245" y="125" data-piece="95.7"></use>
+      <use id="use150.7" href="#piece150.7" x="255" y="125" data-piece="150.7"></use>
+      <use id="use24.7" href="#piece24.7" x="265" y="125" data-piece="24.7"></use>
+      <use id="use104.7" href="#piece104.7" x="275" y="125" data-piece="104.7"></use>
+      <use id="use116.7" href="#piece116.7" x="205" y="135" data-piece="116.7"></use>
+      <use id="use105.7" href="#piece105.7" x="215" y="135" data-piece="105.7"></use>
+      <use id="use98.7" href="#piece98.7" x="225" y="135" data-piece="98.7"></use>
+      <use id="use103.7" href="#piece103.7" x="235" y="135" data-piece="103.7"></use>
+      <use id="use37.7" href="#piece37.7" x="245" y="135" data-piece="37.7"></use>
+      <use id="use64.7" href="#piece64.7" x="255" y="135" data-piece="64.7"></use>
+      <use id="use74.7" href="#piece74.7" x="265" y="135" data-piece="74.7"></use>
+      <use id="use109.7" href="#piece109.7" x="275" y="135" data-piece="109.7"></use>
+      <use id="use128.7" href="#piece128.7" x="205" y="145" data-piece="128.7"></use>
+      <use id="use131.7" href="#piece131.7" x="215" y="145" data-piece="131.7"></use>
+      <use id="use50.7" href="#piece50.7" x="225" y="145" data-piece="50.7"></use>
+      <use id="use58.7" href="#piece58.7" x="235" y="145" data-piece="58.7"></use>
+      <use id="use12.7" href="#piece12.7" x="245" y="145" data-piece="12.7"></use>
+      <use id="use16.7" href="#piece16.7" x="255" y="145" data-piece="16.7"></use>
+      <use id="use79.7" href="#piece79.7" x="265" y="145" data-piece="79.7"></use>
+      <use id="use152.7" href="#piece152.7" x="275" y="145" data-piece="152.7"></use>
+      <use id="use61.7" href="#piece61.7" x="205" y="155" data-piece="61.7"></use>
+      <use id="use8.9" href="#piece8.9" x="215" y="155" data-piece="8.9"></use>
+      <use id="use7.9" href="#piece7.9" x="225" y="155" data-piece="7.9"></use>
+      <use id="use6.9" href="#piece6.9" x="235" y="155" data-piece="6.9"></use>
+      <use id="use5.9" href="#piece5.9" x="245" y="155" data-piece="5.9"></use>
+      <use id="use4.9" href="#piece4.9" x="255" y="155" data-piece="4.9"></use>
+      <use id="use3.9" href="#piece3.9" x="265" y="155" data-piece="3.9"></use>
+      <use id="use2.9" href="#piece2.9" x="275" y="155" data-piece="2.9"></use>
+      <use id="use1.9" href="#piece1.9" x="240" y="100" data-piece="1.9"></use>
+      <g id="defs_marker"></g>
+      <defs id="defs170.5"><g id="piece170.5" transform="" data-dragraise="45"><g transform="scale(0.38 0.38) translate(-121 -123)"><!-- otter.git#67b62ea1ec2e0c2855d08397cd599bf2a951da0b+ library/edited/chess-board.usvg CC-BY-SA-4.0, see library/edited/LICENCE -->
+<svg width="242" height="246" viewBox="0 0 242 246" xmlns="http://www.w3.org/2000/svg" xmlns:usvg="https://github.com/RazrFalcon/resvg" usvg:version="0.11.0">
+    <defs></defs>
+    <path id="rect2850" fill="#d18b47" stroke="#b0b0b0" stroke-width="0.99999994" d="M 16.5 18.5 L 225.5 18.5 L 225.5 227.5 L 16.5 227.5 Z"></path>
+    <path fill="none" stroke="#cccccc" d="M 21 13.5 C 27 15.5 20 17.5 22 20.5"></path>
+</svg>
+</g></g><path id="surround2.9" d="M 0 4.94923 a 4.94923 4.94923 0 1 0 0 -9.89846 a 4.94923 4.94923 0 1 0 0 9.89846 z"></path></defs>
+      <defs id="defs1.9"><g id="piece1.9" transform="" data-dragraise="10">
+
+<g transform="translate(-25,-10)">
+        <rect fill="white" stroke="black" width="50" height="20"></rect>
+</g>
+
+    <use href="#surround1.9" stroke="black" fill="none" stroke-dasharray="3 1"></use></g><path id="surround1.9" d="M -27.500000000000004 -11 h 55.00000000000001 v 22 h -55.00000000000001 z"></path></defs>
+    </svg>
+
+<p>
+</p><div id="infopane">
+
+ <div id="pane_help" class="somepane">
+  <div id="uos" class="uos">
+    <div class="uokey-l"><b>b</b> send to bottom (below other pieces)</div><div class="uokey-l"><b>l</b> rotate left</div><div class="uokey-l"><b>r</b> rotate right</div><div class="uos-mid" id="uos-mid"></div>
+  <div class="uokey-r"><b>P</b> Pin to table</div><div class="uokey-r"><b>W</b> Enter wresting mode</div></div>
+  <div class="uos">
+    <div class="uokey"><strong>Mouse</strong> select/deselect/drag</div>
+    <div class="uokey"><strong>shift</strong> multiple selection</div>
+    <div class="uokey">Show
+      <strong>H</strong> this help
+      <strong>U</strong> players
+    </div>
+  </div>
+ </div>
+
+ <div id="pane_players" class="somepane" style="display:none">
+  <div id="player_list_columns">
+<div><strong>Players</strong> (<strong>H</strong>/<strong>U</strong>: return to help)</div>
+  <div id="player_list">
+
+<!-- Copyright 2020-2021 Ian Jackson and contributors to Otter
+     SPDX-License-Identifier: AGPL-3.0-or-later
+     There is NO WARRANTY. -->
+
+<div class="player">
+<span class="player_num">#1</span>
+<span class="nick">alice</span>
+<span class="account">[server:alice]</span>
+</div>
+
+<div class="player">
+<span class="player_num">#2</span>
+<span class="nick">bob</span>
+<span class="account">[server:bob]</span>
+</div>
+
+
+  </div>
+  </div>
+ </div>
+
+</div>
+
+
+<p>
+  </p><div id="logscroll" style="overflow-y: scroll; height: 200px;">
+    <table id="log">
+      
+      <tbody><tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:40 +0000</td></tr>
+      <tr><td class="logmsg">alice [server:alice] joined the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+      <tr><td class="logmsg">bob [server:bob] joined the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+      <tr><td class="logmsg">[server:] set the link <a href="https://www.example.org/newinfo">Info</a></td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+      <tr><td class="logmsg">[server:] removed the link Info</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+      <tr><td class="logmsg">alice grasped the chess clock</td><td class="logts">2021-03-16 18:15:23 +0000</td></tr>
+      <tr><td class="logmsg">alice released the chess clock</td><td class="logts">2021-03-16 18:15:25 +0000</td></tr>
+      <tr><td class="logmsg">alice grasped the chess clock</td><td class="logts">2021-03-16 18:15:26 +0000</td></tr>
+      <tr><td class="logmsg">alice released the chess clock</td><td class="logts">2021-03-16 18:15:26 +0000</td></tr>
+      <tr><td class="logmsg">alice grasped the chess clock</td><td class="logts">2021-03-16 18:15:26 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+      <tr><td class="logmsg">alice grasped the chess clock</td><td class="logts">2021-03-16 18:16:07 +0000</td></tr>
+    </tbody></table>
+  </div>
+</div>
+
+  <div class="footer">
+    <!--
+         this affects the document's overall scrollbars
+         which is not what we want.  so get rid of it for now
+    <div class="footer"; style="
+         height: 100vw;
+         width: 200vw;
+         left: -50vw;
+         overflow-y: clip;
+         position: absolute;
+         z-index: -1;
+     "><!-- this fills in the rest of the page, including the margins
+         --x
+    </div>
+    -->
+    <hr>
+    <address style="max-height: 100vh;">
+      This server is running Otter, the Online TableTop Environment
+      Renderer.  Otter and its shape (piece picture) libraries
+      are <a href="http://localhost:8000/_/libre">Free Software</a> and come with NO
+      WARRANTY.
+  </address></div>
+
+</body></html>
diff --git a/server dummy - alice - Otter_files/script.js b/server dummy - alice - Otter_files/script.js
new file mode 100644 (file)
index 0000000..ce3a40a
--- /dev/null
@@ -0,0 +1,1163 @@
+"use strict";
+// -*- JavaScript -*-
+// autogenerated from templates/script.ts webassembly-types/webassembly.d.ts templates/otter_wasm.ns.d.ts
+// -*- JavaScript -*-
+
+// Copyright 2020-2021 Ian Jackson and contributors to Otter
+// SPDX-License-Identifier: AGPL-3.0-or-later
+// There is NO WARRANTY. -->
+
+// elemnts for a piece
+//
+// In svg toplevel
+//
+//   uelem
+//      #use{}
+//      <use id="use{}", href="#piece{}" x= y= >
+//         .piece   piece id (static)
+//      container to allow quick movement and hang stuff off
+//
+//   delem
+//      #defs{}
+//      <def id="defs{}">
+//
+// And in each delem
+//
+//   pelem
+//   #piece{}
+//         .dragraise   dragged more than this ?  raise to top!
+//      <g id="piece{}" >
+//      currently-displayed version of the piece
+//      to allow addition/removal of selected indication
+//      contains 1 or 3 subelements:
+//      one is straight from server and not modified
+//      one is possible <use href="#select{}" >
+//      one is possible <use href="#halo{}" >
+//
+//   #select{}
+//      generated by server, referenced by JS in pelem for selection
+//
+//   #def.{}.stuff
+//      generated by server, reserved for Piece trait impl
+
+let wasm;
+var pieces = Object.create(null);
+;
+// todo turn all var into let
+// todo any exceptions should have otter in them or something
+var globalinfo_elem;
+var layout;
+var held_surround_colour;
+var general_timeout = 10000;
+var messages = Object();
+var pieceops = Object();
+var update_error_handlers = Object();
+var piece_error_handlers = Object();
+var our_dnd_type = "text/puvnex-game-server-dummy";
+var api_queue = [];
+var api_posting = false;
+var us;
+var gen = 0;
+var cseq = 0;
+var ctoken;
+var uo_map = Object.create(null);
+var keyops_local = Object();
+var last_log_ts;
+var last_zoom_factor = 1.0;
+var firefox_bug_zoom_factor_compensation = 1.0;
+var gen_update_hook = function () { };
+var svg_ns;
+var space;
+var pieces_marker;
+var defs_marker;
+var log_elem;
+var logscroll_elem;
+var status_node;
+var uos_node;
+var zoom_val;
+var zoom_btn;
+var links_elem;
+var wresting;
+const pane_keys = {
+    "H": "help",
+    "U": "players",
+};
+const uo_kind_prec = {
+    'GlobalExtra': 50,
+    'Client': 70,
+    'Global': 100,
+    'Piece': 200,
+    'ClientExtra': 500,
+};
+var players;
+var movements = [];
+function xhr_post_then(url, data, good) {
+    var xhr = new XMLHttpRequest();
+    xhr.onreadystatechange = function () {
+        if (xhr.readyState != XMLHttpRequest.DONE) {
+            return;
+        }
+        if (xhr.status != 200) {
+            xhr_report_error(xhr);
+        }
+        else {
+            good(xhr);
+        }
+    };
+    xhr.timeout = general_timeout;
+    xhr.open('POST', url);
+    xhr.setRequestHeader('Content-Type', 'application/json');
+    xhr.send(data);
+}
+function xhr_report_error(xhr) {
+    json_report_error({
+        statusText: xhr.statusText,
+        responseText: xhr.responseText,
+    });
+}
+function json_report_error(error_for_json) {
+    let error_message = JSON.stringify(error_for_json);
+    string_report_error(error_message);
+}
+function string_report_error(error_message) {
+    let errornode = document.getElementById('error');
+    errornode.textContent += '\nError (reloading may help?):' + error_message;
+    console.error("ERROR reported via log", error_message);
+    // todo want to fix this for at least basic game reconfigs, auto-reload?
+}
+function api(meth, data) {
+    api_queue.push([meth, data]);
+    api_check();
+}
+function api_delay(meth, data) {
+    if (api_queue.length == 0)
+        window.setTimeout(api_check, 10);
+    api_queue.push([meth, data]);
+}
+function api_check() {
+    if (api_posting) {
+        return;
+    }
+    if (!api_queue.length) {
+        return;
+    }
+    do {
+        var [meth, data] = api_queue.shift();
+        if (meth != 'm')
+            break;
+        let piece = data.piece;
+        let p = pieces[piece];
+        if (p == null)
+            break;
+        p.queued_moves--;
+        if (p.queued_moves == 0)
+            break;
+    } while (1);
+    api_posting = true;
+    xhr_post_then('/_/api/' + meth, JSON.stringify(data), api_posted);
+}
+function api_posted() {
+    api_posting = false;
+    api_check();
+}
+function api_piece(f, meth, piece, p, op) {
+    clear_halo(piece, p);
+    cseq += 1;
+    p.cseq = cseq;
+    f(meth, {
+        ctoken: ctoken,
+        piece: piece,
+        gen: gen,
+        cseq: cseq,
+        op: op,
+    });
+}
+function svg_element(id) {
+    let elem = document.getElementById(id);
+    return elem;
+}
+function piece_element(base, piece) {
+    return svg_element(base + piece);
+}
+// ----- key handling -----
+function recompute_keybindings() {
+    uo_map = Object.create(null);
+    let all_targets = [];
+    for (let piece of Object.keys(pieces)) {
+        let p = pieces[piece];
+        if (p.held != us)
+            continue;
+        all_targets.push(piece);
+        for (var uo of p.uos) {
+            let currently = uo_map[uo.def_key];
+            if (currently === null)
+                continue;
+            if (currently !== undefined) {
+                if (currently.opname != uo.opname) {
+                    uo_map[uo.def_key] = null;
+                    continue;
+                }
+            }
+            else {
+                currently = Object.assign({ targets: [] }, uo);
+                uo_map[uo.def_key] = currently;
+            }
+            currently.desc = currently.desc < uo.desc ? currently.desc : uo.desc;
+            currently.targets.push(piece);
+        }
+    }
+    let add_uo = function (targets, uo) {
+        uo_map[uo.def_key] = Object.assign({ targets: targets }, uo);
+    };
+    if (all_targets.length) {
+        add_uo(all_targets, {
+            def_key: 'l',
+            kind: 'Client',
+            wrc: 'Predictable',
+            opname: "left",
+            desc: "rotate left",
+        });
+        add_uo(all_targets, {
+            def_key: 'r',
+            kind: 'Client',
+            wrc: 'Predictable',
+            opname: "right",
+            desc: "rotate right",
+        });
+        add_uo(all_targets, {
+            def_key: 'b',
+            kind: 'Client',
+            wrc: 'Predictable',
+            opname: "lower",
+            desc: "send to bottom (below other pieces)",
+        });
+    }
+    if (all_targets.length) {
+        let got = 0;
+        for (let t of all_targets) {
+            got |= 1 << Number(pieces[t].pinned);
+        }
+        if (got == 1) {
+            add_uo(all_targets, {
+                def_key: 'P',
+                kind: 'ClientExtra',
+                opname: 'pin',
+                desc: 'Pin to table',
+                wrc: 'Predictable',
+            });
+        }
+        else if (got == 2) {
+            add_uo(all_targets, {
+                def_key: 'P',
+                kind: 'ClientExtra',
+                opname: 'unpin',
+                desc: 'Unpin from table',
+                wrc: 'Predictable',
+            });
+        }
+    }
+    add_uo(null, {
+        def_key: 'W',
+        kind: 'ClientExtra',
+        opname: 'wrest',
+        desc: wresting ? 'Exit wresting mode' : 'Enter wresting mode',
+        wrc: 'Predictable',
+    });
+    var uo_keys = Object.keys(uo_map);
+    uo_keys.sort(function (ak, bk) {
+        let a = uo_map[ak];
+        let b = uo_map[bk];
+        return uo_kind_prec[a.kind] - uo_kind_prec[b.kind]
+            || ak.localeCompare(bk);
+    });
+    let mid_elem = null;
+    for (let celem = uos_node.firstElementChild; celem != null; celem = nextelem) {
+        var nextelem = celem.nextElementSibling;
+        let cid = celem.getAttribute("id");
+        if (cid == "uos-mid")
+            mid_elem = celem;
+        else if (celem.getAttribute("class") == 'uos-mid') { }
+        else
+            celem.remove();
+    }
+    for (var kk of uo_keys) {
+        let uo = uo_map[kk];
+        let prec = uo_kind_prec[uo.kind];
+        let ent = document.createElement('div');
+        ent.innerHTML = '<b>' + kk + '</b> ' + uo.desc;
+        if (prec < 400) {
+            ent.setAttribute('class', 'uokey-l');
+            uos_node.insertBefore(ent, mid_elem);
+        }
+        else {
+            ent.setAttribute('class', 'uokey-r');
+            uos_node.appendChild(ent);
+        }
+    }
+}
+function some_keydown(e) {
+    // https://developer.mozilla.org/en-US/docs/Web/API/Document/keydown_event
+    // says to do this, something to do with CJK composition.
+    // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
+    // says that keyCode is deprecated
+    // my tsc says this isComposing thing doesn't exist.  wat.
+    if (e.isComposing /* || e.keyCode === 229 */)
+        return;
+    if (e.ctrlKey || e.altKey || e.metaKey)
+        return;
+    let pane = pane_keys[e.key];
+    if (pane) {
+        return pane_switch(pane);
+    }
+    let uo = uo_map[e.key];
+    if (uo === undefined || uo === null)
+        return;
+    console.log('KEY UO', e, uo);
+    if (uo.kind == 'Client' || uo.kind == 'ClientExtra') {
+        let f = keyops_local[uo.opname];
+        f(uo);
+        return;
+    }
+    if (!(uo.kind == 'Global' || uo.kind == 'GlobalExtra' || uo.kind == 'Piece'))
+        throw 'bad kind ' + uo.kind;
+    for (var piece of uo.targets) {
+        let p = pieces[piece];
+        api_piece(api, 'k', piece, p, { opname: uo.opname, wrc: uo.wrc });
+        if (uo.wrc == 'UpdateSvg') {
+            p.cseq_updatesvg = p.cseq;
+            redisplay_ancillaries(piece, p);
+        }
+    }
+}
+function pane_switch(newpane) {
+    let new_e;
+    for (;;) {
+        new_e = document.getElementById('pane_' + newpane);
+        let style = new_e.getAttribute('style');
+        if (style || newpane == 'help')
+            break;
+        newpane = 'help';
+    }
+    for (let old_e = new_e.parentElement.firstElementChild; old_e; old_e = old_e.nextElementSibling) {
+        old_e.setAttribute('style', 'display: none;');
+    }
+    new_e.removeAttribute('style');
+}
+keyops_local['left'] = function (uo) { rotate_targets(uo, +1); };
+keyops_local['right'] = function (uo) { rotate_targets(uo, -1); };
+function rotate_targets(uo, dangle) {
+    for (let piece of uo.targets) {
+        let p = pieces[piece];
+        p.angle += dangle + 8;
+        p.angle %= 8;
+        let transform = wasm_bindgen.angle_transform(p.angle);
+        p.pelem.setAttributeNS(null, 'transform', transform);
+        api_piece(api, 'rotate', piece, p, p.angle);
+    }
+    recompute_keybindings();
+    return true;
+}
+keyops_local['lower'] = function (uo) { lower_targets(uo); };
+function lower_targets(uo) {
+    function target_treat_pinned(p) {
+        return wresting || p.pinned;
+        ;
+    }
+    let targets_todo = Object.create(null);
+    for (let piece of uo.targets) {
+        let p = pieces[piece];
+        let pinned = target_treat_pinned(p);
+        targets_todo[piece] = { p, piece, pinned, };
+    }
+    let problem = lower_pieces(targets_todo);
+    if (problem !== null) {
+        add_log_message('Cannot lower: ' + problem);
+        return false;
+    }
+    return true;
+}
+function lower_pieces(targets_todo) {
+    // This is a bit subtle.  We don't want to lower below pinned pieces
+    // (unless we are pinned too, or the user is wresting).  But maybe
+    // the pinned pieces aren't already at the bottom.  For now we will
+    // declare that all pinned pieces "should" be below all non-pinned
+    // ones.  Not as an invariant, but as a thing we will do here to try
+    // to make a sensible result.  We implement this as follows: if we
+    // find pinned pieces above non-pinned pieces, we move those pinned
+    // pieces to the bottom too, just below us, preserving their
+    // relative order.
+    //
+    // Disregarding pinned targets:
+    //
+    // Z     <some stuff not including any unpinned targets>
+    // Z
+    //       topmost unpinned target         *
+    // B (
+    // B     unpinned non-target
+    // B |   unpinned target                 *
+    // B |   pinned non-target, mis-stacked  *
+    // B )*
+    // B
+    //       bottommost unpinned non-target
+    //        if that is below topmost unpinned target
+    //            <- tomove_unpinned: insert targets from * here        Q ->
+    //            <- tomove_misstacked: insert non-targets from * here  Q->
+    // A
+    // A     pinned things (nomove_pinned)
+    //            <- tomove_pinned: insert all pinned targets here      P ->
+    //
+    // When wresting, treat all targets as pinned.
+    // bottom of the stack order first
+    let tomove_unpinned = [];
+    let tomove_misstacked = [];
+    let nomove_pinned = [];
+    let tomove_pinned = [];
+    let bottommost_unpinned = null;
+    let n_targets_todo_unpinned = 0;
+    for (const piece of Object.keys(targets_todo)) {
+        let p = targets_todo[piece];
+        if (!p.pinned)
+            n_targets_todo_unpinned++;
+    }
+    let walk = pieces_marker;
+    for (;;) { // starting at the bottom of the stack order
+        if (n_targets_todo_unpinned == 0
+            && bottommost_unpinned !== null) {
+            // no unpinned targets left, state Z, we can stop now
+            console.log('LOWER STATE Z FINISHED');
+            break;
+        }
+        if (Object.keys(targets_todo).length == 0 &&
+            bottommost_unpinned !== null) {
+            console.log('LOWER NO TARGETS BUT UNPINNED!', n_targets_todo_unpinned);
+            break;
+        }
+        let new_walk = walk.nextElementSibling;
+        if (new_walk == null) {
+            console.log('LOWER WALK NO SIBLING!');
+            break;
+        }
+        walk = new_walk;
+        let piece = walk.dataset.piece;
+        if (piece == null) {
+            console.log('LOWER WALK REACHED TOP');
+            break;
+        }
+        let todo = targets_todo[piece];
+        if (todo) {
+            console.log('LOWER WALK', piece, 'TODO', todo.pinned);
+            delete targets_todo[piece];
+            if (!todo.pinned)
+                n_targets_todo_unpinned--;
+            (todo.pinned ? tomove_pinned : tomove_unpinned).push(todo);
+            continue;
+        }
+        let p = pieces[piece];
+        if (bottommost_unpinned === null) { // state A
+            if (!p.pinned) {
+                console.log('LOWER WALK', piece, 'STATE A -> Z');
+                bottommost_unpinned = { p, piece };
+            }
+            else {
+                console.log('LOWER WALK', piece, 'STATE A');
+                nomove_pinned.push({ p, piece });
+            }
+            continue;
+        }
+        // state B
+        if (p.pinned) {
+            console.log('LOWER WALK', piece, 'STATE B MIS-STACKED');
+            tomove_misstacked.push({ p, piece });
+        }
+        else {
+            console.log('LOWER WALK', piece, 'STATE B');
+        }
+    }
+    let z_top = bottommost_unpinned ? bottommost_unpinned.p.z :
+        walk.dataset.piece != null ? pieces[walk.dataset.piece].z :
+            // rather a lack of things we are not adjusting!
+            wasm_bindgen.def_zcoord();
+    let plan = [];
+    let partQ = tomove_unpinned.concat(tomove_misstacked);
+    let partP = tomove_pinned;
+    if (nomove_pinned.length == 0) {
+        plan.push({
+            content: partQ.concat(partP),
+            z_top,
+            z_bot: null,
+        });
+    }
+    else {
+        plan.push({
+            content: partQ,
+            z_top,
+            z_bot: nomove_pinned[nomove_pinned.length - 1].p.z,
+        }, {
+            content: partP,
+            z_top: nomove_pinned[0].p.z,
+            z_bot: null,
+        });
+    }
+    console.log('LOWER PLAN', plan);
+    for (const pe of plan) {
+        for (const e of pe.content) {
+            if (e.p.held != null && e.p.held != us) {
+                return "lowering would disturb a piece held by another player";
+            }
+        }
+    }
+    z_top = null;
+    for (const pe of plan) {
+        if (pe.z_top != null)
+            z_top = pe.z_top;
+        let z_bot = pe.z_bot;
+        let zrange = wasm_bindgen.range(z_bot, z_top, pe.content.length);
+        console.log('LOQER PLAN PE', pe, z_bot, z_top, pe.content.length, zrange.debug());
+        for (const e of pe.content) {
+            let p = e.p;
+            piece_set_zlevel(e.piece, p, (oldtop_piece) => {
+                let z = zrange.next();
+                p.z = z;
+                api_piece(api, "setz", e.piece, e.p, { z });
+            });
+        }
+    }
+    return null;
+}
+keyops_local['wrest'] = function (uo) {
+    wresting = !wresting;
+    document.getElementById('wresting-warning').innerHTML = !wresting ? "" :
+        " <strong>(wresting mode!)</strong>";
+    ungrab_all();
+    recompute_keybindings();
+};
+keyops_local['pin'] = function (uo) {
+    if (!lower_targets(uo))
+        return;
+    pin_unpin(uo, true);
+};
+keyops_local['unpin'] = function (uo) {
+    pin_unpin(uo, false);
+};
+function pin_unpin(uo, newpin) {
+    for (let piece of uo.targets) {
+        let p = pieces[piece];
+        p.pinned = newpin;
+        api_piece(api, 'pin', piece, p, newpin);
+        redisplay_ancillaries(piece, p);
+    }
+    recompute_keybindings();
+}
+var DRAGGING;
+(function (DRAGGING) {
+    DRAGGING[DRAGGING["NO"] = 0] = "NO";
+    DRAGGING[DRAGGING["MAYBE_GRAB"] = 1] = "MAYBE_GRAB";
+    DRAGGING[DRAGGING["MAYBE_UNGRAB"] = 2] = "MAYBE_UNGRAB";
+    DRAGGING[DRAGGING["YES"] = 4] = "YES";
+    DRAGGING[DRAGGING["RAISED"] = 8] = "RAISED";
+})(DRAGGING || (DRAGGING = {}));
+;
+var drag_pieces = [];
+var dragging = DRAGGING.NO;
+var dcx;
+var dcy;
+const DRAGTHRESH = 5;
+function drag_add_piece(piece, p) {
+    drag_pieces.push({
+        piece: piece,
+        dox: parseFloat(p.uelem.getAttributeNS(null, "x")),
+        doy: parseFloat(p.uelem.getAttributeNS(null, "y")),
+    });
+}
+function some_mousedown(e) {
+    console.log('mousedown', e, e.clientX, e.clientY, e.target);
+    if (e.button != 0) {
+        return;
+    }
+    if (e.altKey) {
+        return;
+    }
+    if (e.metaKey) {
+        return;
+    }
+    if (e.ctrlKey) {
+        return;
+    }
+    else {
+        drag_mousedown(e, e.shiftKey);
+    }
+}
+function drag_mousedown(e, shifted) {
+    var target = e.target; // we check this just now!
+    var piece = target.dataset.piece;
+    if (!piece) {
+        if (!shifted) {
+            ungrab_all();
+        }
+        return;
+    }
+    let p = pieces[piece];
+    let held = p.held;
+    drag_cancel();
+    drag_pieces = [];
+    if (held == us) {
+        dragging = DRAGGING.MAYBE_UNGRAB;
+        drag_add_piece(piece, p); // contrive to have this one first
+        for (let tpiece of Object.keys(pieces)) {
+            if (tpiece == piece)
+                continue;
+            let tp = pieces[tpiece];
+            if (tp.held != us)
+                continue;
+            drag_add_piece(tpiece, tp);
+        }
+    }
+    else if (held == null || wresting) {
+        // xxx prevent clicking on anything that is occulting, unless wresting
+        if (!shifted) {
+            ungrab_all();
+        }
+        if (p.pinned && !wresting) {
+            add_log_message('That piece is pinned to the table.');
+            return;
+        }
+        dragging = DRAGGING.MAYBE_GRAB;
+        drag_add_piece(piece, p);
+        set_grab(piece, p, us);
+        api_piece(api, wresting ? 'wrest' : 'grab', piece, p, {});
+    }
+    else {
+        add_log_message('That piece is held by another player.');
+        return;
+    }
+    dcx = e.clientX;
+    dcy = e.clientY;
+    window.addEventListener('mousemove', drag_mousemove, true);
+    window.addEventListener('mouseup', drag_mouseup, true);
+}
+function ungrab_all() {
+    for (let tpiece of Object.keys(pieces)) {
+        let tp = pieces[tpiece];
+        if (tp.held == us) {
+            set_ungrab(tpiece, tp);
+            api_piece(api, 'ungrab', tpiece, tp, {});
+        }
+    }
+}
+function set_grab(piece, p, owner) {
+    p.held = owner;
+    redisplay_ancillaries(piece, p);
+    recompute_keybindings();
+}
+function set_ungrab(piece, p) {
+    p.held = null;
+    redisplay_ancillaries(piece, p);
+    recompute_keybindings();
+}
+function clear_halo(piece, p) {
+    p.last_seen_moved = null;
+    redisplay_ancillaries(piece, p);
+}
+function ancillary_node(piece, stroke) {
+    var nelem = document.createElementNS(svg_ns, 'use');
+    nelem.setAttributeNS(null, 'href', '#surround' + piece);
+    nelem.setAttributeNS(null, 'stroke', stroke);
+    nelem.setAttributeNS(null, 'fill', 'none');
+    return nelem;
+}
+function redisplay_ancillaries(piece, p) {
+    let href = '#surround' + piece;
+    console.log('REDISPLAY ANCILLARIES', href);
+    for (let celem = p.pelem.firstElementChild; celem != null; celem = nextelem) {
+        var nextelem = celem.nextElementSibling;
+        let thref = celem.getAttributeNS(null, "href");
+        if (thref == href) {
+            celem.remove();
+        }
+    }
+    let halo_colour = null;
+    if (p.cseq_updatesvg != null) {
+        halo_colour = 'purple';
+    }
+    else if (p.last_seen_moved != null) {
+        halo_colour = 'yellow';
+    }
+    else if (p.held != null && p.pinned) {
+        halo_colour = '#8cf';
+    }
+    if (halo_colour != null) {
+        let nelem = ancillary_node(piece, halo_colour);
+        if (p.held != null) {
+            nelem.setAttributeNS(null, 'stroke-width', '2px');
+        }
+        p.pelem.prepend(nelem);
+    }
+    if (p.held != null) {
+        let da = players[p.held].dasharray;
+        let nelem = ancillary_node(piece, held_surround_colour);
+        nelem.setAttributeNS(null, 'stroke-dasharray', da);
+        p.pelem.appendChild(nelem);
+    }
+}
+function drag_mousemove(e) {
+    var ctm = space.getScreenCTM();
+    var ddx = (e.clientX - dcx) / (ctm.a * firefox_bug_zoom_factor_compensation);
+    var ddy = (e.clientY - dcy) / (ctm.d * firefox_bug_zoom_factor_compensation);
+    var ddr2 = ddx * ddx + ddy * ddy;
+    if (!(dragging & DRAGGING.YES)) {
+        if (ddr2 > DRAGTHRESH) {
+            dragging |= DRAGGING.YES;
+        }
+    }
+    //console.log('mousemove', ddx, ddy, dragging);
+    if (dragging & DRAGGING.YES) {
+        console.log('DRAG PIECES', drag_pieces);
+        for (let dp of drag_pieces) {
+            console.log('DRAG PIECES PIECE', dp);
+            let tpiece = dp.piece;
+            let tp = pieces[tpiece];
+            var x = Math.round(dp.dox + ddx);
+            var y = Math.round(dp.doy + ddy);
+            tp.uelem.setAttributeNS(null, "x", x + "");
+            tp.uelem.setAttributeNS(null, "y", y + "");
+            tp.queued_moves++;
+            api_piece(api_delay, 'm', tpiece, tp, [x, y]);
+        }
+        if (!(dragging & DRAGGING.RAISED) && drag_pieces.length == 1) {
+            let dp = drag_pieces[0];
+            let piece = dp.piece;
+            let p = pieces[piece];
+            let dragraise = +p.pelem.dataset.dragraise;
+            if (dragraise > 0 && ddr2 >= dragraise * dragraise) {
+                dragging |= DRAGGING.RAISED;
+                console.log('CHECK RAISE ', dragraise, dragraise * dragraise, ddr2);
+                piece_set_zlevel(piece, p, (oldtop_piece) => {
+                    let oldtop_p = pieces[oldtop_piece];
+                    let z = wasm_bindgen.increment(oldtop_p.z);
+                    p.z = z;
+                    api_piece(api, "setz", piece, p, { z: z });
+                });
+            }
+        }
+    }
+    return ddr2;
+}
+function drag_mouseup(e) {
+    console.log('mouseup', dragging);
+    let ddr2 = drag_mousemove(e);
+    drag_end();
+}
+function drag_end() {
+    if (dragging == DRAGGING.MAYBE_UNGRAB ||
+        (dragging & ~DRAGGING.RAISED) == (DRAGGING.MAYBE_GRAB | DRAGGING.YES)) {
+        let dp = drag_pieces[0];
+        let piece = dp.piece;
+        let p = pieces[piece];
+        set_ungrab(piece, p);
+        api_piece(api, 'ungrab', piece, p, {});
+    }
+    drag_cancel();
+}
+function drag_cancel() {
+    window.removeEventListener('mousemove', drag_mousemove, true);
+    window.removeEventListener('mouseup', drag_mouseup, true);
+    dragging = DRAGGING.NO;
+    drag_pieces = [];
+}
+messages.AddPlayer = function (j) {
+    players[j.player] = j.data;
+    player_info_pane_set(j);
+};
+messages.RemovePlayer = function (j) {
+    delete players[j.player];
+    player_info_pane_set(j);
+};
+function player_info_pane_set(j) {
+    document.getElementById('player_list')
+        .innerHTML = j.new_info_pane;
+}
+messages.SetLinks = function (msg) {
+    if (msg.length != 0 && layout == 'Portrait') {
+        msg += " |";
+    }
+    links_elem.innerHTML = msg;
+};
+// ----- logs -----
+messages.Log = function (j) {
+    add_timestamped_log_message(j.when, j.logent.html);
+};
+function add_log_message(msg_html) {
+    add_timestamped_log_message('', msg_html);
+}
+function add_timestamped_log_message(ts_html, msg_html) {
+    var lastent = log_elem.lastElementChild;
+    var in_scrollback = lastent == null ||
+        // inspired by
+        //   https://stackoverflow.com/questions/487073/how-to-check-if-element-is-visible-after-scrolling/21627295#21627295
+        // rejected
+        //   https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API
+        (() => {
+            let le_top = lastent.getBoundingClientRect().top;
+            let le_bot = lastent.getBoundingClientRect().bottom;
+            let ld_bot = logscroll_elem.getBoundingClientRect().bottom;
+            console.log("ADD_LOG_MESSAGE bboxes: le t b, bb", le_top, le_bot, ld_bot);
+            return 0.5 * (le_bot + le_top) > ld_bot;
+        })();
+    console.log('ADD LOG MESSAGE ', in_scrollback, layout, msg_html);
+    var ne;
+    function add_thing(elemname, cl, html) {
+        var ie = document.createElement(elemname);
+        ie.innerHTML = html;
+        ie.setAttribute("class", cl);
+        ne.appendChild(ie);
+    }
+    if (layout == 'Portrait') {
+        ne = document.createElement('tr');
+        add_thing('td', 'logmsg', msg_html);
+        add_thing('td', 'logts', ts_html);
+    }
+    else if (layout == 'Landscape') {
+        ts_html = last_log_ts.update(ts_html);
+        ne = document.createElement('div');
+        add_thing('span', 'logts', ts_html);
+        ne.appendChild(document.createElement('br'));
+        add_thing('span', 'logmsg', msg_html);
+        ne.appendChild(document.createElement('br'));
+    }
+    else {
+        throw 'bad layout ' + layout;
+    }
+    log_elem.appendChild(ne);
+    if (!in_scrollback) {
+        logscroll_elem.scrollTop = logscroll_elem.scrollHeight;
+    }
+}
+// ----- zoom -----
+function zoom_pct() {
+    let str = zoom_val.value;
+    let val = parseFloat(str);
+    if (isNaN(val)) {
+        return undefined;
+    }
+    else {
+        return val;
+    }
+}
+function zoom_enable() {
+    zoom_btn.disabled = (zoom_pct() === undefined);
+}
+function zoom_activate() {
+    let pct = zoom_pct();
+    if (pct !== undefined) {
+        let fact = pct * 0.01;
+        let last_ctm_a = space.getScreenCTM().a;
+        document.getElementsByTagName('body')[0]
+            .style.transform = 'scale(' + fact + ',' + fact + ')';
+        if (fact != last_zoom_factor) {
+            if (last_ctm_a == space.getScreenCTM().a) {
+                console.log('FIREFOX GETSCREENCTM BUG');
+                firefox_bug_zoom_factor_compensation = fact;
+            }
+            else {
+                console.log('No firefox getscreenctm bug');
+                firefox_bug_zoom_factor_compensation = 1.0;
+            }
+            last_zoom_factor = fact;
+        }
+    }
+    zoom_btn.disabled = true;
+}
+function handle_piece_update(j) {
+    console.log('PIECE UPDATE ', j);
+    var piece = j.piece;
+    var m = j.op;
+    var k = Object.keys(m)[0];
+    let p = pieces[piece];
+    pieceops[k](piece, p, m[k]);
+}
+;
+messages.Piece = handle_piece_update;
+pieceops.ModifyQuiet = function (piece, p, info) {
+    console.log('PIECE UPDATE MODIFY QUIET ', piece, info);
+    piece_modify(piece, p, info, false);
+};
+pieceops.Modify = function (piece, p, info) {
+    console.log('PIECE UPDATE MODIFY LOuD ', piece, info);
+    piece_note_moved(piece, p);
+    piece_modify(piece, p, info, false);
+};
+piece_error_handlers.PosOffTable = function () { return true; };
+piece_error_handlers.Conflict = function () { return true; };
+function piece_modify(piece, p, info, conflict_expected) {
+    p.delem.innerHTML = info.svg;
+    p.pelem = piece_element('piece', piece);
+    p.uelem.setAttributeNS(null, "x", info.pos[0] + "");
+    p.uelem.setAttributeNS(null, "y", info.pos[1] + "");
+    p.held = info.held;
+    p.pinned = info.pinned;
+    p.angle = info.angle;
+    p.uos = info.uos;
+    piece_set_zlevel(piece, p, (oldtop_piece) => {
+        p.z = info.z;
+        p.zg = info.zg;
+    });
+    piece_checkconflict_nrda(piece, p, conflict_expected);
+    redisplay_ancillaries(piece, p);
+    recompute_keybindings();
+    console.log('MODIFY DONE');
+}
+/*
+pieceops.Insert = <PieceHandler>function
+(piece: PieceId, p: null,
+ info: { svg: string, held: PlayerId, pos: Pos, z: number, zg: Generation}) {
+  console.log('PIECE UPDATE INSERT ',piece,info)
+  delem = document.createElementNS(svg_ns,'defs');
+  delem.setAttributeNS(null,'id','defs'+piece);
+  delem.innerHTML = info.svg;
+  space.appendChild(delem);
+  pelem =
+
+  nelem.setAttributeNS(null,'stroke',stroke);
+  nelem.setAttributeNS(null,'fill','none');
+*/
+function piece_set_zlevel(piece, p, modify) {
+    // Calls modify, which should set .z and/or .gz, and/or
+    // make any necessary API call.
+    //
+    // Then moves uelem to the right place in the DOM.  This is done
+    // by assuming that uelem ought to go at the end, so this is
+    // O(new depth), which is right (since the UI for inserting
+    // an object is itself O(new depth) UI operations to prepare.
+    let oldtop_elem = defs_marker.previousElementSibling;
+    let oldtop_piece = oldtop_elem.dataset.piece;
+    modify(oldtop_piece);
+    let ins_before = defs_marker;
+    let earlier_elem;
+    for (;; ins_before = earlier_elem) {
+        earlier_elem = ins_before.previousElementSibling;
+        if (earlier_elem == pieces_marker)
+            break;
+        if (earlier_elem == p.uelem)
+            continue;
+        let earlier_p = pieces[earlier_elem.dataset.piece];
+        if (!piece_z_before(p, earlier_p))
+            break;
+    }
+    if (ins_before != p.uelem)
+        space.insertBefore(p.uelem, ins_before);
+}
+function piece_note_moved(piece, p) {
+    let now = performance.now();
+    let need_redisplay = p.last_seen_moved == null;
+    p.last_seen_moved = now;
+    if (need_redisplay)
+        redisplay_ancillaries(piece, p);
+    let cutoff = now - 1000.;
+    while (movements.length > 0 && movements[0].this_motion < cutoff) {
+        let mr = movements.shift();
+        if (mr.p.last_seen_moved != null &&
+            mr.p.last_seen_moved < cutoff) {
+            mr.p.last_seen_moved = null;
+            redisplay_ancillaries(mr.piece, mr.p);
+        }
+    }
+    movements.push({ piece: piece, p: p, this_motion: now });
+}
+function piece_z_before(a, b) {
+    if (a.z < b.z)
+        return true;
+    if (a.z > b.z)
+        return false;
+    if (a.zg < b.zg)
+        return true;
+    if (a.zg > b.zg)
+        return false;
+    return false;
+}
+pieceops.Move = function (piece, p, info) {
+    piece_checkconflict_nrda(piece, p, false);
+    piece_note_moved(piece, p);
+    p.uelem.setAttributeNS(null, "x", info[0] + "");
+    p.uelem.setAttributeNS(null, "y", info[1] + "");
+};
+pieceops.SetZLevel = function (piece, p, info) {
+    piece_note_moved(piece, p);
+    piece_set_zlevel(piece, p, (oldtop_piece) => {
+        let oldtop_p = pieces[oldtop_piece];
+        p.z = info.z;
+        p.zg = info.zg;
+    });
+};
+messages.Recorded = function (j) {
+    let piece = j.piece;
+    let p = pieces[piece];
+    piece_recorded_cseq(p, j);
+    if (p.cseq_updatesvg != null && j.cseq >= p.cseq_updatesvg) {
+        p.cseq_updatesvg = null;
+        redisplay_ancillaries(piece, p);
+    }
+    if (j.svg != null) {
+        p.delem.innerHTML = j.svg;
+        p.pelem = piece_element('piece', piece);
+        redisplay_ancillaries(piece, p);
+    }
+    if (j.zg != null) {
+        var zg_new = j.zg; // type narrowing doesn't propagate :-/
+        piece_set_zlevel(piece, p, (oldtop_piece) => {
+            p.zg = zg_new;
+        });
+    }
+};
+function piece_recorded_cseq(p, j) {
+    if (p.cseq != null && j.cseq >= p.cseq) {
+        p.cseq = null;
+    }
+}
+messages.RecordedUnpredictable = function (j) {
+    let piece = j.piece;
+    let p = pieces[piece];
+    piece_recorded_cseq(p, j);
+    piece_modify(piece, p, j.ns, false);
+};
+messages.Error = function (m) {
+    console.log('ERROR UPDATE ', m);
+    var k = Object.keys(m)[0];
+    update_error_handlers[k](m[k]);
+};
+update_error_handlers.PieceOpError = function (m) {
+    let piece = m.state.piece;
+    let p = pieces[piece];
+    console.log('ERROR UPDATE PIECE ', m, p);
+    if (p == null)
+        return;
+    let conflict_expected = piece_error_handlers[m.error](piece, p, m);
+    handle_piece_update(m.state);
+};
+function piece_checkconflict_nrda(piece, p, conflict_expected) {
+    if (p.cseq != null) {
+        p.cseq = null;
+        if (drag_pieces.some(function (dp) { return dp.piece == piece; })) {
+            console.log('drag end due to conflict');
+            drag_end();
+        }
+        if (!conflict_expected) {
+            add_log_message('Conflict! - simultaneous update');
+        }
+    }
+    return false;
+}
+function test_swap_stack() {
+    let old_bot = pieces_marker.nextElementSibling;
+    let container = old_bot.parentElement;
+    container.insertBefore(old_bot, defs_marker);
+    window.setTimeout(test_swap_stack, 1000);
+}
+function startup() {
+    console.log('STARTUP');
+    console.log(wasm_bindgen.setup("OK"));
+    var body = document.getElementById("main-body");
+    zoom_btn = document.getElementById("zoom-btn");
+    zoom_val = document.getElementById("zoom-val");
+    links_elem = document.getElementById("links");
+    ctoken = body.dataset.ctoken;
+    us = body.dataset.us;
+    gen = +body.dataset.gen;
+    let sse_url_prefix = body.dataset.sseUrlPrefix;
+    status_node = document.getElementById('status');
+    status_node.innerHTML = 'js-done';
+    log_elem = document.getElementById("log");
+    logscroll_elem = document.getElementById("logscroll") || log_elem;
+    let dataload = JSON.parse(body.dataset.load);
+    held_surround_colour = dataload.held_surround_colour;
+    players = dataload.players;
+    delete body.dataset.load;
+    uos_node = document.getElementById("uos");
+    space = svg_element('space');
+    pieces_marker = svg_element("pieces_marker");
+    defs_marker = svg_element("defs_marker");
+    svg_ns = space.getAttribute('xmlns');
+    for (let uelem = pieces_marker.nextElementSibling; uelem != defs_marker; uelem = uelem.nextElementSibling) {
+        let piece = uelem.dataset.piece;
+        let p = JSON.parse(uelem.dataset.info);
+        p.uelem = uelem;
+        p.delem = piece_element('defs', piece);
+        p.pelem = piece_element('piece', piece);
+        p.queued_moves = 0;
+        delete uelem.dataset.info;
+        pieces[piece] = p;
+        redisplay_ancillaries(piece, p);
+    }
+    last_log_ts = wasm_bindgen.timestamp_abbreviator(dataload.last_log_ts);
+    var es = new EventSource(sse_url_prefix + "/_/updates?ctoken=" + ctoken + '&gen=' + gen);
+    es.onmessage = function (event) {
+        console.log('GOTEVE', event.data);
+        var k;
+        var m;
+        try {
+            var [tgen, ms] = JSON.parse(event.data);
+            for (m of ms) {
+                k = Object.keys(m)[0];
+                messages[k](m[k]);
+            }
+            gen = tgen;
+            gen_update_hook();
+        }
+        catch (exc) {
+            var s = exc.toString();
+            string_report_error('exception handling update '
+                + k + ': ' + JSON.stringify(m) + ': ' + s);
+        }
+    };
+    es.addEventListener('commsworking', function (event) {
+        console.log('GOTDATA', event.data);
+        status_node.innerHTML = event.data;
+    });
+    es.addEventListener('player-gone', function (event) {
+        console.log('PLAYER-GONE', event);
+        status_node.innerHTML = event.data;
+        add_log_message('<strong>You are no longer in the game</strong>');
+        space.removeEventListener('mousedown', some_mousedown);
+        document.removeEventListener('keydown', some_keydown);
+        es.close();
+    });
+    es.addEventListener('updates-expired', function (event) {
+        console.log('UPDATES-EXPIRED', event);
+        string_report_error('connection to server interrupted too long');
+    });
+    es.onerror = function (e) {
+        console.log('FOO', e, es);
+        json_report_error({
+            updates_error: e,
+            updates_event_source: es,
+            updates_event_source_ready: es.readyState,
+            update_oe: e.className,
+        });
+    };
+    recompute_keybindings();
+    space.addEventListener('mousedown', some_mousedown);
+    document.addEventListener('keydown', some_keydown);
+}
+var wasm_promise;
+;
+function doload() {
+    console.log('DOLOAD');
+    globalinfo_elem = document.getElementById('global-info');
+    layout = globalinfo_elem.dataset.layout;
+    var elem = document.getElementById('loading_token');
+    var ptoken = elem.dataset.ptoken;
+    xhr_post_then('/_/session/' + layout, JSON.stringify({ ptoken: ptoken }), loaded);
+    wasm_promise = wasm_input
+        .then(wasm_bindgen);
+}
+function loaded(xhr) {
+    console.log('LOADED');
+    var body = document.getElementById('loading_body');
+    wasm_promise.then((got_wasm) => {
+        wasm = got_wasm;
+        body.outerHTML = xhr.response;
+        startup();
+    });
+}
+// todo scroll of log messages to bottom did not always work somehow
+//    think I have fixed this with approximation
+doload();
diff --git a/server dummy - alice - Otter_files/wasm.js b/server dummy - alice - Otter_files/wasm.js
new file mode 100644 (file)
index 0000000..9a9f9a7
--- /dev/null
@@ -0,0 +1,370 @@
+let wasm_bindgen;
+(function() {
+    const __exports = {};
+    let wasm;
+
+    let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
+
+    cachedTextDecoder.decode();
+
+    let cachegetUint8Memory0 = null;
+    function getUint8Memory0() {
+        if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) {
+            cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer);
+        }
+        return cachegetUint8Memory0;
+    }
+
+    function getStringFromWasm0(ptr, len) {
+        return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));
+    }
+
+    const heap = new Array(32).fill(undefined);
+
+    heap.push(undefined, null, true, false);
+
+    let heap_next = heap.length;
+
+    function addHeapObject(obj) {
+        if (heap_next === heap.length) heap.push(heap.length + 1);
+        const idx = heap_next;
+        heap_next = heap[idx];
+
+        heap[idx] = obj;
+        return idx;
+    }
+
+function getObject(idx) { return heap[idx]; }
+
+function dropObject(idx) {
+    if (idx < 36) return;
+    heap[idx] = heap_next;
+    heap_next = idx;
+}
+
+function takeObject(idx) {
+    const ret = getObject(idx);
+    dropObject(idx);
+    return ret;
+}
+
+let WASM_VECTOR_LEN = 0;
+
+let cachedTextEncoder = new TextEncoder('utf-8');
+
+const encodeString = (typeof cachedTextEncoder.encodeInto === 'function'
+    ? function (arg, view) {
+    return cachedTextEncoder.encodeInto(arg, view);
+}
+    : function (arg, view) {
+    const buf = cachedTextEncoder.encode(arg);
+    view.set(buf);
+    return {
+        read: arg.length,
+        written: buf.length
+    };
+});
+
+function passStringToWasm0(arg, malloc, realloc) {
+
+    if (realloc === undefined) {
+        const buf = cachedTextEncoder.encode(arg);
+        const ptr = malloc(buf.length);
+        getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf);
+        WASM_VECTOR_LEN = buf.length;
+        return ptr;
+    }
+
+    let len = arg.length;
+    let ptr = malloc(len);
+
+    const mem = getUint8Memory0();
+
+    let offset = 0;
+
+    for (; offset < len; offset++) {
+        const code = arg.charCodeAt(offset);
+        if (code > 0x7F) break;
+        mem[ptr + offset] = code;
+    }
+
+    if (offset !== len) {
+        if (offset !== 0) {
+            arg = arg.slice(offset);
+        }
+        ptr = realloc(ptr, len, len = offset + arg.length * 3);
+        const view = getUint8Memory0().subarray(ptr + offset, ptr + len);
+        const ret = encodeString(arg, view);
+
+        offset += ret.written;
+    }
+
+    WASM_VECTOR_LEN = offset;
+    return ptr;
+}
+
+function isLikeNone(x) {
+    return x === undefined || x === null;
+}
+
+let cachegetInt32Memory0 = null;
+function getInt32Memory0() {
+    if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== wasm.memory.buffer) {
+        cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer);
+    }
+    return cachegetInt32Memory0;
+}
+
+let stack_pointer = 32;
+
+function addBorrowedObject(obj) {
+    if (stack_pointer == 1) throw new Error('out of js stack');
+    heap[--stack_pointer] = obj;
+    return stack_pointer;
+}
+/**
+* @param {any} packed
+*/
+__exports.check = function(packed) {
+    try {
+        wasm.check(addBorrowedObject(packed));
+    } finally {
+        heap[stack_pointer++] = undefined;
+    }
+};
+
+/**
+* @param {any} packed
+* @returns {any}
+*/
+__exports.increment = function(packed) {
+    try {
+        var ret = wasm.increment(addBorrowedObject(packed));
+        return takeObject(ret);
+    } finally {
+        heap[stack_pointer++] = undefined;
+    }
+};
+
+/**
+* @returns {any}
+*/
+__exports.def_zcoord = function() {
+    var ret = wasm.def_zcoord();
+    return takeObject(ret);
+};
+
+/**
+* @param {any} a
+* @param {any} b
+* @param {number} count
+* @returns {ZCoordIterator}
+*/
+__exports.range = function(a, b, count) {
+    try {
+        var ret = wasm.range(addBorrowedObject(a), addBorrowedObject(b), count);
+        return ZCoordIterator.__wrap(ret);
+    } finally {
+        heap[stack_pointer++] = undefined;
+        heap[stack_pointer++] = undefined;
+    }
+};
+
+/**
+* @param {string} j
+* @returns {TimestampAbbreviator}
+*/
+__exports.timestamp_abbreviator = function(j) {
+    var ret = wasm.timestamp_abbreviator(addHeapObject(j));
+    return TimestampAbbreviator.__wrap(ret);
+};
+
+/**
+* @param {number} angle
+* @returns {string}
+*/
+__exports.angle_transform = function(angle) {
+    var ret = wasm.angle_transform(angle);
+    return takeObject(ret);
+};
+
+/**
+* @param {string} s
+* @returns {string}
+*/
+__exports.setup = function(s) {
+    var ptr0 = passStringToWasm0(s, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+    var len0 = WASM_VECTOR_LEN;
+    var ret = wasm.setup(ptr0, len0);
+    return takeObject(ret);
+};
+
+/**
+*/
+class TimestampAbbreviator {
+
+    static __wrap(ptr) {
+        const obj = Object.create(TimestampAbbreviator.prototype);
+        obj.ptr = ptr;
+
+        return obj;
+    }
+
+    free() {
+        const ptr = this.ptr;
+        this.ptr = 0;
+
+        wasm.__wbg_timestampabbreviator_free(ptr);
+    }
+    /**
+    * @param {string} now
+    * @returns {string}
+    */
+    update(now) {
+        try {
+            var ret = wasm.timestampabbreviator_update(this.ptr, addBorrowedObject(now));
+            return takeObject(ret);
+        } finally {
+            heap[stack_pointer++] = undefined;
+        }
+    }
+}
+__exports.TimestampAbbreviator = TimestampAbbreviator;
+/**
+*/
+class ZCoordIterator {
+
+    static __wrap(ptr) {
+        const obj = Object.create(ZCoordIterator.prototype);
+        obj.ptr = ptr;
+
+        return obj;
+    }
+
+    free() {
+        const ptr = this.ptr;
+        this.ptr = 0;
+
+        wasm.__wbg_zcoorditerator_free(ptr);
+    }
+    /**
+    * @returns {any}
+    */
+    next() {
+        var ret = wasm.zcoorditerator_next(this.ptr);
+        return takeObject(ret);
+    }
+    /**
+    * @returns {any}
+    */
+    debug() {
+        var ret = wasm.zcoorditerator_debug(this.ptr);
+        return takeObject(ret);
+    }
+}
+__exports.ZCoordIterator = ZCoordIterator;
+
+async function load(module, imports) {
+    if (typeof Response === 'function' && module instanceof Response) {
+
+        if (typeof WebAssembly.instantiateStreaming === 'function') {
+            try {
+                return await WebAssembly.instantiateStreaming(module, imports);
+
+            } catch (e) {
+                if (module.headers.get('Content-Type') != 'application/wasm') {
+                    console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
+
+                } else {
+                    throw e;
+                }
+            }
+        }
+
+        const bytes = await module.arrayBuffer();
+        return await WebAssembly.instantiate(bytes, imports);
+
+    } else {
+
+        const instance = await WebAssembly.instantiate(module, imports);
+
+        if (instance instanceof WebAssembly.Instance) {
+            return { instance, module };
+
+        } else {
+            return instance;
+        }
+    }
+}
+
+async function init(input) {
+    if (typeof input === 'undefined') {
+        let src;
+        if (typeof document === 'undefined') {
+            src = location.href;
+        } else {
+            src = document.currentScript.src;
+        }
+        input = src.replace(/\.js$/, '_bg.wasm');
+    }
+    const imports = {};
+    imports.wbg = {};
+    imports.wbg.__wbindgen_string_new = function(arg0, arg1) {
+        var ret = getStringFromWasm0(arg0, arg1);
+        return addHeapObject(ret);
+    };
+    imports.wbg.__wbindgen_is_null = function(arg0) {
+        var ret = getObject(arg0) === null;
+        return ret;
+    };
+    imports.wbg.__wbg_new_59cb74e423758ede = function() {
+        var ret = new Error();
+        return addHeapObject(ret);
+    };
+    imports.wbg.__wbg_stack_558ba5917b466edd = function(arg0, arg1) {
+        var ret = getObject(arg1).stack;
+        var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+        var len0 = WASM_VECTOR_LEN;
+        getInt32Memory0()[arg0 / 4 + 1] = len0;
+        getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+    };
+    imports.wbg.__wbg_error_4bb6c2a97407129a = function(arg0, arg1) {
+        try {
+            console.error(getStringFromWasm0(arg0, arg1));
+        } finally {
+            wasm.__wbindgen_free(arg0, arg1);
+        }
+    };
+    imports.wbg.__wbindgen_object_drop_ref = function(arg0) {
+        takeObject(arg0);
+    };
+    imports.wbg.__wbindgen_string_get = function(arg0, arg1) {
+        const obj = getObject(arg1);
+        var ret = typeof(obj) === 'string' ? obj : undefined;
+        var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
+        var len0 = WASM_VECTOR_LEN;
+        getInt32Memory0()[arg0 / 4 + 1] = len0;
+        getInt32Memory0()[arg0 / 4 + 0] = ptr0;
+    };
+    imports.wbg.__wbindgen_throw = function(arg0, arg1) {
+        throw new Error(getStringFromWasm0(arg0, arg1));
+    };
+    imports.wbg.__wbindgen_rethrow = function(arg0) {
+        throw takeObject(arg0);
+    };
+
+    if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) {
+        input = fetch(input);
+    }
+
+    const { instance, module } = await load(await input, imports);
+
+    wasm = instance.exports;
+    init.__wbindgen_wasm_module = module;
+
+    return wasm;
+}
+
+wasm_bindgen = Object.assign(init, __exports);
+
+})();