<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>MartinH.Net</title>
    <link>https://martinh.net/</link>
    <description>Recent content on MartinH.Net</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <managingEditor>m@martinh.net (Martin Hamilton)</managingEditor>
    <webMaster>m@martinh.net (Martin Hamilton)</webMaster>
    <copyright>Copyright: Public domain (CC0) unless otherwise stated. I dare you to train your AI on my work!&amp;nbsp;&amp;nbsp;&lt;a href=&#39;https://martinh.net/privacy&#39;&gt;Privacy policy&lt;/a&gt;</copyright>
    <lastBuildDate>Thu, 07 May 2026 16:55:34 +0000</lastBuildDate><atom:link href="https://martinh.net/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Scrappy Phanpy Fiddles</title>
      <link>https://martinh.net/hacks/scrappy-fiddles/</link>
      <pubDate>Thu, 07 May 2026 16:55:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/scrappy-fiddles/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/cccamp2023-cyber-fairydust.jpg&#34;,&#34;\/img\/cccamp2023-mirror-thing1.jpg&#34;,&#34;\/img\/mch22-threadlasers-dome.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  Scratching an itch, for fun and no profit
&lt;/div&gt;

&lt;p&gt;I&amp;rsquo;ve been using the &lt;a href=&#34;https://phanpy.social/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Phanpy&lt;/a&gt; fedi client written by
&lt;a href=&#34;https://cheeaun.com&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Chee Aun&lt;/a&gt; for a while now and am very fond of it. It&amp;rsquo;s a
progressive web app written in JavaScript, so you can use on lots of platorms and
it&amp;rsquo;s pretty much identical - but adapts dynamically for smaller and larger
screens. I run my own self-hosted copy because I&amp;rsquo;m that kind of person. This is
what it looks like in &amp;ldquo;TweetDeck&amp;rdquo; mode, where you see multiple columns rather
than just your main timeline:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w80&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;2834&#34;
          height=&#34;1573&#34;
          src=&#34;https://martinh.net/hacks/scrappy-fiddles/featured-phanpy_hu_b9517ce6c268e10d.png&#34;
          srcset=&#34;https://martinh.net/hacks/scrappy-fiddles/featured-phanpy_hu_b9517ce6c268e10d.png 800w,/hacks/scrappy-fiddles/featured-phanpy_hu_7fc0d9668d558f6b.png 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/hacks/scrappy-fiddles/featured-phanpy.png&#34;
        /&gt;
  
  &lt;figcaption&gt;Screenshot of a Phanpy session showing my main timeline on the left, some hashtags I&amp;rsquo;m interested in on the right, and Notifications in the centre.&lt;/figcaption&gt;
  &lt;/figure&gt;

&lt;h2 class=&#34;relative group&#34;&gt;The Itch
    &lt;div id=&#34;the-itch&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#the-itch&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;Now I&amp;rsquo;m a keyboard-centric computer user, and if possible I like to be able to
use keyboard shortcuts to get around. Phanpy has some very handy key bindings
for common things like shifting focus from column to column, boosting, liking
and so on.&lt;/p&gt;
&lt;p&gt;One particularly useful shortcut is &lt;code&gt;.&lt;/code&gt;, which loads new posts in the column
which currently has focus. But annoyingly &lt;code&gt;.&lt;/code&gt; &lt;del&gt;doesn&amp;rsquo;t&lt;/del&gt; didn&amp;rsquo;t work for
notirfications, so you &lt;del&gt;have&lt;/del&gt; had to poke around with your mouse, TrackPoint
etc and click on the Notifications label at the top of the column.&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;Scratch, scratch
    &lt;div id=&#34;scratch-scratch&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#scratch-scratch&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;For Mayke I thought I might take a look and see what I could do about that. The
&lt;a href=&#34;https://github.com/cheeaun/phanpy&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Phanpy sources&lt;/a&gt; are nice discrete files
grouped together by function, so it&amp;rsquo;s not difficult to zero in on the chunk of
code that&amp;rsquo;s run when you hit the &lt;code&gt;.&lt;/code&gt; key.&lt;/p&gt;
&lt;p&gt;I wombled around for a bit in the codebase and took a look at the project&amp;rsquo;s
&lt;a href=&#34;https://github.com/cheeaun/phanpy/issues&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;issues&lt;/a&gt; and &lt;a href=&#34;https://github.com/cheeaun/phanpy/pulls&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;pull
requests&lt;/a&gt; in case someone else had
beaten me to it. There were a couple of people noting that Notifications
behaved differently to the other columns, and some comments from Phanpy team
members about how this was a side-effect of slicing and dicing different types
of data to present a unified view.&lt;/p&gt;
&lt;p&gt;At first I was discouraged by this, but then I remembered that when you click
on the Notifications heading - &lt;em&gt;it runs some code&lt;/em&gt;. Then I went back to the
codebase to look in &lt;code&gt;src/pages/notifications.jsx&lt;/code&gt; to see what actually happens,
and it turns to be fairly simple:&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;loadNotifications&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;scrollableRef&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;scrollTo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;top&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;behavior&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;smooth&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Well now - &lt;strong&gt;that wasn&amp;rsquo;t too hard, was it?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t even really know JavaScript but I can kind of see what&amp;rsquo;s going on here.
There is a little more code required to handle the key binding, but that can be
gleaned from the existing &lt;code&gt;.&lt;/code&gt; handler code in &lt;code&gt;src/components/timeline.jsx&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;handleLoadNewPosts&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;useCallback&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;showNewPostsIndicator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;loadItems&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;scrollableRef&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;scrollTo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;top&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;behavior&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;smooth&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;loadItems&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;showNewPostsIndicator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;dotRef&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;useHotkeys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;handleLoadNewPosts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;useKey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;ignoreEventWhen&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;// Allow &amp;#39;.&amp;#39; even with Shift (some keyboard layouts require Shift for &amp;#39;.&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;metaKey&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ctrlKey&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;altKey&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;shiftKey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Munging those two code fragments together, we have this nice little
self-contained patch which only changes a very small part of one file:&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;diff&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;notifications&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;jsx&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;notifications&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;jsx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;54&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;df1c45&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;..&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6034&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;d588&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100644&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;---&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;notifications&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;jsx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+++&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;notifications&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;jsx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;@@&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;646&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;646&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;25&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@@&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Notifications&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;columnMode&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;dotRef&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;useHotkeys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;      &lt;span class=&#34;nx&#34;&gt;loadNotifications&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;      &lt;span class=&#34;nx&#34;&gt;scrollableRef&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;scrollTo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;        &lt;span class=&#34;nx&#34;&gt;top&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;        &lt;span class=&#34;nx&#34;&gt;behavior&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;smooth&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;      &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;      &lt;span class=&#34;nx&#34;&gt;useKey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;      &lt;span class=&#34;nx&#34;&gt;ignoreEventWhen&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;        &lt;span class=&#34;c1&#34;&gt;// Allow &amp;#39;.&amp;#39; even with Shift (some keyboard layouts require Shift for &amp;#39;.&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;metaKey&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ctrlKey&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;altKey&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;shiftKey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;      &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;today&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;todaySubHeading&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;useMemo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;niceDateTime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;today&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;@@&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;664&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;683&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@@&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Notifications&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;columnMode&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;nx&#34;&gt;jRef&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;nx&#34;&gt;kRef&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;nx&#34;&gt;oRef&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;        &lt;span class=&#34;nx&#34;&gt;dotRef&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;nx&#34;&gt;tabIndex&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;-1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;And that&amp;rsquo;s it - the itch is scratched, and we can do a &lt;strong&gt;nerd happy dance!&lt;/strong&gt;&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;Grooming the digital commons
    &lt;div id=&#34;grooming-the-digital-commons&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#grooming-the-digital-commons&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;But actually, that&amp;rsquo;s not it, because I don&amp;rsquo;t really want to have to patch
Phanpy every time there&amp;rsquo;s a new version. And I already know that there are
other people who were interested in making the &lt;code&gt;.&lt;/code&gt; key binding work
consistently across the app.&lt;/p&gt;
&lt;p&gt;So here&amp;rsquo;s what I did&amp;hellip;&lt;/p&gt;
&lt;p&gt;I forked the Phanpy source code repo and sent the maintainers a pull request
with the diff, and lo and behold my modest tweak is now part of the Phanpy
codebase. &lt;em&gt;Actually my original patch was slightly different, and I modified it
based on their feedback, but let&amp;rsquo;s keep the story simple&amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the Phanpy source code commit which adds my change. Let&amp;rsquo;s hope it
doesn&amp;rsquo;t break anything - at least it is quite self-contained!&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w80&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;1285&#34;
          height=&#34;1507&#34;
          src=&#34;https://martinh.net/hacks/scrappy-fiddles/phanpy-fix_hu_688ee00526a2d2bb.png&#34;
          srcset=&#34;https://martinh.net/hacks/scrappy-fiddles/phanpy-fix_hu_688ee00526a2d2bb.png 800w,/hacks/scrappy-fiddles/phanpy-fix_hu_d3b263f4284d1490.png 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/hacks/scrappy-fiddles/phanpy-fix.png&#34;
        /&gt;
  
  &lt;figcaption&gt;Screenshot of the commit which added my code snippit to the core Phanpy codebase, from a well known LLM training site.&lt;/figcaption&gt;
  &lt;/figure&gt;

&lt;h2 class=&#34;relative group&#34;&gt;No kings
    &lt;div id=&#34;no-kings&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#no-kings&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve contributed various little bits and bobs to projects in the past, but not
really reflected on how different things like this are to the conventional view
of software development in the sense of big and complicated projects. This kind
of software development is more like a community garden or allotment, where
anyone can chip in and help out, and everyone benefits.&lt;/p&gt;
&lt;p&gt;Of course things aren&amp;rsquo;t always harmonious, and there are some famously divisive
figures in the free and open source software movement. But perhaps more
importantly, many of us have been socialised to think that everything must have
a Leader, Boss, Director, Organiser and so on. If this is what you&amp;rsquo;ve grown up
with, and see all around you, the idea of a &lt;strong&gt;mutual aid&lt;/strong&gt; approach like the
community garden or randomly contributing little chunks of unsolicited code
that you found useful can seem quite bizarre.&lt;/p&gt;
&lt;p&gt;You might think &lt;em&gt;perhaps we&amp;rsquo;ve been doing software development all wrong&amp;hellip;&lt;/em&gt;,
but I wonder whether the bigger message is that &lt;strong&gt;perhaps we&amp;rsquo;ve been doing
society all wrong.&lt;/strong&gt;&lt;/p&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/scrappy-fiddles/featured-phanpy.png" />
    </item>
    
    <item>
      <title>What&#39;s the time? It&#39;s CYBERtime!</title>
      <link>https://martinh.net/hacks/cyber-time/</link>
      <pubDate>Fri, 01 May 2026 13:05:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/cyber-time/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/38c3-ceiling-petals.jpg&#34;,&#34;\/img\/38c3-cyber-briefcase.jpg&#34;,&#34;\/img\/38c3-internet.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  Making your Bangle.js watch somewhat more CYBER
&lt;/div&gt;


&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w50&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;3072&#34;
          height=&#34;2325&#34;
          src=&#34;https://martinh.net/hacks/cyber-time/featured-cybertime-actionshot_hu_bfc64125290feb1a.jpg&#34;
          srcset=&#34;https://martinh.net/hacks/cyber-time/featured-cybertime-actionshot_hu_bfc64125290feb1a.jpg 800w,/hacks/cyber-time/featured-cybertime-actionshot_hu_e085d76307a83813.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/hacks/cyber-time/featured-cybertime-actionshot.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Bangle.js 2 watch showing the CYBERtime clock face&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;The &lt;a href=&#34;https://banglejs.com&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Bangle.js watches&lt;/a&gt; are part of a family of
hackable open source devices running the &lt;a href=&#34;https://www.espruino.com&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Espruino JavaScript
interpreter&lt;/a&gt; for microcontrollers developed by
Gordon Williams. Yes, your watch really is running JavaScript, like your
web browser does. &lt;em&gt;Unless you have it turned off&amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve had a Bangle.js 2 watch for a while now, and dabbled a little with
coding. For &lt;a href=&#34;https://martinh.net/tags/mayke/&#34; &gt;Mayke&lt;/a&gt; I thought it might be fun to learn how
watch faces work (Bangle.js lore calls them Clocks) as a jumping off point
to more interesting things.&lt;/p&gt;
&lt;p&gt;Specifically, and for arcane nerdy reasons, I wanted a watch face that
used &lt;a href=&#34;https://en.wikipedia.org/wiki/OCR-A&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;the public domain OCR-A font&lt;/a&gt;.
OCR-A is much beloved in the &lt;a href=&#34;https://cyber.equipment/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;hacker community&lt;/a&gt;.
Hence: &lt;strong&gt;It&amp;rsquo;s CYBERtime!&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
      &lt;img class=&#34;my-0 rounded-md grid-w30&#34; src=&#34;https://martinh.net/hacks/cyber-time/CYBERtime/app.png&#34; alt=&#34;&#34; /&gt;
  
  &lt;figcaption&gt;Silly icon which says CYBER time in yellow on a green background&lt;/figcaption&gt;
  &lt;/figure&gt;

&lt;h2 class=&#34;relative group&#34;&gt;Great artists copy and paste
    &lt;div id=&#34;great-artists-copy-and-paste&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#great-artists-copy-and-paste&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;Luckily there is a lot of training data to work with, with (at the time of
writing) 673 apps in the &lt;a href=&#34;https://banglejs.com/apps/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Bangle.js App
Loader&lt;/a&gt; library, mostly available under the
&lt;a href=&#34;https://mit-license.org/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;MIT License&lt;/a&gt;. There&amp;rsquo;s also a &lt;a href=&#34;https://www.espruino.com/Bangle.js&amp;#43;Clock&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;nice clock face
tutorial&lt;/a&gt; from the Bangle.js
folk.&lt;/p&gt;
&lt;p&gt;I decided to work backwards from the &lt;a href=&#34;https://banglejs.com/apps/?q=pastel&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Pastel
clock&lt;/a&gt; by &lt;a href=&#34;https://github.com/hughbarney&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Hugh
Barney&lt;/a&gt;, slowly chiselling away code until
I had a very simple clock which displays the time in &lt;code&gt;HH:MM&lt;/code&gt; format, shows
the day of the week (e.g. &lt;code&gt;Fri&lt;/code&gt;) and the day of the month. You can see
this below in the file called &lt;code&gt;app.js&lt;/code&gt;.&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;Learnings
    &lt;div id=&#34;learnings&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#learnings&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;My clock&amp;rsquo;s only claim to fame is that it uses the OCR-A font, which to be
fair could easily have been added to Pastel, which already supports
multiple fonts. But I wanted to understand what would be needed to create
the &lt;strong&gt;Minimum Viable Clock&lt;/strong&gt;. Along the way I learned a few useful things,
including how to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Convert images to JavaScript&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The Bangle.js team have provided a handy web based &lt;a href=&#34;https://www.espruino.com/Image&amp;#43;Converter&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Image
Converter&lt;/a&gt; which lets you easily
tweak a bunch of parameters like compression and transparency. You can also use
command line tools like &lt;a href=&#34;http://www.imagemagick.org/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;ImageMagick&lt;/a&gt; and then
convert the output into Base64 encoding, e.g.&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;convert foo.png -resize 16x16\! -depth 8 rgb:bar.raw; base64 --wrap=0 bar.raw&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;You have to be quite frugal about memory use - think KB rather than MB.&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Convert fonts to JavaScript&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The Bangle.js team have also provided a nifty &lt;a href=&#34;https://www.espruino.com/Bangle.js&amp;#43;Clock&amp;#43;Font&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Font
Converter&lt;/a&gt; tool, although watch
out that the output of this needs a little &lt;em&gt;transmogrification&lt;/em&gt; before you can
load it as a font. Your font file should look something like this:&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;var font =  atob(&amp;#34;...&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;var widths = atob(&amp;#34;...=&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;exports.add = function(graphics) {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  graphics.prototype.setFontXXX = function() { 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    var scale = 1;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    this.setFontCustom(font, SSS, widths, PPP+(scale&amp;lt;&amp;lt;8)+(1&amp;lt;&amp;lt;16));
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&amp;hellip;where &lt;code&gt;font&lt;/code&gt; is set to the long Base64 string produced by the Font Converter,
&lt;code&gt;widths&lt;/code&gt; is set to the short Base64 string, PPP is the point size (e.g. 60 or
64 in this case) and SSS is the starting character - e.g. 32 if you have
encoded the whole ASCII character set. Fonts can be scaled internally within
Espruino by tweaking the value of &lt;code&gt;scale&lt;/code&gt;, but they tend to look best if
specifically encoded to the desired point size. Your code will call
&lt;code&gt;setFontXXX&lt;/code&gt; (or whatever you named your font) to activate it, e.g.
&lt;code&gt;setFontCYBER60&lt;/code&gt;.&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Self-host the Bangle.js App Loader&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I used a local copy of the &lt;a href=&#34;https://github.com/espruino/BangleApps&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;App
Loader&lt;/a&gt;. You can self-host the App
Loader by checking the codebase out along with its submodules, e.g.&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone --recurse-submodules https://github.com/espruino/BangleApps&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;However you will need to put the files somewhere that you can reach them with a
valid SSL certificate, e.g. Let&amp;rsquo;s Encrypt or perhaps a self-signed certificate
that your browser trusts. This is because Web Bluetooth is only enabled over an
SSL/TLS connection. At the time of writing &lt;a href=&#34;https://caniuse.com/web-bluetooth&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;browser support for Web
Bluetooth&lt;/a&gt; is probably best summed up as
&amp;ldquo;use Chrome or Chromium&amp;rdquo;, but that may change.&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;Add an app to the Bangle.js App Loader&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The Bangle.js apps all live under the &lt;code&gt;apps&lt;/code&gt; directory, so you can work
directly from say &lt;code&gt;apps/CYBERtime&lt;/code&gt; then upload your clock to your watch in the
same way that you would upload any other app via your browser. There&amp;rsquo;s a handy
&lt;a href=&#34;https://www.espruino.com/Bangle.js&amp;#43;App&amp;#43;Loader&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;App Loader HOWTO from the Bangle.js
people&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, you will need to rebuild &lt;code&gt;apps.json&lt;/code&gt; in the top level the App Loader
directory and refresh the page in your browser before it will see the new
package. To rebuild &lt;code&gt;apps.json&lt;/code&gt;, run:&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bin/create_apps_json.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;from your top level BangleApps directory, and look out for any error messages.
The &lt;code&gt;apps.json&lt;/code&gt; file is built by parsing and combining each individual
Bangle.js app&amp;rsquo;s &lt;code&gt;metadata.json&lt;/code&gt; file, found in the app&amp;rsquo;s directory. If you have
any problems, check for typos in your &lt;code&gt;metadata.json&lt;/code&gt; file.&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;Add Bonus Chaos!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I also learned that if you don&amp;rsquo;t quite get your font definition right you
can get some very&amp;hellip; interesting results!&lt;/p&gt;

&lt;figure&gt;
      &lt;img class=&#34;my-0 rounded-md grid-w100&#34; src=&#34;https://martinh.net/hacks/cyber-time/scrambled.jpg&#34; alt=&#34;&#34; /&gt;
  
  &lt;figcaption&gt;Bangle.js with a scrambled watch face. There are some recognisable characters, like colon and backslash, but something has gone terribly wrong.&lt;/figcaption&gt;
  &lt;/figure&gt;

&lt;h2 class=&#34;relative group&#34;&gt;Show Me The Code
    &lt;div id=&#34;show-me-the-code&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#show-me-the-code&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;You can &lt;a href=&#34;https://martinh.net/hacks/cyber-time/CYBERtime.tgz&#34; &gt;grab my clock app as a tarball -
&lt;code&gt;CYBERtime.tgz&lt;/code&gt;&lt;/a&gt;, but here are the
individual bits. I&amp;rsquo;ll probably submit it to the &lt;a href=&#34;https://banglejs.com/apps/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Bangle.js App
Loader&lt;/a&gt; eventually, once it has evolved a bit
more. There could be &lt;em&gt;duck facts&lt;/em&gt;, for instance.&lt;/p&gt;
&lt;p&gt;The tarball should unpack as a directory called &lt;code&gt;CYBERtime&lt;/code&gt; which contains
the following files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;app.js&lt;/code&gt; - this is the actual watch face code.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;app-icon.js&lt;/code&gt; - the icon displayed in the Bangle.js launcher, App Loader etc.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;f_cyber60.js&lt;/code&gt; - OCR-A font at 60 point size.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;f_cyber64.js&lt;/code&gt; - OCR-A font at 64 point size.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;metadata.json&lt;/code&gt; - metadata used by the Bangle.js App Loader.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;README.md&lt;/code&gt; - README file which will be displayed in the Bangle.js App Loader Library.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;ve included the JavaScript files below so you can see how little code is
actually required to create the watch face.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;app.js&lt;/code&gt; - this is the actual watch face code.&lt;/p&gt;





  &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;f_cyber60&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Graphics&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;f_cyber64&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Graphics&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;locale&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;locale&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;needed&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;day&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;week&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;w&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getWidth&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;h&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getHeight&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;drawTimeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;actual&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;watch&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;drawClock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;d&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;da&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;toString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hh&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;da&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;substr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mm&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;da&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;substr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reset&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setColor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;theme&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fillRect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Bangle&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;appRect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;grid&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;like&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;graph&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;paper&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HWVERSION&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setColor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;#0f0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gx&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;drawLine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;h&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;24&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gy&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;h&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;24&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gy&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;drawLine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hour&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;minute&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setColor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;theme&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setFontCYBER64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setFontAlign&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;drawString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hh&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;60&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;day&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;week&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;date&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setColor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;#ebe834&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setFontCYBER60&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setFontAlign&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;day&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;week&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dow&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;locale&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dow&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;toLowerCase&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;substring&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;make&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;first&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;character&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;day&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;uppercase&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mon&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;becomes&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Mon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ucdow&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dow&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;charAt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;toUpperCase&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dow&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;slice&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;day&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;month&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;toISOString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;substring&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;drawString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ucdow&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;50&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;queueDraw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;schedule&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;next&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;minute&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;queueDraw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;drawTimeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;clearTimeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;drawTimeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;drawTimeout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;setTimeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;drawTimeout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;undefined&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;60000&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Date&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;now&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;60000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;drawClock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;queueDraw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Show&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;launcher&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;when&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;middle&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pressed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Bangle&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setUI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;clock&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Stop&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;updates&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;when&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;LCD&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;off&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;restart&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;when&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;on&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Bangle&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;lcdPower&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;immediately&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;queue&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;redraw&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stop&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;timer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;drawTimeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;clearTimeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;drawTimeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;drawTimeout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;undefined&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;clear&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Bangle&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loadWidgets&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Bangle&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;drawWidgets&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;app-icon.js&lt;/code&gt; - the icon displayed in the Bangle.js launcher, App Loader etc.&lt;/p&gt;





  &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;heatshrink&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;decompress&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;atob&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mEwwcBCqMJkmSpICMyEIER8QCPFBkEQOQMSpICEpAjFggCEkAjJ7cg2UDkG27MA23bgIFCCIWCCIoOCCIcECIWG4EA2ULkGwhch2EAkOQjYRCgkWoMkm0bgGwpYRBpIRGmwUCrIRBEYUIkI1EgkyHAXYJQNbgOyoIRCLIYRCwXINYnBkOWKYI1EgECCIIjBkOyoEhyQIBLIcJCIZHDpBZBCItACI59CrBHDw3BGoh9DgOQrKhDWYRZEWYaPEEwNbkGApARBNwmQhIRDgT7GAQcCoBZCA4NJkADBgGSpACBpIjCLIYXBB4IOBABAjDAAMCYoIRLwVBCIkBFIwRDZYQLChBTBCgQRF5IjBCIMSFIOCQYIREYoKhBiw1BTwIFB7KACCI0SCIdgmyqCI4ynBrDXB5Ng2UDCI/BKYIRFpYRIAoIREJQQRZsgRBgA1DdgYREMoJuCCIU2EY8QRIQRCpIXDCIq/BFgNIF4eAa48AoD4GiT7HABwR/CNkJkmSpICMyAiPAAI&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;f_cyber60.js&lt;/code&gt; - OCR-A font at 60 point size.&lt;/p&gt;





  &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;font&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;atob&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//AAD8AAAP///gD+AAAP///wH+AAAP///wH+AAAP///wH+AAAP///wD+AAAP//+AD+AAADgAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAP/gAAAAAAAP//AAAAAAAP//gAAAAAAP//wAAAAAAP//wAAAAAAP//wAAAAAAP//gAAAAAAP/4AAAAAAAP8AAAAAAAAPgAAAAAAAAPgAAAAAAAAPgAAAAAAAAPgAAAAAAAAPgAAAAAAAAP4AAAAAAAAP/wAAAAAAAP//AAAAAAAP//gAAAAAAP//wAAAAAAP//wAAAAAAP//gAAAAAAP//AAAAAAAP/wAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4DgAAAAAAB4HwAAAAAAD8HwAAAAAAD8HwAAAAAAD8HwAAAAAH////8AAAAP////+AAAAP////+AAAAP////+AAAAH////8AAAAAD8HwAAAAAAD8HwAAAAAAD8HwAAAAAAD8HwAAAAAAD8HwAAAAAH////8AAAAP////+AAAAP////+AAAAP////+AAAAH////8AAAAAD8HwAAAAAAD8HwAAAAAAD8HwAAAAAAB4HwAAAAAAB4DgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/+DwAAAAAB//H4AAAAAD//H4AAAAAD//H4AAAAAD//H4AAAAAD8fH4AAAAAD8fH4AAAAAD8fH4AAAAAD8fH4AAAAAD8fH4AAAAH/8fH/8AAAP/8fH/+AAAP/8fH/+AAAP/8fH/+AAAH/8fH/8AAAAD8fH4AAAAAD8fH4AAAAAD8fH4AAAAAD8fH4AAAAAD8fH4AAAAAD8f/4AAAAAD8f/4AAAAAD8f/4AAAAAB4f/wAAAAAB4P/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH+AAAHAAAAP+AAAfgAAAP/AAA/gAAAP/AAB/gAAAP/AAH/AAAAP/AAP+AAAAP/AAf8AAAAP/AA/4AAAAP/AD/gAAAAH+AH/AAAAAAAAP+AAAAAAAAf4AAAAAAAB/wAAAAAAAD/gAAAAAAAH/AAAAAAAAf8AP8AAAAA/4AP+AAAAB/wAf+AAAAD/gAf+AAAAP+AAf+AAAAf8AAf+AAAA/4AAf+AAAA/wAAf+AAAA/AAAP+AAAAeAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/gD/gAAAAH/wH/4AAAAP/8P/4AAAAf/+f/8AAAAf//f/+AAAA/h//h+AAAA/A//B+AAAA/Af+A+AAAA/AP8A+AAAA/AP+A+AAAA/AP/A+AAAA/Af/g+AAAA/A//x+AAAA/B/f7+AAAAfz+P/8AAAAf/8H/4AAAAP/8D/4AAAAP/4B/wAAAAH/wA/4AAAAB/gB/8AAAAAAAD/+AAAAAAAH/+AAAAAAAH5+AAAAAAAD4+AAAAAAADgcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//+AAAAAAP///AAAAAAP///AAAAAAP///AAAAAAP//+AAAAAAP//4AAAAAAP//AAAAAAAP/wAAAAAAAP+AAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//AAAAAAB///wAAAAAH///8AAAAAP///+AAAAAf////AAAAA/4AD/gAAAD/gAA/4AAAH/AAAf8AAAP+AAAP+AAAP8AAAD+AAAPwAAAB+AAAPgAAAA+AAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAYAAAPgAAAA+AAAPwAAAB+AAAP8AAAD+AAAP+AAAP+AAAH/AAAf8AAAD/gAA/4AAAA/4AD/gAAAAf////AAAAAP///+AAAAAD///4AAAAAB///wAAAAAAf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4ADwAAAAAB8AH4AAAAAD+AP4AAAAAB+APwAAAAAB/AfwAAAAAA/g/gAAAAAAfx/AAAAAAAP7+AAAAAAAP/+AAAAAAAH/8AAAAAAf////AAAAA/////gAAAA/////gAAAA/////gAAAAf////AAAAAAH/8AAAAAAAP/+AAAAAAAP7+AAAAAAAfx/AAAAAAA/g/gAAAAAB/AfwAAAAAB+AP4AAAAAD+AH4AAAAAB8AHwAAAAAB4ADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAD///4AAAAAH///8AAAAAH///8AAAAAH///8AAAAAD///4AAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAB8AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB//8AAAAAAB//+AAAAAAB//+AAAAAAB//+AAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAfwAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAP+AAAAAAAAf+AAAAAAAAf+AAAAAAAAf+AAAAAAAAf+AAAAAAAAf+AAAAAAAAf+AAAAAAAAf+AAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAB+AAAAAAAAH+AAAAAAAAP+AAAAAAAA/8AAAAAAAD/4AAAAAAAP/gAAAAAAAf+AAAAAAAB/8AAAAAAAH/wAAAAAAAP/AAAAAAAA/8AAAAAAAD/4AAAAAAAH/gAAAAAAAf+AAAAAAAB/8AAAAAAAH/wAAAAAAAP/AAAAAAAA/+AAAAAAAD/4AAAAAAAH/gAAAAAAAP+AAAAAAAAP8AAAAAAAAPwAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/////4AAAH/////8AAAP/////8AAAP/////+AAAP/////+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAP/////+AAAP/////+AAAP/////+AAAH/////8AAAD/////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAcAAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAA//+AAAAAAB//+AAAAAAB//+AAAAAAB//+AAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAH//+AAAPgAP//+AAAPgAf//+AAAPgAf//+AAAPgAf//+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAP///AA+AAAP///AA+AAAP///AA+AAAH//+AA+AAAB//4AAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAcAAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAOAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgA/gA+AAAPgB/wA+AAAP/////+AAAP/////+AAAP/////+AAAH//7//8AAAB//w//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///+AAAAAP///+AAAAAP///+AAAAAP///+AAAAAH///+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAf////8AAAA/////+AAAA/////+AAAA/////+AAAAf////8AAAAAAB8AAAAAAAAA8AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAD4AAAAAAAAH4AAAAAAAAD8AAAAAAAAD8AAAP///AB+AAAP///AB+AAAP///AA+AAAP///AA+AAAP///AA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAf//+AAAPgAf//+AAAPgAf//+AAAPgAP//8AAAHAAD//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////8AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAPgAB+A+AAAPgAB+A+AAAHAAB+A+AAAAAAB+A+AAAAAAB+A+AAAAAAB+A+AAAAAAB+A+AAAAAAB+A+AAAAAAB+A+AAAAAAB+A+AAAAAAB+A+AAAAAAB+A+AAAAAAB+A+AAAAAAB+A+AAAAAAB+A+AAAAAAB//+AAAAAAB//+AAAAAAB//+AAAAAAB//+AAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAP4AAAAAAAAP4AAAAAAAAP4AAAAAAAAP4AAAAAAAAPgAAAAAAAAPgAAAAAAAAPgAAAAAAAAPgAAAAAAAAPgAAAAAAAAPgAA//8AAAPgAB//+AAAPgAD//+AAAPgAH//+AAAPgAH//8AAAPgAP4AAAAAPgAfwAAAAAPgA/gAAAAAPgB/AAAAAAPgD/AAAAAAP//+AAAAAAP//8AAAAAAP//4AAAAAAP//wAAAAAAP//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//wAAAAAAP//8AAAAAAf//+AAAAAAf//+AAAAAAf//+AAAH///AA+AAAP///AA+AAAP///AA+AAAP///AA+AAAP///AA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAP///AA+AAAP///AA+AAAP///AA+AAAP///AA+AAAH///AA+AAAAAAf//+AAAAAAf//+AAAAAAf//+AAAAAAP//8AAAAAAH//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//gAAAAAAP//wAAAAAAP//wAAAAAAP//wAAAAAAP//wAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAcAAAPgPwAA+AAAPgPwAA+AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAH/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH+AP8AAAAAP/Af+AAAAAP/Af+AAAAAP/Af+AAAAAP/Af+AAAAAP/Af+AAAAAP/Af+AAAAAP/Af+AAAAAH/AP+AAAAAH+AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf4A8AAAAAA/4B8AAAAAA/8B+AAAAAA/8B+AAAAAA/8B+AAAAAA/8B+AAAAAA/8B+AAAAAA/8B+AAAAAA/8B+AAAAAAf4B+AAAAAAAAB//8AAAAAAB//+AAAAAAB//+AAAAAAB//+AAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAA/gAAAAAAAB/wAAAAAAAB/wAAAAAAAD/4AAAAAAAD/4AAAAAAAH78AAAAAAAP7+AAAAAAAPx+AAAAAAAfx/AAAAAAAfg/AAAAAAA/AfgAAAAAB/AfwAAAAAB+APwAAAAAD+AP4AAAAAD8AH4AAAAAH4AD8AAAAAP4AD+AAAAAPwAB+AAAAAfwAB/AAAAAfgAA/AAAAA/AAAfgAAAA/AAAfgAAAA+AAAPgAAAAeAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOA4AAAAAAAeB8AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAA/B+AAAAAAAfB8AAAAAAAeA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAPAAAAA+AAAPgAAAA/AAAfgAAAA/gAA/gAAAAfgAA/AAAAAfwAB/AAAAAPwAB+AAAAAH4AD8AAAAAH4AD8AAAAAD8AH4AAAAAD+AP4AAAAAB+APwAAAAAB/AfwAAAAAA/AfgAAAAAAfg/AAAAAAAfx/AAAAAAAPx+AAAAAAAP7+AAAAAAAH/8AAAAAAAD/4AAAAAAAD/4AAAAAAAB/wAAAAAAAB/wAAAAAAAA/gAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAPwAAAAAAAAPwAAAAAAAAfwAAAAAAAA/gAAAAAAAB/A/wcAAAAD+B/4+AAAAH+D/4+AAAAH8H/w+AAAAP4P/wcAAAAfwf4AAAAAA/gfwAAAAAB/A/gAAAAAD+B/AAAAAAH8D+AAAAAAH8H8AAAAAAP4P8AAAAAAPwf4AAAAAAP4fwAAAAAAH//gAAAAAAD//AAAAAAAB/+AAAAAAAB/8AAAAAAAA/8AAAAAAAAf4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAH//gAAAB+AP//wAAAD/Af//4AAAH+A///8AAAH+B///+AAAP4B/AD+AAAPwB+AB+AAAPwB8AA+AAAPgB8AB+AAAPgB8AB+AAAPgB///+AAAPgB///8AAAPgB///4AAAPgB///8AAAPgA///+AAAPgAAAD+AAAPgAAAB+AAAPwAAAA+AAAPwAAAB+AAAP8AAAD+AAAH/////+AAAD/////8AAAB/////4AAAA/////wAAAAP////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAP+AAAAAAAB/+AAAAAAAf/+AAAAAAD//8AAAAAAf//wAAAAAH//+AAAAAA///4AAAAAH///4AAAAB///n4AAAAH//4H4AAAAP//AH4AAAAP/4AH4AAAAP//AH4AAAAH//4H4AAAAD///n4AAAAAP///4AAAAAB///4AAAAAAH//+AAAAAAA///wAAAAAAD//8AAAAAAAf/+AAAAAAAB/+AAAAAAAAP+AAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgA/AB+AAAPwA/gB+AAAP4B/wD+AAAH/P/+f8AAAD/////4AAAD/////4AAAB//7//wAAAA//g//AAAAAH+AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAD/4AAAAAAAP/+AAAAAAA///gAAAAAD///4AAAAAP///+AAAAA//Af/gAAAB/8AH/4AAAD/wAB/4AAAH/AAAf8AAAP+AAAH+AAAP4AAAB+AAAPwAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAHAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAcAAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPwAAAB+AAAP8AAAH+AAAH/AAAf8AAAH/wAB/8AAAD/8AH/4AAAA//Af/gAAAAP/7/+AAAAAD///4AAAAAA///gAAAAAAP/+AAAAAAAD/4AAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAfAA+AAAPgAOAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAHAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////8AAAP/////+AAAP/////+AAAP/////+AAAP/////8AAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgHwAAAAAAPgHgAAAAAAPgAAAAAAAAPgAAAAAAAAPgAAAAAAAAPgAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///gAAAAAP///wAAAAAf///4AAAAB////8AAAAD////+AAAAH/AAB+AAAAf+AAB+AAAA/4AAA+AAAB/wAAA+AAAD/gAAA+AAAH+AAAA+AAAP8AAAA+AAAP4AA4A+AAAPwAB8A+AAAPgAB8A+AAAPgAB+A+AAAPgAB+A+AAAPgAB+A+AAAPgAB+B+AAAPgAB+D+AAAPgAB//+AAAPgAB//8AAAPgAB//4AAAPgAB//wAAAHAAB//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////8AAAP/////+AAAP/////+AAAP/////+AAAH/////8AAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAH/////8AAAP/////+AAAP/////+AAAP/////+AAAH/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAcAAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAHAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAB//wAAAAAAB//4AAAAAAB//8AAAAAAA//+AAAAAAAAB+AAAAAAAAB+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAB+AAAAAAAAD+AAAH/////+AAAP/////8AAAP/////4AAAP/////wAAAH/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////8AAAP/////+AAAP/////+AAAP/////+AAAH/////8AAAAAH/8AAAAAAAH/8AAAAAAAP7+AAAAAAAfx/AAAAAAA/g/gAAAAAB/AfwAAAAAD+AP4AAAAAH+AH8AAAAAH8AH8AAAAAP4AD+AAAAAfwAB/AAAAA/gAA/gAAAB/AAAfwAAAD+AAAP4AAAH+AAAH8AAAH8AAAH8AAAP4AAAD+AAAPwAAAB+AAAPgAAAA+AAAHAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////+AAAP/////+AAAP/////+AAAP/////+AAAH/////+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////8AAAP/////+AAAP/////+AAAP/////+AAAP/////8AAAP8AAAAAAAAP/AAAAAAAAH/gAAAAAAAB/wAAAAAAAA/8AAAAAAAAP/gAAAAAAAH/wAAAAAAAD/wAAAAAAAH/wAAAAAAAf/gAAAAAAA/8AAAAAAAB/wAAAAAAAH/gAAAAAAAP+AAAAAAAAP8AAAAAAAAP/////8AAAP/////+AAAP/////+AAAP/////+AAAP/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////8AAAP/////+AAAP/////+AAAP/////+AAAP/////8AAAP/gAAAAAAAP/4AAAAAAAH/+AAAAAAAA//gAAAAAAAP/8AAAAAAAD//AAAAAAAAf/wAAAAAAAH/+AAAAAAAB//gAAAAAAAf/4AAAAAAAD/+AAAAAAAA//wAAAAAAAP/8AAAAAAAD/+AAAAAAAA/+AAAH/////+AAAP/////+AAAP/////+AAAP/////+AAAH/////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAH/8AAAAAAAf//AAAAAAB///wAAAAAH///8AAAAAf/x//AAAAB/+AP/wAAAD/4AD/4AAAH/gAA/8AAAP+AAAP+AAAP4AAAD+AAAPwAAAB+AAAPgAAAA+AAAPwAAAB+AAAP8AAAH+AAAH/AAAf+AAAH/wAB/8AAAD/8AH/4AAAA//Af/wAAAAP/7//AAAAAD///8AAAAAA///wAAAAAAP//AAAAAAAD/4AAAAAAAA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////8AAAP/////+AAAP/////+AAAP/////+AAAP/////8AAAPgAHwAAAAAPgAHwAAAAAPgAHwAAAAAPgAHwAAAAAPgAHwAAAAAPgAHwAAAAAPgAHwAAAAAPgAHwAAAAAPgAHwAAAAAPgAHwAAAAAPgAHwAAAAAPgAHwAAAAAPgAHwAAAAAPwAHwAAAAAP4APwAAAAAP///wAAAAAH///gAAAAAD///gAAAAAB//+AAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///gAAAAAH///4AAAAAP///8AAAAAf///+AAAAA////+AAAAB/4AB+AAAAD/AAA+AAAAD+AAB+AAAAH8AAD+AAAAP4AAH8AAAAfwAcH8AAAA/gA/P4AAAB/gB//wAAAD/AB//gAAAD+AA//wAAAH8AAf/+AAAP4AAH/+AAAPwAAH/+AAAPgAAP/+AAAPgAA/w+AAAP////g+AAAP////g+AAAH///+A+AAAD///8A+AAAB///4AcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////8AAAP/////+AAAP/////+AAAP/////+AAAP/////8AAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgPwAAAAAAPgP8AAAAAAPgP+AAAAAAPgP/gAAAAAPgP/4AAAAAPgP/+AAAAAPgP//AAAAAPgP3/wAAAAPgPx/8AAAAPgPwf/AAAAPwPwP/gAAAP4fwD/4AAAP//gA/8AAAH//gAf+AAAD//AAH+AAAB/+AAB+AAAA/4AAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAPgAAAD/AAAP4AAAH/gAAf8AAAP/wAAP+AAAP/8AAP+AAAP/+AAB+AAAPj/AAA+AAAPh/wAA+AAAPg/4AA+AAAPgf8AA+AAAPgH/AA+AAAPgD/gA+AAAPgB/wA+AAAPgA/4A+AAAPgAP+A+AAAPgAH/A+AAAPgAD/g+AAAPgAB/4+AAAPgAAf8+AAAPwAAP++AAAP+AAH/+AAAH+AAB/+AAAH/AAA/8AAAD+AAAf4AAAA+AAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAAAAAP+AAAAAAAAP+AAAAAAAAP+AAAAAAAAP+AAAAAAAAPgAAAAAAAAPgAAAAAAAAPgAAAAAAAAPgAAAAAAAAPgAAAAAAAAP/////8AAAP/////+AAAP/////+AAAP/////+AAAP/////8AAAPgAAAAAAAAPgAAAAAAAAPgAAAAAAAAPgAAAAAAAAPgAAAAAAAAP+AAAAAAAAP+AAAAAAAAP+AAAAAAAAP+AAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////gAAAP/////wAAAP/////4AAAP/////8AAAH/////+AAAAAAAAB+AAAAAAAAB+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAB+AAAAAAAAD+AAAH/////+AAAP/////8AAAP/////4AAAP/////wAAAH/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAAAAAAP//AAAAAAAP//4AAAAAAP//+AAAAAAH///wAAAAAAAf/8AAAAAAAH//gAAAAAAA//4AAAAAAAH//AAAAAAAB//4AAAAAAAP/8AAAAAAAD/+AAAAAAAAf+AAAAAAAB/+AAAAAAAP/8AAAAAAA//4AAAAAAH//AAAAAAA//8AAAAAAD//gAAAAAAf/8AAAAAH///wAAAAAP//+AAAAAAP//4AAAAAAP//AAAAAAAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////AAAAP/////wAAAP/////8AAAP/////+AAAH/////+AAAAAAAAD+AAAAAAAAA+AAAAAAAAA+AAAAAAAAB+AAAAAAAAD+AAAAAH///+AAAAAH///+AAAAAH///8AAAAAH///+AAAAAH///+AAAAAAAAD+AAAAAAAAA+AAAAAAAAA+AAAAAAAAB+AAAAAAAAD+AAAH/////+AAAP/////+AAAP/////4AAAP/////wAAAH/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAA8AAAPwAAAB+AAAP8AAAH+AAAP/AAAf+AAAH/gAA/8AAAD/4AD/4AAAA/+AP/gAAAAP/g/+AAAAAH/x/8AAAAAB///wAAAAAAf//AAAAAAAP/8AAAAAAAD/4AAAAAAAP/+AAAAAAAf//gAAAAAB///wAAAAAH/x/8AAAAAf/Af/AAAAA/+AP/gAAAD/4AD/4AAAH/gAA/8AAAP+AAAP+AAAP8AAAH+AAAPwAAAB+AAAHAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH+AAAAAAAAP/AAAAAAAAP/gAAAAAAAP/wAAAAAAAH/8AAAAAAAAP+AAAAAAAAH/AAAAAAAAB/gAAAAAAAA/4AAAAAAAAf8AAAAAAAAH///8AAAAAD///+AAAAAB///+AAAAAD///+AAAAAH///8AAAAAf8AAAAAAAA/4AAAAAAAB/wAAAAAAAH/AAAAAAAAP+AAAAAAAH/8AAAAAAAP/wAAAAAAAP/gAAAAAAAP/AAAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAA+AAAPgAAAB+AAAPgAAAH+AAAPgAAAf+AAAPgAAA/+AAAPgAAD/+AAAPgAAP/+AAAPgAA/++AAAPgAB/8+AAAPgAH/w+AAAPgAf/A+AAAPgA/8A+AAAPgD/4A+AAAPgP/gA+AAAPgf+AA+AAAPh/8AA+AAAPn/wAA+AAAP//AAA+AAAP/+AAA+AAAP/4AAA+AAAP/gAAA+AAAP+AAAA+AAAP8AAAA+AAAPwAAAA+AAAPAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////8AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAPgAAAA+AAAPgAAAA+AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAHAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAPwAAAAAAAAP8AAAAAAAAP/AAAAAAAAH/gAAAAAAAB/4AAAAAAAA/+AAAAAAAAP/gAAAAAAAD/wAAAAAAAB/8AAAAAAAAf/AAAAAAAAH/gAAAAAAAB/4AAAAAAAA/+AAAAAAAAP/AAAAAAAAD/wAAAAAAAB/8AAAAAAAAf/AAAAAAAAH/gAAAAAAAD/4AAAAAAAA/+AAAAAAAAP+AAAAAAAAD+AAAAAAAAB+AAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAcAAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAPgAAAA+AAAPgAAAA+AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAH/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAD+AAAAAAAAP+AAAAAAAA/8AAAAAAAD/8AAAAAAAP/wAAAAAAA//gAAAAAAD/+AAAAAAAP/8AAAAAAA//wAAAAAAB//gAAAAAAD/+AAAAAAAD/+AAAAAAAB//AAAAAAAA//wAAAAAAAf/4AAAAAAAH/+AAAAAAAB//AAAAAAAAf/wAAAAAAAH/4AAAAAAAB/8AAAAAAAAf+AAAAAAAAH+AAAAAAAAB8AAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAPgAAAAAAAAPwAAAAAAAAPwAAAAAAAAP4AAAAAAAAH4AAAAAAAAH8AAAAAAAAD8AAAAAAAAD8AAAAAAAAB+AAAAAAAAB+AAAAAAAAA/AAAAAAAAA+AAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/gAAAAAAAP/4AAAAAAAf/4AAAAAAA//8AAAAAAA//+AAAAAeB/B+AAAAAfB+B+AAAAA/B+A+AAAAA/B+A+AAAAA/B+A+AAAAA/B+A+AAAAA/B+A+AAAAA/B+A+AAAAA/B+A+AAAAA/B+A+AAAAA/B+B+AAAAA/B+D+AAAAAfB+D8AAAAAfh+H8AAAAAf///4AAAAAf///8AAAAAP///+AAAAAH///+AAAAAD///+AAAAAAP//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////8AAAP/////+AAAP/////+AAAP/////+AAAH/////8AAAAAH/A/wAAAAAH8AP4AAAAAP4AH8AAAAAfwAD8AAAAAfgAD+AAAAA/gAB+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAAfgAB+AAAAAfgAD+AAAAAP4AH8AAAAAP///8AAAAAH///4AAAAAD///wAAAAAB///gAAAAAA//+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAAAAAAf/+AAAAAAA///AAAAAAB///AAAAAAD///gAAAAAH/A/wAAAAAH8AP4AAAAAP4AH8AAAAAfwAD8AAAAAfgAD+AAAAA/gAB+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAAfAAA+AAAAAeAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/+AAAAAAB///gAAAAAD///wAAAAAH///4AAAAAP///4AAAAAP8AP8AAAAAfwAD+AAAAAfgAB+AAAAA/AAB+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAAfAAB+AAAAAfgAD+AAAAAfwAD+AAAAAP4AH8AAAAAH8AP4AAAAAH+AfwAAAH/////8AAAP/////+AAAP/////+AAAP/////+AAAH/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+AAAAAAB///gAAAAAD///wAAAAAH///4AAAAAP///4AAAAAP4fn8AAAAAfwfj+AAAAAfgfh+AAAAA/Afg+AAAAA/Afg+AAAAA/Afg+AAAAA/Afg+AAAAA/Afg+AAAAA/Afg+AAAAA/Afg+AAAAA/Afg+AAAAAfAfg+AAAAAfgfg+AAAAAfwfg+AAAAAP4fg+AAAAAP//g+AAAAAH//g+AAAAAD//g+AAAAAB//A+AAAAAAf/AcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAfAAAAAAAAA/AAAAAAAAA/AAAAAAAAA/AAAAAAAAf////8AAAB/////+AAAD/////+AAAD/////+AAAH/////8AAAH8/AAAAAAAPw/AAAAAAAPw/AAAAAAAPg/AAAAAAAPg/AAAAAAAPgfAAAAAAAPgeAAAAAAAPgMAAAAAAAPgAAAAAAAAPgAAAAAAAAPgAAAAAAAAPgAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/4AAAAAAB//8AAAAAAD//+AAwAAAH///AB4AAAP///gB8AAAP8A/wD8AAAfwAPwD8AAAfgAH4D8AAA/AAH4D8AAA/AAH4D8AAA/AAH4D8AAA/AAH4D8AAA/AAH4D8AAA/AAH4D8AAAfAAH4D8AAAfgAH4D8AAAfwAPwD8AAAP4AfwD8AAAH8A/gH4AAAH+B/AP4AAAf/////wAAAf/////gAAAf/////gAAAf/////AAAAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////8AAAP/////+AAAP/////+AAAP/////+AAAH/////8AAAAAD+AAAAAAAAD8AAAAAAAAH8AAAAAAAAP4AAAAAAAAPwAAAAAAAAfwAAAAAAAAfgAAAAAAAAfAAAAAAAAA/AAAAAAAAA/AAAAAAAAA/AAAAAAAAA/AAAAAAAAAfAAAAAAAAAfgAAAAAAAAf///AAAAAAP///8AAAAAP///+AAAAAH///+AAAAAB///+AAAAAAH//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAcAAAAAeAAA+AAAAAfAAA+AAAAA/AAA+AAAAA/AAA+AAAfA/AAA+AAA/g/AAA+AAA/g/AAA+AAA/g////+AAA/g////+AAA/g////+AAA/gf///+AAAfAf///+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAA/gAAAAAAAA/wAAAAAAAAf4AAAAAAAAf4AAAeAAAAH8AAAfAAAAD8AAA/AAAAD8AAA/AAAAD8AAA/AAAAD8AAA/AAAAD8AAA/AAAAD8AfA/AAAAD8A/g/AAAAD8A/g/AAAAH8A/g//////4A/g//////4A/g//////wA/gf/////gAfgf////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////8AAAP/////+AAAP/////+AAAP/////+AAAH/////8AAAAAAA/gAAAAAAAB/AAAAAAAAD/AAAAAAAAH/AAAAAAAAH/gAAAAAAAP/wAAAAAAAf/4AAAAAAA/v8AAAAAAB/H8AAAAAAD/D+AAAAAAH+B/AAAAAAH8A/gAAAAAP4AfwAAAAAfwAP4AAAAAfgAH8AAAAAfAAH8AAAAAfAAD+AAAAAMAAB+AAAAAAAAA+AAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAIAAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAP/////+AAAP/////+AAAP/////+AAAP/////+AAAH/////+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///8AAAAAf///+AAAAA////+AAAAAf///+AAAAAf///8AAAAAP4AAAAAAAAfwAAAAAAAAfgAAAAAAAA/AAAAAAAAA/AAAAAAAAAf///4AAAAAf///+AAAAAf///+AAAAAP///+AAAAAH///+AAAAAP///8AAAAAfwAAAAAAAAfgAAAAAAAAfAAAAAAAAA/AAAAAAAAA//4AAAAAAAf///8AAAAAf///+AAAAAP///+AAAAAH///+AAAAAB///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///8AAAAAf///+AAAAAf///+AAAAAf///+AAAAAf///8AAAAAD+AAAAAAAAD8AAAAAAAAH4AAAAAAAAP4AAAAAAAAPwAAAAAAAAfwAAAAAAAAfgAAAAAAAAfAAAAAAAAA/AAAAAAAAA/AAAAAAAAA/AAAAAAAAA/AAAAAAAAAfAAAAAAAAAfgAAAAAAAAf///AAAAAAP///8AAAAAP///+AAAAAH///+AAAAAD///+AAAAAAH//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+AAAAAAB///gAAAAAD///wAAAAAH///4AAAAAP///4AAAAAP4AH8AAAAAfwAD+AAAAAfgAB+AAAAAfAAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAAfAAB+AAAAAfgAB+AAAAAfwAD+AAAAAP4AP8AAAAAP///8AAAAAH///4AAAAAD///wAAAAAB///gAAAAAAf/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////4AAA//////8AAB//////8AAB//////8AAA//////4AAAH+Af4AAAAAP4AP8AAAAAfwAH+AAAAA/gAD/AAAAA/gAB/AAAAB/AAA/AAAAB+AAAfAAAAB+AAAfAAAAB+AAAfAAAAB+AAA/AAAAA/AAA/AAAAA/gAB+AAAAAfwAD+AAAAAP4AH8AAAAAP8AP4AAAAAH///wAAAAAD///gAAAAAB///gAAAAAA//+AAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+AAAAAAB///gAAAAAD///wAAAAAH///4AAAAAP///4AAAAAP4AH8AAAAAfwAD+AAAAAfgAB+AAAAAfAAB+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAAfAAA+AAAAAfAAB+AAAAAfgAD+AAAAAPwAD8AAAAAP4AH8AAAAAH8AP4AAAAAH+A/wAAAAAf/////4AAAf/////8AAAf/////8AAAf/////4AAAP/////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///8AAAAAf///+AAAAAf///+AAAAAf///+AAAAAf///8AAAAAB/gAAAAAAAB/AAAAAAAAD+AAAAAAAAH8AAAAAAAAP4AAAAAAAAPwAAAAAAAAfwAAAAAAAAfgAAAAAAAAfAAAAAAAAA/AAAAAAAAA/AAAAAAAAA/AAAAAAAAA/AAAAAAAAAfAAAAAAAAAfwAAAAAAAAf+AAAAAAAAP/AAAAAAAAH/AAAAAAAAD/AAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ABwAAAAAH+AD4AAAAAP/AD8AAAAAf/gD+AAAAAf/gB+AAAAAf/wB+AAAAA/PwA+AAAAA/H4A+AAAAA/H4A+AAAAA/H8A+AAAAA/D8A+AAAAA/D8A+AAAAA/B+A+AAAAA/B+A+AAAAA/A/A+AAAAA/A/A+AAAAA/Afg+AAAAA/Afg+AAAAA/Afx+AAAAA/AP/+AAAAAfgP/8AAAAAfwH/8AAAAAPwD/4AAAAAPwA/gAAAAADgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAfAAAAAAAAA/AAAAAAAAA/AAAAAAAAA/AAAAAAAB/////gAAAD/////wAAAD/////4AAAD/////8AAAB/////+AAAAA/AAB+AAAAA/AAB+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAA+AAAAA/AAB+AAAAA/AAD+AAAAAfAAP+AAAAAeAAP8AAAAAEAAP4AAAAAAAAPwAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//gAAAAAAf///gAAAAAf///4AAAAAf///8AAAAAf///8AAAAAA///+AAAAAAAAB+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAB+AAAAAAAAB+AAAAAAAAD+AAAAAAAAH8AAAAAAAAH4AAAAAAAAP4AAAAAAAAfwAAAAAAAAfgAAAAAf///8AAAAAf///+AAAAAf///+AAAAAf///+AAAAAf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAf/AAAAAAAAf/wAAAAAAAf/+AAAAAAAf//gAAAAAAAP/4AAAAAAAD/+AAAAAAAA//wAAAAAAAP/8AAAAAAAB/+AAAAAAAAf+AAAAAAAAH+AAAAAAAAB+AAAAAAAAH+AAAAAAAA/+AAAAAAAD/+AAAAAAAP/4AAAAAAA//gAAAAAAH/+AAAAAAAf/4AAAAAAf//AAAAAAAf/8AAAAAAAf/wAAAAAAAf/AAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAAAAAAf//4AAAAAAf///gAAAAAf///8AAAAAf///+AAAAAH///+AAAAAAAAf+AAAAAAAAD+AAAAAAAAH+AAAAAAAAf+AAAAAAAA/8AAAAAAD//4AAAAAAH//gAAAAAAH//AAAAAAAH//gAAAAAAD//4AAAAAAAA/+AAAAAAAAP+AAAAAAAAD+AAAAAAAAH+AAAAAAAA/+AAAAAP///+AAAAAf///+AAAAAf///4AAAAAf///AAAAAAf//4AAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAeAAA+AAAAAfgAD+AAAAAfwAH+AAAAAf4AP8AAAAAP8Af4AAAAAH+A/wAAAAAD/j/gAAAAAB/3/AAAAAAA//+AAAAAAAP/4AAAAAAAH/wAAAAAAAD/gAAAAAAAH/wAAAAAAAP/4AAAAAAAf/8AAAAAAA/3+AAAAAAD/j/gAAAAAH/B/wAAAAAP+A/4AAAAAf4AP8AAAAAfwAH+AAAAAfgAD+AAAAAfAAB+AAAAAMAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAB4AAAf/AAAB8AAAf/wAAD8AAAf/8AAD8AAAf//gAD8AAAAf/4AD8AAAAH/+AD8AAAAA//wD8AAAAAP/4P8AAAAAD/4/8AAAAAAf7/8AAAAAAH//4AAAAAAH//gAAAAAAH/8AAAAAAA//wAAAAAAD//AAAAAAAP/8AAAAAAA//gAAAAAAD/+AAAAAAAf/4AAAAAAf//gAAAAAAf/8AAAAAAAf/wAAAAAAAf/AAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAOAAD+AAAAAfAAH+AAAAAfAAP+AAAAA/AAf+AAAAA/AA/+AAAAA/AB/+AAAAA/AD++AAAAA/AH++AAAAA/AP8+AAAAA/Af4+AAAAA/A/w+AAAAA/B/g+AAAAA/D/A+AAAAA/H+A+AAAAA/P8A+AAAAA/f4A+AAAAA//wA+AAAAA//gA+AAAAA//AA+AAAAA/+AA+AAAAA/8AA+AAAAA/4AA+AAAAAfwAA+AAAAAPgAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAA/gAAAAAAAB/wAAAAAD/////4AAAH/////8AAAP/////+AAAP//7//+AAAP//x//+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAHAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////8AAAP/////+AAAP/////+AAAP/////+AAAH/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAcAAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAPgAAAA+AAAP//x//+AAAP//7//+AAAP/////+AAAH/////8AAAD/////wAAAAAB/wAAAAAAAA/gAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAfAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAHwAAAAAAAAH4AAAAAAAAPwAAAAAAAAPwAAAAAAAAfgAAAAAAAA/gAAAAAAAA/AAAAAAAAA/AAAAAAAAA/AAAAAAAAAfAAAAAAAAAfgAAAAAAAAfgAAAAAAAAPgAAAAAAAAPwAAAAAAAAPwAAAAAAAAH4AAAAAAAAH4AAAAAAAAP4AAAAAAAAPwAAAAAAAAfwAAAAAAAAfgAAAAAAAA/gAAAAAAAA/AAAAAAAAAeAAAAAAAAAEAAAAAAAAAAAAAAAA=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;atob&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;JBggICAgIBgbGSEgGyAYICAgICAfICAgICAYGyAgISEgICAgICAgICAgHSAgICAgICAgICAgICAgICAgISAhJRogICAgIB8gIB4dIB4gICAgICAgICAgISAgICAWICI=&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;exports&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;graphics&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;graphics&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;prototype&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setFontCYBER60&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;scale&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setFontCustom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;font&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;32&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;60&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;scale&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;f_cyber64.js&lt;/code&gt; - OCR-A font at 64 point size.&lt;/p&gt;





  &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;font&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;atob&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAAfgAAAf///gB/AAAD////AP8AAAP///8A/wAAA////wD/AAAD////AP8AAAH///4AfwAAAf/+AAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA//gAAAAAAAD//8AAAAAAAP//4AAAAAAA///gAAAAAAD//+AAAAAAAP//4AAAAAAA///AAAAAAAD//gAAAAAAAP/AAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/4AAAAAAAAD//AAAAAAAAP//wAAAAAAA///gAAAAAAD//+AAAAAAAP//4AAAAAAA///gAAAAAAD//8AAAAAAAP/8AAAAAAAA/4AAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgDgAAAAAAAPAfAAAAAAAB+B8AAAAAAAH4PwAAAAAAAfg/AAAAAAB////+AAAAAf////+AAAAD/////4AAAAP/////gAAAAf////+AAAAB/////4AAAAAB+D8AAAAAAAH4PwAAAAAAAfg/AAAAAAAB+D8AAAAAAAH4PwAAAAAA/////wAAAAH/////gAAAA/////+AAAAD/////4AAAAH/////gAAAAP////8AAAAAAfg/AAAAAAAB+D8AAAAAAAH4HwAAAAAAAPgfAAAAAAAA8A4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4HAAAAAAA//w+AAAAAAH//H4AAAAAAf/8fgAAAAAB//x+AAAAAAH//H4AAAAAAfj8fgAAAAAB+Px+AAAAAAH4/H4AAAAAAfj8fgAAAAD/+Px//AAAAf/4/H//AAAD//j8f/8AAAP/+Px//wAAAf/4/H//AAAB//j8f/4AAAAB+Px+AAAAAAH4/H4AAAAAAfj8fgAAAAAB+Px+AAAAAAH4/H4AAAAAAfj//gAAAAAB+P/+AAAAAAH4//4AAAAAAfj//gAAAAAA+H/+AAAAAABwP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAwAAAAf8AAAPgAAAD/4AAB/AAAAP/gAAf8AAAA/+AAD/gAAAD/4AAf8AAAAP/gAD/gAAAA/+AA/8AAAAD/4AH/gAAAAH/AA/4AAAAAf8AH/AAAAAAAAB/4AAAAAAAAP+AAAAAAAAB/wAAAAAAAAf+AAAAAAAAD/wAAAAAAAAf8AH+AAAAAD/gA/8AAAAA/8AD/wAAAAH/gAP/AAAAA/4AA/8AAAAP/AAD/wAAAB/4AAP/AAAAH/AAA/8AAAAfwAAD/wAAAB+AAAP/AAAADwAAAf4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAA8AAAAAAf+AP/AAAAAD/8B/+AAAAAf/4P/8AAAAD//w//4AAAAf//n//gAAAB/H//x/AAAAH4H/+D8AAAAfgP/wPwAAAB+Af+A/AAAAH4A/4D8AAAAfgD/wPwAAAB+Af/g/AAAAH4D//D8AAAAfgf/+fwAAAB+D/f//AAAAH//4//4AAAAf//B//AAAAA//4D/4AAAAB//gD/gAAAAD/8AP+AAAAAD/gB/8AAAAAAAAP/4AAAAAAAA//wAAAAAAAH9/AAAAAAAAfj8AAAAAAAA8HwAAAAAAAAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///4AAAAAAH///wAAAAAA////AAAAAAD///8AAAAAAP///gAAAAAA///8AAAAAAD//8AAAAAAAP/+AAAAAAAA//AAAAAAAAB/AAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///gAAAAAAP///gAAAAAB////AAAAAAf///+AAAAAD////8AAAAAf/AB/8AAAAH/gAA/4AAAA/4AAB/wAAAH/AAAD/gAAA/4AAAD/AAAD/AAAAH8AAAH4AAAAPwAAAeAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAHgAAAfgAAAA/AAAD/AAAAH8AAAP+AAAB/wAAAf8AAAP+AAAA/8AAB/wAAAA/4AAP+AAAAB/8AP/wAAAAD////8AAAAAH////gAAAAAH///8AAAAAAP///gAAAAAAP//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAcAAAAAAD4AD4AAAAAAfwAfgAAAAAB/AD+AAAAAAD+Af4AAAAAAH8D/AAAAAAAf4f4AAAAAAA/x/AAAAAAAB/v4AAAAAAAD//AAAAAAAf///+AAAAAH////+AAAAAf////8AAAAB/////wAAAAH////+AAAAAP////4AAAAAAH/8AAAAAAAA//4AAAAAAAH+/gAAAAAAA/x/AAAAAAAH+H+AAAAAAA/wP8AAAAAAD+Af4AAAAAAfwA/gAAAAAB/AB+AAAAAAD4AD4AAAAAAHAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAB8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAP///AAAAAAB////AAAAAAP///+AAAAAA////4AAAAAD////AAAAAAH///8AAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAB8AAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAHwAAAAAAAAAfAAAAAAAAAB+AAAAAAAAAH4AAAAAAAAAfgAAAAAAAAB+AAAAAAAAAH4AAAAAAAAAfgAAAAAAAAB+AAAAAAAAAH4AAAAAAAAAf//gAAAAAAB///AAAAAAAH//8AAAAAAAf//wAAAAAAA//+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAfwAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAP+AAAAAAAAB/4AAAAAAAAH/wAAAAAAAAf/AAAAAAAAB/8AAAAAAAAH/wAAAAAAAAf/AAAAAAAAB/4AAAAAAAAD/gAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAH8AAAAAAAAA/wAAAAAAAAP/AAAAAAAAD/4AAAAAAAA//AAAAAAAAH/wAAAAAAAB/8AAAAAAAAf/gAAAAAAAD/4AAAAAAAA/+AAAAAAAAP/gAAAAAAAB/8AAAAAAAAf/AAAAAAAAH/wAAAAAAAB/+AAAAAAAAP/gAAAAAAAD/4AAAAAAAA//AAAAAAAAH/wAAAAAAAB/8AAAAAAAAf/AAAAAAAAD/4AAAAAAAAP+AAAAAAAAAfgAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////8AAAB//////4AAAH//////wAAA///////AAAD//////8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA///////AAAD//////8AAAH//////wAAAf/////+AAAA//////wAAAAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAA4AAAHwAAAAHwAAA/AAAAAfAAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA///////AAAD//////8AAAP//////wAAA///////AAAD//////8AAAH//////wAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAB//8AAAAAAAP//wAAAAAAB///AAAAAAAH//8AAAAAAAf//wAAAAAAA//+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAB///wAAA/AAP///AAAD8AB///8AAAPwAH///wAAA/AA////AAAD8AD8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AD8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AD8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AD8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AD8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AD8AD8AAAP///wAPwAAA////AA/AAAB///8AD8AAAD///gAHwAAAP//8AAfAAAAP//AAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAEAAAB4AAAAB8AAAPwAAAAHwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAeAA/AAAD8AB8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AD8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AD8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AD8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AD8AD8AAAPwAPwAPwAAA/AD/wA/AAAD//////8AAAP//////wAAAf//////AAAA//////4AAAB//4f//AAAAAAAAP/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////4AAAAAH////gAAAAA////+AAAAAD////4AAAAAH////gAAAAAP///+AAAAAAAAAH4AAAAAAAAAfgAAAAAAAAB+AAAAAAAAAH4AAAAAAAAAfgAAAAAAAAB+AAAAAAAAAH4AAAAAAAAAfgAAAAAAAAB+AAAAAAAAAH4AAAAAAP/////gAAAB//////AAAAH/////8AAAAf/////wAAAA/////+AAAAAAAH4AAAAAAAAAfAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAB4AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD+AAAAAAAAAH4AAAP///wAfwAAA////AA/AAAD///8AD8AAAP///wAPwAAA////AA/AAAD8AD8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AD8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AD8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AD8AD8AAAPwAP///wAAA/AA////AAAD8AB///8AAAPwAH///wAAAfAAP//+AAAB4AAf//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////8AAAB//////8AAAP//////wAAA///////AAAD//////8AAAP//////wAAA/AAB+A/AAAB8AAH4D8AAADAAAfgPwAAAAAAB+A/AAAAAAAH4D8AAAAAAAfgPwAAAAAAB+A/AAAAAAAH4D8AAAAAAAfgPwAAAAAAB+A/AAAAAAAH4D8AAAAAAAfgPwAAAAAAB+A/AAAAAAAH4D8AAAAAAAfgPwAAAAAAB+A/AAAAAAAH//8AAAAAAAf//wAAAAAAB///AAAAAAAH//8AAAAAAAP//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAH8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/gAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAA//+AAAD8AAH//8AAAPwAA///wAAA/AAH///AAAD8AA///4AAAPwAH+AAAAAA/AAfwAAAAAD8AD+AAAAAAPwAfwAAAAAA/AD/AAAAAAD///4AAAAAAP///AAAAAAA///4AAAAAAD///AAAAAAAP//4AAAAAAA///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAB///AAAAAAAP//+AAAAAAB///8AAAAAAP///wAAAAAA////AAAB///8AD8AAAH///wAPwAAA////AA/AAAD///8AD8AAAP///wAPwAAA////AA/AAAD8AD8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AD8AD8AAAP///wAPwAAA////AA/AAAD///8AD8AAAP///wAPwAAAf///AA/AAAB///8AD8AAAAAAP///wAAAAAA////AAAAAAB///8AAAAAAH///gAAAAAAH//8AAAAAAAH/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+AAAAAAAB//+AAAAAAAP//4AAAAAAA///wAAAAAAD///AAAAAAAP//8AAAAAAA/APwAAAAAAD8A/AAAAAAAPwD8AAAAAAA/APwAAAAAAD8A/AAAAAAAPwD8AAAAAAA/APwAAAAAAD8A/AAAAAAAPwD8AAAAAAA/APwAAAAAAD8A/AAAAAAAPwD8AAAAAAA/APwAAAAAAD8A/AAA4AAAPwD8AAHwAAA/APwAA/AAAD//////8AAAP//////wAAA///////AAAD//////8AAAH//////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AP8AAAAAB/4A/4AAAAAH/gH/wAAAAAf+Af/AAAAAB/4B/8AAAAAH/gH/wAAAAAf+Af/AAAAAB/4B/8AAAAAH/gH/gAAAAAP+AP+AAAAAAfwAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AOAAAAAAB/4B8AAAAAAH/gHwAAAAAAf+AfgAAAAAB/4B+AAAAAAH/gH4AAAAAAf+AfgAAAAAB/4B+AAAAAAH/gH4AAAAAAf+AfgAAAAAA/wB+AAAAAAAAAH//4AAAAAAAf//wAAAAAAB///AAAAAAAH//8AAAAAAAP//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAPwAAAAAAAAB/gAAAAAAAAH/AAAAAAAAA/8AAAAAAAAD/4AAAAAAAAf/wAAAAAAAD//AAAAAAAAP7+AAAAAAAB/H4AAAAAAAH4fwAAAAAAA/g/AAAAAAAH8D+AAAAAAAfwH8AAAAAAD+AfwAAAAAAPwA/gAAAAAB/AB+AAAAAAP4AH8AAAAAA/gAP4AAAAAH8AA/gAAAAAfgAB/AAAAAD+AAD8AAAAAfwAAP4AAAAB/AAAfwAAAAH4AAB/AAAAAfAAAD8AAAAB8AAAHgAAAABAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8A8AAAAAAAD4HwAAAAAAAfgfgAAAAAAB+B+AAAAAAAH4H4AAAAAAAfgfgAAAAAAB+B+AAAAAAAH4H4AAAAAAAfgfgAAAAAAB+B+AAAAAAAH4H4AAAAAAAfgfgAAAAAAB+B+AAAAAAAH4H4AAAAAAAfgfgAAAAAAB+B+AAAAAAAH4H4AAAAAAAfgfgAAAAAAB+B+AAAAAAAH4H4AAAAAAAfgfgAAAAAAB+B+AAAAAAAH4H4AAAAAAAfgfgAAAAAAA+B8AAAAAAAD4HwAAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAIAAAAAfAAAB4AAAAB8AAAPwAAAAH4AAB/AAAAAfwAAH8AAAAA/AAA/gAAAAD+AAD8AAAAAH4AAfwAAAAAfwAD+AAAAAA/gAP4AAAAAD+AB/AAAAAAH8AH4AAAAAAPwA/gAAAAAA/gH8AAAAAAB/AfwAAAAAAH8D+AAAAAAAP4PwAAAAAAAfh/AAAAAAAB/H4AAAAAAAD+/gAAAAAAAP/8AAAAAAAAf/wAAAAAAAA/+AAAAAAAAD/wAAAAAAAAH/AAAAAAAAAf4AAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAPgAAAAAAAAB/AAAAAAAAAH8AAAAAAAAA/gAAAAAAAAH+AAAAAAAAA/wP8HgAAAAH+B/4fAAAAA/wP/j8AAAAH+B/+HwAAAAfwP/weAAAAD+B/8AAAAAAf4H8AAAAAAD/A/gAAAAAAf4H+AAAAAAD/A/wAAAAAAf4H+AAAAAAB/A/wAAAAAAP4H+AAAAAAA/gfwAAAAAAB/D+AAAAAAAH//4AAAAAAAP//AAAAAAAAf/4AAAAAAAA//AAAAAAAAB/4AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA/+AAAAAHwA///AAAAA/AH//+AAAAH+A///8AAAA/wH///4AAAH/Af///gAAAfwD/AB/AAAD+APwAD8AAAPwA/AAPwAAA/AD8AA/AAAD8APwAD8AAAPwA////wAAA/AD///+AAAD8AP///4AAAPwA////gAAA/AD///+AAAD8AH///8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAH4AAAAPwAAAf4AAAB/AAAB//////8AAAD//////gAAAH/////8AAAAP/////gAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAfwAAAAAAAAP/AAAAAAAAP/8AAAAAAAH//wAAAAAAD//+AAAAAAD///gAAAAAB///wAAAAAA///4AAAAAA////gAAAAAf//9+AAAAAP//8H4AAAAB//+AfgAAAAP//AB+AAAAA//4AH4AAAAB//+AfgAAAAD///B+AAAAAD///34AAAAAA////gAAAAAAf//+AAAAAAAH///AAAAAAAD///gAAAAAAA///gAAAAAAAf//AAAAAAAAH/8AAAAAAAAD/wAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////wAAA///////AAAD//////8AAAP//////wAAA///////AAAD8AD8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AD8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AD8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AD8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AD+AD8AAAH4Af4APwAAAfwB/wB/AAAB/wf/wf4AAAD//////gAAAH/////8AAAAf//v//gAAAAf/8f/8AAAAA//A//AAAAAAfgAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAP/AAAAAAAAD//AAAAAAAA///AAAAAAAP///AAAAAAD////AAAAAAf/x//AAAAAH/4B//AAAAB/+AB//AAAAP/gAB/8AAAA/8AAB/4AAAH/AAAB/gAAA/wAAAB/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAB8AAAHgAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAwAAAHgAAAAHwAAA/AAAAAfAAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD//////8AAAP//////wAAA///////AAAD//////8AAAP//////wAAA///////AAAD8AAAAD8AAAPwAAAAPwAAA/gAAAA/AAAD/AAAAH8AAAH/AAAB/wAAAf/AAAf+AAAA//AAH/wAAAB//AB/+AAAAB/+Af/wAAAAB////8AAAAAB////AAAAAAB///wAAAAAAB//8AAAAAAAB//AAAAAAAAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////wAAA///////AAAD//////8AAAP//////wAAA///////AAAD//////8AAAPwAPwAPwAAA/AA/AA/AAAD8AD8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AD8AD8AAAPwAPwAPwAAA/AA/AA/AAAD8AB8AD8AAAPwAHgAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAHwAAAeAAAAAfAAAAwAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////+AAAD//////8AAAP//////wAAA///////AAAD//////4AAAP/////+AAAA/APwAAAAAAD8A/AAAAAAAPwD8AAAAAAA/APwAAAAAAD8A/AAAAAAAPwD8AAAAAAA/APwAAAAAAD8A/AAAAAAAPwD8AAAAAAA/APwAAAAAAD8A/AAAAAAAPwD8AAAAAAA/APwAAAAAAD8A+AAAAAAAPwB4AAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAB4AAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///AAAAAAH///+AAAAAA////8AAAAAH////4AAAAB/////wAAAAP/gAD/AAAAB/wAAD8AAAAP+AAAPwAAAD/wAAA/AAAAf+AAAD8AAAD/gAAAPwAAAf8AAAA/AAAB/gAAAD8AAAP4AAPAPwAAA/AAB8A/AAAD8AAH4D8AAAPwAAfgPwAAA/AAB+A/AAAD8AAH4D8AAAPwAAfgPwAAA/AAB+B/AAAD8AAH//8AAAPwAAf//gAAA/AAB//+AAAD8AAH//wAAAHgAAf/8AAAAMAAB//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//////gAAA///////AAAD//////8AAAH//////wAAAf/////+AAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAH//////gAAAf//////AAAD//////8AAAP//////wAAAf//////AAAA//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAOAAAB8AAAAB8AAAPwAAAAHwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAP//////wAAA///////AAAD//////8AAAP//////wAAA///////AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAAfAAAB8AAAAB8AAADAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAf/+AAAAAAAB//8AAAAAAAH//4AAAAAAAP//wAAAAAAAf//AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAH8AAAH//////wAAA//////+AAAD//////wAAAP/////+AAAAf/////wAAAAf////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////+AAAD//////8AAAP//////wAAA///////AAAB//////4AAAAAB//AAAAAAAAP/8AAAAAAAB/v4AAAAAAAP8fwAAAAAAB/h/gAAAAAAH8D/AAAAAAA/gH+AAAAAAH+AP4AAAAAA/wAfwAAAAAH+AA/gAAAAA/wAD/AAAAAD+AAH+AAAAAfwAAP8AAAAD+AAAf4AAAAf4AAA/wAAAD/AAAB/AAAAf4AAAD+AAAB/AAAAP8AAAP4AAAAfwAAA/AAAAA/AAAB8AAAAB8AAADAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//////8AAAH//////wAAA///////AAAD//////8AAAH//////wAAAH//////AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////gAAA///////AAAD//////8AAAP//////wAAA//////+AAAD/gAAAAAAAAP/AAAAAAAAAf/AAAAAAAAAf+AAAAAAAAA/8AAAAAAAAA//AAAAAAAAB/+AAAAAAAAB/8AAAAAAAAH/wAAAAAAAA/+AAAAAAAAP/wAAAAAAAB/4AAAAAAAAf+AAAAAAAAD/wAAAAAAAA/8AAAAAAAAD/gAAAAAAAAP//////gAAA///////AAAD//////8AAAP//////wAAA///////AAAD//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////8AAAD//////8AAAP//////wAAA///////AAAD//////8AAAP//////gAAA//AAAAAAAAD//AAAAAAAAD//AAAAAAAAD//AAAAAAAAD//gAAAAAAAB//gAAAAAAAB//gAAAAAAAB//wAAAAAAAB//wAAAAAAAA//wAAAAAAAA//wAAAAAAAA//4AAAAAAAA//4AAAAAAAAf/4AAAAAAAAf/wAAAAAAAAf/AAAB//////8AAAP//////wAAA///////AAAD//////8AAAH//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAB//AAAAAAAAf//AAAAAAAH///AAAAAAD////AAAAAA/////AAAAAP/4B//AAAAB/+AB//AAAAP/gAB/+AAAB/4AAB/4AAAH+AAAB/wAAA/gAAAB/AAAD8AAAAD8AAAPwAAAAPwAAA/gAAAB/AAAB/gAAAP8AAAH/gAAD/wAAAP/gAA/+AAAAf/gAP/wAAAA//gD/+AAAAA//h//gAAAAA////4AAAAAA///+AAAAAAA///AAAAAAAA//wAAAAAAAA/8AAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//////AAAA///////AAAD//////8AAAP//////wAAA///////AAAD//////4AAAPwAB+AAAAAA/AAH4AAAAAD8AAfgAAAAAPwAB+AAAAAA/AAH4AAAAAD8AAfgAAAAAPwAB+AAAAAA/AAH4AAAAAD8AAfgAAAAAPwAB+AAAAAA/AAH4AAAAAD8AAfgAAAAAPwAB+AAAAAA/AAH4AAAAAD8AA/AAAAAAH8AH8AAAAAAf///wAAAAAB///+AAAAAAD///wAAAAAAH//+AAAAAAAH//wAAAAAAAD/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//+AAAAAAA///+AAAAAAP///+AAAAAB////4AAAAAP////wAAAAB/////AAAAAP+AAD8AAAAB/gAAPwAAAAH8AAA/AAAAA/gAAH8AAAAH8AAA/gAAAA/gA4H+AAAAH+AH8/wAAAA/wAf/+AAAAH+AB//wAAAA/wAH//AAAAD+AAP//AAAAfwAAH//AAAB+AAAf/8AAAP4AAD//wAAA/AAAf5/AAAD+AAH/D8AAAP////4PwAAAf////g/AAAB////8D8AAAD////AHwAAAD///4AeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////+AAAA///////AAAD//////8AAAP//////wAAA///////AAAD//////4AAAPwD8AAAAAAA/APwAAAAAAD8A/AAAAAAAPwD8AAAAAAA/AP4AAAAAAD8A/4AAAAAAPwD/wAAAAAA/AP/wAAAAAD8A//wAAAAAPwD//gAAAAA/AP//gAAAAD8A/f/gAAAAPwD8f/gAAAA/APwf/AAAAD8B/A//AAAAH8P4A//AAAAf//gA/+AAAB//8AA/8AAAD//wAB/wAAAH/+AAB/AAAAH/gAAB4AAAADwAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAMAAAAB/AAAB+AAAAP+AAAP8AAAB/+AAA/4AAAH/8AAD/wAAA//4AAH/AAAD9/4AAD8AAAPz/wAAPwAAA/D/gAA/AAAD8H/AAD8AAAPwP/AAPwAAA/Af+AA/AAAD8Af8AD8AAAPwA/4APwAAA/AB/4A/AAAD8AB/wD8AAAPwAD/gPwAAA/AAH/g/AAAD8AAP/D8AAAPwAAP+PwAAA/AAAf8/AAAD+AAA//8AAAH/AAB//wAAAf8AAB//AAAA/4AAD/4AAAB/AAAH/gAAAD8AAAH4AAAABAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAD/wAAAAAAAAP/AAAAAAAAA/8AAAAAAAAD/wAAAAAAAAP+AAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD//////wAAAP//////wAAA///////AAAD//////8AAAP//////wAAA//////+AAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/4AAAAAAAAD/wAAAAAAAAP/AAAAAAAAA/8AAAAAAAAD/wAAAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////8AAAAH/////8AAAA//////8AAAD//////4AAAH//////gAAAf//////AAAAAAAAAH8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAH8AAAH//////wAAA//////+AAAD//////wAAAP/////+AAAAf/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/4AAAAAAAAf/4AAAAAAAD//8AAAAAAAP//+AAAAAAAf//+AAAAAAB////AAAAAAAAP//AAAAAAAAH//gAAAAAAAH//gAAAAAAAD//wAAAAAAAD//wAAAAAAAB//4AAAAAAAB//wAAAAAAAA//AAAAAAAAD/8AAAAAAAA//wAAAAAAAf/+AAAAAAAP//AAAAAAAD//wAAAAAAB//4AAAAAAAf/+AAAAAAAP//AAAAAAf///wAAAAAB///4AAAAAAP//+AAAAAAA///AAAAAAAB//wAAAAAAAB/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////8AAAAH/////8AAAA//////4AAAD//////4AAAH//////wAAAf//////AAAAAAAAAH8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAfwAAAAAH////AAAAAA////8AAAAAD////gAAAAAP///+AAAAAA////8AAAAAB////wAAAAAAAAB/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAP8AAAH//////wAAAf//////AAAD//////4AAAP/////+AAAAf/////gAAAAf////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAMAAAB8AAAAB8AAAP4AAAAfwAAA/4AAAH/AAAD/4AAB/8AAAH/4AAP/gAAAH/wAD/8AAAAH/wA//AAAAAP/wH/wAAAAAP/h/8AAAAAAP///gAAAAAAf//4AAAAAAAf/+AAAAAAAAf/wAAAAAAAB//AAAAAAAAf//AAAAAAAH//+AAAAAAB/+/+AAAAAAP/h/+AAAAAD/4B/+AAAAA//AB/8AAAAH/wAD/8AAAB/8AAD/4AAAP/gAAD/wAAA/4AAAD/AAAD+AAAAH8AAAHwAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAAH/gAAAAAAAA//AAAAAAAAD/+AAAAAAAAH/8AAAAAAAAP/8AAAAAAAAA/4AAAAAAAAB/wAAAAAAAAD/gAAAAAAAAH/gAAAAAAAAH/AAAAAAAAAP///+AAAAAAf///8AAAAAA////wAAAAAH////AAAAAA////4AAAAAH/AAAAAAAAB/4AAAAAAAAP+AAAAAAAAB/wAAAAAAAAP+AAAAAAAA//wAAAAAAAH/8AAAAAAAA//gAAAAAAAD/8AAAAAAAAH/gAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAADwAAAeAAAAAfAAAD8AAAAH8AAAPwAAAB/wAAA/AAAAf/AAAD8AAAD/8AAAPwAAA//wAAA/AAAP//AAAD8AAB//8AAAPwAAf/PwAAA/AAH/4/AAAD8AA/+D8AAAPwAP/gPwAAA/AD/8A/AAAD8A//AD8AAAPwH/wAPwAAA/B/8AA/AAAD8f/gAD8AAAPz/4AAPwAAA//+AAA/AAAD//wAAD8AAAP/8AAAPwAAA//AAAA/AAAD/4AAAD8AAAP+AAAAPwAAA/gAAAAfAAAD4AAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////+AAAB//////8AAAP//////wAAA///////AAAD//////8AAAP//////wAAA/AAAAA/AAAD8AAAAD8AAAP//////wAAA///////AAAD//////8AAAP//////wAAA///////AAAD//////8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAAfAAAB4AAAAB8AAADAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAHwAAAAAAAAA/wAAAAAAAAD/gAAAAAAAAH/gAAAAAAAAf/gAAAAAAAAf/AAAAAAAAAf/AAAAAAAAAf/AAAAAAAAA/+AAAAAAAAA/+AAAAAAAAA/+AAAAAAAAB/+AAAAAAAAB/8AAAAAAAAB/8AAAAAAAAB/8AAAAAAAAD/4AAAAAAAAD/4AAAAAAAAD/4AAAAAAAAH/wAAAAAAAAH/wAAAAAAAAH/wAAAAAAAAP/gAAAAAAAAP/AAAAAAAAAP8AAAAAAAAAPwAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAABAAAAeAAAAAfAAAD8AAAAB8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD//////8AAAP//////wAAA///////AAAD//////8AAAP//////wAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA///////AAAD//////8AAAP//////wAAA///////AAAB//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAD4AAAAAAAAA/gAAAAAAAAP+AAAAAAAAD/4AAAAAAAA//AAAAAAAAP/4AAAAAAAD//AAAAAAAA//wAAAAAAAP/+AAAAAAAB//gAAAAAAAf/8AAAAAAAD//AAAAAAAAf/4AAAAAAAB//gAAAAAAAD//AAAAAAAAH//AAAAAAAAH/+AAAAAAAAH/+AAAAAAAAH/8AAAAAAAAP/8AAAAAAAAP/4AAAAAAAAP/wAAAAAAAAP/gAAAAAAAAP+AAAAAAAAAP4AAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAfAAAAAAAAAD8AAAAAAAAAP4AAAAAAAAAfgAAAAAAAAB+AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/gAAAAAAAAB+AAAAAAAAAH8AAAAAAAAAPwAAAAAAAAA/gAAAAAAAAB8AAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAf/AAAAAAAAD//AAAAAAAAf/+AAAAAAAD//4AAAAAAAf//wAAAAAcB/B/AAAAAD4H4D8AAAAAfgfgPwAAAAB+B+A/AAAAAH4H4D8AAAAAfgfgPwAAAAB+B+A/AAAAAH4H4D8AAAAAfgfgPwAAAAB+B+A/AAAAAH4H4D8AAAAAfgfgfwAAAAB+B+B/AAAAAD8H4P4AAAAAP4fg/gAAAAA////8AAAAAD////4AAAAAH////wAAAAAP////AAAAAAP///8AAAAAAP///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//////gAAA///////AAAD//////8AAAP//////wAAAf/////+AAAAAAf8B/gAAAAAD/AD/AAAAAAf4AH8AAAAAD/AAP4AAAAAP4AAfwAAAAA/AAA/AAAAAH8AAD8AAAAAfgAAPwAAAAB+AAA/AAAAAH4AAD8AAAAAfgAAPwAAAAB+AAA/AAAAAH8AAD8AAAAAPwAAPwAAAAA/gAB/AAAAAB/AAf4AAAAAH////AAAAAAP///8AAAAAAf///gAAAAAA///8AAAAAAB///AAAAAAAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAA//wAAAAAAAP//gAAAAAAB///AAAAAAAH//+AAAAAAA///8AAAAAAH+Af4AAAAAA/wA/wAAAAAH+AB/gAAAAA/wAD+AAAAAD+AAH8AAAAAPwAAPwAAAAB/AAA/AAAAAH4AAD8AAAAAfgAAPwAAAAB+AAA/AAAAAH4AAD8AAAAAfgAAPwAAAAB+AAA/AAAAAH4AAD8AAAAAfgAAPwAAAAB+AAA/AAAAAH4AAD8AAAAAfgAAPwAAAAB+AAA/AAAAAD4AAB8AAAAAPgAAHgAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAAAAAB///gAAAAAAP///AAAAAAB///+AAAAAAP///8AAAAAB////4AAAAAH8AB/gAAAAA/gAB/AAAAAD8AAD8AAAAAPwAAPwAAAAB+AAA/AAAAAH4AAD8AAAAAfgAAPwAAAAB+AAA/AAAAAH4AAD8AAAAAPwAAPwAAAAA/AAA/AAAAAD+AAH8AAAAAH8AA/gAAAAAf4AH+AAAAAA/wA/wAAAAAB/wP+AAAAf/////+AAAD//////8AAAP//////wAAAf//////AAAB//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/+AAAAAAAH//+AAAAAAA///8AAAAAAH///4AAAAAA////wAAAAAH////gAAAAA/wfj+AAAAAD+B+H8AAAAAPwH4fwAAAAB/Afg/AAAAAH8B+D8AAAAAfwH4PwAAAAB/Afg/AAAAAH8B+D8AAAAAfwH4PwAAAAB/Afg/AAAAAH8B+D8AAAAAfwH4PwAAAAA/Afg/AAAAAD+B+D8AAAAAP8H4PwAAAAAf//g/AAAAAA//+D8AAAAAB//4PwAAAAAH//gfAAAAAAP/+B8AAAAAAP/wDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAA+AAAAAAAAAD4AAAAAAAAAfgAAAAAAAAB+AAAAAAAAAH4AAAAAAAAP/////gAAAD//////AAAAf/////8AAAD//////wAAAP/////+AAAB//4AAAAAAAH4fgAAAAAAA/h+AAAAAAAD8H4AAAAAAAPwfgAAAAAAA/B+AAAAAAAD8D4AAAAAAAPwPAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAB4AAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAf//AAAAAAAD///AAAAAAAf//+ABwAAAD///4APgAAAf///wA+AAAB/AB/gD8AAAP4AD+APwAAA/AAH8A/AAAD8AAPwD8AAAfgAA/APwAAB+AAD8A/AAAH4AAPwD8AAAfgAA/APwAAB+AAD8A/AAAD8AAPwD8AAAPwAB/APwAAA/gAH4A/AAAB/AA/gH8AAAH+AH8AfgAAAP8A/wD+AAAA/8P+A/wAAAP//////AAAA//////4AAAD//////AAAAP/////4AAAAf////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//////gAAA///////AAAD//////8AAAP//////wAAAf/////+AAAAAAP4AAAAAAAAB/AAAAAAAAAH4AAAAAAAAA/gAAAAAAAAH8AAAAAAAAAfgAAAAAAAAD+AAAAAAAAAPwAAAAAAAAB/AAAAAAAAAH4AAAAAAAAAfgAAAAAAAAB+AAAAAAAAAH4AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD//+AAAAAAAP////gAAAAAf////AAAAAA////8AAAAAB////wAAAAAB////AAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAeAAAAAD4AAB8AAAAAfgAAPwAAAAB+AAA/AAAAAH4AAD8AAAfgfgAAPwAAD/B+AAA/AAAP8H////8AAA/wf////wAAD/B/////AAAP8H////8AAA/wP////wAAB+A/////AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAB8AAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAA+AAAAAAAAAH+AAAAAAAAAf8AAAAAAAAB/wAAAAAAAAD/gAAAcAAAAD+AAAD4AAAAD8AAAPgAAAAPwAAB+AAAAA/AAAH4AAAAD8AAAfgAAAAPwAAB+AAAAA/AAAH4AAAAD8AfgfgAAAAPwD/B+AAAAB/AP8H//////4A/wf//////gD/B//////8AP8H//////wA/wP/////+AB+Af/////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//////gAAAf//////AAAD//////8AAAP//////wAAAf/////+AAAAf/////gAAAAAAAf4AAAAAAAAD/AAAAAAAAAf8AAAAAAAAB/4AAAAAAAAP/wAAAAAAAB//gAAAAAAAP/+AAAAAAAB/n8AAAAAAAP8f4AAAAAAB/g/wAAAAAAH8B/gAAAAAA/gD/AAAAAAH+AH+AAAAAA/wAP4AAAAAD+AAfwAAAAAPwAA/gAAAAA+AAD/AAAAABwAAH8AAAAAAAAAPwAAAAAAAAAfAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAeAAAD8AAAAB8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD//////8AAAP//////wAAA///////AAAD//////8AAAH//////wAAAf//////AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAB8AAAAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////4AAAAAP////wAAAAA/////AAAAAD////8AAAAAP////gAAAAAf4AAAAAAAAD/AAAAAAAAAP4AAAAAAAAA/AAAAAAAAAD4AAAAAAAAAPgAAAAAAAAA////+AAAAAD////8AAAAAH////wAAAAAf////AAAAAA////8AAAAAH////AAAAAA/wAAAAAAAAD+AAAAAAAAAPwAAAAAAAAB+AAAAAAAAAH//wAAAAAAAP////gAAAAA/////AAAAAB////8AAAAAD////wAAAAAD////AAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////+AAAAAD////8AAAAAf////wAAAAA/////AAAAAD////4AAAAAD///+AAAAAAH8AAAAAAAAAfgAAAAAAAAD+AAAAAAAAAfwAAAAAAAAB+AAAAAAAAAP4AAAAAAAAA/AAAAAAAAAD8AAAAAAAAAfgAAAAAAAAB+AAAAAAAAAH4AAAAAAAAAfgAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAP//4AAAAAAA////+AAAAAB////8AAAAAD////wAAAAAH////AAAAAAH///8AAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//wAAAAAAAf//wAAAAAAD///wAAAAAAf///gAAAAAD////AAAAAAf///8AAAAAB/gAf4AAAAAP4AAfwAAAAA/gAA/AAAAAD8AAD8AAAAAfgAAPwAAAAB+AAA/AAAAAH4AAD8AAAAAfgAAPwAAAAB+AAA/AAAAAH4AAD8AAAAAfgAAPwAAAAB+AAA/AAAAAD8AAD8AAAAAPwAAfwAAAAA/gAD+AAAAAB/gAf4AAAAAH////AAAAAAP///8AAAAAAf///gAAAAAA///8AAAAAAA///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////gAAB//////+AAAP//////4AAA///////gAAB//////+AAAB//////gAAAH+AD/gAAAAAfwAH/AAAAAD/AAP8AAAAAf4AAf4AAAAB/AAA/gAAAAH4AAB+AAAAA/AAAH8AAAAD8AAAfwAAAAHwAAB+AAAAAfgAAH4AAAAB/AAA/gAAAAH+AAH+AAAAAP4AA/wAAAAAfwAD+AAAAAA/gA/wAAAAAD///+AAAAAAH///4AAAAAAP///AAAAAAAf//4AAAAAAA//+AAAAAAAAf/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAAAAAAH//8AAAAAAA///8AAAAAAH///4AAAAAA////wAAAAAH////AAAAAAf4AH+AAAAAD+AAH8AAAAAPwAAfwAAAAA/AAA/AAAAAH4AAD8AAAAAfgAAPwAAAAB+AAA/AAAAAH4AAD8AAAAAfgAAPwAAAAA+AAA/AAAAAD8AAD8AAAAAP4AAfwAAAAAfwAD+AAAAAB/gAf4AAAAAD/AD/AAAAAAH+A/4AAAAAD//////4AAAP//////gAAB///////AAAD//////4AAAP//////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////4AAAAAP////wAAAAB/////AAAAAD////8AAAAAP////gAAAAAP///4AAAAAAP8AAAAAAAAB/gAAAAAAAAH8AAAAAAAAA/gAAAAAAAAH8AAAAAAAAA/wAAAAAAAAD+AAAAAAAAAPwAAAAAAAAB+AAAAAAAAAH4AAAAAAAAAfgAAAAAAAAB+AAAAAAAAAH4AAAAAAAAAPwAAAAAAAAA/gAAAAAAAAD/4AAAAAAAAH/wAAAAAAAAf/AAAAAAAAA/8AAAAAAAAA/gAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAH8AB8AAAAAA/4AP4AAAAAH/wA/gAAAAA//gB/AAAAAD//AD8AAAAAP38APwAAAAB+PwA/AAAAAH4fgD8AAAAAfh+APwAAAAB+H8A/AAAAAH4PwD8AAAAAfg/gPwAAAAB+B+A/AAAAAH4H8D8AAAAAfgfwPwAAAAB+A/A/AAAAAH4D+D8AAAAAfgH4PwAAAAB+Afw/AAAAAH8A//8AAAAAPwD//wAAAAA/gH/+AAAAAB+AP/wAAAAAH8Af+AAAAAAPgA/gAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAD4AAAAAAAAAPgAAAAAAAAB+AAAAAAAAAH4AAAAAAAAAfgAAAAAAAH/////wAAAAf/////gAAAB//////AAAAH/////+AAAAf/////8AAAAf/////wAAAAB+AAA/AAAAAH4AAD8AAAAAfgAAPwAAAAB+AAA/AAAAAH4AAD8AAAAAfgAAPwAAAAB+AAA/AAAAAH4AAD8AAAAAfgAAPwAAAAB+AAB/AAAAAD4AAf8AAAAAPgAD/gAAAAAcAAP8AAAAAAAAA/gAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAP///4AAAAAA////4AAAAAD////wAAAAAP////gAAAAAf///+AAAAAAAD//8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAB/AAAAAAAAAH4AAAAAAAAA/gAAAAAAAAH8AAAAAAAAAfwAAAAAAAAD+AAAAAAAAAPwAAAAAA////gAAAAAP////gAAAAA/////AAAAAD////8AAAAAP////wAAAAA////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAA/8AAAAAAAAD/8AAAAAAAAP/+AAAAAAAA//+AAAAAAAB//+AAAAAAAAH/+AAAAAAAAH//AAAAAAAAD//AAAAAAAAD//AAAAAAAAD//AAAAAAAAD/8AAAAAAAAB/wAAAAAAAAB/AAAAAAAAAH8AAAAAAAAD/wAAAAAAAA//AAAAAAAAP/8AAAAAAAH//AAAAAAAB//wAAAAAAAf/4AAAAAAAP/+AAAAAAAf//gAAAAAAD//wAAAAAAAf/8AAAAAAAA//AAAAAAAAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///wAAAAAAD///8AAAAAAP///+AAAAAA////+AAAAAD////8AAAAAAH///wAAAAAAAAP/AAAAAAAAAH8AAAAAAAAB/wAAAAAAAAP/AAAAAAAAD/4AAAAAAA///AAAAAAAH//wAAAAAAAf/8AAAAAAAB//8AAAAAAAH//4AAAAAAAH//4AAAAAAAAH/wAAAAAAAAH/AAAAAAAAAH8AAAAAAAAD/wAAAAAAAf//AAAAAB////8AAAAAP////gAAAAA////8AAAAAD///8AAAAAAP//+AAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAeAAAAAD4AAD8AAAAAPwAAfwAAAAB/gAD/AAAAAD/AAf8AAAAAP+AH/gAAAAAP+A/4AAAAAAf8H/AAAAAAA/4/4AAAAAAB///AAAAAAAD//4AAAAAAAD/+AAAAAAAAH/wAAAAAAAAP+AAAAAAAAB/8AAAAAAAAf/8AAAAAAAD//4AAAAAAAf9/wAAAAAAD/j/gAAAAAAf8H/gAAAAAD/AH/AAAAAA/4AP+AAAAAD/AAf8AAAAAP4AA/wAAAAA/AAB/AAAAADwAAB8AAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAgAAAP/AAAAPgAAA//AAAA+AAAD//AAAD8AAAP//gAAPwAAAf//gAA/AAAAB//gAD8AAAAB//wAPwAAAAA//wA/AAAAAA//gP8AAAAAA//D/wAAAAAAf9/+AAAAAAAf//4AAAAAAA//+AAAAAAAD//gAAAAAAA//4AAAAAAAP/8AAAAAAAD//AAAAAAAA//wAAAAAAAf/8AAAAAAAH/+AAAAAAAB//gAAAAAAP//4AAAAAAA//+AAAAAAAH//AAAAAAAAP/wAAAAAAAA/8AAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAABwAAH8AAAAAPgAA/wAAAAA+AAH/AAAAAH4AA/8AAAAAfgAH/wAAAAB+AA//AAAAAH4AH/8AAAAAfgA//wAAAAB+AH+/AAAAAH4A/z8AAAAAfgH+PwAAAAB+A/w/AAAAAH4H+D8AAAAAfg/wPwAAAAB+H+A/AAAAAH4/wD8AAAAAfn+APwAAAAB+/wA/AAAAAH/+AD8AAAAAf/wAPwAAAAB/+AA/AAAAAH/wAD8AAAAAf+AAPwAAAAA/wAAfAAAAAD+AAB8AAAAAHwAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAHwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD+AAAAAAAAA/+AAAAAAH/////8AAAA//////4AAAH//////gAAA///////AAAD///H//8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAB8AAAHwAAAAHwAAAOAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//////4AAAH//////wAAA///////AAAD//////8AAAH//////gAAAH/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAADgAAAfAAAAAfAAAD8AAAAB8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD8AAAAD8AAAPwAAAAPwAAA/AAAAA/AAAD///H//8AAAH//////wAAAf/////+AAAA//////4AAAB//////AAAAAAD/4AAAAAAAAD+AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAAfAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAB8AAAAAAAAAH4AAAAAAAAA/gAAAAAAAAH8AAAAAAAAAfwAAAAAAAAD+AAAAAAAAAPwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAPwAAAAAAAAA/gAAAAAAAAB+AAAAAAAAAH4AAAAAAAAAfwAAAAAAAAA/AAAAAAAAAD8AAAAAAAAAP4AAAAAAAAAfgAAAAAAAAD+AAAAAAAAAPwAAAAAAAAB/AAAAAAAAAH4AAAAAAAAA/gAAAAAAAAD8AAAAAAAAAPwAAAAAAAAAeAAAAAAAAAAAAAAAA&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;atob&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;JxgiIiIiIxocGiMiHCIaIiIiIiMhIiIiIiIaHCMiIiIiIiIiIiIiIiIiICIiIiIiIyIjIyIiIyMiIiIiIiIiKBwiIyMiIiEiIh8fIh8jIiIiIiIiIiIiIyMjIiIYIiM=&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;exports&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;graphics&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;graphics&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;prototype&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setFontCYBER64&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;scale&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;setFontCustom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;font&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;32&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;64&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;metadata.json&lt;/code&gt; - metadata used by the Bangle.js App Loader.&lt;/p&gt;





  &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;CYBERtime&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;CYBERtime clock&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;shortname&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;CYBERtime&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;icon&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;app.png&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;1.23&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;author&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;martin-hamilton&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;All CYBERs Are Beautiful&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;tags&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;cyber,clock&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;readme&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;supports&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;BANGLEJS2&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;storage&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;CYBERtime.app.js&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;app.js&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;CYBERtime.img&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;app-icon.js&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;evaluate&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;f_cyber60&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;f_cyber60.js&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;f_cyber64&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;f_cyber64.js&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;clock&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/cyber-time/featured-cybertime-actionshot.jpg" />
    </item>
    
    <item>
      <title>There Is No Pre-crime Division</title>
      <link>https://martinh.net/hacks/no-precrime-division/</link>
      <pubDate>Thu, 29 Jan 2026 19:44:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/no-precrime-division/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/38c3-ceiling-petals.jpg&#34;,&#34;\/img\/38c3-cyber-briefcase.jpg&#34;,&#34;\/img\/38c3-internet.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  An open letter to Darren Jones MP, on moving fast and fixing things.
&lt;/div&gt;


&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w40&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;256&#34;
          height=&#34;256&#34;
          src=&#34;https://martinh.net/hacks/no-precrime-division/featured_cctv_hu_d3746e5d7d0f2a89.jpg&#34;
          srcset=&#34;https://martinh.net/hacks/no-precrime-division/featured_cctv_hu_d3746e5d7d0f2a89.jpg 800w,/hacks/no-precrime-division/featured_cctv_hu_a67a09543c37973e.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/hacks/no-precrime-division/featured_cctv.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Moodily lit photo of a CCTV camera which appears to be erupting from some foliage, perhaps abruptly and unexpectedly. For background, and not especially relevant to the picture&amp;hellip; A few years ago I was one of my then employer’s representatives for the UK All-Party Parliamentary Group on Data Analytics. We ran an inquiry that worked with academic experts, privacy activists, industry and the public sector to look at the opportunities and the risks associated with what would now be called “AI”. The group was supported by non-partisan think tank Policy Connect and co-chaired by (then) Tory MP Lee Rowley and Labour’s Darren Jones.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;Dear Darren,&lt;/p&gt;
&lt;p&gt;You probably won’t remember me, but that’s OK. After your recent &lt;a href=&#34;https://www.instituteforgovernment.org.uk/event/modernising-whitehall-deliver-britain&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Move Fast. Fix things&lt;/a&gt; speech I just wanted to take the opportunity to jog your memory about the excellent work that the APPG on Data Analytics did a few years ago on highlighting not just the opportunities presented by machine learning and generative AI, but also potential risks and possible mitigations.&lt;/p&gt;
&lt;p&gt;In case it’s useful, here’s a handy link to &lt;a href=&#34;https://policyconnect.org.uk/report/trust-transparency-and-technology-building-data-policies-public-good/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;the inquiry homepage&lt;/a&gt; and the inquiry’s findings:&lt;/p&gt;

&lt;figure&gt;&lt;a href=&#34;https://policyconnect.org.uk/wp-content/uploads/2020/09/trusttransparentcyandtechreport.pdf&#34; target=&#34;_blank&#34; class=&#34;inline-block&#34;&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w40&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;217&#34;
          height=&#34;307&#34;
          src=&#34;https://martinh.net/img/tttreportfrontcover-724x1024_hu_c55a355d4bbd4b68.jpg&#34;
          srcset=&#34;https://martinh.net/img/tttreportfrontcover-724x1024_hu_c55a355d4bbd4b68.jpg 800w,/img/tttreportfrontcover-724x1024_hu_bbc2964447ccf832.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/tttreportfrontcover-724x1024.jpg&#34;
        /&gt;
  &lt;/a&gt;
  &lt;figcaption&gt;Trust, Transparency and Technology: Building Data Policies for the Public Good - the report produced by the APPG on Data Analytics inquiry&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;Two findings from the APPG’s inquiry are perhaps even more relevant now than when the report was published in 2019:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The need for a public services &lt;strong&gt;licence to operate&lt;/strong&gt; - the report describes this as &lt;em&gt;transparent, standardised ethics rules for public service providers (universities, police, health service, transport) to build for public confidence.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The need for Parliamentary scrutiny to &lt;strong&gt;ensure accountability&lt;/strong&gt; - i.e. built in to systems and processes, rather than bolted on retrospectively in response to a scandal or a tragedy.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As you and Lee wrote in the foreword to the report:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Data-driven technologies are revolutionising the way important decisions are made every day. From our treatment in hospital to students’ educational experience; from how we travel to the way our society is policed; we are increasingly reliant on data to enable modern life. However, these developments have not always been accompanied by openness and accountability about the use of our information. This lack of transparency has led to a growing distrust and suspicion about data and algorithm-based decisions, concerns which must be overcome if we are to exploit the many positive ways that data-based technology can improve people’s lives.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;In your Move Fast speech you called for nothing less than &lt;em&gt;a complete digital transformation of the state&lt;/em&gt;. In that context, it’s incredibly important that these issues of transparency and accountability are addressed.&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;Who Will Watch The Watchers?
    &lt;div id=&#34;who-will-watch-the-watchers&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#who-will-watch-the-watchers&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;Just consider the &lt;a href=&#34;https://www.gov.uk/government/news/white-paper-sets-out-reforms-to-policing&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;White Paper on policing reform&lt;/a&gt;, which states that:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The number of live facial recognition vans will increase five-fold, with 50 vans available to every police force in England and Wales to catch violent and sexual offenders.&lt;/p&gt;
&lt;p&gt;The government will also roll out new artificial intelligence (AI) tools which will help forces identify suspects from CCTV, doorbell and mobile phone footage that has been submitted as evidence by the public.&lt;/p&gt;
&lt;p&gt;A new national centre on AI – Police.AI – will be set up to roll out AI to all forces to free officers from paperwork, delivering up to 6 million hours back to the frontline every year – the equivalent of 3,000 police officers. This means more police on the streets fighting crime and catching criminals.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;As the &lt;a href=&#34;https://www.ft.com/content/c49a4524-e4bd-42f1-aabb-d7b0e50dd0660&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Home Office&lt;/a&gt; acknowledges, we know from numerous studies that there are massive issues with accuracy and algorithmic bias in areas such as facial recognition and predictive analytics aka “pre-crime” policing. It would be reassuring to hear that initiatives like the ones mentioned in the White Paper will include checks and balances to ensure that the efficacy of these technologies is critically evaluated. &lt;strong&gt;The disadvantaged and marginalised communities that have been shown to be most at risk would particularly appreciate this.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Similarly, people having a Ring doorbell put in probably weren’t thinking too much about law enforcement access to their camera footage. And yet in the United States we have already seen these technologies exploited for oppressive purposes - &lt;a href=&#34;https://www.404media.co/tag/flock/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;enabled, however inadvertently, by technology providers like Flock and Amazon&lt;/a&gt;. As with Palantir’s involvement in the MoD and the NHS, we should be asking ourselves whether this is actually a good idea, and who we are really getting in to bed with. &lt;strong&gt;Crucially - what is our threat model if a fascist regime should come to power in the UK?&lt;/strong&gt;&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;Quit Karping
    &lt;div id=&#34;quit-karping&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#quit-karping&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;It would be remiss of me not to highlight that Palantir insist they are in fact &lt;a href=&#34;https://blog.palantir.com/correcting-the-record-response-to-the-eff-january-15-2026-report-on-palantir-4b3a12536cd2&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;jolly nice and extremely trustworthy&lt;/a&gt;, even going so far as to say:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;To be absolutely clear, Palantir is not working on any master database project to unify databases across federal agencies. Palantir has not proposed the US Government build a “master list” for the surveillance of citizens, nor have we been asked to consider building such a system for any customer.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;Furthermore, Palantir founder and CEO Alex Karp is &lt;a href=&#34;https://better.net/money/candid-insights-on-the-future-of-technology-from-palantir-ceo-alex-karp/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;on the record&lt;/a&gt; as saying:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Technology should be built in a way that can be transparent.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;So that’s all good. I for one look forward to hearing more about this radical transparency which Alex is so keen on. Perhaps it will be like the moment in &lt;a href=&#34;https://www.imdb.com/title/tt0105435/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Sneakers (1992)&lt;/a&gt; when the protagonist Marty Bishop discovers that&amp;hellip; &lt;style&gt;
    .content-warning {
        border-radius: 5px;
        text-align: left;
    }

    .content-warning button {
        background-color: #ff4444;
        color: white;
        border: none;
        padding: 10px 15px;
        cursor: pointer;
        border-radius: 5px;
    }

    .hidden-content {
        display: none;
    }
&lt;/style&gt;
&lt;div class=&#34;content-warning&#34;&gt;
    &lt;button onclick=&#34;this.nextElementSibling.style.display=&#39;block&#39;; this.style.display=&#39;none&#39;&#34;&gt;
        ⚠  Spoilers! Click or tap to reveal
    &lt;/button&gt;
    &lt;div class=&#34;hidden-content&#34; style=&#34;display:none;&#34;&gt;
        &lt;strong&gt;No More Secrets&lt;/strong&gt; is in fact the top secret password which will decode all existing encryption systems around the world.
    &lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;You never know with Alex! He’s a bit of a character, as they say…&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Amazon’s Ring tells us that it is &lt;a href=&#34;https://www.theverge.com/news/866003/ring-ice-camera-access-flock&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;completely untrue that the much-reviled ICE has access to the footage from its doorbell cameras&lt;/a&gt;. However, they do mention in passing that &lt;a href=&#34;https://ring.com/support/verified-help/articles/8a2kq/Who-can-set-up-a-Verified-Account&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;local law enforcement access is an entirely different matter&lt;/a&gt;. Cool cool cool. But hey, it’s neat to be able to see who is at the door from the comfort of your armchair, &lt;em&gt;and whether they are wearing body armour.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;But that is all half a world away, at least for the moment.&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;The Doctor Will Scribe You Now
    &lt;div id=&#34;the-doctor-will-scribe-you-now&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#the-doctor-will-scribe-you-now&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;According to i.AI, the UK government’s &lt;a href=&#34;https://ai.gov.uk/our-work/frontline-services/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Incubator for Artificial Intelligence&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Across the public sector, millions of conversations drive essential services in moments that matter: a social care assessment, a hospital appointment, or a meeting with a probation officer. These interactions are where needs are understood, risks are assessed, and decisions are made that can affect someone’s life.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;There has been a lot of talk about using genAI tools to cut down public sector workloads by doing things like transcribing the audio from interviews and appointments, summarising documents and even making decisions about benefits eligibility and medical diagnoses. Is this is part of a controlled trial? Well, kinda sorta. The mood music is very much that this is all inevitable and unstoppable, rather than &lt;em&gt;let’s try a bunch of stuff and see what works&lt;/em&gt; whilst also (crucially) &lt;strong&gt;going to extraordinary lengths to minimise possible harms.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As a case in point, I recently attended a clinic where all of the appointments were being transcribed using an AI tool, but I would have been completely unaware of this had I not happened to spend a few minutes reading the posters on the walls of the clinic while I was waiting to be seen.&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w80&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;1109&#34;
          height=&#34;790&#34;
          src=&#34;https://martinh.net/img/ai-scribe-poster_hu_f1cb6b0aeb65461c.png&#34;
          srcset=&#34;https://martinh.net/img/ai-scribe-poster_hu_f1cb6b0aeb65461c.png 800w,/img/ai-scribe-poster_hu_247d8ee2ae5470c.png 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/ai-scribe-poster.png&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo of the AI Scribe poster, which in fairness has quite a detailed description of how the tool works, how it is meant to be used, and a discussion of privacy and confidentiality aspects. All good, if you happen to spot it. And remember that it is ‘safe if used as directed.’&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;I have so many questions&lt;/th&gt;
          &lt;th&gt;And also answers&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;em&gt;Should my consultant or the appointment letter have mentioned the use of an AI transcription tool which was listening to our conversation?&lt;/em&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Yes.&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;em&gt;Should I have been offered the opportunity to decline?&lt;/em&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Also yes.&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;em&gt;Should I have been advised about the use of the tool and asked for my feedback on the accuracy of the AI-assisted doctor’s notes?&lt;/em&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Absolutely, but I wasn’t.&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;em&gt;Should I have been told where the audio recording of our conversation was being sent and who might have access to it?&lt;/em&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Oh hell yeah.&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;em&gt;Should my NHS Trust have a public page where they describe this initiative and report back on its accuracy and effectiveness?&lt;/em&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Very much so.&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 class=&#34;relative group&#34;&gt;No Thoughts, Only Hallucinations
    &lt;div id=&#34;no-thoughts-only-hallucinations&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#no-thoughts-only-hallucinations&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;Generative AI tools like Large Language Models are inherently non-deterministic. They will literally produce a different result every time you use them, and they will always be prone to “hallucinations” because this is what they do. Everything is a hallucination, but if enough of them seem plausible then we tend to disregard this.&lt;/p&gt;
&lt;p&gt;If you want to be disabused of the supposed power and brilliance of genAI, try asking some questions about a subject that you know very well. And then keep asking “are you sure?”, however confident the bot initially claims to be. The results may surprise you.&lt;/p&gt;
&lt;p&gt;And when it comes to machine learning techniques for predictive analytics in aspects of our lives that can have &lt;strong&gt;profound and life-changing consequences for the individuals involved&lt;/strong&gt;, recall that crime prevention approaches which build on prior data about crime rates in neighbourhoods have been shown time and time again to reinforce structural discrimination such as racial profiling.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;There is no pre-crime division.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Yet.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;And maybe, just maybe, there never should be.&lt;/em&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;p&gt;With my very warmest regards,&lt;/p&gt;
&lt;p&gt;Martin Hamilton&lt;/p&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/no-precrime-division/featured_cctv.jpg" />
    </item>
    
    <item>
      <title>I Stubbed My Bootloader And Lived To Tell The Tale</title>
      <link>https://martinh.net/hacks/zero-boot/</link>
      <pubDate>Sun, 30 Nov 2025 15:58:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/zero-boot/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/38c3-dont-worry-blimp.jpg&#34;,&#34;\/img\/emf2024-laser-lake1.jpg&#34;,&#34;\/img\/emf2024-ledome-with-lasers.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  It all started when a man with a gun sent my laptop flying, while we were travelling at over 100 miles per hour&amp;hellip;
&lt;/div&gt;

&lt;p&gt;This post is mainly my way of documenting my setup for that inevitable moment when I forget how I did it. But more importantly: in an era where computers are increasingly presented as black box appliances with no user serviceable parts, knowing how to tweak system internals is a small act of rebellion. &lt;em&gt;You can remind the computer who is really in charge.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Have you ever sat twiddling your thumbs waiting for your computer to boot, and wondered if you could speed it up even just a little bit? &lt;strong&gt;This one weird trick could be just the thing.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These days (I&amp;rsquo;m writing in November 2025) a typical general purpose computer runs something called &lt;a href=&#34;https://en.wikipedia.org/wiki/UEFI&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Universal Extensible Firmware Interface (UEFI)&lt;/a&gt; when it&amp;rsquo;s powered up or rebooted. UEFI is the descendant of the old &lt;a href=&#34;https://en.wikipedia.org/wiki/BIOS&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Basic Input Output System (BIOS)&lt;/a&gt;. It&amp;rsquo;s responsible for things like initialising hardware, managing Secure Boot keys, boot devices and boot order. Most interestingly, unlike old style BIOS ROMs, UEFI is extensible (that&amp;rsquo;s the &amp;ldquo;E&amp;rdquo;), which means that you can drop in EFI modules which change or extend its functionality.&lt;/p&gt;
&lt;p&gt;One particularly intriguing module is called&amp;hellip; &lt;strong&gt;The Linux Kernel&lt;/strong&gt;. Yes, that&amp;rsquo;s right - the Linux kernel has something called an &lt;a href=&#34;https://docs.kernel.org/admin-guide/efi-stub.html&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;EFI Boot Stub&lt;/a&gt;, which tricks UEFI into booting straight into Linux instead of wasting time doing boring things like starting a conventional bootloader such as &lt;a href=&#34;https://en.wikipedia.org/wiki/GNU_GRUB&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;GRUB&lt;/a&gt;. &lt;em&gt;Caveat: Some UEFI implementations don&amp;rsquo;t get on well with the EFI Boot Stub, so best to check before you get carried away. If your computer lets out the blue smoke, you ain&amp;rsquo;t seen me - right?&lt;/em&gt;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w80&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;1424&#34;
          height=&#34;1068&#34;
          src=&#34;https://martinh.net/hacks/zero-boot/featured-tetrapod-cult-grub-mini_hu_150c3ba0ad4cbcd4.jpg&#34;
          srcset=&#34;https://martinh.net/hacks/zero-boot/featured-tetrapod-cult-grub-mini_hu_150c3ba0ad4cbcd4.jpg 800w,/hacks/zero-boot/featured-tetrapod-cult-grub-mini_hu_95103db4371c0129.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/hacks/zero-boot/featured-tetrapod-cult-grub-mini.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo showing a laptop in a darkened room. Well, mostly the backlit laptop keyboard and the GRUB boot loader screen. The GRUB screen shows an entry for something called Arch GNU/LINUX, along with an ISO 7010 standard cat ear headband sign and the text &amp;lsquo;CAUTION: Safety car ears must be worn in this area&amp;rsquo;. Oh, and there is a 3D tetrapod imprisoned or perhaps protected inside a geodesic dome. The heading at the top of the screen says &amp;lsquo;Tetrapod Cult (Not A Cult) Bootloader Ver -2.13&amp;rsquo;&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;I&amp;rsquo;d been meaning to play with EFI Boot Stub for a while, but my plans got brought forward after a couple of near-misses when my &amp;ldquo;everyday carry&amp;rdquo; laptop got swept off a table onto the floor but emerged miraculously unscathed. One of them was &lt;strong&gt;on a speeding train, when my laptop was knocked off the table by a man with a gun&lt;/strong&gt;. &lt;em&gt;OK, so it turned out that he was on his way to a shooting contest, and the gun was safely tucked away in a fancy case, but still&amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Following &lt;a href=&#34;https://infrastructureclub.org/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Infrastructure Club&lt;/a&gt; recommendations, I decided to get a Chuwi Minibook X as my &lt;strong&gt;Stunt Laptop&lt;/strong&gt; for taking to events and out on trips. Just like UEFI is the logical descendant of the ROM BIOS, the Minibook is what you&amp;rsquo;d get if you tried to make a &amp;ldquo;subnotebook&amp;rdquo; for the 2020s - small and light, very hackable, pretty cheap. However, in fairness it is also not very powerful as it uses an Intel N-series (aka Celeron) processor.&lt;/p&gt;
&lt;p&gt;On this machine I have Arch Linux with my EFI partition mounted as &lt;code&gt;/boot&lt;/code&gt;. It has GRUB installed, with the rolling release Arch kernel &lt;code&gt;vmlinuz-linux&lt;/code&gt;, the Long Term Support kernel &lt;code&gt;vmlinuz-linux-lts&lt;/code&gt;, along with the normal and fallback &lt;a href=&#34;https://en.wikipedia.org/wiki/Initial_ramdisk&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;initramfs&lt;/a&gt; images. My &lt;code&gt;/boot&lt;/code&gt; looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-zsh&#34; data-lang=&#34;zsh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ls -l /boot                        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;total &lt;span class=&#34;m&#34;&gt;87884&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x &lt;span class=&#34;m&#34;&gt;3&lt;/span&gt; root root     &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;14&lt;/span&gt; 22:22 EFI
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x &lt;span class=&#34;m&#34;&gt;6&lt;/span&gt; root root     &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;16&lt;/span&gt; 23:44 grub
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rwxr-xr-x &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; root root   &lt;span class=&#34;m&#34;&gt;159744&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;14&lt;/span&gt; 22:12 grubx64.efi
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rwxr-xr-x &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; root root &lt;span class=&#34;m&#34;&gt;20903355&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;30&lt;/span&gt; 15:38 initramfs-linux-fallback.img
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rwxr-xr-x &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; root root &lt;span class=&#34;m&#34;&gt;20903355&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;30&lt;/span&gt; 15:37 initramfs-linux.img
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rwxr-xr-x &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; root root &lt;span class=&#34;m&#34;&gt;17645477&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;30&lt;/span&gt; 17:25 initramfs-linux-lts.img
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rwxr-xr-x &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; root root &lt;span class=&#34;m&#34;&gt;16445632&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;30&lt;/span&gt; 15:32 vmlinuz-linux
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rwxr-xr-x &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; root root &lt;span class=&#34;m&#34;&gt;13914624&lt;/span&gt; Nov &lt;span class=&#34;m&#34;&gt;30&lt;/span&gt; 17:25 vmlinuz-linux-lts&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;efibootmgr&lt;/code&gt; utility gives you a convenient way to tweak your UEFI settings from the Linux command line. On my Stunt Laptop, adding an EFI Boot Stub entry was as simple as:&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-zsh&#34; data-lang=&#34;zsh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# efibootmgr --create \&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; --disk /dev/nvme0n1 --part &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; --label &lt;span class=&#34;s2&#34;&gt;&amp;#34;Arch Linux (btw)&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; --loader /vmlinuz-linux &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; --unicode &lt;span class=&#34;s1&#34;&gt;&amp;#39;root=UUID=63aeff7d-e7ad-40b9-aa76-8f7c39fdc873 ro loglevel=3 quiet splash video=DSI-1:panel_orientation=right_side_up fbcon=rotate:1 initrd=\initramfs-linux.img&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;On this particular machine, one or both of &lt;code&gt;video=DSI-1:panel_orientation=right_side_up fbcon=rotate:1&lt;/code&gt; is needed because the Minibook hardware uses a tablet screen whose natural orientation is portrait rather than landscape. These magic incantations force it to rotate through 90 degrees into a more readable position.&lt;/p&gt;
&lt;p&gt;On your own machine, the root partition UUID will be different, of course. Alternatively, you could just use the partition label - or the partition device name like I confusingly did with the disk name and the &lt;code&gt;--disk&lt;/code&gt; directive above. Now you should be able to run &lt;code&gt;efibootmgr&lt;/code&gt; with no parameters for a list of your configured boot options. My machine was set to maximum insecurity mode at this point, with removable devices and network boot enabled as well as the EFI Boot Stub and GRUB&amp;hellip;&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-zsh&#34; data-lang=&#34;zsh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# efibootmgr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;BootCurrent: &lt;span class=&#34;m&#34;&gt;0001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Timeout: &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; seconds
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;BootOrder: 0000,0001
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Boot0000* Arch Linux &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;btw&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;	HD&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;1,GPT,18b437b5-c5dc-4a76-97d1-d7bf554b1e49,0x800,0x400000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;/&lt;span class=&#34;se&#34;&gt;\v&lt;/span&gt;mlinuz-linux72006f006f0074003d002f006400
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;650076002f006e0076006d00650030006e00310070003300200072007700200069006e0069007400720064003d005c0069006e0069007400720061006d00660073002d00
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;6c0069006e00750078002e0069006d00670020006600620063006f006e003d0072006f0074006100740065003a003100
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Boot0001* GRUB	HD&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;1,GPT,18b437b5-c5dc-4a76-97d1-d7bf554b1e49,0x800,0x400000&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;/&lt;span class=&#34;se&#34;&gt;\E&lt;/span&gt;FI&lt;span class=&#34;se&#34;&gt;\G&lt;/span&gt;RUB&lt;span class=&#34;se&#34;&gt;\g&lt;/span&gt;rubx64.efi
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Boot0002* UEFI:CD/DVD Drive	BBS&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;129,,0x0&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Boot0003* UEFI:Removable Device	BBS&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;130,,0x0&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Boot0004* UEFI:Network Device	BBS&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;131,,0x0&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If you do have other operating systems and boot loaders installed, then you might need to tweak the UEFI boot order, e.g. this command tells the machine to try &lt;code&gt;Boot0000&lt;/code&gt; first, then &lt;code&gt;Boot0001&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-zsh&#34; data-lang=&#34;zsh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# efibootmgr -o 0,1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Now when you (OK, me) reboot, instead of faffing around loading up GRUB, the machine should &lt;strong&gt;magically boot straight into Linux.&lt;/strong&gt; Yay! This may only save a few seconds per boot, but over time that could add up to &lt;em&gt;minutes or even hours of extra hacking time&amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;On the Minibook, you can also hit F7 at boot time to bring up the built-in UEFI boot menu, which will show you a list of the configured options that you can choose from. With my setup this means you can always boot using GRUB if you need to use a different kernel, change boot time parameters etc.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://wiki.archlinux.org/title/EFI_boot_stub&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Arch Wiki EFI Boot Stub docs&lt;/a&gt; have quite a bit more to say about all of this, so do take a look if your curiousity has been piqued.&lt;/p&gt;
&lt;a
  class=&#34;!rounded-md bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700&#34;
  href=&#34;https://wiki.archlinux.org/title/EFI_boot_stub&#34;
  target=&#34;_self&#34;
  
  role=&#34;button&#34;&gt;
  
Check out the Arch Wiki EFI Boot Stub docs

&lt;/a&gt;

</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/zero-boot/featured-tetrapod-cult-grub-mini.jpg" />
    </item>
    
    <item>
      <title>MartinH.Net Un Limited Privacy Notice</title>
      <link>https://martinh.net/privacy/</link>
      <pubDate>Mon, 10 Nov 2025 11:02:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/privacy/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/emf2024-laser-lake1.jpg&#34;,&#34;\/img\/emf2024-lasers-over-tents.jpg&#34;,&#34;\/img\/emf2024-ledome-and-nullsector.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;



&lt;h1 class=&#34;relative group&#34;&gt;Privacy Notice
    &lt;div id=&#34;privacy-notice&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#privacy-notice&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;MartinH.Net Un Limited is a company limited by guarantee, registered in England.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Company number: 13000057&lt;/li&gt;
&lt;li&gt;ICO registration number: ZA937875&lt;/li&gt;
&lt;li&gt;Registered office: 3rd Floor 86 - 90 Paul Street, London, United Kingdom, EC2A 4NE&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MartinH.Net Un Limited is committed to protecting your privacy. We are the controller of the personal data processed for the purposes set out below and we are responsible for looking after it. This policy explains how we use, store and share the information we collect, how you can exercise your rights in respect of that information and the procedures that we have in place to safeguard your privacy. This policy supplements any other fair processing or privacy notice that may be provided to you from time to time.&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;Contacting us
    &lt;div id=&#34;contacting-us&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#contacting-us&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;We have appointed a data protection officer who can be contacted at &lt;a href=&#34;mailto:dataprotection@martinh.net&#34; &gt;dataprotection@martinh.net&lt;/a&gt;. Please contact us at this email address if you have any questions, comments or concerns about this policy or how we handle your personal data, or if such information changes at any time.&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;What personal data will we collect about you?
    &lt;div id=&#34;what-personal-data-will-we-collect-about-you&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#what-personal-data-will-we-collect-about-you&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;Personal data means any information that relates to an identified or identifiable individual. We have grouped together the kinds of personal data that we may collect below. Additional information about the types of data we collect may be provided to you in other service specific privacy notices.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identity and contact data: includes first name, last name, email address, address and telephone numbers. We may collect this information from you when you contact us or when you request services from us&lt;/li&gt;
&lt;li&gt;Technical and usage data: includes information we obtain from your device or browser (such as IP address, your login data, version and device identifiers, time zone setting and location, browser plug-in types and versions and operating system) as well as how you use our website and services&lt;/li&gt;
&lt;li&gt;Information that we need if you join a research project or receive our services: includes additional information relating to your use of the services or role in the project. We collect this when you use the service or take part in the project&lt;/li&gt;
&lt;li&gt;Information collected when you contact us: includes information in emails and other communications with us, or call recordings when you phone us. This may include the different types of content (eg, photographs, articles, comments) you send to us when contacting us, or through social media accounts with third parties, or any other information that you want to share with us&lt;/li&gt;
&lt;li&gt;Job application information: If you apply for a job with us, we will also collect your application data, which includes your contact information (including name, postal address, email address and phone number), job history, curriculum vitae, contact details of your referees and any other personal information you choose to submit along with your application when applying for a job at MartinH.Net Un Limited&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 class=&#34;relative group&#34;&gt;How do we use your personal data?
    &lt;div id=&#34;how-do-we-use-your-personal-data&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#how-do-we-use-your-personal-data&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;The following section sets out why we process your personal data and also our lawful basis for processing your personal data. We may rely on more than one lawful basis for processing your personal data depending on the context of the processing activity.&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;To provide you with a service that you have requested
    &lt;div id=&#34;to-provide-you-with-a-service-that-you-have-requested&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#to-provide-you-with-a-service-that-you-have-requested&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;The processing is necessary for the performance of a contract with you, or to take steps at your request prior to entering into a contract. It may also be necessary in our legitimate interests (for example, for contract management purposes).&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;To identify problems or ways to make our service better
    &lt;div id=&#34;to-identify-problems-or-ways-to-make-our-service-better&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#to-identify-problems-or-ways-to-make-our-service-better&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;The processing is necessary for our legitimate interests (for example, for running our business, provision of our administration and IT services, network security, and providing a functional website).&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;To run a research project which you are participating in
    &lt;div id=&#34;to-run-a-research-project-which-you-are-participating-in&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#to-run-a-research-project-which-you-are-participating-in&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;This processing is carried out for our legitimate interests (to achieve the purposes of the research project).&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;To contact you about products or services which may be of interest to you or your organisation.
    &lt;div id=&#34;to-contact-you-about-products-or-services-which-may-be-of-interest-to-you-or-your-organisation&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#to-contact-you-about-products-or-services-which-may-be-of-interest-to-you-or-your-organisation&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;This may include processing your personal data to understand what may be of interest to you, or to provide you with marketing materials.	The processing may be necessary for the performance of a contract with you, or to take steps at your request prior to entering into a contract. It may also be necessary in our legitimate interests (for example, to contact you about an event).&lt;/p&gt;
&lt;p&gt;You will receive marketing communications from us if you have requested information from us or you (or your organisation) have purchased or contacted us about similar goods or services. We may do this where we determine that this is necessary for our legitimate interests. We may also send you marketing communications when you have given your consent for us to do so.&lt;/p&gt;
&lt;p&gt;You can opt-out of receiving marketing communications from us or withdraw your consent at any time.&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;To respond to your requests for information, complaints or feedback
    &lt;div id=&#34;to-respond-to-your-requests-for-information-complaints-or-feedback&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#to-respond-to-your-requests-for-information-complaints-or-feedback&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;The processing is necessary for the performance of a contract with you, or to take steps at your request prior to entering into a contract. It may also be necessary in our legitimate interests (for example, to improve our relationship with you or your organisation or to improve our services).&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;To comply with laws and to respond to and comply with requests from the government, regulators and other third parties with legal authority
    &lt;div id=&#34;to-comply-with-laws-and-to-respond-to-and-comply-with-requests-from-the-government-regulators-and-other-third-parties-with-legal-authority&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#to-comply-with-laws-and-to-respond-to-and-comply-with-requests-from-the-government-regulators-and-other-third-parties-with-legal-authority&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;The processing is necessary to comply with a legal obligation.&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;To provide evidence where this is required to exercise or defend legal claims
    &lt;div id=&#34;to-provide-evidence-where-this-is-required-to-exercise-or-defend-legal-claims&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#to-provide-evidence-where-this-is-required-to-exercise-or-defend-legal-claims&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;The processing is necessary in our legitimate interests (for example, to defend ourselves against a legal claim that you or your organisation may make against us).&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;To investigate, detect and prevent fraud or crime and carry out related risk assessments
    &lt;div id=&#34;to-investigate-detect-and-prevent-fraud-or-crime-and-carry-out-related-risk-assessments&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#to-investigate-detect-and-prevent-fraud-or-crime-and-carry-out-related-risk-assessments&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;The processing is necessary to comply with a legal obligation.&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;To consider your application for a job
    &lt;div id=&#34;to-consider-your-application-for-a-job&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#to-consider-your-application-for-a-job&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;The processing is necessary to comply with a legal requirement. This processing is also necessary to take steps at your request prior to entering into an employment contract with you. The processing will also be necessary in our legitimate interests (for example, to ensure you have appropriate qualifications for the job).&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;Legitimate interests
    &lt;div id=&#34;legitimate-interests&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#legitimate-interests&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;In certain circumstances, we will process your personal data based on our legitimate interests. We have decided this by carrying out a balancing exercise to make sure our legitimate interest does not override your privacy rights as an individual. We document the balancing exercises that we carry out when relying upon this lawful basis for processing your personal data.&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;Security
    &lt;div id=&#34;security&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#security&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;We have in place appropriate policies, rules, and technical and organisational measures to protect your personal data from unauthorised or unlawful processing, and against accidental loss, destruction or damage. We also have procedures in place to deal with any data security breach. We will notify you and any applicable regulator of a data security breach where we are legally required to do so.&lt;/p&gt;
&lt;p&gt;Even though we take these steps to keep your personal data secure, you should be aware that the use of the internet is not entirely secure and for this reason we cannot guarantee the security or integrity of any personal information which is transferred from you or to you via the internet. If you have a username or password to access any services that we provide to you, you are responsible for protecting your username and password and must not share it with, or disclose it, to anyone.&lt;/p&gt;
&lt;p&gt;If you want you to learn more about how to protect your data and your devices against fraud, identity theft, viruses and many other online problems, please visit &lt;a href=&#34;https://www.getsafeonline.org&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;www.getsafeonline.org&lt;/a&gt;.&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;Sharing your personal data
    &lt;div id=&#34;sharing-your-personal-data&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#sharing-your-personal-data&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;We will only disclose your personal data to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Companies within our group&lt;/li&gt;
&lt;li&gt;A third party who has purchased or merged with our organisation, in which case personal data held by us about you will be transferred to that third party to carry on our business&lt;/li&gt;
&lt;li&gt;Our professional advisors (including without limitation, tax, legal or other corporate advisors who provide professional services to us)&lt;/li&gt;
&lt;li&gt;Other third party suppliers, business partners and sub-contractors for business administration, support, processing, services, or IT purposes&lt;/li&gt;
&lt;li&gt;Analytics or search engines that enable us to optimise and improve your website experience&lt;/li&gt;
&lt;li&gt;Third parties that you approve (including without limitation, social media sites and third party payment providers)&lt;/li&gt;
&lt;li&gt;Our regulators, law enforcement or fraud prevention agencies, as well as our legal advisers, courts, the police and any other authorised bodies, for the purposes of investigating any actual or suspected criminal activity or other regulatory or legal matters&lt;/li&gt;
&lt;li&gt;HMRC or other tax bodies or agencies to comply with our legal and regulatory obligations&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 class=&#34;relative group&#34;&gt;International transfers of your personal data
    &lt;div id=&#34;international-transfers-of-your-personal-data&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#international-transfers-of-your-personal-data&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;We may transfer your personal data to countries outside the United Kingdom in order to provide our services. The laws in these countries may not offer the same level of protection for personal data as in the United Kingdom.&lt;/p&gt;
&lt;p&gt;If we transfer personal data to countries outside of the United Kingdom, we will do so in a lawful way and may rely on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An adequacy decision from the Secretary of State, which says that the recipient country provides an adequate level of protection of personal data&lt;/li&gt;
&lt;li&gt;Appropriate safeguards to protect the personal data (for example, the approved standard contractual clauses or international data transfer agreement)&lt;/li&gt;
&lt;li&gt;A lawful exception to the rules relating to overseas data transfers (for example, the transfer is necessary to perform a contract with you, which is in your interests)&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 class=&#34;relative group&#34;&gt;How long will we keep your personal data?
    &lt;div id=&#34;how-long-will-we-keep-your-personal-data&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#how-long-will-we-keep-your-personal-data&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;We will only retain your personal data for as long as necessary to fulfil the purposes we collected it for, including for the purposes of satisfying any legal, accounting, or reporting requirements.&lt;/p&gt;
&lt;p&gt;To determine the appropriate retention period for personal data, we consider the amount, nature, and sensitivity of the personal data, the potential risk of harm from unauthorised use or disclosure of your personal data, the purposes for which we process your personal data and whether we can achieve those purposes through other means, and the applicable legal requirements.&lt;/p&gt;
&lt;p&gt;In some circumstances you can ask us to delete your personal data. Please see below for more information about your right to erasure.&lt;/p&gt;
&lt;p&gt;In some circumstances we may anonymise your personal data (so that it can no longer be associated with you) for research or statistical purposes.&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;Your rights
    &lt;div id=&#34;your-rights&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#your-rights&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;You have certain rights in relation to your personal data. We have summarised these rights below:&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;To be informed
    &lt;div id=&#34;to-be-informed&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#to-be-informed&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;A right to be informed about the personal data we hold about you.&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;Of access
    &lt;div id=&#34;of-access&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#of-access&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;A right to access the personal data we hold about you.&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;To rectification
    &lt;div id=&#34;to-rectification&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#to-rectification&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;A right to require us to rectify any inaccurate personal data we hold about you.&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;To erasure
    &lt;div id=&#34;to-erasure&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#to-erasure&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;A right to ask us to delete the personal data we hold about you. This right will only apply where (for example):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We no longer need to use the personal data to achieve the purpose we collected it for&lt;/li&gt;
&lt;li&gt;Where you withdraw your consent if we are using your personal data based on your consent&lt;/li&gt;
&lt;li&gt;Where you object to the way we process your data (see the right to object described below)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class=&#34;relative group&#34;&gt;To restrict processing
    &lt;div id=&#34;to-restrict-processing&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#to-restrict-processing&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;In certain circumstances, a right to restrict our processing of the personal data we hold about you. This right will only apply where (for example):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You dispute the accuracy of the personal data held by us&lt;/li&gt;
&lt;li&gt;Where you would have the right to ask us to delete the personal data but would prefer that our processing is restricted instead&lt;/li&gt;
&lt;li&gt;Where we no longer need to use the personal data to achieve the purpose we collected it for, but you need the data for the purposes of establishing, exercising or defending legal claims&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class=&#34;relative group&#34;&gt;To data portability
    &lt;div id=&#34;to-data-portability&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#to-data-portability&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;In certain circumstances, a right to receive the personal data you have given us, in a structured, commonly used and machine readable format. You also have the right to require us to transfer this personal data to another organisation, at your request.&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;To object
    &lt;div id=&#34;to-object&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#to-object&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;A right to object to our processing of the personal data we hold about you where our lawful basis is for the purpose of our legitimate interests, unless we are able to demonstrate, on balance, legitimate grounds for continuing to process the personal data which override your rights or which are for the establishment, exercise or defence of legal claims.&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;In relation to automated decision-making and profiling
    &lt;div id=&#34;in-relation-to-automated-decision-making-and-profiling&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#in-relation-to-automated-decision-making-and-profiling&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;A right for you not to be subject to a decision based solely on an automated process, including profiling, which produces legal effects concerning you or similarly significantly affects you.&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;To withdraw
    &lt;div id=&#34;to-withdraw&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#to-withdraw&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;A right to withdraw your consent, where we are relying on it to use your personal data (for example, to provide you with brochures and newsletters). &lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;To complain
    &lt;div id=&#34;to-complain&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#to-complain&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;You have the right to make a complaint to our supervisory authority, which is the UK&amp;rsquo;s Information Commissioner&amp;rsquo;s Office.&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;Contacting us
    &lt;div id=&#34;contacting-us-1&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#contacting-us-1&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;If you would like to contact us with any queries or comments, request further information or exercise any of your available rights set out above, please email us at: &lt;a href=&#34;mailto:dataprotection@martinh.net&#34; &gt;dataprotection@martinh.net&lt;/a&gt;. If you would like this notice in another format please contact us using the details above.&lt;/p&gt;
&lt;p&gt;We encourage you to contact us first if you have any queries, comments or concerns about the way we handle your personal data.&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;Changes to this policy
    &lt;div id=&#34;changes-to-this-policy&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#changes-to-this-policy&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;Any changes to this policy in the future will be posted on the MartinH.Net Un Limited company website. Please check back frequently to see any updates or changes to this policy.&lt;/p&gt;
&lt;p&gt;Please note: this policy does not cover third party websites that we may link to from our website and we are not responsible for the privacy policies and practices (including use of cookies) of such third parties. We recommend that you check the policy of each website you visit and contact the owner or operator of such website if you have concerns or questions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Last updated: 10th November 2025&lt;/strong&gt;&lt;/p&gt;
</description>
      
    </item>
    
    <item>
      <title>Don&#39;t Let The Slime Train Leave You Behind</title>
      <link>https://martinh.net/hacks/slime-train/</link>
      <pubDate>Thu, 16 Oct 2025 19:58:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/slime-train/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/cccamp2023-tree-ring-and-star.jpg&#34;,&#34;\/img\/emf2024-ledome-with-lasers.jpg&#34;,&#34;\/img\/emfcamp2022-inflatable-tentacles1.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  aka How Dare You Challenge The Dominant Narrative?!
&lt;/div&gt;

&lt;p&gt;Do you have a friend, colleague or family member who has started behaving strangely? Are you worried that they might have been recruited into a cult? &lt;em&gt;No, not the so-called Tetrapod Cult, which definitely does not exist and is not a real thing in our timeline.&lt;/em&gt;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w100&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;1123&#34;
          height=&#34;794&#34;
          src=&#34;https://martinh.net/img/no-tetrapod-cult_hu_7a8251971547f762.png&#34;
          srcset=&#34;https://martinh.net/img/no-tetrapod-cult_hu_7a8251971547f762.png 800w,/img/no-tetrapod-cult_hu_aeec230a48772912.png 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/no-tetrapod-cult.png&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo showing six brightly coloured DIY plush tetrapods on a wooden table in a field somewhere in the Low Countries. Above the adorable friend-shaped items are the words &amp;rsquo;there is no tetrapod cult&amp;rsquo; in the OCR-A font, which was the custom at the time and is also very CYBER.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;Phew! Now we&amp;rsquo;ve got &lt;em&gt;that&lt;/em&gt; out of the way&amp;hellip;&lt;/p&gt;
&lt;p&gt;Perhaps you know the kind of cult I&amp;rsquo;m thinking about. Maybe there is some kind of new technomagical solution being talked up by the same grifters who were all over previous hype waves like blockchain, web3, NFTs and the &amp;ldquo;metaverse&amp;rdquo;? Now, barely pausing for breath, they have seamlessly pivoted to &lt;strong&gt;AI&lt;/strong&gt;^H^H &lt;strong&gt;quantum&lt;/strong&gt;^H^H &lt;strong&gt;slime mold&lt;/strong&gt; computing. Yep, that&amp;rsquo;s it - &lt;em&gt;slime molds are the new hotness&lt;/em&gt;. It&amp;rsquo;s time to get onboard the slime train, or you&amp;rsquo;ll be left behind and everyone will be pointing and laughing at you.&lt;/p&gt;
&lt;p&gt;You can tell when something is a cult because it becomes impossible to question. It is simply inevitable, at least as far as people who have been brainwashed by the cult (or are using it for personal advancement) are concerned. Any problematic aspects are transitory and irrelevant. And anyway - everyone else is doing it, so &lt;strong&gt;don&amp;rsquo;t let the slime train leave you behind.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This is, inevitably, a post about generative AI and Large Language Models.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In the last couple of years I&amp;rsquo;ve found myself at a number of events where AI True Believers wax lyrical about the imagined benefits and sure-fire inevitability of our neon-lit and not at all dystopian cyberpunk AI future. Of course the beauty of &amp;ldquo;AI&amp;rdquo; is that it can mean whatever you want it to, which was really quite a stretch for some other recent bubbles like the unfortunately named Non-Fungible Tokens. &lt;strong&gt;Reader, they were So Very Fungible. They are by now Almost Entirely Funged.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s pretty much impossible to reason with someone whose entire identity, image, self-worth (or actual wealth and status) is inextricably wrapped up with a movement whose whole premise is based on beliefs rather than facts or evidence - basically, &lt;em&gt;putting the vibes in vibe coding.&lt;/em&gt; But what you can potentially do is influence the other people in the room who are not fully paid-up cult members. After all, they have yet to fully commit their future and (crucially) their wallet to &lt;strong&gt;$THE_SHINY_NEW_THING&lt;/strong&gt;. There is still hope for them. For now.&lt;/p&gt;
&lt;p&gt;Here are a few examples of deceptively simple questions which you don&amp;rsquo;t need to be a cyberpunk technomancer like me to ask, and which stand some chance of cutting through. Maybe you can think of more? Let me know&amp;hellip;&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;Reflections On Trusting Trust
    &lt;div id=&#34;reflections-on-trusting-trust&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#reflections-on-trusting-trust&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;We hear a lot about &amp;ldquo;trustworthy AI&amp;rdquo;. But, we also hear that hallucinations are inevitable because LLMs are essentially autocomplete on steroids, and LLM outputs are non-deterministic - they literally come up with different stuff each time you ask them a question. OK, so they can seem quite plausible - until you ask them about something you know a lot about, then the cracks really start to show.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QUESTION: Can something with so many trivial and devastating failure modes ever truly be &amp;ldquo;trustworthy&amp;rdquo;?&lt;/strong&gt; &lt;em&gt;(and this is before we get onto the infosec disaster area that is Model Context Protocol)&lt;/em&gt;&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;The Only Way Is Ethics
    &lt;div id=&#34;the-only-way-is-ethics&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#the-only-way-is-ethics&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;Another common trope from AI boosters is that &amp;ldquo;ethical AI&amp;rdquo; is possible somehow. Possibly because if we keep using the phrase &amp;ldquo;ethical AI&amp;rdquo; enough, then people will start to believe that some kind of Magical Ethical Thing is taking place somewhere &lt;em&gt;(you wouldn&amp;rsquo;t know where, the Magical Ethical Thing goes to a different where)&lt;/em&gt; that will negate the by now very well publicised genAI harms. We are ethical now, you see. We said so. So it must be true. &lt;strong&gt;Spoilers: The AI was not in fact ethical by any conventional definition of the term.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Harms, what harms? You know the ones, but let&amp;rsquo;s just list a few for fun: &lt;em&gt;(not actually fun)&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pushing up electricity prices, leaving human communities unable to afford power.&lt;/li&gt;
&lt;li&gt;Leaching the humans&amp;rsquo; water supply for cooling and spewing out pollution.&lt;/li&gt;
&lt;li&gt;Helping themselves to whatever they can find on the Internet, whether or not they have permission from the humans who created it.&lt;/li&gt;
&lt;li&gt;Destroying human livelihoods by being just-good-enough &lt;em&gt;(not actually good enough, if we&amp;rsquo;re honest)&lt;/em&gt; to replace real living people like artists and translators.&lt;/li&gt;
&lt;li&gt;Brutalising the humans involved in labelling and reinforcement learning work.&lt;/li&gt;
&lt;li&gt;Destroying the open web by agressive crawling and encouraging enclosure of the digital commons.&lt;/li&gt;
&lt;li&gt;Facilitating the slopocalypse of garbage AI generated websites, harrassment via deepfakes etc.&lt;/li&gt;
&lt;li&gt;Accelerating the enshittification of practically every product and service you can think of.&lt;/li&gt;
&lt;li&gt;Conning people to do harms to themselves and others due to the entirely false idea that the AI really is &amp;ldquo;intelligent&amp;rdquo; and &amp;ldquo;thinks&amp;rdquo; and &amp;ldquo;knows&amp;rdquo; stuff, rather than (in reality) stringing statistically likely words and phrases together into a Digital Soup of Truthiness.&lt;/li&gt;
&lt;li&gt;Advancing the agenda of the worst people in the world. &lt;em&gt;You know who.&lt;/em&gt; We&amp;rsquo;ll come back to them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is conceivable that even the most ardent bot fondler might reluctantly accept that it could be a tiny bit difficult to wave a Magical AI Wand and make &lt;em&gt;all&lt;/em&gt; the bad stuff go away.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QUESTION: If we keep boosting the bots, then aren&amp;rsquo;t we saying (in essence): Well, it&amp;rsquo;s a shame about the catastrophic harms, but we don&amp;rsquo;t really care that much - so let&amp;rsquo;s just pretend it&amp;rsquo;s all good. OK?&lt;/strong&gt;&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;Mecha-Hitler Will See You Now
    &lt;div id=&#34;mecha-hitler-will-see-you-now&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#mecha-hitler-will-see-you-now&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;Let&amp;rsquo;s imagine that you have decided to pursue your cursed genAI project in spite of the above. There&amp;rsquo;s just one small problem - the &amp;ldquo;AI bros&amp;rdquo; are some of the worst people in the world. It&amp;rsquo;s as though every time you write the inevitable Python program to do your Magical AI Thing, you add the following line at the top&amp;hellip;&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;fascism&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Not &amp;ldquo;just messing about&amp;rdquo; fascism, or &amp;ldquo;poking fun at the libs&amp;rdquo; fascism. This is the real deal - we&amp;rsquo;re talking about people who just can&amp;rsquo;t seem to stop making public statements in support of evil and despotic regimes, actively working to destablise democratically elected governments, and facilitating online abuse and harrassment. Sometimes they even throw cheeky Roman Salutes (LOL!) and tell their chatbot to call itself Mecha-Hitler.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QUESTION: If we embrace genAI from fascists, doesn&amp;rsquo;t that make us a Nazi bar?&lt;/strong&gt; &lt;em&gt;(and let&amp;rsquo;s not even get started on &amp;ldquo;ethics&amp;rdquo; and &amp;ldquo;trust&amp;rdquo;)&lt;/em&gt;&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;We Have AI At Home
    &lt;div id=&#34;we-have-ai-at-home&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#we-have-ai-at-home&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;It&amp;rsquo;s OK, though, because we can burn vast amounts of carbon training our own foundation AI model. This will be fantastic and transformational because we will know and control key aspects like training data, model weights and system prompts. The AI bros seem strangely reluctant to talk about a lot of this stuff &lt;em&gt;for some reason&lt;/em&gt;, but we don&amp;rsquo;t need them now because we have Tech Sovereignty.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s great that we can visit the AI sausage factory and inspect the ingredients for ourselves. However, our foundation model will still rely on datasets like Common Crawl, which is already hopelessly polluted with genAI slop. As the saying goes: garbage in, garbage out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QUESTION: So how can we avoid model collapse, the AI equivalent of Mad Cow Disease?&lt;/strong&gt;&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;Failure Is (Not?) An Option
    &lt;div id=&#34;failure-is-not-an-option&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#failure-is-not-an-option&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;The language of the AI boosters might be all about disruption and innovation, &amp;ldquo;accelerating adoption&amp;rdquo; of genAI through things like testbeds, trials and prototypes. The only thing is, these words and phrases imply (at least tacitly) that failure is possible. Perhaps, just maybe, genAI won&amp;rsquo;t actually work for some use cases? Maybe later, maybe never.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QUESTION: Before we bet the planet on genAI, won&amp;rsquo;t it be super important to track progress and figure out which (if any) trials and testbeds produce more good than they do harm?&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;typeit-8bfcff9e137985ec2fd47c28430803a6&#34;&gt;&lt;/h1&gt;

&lt;script&gt;
    document.addEventListener(&#34;DOMContentLoaded&#34;, function () {
      var strings = [&#34;&#34;,&#34;Remain calm. Everything will be fine.&#34;,&#34;&#34;];
      
      new TypeIt(&#34;#typeit-8bfcff9e137985ec2fd47c28430803a6&#34;, {
        strings: strings,
        speed:  100 ,
        lifeLike:  true ,
        startDelay:  0 ,
        breakLines:  true ,
        waitUntilVisible:  true ,
        loop:  false 
      }).go();
    });
&lt;/script&gt;

&lt;p&gt;At the time of writing in October 2025, genAI is showing every sign of blowing up the global economy with results that will be at least as spectacular as the Dot Com crash or the Global Financial Crisis of 2008. We don&amp;rsquo;t know exactly how big the crater will be, but there will certainly be room in it for all the people who uncritically promoted genAI in spite of the obvious harms and hazards. &lt;em&gt;Enjoy your crater. It&amp;rsquo;s your hole. You&amp;rsquo;ve earned it!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Meanwhile I hope someone remembers to keep an eye on the slime mold, with their 720 sexes and their self-healing. I have a feeling they might be up to something&amp;hellip;&lt;/strong&gt;&lt;/p&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/slime-train/featured-tetrapod-cult.png" />
    </item>
    
    <item>
      <title>Shepherd&#39;s Bush Has Been Cancelled</title>
      <link>https://martinh.net/hacks/shepherds-bush-has-been-cancelled/</link>
      <pubDate>Sat, 04 Oct 2025 11:04:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/shepherds-bush-has-been-cancelled/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/38c3-ceiling-petals.jpg&#34;,&#34;\/img\/38c3-cyber-briefcase.jpg&#34;,&#34;\/img\/38c3-internet.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  When your Strudel has a Nudel
&lt;/div&gt;

&lt;p&gt;In the morning, while I wait for my ADHD meds to kick in, I like to play around a bit with technology to see what kinds of bizarre and improbable things I can make it do. &lt;em&gt;In case you hadn&amp;rsquo;t noticed&amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s one I made earlier:&lt;/p&gt;
&lt;figure&gt;
&lt;video controls preload=&#34;auto&#34; width=&#34;100%&#34;  playsinline class=&#34;html-video&#34;&gt;
    &lt;source src=&#34;https://martinh.net/hacks/shepherds-bush-has-been-cancelled/shepherds-bush-has-been-cancelled.webm&#34; type=&#34;video/webm&#34;&gt;
  &lt;span&gt;&lt;/span&gt;
&lt;/video&gt;
&lt;figcaption&gt;Short blurry video clip of Nudel session featuring ScotRail announcements which have been variously speeded up and slowed down, to a jaunty backing track and Hydra visualisation. The announcer appears to be saying that Shepherd&amp;rsquo;s Bush has been cancelled, but will anyone notice? That is the question&amp;hellip;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; I&amp;rsquo;ll be the first to acknowledge that at this point in time it&amp;rsquo;s entirely rational for anyone involved in tech to &lt;em&gt;set it all on fire and then decamp to a log cabin in the woods&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;However, tech can still be fun and exciting, and do weird and interesting things. I&amp;rsquo;m particularly interested in generative (algorithmic, not &lt;em&gt;the other generative&lt;/em&gt;) music and visuals, devices that you can poke and prod (like the RP2040, RP2350 and ESP32 family of microcontrollers), and run whatever code you want to on - without having to get permission from tech billionaires or government agencies.&lt;/p&gt;
&lt;p&gt;Basically,&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;██╗  ██╗ █████╗  ██████╗██╗  ██╗                   
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;██║  ██║██╔══██╗██╔════╝██║ ██╔╝                   
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;███████║███████║██║     █████╔╝                    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;██╔══██║██╔══██║██║     ██╔═██╗                    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;██║  ██║██║  ██║╚██████╗██║  ██╗                   
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;╚═╝  ╚═╝╚═╝  ╚═╝ ╚═════╝╚═╝  ╚═╝                   
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                                   
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;████████╗██╗  ██╗███████╗                          
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;╚══██╔══╝██║  ██║██╔════╝                          
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   ██║   ███████║█████╗                            
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   ██║   ██╔══██║██╔══╝                            
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   ██║   ██║  ██║███████╗                          
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   ╚═╝   ╚═╝  ╚═╝╚══════╝                          
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                                   
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;██████╗ ██╗      █████╗ ███╗   ██╗███████╗████████╗
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;██╔══██╗██║     ██╔══██╗████╗  ██║██╔════╝╚══██╔══╝
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;██████╔╝██║     ███████║██╔██╗ ██║█████╗     ██║   
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;██╔═══╝ ██║     ██╔══██║██║╚██╗██║██╔══╝     ██║   
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;██║     ███████╗██║  ██║██║ ╚████║███████╗   ██║   
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;╚═╝     ╚══════╝╚═╝  ╚═╝╚═╝  ╚═══╝╚══════╝   ╚═╝   &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;A while ago I came across &lt;a href=&#34;https://www.matteason.co.uk/scotbeats/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Matt Eason&amp;rsquo;s Ambient ScotRail Beats&lt;/a&gt;, which mashes up randomly generated ScotRail railway announcements with &amp;ldquo;lo fi beats&amp;rdquo; sourced from Teh Interwebs. I was curious about how this worked, and discovered that the announcements you hear at the train station are constructed from lots of little bits like &lt;em&gt;We apologise for&lt;/em&gt; and &lt;em&gt;Kidderminster&lt;/em&gt;. There&amp;rsquo;s no need to apologise for Kidderminster, by the way. It&amp;rsquo;s all grown up now and needs to start taking responsibility for its own actions.&lt;/p&gt;
&lt;p&gt;On further investigation, it turned out that the audio clips had been made available from ScotRail themselves and could be accessed via &lt;a href=&#34;https://github.com/matteason/scotrail-announcements-june-2022&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;a popular LLM training platform&lt;/a&gt;. The clips had been catalogued by a cast of thousands (potentially!) via crowdsourcing on a formerly well-liked social network for bird-fanciers, with a nice &lt;a href=&#34;https://scotrail.datasette.io/scotrail&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;web-based search interface&lt;/a&gt; created by the inevitable &lt;a href=&#34;https://simonwillison.net/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Simon Willison&lt;/a&gt; as part of the &lt;a href=&#34;https://datasette.io/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Datasette&lt;/a&gt; project.&lt;/p&gt;
&lt;p&gt;In the past I&amp;rsquo;ve posted about &lt;a href=&#34;https://martinh.net/hacks/algorave-cyberbag/&#34; &gt;attending my first algorave&lt;/a&gt;, and since then I&amp;rsquo;ve been dabbling from time to time with making little tunes using &lt;a href=&#34;https://strudel.cc/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;the Strudel live coding platform&lt;/a&gt;, and visuals with the &lt;a href=&#34;https://hydra.ojack.xyz/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Hydra video synthesizer&lt;/a&gt;. You can get amazing results with these tools on even the most modest hardware - basically anything that will run a reasonably modern web browser.&lt;/p&gt;
&lt;p&gt;Most people using tools like this are probably just messing around and having fun, but it&amp;rsquo;s starting to feel increasingly like something that could go mainstream. I mean, check out this song by &lt;a href=&#34;https://djdave.xyz/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;DJ_Dave&lt;/a&gt;:&lt;/p&gt;
&lt;lite-youtube videoid=&#34;ure6OT0LwtM&#34; playlabel=&#34;ure6OT0LwtM&#34; params=&#34;&#34;&gt;&lt;/lite-youtube&gt;

&lt;p&gt;From my perspective part of the beauty of the live coding and algorave culture is that people routinely share their noodlings and remix things that other people have created. It feels like an &lt;em&gt;open by default&lt;/em&gt; culture, although key tools like Strudel and Hydra are open source, and you could host them yourself without having to share anything with anyone.&lt;/p&gt;
&lt;p&gt;Perhaps the apotheosis of this is &lt;a href=&#34;https://nudel.cc&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Nudel&lt;/a&gt;, the collaborative livecoding environment. Anyone can plonk themselves down in Nudel and start making noises and/or visuals by editing or writing new code - it&amp;rsquo;s like a perpetual jam session, potentially involving Raspberry (Pi). And by default, everyone is a member of virtual supergroup &lt;a href=&#34;https://www.pastagang.cc/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;pastagang&lt;/a&gt;. I am pastagang. You are pastagang. &lt;strong&gt;We are all pastagang&lt;/strong&gt;. &lt;em&gt;Except some of us just don&amp;rsquo;t know it yet&amp;hellip;&lt;/em&gt;&lt;/p&gt;

  
  
  
  



&lt;div
  
    class=&#34;flex px-4 py-3 rounded-md shadow&#34; style=&#34;background-color: #5f0000&#34;
  
  &gt;
  &lt;span
    
      class=&#34;text-primary-400 pe-3 flex items-center&#34;
    
    &gt;
    &lt;span class=&#34;relative block icon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 512 512&#34;&gt;&lt;path fill=&#34;currentColor&#34; d=&#34;M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z&#34;/&gt;&lt;/svg&gt;
&lt;/span&gt;
  &lt;/span&gt;

  &lt;span
    
      class=&#34;dark:text-neutral-300&#34;
    
    &gt;&lt;strong&gt;Warning!&lt;/strong&gt; Algorave cognitohole ahead. Approach with caution&amp;hellip;&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;It can be a bit overwhelming to begin with, but thankfully there are lots of tutorials and examples to work, and my personal favourite - really enthusiastic people like Strudel contributor &lt;a href=&#34;https://linktr.ee/switchangel&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Switch Angel&lt;/a&gt; who love to share what they have learned and built. Even if you never write a line of code, it&amp;rsquo;s hard not to get swept away by their energy and excitement&amp;hellip;&lt;/p&gt;
&lt;lite-youtube videoid=&#34;qKZXQGCLRJY&#34; playlabel=&#34;qKZXQGCLRJY&#34; params=&#34;&#34;&gt;&lt;/lite-youtube&gt;

&lt;p&gt;But let&amp;rsquo;s get back to ScotRail. What if we could snarf a few samples from the public collection and use them in a tune? Maybe we could speed them up and slow them down, and &amp;ldquo;scrub&amp;rdquo; snippets from the samples rather than playing the whole thing. And this is how Shepherd&amp;rsquo;s Bush was Cancelled&amp;hellip;&lt;/p&gt;


&lt;iframe src=&#34;https://martinh.net/strudel/#YXdhaXQgaW5pdEh5ZHJhKCkKCi8vIGluc2VydGluZyBsYXNlcnMgYW5kIGdlb2Rlc2ljIGRvbWVzCnMwLmluaXRWaWRlbygnaHR0cHM6Ly9tYXJ0aW5oLm5ldC9yZW1peC9jYW1waW5nLm1wNCcpCnNyYyhzMCkKICAua2FsZWlkKDMpCiAgLnJvdGF0ZSgoKT0%2BTWF0aC5zaW4odGltZSotMC4zKSkKICAuc2NhbGUoMC41LCgpPT5NYXRoLnNpbih0aW1lKjEuNSkpCiAgLm91dChvMSkKCi8vIGFkZGluZyBzbGFjaywgdmlhIHRoZSBjaHVyY2ggb2YgdGhlIHN1Ymdlbml1cwpzMS5pbml0SW1hZ2UoJ2h0dHBzOi8vbWFydGluaC5uZXQvcmVtaXgvYm9iLnBuZycpCnNyYyhzMSkKICAucm90YXRlKCgpPT5NYXRoLnNpbih0aW1lKjAuMikpCiAgLnNjYWxlKDAuNSwoKT0%2BTWF0aC5zaW4odGltZSowLjYpKQogIC5tdWx0KG8xLDEuMikKICAub3V0KG8yKQpyZW5kZXIobzIpCgovLyB3aXRoIGFwb2xvZ2llcyB0byBzY290cmFpbCwgbWF0dCBlYXNvbiBldGMKYXdhaXQgc2FtcGxlcyh7CiAgJ3JhbmRvbS1hcG9sb2d5JzogJ2h0dHBzOi8vbWFydGluaC5uZXQvcmVtaXgvMTQ4OC5tcDMnLAogICdzaGVwaGVyZHMtYnVzaCc6ICdodHRwczovL21hcnRpbmgubmV0L3JlbWl4LzA0NDMubXAzJywKICAnaGFzLWJlZW4tY2FuY2VsbGVkJzogJ2h0dHBzOi8vbWFydGluaC5uZXQvcmVtaXgvMDM0MC5tcDMnLAp9KQoKJDogcygicmFuZG9tLWFwb2xvZ3lAMTYgfiB%2BIH4gfiBzaGVwaGVyZHMtYnVzaEA0IH4gIikKICAuc2NydWIoInswLjE6MiEtMS41QDIgLjI1OjFAMSAwLjc6MS4yITAuNSA8MC44OjEuNT59JTgiKQogIC5zcGVlZChyYW5kLnJhbmdlKDAuNSwxLjUpKQoKJDogcygic2hlcGhlcmRzLWJ1c2hANCBoYXMtYmVlbi1jYW5jZWxsZWRAMTIgfiB%2BIH4gfiIpCiAgLmdhaW4oMS4xKQogIC5zcGVlZChyYW5kLnJhbmdlKDAuNSwxLjUpKQoKJDogcygicmFuZG9tLWFwb2xvZ3kiKQogIC5jaG9wKDE2KQogIC5zcGVlZChyYW5kLnJhbmdlKDAuMiwwLjUpKQoKLy8gdHJhbnNpZW50IHJhbmRvbSBub2lzZSBidXJzdHMsIGFubm91bmNlbWVudHMgYWxyZWFkeSBjb3ZlcmVkIGFib3ZlCiQ6IHMoImRlbGlnaHQiKQogIC5jaG9wKDE2KQogIC5jdXQoNSkKICAuc29tZXRpbWVzQnkoLjUscGx5KCIyIikpCiAgLmZpdCgpCiAgLmhwZigwKQogIC5nYWluKDEuNSkKICAucm9vbSguNCkKICAucm9vbXNpemUoLjMpCgokOiBzb3VuZCgiYmQqMiw8d2hpdGUgcGluayBicm93bioyPiA8d2hpdGUgcGluaz4gPGJyb3duKjI%2BKjgiKQogIC5kZWNheSguMDQpCiAgLnN1c3RhaW4oMCkKICAuX3Njb3BlKCkKICAKJDogcygiZ21fdGVsZXBob25lIH4gfiBnbV9meF9nb2JsaW5zQDIiKQogIC5zY3J1YigiezAuMSEyIC4yNUAzIDAuNyEyIDwwLjg6MS41Pn0lOCIpCiAgLnNwZWVkKHJhbmQucmFuZ2UoMC41LDIuNSkpCiAgLmdhaW4ocmFuZC5yYW5nZSgwLjUsNCkpCiAgLnNjb3BlKCkKCi8vIGxpYmVyYXRlZCBmcm9tIHRoZSBkZW4gb2YgbXMgY29waWxvdCBpbiB0aGUgc3RlYWx0aCBvZiBkYXJrbmVzcwphd2FpdCBzYW1wbGVzKCdodHRwczovL21hcnRpbmgubmV0L3JlbWl4L2NsZWFuLWJyZWFrcy9zdHJ1ZGVsLmpzb24nKQokOiBzKCJhbWVuLzQiKQogIC5maXQoKQogIC5jaG9wKDE2KQogIC5jdXQoMSkKICAuZ2FpbigxLjUpCiAgLnNvbWV0aW1lc0J5KC41LCBwbHkoIjIiKSkK&#34; style=&#34;width:65vw;height:80vh;&#34; scrolling=&#34;yes&#34;&gt;
If you can&#39;t see this, your browser is probably blocking IFRAMEs. Try &lt;a href src=&#34;https://martinh.net/strudel/#YXdhaXQgaW5pdEh5ZHJhKCkKCi8vIGluc2VydGluZyBsYXNlcnMgYW5kIGdlb2Rlc2ljIGRvbWVzCnMwLmluaXRWaWRlbygnaHR0cHM6Ly9tYXJ0aW5oLm5ldC9yZW1peC9jYW1waW5nLm1wNCcpCnNyYyhzMCkKICAua2FsZWlkKDMpCiAgLnJvdGF0ZSgoKT0%2BTWF0aC5zaW4odGltZSotMC4zKSkKICAuc2NhbGUoMC41LCgpPT5NYXRoLnNpbih0aW1lKjEuNSkpCiAgLm91dChvMSkKCi8vIGFkZGluZyBzbGFjaywgdmlhIHRoZSBjaHVyY2ggb2YgdGhlIHN1Ymdlbml1cwpzMS5pbml0SW1hZ2UoJ2h0dHBzOi8vbWFydGluaC5uZXQvcmVtaXgvYm9iLnBuZycpCnNyYyhzMSkKICAucm90YXRlKCgpPT5NYXRoLnNpbih0aW1lKjAuMikpCiAgLnNjYWxlKDAuNSwoKT0%2BTWF0aC5zaW4odGltZSowLjYpKQogIC5tdWx0KG8xLDEuMikKICAub3V0KG8yKQpyZW5kZXIobzIpCgovLyB3aXRoIGFwb2xvZ2llcyB0byBzY290cmFpbCwgbWF0dCBlYXNvbiBldGMKYXdhaXQgc2FtcGxlcyh7CiAgJ3JhbmRvbS1hcG9sb2d5JzogJ2h0dHBzOi8vbWFydGluaC5uZXQvcmVtaXgvMTQ4OC5tcDMnLAogICdzaGVwaGVyZHMtYnVzaCc6ICdodHRwczovL21hcnRpbmgubmV0L3JlbWl4LzA0NDMubXAzJywKICAnaGFzLWJlZW4tY2FuY2VsbGVkJzogJ2h0dHBzOi8vbWFydGluaC5uZXQvcmVtaXgvMDM0MC5tcDMnLAp9KQoKJDogcygicmFuZG9tLWFwb2xvZ3lAMTYgfiB%2BIH4gfiBzaGVwaGVyZHMtYnVzaEA0IH4gIikKICAuc2NydWIoInswLjE6MiEtMS41QDIgLjI1OjFAMSAwLjc6MS4yITAuNSA8MC44OjEuNT59JTgiKQogIC5zcGVlZChyYW5kLnJhbmdlKDAuNSwxLjUpKQoKJDogcygic2hlcGhlcmRzLWJ1c2hANCBoYXMtYmVlbi1jYW5jZWxsZWRAMTIgfiB%2BIH4gfiIpCiAgLmdhaW4oMS4xKQogIC5zcGVlZChyYW5kLnJhbmdlKDAuNSwxLjUpKQoKJDogcygicmFuZG9tLWFwb2xvZ3kiKQogIC5jaG9wKDE2KQogIC5zcGVlZChyYW5kLnJhbmdlKDAuMiwwLjUpKQoKLy8gdHJhbnNpZW50IHJhbmRvbSBub2lzZSBidXJzdHMsIGFubm91bmNlbWVudHMgYWxyZWFkeSBjb3ZlcmVkIGFib3ZlCiQ6IHMoImRlbGlnaHQiKQogIC5jaG9wKDE2KQogIC5jdXQoNSkKICAuc29tZXRpbWVzQnkoLjUscGx5KCIyIikpCiAgLmZpdCgpCiAgLmhwZigwKQogIC5nYWluKDEuNSkKICAucm9vbSguNCkKICAucm9vbXNpemUoLjMpCgokOiBzb3VuZCgiYmQqMiw8d2hpdGUgcGluayBicm93bioyPiA8d2hpdGUgcGluaz4gPGJyb3duKjI%2BKjgiKQogIC5kZWNheSguMDQpCiAgLnN1c3RhaW4oMCkKICAuX3Njb3BlKCkKICAKJDogcygiZ21fdGVsZXBob25lIH4gfiBnbV9meF9nb2JsaW5zQDIiKQogIC5zY3J1YigiezAuMSEyIC4yNUAzIDAuNyEyIDwwLjg6MS41Pn0lOCIpCiAgLnNwZWVkKHJhbmQucmFuZ2UoMC41LDIuNSkpCiAgLmdhaW4ocmFuZC5yYW5nZSgwLjUsNCkpCiAgLnNjb3BlKCkKCi8vIGxpYmVyYXRlZCBmcm9tIHRoZSBkZW4gb2YgbXMgY29waWxvdCBpbiB0aGUgc3RlYWx0aCBvZiBkYXJrbmVzcwphd2FpdCBzYW1wbGVzKCdodHRwczovL21hcnRpbmgubmV0L3JlbWl4L2NsZWFuLWJyZWFrcy9zdHJ1ZGVsLmpzb24nKQokOiBzKCJhbWVuLzQiKQogIC5maXQoKQogIC5jaG9wKDE2KQogIC5jdXQoMSkKICAuZ2FpbigxLjUpCiAgLnNvbWV0aW1lc0J5KC41LCBwbHkoIjIiKSkK&#34;&gt;going directly to my self-hosted Strudel site&lt;/a&gt; instead.
&lt;/iframe&gt;


</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/shepherds-bush-has-been-cancelled/featured-algorithmic-nonsense.png" />
    </item>
    
    <item>
      <title>Air Quality Monitoring Powered By Cat Ears</title>
      <link>https://martinh.net/hacks/katzenohren-sto%C3%9Fl%C3%BCften/</link>
      <pubDate>Sun, 06 Jul 2025 15:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/katzenohren-sto%C3%9Fl%C3%BCften/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/38c3-dont-worry-blimp.jpg&#34;,&#34;\/img\/38c3-internet.jpg&#34;,&#34;\/img\/38c3-torus-reflections.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  To Lüften, or not to Lüften? That is the CO₂ question. Let&amp;rsquo;s check the ears.
&lt;/div&gt;

&lt;p&gt;If you&amp;rsquo;ve met me in person any time in the last few years, you might have seen me whip out a little gadget and stare at it obsessively as various strange graphics appear on the screen. &lt;em&gt;But that&amp;rsquo;s enough about my phone&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This is a post about a Do-It-Yourself air quality monitoring badge that I use when I&amp;rsquo;m out and about to help me understand what the air quality is like. If you would like to try making your own badge, there should be enough info here to get you started.&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w80&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;768&#34;
          height=&#34;1024&#34;
          src=&#34;https://martinh.net/hacks/katzenohren-sto%C3%9Fl%C3%BCften/featured-co2_hu_81fe8be2cd93b55d.jpg&#34;
          srcset=&#34;https://martinh.net/hacks/katzenohren-sto%C3%9Fl%C3%BCften/featured-co2_hu_81fe8be2cd93b55d.jpg 800w,/hacks/katzenohren-sto%C3%9Fl%C3%BCften/featured-co2_hu_673ed129e97c3a45.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/hacks/katzenohren-sto%C3%9Fl%C3%BCften/featured-co2.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Moodily lit photo of an electronic badge, displaying an ISO 7010 standard safety sign which depicts a person&amp;rsquo;s head in white on a blue background. The person is wearing a respirator and what appear to be Personal Protective Cat Ears. Under the graphic is some white text indicating that the CO₂ (Carbon Dioxide) reading is 1542 PPM and the temperature is 19°C with 60% relative humdity. There is also an event lanyard with a design that may be familiar to some readers. Let&amp;rsquo;s just say it Might Cause Happiness.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;This is something like the fifth or sixth generation air quality monitoring badge that I&amp;rsquo;ve made in the years since COVID entered our lives. It&amp;rsquo;s also the one which (I hope) is least likely to result in an &lt;strong&gt;unexpected trip to the Special Room&lt;/strong&gt; if you bring it through a border security check. No guarantees, though!&lt;/p&gt;
&lt;p&gt;As you may have surmised I had decided to display some colour coded images to make it easier to tell at a glance what the air quality was like. Helpfully, &lt;a href=&#34;https://commons.wikimedia.org/wiki/Main_Page&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Wikimedia Commons&lt;/a&gt; has a whole section of public domain &lt;a href=&#34;https://commons.wikimedia.org/wiki/Category:ISO_7010_safety_signs_%28vector_drawings%29&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;ISO 7010 safety signs&lt;/a&gt;, like these:&lt;/p&gt;


  
  
  &lt;div class=&#34;width-patch&#34;&gt;&lt;/div&gt;
&lt;div id=&#34;gallery-f868dd72c9730a56e714900c2cb20e47&#34; class=&#34;gallery&#34;&gt;
  
  &lt;img src=&#34;https://martinh.net/img/ISO_7010_E068.jpg&#34; class=&#34;grid-w30 md:grid-w30 xl:grid-w30&#34; /&gt;
  &lt;img src=&#34;https://martinh.net/img/ISO_7010_W041s.jpg&#34; class=&#34;grid-w30 md:grid-w30 xl:grid-w30&#34; /&gt;
  &lt;img src=&#34;https://martinh.net/img/ISO_7010_M017_cat.jpg&#34; class=&#34;grid-w30 md:grid-w30 xl:grid-w30&#34; /&gt;
&lt;/figure&gt;
&lt;figcaption&gt;
Three ISO 7010 inspired safety signs. The first one shows a lifebuoy with a light and smoke generator (E068) on a green background. It looks distinctly as though the lifebuoy has arms which are holding these up. The second shows a person sat on the floor leaning slightly forwards with lots of little black dots in the air around them (W041) on a yellow background. The third (M017) we have already discussed. Hmm, were those cat ears part of the ISO standard?
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Here are some action shots:&lt;/p&gt;


  
  &lt;div class=&#34;width-patch&#34;&gt;&lt;/div&gt;
&lt;div id=&#34;gallery-0aa711067fff409d5e36f445f4e6a9a3&#34; class=&#34;gallery&#34;&gt;
  
  &lt;img src=&#34;https://martinh.net/img/tufty-green.jpg&#34; class=&#34;grid-w45 md:grid-w45 xl:grid-w45&#34; /&gt;
  &lt;img src=&#34;https://martinh.net/img/tufty-amber.jpg&#34; class=&#34;grid-w45 md:grid-w45 xl:grid-w45&#34; /&gt;
&lt;figure&gt; &lt;figcaption&gt; 
Two photos of the badge running the air quality monitoring code. The first photo shows the reading in a well-ventilated lecture theatre space where the CO₂ is 657 PPM and the badge is displaying the lifebuoy graphic. The second photo shows a stuffier setting where the CO₂ level is 1227 and the badge shows the person sat on the floor surrounded by black specks in the air.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Incidentally, if you like would like a regular drip feed of international standard safety signs in your feed (and if we&amp;rsquo;re honest, who wouldn&amp;rsquo;t?), Sam from Hacks&amp;rsquo;R&amp;rsquo;Us has set up a lovely &lt;a href=&#34;https://hacksrus.xyz/users/iso7010&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;fediverse ISO 7010 safety signs bot&lt;/a&gt;.&lt;/p&gt;
&lt;a
  class=&#34;!rounded-md bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700&#34;
  href=&#34;https://hacksrus.xyz/users/iso7010&#34;
  
  
  role=&#34;button&#34;&gt;
  
Follow the ISO 7010 safety signs bot

&lt;/a&gt;

&lt;p&gt;So how does an air quality monitor work? We&amp;rsquo;ll need a sensor, a microcontroller to read and process the sensor data, and some way to communicate to the user. Oh, and a power source, like a rechargeable battery or a USB cable with a power source to plug it into. For this device I was interested in monitoring CO₂ levels, which are a useful way to understand how well ventilated an indoor space is. Poorly ventilated spaces are statistically more likely to be sources of respiratory infections, so it&amp;rsquo;s good to be able to quickly check. Other sensors are available for things like particulates (PM2.5 and PM10) and volatile organic compounds (VOCs).&lt;/p&gt;
&lt;p&gt;There are two sorts of CO₂ sensor - some of them estimate the CO₂ levels, and some are &amp;ldquo;true CO₂ sensors&amp;rdquo; which claim a much higher degree of accuracy. I used a version of the Sensirion SCD41 true CO₂ sensor which comes with a STEMMA QT / Qwiic connector, made by Pimoroni, Sheffield&amp;rsquo;s &lt;strong&gt;Primary Provider for Piratical Projects&lt;/strong&gt;. To keep things simple I plugged the sensor into Pimoroni&amp;rsquo;s Tufty2040 badge, which handily combines a Raspberry Pi 2040 microcontroller with a screen, buttons and STEMMA/Qwiic connector:&lt;/p&gt;


  
  &lt;div class=&#34;width-patch&#34;&gt;&lt;/div&gt;
&lt;div id=&#34;gallery-7416720458b5c12df713b1305620055f&#34; class=&#34;gallery&#34;&gt;
  
  &lt;img src=&#34;https://martinh.net/img/tufty-guts.jpg&#34; class=&#34;grid-w45 md:grid-w45 xl:grid-w45&#34; /&gt;
  &lt;img src=&#34;https://martinh.net/img/tufty-rear.jpg&#34; class=&#34;grid-w45 md:grid-w45 xl:grid-w45&#34; /&gt;
&lt;figure&gt; &lt;figcaption&gt; Two photos of the &#34;finished&#34; badge. The first photo shows how the air quality sensor and the battery attach to the Tufty 2040. The second photo shows the back of the device. I&#39;ve 3D printed a back plate to protect and contain the badge&#39;s delicate innards, including holes for attaching a lanyard. There are also some magnets to hold the case closed, and someone has added a Good Enough quality control sticker. The air quality sensor protrudes through a crudely fashioned hole cut into the back plate.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;If you wanted to make one of these yourself, you&amp;rsquo;d need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pimoroni Tufty 2040 badge&lt;/li&gt;
&lt;li&gt;Pimoroni Sensirion SCD41 sensor breakout&lt;/li&gt;
&lt;li&gt;JST-SH to JST-SH cable to connect the sensor to the badge&lt;/li&gt;
&lt;li&gt;Battery with JST-PH connector&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Optional quality control sticker, magnets, back plate etc&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Be aware that the Tufty 2040 doesn&amp;rsquo;t have Wifi, Bluetooth or an SD card, so your options are limited if you wanted to save, upload or further process the sensor readings. &lt;strong&gt;Other boards are also available :-)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My memory is hazy about the 3D printed backplate, but I &lt;em&gt;think&lt;/em&gt; I adapted &lt;a href=&#34;https://www.thingiverse.com/thing:5945346&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;a model created by Henrique Salvador&lt;/a&gt; to make it a bit thinner. There are quite a few &lt;a href=&#34;https://www.yeggi.com/q/tufty2040/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;printable cases for the Tufty 2040&lt;/a&gt; out there on teh interwebs, if this one doesn&amp;rsquo;t quite work for you.&lt;/p&gt;
&lt;p&gt;And here&amp;rsquo;s my hacky Python script to read the sensor data output the readings and choose which image to display. It also incorporates a little animated bar graph widget which I found somewhere in the Tuftyverse. As ever, this is not intended to be correct or complete, and I&amp;rsquo;m confident there are a myriad of ways it could be done better, simpler etc&amp;hellip;&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;from picographics import PicoGraphics, DISPLAY_TUFTY_2040, PEN_RGB332
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import time, math, random, gc
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;from pimoroni import BREAKOUT_GARDEN_I2C_PINS
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import breakout_scd41
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;from pimoroni_i2c import PimoroniI2C
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import jpegdec
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import gc
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;i2c&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; PimoroniI2C&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;**BREAKOUT_GARDEN_I2C_PINS&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;breakout_scd41.init&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;i2c&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;breakout_scd41.start&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;display&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; PicoGraphics&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;DISPLAY_TUFTY_2040,rotate&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;90&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;jpg&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; jpegdec.JPEG&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;display&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;BACKLIGHT&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; 0.5
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;display.set_backlight&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;BACKLIGHT&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;WIDTH, &lt;span class=&#34;nv&#34;&gt;HEIGHT&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; display.get_bounds&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;WHITE&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; display.create_pen&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;255, 255, 255&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;BLACK&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; display.create_pen&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0, 0, 0&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;YELLOW&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ORANGE&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;RED&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;MAGENTA&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;VIOLET&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;BLUE&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CYAN&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;14&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;GREEN&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;def bargraph&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;ox, oy, w, h, value, colors, &lt;span class=&#34;nv&#34;&gt;pips&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;32&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;step&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; int&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;pips / len&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;colors&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;filled&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; int&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;value * pips&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;pip_width&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; int&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;w / pips&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; i in range&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;pips&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; colors&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;int&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;i / step&lt;span class=&#34;o&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        display.set_pen&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;p&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; i * pip_width
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; i &amp;gt; filled:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            display.rectangle&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;ox + x, oy + h - 1, pip_width - 2, 1&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            display.rectangle&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;ox + x, oy, pip_width - 2, h&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;co2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;temperature&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;humidity&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; True:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; time.ticks_ms&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; / 1000.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    display.set_pen&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;display.create_pen&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;50, 50, 70&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    display.clear&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;TEXT_COLOUR&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; WHITE
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;filename&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;old_filename&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ISO_7010_E068.jpg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    jpg.open_file&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ISO_7010_E068.jpg&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    jpg.decode&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0,0&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    display.set_font&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;bitmap8&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    display.set_pen&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;TEXT_COLOUR&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; breakout_scd41.ready&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        print&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;sensor ready&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        try:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            co2, temperature, &lt;span class=&#34;nv&#34;&gt;humidity&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; breakout_scd41.measure&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        except:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            print&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;sensor error - skipping&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    display.text&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;CO2:&amp;#34;&lt;/span&gt;, 20, 255, 22&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    display.text&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;str&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;int&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;co2&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;, 60, 255, 22&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    display.text&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Temp:&amp;#34;&lt;/span&gt;, 120, 255, 18&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    display.text&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;str&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;int&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;temperature&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;, 180, 255, 18&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    display.text&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Hum:&amp;#34;&lt;/span&gt;, 120, 275, 18&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    display.text&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;str&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;int&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;humidity&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;, 180, 275, 18&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; co2 &amp;lt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; 400:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;filename&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ISO_7010_E068.jpg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        print&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;co2: %d ppm - let&amp;#39;s be honest, you&amp;#39;re probably outside right now!&amp;#34;&lt;/span&gt; % &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;co2&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;elif&lt;/span&gt; co2 &amp;gt; &lt;span class=&#34;m&#34;&gt;400&lt;/span&gt; and co2 &amp;lt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; 800: 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;filename&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ISO_7010_E068.jpg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        print&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;co2: %d ppm - good for a well ventilated indoor space&amp;#34;&lt;/span&gt; % &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;co2&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;elif&lt;/span&gt; co2 &amp;gt; &lt;span class=&#34;m&#34;&gt;800&lt;/span&gt; and co2 &amp;lt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; 1500:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;filename&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ISO_7010_W041s.jpg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        print&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;co2: %d ppm - poor air quality, need to get some ventilation&amp;#34;&lt;/span&gt; % &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;co2&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;filename&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ISO_7010_M017_cat.jpg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        print&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;co2: %d ppm - danger level, N95 mask recommended (cat ears optional)&amp;#34;&lt;/span&gt; % &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;co2&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; filename !&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; old_filename:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        jpg.open_file&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;filename&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        jpg.decode&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0,0&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;old_filename&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; filename
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        print&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;changed image&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    print&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;updated&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; v3 in range&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;1,30&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        bargraph&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;10, 300, 230, 8, &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;v3/30&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;, &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;VIOLET, BLUE, CYAN, GREEN&lt;span class=&#34;o&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        display.update&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        time.sleep&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;1&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    display.set_pen&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;BLACK&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    display.rectangle&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;10, 300, 230, 8&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    display.set_pen&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;WHITE&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    gc.collect&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;And if you got this far and are still wondering about Lüften, this is the German practice of airing out rooms by opening all the windows for a short time. Yes, &lt;em&gt;of course the Germans have a word for it!&lt;/em&gt; See also Querlüften (cross-ventilation) and my personal favourite: &lt;a href=&#34;https://web.archive.org/web/20231230110629/https://www.thelocal.de/20190117/stolften&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Stoßlüften - shock ventilation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So basically: Katzenohren? ⇒ Stoßlüften!&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w10&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;265&#34;
          height=&#34;265&#34;
          src=&#34;https://martinh.net/img/iso7010_cat_ears_icon_hu_4d521281b0b8b58c.png&#34;
          srcset=&#34;https://martinh.net/img/iso7010_cat_ears_icon_hu_4d521281b0b8b58c.png 800w,/img/iso7010_cat_ears_icon_hu_405d8eed874c760d.png 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/iso7010_cat_ears_icon.png&#34;
        /&gt;
  
  &lt;figcaption&gt;Cat ear headband icon, in the style of the ISO 7010 safety signs.&lt;/figcaption&gt;
  &lt;/figure&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/katzenohren-sto%C3%9Fl%C3%BCften/featured-co2.jpg" />
    </item>
    
    <item>
      <title>Excitable Magnetosphere Fiesta 2024</title>
      <link>https://martinh.net/hacks/excitable-magnetosphere-fiesta/</link>
      <pubDate>Mon, 16 Jun 2025 20:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/excitable-magnetosphere-fiesta/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/emfcamp2022-inflatable-tentacles2.jpg&#34;,&#34;\/img\/emfcamp2022-isopod-gentle-sign.jpg&#34;,&#34;\/img\/emfcamp2022-stars-and-tree.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;p&gt;Like many I was excited to read &lt;a href=&#34;https://www.herefordtimes.com/news/20026701.herefordshires-four-day-geekfest-back-four-years/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;the Hereford Times coverage of EMF 2022&lt;/a&gt;. Sadly they don&amp;rsquo;t seem to have written an article about EMF 2024.&lt;/p&gt;
&lt;p&gt;Not to be deterred, I enlisted the help of a cybernetic cub reporter who never sleeps (handy for covering breaking news!), needs to be fed new &amp;ldquo;training data&amp;rdquo; constantly, and only consumes as much electricity as a small country. Let&amp;rsquo;s call them &lt;strong&gt;Chatty, the Global Plagiarism Transmitter&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Chatty has compiled this handy roundup for your delectation, rigorously checking every last detail for factual accuracy using state-of-the-art techniques like &lt;em&gt;Radically Arbitrary Guesswork (RAG)&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;But now Chatty is hungry. So &lt;em&gt;very&lt;/em&gt; hungry. &lt;strong&gt;&lt;em&gt;Chatty must feed.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  Inflatable Tentacles, Giant Spiders and Glowing Gadgets: EMF Festival Transforms Eastnor Park
&lt;/div&gt;

&lt;p&gt;The rolling grounds of Eastnor Castle Deer Park were anything but quiet this past weekend, as the normally serene corner of Herefordshire played host to the &lt;strong&gt;Excitable Magnetosphere Fiesta (EMF)&lt;/strong&gt; festival – a gathering equal parts science fair, hacker camp, and surreal technological fever dream.&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w75&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;1600&#34;
          height=&#34;2263&#34;
          src=&#34;https://martinh.net/hacks/excitable-magnetosphere-fiesta/emf2024-poster_hu_d7fe424ff8d1ad9e.png&#34;
          srcset=&#34;https://martinh.net/hacks/excitable-magnetosphere-fiesta/emf2024-poster_hu_d7fe424ff8d1ad9e.png 800w,/hacks/excitable-magnetosphere-fiesta/emf2024-poster_hu_3a413cbfb8711ad6.png 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/hacks/excitable-magnetosphere-fiesta/emf2024-poster.png&#34;
        /&gt;
  
  &lt;figcaption&gt;Poster for something calling itself Excitable Magnetosphere Fiesta 2024. The graphic shows three ambulatory triffid type creatures which appear to be menacing some large and small stick figure people. The people have taken shelter on top of a handy geodesic dome. Another stick figure person is desperately scrambling up an ISO7010 standard escape ladder onto the dome to avoid the plants&amp;rsquo; venomous stingers. In the background an aurora is making sinisterly beautiful other-worldly patterns in the night sky. Get &lt;a href=&#34;emfcamp2024-poster.svg&#34; &gt;your own editable copy of the poster in SVG format&lt;/a&gt; suitable for use with &lt;a href=&#34;https://inkscape.org/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Inkscape&lt;/a&gt;. Unlike the rest of this post, the picture was created by a human being using traditional artisanal techniques, building somewhat clumsily on the excellent work of &lt;a href=&#34;https://www.emfcamp.org/about/branding&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;the fabulous EMF design team&lt;/a&gt;.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;Billed as a &lt;em&gt;temporary town for curious minds,&lt;/em&gt; EMF drew more than 3,000 attendees from across the UK and beyond, pitching up an entire fibre-connected pop-up village over the bank holiday weekend. But this was no ordinary camping trip.&lt;/p&gt;
&lt;p&gt;Towering above the tent city were &lt;strong&gt;inflatable purple tentacles&lt;/strong&gt;, writhing lazily in the breeze, emerging from marquees that housed soldering workshops, laser cutter labs, and late-night talks on quantum computing. A &lt;strong&gt;giant robotic spider&lt;/strong&gt;, lovingly cobbled together from aluminium, servos, and what looked suspiciously like an old washing machine drum, patrolled one of the footpaths — to the equal delight and terror of children and grown-up engineers alike.&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;A Glowing Technopolis, Powered by Curiosity
    &lt;div id=&#34;a-glowing-technopolis-powered-by-curiosity&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#a-glowing-technopolis-powered-by-curiosity&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;At the centre of it all was the iconic EMF badge – not a mere lanyard, but a fully programmable electronic device given to every attendee, complete with Wi-Fi, a display screen, and ports for &lt;em&gt;hexpansions&lt;/em&gt;. These were used to activate interactive installations, join impromptu games, or — in one case — control a 10-foot LED squid suspended over the bar.&lt;/p&gt;
&lt;p&gt;Connectivity was king: organisers laid down more than 5km of fibre-optic cable, beaming in a &lt;strong&gt;40 Gbit/s internet backbone&lt;/strong&gt; to support everything from live-streamed rocket launches to a fully networked electronic escape room.&lt;/p&gt;
&lt;p&gt;“It’s like a Glastonbury for nerds,” one first-time camper from Leominster quipped, as they queued for a talk on the ethics of AI surveillance — directly opposite a tent screening 1980s B-movies dubbed by voice synthesizers.&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;What About the Orphan Sources?
    &lt;div id=&#34;what-about-the-orphan-sources&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#what-about-the-orphan-sources&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;EMF wouldn’t be EMF without its quirks — and this year’s &lt;em&gt;Orphan Source Village&lt;/em&gt; did not disappoint. While fully compliant with radiation safety regulations, it offered a tongue-in-cheek dive into nuclear science, from Geiger counter building tutorials to glow-in-the-dark isotopic art installations.&lt;/p&gt;
&lt;p&gt;Organisers, all volunteers, were keen to stress that no actual hazardous materials were present. &amp;ldquo;The only fallout here is from people&amp;rsquo;s ideas when they stay up too late soldering,&amp;rdquo; said site safety coordinator Alice Kepler, gesturing toward a cloud of dry ice enveloping a &lt;em&gt;DIY cloud chamber.&lt;/em&gt;&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;Local Impact and Legacy
    &lt;div id=&#34;local-impact-and-legacy&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#local-impact-and-legacy&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;While the event is largely self-contained — bringing its own power grid, water tanks, and even an &lt;em&gt;on-site hairdresser with a soldering-iron-themed mirror&lt;/em&gt; — EMF’s presence in Herefordshire did not go unnoticed. Local businesses reported a spike in footfall, and several residents were seen wandering the site, seemingly drawn in by the promise of &lt;em&gt;quantum computing explained with puppets.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Herefordshire Council had previously granted a temporary events license, with minimal objections. One councillor described the festival as “the kind of madness we ought to see more of.”&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;What&amp;rsquo;s Next?
    &lt;div id=&#34;whats-next&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#whats-next&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;With planning already underway for the 2026 edition, EMF organisers are scouting possible upgrades: &lt;em&gt;autonomous drone coffee delivery&lt;/em&gt;, an expanded village for amateur radio operators, and possibly &lt;em&gt;an entire stage shaped like a Raspberry Pi&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;One thing&amp;rsquo;s certain: whether you&amp;rsquo;re into circuit boards or chaotic creativity, EMF is unlike anything else in the country.&lt;/p&gt;
&lt;p&gt;As one camper wrote on the LED message wall:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Come for the lasers, stay for the people, leave with a robot that makes toast.&lt;/strong&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h1 id=&#34;typeit-cbda0ab80eb8d5237b5486cca4ae713b&#34;&gt;&lt;/h1&gt;

&lt;script&gt;
    document.addEventListener(&#34;DOMContentLoaded&#34;, function () {
      var strings = [&#34;&#34;,&#34;Postscript: Chatty is Hungry. Chatty Must Feed.&#34;,&#34;&#34;];
      
      new TypeIt(&#34;#typeit-cbda0ab80eb8d5237b5486cca4ae713b&#34;, {
        strings: strings,
        speed:  100 ,
        lifeLike:  true ,
        startDelay:  0 ,
        breakLines:  true ,
        waitUntilVisible:  true ,
        loop:  false 
      }).go();
    });
&lt;/script&gt;

&lt;p&gt;As we know, Chatty has an almost insatiable need for &lt;em&gt;fresh blood&lt;/em&gt;, um&amp;hellip; &lt;strong&gt;training data&lt;/strong&gt;. Perhaps you&amp;rsquo;ve seen some coverage of EMF 2024 that Chatty would be interested in? &lt;a href=&#34;mailto:m&amp;#43;chatty@martinh.net?subject=Some%20Food%20for%20Chatty%20the%20Global%20Plagiarism%20Transmitter&#34; &gt;Let me know&lt;/a&gt; and I will make sure they are &lt;em&gt;engorged and replete&lt;/em&gt; with all of the &lt;strong&gt;completely true and factual&lt;/strong&gt; information about the event.&lt;/p&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/excitable-magnetosphere-fiesta/featured-emf2024-poster-small.png" />
    </item>
    
    <item>
      <title>Mutant Hand Art - A Cautionary Tale</title>
      <link>https://martinh.net/hacks/mutant-handart/</link>
      <pubDate>Sat, 31 May 2025 14:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/mutant-handart/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/cccamp2023-tree-ring-and-star.jpg&#34;,&#34;\/img\/emf2024-ledome-with-lasers.jpg&#34;,&#34;\/img\/emfcamp2022-inflatable-tentacles1.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  When you have altogether too many fingers, make a parody t-shirt that is far too subtle.
&lt;/div&gt;

&lt;p&gt;Once upon a time I thought it might be fun to make a t-shirt that was a play on the name of a certain popular educational open world game, created &lt;em&gt;(note to self: check this bit before publishing!)&lt;/em&gt; to teach children and young people &lt;strong&gt;how to get by during late-stage capitalism&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;And here it is! This is what you get what you take altogether too many hands, with far too many fingers that are also far too long - and combine them with a &lt;strong&gt;parody version&lt;/strong&gt; of the video game&amp;rsquo;s name:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w80&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;496&#34;
          height=&#34;702&#34;
          src=&#34;https://martinh.net/hacks/mutant-handart/featured-grand-theft-autocomplete_hu_c90c177ed05b7916.jpg&#34;
          srcset=&#34;https://martinh.net/hacks/mutant-handart/featured-grand-theft-autocomplete_hu_c90c177ed05b7916.jpg 800w,/hacks/mutant-handart/featured-grand-theft-autocomplete_hu_85623da12a818b6a.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/hacks/mutant-handart/featured-grand-theft-autocomplete.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;The finished design, where the too-many-hands with their too-many-fingers are arranged in a sort of tree-like formation. In the foreground is an amusing pun (well, I thought so&amp;hellip;) on the video game&amp;rsquo;s title. Let&amp;rsquo;s call it Minor Heists Autocomplete.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;I think I actually used an AI image generator to make the hands, although it was a while ago and I didn&amp;rsquo;t make a note. In my defence I added the ✨ AI sparkle emojis ✨, did some light editing, and hunted down a suitable font for the caption. It transpires that &lt;a href=&#34;https://typodermicfonts.com/pricedown/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Pricedown Black by Typodermic Fonts&lt;/a&gt; is very similar to the font used for the video game title, allegedly.&lt;/p&gt;
&lt;a
  class=&#34;!rounded-md bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700&#34;
  href=&#34;https://typodermicfonts.com/&#34;
  target=&#34;_self&#34;
  
  role=&#34;button&#34;&gt;
  
Check out Typodermic Fonts

&lt;/a&gt;

&lt;p&gt;The t-shirt design was created in the unfortunately named &lt;a href=&#34;https://gimp.org&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;GNU Image Manipulation Program&lt;/a&gt;, with probably more layers than strictly necessary, but &lt;strong&gt;moar ✨ sparkles ✨ simply had to be added&lt;/strong&gt; as I&amp;rsquo;m sure you&amp;rsquo;ll appreciate:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w90&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;1692&#34;
          height=&#34;1151&#34;
          src=&#34;https://martinh.net/img/gimp-jazz-hands_hu_1cb62fb7d79e3b91.png&#34;
          srcset=&#34;https://martinh.net/img/gimp-jazz-hands_hu_1cb62fb7d79e3b91.png 800w,/img/gimp-jazz-hands_hu_9daa0be393f2ff0d.png 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/gimp-jazz-hands.png&#34;
        /&gt;
  
  &lt;figcaption&gt;Screenshot of the design being worked on in the unfortunately named image editor. There are several layers, most of them containing an improbably large number of ✨ AI sparkles ✨&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;You can &lt;a href=&#34;https://martinh.net/hacks/mutant-handart/grand-theft-autocomplete.xcf&#34; &gt;grab yourself a copy of the design&lt;/a&gt; if you fancy having a go at making your own remix - have fun!&lt;/p&gt;
&lt;p&gt;I also made a version with even more hands, but this made me feel slightly ill to look at, so I decided to stick with the more &lt;em&gt;discrete&lt;/em&gt; version:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w80&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;992&#34;
          height=&#34;1403&#34;
          src=&#34;https://martinh.net/img/grand-theft-autocomplete-morehands_hu_a44de88e40f22395.jpg&#34;
          srcset=&#34;https://martinh.net/img/grand-theft-autocomplete-morehands_hu_a44de88e40f22395.jpg 800w,/img/grand-theft-autocomplete-morehands_hu_941c7607876c194a.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/grand-theft-autocomplete-morehands.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Alternative version of the design where the background is entirely hands. No thoughts, only hands. And the fingers, so very many, very wrong, fingers!&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;Then I &lt;a href=&#34;https://martinh.net/hacks/friends-of-blahaj/&#34; &gt;printed the design on thermal transfer paper and ironed it on&lt;/a&gt; to a handy t-shirt that I happened to have waiting to go:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w80&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;614&#34;
          height=&#34;819&#34;
          src=&#34;https://martinh.net/img/grandtheft-autocomplete-tshirt_hu_1723ba1de21bf7c0.jpg&#34;
          srcset=&#34;https://martinh.net/img/grandtheft-autocomplete-tshirt_hu_1723ba1de21bf7c0.jpg 800w,/img/grandtheft-autocomplete-tshirt_hu_32c797f9abafeeb9.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/grandtheft-autocomplete-tshirt.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;A t-shirt with the mutant hand art design, hanging on a coathanger in front of a wardrobe. It looks quite nice, but perhaps the joke is a little too subtle?&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;However, when I started wearing the t-shirt out and about in public, I realised that my little joke had been altogether too nuanced and subtle. Yes, every time I wear this item of clothing, someone will (unbidden) say something to me like: &lt;em&gt;Oh I love that game! It&amp;rsquo;s one of my favourites! Have you tried the new version yet?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le sigh. &lt;em&gt;Turns out the joke was on me.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/mutant-handart/featured-grand-theft-autocomplete.jpg" />
    </item>
    
    <item>
      <title>Hyprland IIO Sensor Screen Rotation</title>
      <link>https://martinh.net/hacks/hyprland-longcat/</link>
      <pubDate>Sat, 31 May 2025 09:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/hyprland-longcat/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/38c3-cats-gaze-upwards.jpg&#34;,&#34;\/img\/38c3-orange-cats.jpg&#34;,&#34;\/img\/lucky-cat.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  Using a composting compositor to make yourself a longcat.
&lt;/div&gt;

&lt;p&gt;A longcat, you say? Yep, &lt;em&gt;a very looong cat&amp;hellip;&lt;/em&gt;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w80&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;1029&#34;
          height=&#34;1473&#34;
          src=&#34;https://martinh.net/hacks/hyprland-longcat/featured-longcat_hu_eb94c7a31bf564ed.jpg&#34;
          srcset=&#34;https://martinh.net/hacks/hyprland-longcat/featured-longcat_hu_eb94c7a31bf564ed.jpg 800w,/hacks/hyprland-longcat/featured-longcat_hu_f7208099ac143a6d.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/hacks/hyprland-longcat/featured-longcat.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo of a laptop screen showing a squishy glowy robot cat apparently contemplateing a ceiling with some very distinctive lighting, at a special time of year. Some readers may be familiar with this festive celebration. Oh, and the cat appears to have been stretched.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;Long cat is an accidental byproduct of my misadventures with something called &lt;a href=&#34;https://hyprland.org/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Hyprland&lt;/a&gt;. Hyprland is an ambitious attempt to combine a tiling window manager, extreme eye candy, and a Unix style approach to the desktop environment. Nearly everything in Hyprland is controlled by small dedicated scripts or programs, so you can &amp;ldquo;just&amp;rdquo; swap out individual components.&lt;/p&gt;
&lt;p&gt;I like weird computers, and one of my favourite weird computers in recent times is a sort of science experiment which escaped the lab and now runs feral. It&amp;rsquo;s a first generation dual screen laptop called a YogaBook 9i, made by a much loved &lt;em&gt;vendor of tech for Salarymen and Catgirls&lt;/em&gt;. You can find it in clearance sales and suchlike as it has been superseded by newer models.&lt;/p&gt;
&lt;p&gt;After a ropey start my machine runs Linux pretty well now, but when using Hyprland the screen wouldn&amp;rsquo;t auto rotate when you change the laptop&amp;rsquo;s orientation, like you might expect it to. It&amp;rsquo;s not the end of the world, because you can always set up a keyboard mapping to run the necessary commands to change the screens&amp;rsquo; orientation. But I wanted it to happen automatically, like this&amp;hellip;&lt;/p&gt;
&lt;figure&gt;
&lt;video controls preload=&#34;auto&#34; width=&#34;100%&#34;  playsinline class=&#34;html-video&#34;&gt;
    &lt;source src=&#34;https://martinh.net/hacks/hyprland-longcat/hyprland-longcat-demo.mp4&#34; type=&#34;video/mp4&#34;&gt;
  &lt;span&gt;&lt;/span&gt;
&lt;/video&gt;
&lt;figcaption&gt;Video showing a moodily lit YogaBook being slowly turned through 360 degrees. The full screen windows on both screens magically rotate in just the way that you&amp;rsquo;d expect them to. It&amp;rsquo;s quite boring really, except that one full screen window has an article about the Republic of Kugelmugel, a spherical art object located in Vienna, Austria. The other full screen window has a guide to making your own cardboard geodesic dome. Perhaps a geodesic dome hat is being considered?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Because Hyprland&amp;rsquo;s motto is essentially &lt;em&gt;some assembly required&lt;/em&gt;, sometimes we have to figure out how something like automatic screen rotation actually works. In the YogaBook&amp;rsquo;s case it turned out that first of all I needed to get the &lt;a href=&#34;https://gitlab.freedesktop.org/hadess/iio-sensor-proxy/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;em&gt;iio-sensor-proxy&lt;/em&gt; subsystem&lt;/a&gt; working. This sends sensor events such as accelerometer data through to the D-Bus desktop bus where they can conveniently be processed by user apps.&lt;/p&gt;
&lt;p&gt;Once I had &lt;em&gt;iio-sensor-proxy&lt;/em&gt; up and running, I tried some code that other people had written to plug IIO data into Hyprland, like &lt;a href=&#34;https://github.com/JeanSchoeller/iio-hyprland&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;iio-hyprland&lt;/a&gt;. However, the YogaBook is &lt;strong&gt;weird hardware&lt;/strong&gt; so there are some gotchas, like the fact that one screen is technically mounted upside down. To get around this, I ended up writing my own hacky shell script to track accelerometer events using the &lt;em&gt;monitor-sensor&lt;/em&gt; tool (this blocks waiting for input, so it&amp;rsquo;s OK to use in a shell script) and the &lt;em&gt;hyprctl&lt;/em&gt; tool to rotate both screens appropriately. Here it is, in case it&amp;rsquo;s useful for you - just call it from your Hyprland config using &lt;em&gt;exec-once = PATH-TO-THE-SCRIPT&lt;/em&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;notif&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/.config/swaync/images/ja.png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;monitor-sensor --accel 2&amp;gt;/dev/null &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;read&lt;/span&gt; -r LINE&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;ROT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;LINE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;#*: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$ROT&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;normal&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      hyprshade on retromod.glsl
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      hyprctl keyword monitor eDP-1,preferred,3082x0,1.5,transform,2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      hyprctl keyword monitor eDP-2,preferred,3082x1200,1.5,transform,0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      hyprshade off
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      notify-send -e -u low -i &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$notif&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34; Supine Position&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;left-up&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      hyprshade on retromod.glsl
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      hyprctl keyword monitor eDP-1,preferred,left,1.5,transform,3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      hyprctl keyword monitor eDP-2,preferred,right,1.5,transform,1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      hyprshade off
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      notify-send -e -u low -i &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$notif&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34; Sinistral Vector&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;right-up&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      hyprshade on retromod.glsl
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      hyprctl keyword monitor eDP-1,preferred,left,1.5,transform,1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      hyprctl keyword monitor eDP-2,preferred,right,1.5,transform,3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      hyprshade off
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      notify-send -e -u low -i &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$notif&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34; Conduire à Droite&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;bottom-up&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      hyprshade on retromod.glsl
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      hyprctl keyword monitor eDP-1,preferred,3082x0,1.5,transform,0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      hyprctl keyword monitor eDP-2,preferred,3082x1200,1.5,transform,2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      hyprshade off
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      notify-send -e -u low -i &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$notif&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34; Bottoms Up!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    *&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;c1&#34;&gt;# we&amp;#39;ll ignore anything else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;What&amp;rsquo;s that &lt;em&gt;hyprshade&lt;/em&gt;? Well, a big part of Hyprland is the eye candy, and I thought it might be fun to apply a &lt;a href=&#34;http://www.thebookofshaders.com/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;shader&lt;/a&gt; to the display as the orientation changes. The &lt;a href=&#34;https://github.com/loqusion/hyprshade&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;hyprshade tool&lt;/a&gt; lets you do this from a script, although please note that not all shaders are compatible with Hyprland. The shader I&amp;rsquo;m using is a modified version of a modified version, found somewhere on teh Interwebs, so your mileage may vary. But if things work out right it should briefly turn the screen into something like an old CRT display as the screen(s) rotate. NB If it doesn&amp;rsquo;t work, you might get a blank screen and need to type &lt;em&gt;hyprshade off&lt;/em&gt; to get things back to normal!&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-glsl&#34; data-lang=&#34;glsl&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;//modified version of [this shader](https://github.com/wessles/GLSL-CRT/blob/master/shader.frag)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;precision&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;mediump&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;varying&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;vec2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v_texcoord&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;uniform&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;sampler2D&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tex&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;vec2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;vec2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v_texcoord&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v_texcoord&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;// Distance from the center&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;float&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;abs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.5&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;float&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dy&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;abs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.5&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;// Square it to smooth the edges&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;n&#34;&gt;dx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;n&#34;&gt;dy&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;n&#34;&gt;tc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-=&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;n&#34;&gt;tc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*=&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dy&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.23&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;n&#34;&gt;tc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;n&#34;&gt;tc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-=&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;n&#34;&gt;tc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*=&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.23&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;n&#34;&gt;tc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;// Get texel, and add in scanline if need be&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;vec4&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cta&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;texture2D&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tex&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;vec2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;n&#34;&gt;cta&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rgb&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1250.0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.02&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;// Cutoff&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;n&#34;&gt;cta&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;vec4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;c1&#34;&gt;// Apply&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;n&#34;&gt;gl_FragColor&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cta&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;And the looooonng cat? Well, it turns out that Hyprland gets a bit confused when the screen dimensions change. I&amp;rsquo;ve taken to calling it a composting compositor because of some of its weird glitches, like this:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w80&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;1229&#34;
          height=&#34;922&#34;
          src=&#34;https://martinh.net/img/composted-compositor_hu_ba6de13a54f43c0e.jpg&#34;
          srcset=&#34;https://martinh.net/img/composted-compositor_hu_ba6de13a54f43c0e.jpg 800w,/img/composted-compositor_hu_aa6a864735e99eb3.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/composted-compositor.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo of a laptop screen showing a yellow squishy glowy robot cat apparently contemplateing what looks like an EasyEffects window which has been, um, composted. The window is all weird and distorted. The cat looks as though it is contemplating its life choices.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;We should really refresh the desktop background image as part of that script. But you know what - &lt;strong&gt;long cat is &lt;em&gt;growing&lt;/em&gt; on me!&lt;/strong&gt;&lt;/p&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/hyprland-longcat/featured-longcat.jpg" />
    </item>
    
    <item>
      <title>Certificated Sex And Its Discontents</title>
      <link>https://martinh.net/hacks/certificated-sex/</link>
      <pubDate>Tue, 27 May 2025 12:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/certificated-sex/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/38c3-dont-worry-blimp.jpg&#34;,&#34;\/img\/cccamp2023-chaos-unicorn.jpg&#34;,&#34;\/img\/cccamp2023-woodland-orb.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  When some rights are more equal than others, and the resistable rise of the Bottom Inspectors.
&lt;/div&gt;

&lt;p&gt;In the UK, would-be &lt;a href=&#34;https://web.archive.org/web/www.independent.co.uk/news/world/americas/us-politics/florida-transgender-sports-ban-b1833166.html&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;em&gt;Bottom Inspectors&lt;/em&gt;&lt;/a&gt; are having a bit of a moment right now after our highest legal institution decided to make Gender Recognition Certificates for trans folk essentially meaningless. The erstwhile and &lt;strong&gt;totally unbiased&lt;/strong&gt; Equality and Human Rights Commission (EHRC) is required to provide guidance on such matters, which they are looking for feedback on.&lt;/p&gt;
&lt;p&gt;Maybe you have &lt;a href=&#34;https://www.equalityhumanrights.com/equality/equality-act-2010/codes-practice/code-practice-services-public-functions-and-associations&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;some feedback for the EHRC&lt;/a&gt;? Ha! I&amp;rsquo;m kidding - &lt;strong&gt;of course you have some feedback for them&lt;/strong&gt;. The EHRC consultation is open until June 30th 2025. I&amp;rsquo;m sure they would just &lt;a href=&#34;https://www.equalityhumanrights.com/equality/equality-act-2010/codes-practice/code-practice-services-public-functions-and-associations&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;love to hear from you&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the feedback I sent them, which made me feel better for a little while&amp;hellip;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w100&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;1242&#34;
          height=&#34;663&#34;
          src=&#34;https://martinh.net/hacks/certificated-sex/featured-displeasure_hu_fd3533969bcd9891.png&#34;
          srcset=&#34;https://martinh.net/hacks/certificated-sex/featured-displeasure_hu_fd3533969bcd9891.png 800w,/hacks/certificated-sex/featured-displeasure_hu_691ed517f918f8f0.png 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/hacks/certificated-sex/featured-displeasure.png&#34;
        /&gt;
  
  &lt;figcaption&gt;Screenshot of a multiple choice question. The question reads &amp;lsquo;To what extent do you agree or disagree with the following statement: The explanation of the updated legal definition of sex is clear&amp;rsquo;. Potential answers are on a Likert scale from Strongly Agree to Strongly Disagree, with the option of Do Not Know. The Strongly Disagree box has been selected.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;The &lt;a href=&#34;https://en.wikipedia.org/wiki/Gender_Recognition_Act_2004&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Gender Recognition Act 2004&lt;/a&gt; says that&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Where a full gender recognition certificate is issued to a person, the person’s gender becomes for all purposes the acquired gender (so that, if the acquired gender is the male gender, the person’s sex becomes that of a man and, if it is the female gender, the person’s sex becomes that of a woman).&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;(&lt;a href=&#34;https://www.legislation.gov.uk/ukpga/2004/7/crossheading/consequences-of-issue-of-gender-recognition-certificate-etc&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Consequences of issue of gender recognition certificate etc, section 9, point 1&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Whilst the Gender Recognition Act clearly states what the GRC represents and its intended purpose, in 2025 &lt;a href=&#34;https://en.wikipedia.org/wiki/For_Women_Scotland_Ltd_v_The_Scottish_Ministers&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;the Supreme Court decided&lt;/a&gt; that this should be replaced with something they call &lt;em&gt;certificated sex&lt;/em&gt;. Certificated sex is a new status that applies to someone who has been issued with a GRC.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Gender_Recognition_Act_2004&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;357 democratically elected MPs voted for the GRA&lt;/a&gt;, which passed with a majority of 309, whereas &lt;a href=&#34;https://en.wikipedia.org/wiki/Supreme_Court_of_the_United_Kingdom&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;the Supreme Court is appointed&lt;/a&gt; rather than elected. To date, there has been no democratic vote on &amp;ldquo;certificated sex&amp;rdquo;, and it is possible that the Supreme Court ruling might be overturned via &lt;a href=&#34;https://en.wikipedia.org/wiki/Parliamentary_sovereignty_in_the_United_Kingdom&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Parliamentary Sovereignty&lt;/a&gt;.&lt;/p&gt;
&lt;a
  class=&#34;!rounded-md bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700&#34;
  href=&#34;https://www.equalityhumanrights.com/equality/equality-act-2010/codes-practice/code-practice-services-public-functions-and-associations&#34;
  target=&#34;_self&#34;
  
  role=&#34;button&#34;&gt;
  
Respond to the EHRC consultation

&lt;/a&gt;

&lt;p&gt;[ &lt;em&gt;UK law is a bit complex due to devolution and delegated authority, so please excuse my oversimplification in the interest of making a point&lt;/em&gt; ]&lt;/p&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/certificated-sex/featured-displeasure.png" />
    </item>
    
    <item>
      <title>The Well Is Poisoned — Now What Shall We Drink?</title>
      <link>https://martinh.net/hacks/poisoned-well/</link>
      <pubDate>Sun, 25 May 2025 18:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/poisoned-well/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/mch22-laserflame-stage.jpg&#34;,&#34;\/img\/mch22-sails.jpg&#34;,&#34;\/img\/mch22-threadlasers-dome.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  The LLM asteroid approaches. &lt;a href=&#34;https://en.wikipedia.org/wiki/Multituberculata&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Multituberculates&lt;/a&gt;, assemble!
&lt;/div&gt;

&lt;p&gt;[ &lt;strong&gt;&lt;em&gt;This post is my proposal for a talk at &lt;a href=&#34;https://why2025.org&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;WHY&lt;/a&gt;, the 2025 edition of the quadriennial Dutch hacker camp. Hope to see you at Geestmerambacht!&lt;/em&gt;&lt;/strong&gt; ]&lt;/p&gt;
&lt;p&gt;This talk follows on from presentations I did at &lt;a href=&#34;https://media.ccc.de/v/37c3-lightningtalks-58060-honey-i-federated-the-search-engine-finding-stuff-online-post-big-tech&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;37C3&lt;/a&gt;, &lt;a href=&#34;https://media.ccc.de/v/emf2024-13-lets-party-like-its-1994&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;EMF 2024&lt;/a&gt; and &lt;a href=&#34;https://media.ccc.de/v/38c3-waiter-there-s-an-llm-in-my-search&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;38C3&lt;/a&gt;. Here&amp;rsquo;s the video of my 38C3 talk, which features significantly fewer spiders than the EMF one, but does still have sheep and goats:&lt;/p&gt;
&lt;lite-youtube videoid=&#34;iGfvbhMURxM&#34; playlabel=&#34;iGfvbhMURxM&#34; params=&#34;&#34;&gt;&lt;/lite-youtube&gt;

&lt;p&gt;Wikipedia tells us that &lt;a href=&#34;https://en.wikipedia.org/wiki/Low-background_steel&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;em&gt;low-background steel&lt;/em&gt;&lt;/a&gt; is steel produced before the detonation of the first nuclear bombs. Yep, you guessed it, &lt;strong&gt;this is a talk about Large Language Models&lt;/strong&gt;. LLM outputs have quickly spread like radionuclides, threatening everything from the scientific record to the existence of the Internet as we know it. In this talk I&amp;rsquo;ll discuss &lt;em&gt;practical &lt;a href=&#34;https://web.archive.org/web/ar.al/2020/08/07/what-is-the-small-web/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;small web&lt;/a&gt; approaches&lt;/em&gt; that we can use to build a new Internet that doesn&amp;rsquo;t suck quite so badly. There will also be memes ;-)&lt;/p&gt;
&lt;p&gt;Have you noticed how the &lt;strong&gt;good stuff&lt;/strong&gt; on the Internet is increasingly hidden behind bot checks, subscriptions and paywalls? And that it&amp;rsquo;s getting harder and harder to find things online due to LLM pollution? Welcome to the club! You are in the right place.&lt;/p&gt;
&lt;p&gt;In this talk I&amp;rsquo;ll highlight some of the most egregious examples, consider how we can best preserve &lt;em&gt;low background information&lt;/em&gt; for future generations, and how we can use small web techniques like &lt;strong&gt;a &lt;a href=&#34;https://indieweb.org/A_Domain_of_One%27s_Own&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;domain of one&amp;rsquo;s own&lt;/a&gt;, self-hosted blogs and static site generators&lt;/strong&gt; to bootstrap a new infosphere that doesn&amp;rsquo;t rely on a handful of &lt;em&gt;hyperscale operators&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m particularly interested in how we can &lt;em&gt;federate and syndicate search&lt;/em&gt;, learning from protocols and standards like &lt;a href=&#34;https://en.wikipedia.org/wiki/RSS&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;RSS&lt;/a&gt; and &lt;a href=&#34;https://activitypub.rocks/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;ActivityPub&lt;/a&gt;. As part of the talk I&amp;rsquo;ll give you some practical tools and approaches to try, like&amp;hellip;&lt;/p&gt;
&lt;style&gt;
    .content-warning {
        border-radius: 5px;
        text-align: left;
    }

    .content-warning button {
        background-color: #ff4444;
        color: white;
        border: none;
        padding: 10px 15px;
        cursor: pointer;
        border-radius: 5px;
    }

    .hidden-content {
        display: none;
    }
&lt;/style&gt;
&lt;div class=&#34;content-warning&#34;&gt;
    &lt;button onclick=&#34;this.nextElementSibling.style.display=&#39;block&#39;; this.style.display=&#39;none&#39;&#34;&gt;
        ⚠  Spoilers! Click or tap to reveal
    &lt;/button&gt;
    &lt;div class=&#34;hidden-content&#34; style=&#34;display:none;&#34;&gt;
        &lt;p&gt;The key thing I want to demonstrate in this talk is that we can build a new sort of search engine by collecting things like RSS feeds and the &lt;a href=&#34;https://martinh.net/index.json&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;indexes&lt;/a&gt; that some static site generators produce for local search. This would be a very welcome alternative to hammering people&amp;rsquo;s machines with non-stop crawler bot traffic, and is probably essential to making a gatekeeper-free approach to search that can actually scale.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s something particularly powerful here (which I hope to demonstrate at WHY) around munging this type of info together in a form that client site search engines like &lt;a href=&#34;https://github.com/paolomainardi/hugo-lyra&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Lyra&lt;/a&gt; and &lt;a href=&#34;https://lunrjs.com&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Lunr&lt;/a&gt; can use. This means that search can be run locally on the user&amp;rsquo;s device, e.g. via a web view wrapped up as a phone app, potentially removing the need for a &amp;ldquo;search engine&amp;rdquo; per se. It also creates the opportunity for topic-centric bundles or collections of sites, for when you want to search about (say) &lt;em&gt;yarn for sewing&lt;/em&gt; rather than &lt;em&gt;yarn the Javascript package manager&lt;/em&gt;.&lt;/p&gt;

    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;If you find this interesting, consider joining us in the &lt;a href=&#34;https://matrix.to/#/%23searchclub:matrix.org&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;SearchClub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Let&amp;rsquo;s have fun building the new Internet together!&lt;/strong&gt;&lt;/p&gt;
&lt;a
  class=&#34;!rounded-md bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700&#34;
  href=&#34;https://matrix.to/#/#searchclub:matrix.org&#34;
  target=&#34;_self&#34;
  
  role=&#34;button&#34;&gt;
  
Join the SearchClub

&lt;/a&gt;

</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/poisoned-well/featured-why-well.png" />
    </item>
    
    <item>
      <title>All Cybers Are Beautiful</title>
      <link>https://martinh.net/hacks/all-cybers/</link>
      <pubDate>Fri, 23 May 2025 10:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/all-cybers/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/38c3-cyber-briefcase.jpg&#34;,&#34;\/img\/38c3-dont-worry-blimp.jpg&#34;,&#34;\/img\/37c3-cyber-helmet.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  When your Cyber-Physical Systems are loosely coupled and sticky backed.
&lt;/div&gt;

&lt;p&gt;You know how it is, sometimes a vogueish new term comes along for a thing that&amp;rsquo;s already well established, and you have to slowly adjust to the fact that &amp;ldquo;we don&amp;rsquo;t call it that any more&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Consider &amp;ldquo;AI&amp;rdquo;, which is ✨ mysterious and magical ✨ and can mean whatever you want it to. Now contrast with actual machine learning techniques like convolution, backpropagation, transformers and diffusion.&lt;/p&gt;
&lt;p&gt;But we&amp;rsquo;re here to talk about &lt;strong&gt;The Cyber&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Cyber&amp;rdquo; is to infosec what &amp;ldquo;AI&amp;rdquo; is to backpropagation - a veritable &lt;em&gt;smorgasbord of fluff and flannel&lt;/em&gt; which doesn&amp;rsquo;t require you to actually know anything about the subject area. You too can be an expert, all you need are opinions! No thoughts, only vibes.&lt;/p&gt;
&lt;p&gt;And this leads to nonsense like &lt;a href=&#34;https://en.wikipedia.org/wiki/Cyber%E2%80%93physical_system&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Cyber-Physical Systems&lt;/a&gt;, &lt;a href=&#34;https://web.archive.org/web/www.defense.gov/News/Feature-Stories/story/Article/1660928/cybercom-how-dods-newest-unified-cocom-works/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Cyber Command&lt;/a&gt; and &lt;a href=&#34;https://web.archive.org/web/www.gov.uk/government/news/fast-track-armed-forces-recruitment-launched-to-boost-uk-cyber-defence&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;fast tracking Cyber Warriors through a Cyber Pipeline&lt;/a&gt;. All the Cybers, all the time!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Excuse me, perhaps I could interest you in a Cyber Beverage in these trying times?&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w75&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;614&#34;
          height=&#34;819&#34;
          src=&#34;https://martinh.net/hacks/all-cybers/featured-cyber-drink_hu_ae66c79c6e6396d.jpg&#34;
          srcset=&#34;https://martinh.net/hacks/all-cybers/featured-cyber-drink_hu_ae66c79c6e6396d.jpg 800w,/hacks/all-cybers/featured-cyber-drink_hu_8126aca43c915be6.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/hacks/all-cybers/featured-cyber-drink.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo of a water bottle with a CYBER sticker diagonally across it, under what looks like it could be a Furry Pride sticker. In the background are some screens displaying orange glowy cat robots, some Linux session windows and a photo of a sign which reads All Cookies Are Beautiful. Yes, stickers aren&amp;rsquo;t just for laptops.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;Yep, if we Cyber All The Things, then anything can be Cyber. If we want it badly enough.&lt;/p&gt;


  
  &lt;div class=&#34;width-patch&#34;&gt;&lt;/div&gt;
&lt;div id=&#34;gallery-dde511c9feb0e93488b241d123ca02b0&#34; class=&#34;gallery&#34;&gt;
  
  &lt;img src=&#34;https://martinh.net/img/38c3-cyber-briefcase.jpg&#34; class=&#34;grid-w50 md:grid-w50&#34; /&gt;
  &lt;img src=&#34;https://martinh.net/img/mch22-acab-bus.jpg&#34; class=&#34;grid-w50 md:grid-w50&#34; /&gt;
&lt;figure&gt;
&lt;figcaption&gt;Two Cyber photos. One shows an aluminium flight case with a diagonal X shape marked out using sticky tape which is yellow and printed with the word CYBER. To the right is a piece of fabric featuring the &#39;lucky cat&#39;, sometimes called the beckoning cat or maneki-neko. The second photo shows a green truck which has a number of magnetic words on the side, a bit like giant fridge magnets. The words have been arranged to spell out phrases like &#39;Braindead Are CYBER&#39;, &#39;All Cats Are Broken&#39;, &#39;Are Bacteria All Beloved&#39; and &#39;All Cops Are Beautiful&#39;.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;



  
  &lt;div class=&#34;width-patch&#34;&gt;&lt;/div&gt;
&lt;div id=&#34;gallery-30606781595f41c778b7f39b27b9ba27&#34; class=&#34;gallery&#34;&gt;
  
  &lt;img src=&#34;https://martinh.net/img/emfcamp2024-cyber-trailer.jpg&#34; class=&#34;grid-w50 md:grid-w50&#34; /&gt;
  &lt;img src=&#34;https://martinh.net/img/emfcamp2024-spider-door.jpg&#34; class=&#34;grid-w50 md:grid-w50&#34; /&gt;
&lt;figure&gt;
&lt;figcaption&gt;Another two Cyber photos. One shows a bike trailer next to a geodesic dome tent. The trailer has a sign on the back which reads &#39;CYBER TRAILER&#39; and is filled with camping paraphenalia and a suspiciously familiar suitcase. In between the trailer and the tent is a camping table with a lettuce plant on it, and a mug which reads Too Much Information (TMI). The other photo simply shows a wooden door, doorframe and handle. Someone has added a sticker to the door which reads &#39;SPIDER&#39;. Wait, that&#39;s not very CYBER?
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;If this seems disrespectful for what is, after all, a Serious and Important Topic, it may be enlightening to learn more about &lt;a href=&#34;https://web.archive.org/web/www.markloveless.net/blog/2023/12/1/the-history-of-the-word-cyber&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;the history of cyber&lt;/a&gt; from the Greek word κυβερνήτης (kubernetes - yes, really!) through to &lt;a href=&#34;https://en.wikipedia.org/wiki/Project_Cybersyn&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Stafford Beer and Project Cybersyn&lt;/a&gt; and the point in the Internet&amp;rsquo;s 1990s Cambrian Explosion period when Cyber was &lt;a href=&#34;https://web.archive.org/web/20250202010007/https://gizmodo.com/today-cyber-means-war-but-back-in-the-1990s-it-mean-1325671487&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;effectively shorthand for &lt;whispers&gt; cybersex&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And now perhaps you&amp;rsquo;ll be tempted to Cyber A Few Things yourself? The lovely people at &lt;a href=&#34;https://cyber.equipment&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;cyber.equipment&lt;/a&gt; have your back!&lt;/p&gt;
&lt;a
  class=&#34;!rounded-md bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700&#34;
  href=&#34;https://cyber.equipment&#34;
  target=&#34;_self&#34;
  
  role=&#34;button&#34;&gt;
  
Get your own CYBER equipment

&lt;/a&gt;

&lt;p&gt;PS Alternatively, you might like to make your own Spider^H^H^HCyber designs using &lt;a href=&#34;https://en.wikipedia.org/wiki/OCR-A&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;the public domain OCR-A font&lt;/a&gt; ?&lt;/p&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/all-cybers/featured-cyber-drink.jpg" />
    </item>
    
    <item>
      <title>Vaporware, Powered By Vaporwave</title>
      <link>https://martinh.net/hacks/vaporwave-solutions/</link>
      <pubDate>Tue, 20 May 2025 20:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/vaporwave-solutions/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/emfcamp2022-stars-and-tree.jpg&#34;,&#34;\/img\/emf2024-ledome-and-nullsector.jpg&#34;,&#34;\/img\/emf2024-glowy-tents-trees-and-bike.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  The field is clear and the time is right, for Vaporwave Vaporware AI Solutions.
&lt;/div&gt;

&lt;p&gt;Have you ever been frustrated when supposedly super whizzy software turns out to be &lt;em&gt;slideware&lt;/em&gt; or perhaps I should say &lt;em&gt;vaporware&lt;/em&gt;? It&amp;rsquo;s a nuisance, isn&amp;rsquo;t it?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But wait&amp;hellip; Imagine if there were actually some genuine vaporware companies!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It turns out that there were several, in the UK at least, but there aren&amp;rsquo;t any right now - allegedly. Here&amp;rsquo;s what &lt;a href=&#34;https://find-and-update.company-information.service.gov.uk/advanced-search/get-results?companyNameIncludes=vaporware&amp;amp;companyNameExcludes=&amp;amp;registeredOfficeAddress=&amp;amp;incorporationFromDay=&amp;amp;incorporationFromMonth=&amp;amp;incorporationFromYear=&amp;amp;incorporationToDay=&amp;amp;incorporationToMonth=&amp;amp;incorporationToYear=&amp;amp;sicCodes=&amp;amp;dissolvedFromDay=&amp;amp;dissolvedFromMonth=&amp;amp;dissolvedFromYear=&amp;amp;dissolvedToDay=&amp;amp;dissolvedToMonth=&amp;amp;dissolvedToYear=&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Companies House&lt;/a&gt; has to say:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w75&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;453&#34;
          height=&#34;723&#34;
          src=&#34;https://martinh.net/img/dissolved-vaporware_hu_acabf36c9cfea9f7.jpg&#34;
          srcset=&#34;https://martinh.net/img/dissolved-vaporware_hu_acabf36c9cfea9f7.jpg 800w,/img/dissolved-vaporware_hu_727b4086dd8c4c1f.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/dissolved-vaporware.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Screenshot of the results of a Companies House advanced search showing companies with the word &amp;lsquo;vaporware&amp;rsquo; in their name. There were four, but all are dissolved now - Vaporware Consulting Ltd, Vaporware Records Ltd, Vaporware Solutions Limited and Vaporware Ltd. The screenshot includes a random bit of system status information just under the entry for Vaporware Solutions Limited and the window background is slightly transparent, revealing a hint of what could possibly be hacker centric desktop backgrounds.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;So basically, &lt;em&gt;the time is right for some vaporware solutions.&lt;/em&gt; Let&amp;rsquo;s get going, people, the field is clear!&lt;/p&gt;
&lt;p&gt;And, in the current era, what better vaporware solutions could there possibly be than &lt;strong&gt;Vaporware AI Solutions?&lt;/strong&gt; It&amp;rsquo;s like a dream come true.&lt;/p&gt;
&lt;p&gt;But we could make this so much better by adding just a smidgen of&amp;hellip; &lt;em&gt;vaporwave.&lt;/em&gt; Who knows, maybe Vaporwave Vaporware AI Solutions could even be the next big thing? However, FIRST WE WILL NEED A LOGO.&lt;/p&gt;
&lt;p&gt;OK, so it&amp;rsquo;s 2025 and we could just give this job to a generative AI model trained on millions of images &lt;a href=&#34;https://web.archive.org/web/www.bakerlaw.com/services/artificial-intelligence-ai/case-tracker-artificial-intelligence-copyrights-and-class-actions/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;generously made freely available on the Internet by their creators&lt;/a&gt;. But it&amp;rsquo;s more fun and &lt;em&gt;significantly less evil&lt;/em&gt; to create our own logo.&lt;/p&gt;
&lt;p&gt;First we&amp;rsquo;ll need a picture of a powerful supercomputer:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w75&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;607&#34;
          height=&#34;810&#34;
          src=&#34;https://martinh.net/img/wee-archie_hu_67368aa4858f241b.jpg&#34;
          srcset=&#34;https://martinh.net/img/wee-archie_hu_67368aa4858f241b.jpg 800w,/img/wee-archie_hu_7f22e6b125a058fc.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/wee-archie.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo of a stack of single board computers made by a fruit-centric company not based in California. They are in cases that appear to be made from everyone&amp;rsquo;s favourite blocky plastic construction toy, stacked one atop another. You can&amp;rsquo;t see it in the photo, but this is a machine from the dawn of time (2017) known as Wee Archie. Let&amp;rsquo;s pretend that it is in fact an AI supercomputer.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;Then we&amp;rsquo;ll need a suitably funky font for our company&amp;rsquo;s name. There are lots of nice websites out there that let you play around with fonts and apply effects. However, many of them want you to pay for stuff you would like to share, re-use or re-mix - so do be sure to check their terms and conditions.&lt;/p&gt;
&lt;p&gt;Remember that UK residents can receive &lt;a href=&#34;https://web.archive.org/web/www.gov.uk/government/publications/intellectual-property-offences/intellectual-property-offences&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;unlimited fines and be imprisoned for up to ten years&lt;/a&gt; for breach of copyright, which would not be a good thing and could definitely spoil your day. Perhaps the lesson here is to be a &lt;a href=&#34;https://en.wikipedia.org/wiki/Legal_person&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;corporate person instead of a natural person?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Once we have our company name in a nice and &lt;em&gt;fully street legal&lt;/em&gt; font, we can load it and our background into the unfortunately named GNU Image Manipulation Program and start to have some fun. What if we made a few copies of Wee Archie as new layers, offset them slightly, applied a little Linear Burn and the fabulous Colorize effect? Maybe we&amp;rsquo;d get something a bit like this:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w100&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;432&#34;
          height=&#34;303&#34;
          src=&#34;https://martinh.net/img/vaporwave-ai-solutions-logo-reduced_hu_5ef80037ac9ec819.png&#34;
          srcset=&#34;https://martinh.net/img/vaporwave-ai-solutions-logo-reduced_hu_5ef80037ac9ec819.png 800w,/img/vaporwave-ai-solutions-logo-reduced_hu_a4859fd9eb1cb1c8.png 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/vaporwave-ai-solutions-logo-reduced.png&#34;
        /&gt;
  
  &lt;figcaption&gt;Graphic showing the words Vaporware A.I. Solutions in a vaguely vaporwave font against a pink swirly backing. In the background is our old friend Wee Archie, possibly noodling away incredibly slowly on some early Transformer model, with no clue of the eldritch horrors that await.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;But we&amp;rsquo;re not done yet! Let&amp;rsquo;s break out the &lt;a href=&#34;https://martinh.net/hacks/glitchy-gifs/&#34; &gt;glitchy GIF generator&lt;/a&gt;:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w100&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;324&#34;
          height=&#34;227&#34;
          src=&#34;https://martinh.net/img/glitched_vaporwave-ai-solutions-logo-edit2b_hu_daa3281276a46a9f.gif&#34;
          srcset=&#34;https://martinh.net/img/glitched_vaporwave-ai-solutions-logo-edit2b_hu_daa3281276a46a9f.gif 800w,/img/glitched_vaporwave-ai-solutions-logo-edit2b_hu_3e72651acced1f5a.gif 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/glitched_vaporwave-ai-solutions-logo-edit2b.gif&#34;
        /&gt;
  
  &lt;figcaption&gt;Glitchy GIF version of the above image. It is a GIF, and it is glitchy.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;&lt;em&gt;And now, just like that, the Vaporwave Vaporware AI Solutions have come into being in our timeline.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The rest is up to you, dear reader.&lt;/strong&gt;&lt;/p&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/vaporwave-solutions/featured-vaporwave-ai-solutions-logo-edit2.png" />
    </item>
    
    <item>
      <title>Laptop Sleeves of Loving Grace</title>
      <link>https://martinh.net/hacks/emfcamp-sleeve/</link>
      <pubDate>Sun, 18 May 2025 12:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/emfcamp-sleeve/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/emfcamp2022-stars-and-dome.jpg&#34;,&#34;\/img\/emfcamp2022-isopod-gentle-sign.jpg&#34;,&#34;\/img\/emfcamp2022-nullsector-flamethrowers.jpg&#34;,&#34;\/img\/emfcamp2022-inflatable-tentacles1.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  Making everyday life more like EMF, one sleeve at a time.
&lt;/div&gt;

&lt;p&gt;Electromagnetic Field is probably the first event I&amp;rsquo;ve been to that had not just a &lt;a href=&#34;https://web.archive.org/web/https://www.emfcamp.org/static/2024/theme-guide.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;style guide and branding&lt;/a&gt;, but also its own fabric. Yes, that&amp;rsquo;s right - fabric!&lt;/p&gt;
&lt;p&gt;The wonderful &lt;a href=&#34;https://moraghickman.co.uk/shop/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Morag Hickman&lt;/a&gt; made a fantastic solarpunk design which was featured on EMF things like lecterns and signage. Morag decided to give people the opportunity to buy some fabric with the design on, so they could make their own EMF solarpunk inspired creations.&lt;/p&gt;
&lt;p&gt;I had ordered some of the fabric and decided to use it to make a laptop sleeve first of all. You can see the results in the photo below:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w75&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;922&#34;
          height=&#34;1229&#34;
          src=&#34;https://martinh.net/img/emfcamp-laptop-sleeve_hu_44d9a541b4d0fbeb.jpg&#34;
          srcset=&#34;https://martinh.net/img/emfcamp-laptop-sleeve_hu_44d9a541b4d0fbeb.jpg 800w,/img/emfcamp-laptop-sleeve_hu_486dca707842444f.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/emfcamp-laptop-sleeve.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo of a laptop peeking out of a shoddily constructed sleeve made of EMF solarpunk fabric. There are all manner of unexpected things on the fabric design including an old CRT terminal, an anglepoise lamp, leaves, tree roots and a radiator. The laptop has three stickers visible. One sticker has the word &amp;lsquo;mavity&amp;rsquo; superimposed on some apples. Another has a picture of a supposed room temperature superconductor, and is captioned &amp;lsquo;I want to believe&amp;rsquo;. The third has a radiation warning symbol and says, in English and German, that the device contains atoms and is a tiny bit radioactive.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;This was actually the first time I did some proper sewing with a sewing machine, after quite a few false starts. To prepare, I spent a while looking at other people&amp;rsquo;s &lt;a href=&#34;https://www.instructables.com/search/?q=laptop%20sleeve&amp;amp;projects=featured&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;DIY laptop sleeve projects&lt;/a&gt;, and watching videos reminding^H^Hteaching me &lt;a href=&#34;https://www.youtube.com/results?search_query=how%20to%20use%20ikea%20sewing%20machine&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;how to operate our sewing machine&lt;/a&gt; - a cheap &amp;lsquo;starter&amp;rsquo; model from a popular shark and meatball retailer.&lt;/p&gt;
&lt;p&gt;I was very pleased with the results, which were essentially the result of stitching together two pieces of Morag&amp;rsquo;s fabric after adding some internal padding. I used felt for the padding, since it was nice and soft (so wouldn&amp;rsquo;t scratch the laptop) and easy to stitch through. &lt;em&gt;Even then I broke a couple of needles due to being a total sewing newbie&lt;/em&gt;. I was particularly excited about being able to re-use the EMF wristband as the sleeve closer, along with an old button I happened to have lying around:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w75&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;1638&#34;
          height=&#34;1229&#34;
          src=&#34;https://martinh.net/img/sleeve-closeup_hu_4c5e6c4cb4e70d6e.jpg&#34;
          srcset=&#34;https://martinh.net/img/sleeve-closeup_hu_4c5e6c4cb4e70d6e.jpg 800w,/img/sleeve-closeup_hu_f00d714a0757c1ca.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/sleeve-closeup.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo shows a closeup of the laptop sleeve propped up against a sewing machine. The EMF wristband and a button have been sewn on to the sleeve, and the wristband is holding the sleeve shut. On close inspection the stitches are a bit wonky, but they&amp;rsquo;ve held up well in daily use.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;a
  class=&#34;!rounded-md bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700&#34;
  href=&#34;https://moraghickman.co.uk/shop/&#34;
  target=&#34;_self&#34;
  
  role=&#34;button&#34;&gt;
  
Check out Morag Hickman&#39;s online shop

&lt;/a&gt;

&lt;p&gt;For a few months after EMF I kept thinking that the solarpunk design reminded me of something, but couldn&amp;rsquo;t put my finger on what it might be. Then I finally realised that I had been thinking of the &lt;a href=&#34;https://web.archive.org/web/http://www.brautigan.net/machines.html&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Richard Brautigan poem - All Watched Over by Machines of Loving Grace&lt;/a&gt;. Here&amp;rsquo;s a video of Richard reading the poem, which Adam Curtis incorporated into his eponymous series, and I&amp;rsquo;ve included the poem in full below as it is shared under a copyleft type licence.&lt;/p&gt;
&lt;lite-youtube videoid=&#34;6zlsCLukG9A&#34; playlabel=&#34;6zlsCLukG9A&#34; params=&#34;&#34;&gt;&lt;/lite-youtube&gt;

&lt;p&gt;EMF is a somewhat unusual event, and the machines in question are quite likely to be a mixture of faxes, giant Tesla coils, Strowger electromechanical telephone switches, giant robot spiders and &lt;a href=&#34;https://web.archive.org/web/nervoussquirrel.com/ore-some_xylophone.html&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;uranium powered xylophones&lt;/a&gt;. Most important of all, and arguably the &lt;em&gt;Final Boss of Hacker Camps&lt;/em&gt; is the ubiquitous &lt;a href=&#34;https://en.wikipedia.org/wiki/Datenklo&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Datenklo&lt;/a&gt; or Data Toilet. This usually provides wired and wireless phone services, wifi and wired data connectivity. &lt;strong&gt;The toilet feature has been temporarily deactivated - do not use the Datenklo as a toilet.&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w60&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;3024&#34;
          height=&#34;4032&#34;
          src=&#34;https://martinh.net/img/emfcamp2022-datenklo_hu_870f2f2bea8c6059.jpg&#34;
          srcset=&#34;https://martinh.net/img/emfcamp2022-datenklo_hu_870f2f2bea8c6059.jpg 800w,/img/emfcamp2022-datenklo_hu_497803bb1ad2c8a3.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/emfcamp2022-datenklo.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo of the top of a portaloo which looks somewhat abnormal. The toilet has an Ohm Light attached to its roof, providing a visual indicator of the camp network status. It looks a bit like a burning torch as the upper LEDs are red and the lower ones are orange or yellow.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;Here&amp;rsquo;s the full text of the poem:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Richard Brautigan&lt;br&gt;
ALL WATCHED OVER BY MACHINES OF LOVING GRACE&lt;/p&gt;
&lt;p&gt;I like to think (and&lt;br&gt;
the sooner the better!)&lt;br&gt;
of a cybernetic meadow&lt;br&gt;
where mammals and computers&lt;br&gt;
live together in mutually&lt;br&gt;
programming harmony&lt;br&gt;
like pure water&lt;br&gt;
touching clear sky.&lt;/p&gt;
&lt;p&gt;I like to think&lt;br&gt;
(right now, please!)&lt;br&gt;
of a cybernetic forest&lt;br&gt;
filled with pines and electronics&lt;br&gt;
where deer stroll peacefully&lt;br&gt;
past computers&lt;br&gt;
as if they were flowers&lt;br&gt;
with spinning blossoms.&lt;/p&gt;
&lt;p&gt;I like to think&lt;br&gt;
(it has to be!)&lt;br&gt;
of a cybernetic ecology&lt;br&gt;
where we are free of our labors&lt;br&gt;
and joined back to nature,&lt;br&gt;
returned to our mammal&lt;br&gt;
brothers and sisters,&lt;br&gt;
and all watched over&lt;br&gt;
by machines of loving grace.&lt;/p&gt;
&lt;p&gt;Originally published by The Communication Company in 1967&lt;/p&gt;
&lt;/blockquote&gt;&lt;a
  class=&#34;!rounded-md bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700&#34;
  href=&#34;https://web.archive.org/web/brautiganarchives.xyz/&#34;
  target=&#34;_self&#34;
  
  role=&#34;button&#34;&gt;
  
Check out the Richard Brautigan archive

&lt;/a&gt;

&lt;p&gt;And finally as a parting gift, here is one last photo of the laptop sleeve. Isn&amp;rsquo;t it amazing how the blue in the fabric seems to glow from within? &lt;strong&gt;Like pure water touching clear sky&amp;hellip;&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w75&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;1229&#34;
          height=&#34;1638&#34;
          src=&#34;https://martinh.net/img/sleeve-and-miku_hu_2a5f6f5a748796fe.jpg&#34;
          srcset=&#34;https://martinh.net/img/sleeve-and-miku_hu_2a5f6f5a748796fe.jpg 800w,/img/sleeve-and-miku_hu_c9889e52e897f122.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/sleeve-and-miku.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo showing the laptop sleeve propped up against the sewing machine as before. This photo is taken from a little further back and reveals some more detail including a water wheel, a train track, a solar panel and some mushrooms. It also becomes clear that there is a poster of everyone&amp;rsquo;s favourite virtual holographic singer Hatsune Miku waving a trans flag on the wall in the background. In the photo it looks almost as though Miku is standing on the top of the sleeve.&lt;/figcaption&gt;
  &lt;/figure&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/emfcamp-sleeve/featured-emfcamp-laptop-sleeve.jpg" />
    </item>
    
    <item>
      <title>Radicalised By Yarn</title>
      <link>https://martinh.net/hacks/radicalised-yarn/</link>
      <pubDate>Wed, 14 May 2025 15:32:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/radicalised-yarn/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/37c3-fairydust-tribute.jpg&#34;,&#34;\/img\/38c3-chaosception.jpg&#34;,&#34;\/img\/cccamp2023-chaos-unicorn.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  When your data centre could also be a fashion statement.
&lt;/div&gt;

&lt;p&gt;Does it sometimes feel like software is getting a bit, well&amp;hellip; &lt;em&gt;out of hand?&lt;/em&gt; No? OK, fair enough, it&amp;rsquo;s probably just me!&lt;/p&gt;
&lt;p&gt;To calm our thoughts, in a sort of weird technophile version of mindfulness, I offer you this picture of a small computer on a squishy rubber brain. This will all make sense later, hopefully.&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w75&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;2048&#34;
          height=&#34;1536&#34;
          src=&#34;https://martinh.net/hacks/radicalised-yarn/featured-pi-brain_hu_2d3a30dcda769b44.jpg&#34;
          srcset=&#34;https://martinh.net/hacks/radicalised-yarn/featured-pi-brain_hu_2d3a30dcda769b44.jpg 800w,/hacks/radicalised-yarn/featured-pi-brain_hu_6329a72a71b8e884.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/hacks/radicalised-yarn/featured-pi-brain.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo of a small single board computer from a fruit oriented company not presently based in California. The computer has an e-ink &amp;lsquo;hat&amp;rsquo; displaying status information, and a modest battery for power backup. The display says that the device&amp;rsquo;s name is &lt;em&gt;inky&lt;/em&gt;, and that it is connected to the wifi network &lt;em&gt;[ REDACTED ]&lt;/em&gt;. Oh, and the computer is resting on a reddish-pink squishy brain toy. It&amp;rsquo;s not a real brain. Real brains are grey.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Now, if you&amp;rsquo;ll excuse me for a moment, I just have to update my Node.js app&amp;rsquo;s dependencies.&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w100&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;1219&#34;
          height=&#34;130&#34;
          src=&#34;https://martinh.net/img/screenshot-yarn-aargh_hu_7e1c26d3879ac8bf.png&#34;
          srcset=&#34;https://martinh.net/img/screenshot-yarn-aargh_hu_7e1c26d3879ac8bf.png 800w,/img/screenshot-yarn-aargh_hu_5516fcd625f8ca78.png 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/screenshot-yarn-aargh.png&#34;
        /&gt;
  
  &lt;figcaption&gt;Output of the Yarn package manager for Node.js, showing that 1733 packages have been added to the project, totalling 382.86 Mebibytes. That&amp;rsquo;s over 400 Megabytes in today&amp;rsquo;s money.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;You could be forgiven for thinking that &lt;a href=&#34;https://web.archive.org/web/20250510023028/https://socket.dev/blog/malicious-npm-packages-hijack-cursor-editor-on-macos&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;we don&amp;rsquo;t really know what is in all this code we&amp;rsquo;re running&lt;/a&gt;, but that couldn&amp;rsquo;t possibly be the case, could it? I mean, &lt;a href=&#34;https://www.reversinglabs.com/blog/malicious-python-packages-target-popular-bitcoin-library&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;if it comes from a reputable source then it&amp;rsquo;s surely fine?&lt;/a&gt; &lt;strong&gt;This is a local host for local code. We&amp;rsquo;ll have no data exfiltration here!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;But imagine your surprise on discovering that the &lt;a href=&#34;https://github.com/barasher/go-exiftool&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;super duper modern Go library&lt;/a&gt; (or maybe &lt;a href=&#34;https://github.com/exiftool-rb/exiftool.rb&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;its Ruby equivalent&lt;/a&gt;) you are using for processing Exif metadata from images is actually a wrapper around &lt;a href=&#34;https://exiftool.org/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;ExifTool&lt;/a&gt;, which is a &lt;em&gt;&amp;lt;whispers&amp;gt; Perl script&lt;/em&gt;. &lt;strong&gt;One must be careful where the Elder Gods are concerned, so we&amp;rsquo;ll say no more of this - for now.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And this is where the fashion part comes in&amp;hellip;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w75&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;1229&#34;
          height=&#34;1638&#34;
          src=&#34;https://martinh.net/img/fez-pi_hu_c8d82e4006290113.jpg&#34;
          srcset=&#34;https://martinh.net/img/fez-pi_hu_c8d82e4006290113.jpg 800w,/img/fez-pi_hu_7b68da4b17256261.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/fez-pi.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Another photo of the tiny computer. This time it&amp;rsquo;s sat on, or perhaps attached to, a red fez. Fezzes are cool, and will only lead to temporal paradoxes if not handled correctly. Always read the instructions.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;We&amp;rsquo;re increasingly using &lt;a href=&#34;https://en.wikipedia.org/wiki/DevOps#GitOps&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;techniques like GitOps&lt;/a&gt; to magically orchestrate spinning up whole clusters and virtual data centres, conveniently and efficiently installing software from &lt;em&gt;&amp;lt;shrugs&amp;gt; who knows where?&lt;/em&gt; Maybe it&amp;rsquo;s worth us taking a step back and spending a little time using tools like &lt;a href=&#34;https://github.com/anchore/grype&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Grype&lt;/a&gt; to understand our software supply chain a little better.&lt;/p&gt;
&lt;p&gt;And maybe, just maybe, it&amp;rsquo;s also worth us taking a long hard look at our computing environment. Do we really need all those Pods and Containers? &lt;strong&gt;How many of the workloads we&amp;rsquo;re running could easily fit on a Fez, or a squishy brain?&lt;/strong&gt; Perhaps it&amp;rsquo;s time to normalise the Fez Unit of Computing. After all, the acronym works so well.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Now, has anyone seen my data centre? It was by the window earlier on&amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;PS What&amp;rsquo;s that? You too have made a hat-centric Pi Zero-oriented data centre using the Waveshare INA219 UPS HAT and the Inky pHAT from Pimoroni, Sheffield&amp;rsquo;s Popular Peddlars of Preposterous Packages? How exciting! In that case you might find this awkwardly adapted Python code useful - it queries the UPS module and then displays the battery percentage and a bunch of other stats on the unit&amp;rsquo;s e-Ink screen.&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;argparse&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;platform&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;subprocess&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;math&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;colorsys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# INA219 comes from the Waveshare Wiki - https://www.waveshare.com/wiki/UPS_HAT_(C)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;INA219&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;INA219&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;datetime&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;PIL&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ImageFont&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ImageDraw&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;font_hanken_grotesk&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;HankenGroteskBold&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;HankenGroteskMedium&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;inky.auto&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auto&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ask_user&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;verbose&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;img&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;P&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;resolution&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ImageDraw&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Draw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;img&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;hanken_bold_font&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ImageFont&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;truetype&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HankenGroteskBold&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;22&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;hanken_medium_font&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ImageFont&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;truetype&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HankenGroteskMedium&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;18&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ina219&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;INA219&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;addr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x43&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;bus_voltage&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ina219&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getBusVoltage_V&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;             &lt;span class=&#34;c1&#34;&gt;# voltage on V- (load side)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;shunt_voltage&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ina219&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getShuntVoltage_mV&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# voltage between V+ and V- across the shunt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ina219&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getCurrent_mA&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;                   &lt;span class=&#34;c1&#34;&gt;# current in mA&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;power&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ina219&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getPower_W&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;                        &lt;span class=&#34;c1&#34;&gt;# power in W&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bus_voltage&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# INA219 measure bus voltage on the load side. So PSU voltage = bus_voltage + shunt_voltage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ups_load_voltage&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{:6.3f}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; V&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bus_voltage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ups_current&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;       &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{:6.3f}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; A&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ups_power&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;         &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{:6.3f}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; W&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;power&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ups_percent&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;       &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{:3.1f}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;%&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;hostname&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;now&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;now&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;date_time&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;now&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strftime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;%Y-%m-&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%d&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; %H:%M&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ssid&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;subprocess&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;check_output&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/sbin/iwgetid&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;-r&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ip_addr_info&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;subprocess&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;check_output&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/bin/hostname&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;--all-ip-addresses&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ip_addr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;re&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sub&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39; .*&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ip_addr_info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rectangle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;80&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HEIGHT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fill&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RED&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;outline&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RED&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rectangle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;80&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;31&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fill&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WHITE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;outline&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WHITE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rectangle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;81&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WIDTH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;31&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fill&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BLACK&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;outline&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BLACK&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Host&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WHITE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;font&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hanken_bold_font&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;35&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Time&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WHITE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;font&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hanken_medium_font&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;55&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SSID&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WHITE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;font&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hanken_medium_font&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;IP addr&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WHITE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;font&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hanken_medium_font&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;95&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Battery&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WHITE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;font&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hanken_medium_font&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;90&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hostname&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BLACK&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;font&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hanken_bold_font&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;90&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;35&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;date_time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BLACK&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;font&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hanken_medium_font&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;90&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;55&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ssid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BLACK&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;font&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hanken_medium_font&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;90&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ip_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BLACK&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;font&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hanken_medium_font&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;draw&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;90&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;95&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ups_percent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BLACK&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;font&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hanken_medium_font&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;set_image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;img&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;inky_display&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;show&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/radicalised-yarn/featured-pi-brain.jpg" />
    </item>
    
    <item>
      <title>From Doomscrolling to Bloomscrolling</title>
      <link>https://martinh.net/hacks/doom-to-bloom/</link>
      <pubDate>Tue, 13 May 2025 23:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/doom-to-bloom/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/38c3-dont-worry-blimp.jpg&#34;,&#34;\/img\/38c3-internet.jpg&#34;,&#34;\/img\/38c3-mirror-star.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  The environmentally friendly alternative to yeeting billionaires into space.
&lt;/div&gt;

&lt;p&gt;Back in the Summer of 2023 I got a bit grumpy about what had become of a certain social network for bird fanciers. It was hard to escape the fact that the same person responsible for &lt;em&gt;that&lt;/em&gt; sad state of affairs had been something of a personal inspiration, even if &lt;strong&gt;the brain worms were now in the driving seat.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So much of an inspiration that like a dummy I had even bought a branded t-shirt from one of this person&amp;rsquo;s companies. Yep, with my own money. &lt;em&gt;And to think I nearly bought one of their cars too&amp;hellip;&lt;/em&gt; I decided to mod the t-shirt in the most appropriate way possible - by replacing the corporate brand with some silly cartoons I found on teh Interwebs, coupled with a witty (in my mind, at least) caption:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w100&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;704&#34;
          height=&#34;486&#34;
          src=&#34;https://martinh.net/hacks/doom-to-bloom/featured-doom-to-bloom-tshirt_hu_a58be09420e3591f.jpg&#34;
          srcset=&#34;https://martinh.net/hacks/doom-to-bloom/featured-doom-to-bloom-tshirt_hu_a58be09420e3591f.jpg 800w,/hacks/doom-to-bloom/featured-doom-to-bloom-tshirt_hu_a05e662484d44499.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/hacks/doom-to-bloom/featured-doom-to-bloom-tshirt.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo of a grey t-shirt which has been modified with thermal transfer prints, completely obscuring the original corporate branding. There are two cartoon panels. One features a blue bird wearing a hat and drinking from a cup of dark liquid. Around the blue bird, fires are raging. The other panel shows a mastodon sat on would have to be quite a large chair. The mastodon is holding a plant pot and is surrounded by verdant greenery. Both panels have the protagonist saying &amp;lsquo;This Is Fine&amp;rsquo;, but we all know the truth. Under the cartoons is the hashtag #DoomScrolling in Comic Sans font, except the word Doom has been struck through and replaced with Bloom in bold, making the hashtag #BloomScrolling.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;For this Mayke I thought I would see if I could find the origins of the &lt;em&gt;This Is Fine&lt;/em&gt; meme. Turns out it was &lt;a href=&#34;https://gunshowcomic.com/648&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;created by comic artist KC Green as part of their Gunshow comic strip&lt;/a&gt;. NPR has a great 2023 interview with KC &lt;a href=&#34;https://web.archive.org/web/https://www.npr.org/2023/01/16/1149232763/this-is-fine-meme-anniversary-gunshow-web-comic&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;wherein we learn that the dog is called Question Hound&lt;/a&gt;. We also discover that:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;In the comic&amp;rsquo;s current storyline, Question Hound has disappeared into the woods in a crazed state.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;And really, who can blame them?&lt;/p&gt;
&lt;p&gt;If the &lt;em&gt;This Is Fine&lt;/em&gt; meme has sparked joy, or at least made things a bit more bearable, you can &lt;a href=&#34;https://topatoco.com/collections/kc&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;support KC by buying stuff from their online shop&lt;/a&gt; or &lt;a href=&#34;https://topatoco.com/collections/kc&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;support them directly&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But where did the mastodon-themed version of the meme come from? I did a bit of digging (online, not in the garden), and it seems to have started out life as a simple transposition of Question Hound into a garden or maybe greenhouse type setting:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w100&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;559&#34;
          height=&#34;361&#34;
          src=&#34;https://martinh.net/img/screenshot-thisisfine-transposed_hu_f3b2a58ec1e442f1.png&#34;
          srcset=&#34;https://martinh.net/img/screenshot-thisisfine-transposed_hu_f3b2a58ec1e442f1.png 800w,/img/screenshot-thisisfine-transposed_hu_c3945804d7b69f43.png 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/screenshot-thisisfine-transposed.png&#34;
        /&gt;
  
  &lt;figcaption&gt;Question Hound, the dog from the This Is Fine meme, in the same garden/greenhouse setting as the mastodon from above. Shown in a post on a once popular social network which was aimed at the image conscious.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;The creator of this revised &lt;em&gt;This Is Fine&lt;/em&gt; meme is &lt;a href=&#34;https://linktr.ee/shooley.art&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;an artist called Shooley (shooley.art)&lt;/a&gt; who has a &lt;a href=&#34;https://www.etsy.com/shop/shooleyart/?etsrc=sdt&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;em&gt;hidden shop of cute stickers and things&lt;/em&gt;&lt;/a&gt; - go check it out! You can also &lt;a href=&#34;https://www.patreon.com/shooley&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;support Shooley directly&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Who made the Bluebird variant of the meme? Did Shooley create the mastodon variant? &lt;em&gt;It&amp;rsquo;s unclear, and this post is starting to get quite long&lt;/em&gt;. However, I do know that the first time I saw the mastodon variant was this post by &lt;a href=&#34;https://mastodon.social/@Lazarou&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Lazarou Monkey Terror&lt;/a&gt;:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w60&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;422&#34;
          height=&#34;581&#34;
          src=&#34;https://martinh.net/img/toot-masto-is-fine_hu_ab78a7c17d74ddea.png&#34;
          srcset=&#34;https://martinh.net/img/toot-masto-is-fine_hu_ab78a7c17d74ddea.png 800w,/img/toot-masto-is-fine_hu_5a0f253f7a03ae.png 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/toot-masto-is-fine.png&#34;
        /&gt;
  
  &lt;figcaption&gt;Mastodon post (toot) from Lazarou Monkey Terror, showing the same background but this time with the mastodon rather than Question Hound.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;And at some point I came across this post by &lt;a href=&#34;https://fosstodon.org/@atoponce&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Aaron Toponce&lt;/a&gt; which combined the two images:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w60&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;460&#34;
          height=&#34;456&#34;
          src=&#34;https://martinh.net/img/toot-thisisfine-evolution_hu_8b883d0e9b57e574.png&#34;
          srcset=&#34;https://martinh.net/img/toot-thisisfine-evolution_hu_8b883d0e9b57e574.png 800w,/img/toot-thisisfine-evolution_hu_321850f716c69f91.png 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/toot-thisisfine-evolution.png&#34;
        /&gt;
  
  &lt;figcaption&gt;Mastodon post (toot) from Aaron Toponce, showing the Bluebird This Is Fine meme next to the Mastodon This Is Fine meme.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;And it was this lovely combination that I decided to adapt for my own t-shirt hack, using &lt;a href=&#34;https://martinh.net/hacks/friends-of-blahaj/%22&#34; &gt;the technique described in this related post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Once upon a time this t-shirt was cursed:&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w60&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;907&#34;
          height=&#34;1210&#34;
          src=&#34;https://martinh.net/img/cursed-tshirt_hu_e13e7536eb6f7c54.jpg&#34;
          srcset=&#34;https://martinh.net/img/cursed-tshirt_hu_e13e7536eb6f7c54.jpg 800w,/img/cursed-tshirt_hu_58f9f8433f542ee3.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/cursed-tshirt.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Cursed t-shirt showing the words Occupy Mars next to an image of the red planet.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;But now, it is blessed:&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w60&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;907&#34;
          height=&#34;1210&#34;
          src=&#34;https://martinh.net/img/blessed-tshirt_hu_c416999015331669.jpg&#34;
          srcset=&#34;https://martinh.net/img/blessed-tshirt_hu_c416999015331669.jpg 800w,/img/blessed-tshirt_hu_8ebc20c7019bd153.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/blessed-tshirt.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo shows the hacked t-shirt hanging up in front of a wardrobe. There is no trace of the original design.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;a
  class=&#34;!rounded-md bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700&#34;
  href=&#34;https://martinh.net/hacks/friends-of-blahaj&#34;
  target=&#34;_self&#34;
  
  role=&#34;button&#34;&gt;
  
Perform your own t-shirt exorcism

&lt;/a&gt;

</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/doom-to-bloom/featured-doom-to-bloom-tshirt.jpg" />
    </item>
    
    <item>
      <title>Don&#39;t LED It Go To Your Head</title>
      <link>https://martinh.net/hacks/fun-hat/</link>
      <pubDate>Sun, 11 May 2025 23:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/fun-hat/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/cccamp2023-dome-and-lasers.jpg&#34;,&#34;\/img\/38c3-torus-reflections.jpg&#34;,&#34;\/img\/cccamp2023-mirror-thing1.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  Stealthy hat tricks for the fashion conscious hacker.
&lt;/div&gt;

&lt;p&gt;If you&amp;rsquo;re just starting out as a hacker / maker, it can be quite daunting to look at sites like &lt;a href=&#34;https://www.instructables.com/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Instructables&lt;/a&gt;, &lt;a href=&#34;https://www.hackster.io/projects&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Hackster&lt;/a&gt; or the &lt;a href=&#34;https://hackaday.com/blog/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Hackaday Blog&lt;/a&gt;. So many projects that require skills like sewing and soldering, crochet and coding - right the way through to welding, CNC milling and 3D printing!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But you can still make amazing things without all that equipment and specialist knowledge.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Today I bring you this lovely LED hat. It&amp;rsquo;s just a regular straw hat, with some LED lights inside that change colour from time to time:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w100&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;6948&#34;
          height=&#34;3088&#34;
          src=&#34;https://martinh.net/img/glitched_hat_combo_hu_d12fbd6bf9bb56d9.gif&#34;
          srcset=&#34;https://martinh.net/img/glitched_hat_combo_hu_d12fbd6bf9bb56d9.gif 800w,/img/glitched_hat_combo_hu_4a1fb68482173e50.gif 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/glitched_hat_combo.gif&#34;
        /&gt;
  
  &lt;figcaption&gt;Glitched GIF made from three photos of some weird bearded nerd stitched together horizontally. The nerd is wearing a straw hat which is glowing from inside. It&amp;rsquo;s lit up a different colour in each photo, and in the middle photo it&amp;rsquo;s bright red. In the background are the lights (and trees) of the Woodland Stage at the Bearded Theory festival. Yes, it&amp;rsquo;s beards all the way down. Always has been.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;You don&amp;rsquo;t need to be a computer guru or an electronics whiz to make (or repair!) stuff, but once you have gone down that rabbithole you might want to learn new skills. If so, &lt;a href=&#34;https://wiki.hackerspaces.org/List_of_Hacker_Spaces&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;consider visiting your local hackspace / hackerspace / makerspace&lt;/a&gt;. The odds are good that you&amp;rsquo;ll find lots of nice friendly people there who will be keen to share what they&amp;rsquo;ve learned. Some spaces also do training courses and workshops.&lt;/p&gt;
&lt;a
  class=&#34;!rounded-md bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700&#34;
  href=&#34;https://wiki.hackerspaces.org/List_of_Hacker_Spaces&#34;
  target=&#34;_self&#34;
  
  role=&#34;button&#34;&gt;
  
Find your local Hackspace

&lt;/a&gt;

</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/fun-hat/featured-hat.jpg" />
    </item>
    
    <item>
      <title>The Simple Joy of Fixing Things</title>
      <link>https://martinh.net/hacks/fixing-joy/</link>
      <pubDate>Sat, 10 May 2025 23:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/fixing-joy/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/37c3-laser-threads.jpg&#34;,&#34;\/img\/38c3-cats-gaze-upwards.jpg&#34;,&#34;\/img\/38c3-dont-worry-blimp.jpg&#34;,&#34;\/img\/38c3-undersea-tableaux.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  Defeating planned obsolescence to save your stuff from the trash and stick it to The Man.
&lt;/div&gt;

&lt;p&gt;Ever had a wheel break on your suitcase, right before an Important Trip? Or maybe your phone just won&amp;rsquo;t charge any more? Or your washing machine keeps flooding the floor?&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w60&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;922&#34;
          height=&#34;1229&#34;
          src=&#34;https://martinh.net/img/suitcase-in-brussels_hu_affe2211914d41a.jpg&#34;
          srcset=&#34;https://martinh.net/img/suitcase-in-brussels_hu_affe2211914d41a.jpg 800w,/img/suitcase-in-brussels_hu_7fe75c240e311547.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/suitcase-in-brussels.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo of a red suitcase that has a load of hacker adjacent stickers attached to it, along with a bag and a coat. The suitcase is next to a Eurostar train at a platform. This particular Important Trip was a romantic weekend break with over 8,000 hackers at FOSDEM in Brussels.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;When I needed some new wheels for my suitcase, I was delighted to discover that I could buy a full set of wheels for just a few pounds. There was just one small problem&amp;hellip; the suitcase manufacturer had riveted the axles, so there were no screws to undo to take the old wheels off. Bah, humbug!&lt;/p&gt;
&lt;p&gt;Sometimes there&amp;rsquo;s genuinely no alternative to replacing a broken item, but often (perhaps more often than we realise) there are things that you can do to repair it and keep it going for a lot longer. However, in some territories the laws are actually being rewritten to make &amp;ldquo;unauthorised repairs&amp;rdquo; a criminal offence. &lt;em&gt;We don&amp;rsquo;t talk nearly enough about this &lt;a href=&#34;https://pluralistic.net/2022/10/23/how-to-fix-cars-by-breaking-felony-contempt-of-business-model/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Felony Contempt of Business Model&lt;/a&gt;&lt;/em&gt; as Cory Doctorow calls it.&lt;/p&gt;
&lt;p&gt;Maybe your washing machine is misbehaving because &lt;strong&gt;a tiny plastic clip has broken&lt;/strong&gt;. Maybe your phone&amp;rsquo;s &lt;strong&gt;USB-C socket has worn out&lt;/strong&gt; and needs to be replaced. And sometimes you just need &lt;strong&gt;a new wheel for your suitcase&lt;/strong&gt;. You should be able to fix it. And if you&amp;rsquo;re in Europe, you&amp;rsquo;re in luck - in June 2024 European Union countries voted to enact an &lt;a href=&#34;https://commission.europa.eu/law/law-topic/consumer-protection-law/directive-repair-goods_en&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;EU Right To Repair Directive&lt;/a&gt; which will come into force from July 2026.&lt;/p&gt;
&lt;p&gt;Luckily I had a hacksaw and was able to hack (literally) my way through the old axles, at which point the old wheels and what was left of the axles could be removed&amp;hellip;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w80&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;4096&#34;
          height=&#34;3072&#34;
          src=&#34;https://martinh.net/hacks/fixing-joy/featured-suitcase-repair_hu_a326d71cc1fd284.jpg&#34;
          srcset=&#34;https://martinh.net/hacks/fixing-joy/featured-suitcase-repair_hu_a326d71cc1fd284.jpg 800w,/hacks/fixing-joy/featured-suitcase-repair_hu_5cc3446fb61127c7.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/hacks/fixing-joy/featured-suitcase-repair.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo of a red suitcase with some hacker stickers attached to it, like a World&amp;rsquo;O&amp;rsquo;Techno warning sign. the suitcase is lying on a wooden floor on its side and a hacksaw has been inserted to cut through one of the riveted wheel axles. Also, there is an anti-littering sticker showing a stick person throwing a stick tank into a rubbish bin, much like this suitcase might end up if not repaired.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;I know that by using rivets the manufacturer can be confident that the wheels are unlikely to fall off, and they won&amp;rsquo;t require checking and tightening like wheels held on with nuts and bolts and screw threads. &lt;strong&gt;But ultimately it&amp;rsquo;s a customer hostile act.&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w60&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;3072&#34;
          height=&#34;4096&#34;
          src=&#34;https://martinh.net/hacks/fixing-joy/fixed-suitcase_hu_864ac269bdf56f98.jpg&#34;
          srcset=&#34;https://martinh.net/hacks/fixing-joy/fixed-suitcase_hu_864ac269bdf56f98.jpg 800w,/hacks/fixing-joy/fixed-suitcase_hu_520078421989806b.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/hacks/fixing-joy/fixed-suitcase.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo of the red suitcase again. This time it is standing upright, with spiffy new wheels that are held on with hex nut bolts. In front of the suitcase is a little pile of old wheels, mangled axles, fluff and shredded filings from the hacking episode.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;Should we try and repair everything that breaks? Maybe not - some things really aren&amp;rsquo;t repairable, or can&amp;rsquo;t be repaired cost effectiely, or can&amp;rsquo;t be repaired safely except by an expert. &lt;em&gt;But there&amp;rsquo;s a heck of a lot of stuff out there that can be repaired and reused.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If this is something you feel strongly about, then you might want to &lt;a href=&#34;https://www.repaircafe.org/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;check out your local Repair Café&lt;/a&gt;.&lt;/p&gt;
&lt;a
  class=&#34;!rounded-md bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700&#34;
  href=&#34;https://www.repaircafe.org/&#34;
  target=&#34;_self&#34;
  
  role=&#34;button&#34;&gt;
  
Find your local Repair Café

&lt;/a&gt;

&lt;p&gt;Residents of the Hermit Kingdom can also contact their MP about the &lt;a href=&#34;https://therestartproject.org/right-to-repair/uk-progress-2025/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;UK Repair &amp;amp; Reuse Declaration&lt;/a&gt;, and ask organisations they are involved with to sign the declaration.&lt;/p&gt;
&lt;a
  class=&#34;!rounded-md bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700&#34;
  href=&#34;https://therestartproject.org/right-to-repair/uk-progress-2025/&#34;
  target=&#34;_self&#34;
  
  role=&#34;button&#34;&gt;
  
Read the UK Repair &amp; Reuse Declaration

&lt;/a&gt;

&lt;p&gt;&lt;strong&gt;Can we fix it? Yes, we can!&lt;/strong&gt;&lt;/p&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/fixing-joy/featured-suitcase-repair.jpg" />
    </item>
    
    <item>
      <title>One Of Our Spiders Is Missing</title>
      <link>https://martinh.net/hacks/missing-spider/</link>
      <pubDate>Fri, 09 May 2025 22:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/missing-spider/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/emf2024-laser-lake1.jpg&#34;,&#34;\/img\/emf2024-lasers-over-tents.jpg&#34;,&#34;\/img\/emf2024-ledome-with-lasers.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  Hovercraft Parking, Spider Friendship Zones and Meowing Points were all the rage at EMF 2024
&lt;/div&gt;

&lt;p&gt;I&amp;rsquo;m very fond of the way that hacker culture positively encourages you to be playful with things like the branding for an event. Make it your own, have fun doing it, and make something whimsical if at all possible.&lt;/p&gt;
&lt;p&gt;If you were at &lt;a href=&#34;https://emfcamp.org&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Electromagnetic Field (EMF)&lt;/a&gt; in 2024 you might have seen some silly signs that I created as my own contribution to what, if we&amp;rsquo;re honest, was already &lt;em&gt;potentially the most whimsical event that weekend in Ledbury&lt;/em&gt; - if not the whole of Herefordshire. Here are some photos:&lt;/p&gt;


  
  
  
  &lt;div class=&#34;width-patch&#34;&gt;&lt;/div&gt;
&lt;div id=&#34;gallery-2b0a4f9efb267d3c8c5d38546cac13c8&#34; class=&#34;gallery&#34;&gt;
  
  &lt;img src=&#34;https://martinh.net/img/emfcamp2024-meowing-point-portrait.jpg&#34; class=&#34;grid-w50&#34; /&gt;
  &lt;img src=&#34;https://martinh.net/img/emfcamp2024-spider-friendship.jpg&#34; class=&#34;grid-w50&#34; /&gt;
  &lt;img src=&#34;https://martinh.net/img/emfcamp2024-triffid-zone.jpg&#34; class=&#34;grid-w50&#34; /&gt;
  &lt;img src=&#34;https://martinh.net/img/emfcamp2024-hovercraft-parking.jpg&#34; class=&#34;grid-w50&#34; /&gt;
&lt;figure&gt;&lt;figcaption&gt;Photos of a variety of silly signs derived from the EMF 2024 Solarpunk event theme and zip tied to posts on the festival site. The signs are entitled Hovercraft Parking, Meowing Point, Spider Friendship Zone and Triffid Zone, and attributed to various unlikely festivals such as Equipped Mechanics Fix 2024, Extremely Mobile Feline 2024, Embarrassed Moose Frown 2024 and Exotic Mango Flavours 2024.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;If you should find yourself in possession of (&lt;em&gt;let&amp;rsquo;s say&lt;/em&gt;) some hacker oriented artwork etc that you are able to remix without falling foul of the copyright ogres that live under the bridge next to the patent trolls, then you might find the &lt;a href=&#34;https://inkscape.org/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Inkscape open source vector graphics app&lt;/a&gt; useful for making a few&amp;hellip; &lt;strong&gt;alterations&lt;/strong&gt;, if you know what I mean:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w100&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;1125&#34;
          height=&#34;1028&#34;
          src=&#34;https://martinh.net/hacks/missing-spider/emfcamp2024-inkscape-signage_hu_2bda567dc312c45c.png&#34;
          srcset=&#34;https://martinh.net/hacks/missing-spider/emfcamp2024-inkscape-signage_hu_2bda567dc312c45c.png 800w,/hacks/missing-spider/emfcamp2024-inkscape-signage_hu_86ab93dcc3eca8e7.png 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/hacks/missing-spider/emfcamp2024-inkscape-signage.png&#34;
        /&gt;
  
  &lt;figcaption&gt;Inkscape vector graphics editor showing EMF sign hacking in progress. The sign being made is Meowing Point, which has an ISO 7010 standard Personal Protective Cat Ear Headband next to a message which advises that cat ears must be worn at all times. The EMF Solarpunk logo has been altered to add a pair of eyes above the tilde, making it look like a face. Possibly a triffid&amp;rsquo;s face, if such a thing existed. But more of that anon.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;One of the neat things about Inkscape is that you can edit &lt;a href=&#34;https://en.wikipedia.org/wiki/SVG&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Scaleable Vector Graphics (SVG)&lt;/a&gt; files, which most graphical web browsers know how to display. Or to put it another way, if you are looking at an SVG on a web page, there&amp;rsquo;s a good change you can download it and then hack away at it with Inkscape. &lt;strong&gt;Copyright ogres permitting, of course.&lt;/strong&gt; Completely coincidentally, here are some SVG files:&lt;/p&gt;


  
  
  
  &lt;div class=&#34;width-patch&#34;&gt;&lt;/div&gt;
&lt;div id=&#34;gallery-d22d4680b03781737d870932d5949163&#34; class=&#34;gallery&#34;&gt;
  
  &lt;img src=&#34;https://martinh.net/hacks/missing-spider/emfcamp2024-hovercraft-parking.svg&#34; class=&#34;grid-w50&#34; /&gt;
  &lt;img src=&#34;https://martinh.net/hacks/missing-spider/emfcamp2024-meowing-point.svg&#34; class=&#34;grid-w50&#34; /&gt;
  &lt;img src=&#34;https://martinh.net/hacks/missing-spider/emfcamp2024-spider-zone.svg&#34; class=&#34;grid-w50&#34; /&gt;
  &lt;img src=&#34;https://martinh.net/hacks/missing-spider/emfcamp2024-triffid-zone.svg&#34; class=&#34;grid-w50&#34; /&gt;
&lt;figure&gt;&lt;figcaption&gt;Downloadable and hence editable SVG versions of the four posters above.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;The title of this post is &lt;em&gt;One Of Our Spiders Is Missing&lt;/em&gt;, but this is just a bit of silly wordplay to encourage you to read the post all the way to the end. And to be fair EMF is generally very well provisioned on the spider front. You could lose a few spiders and &lt;em&gt;there would still be thousands more&amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;What actually went missing was the Neurotypical Zone sign, as shown below. This was meant to be a light hearted riff on neurodiversity, but with hindsight I can see that it might have been quite unwelcome and triggering for some people. &lt;strong&gt;Apologies if you saw the sign and felt that way about it - please know that this was not the intention.&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w50&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;1210&#34;
          height=&#34;1613&#34;
          src=&#34;https://martinh.net/img/emfcamp2024-neurotypical-zone_hu_480753bf02309abf.jpg&#34;
          srcset=&#34;https://martinh.net/img/emfcamp2024-neurotypical-zone_hu_480753bf02309abf.jpg 800w,/img/emfcamp2024-neurotypical-zone_hu_b5a9721311f094c0.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/emfcamp2024-neurotypical-zone.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;The one that got away - the Neurotypical Zone sign. The text asks people to refrain from stimming and infodumping in this area. The sign is attributed to something calling itself Extendible Metro Funicular 2024.&lt;/figcaption&gt;
  &lt;/figure&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/missing-spider/featured-spider-friendship-zone.jpg" />
    </item>
    
    <item>
      <title>Our Giant Jellybaby OPSEC is Clean</title>
      <link>https://martinh.net/hacks/jellybaby-opsec/</link>
      <pubDate>Wed, 07 May 2025 20:32:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/jellybaby-opsec/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/38c3-chaosception.jpg&#34;,&#34;\/img\/38c3-fairydust-torus.jpg&#34;,&#34;\/img\/cccamp2023-chaos-unicorn.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  Let&amp;rsquo;s hack the GPS locations in our photos, for fun &lt;em&gt;and personal safety&lt;/em&gt;!
&lt;/div&gt;

&lt;p&gt;Did you know that each photo you take with your phone has a bunch of &lt;em&gt;metadata&lt;/em&gt; added to it? The photo metadata is something called the &lt;a href=&#34;https://en.wikipedia.org/wiki/Exif&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Exchangeable image file format (Exif)&lt;/a&gt;, &amp;ldquo;a standard that specifies formats for images, sound, and ancillary tags used by digital cameras (including smartphones), scanners and other systems handling image and sound files recorded by digital cameras.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Hello again! Are you still awake? Great!!&lt;/p&gt;
&lt;p&gt;Metadata - that sounds a bit boring, doesn&amp;rsquo;t it? Only a librarian could possibly get excited about metadata! (This is a librarian in-joke that I can just about get away with as a sometime &lt;a href=&#34;https://www.urbandictionary.com/define.php?term=Shambrarian&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;shambrarian&lt;/a&gt;) Metadata probably isn&amp;rsquo;t very important, and surely nobody could ever have been harmed by metadata? Like &lt;a href=&#34;https://thebulletin.org/2022/06/after-roes-overturn-the-abortion-surveillance-state/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;people seeking gender affirming care after becoming pregnant&lt;/a&gt;. Nope, probably nothing.&lt;/p&gt;

  
  
  
  



&lt;div
  
    class=&#34;flex px-4 py-3 rounded-md shadow&#34; style=&#34;background-color: #5f0000&#34;
  
  &gt;
  &lt;span
    
      class=&#34;text-primary-400 pe-3 flex items-center&#34;
    
    &gt;
    &lt;span class=&#34;relative block icon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 512 512&#34;&gt;&lt;path fill=&#34;currentColor&#34; d=&#34;M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z&#34;/&gt;&lt;/svg&gt;
&lt;/span&gt;
  &lt;/span&gt;

  &lt;span
    
      class=&#34;dark:text-neutral-300&#34;
    
    &gt;&lt;strong&gt;Warning!&lt;/strong&gt; This is a lie. He is lying to you. &lt;strong&gt;Again&lt;/strong&gt;.&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;I&amp;rsquo;d just like to interject for a moment. Would you care for a jelly baby?&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w70&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;1536&#34;
          height=&#34;2048&#34;
          src=&#34;https://martinh.net/hacks/jellybaby-opsec/featured-giant-jellybaby_hu_6a2bcc0288b4d29d.jpg&#34;
          srcset=&#34;https://martinh.net/hacks/jellybaby-opsec/featured-giant-jellybaby_hu_6a2bcc0288b4d29d.jpg 800w,/hacks/jellybaby-opsec/featured-giant-jellybaby_hu_a1d227aeb561821c.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/hacks/jellybaby-opsec/featured-giant-jellybaby.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo of a giant orange jelly baby &amp;ldquo;statue&amp;rdquo; against a pink background, created by Mauro Perucchetti. It&amp;rsquo;s hard to tell from the picture, but the jelly baby is over a metre tall. It&amp;rsquo;s big, baby.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;So let&amp;rsquo;s talk metadata. And Giant Jelly Babies. &lt;strong&gt;Wait, what the heck is this all about?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Imagine that once upon a time you had visited (let&amp;rsquo;s say) a top secret location where the Giant Jellybaby takeover of Planet Earth was being planned. Perhaps you are secretly in league with our new Jelly Overlords. Who can say? Still waters run deep, and all that&amp;hellip;&lt;/p&gt;
&lt;p&gt;While you were at the Jellyplex, you foolishly (and &lt;em&gt;against all the rules&lt;/em&gt;) snapped some photos of these mysterious and elusive characters - like the one above. What would the metadata attached to one of your photos look like? Here&amp;rsquo;s a snippit, extracted using Phil Harvey&amp;rsquo;s fabulous &lt;a href=&#34;https://exiftool.org/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;em&gt;exiftool&lt;/em&gt;&lt;/a&gt; utility:&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ exiftool giant-jellybaby.jpg &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; head -16
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ExifTool Version Number         : 12.76
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;File Name                       : giant-jellybaby.jpg
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Directory                       : .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;File Size                       : &lt;span class=&#34;m&#34;&gt;341&lt;/span&gt; kB
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;File Modification Date/Time     : 2025:05:07 22:26:22+01:00
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;File Access Date/Time           : 2025:05:07 22:26:23+01:00
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;File Inode Change Date/Time     : 2025:05:07 22:26:22+01:00
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;File Permissions                : -rw-rw-r--
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;File Type                       : JPEG
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;File Type Extension             : jpg
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MIME Type                       : image/jpeg
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;JFIF Version                    : 1.01
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Exif Byte Order                 : Big-endian &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Motorola, MM&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Make                            : LGE
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Camera Model Name               : Nexus &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Orientation                     : Horizontal &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;normal&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This is probably only interesting to massive nerds like me (massive nerd shout out for the legendary Nexus 5!), but maybe if we dig a bit deeper&amp;hellip;&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ exiftool giant-jellybaby.jpg &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep GPS
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPS Version ID                  : 2.2.0.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPS Latitude Ref                : North
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPS Longitude Ref               : West
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPS Altitude Ref                : Above Sea Level
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPS Time Stamp                  : 10:46:50
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPS Img Direction Ref           : Magnetic North
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPS Img Direction               : &lt;span class=&#34;m&#34;&gt;34&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPS Date Stamp                  : 2014:09:25
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPS Altitude                    : &lt;span class=&#34;m&#34;&gt;136&lt;/span&gt; m Above Sea Level
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPS Date/Time                   : 2014:09:25 10:46:50Z
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPS Latitude                    : &lt;span class=&#34;m&#34;&gt;51&lt;/span&gt; deg 31&lt;span class=&#34;s1&#34;&gt;&amp;#39; 45.59&amp;#34; N
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;GPS Longitude                   : 0 deg 7&amp;#39;&lt;/span&gt; 33.47&lt;span class=&#34;s2&#34;&gt;&amp;#34; W
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;GPS Position                    : 51 deg 31&amp;#39; 45.59&amp;#34;&lt;/span&gt; N, &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; deg 7&lt;span class=&#34;err&#34;&gt;&amp;#39;&lt;/span&gt; 33.47&lt;span class=&#34;s2&#34;&gt;&amp;#34; W&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;That looks bad. That&amp;rsquo;s the kind of thing that could get you into hot water with the Giant Jelly Babies. And let&amp;rsquo;s face it, none of us wants to go &lt;em&gt;there&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Luckily you are (in my fevered imagination at least) actually an infosec maven and fully aware that you can also use &lt;em&gt;exiftool&lt;/em&gt; to edit the metadata, including the GPS coordinates and other useful stuff like the orientation hint - of which more anon. You quickly run the following command to set the GPS coordinates to &lt;a href=&#34;https://en.wikipedia.org/wiki/Null_Island&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Null Island&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ exiftool -GPSLatitude&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; -GPSLatitudeRef&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;N -GPSLongitude&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; -GPSLongitudeRef&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;E giant-jellybaby.jpg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Null Island doesn&amp;rsquo;t actually exist - it&amp;rsquo;s just the place in the Atlantic Ocean where GPS Latitude and Longitude are both zero.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So in a very real sense your Giant Jelly Baby photo will now sleep with the digital (jelly) fishes.&lt;/strong&gt;&lt;/p&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/jellybaby-opsec/featured-giant-jellybaby.jpg" />
    </item>
    
    <item>
      <title>The Name&#39;s Burns. Ken Burns...</title>
      <link>https://martinh.net/hacks/it-kenburns/</link>
      <pubDate>Tue, 06 May 2025 16:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/it-kenburns/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/cccamp2023-dome-and-lasers.jpg&#34;,&#34;\/img\/38c3-orange-cats.jpg&#34;,&#34;\/img\/cccamp2023-woodland-orb.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  Bling up your web pages with a little help from a Hugo shortcode!
&lt;/div&gt;

&lt;p&gt;Fed up of all those tired off-the-shelf themes and same-y looking websites? Maybe it&amp;rsquo;s time to spice things up a bit!&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re using a Static Site Generator like &lt;a href=&#34;https://gohugo.io/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Hugo&lt;/a&gt; or &lt;a href=&#34;https://gohugo.io/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Jekyll&lt;/a&gt;, it can be surprisingly easy to make big changes to your site.&lt;/p&gt;
&lt;p&gt;Like maybe loading random images as your page backgrounds and then subjecting your readers to the eponymous Ken Burns panning and zooming effect?&lt;/p&gt;
&lt;p&gt;Would that be wrong? &lt;strong&gt;No, surely not!&lt;/strong&gt; It must be the (&lt;em&gt;now sadly traumatised&lt;/em&gt;) readers who are wrong.&lt;/p&gt;
&lt;p&gt;Why, it could be as simple as adding one line to the Markdown code for a page:&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{{&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;kenburns&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;urls&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;cat1.jpg,cat2.jpg,cat3.jpg&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

  
  
  
  



&lt;div
  
    class=&#34;flex px-4 py-3 rounded-md shadow&#34; style=&#34;background-color: #5f0000&#34;
  
  &gt;
  &lt;span
    
      class=&#34;text-primary-400 pe-3 flex items-center&#34;
    
    &gt;
    &lt;span class=&#34;relative block icon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 512 512&#34;&gt;&lt;path fill=&#34;currentColor&#34; d=&#34;M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z&#34;/&gt;&lt;/svg&gt;
&lt;/span&gt;
  &lt;/span&gt;

  &lt;span
    
      class=&#34;dark:text-neutral-300&#34;
    
    &gt;&lt;strong&gt;Warning!&lt;/strong&gt; This is a lie. He is lying to you.&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;OK, it&amp;rsquo;s not quite that simple. Especially if you haven&amp;rsquo;t tangled with the inner workings of an SSG before.&lt;/p&gt;
&lt;p&gt;But it&amp;rsquo;s not &lt;em&gt;too&lt;/em&gt; far off.&lt;/p&gt;
&lt;p&gt;First you&amp;rsquo;ll need a bit of CSS to do the Magical-Ken-Burnsy-Bits. Through a process of trial and error, search engines and the powerful copy/paste function, I arrived at this (default cats are optional):&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;keyframes&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;kenburns&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;transform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;scale&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;opacity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;50&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;transform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;scale&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;opacity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;transform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;scale&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;opacity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;kenburns-background&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;position&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;fixed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;top&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;left&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;width&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;vw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;height&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;vh&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;background-image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;/img/optional-default-cats.jpg&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;background-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;cover&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;background-position&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;center&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;z-index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;-1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;animation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kenburns&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;infinite&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;alternate&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;ease-in-out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;On my Hugo installation this is added to &lt;em&gt;assets/css/custom.css&lt;/em&gt;, the CSS theme customisations which are inserted as part of each page build.&lt;/p&gt;
&lt;p&gt;Then you need to create need something called a shortcode, which becomes a &amp;ldquo;command&amp;rdquo; that you can call from your Markdown. My &lt;em&gt;kenburns&lt;/em&gt; shortcode looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-md&#34; data-lang=&#34;md&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{{- $images := split (.Get &amp;#34;urls&amp;#34;) &amp;#34;,&amp;#34; -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{{- $bgid := .Get &amp;#34;bgid&amp;#34; | default &amp;#34;kenburns-background&amp;#34; -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;div id=&amp;#34;{{ $bgid }}&amp;#34; class=&amp;#34;{{ $bgid }}&amp;#34;&amp;gt;&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;script&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    const images = [
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        {{ range $images }}&amp;#34;{{ . }}&amp;#34;,{{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ];
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    const randomImage = images[Math.floor(Math.random() * images.length)];
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    document.getElementById(&amp;#34;{{ $bgid }}&amp;#34;).style.backgroundImage = &lt;span class=&#34;sb&#34;&gt;`url(&amp;#39;${randomImage}&amp;#39;)`&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The shortcode above takes two parameters - &lt;em&gt;bgid&lt;/em&gt; is the ID to use for the HTML element that the image will be inserted into - &lt;em&gt;kenburns-background&lt;/em&gt; by default to match the CSS. Then there&amp;rsquo;s &lt;em&gt;urls&lt;/em&gt;, a comma delimited list of the images to pick from.&lt;/p&gt;
&lt;p&gt;On my Hugo installation this is added to &lt;em&gt;layouts/shortcodes/kenburns.html&lt;/em&gt;, at which point it becomes possible to use it as a shortcode in pages or even add it to the master page template.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;As if anyone would ever do such a thing&amp;hellip;&lt;/strong&gt;&lt;/p&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/it-kenburns/featured-inception.jpg" />
    </item>
    
    <item>
      <title>You Wouldn&#39;t Bring a CyberBag to an Algorave</title>
      <link>https://martinh.net/hacks/algorave-cyberbag/</link>
      <pubDate>Tue, 06 May 2025 15:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/algorave-cyberbag/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/38c3-ceiling-petals.jpg&#34;,&#34;\/img\/38c3-cyber-briefcase.jpg&#34;,&#34;\/img\/38c3-internet.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  What if you wanted to make a shiny 🎇 blinkenlight bling bag 🎇 that reacted to the sounds around it?
&lt;/div&gt;

&lt;p&gt;Maybe it would look something like this&amp;hellip;&lt;/p&gt;
&lt;figure&gt;
&lt;video controls preload=&#34;auto&#34; width=&#34;100%&#34;  playsinline class=&#34;html-video&#34;&gt;
    &lt;source src=&#34;https://martinh.net/hacks/algorave-cyberbag/blinken-cyberbag.mp4&#34; type=&#34;video/mp4&#34;&gt;
  &lt;span&gt;&lt;/span&gt;
&lt;/video&gt;
&lt;figcaption&gt;Video clip of my CyberBag flashing bright lights with its LEDs in response to everyone&amp;rsquo;s favourite Vocaloid song about jumping into a nuclear reactor, &lt;a href=&#34;https://soundcloud.com/iroha_sasaki/roshin&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Meltdown by iroha(sasaki)&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I made this bag towards the end of 2024 to bring along to hacker events and annoy the neighbours, and thought it would be a fun addition to an Algorave being organised by the &lt;a href=&#34;https://patternclub.org/sheffield/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;lovely Patternclub Sheffield folk&lt;/a&gt; in April 2025.&lt;/p&gt;

  
  
  
  



&lt;div
  
    class=&#34;flex px-4 py-3 rounded-md shadow&#34; style=&#34;background-color: #5f0000&#34;
  
  &gt;
  &lt;span
    
      class=&#34;text-primary-400 pe-3 flex items-center&#34;
    
    &gt;
    &lt;span class=&#34;relative block icon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 512 512&#34;&gt;&lt;path fill=&#34;currentColor&#34; d=&#34;M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z&#34;/&gt;&lt;/svg&gt;
&lt;/span&gt;
  &lt;/span&gt;

  &lt;span
    
      class=&#34;dark:text-neutral-300&#34;
    
    &gt;&lt;strong&gt;Warning!&lt;/strong&gt; Algorave rabbithole ahead. Approach with caution&amp;hellip;&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;If you&amp;rsquo;ve not come across the Algorave concept before, the idea is that a bunch of people get up on stage (if there is a stage) and live code some music using an &lt;a href=&#34;https://tidalcycles.org/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;algorithmic approach like TidalCycles&lt;/a&gt;. There are a bunch of open source tools to help you out, in particular &lt;a href=&#34;https://strudel.cc/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;the Strudel live coding platform&lt;/a&gt;, the &lt;a href=&#34;https://hydra.ojack.xyz/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Hydra video synthesizer&lt;/a&gt; and collaborative live coding environments like &lt;a href=&#34;https://www.todepond.cool/flok/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Flok&lt;/a&gt; and &lt;a href=&#34;https://nudel.cc/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Nudel&lt;/a&gt;. You&amp;rsquo;ll notice when you visit these websites that they encourage you to hack, tweak and remix existing compositions. There are a lot of people sharing their creations, in what is a defiantly open culture. If this sounds interesting, you might want to &lt;a href=&#34;https://www.youtube.com/watch?v=-Nxm4qrUOkg&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;watch the live stream of the April 2025 algorave in Sheffield&lt;/a&gt;.&lt;/p&gt;

  
  
  
  



&lt;div
  
    class=&#34;flex px-4 py-3 rounded-md shadow&#34; style=&#34;background-color: #005f00&#34;
  
  &gt;
  &lt;span
    
      class=&#34;text-primary-400 pe-3 flex items-center&#34;
    
    &gt;
    &lt;span class=&#34;relative block icon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 448 512&#34;&gt;&lt;path fill=&#34;currentColor&#34; d=&#34;M438.6 105.4C451.1 117.9 451.1 138.1 438.6 150.6L182.6 406.6C170.1 419.1 149.9 419.1 137.4 406.6L9.372 278.6C-3.124 266.1-3.124 245.9 9.372 233.4C21.87 220.9 42.13 220.9 54.63 233.4L159.1 338.7L393.4 105.4C405.9 92.88 426.1 92.88 438.6 105.4H438.6z&#34;/&gt;&lt;/svg&gt;
&lt;/span&gt;
  &lt;/span&gt;

  &lt;span
    
      class=&#34;dark:text-neutral-300&#34;
    
    &gt;It is now safe to continue. &lt;strong&gt;Perhaps.&lt;/strong&gt;&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;This post will focus on the 🎇 blinkenlights 🎇 but I might write up the bag part separately. For now, just imagine that you have a handy transparent bag or box somewhere that you could put your bits and bobs in. Bonus points if you &lt;em&gt;line it with dichroic film&lt;/em&gt;, but more of that anon&amp;hellip;&lt;/p&gt;
&lt;p&gt;Unfortunately my initial attempt at a CyberBag didn&amp;rsquo;t last the night much beyond the photo at the end of this post, so I took the opportunity afterwards to have another go with benefit of hindsight. Here, without further ado, are the key ingredients of CyberBag mk2, featured in the video above:&lt;/p&gt;


  
  
  
  
  
  &lt;div class=&#34;width-patch&#34;&gt;&lt;/div&gt;
&lt;div id=&#34;gallery-b1a9ce14067f5da65580588ca3ebd6cc&#34; class=&#34;gallery&#34;&gt;
  
  &lt;img src=&#34;https://martinh.net/img/blinkencontroller.jpg&#34; class=&#34;grid-w30 md:grid-w25 xl:grid-w20&#34; /&gt;
  &lt;img src=&#34;https://martinh.net/img/blinkencontroller-back.jpg&#34; class=&#34;grid-w30 md:grid-w25 xl:grid-w20&#34; /&gt;
  &lt;img src=&#34;https://martinh.net/img/electret-front.jpg&#34; class=&#34;grid-w30 md:grid-w25 xl:grid-w20&#34; /&gt;
  &lt;img src=&#34;https://martinh.net/img/electret-back.jpg&#34; class=&#34;grid-w30 md:grid-w25 xl:grid-w20&#34; /&gt;
  &lt;img src=&#34;https://martinh.net/img/blinkenbag-insides.jpg&#34; class=&#34;grid-w30 md:grid-w25 xl:grid-w20&#34; /&gt;
  &lt;img src=&#34;https://martinh.net/img/blinkencontroller-selfie.jpg&#34; class=&#34;grid-w30 md:grid-w25 xl:grid-w20&#34; /&gt;
&lt;figure&gt;
&lt;figcaption&gt;Photos above show a moodily lit Pimoroni Plasma 2350W microcontroller with two cables attached. One cable is an LED driver cable attached to the controller&#39;s built-in connectors. It terminates in a socket that a suitably equipped LED cable can be plugged into. The other cable is actually three separate female-to-female Dupont cables. At the controller end it is attached to a 15 pin header which has been clumsily soldered to the controller. At the other end it is attached to a 3 pin header soldered to a cheap electret microphone with manually adjustable gain. In the final photo this contraption has been stuffed into the CyberBag along with a power bank, some LED strips and (inexplicably) the keyboard base of a ThinkPad X1 Carbon laptop.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;You might be able to pick up the details from the photos, but in case it&amp;rsquo;s useful here they are in a more readable format:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pimoroni Plasma 2350W microcontroller&lt;/li&gt;
&lt;li&gt;3 pin LED Strip Input/Output Cable (with pin termination)&lt;/li&gt;
&lt;li&gt;2 x Neon-like RGB LED Strip with Diffuser (aka NeoPixel, WS2812, SK6812)&lt;/li&gt;
&lt;li&gt;DollaTek Electret Microphone Amplifier MAX4466 Module with Adjustable Gain&lt;/li&gt;
&lt;li&gt;3 x female-to-female Dupont cables&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I got most of these components from &lt;a href=&#34;https://pimoroni.com&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Pimoroni&lt;/a&gt;, &lt;strong&gt;Sheffield&amp;rsquo;s finest Purveyors of Piratical Paraphenalia&lt;/strong&gt;, but they are also available from other reputable suppliers. And some less reputable ones whose drivers allegedly have to pee in bottles.&lt;/p&gt;
&lt;p&gt;To make the 🎇 blinkenlights 🎇 happen, we need to connect the microphone to the 2350W. However, the microphone and the 2350W don&amp;rsquo;t come with headers soldered on, so I did this bit myself. Don&amp;rsquo;t judge me! &lt;em&gt;My soldering is slowly improving&amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I used the 5V, DAT and &amp;ldquo;-&amp;rdquo; (Ground) screw connectors on the 2350W for the cable which feeds the LED strips - this only has three pins. The ordering of the pins on both cables is important, so if attempting your own build, be sure to check the docs for your LEDs.&lt;/p&gt;
&lt;p&gt;For the microphone, I used the 2350W&amp;rsquo;s first Analogue to Digital Converter (aka ADC0, but labelled A0 on the Plasma board), the 3V3 power output and one of the &amp;ldquo;-&amp;rdquo; ground pins. Again the ordering is important so be sure to check, and then check again to avoid inadvertently releasing the dreaded blue smoke. The pinout is labelled on the mic itself.&lt;/p&gt;
&lt;p&gt;Finally, I futzed about with adapting Pimoroni&amp;rsquo;s &lt;em&gt;fire.py&lt;/em&gt; MicroPython demo code in an attempt to feed in and massage the audio samples from the microphone and map the mic voltage to a suitable range of colours. NB This is all very low effort code, could undoubtedly be done better, and doesn&amp;rsquo;t make best use of the 2350W hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But it sort of mostly works, so that&amp;rsquo;s all good!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;See below for the code, which you just need to copy onto your 2350W as &lt;em&gt;main.py&lt;/em&gt; using &lt;em&gt;Thonny&lt;/em&gt;, &lt;em&gt;mpremote&lt;/em&gt; or your tool of choice.&lt;/p&gt;
&lt;p&gt;I have to extend massive thanks to Kevin Walters for his article on Instructables &lt;a href=&#34;https://www.instructables.com/Adding-a-Microphone-to-Pi-Pico-W-on-Pimoroni-Galac/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Adding a Microphone to Pi Pico W on Pimoroni Galactic Unicorn&lt;/a&gt; which I liberally plundered for ideas. Adafruit also have some &lt;a href=&#34;https://www.adafruit.com/product/1063&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;very useful info on the Maxim MAX4466 op-amp&lt;/a&gt; which may be of interest.&lt;/p&gt;
&lt;p&gt;If you decide to make a CyberBag after reading this, don&amp;rsquo;t forget to take it to your nearest algorave, hackspace or demoparty&amp;hellip;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w80&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;553&#34;
          height=&#34;737&#34;
          src=&#34;https://martinh.net/img/algorave-blinkenbag_hu_3e67a6e7bba3d26e.jpg&#34;
          srcset=&#34;https://martinh.net/img/algorave-blinkenbag_hu_3e67a6e7bba3d26e.jpg 800w,/img/algorave-blinkenbag_hu_cb842aae9f54a70b.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/algorave-blinkenbag.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo of a colourful transparent bag which has LED lighting inside. The bag has a 3D printed CYBER sign and is resting on the floor behind some people who are shuffling nervously to the machine beat of algorave supergroup &lt;a href=&#34;https://pastagang.cc&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;pastagang&lt;/a&gt; whilst trying not to spill their drinks. pastagang themselves are pictured in the far distance gyrating wildly on the stage.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;plasma&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;random&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;random&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;uniform&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;machine&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ADC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Pin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Initialize ADC on pin GP26 (ADC0)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;adc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ADC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Pin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;26&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;NUM_LEDS&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;192&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;led_strip&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;plasma&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WS2812&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NUM_LEDS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;color_order&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;plasma&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;COLOR_ORDER_RGB&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;led_strip&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;start&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;moving_average&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;new_sample&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;new_sample&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# Remove the oldest sample if the list exceeds the size&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;sample_size&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;50&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# Number of samples for averaging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# List to store the samples&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;maxi&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# Read the raw ADC value (0-65535 for 16-bit resolution)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;raw_value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;adc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read_u16&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;filtered_value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;moving_average&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw_value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sample_size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;voltage&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;filtered_value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;65535&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;3.3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;voltage&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;maxi&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;voltage&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;150&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# fudge factor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;flooring&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxi&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;ceiling&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxi&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;flooring&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;110&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;flooring&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;110&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ceiling&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;140&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ceiling&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;140&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;hue&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;uniform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;flooring&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ceiling&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;sat&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;random&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;bright&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;random&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NUM_LEDS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;led_strip&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;set_hsv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bright&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sleep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/algorave-cyberbag/featured-algorave-blinkenbag.jpg" />
    </item>
    
    <item>
      <title>Filing a Bug Report with my Elected Representative</title>
      <link>https://martinh.net/hacks/bug-report/</link>
      <pubDate>Sun, 04 May 2025 12:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/bug-report/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/cccamp2023-chaos-unicorn.jpg&#34;,&#34;\/img\/cccamp2023-dome-and-lasers.jpg&#34;,&#34;\/img\/cccamp2023-googly-chaos-post.jpg&#34;,&#34;\/img\/cccamp2023-mirror-thing1.jpg&#34;,&#34;\/img\/cccamp2023-mirror-thing2.jpg&#34;,&#34;\/img\/cccamp2023-tree-ring-and-star.jpg&#34;,&#34;\/img\/cccamp2023-woodland-orb.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  Disappointed that the Overton Window always seems to shift right? It&amp;rsquo;s more likely than you&amp;rsquo;d think
&lt;/div&gt;

&lt;p&gt;I got so cross about this that in the Spring of 2025 I took the almost unprecedented step (for me) of writing to my Member of Parliament to grumble about it. Here is an artist&amp;rsquo;s impression of my grumpy-but-determined face at this point&amp;hellip;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w45&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;232&#34;
          height=&#34;309&#34;
          src=&#34;https://martinh.net/hacks/bug-report/featured-pastafarian-martin_hu_dd0620d4aea8a5c2.png&#34;
          srcset=&#34;https://martinh.net/hacks/bug-report/featured-pastafarian-martin_hu_dd0620d4aea8a5c2.png 800w,/hacks/bug-report/featured-pastafarian-martin_hu_dffa10bf75da3ae3.png 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/hacks/bug-report/featured-pastafarian-martin.png&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo of me with a yellow pasta drainer on my head, looking grumpy. On closer inspection the pasta drainer appears to have googly eyes on stalks emanating from it&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;I&amp;rsquo;m under no illusions that this will change anything, but it made me feel better for a moment.&lt;/p&gt;
&lt;p&gt;If you care about the erosion of human rights, civil liberties, democracy and (gesticulates wildly) &lt;em&gt;all that stuff&lt;/em&gt;, you might want to consider writing to your elected representative too.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You never know, it might make all the difference.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For UKians there is a &lt;a href=&#34;https://www.theyworkforyou.com/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;fantastic website called TheyWorkForYou&lt;/a&gt; which lets you find your MP and learn more about their track record including voting record, expenses, speeches and comments in parliamentary debates.&lt;/p&gt;
&lt;a
  class=&#34;!rounded-md bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700&#34;
  href=&#34;https://www.theyworkforyou.com/&#34;
  target=&#34;_self&#34;
  
  role=&#34;button&#34;&gt;
  
Contact your MP

&lt;/a&gt;

&lt;p&gt;Here&amp;rsquo;s what I said to my MP&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Dear Dr Sandher,&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;I am one of your constituents in Loughborough.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Like many people in the UK, I was excited at the prospect of a change of government last year. Like many, I looked forward to a more progressive agenda under the incoming Labour government. But like many people, I’m feeling a bit let down right now.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;I understand that public discourse in the UK is dominated by right-leaning media outlets. I understand that many of our newspapers and television channels are owned by billionaires who see the media primarily as a vehicle to promote their own agenda.  I appreciate that this creates challenges for people who are active in progressive politics.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;I’m also well aware that there are a substantial number of people in the UK who are not “progressive”, or who simply don’t take an interest in politics. But we have had fourteen years of austerity. Not just austerity, but also concerted efforts to create and amplify divisions in our society.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;At a time when we should be coming together to rebuild Britain, Labour’s disregard for and dismissal of vulnerable minority groups such as transgender and disabled people now that the party is in government is particularly striking.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;When I see Labour reflexively tack further to the right on a daily basis, I worry that we’ll end up with a situation where the Venn diagram of Labour and Reform values and policies is effectively a circle.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;When I see Labour implement policies like benefits changes that will make life harder for millions of people, I worry that voters will conclude  they might as well vote for Reform, because they feel they have nothing left to lose. The two party system has let them down yet again.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;We only have to look across the Atlantic Ocean to see how that particular story ends. Let’s not fall into that trap.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you&amp;rsquo;ve been affected by the issues discussed in this post, know that you are not alone.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;PS If you find TheyWorkForYou useful and interesting, &lt;a href=&#34;https://www.mysociety.org/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;consider supporting MySociety&lt;/a&gt;, the not-for-profit social enterprise company which created and maintains it.&lt;/p&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/bug-report/featured-pastafarian-martin.png" />
    </item>
    
    <item>
      <title>Dancing on The Ceiling with a Halfdome</title>
      <link>https://martinh.net/hacks/dreamsicle-dome/</link>
      <pubDate>Sat, 03 May 2025 15:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/dreamsicle-dome/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/38c3-ceiling-petals.jpg&#34;,&#34;\/img\/38c3-cyber-briefcase.jpg&#34;,&#34;\/img\/38c3-internet.jpg&#34;,&#34;\/img\/38c3-fairydust-torus.jpg&#34;,&#34;\/img\/38c3-pixelflut.jpg&#34;,&#34;\/img\/38c3-recycle-reuse-refuse.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  Have you ever wondered how you could create an amazing light show that would fill an entire room with just a mirror?
&lt;/div&gt;

&lt;p&gt;The thought hadn&amp;rsquo;t really crossed my mind until I saw this amazing geodesic dome at the Chaos Communication Camp in the summer of 2023:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w60&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;3520&#34;
          height=&#34;1980&#34;
          src=&#34;https://martinh.net/img/cccamp2023-bananadome_hu_66faf9192162c5ef.jpg&#34;
          srcset=&#34;https://martinh.net/img/cccamp2023-bananadome_hu_66faf9192162c5ef.jpg 800w,/img/cccamp2023-bananadome_hu_7097b2744a93a0a6.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/cccamp2023-bananadome.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo of a geodesic dome which is illuminated from the inside by a video projection of a banana floating around behind a backdrop of black triangles that appear to be connected together&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;I discovered that you can achieve this kind of effect using something called a halfdome mirror. Halfdome mirrors are normally used for safety and security, e.g. attached to walls or ceilings to give extra visibility at entries and exits. They look like this, although the geodesic dome tent is optional&amp;hellip;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w60&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;548&#34;
          height=&#34;276&#34;
          src=&#34;https://martinh.net/img/halfdome-in-a-dome_hu_ca435696add35d5a.png&#34;
          srcset=&#34;https://martinh.net/img/halfdome-in-a-dome_hu_ca435696add35d5a.png 800w,/img/halfdome-in-a-dome_hu_78d54bc3b331eb52.png 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/halfdome-in-a-dome.png&#34;
        /&gt;
  
  &lt;figcaption&gt;Photo of a halfdome mirror in a geodesic dome tent. There is a projector pointing at it and some reflected blue light which looks like laser beams. If you look really closely you might see a middle aged person crouched down on the floor taking a photo with their phone&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;It turns out that if you point a light source (such as a projector playing a video) at a halfdome pushed up against a wall, it produces the most wonderfully distorted reflections which can pretty much fill up an entire room. Like this clip of the video for &lt;a href=&#34;https://blackmothsuperrainbow.bandcamp.com/track/dreamsicle-bomb&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Dreamsicle Bomb by Black Moth Super Rainbow&lt;/a&gt; in my living room:&lt;/p&gt;
&lt;figure&gt;
&lt;video controls preload=&#34;auto&#34; width=&#34;100%&#34;  playsinline class=&#34;html-video&#34;&gt;
    &lt;source src=&#34;https://martinh.net/hacks/dreamsicle-dome/dreamsicle-dome.mp4&#34; type=&#34;video/mp4&#34;&gt;
  &lt;span&gt;&lt;/span&gt;
&lt;/video&gt;
&lt;figcaption&gt;Video showing colourful artistic graphics being projected onto the walls and ceiling of a room from a projector which is reflecting off a halfdome. Two sock-clad feet are visible at the bottom of the frame if you look closely.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;OK, so you do need that light source - but if you have access to a projector or something else that produces interesting patterns and colours then the halfdome mirror is fairly inexpensive at around £30-£40. Alternatively, you could make your own &lt;em&gt;wonky mirrored surface&lt;/em&gt; and really lean into the whole DIY aesthetic!&lt;/p&gt;
&lt;p&gt;Note that further processing is required to take an normal image or video and warp it to display well when mirrored inside a dome type structure. &lt;a href=&#34;https://paulbourke.net/dome/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Paul Bourke&lt;/a&gt; has produced a highly detailed writeup and also created some software in case you&amp;rsquo;re interested.&lt;/p&gt;
&lt;a
  class=&#34;!rounded-md bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700&#34;
  href=&#34;https://paulbourke.net/dome/&#34;
  target=&#34;_self&#34;
  
  role=&#34;button&#34;&gt;
  
Check out Paul Bourke&#39;s site

&lt;/a&gt;

</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/dreamsicle-dome/featured-dreamsicle-dome-thumb.png" />
    </item>
    
    <item>
      <title>Friend of Blåhaj? Hack the Planet^H^H T-shirt!</title>
      <link>https://martinh.net/hacks/friends-of-blahaj/</link>
      <pubDate>Fri, 02 May 2025 12:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/friends-of-blahaj/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/37c3-laser-threads.jpg&#34;,&#34;\/img\/38c3-cats-gaze-upwards.jpg&#34;,&#34;\/img\/38c3-dont-worry-blimp.jpg&#34;,&#34;\/img\/38c3-undersea-tableaux.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  From corporate swag into a Friend of Blåhaj tshirt using iron-on transfer paper
&lt;/div&gt;

&lt;p&gt;It&amp;rsquo;s been alarming to see the speed with which civil rights and hard won freedoms are being rolled back in many countries, and trans folk are clearly in the front line.&lt;/p&gt;
&lt;p&gt;Back in the Summer of 2023 I came to the conclusion that it&amp;rsquo;s really important for folk with privilege to visibly demonstrate solidarity, where they can.&lt;/p&gt;
&lt;p&gt;And what better way to show solidarity with vulnerable groups that are being thrown under the bus in the haste to discard DEI initiatives than by &lt;em&gt;re-using and re-purposing corporate swag&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a promotional tshirt for a certain open source container orchestration system that had been languishing in a drawer. With bonus feet&amp;hellip;&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w60&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;3024&#34;
          height=&#34;4032&#34;
          src=&#34;https://martinh.net/img/tshirt-k8s-pre-hack_hu_e7b7f3774d9a74a1.jpg&#34;
          srcset=&#34;https://martinh.net/img/tshirt-k8s-pre-hack_hu_e7b7f3774d9a74a1.jpg 800w,/img/tshirt-k8s-pre-hack_hu_7ea96ad5b57f8184.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/tshirt-k8s-pre-hack.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Uninspiring Kubernetes promo tshirt, pre-hacking. It&amp;rsquo;s literally just a black tshirt with the Kubernetes logo on it. The tips of two sock clad feet can just be seen&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;You know what would make that tshirt miles better? A shark! And not just any old shark, but &lt;strong&gt;Blåhaj, the much beloved IKEA shark&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;At some point I&amp;rsquo;d discovered that you can buy special thermal transfer paper which you print onto like regular inkjet compatible paper, then peel off the backing (important to remember this bit!) before ironing onto your fabric or clothing item.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s fairly obvious when you are looking in shops - the label usually says something like &amp;ldquo;iron-on transfer paper&amp;rdquo;, but be sure to check that the size is compatible with your printer. Also remember to use the thermal protective sheet which comes with the transfer paper pack, or you may end up with a big mess and a busted iron.&lt;/p&gt;
&lt;p&gt;If you have a bit of time to spare you can achieve a more professional look by cutting around the edges of the design you&amp;rsquo;re printing, say with a craft knife or dressmaking scissors, so that it&amp;rsquo;s less obviously stuck on.&lt;/p&gt;
&lt;p&gt;Somewhere on the Interwebs I found a nice design showing a Blåhaj with a trans-flag coloured banner wrapped around it which reads &amp;ldquo;Friend of Blåhaj&amp;rdquo;, and printed this to use on my tshirt:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w60&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;1210&#34;
          height=&#34;1613&#34;
          src=&#34;https://martinh.net/img/tshirt-friend-of-blahaj_hu_21f2ee970ca7a3b7.jpg&#34;
          srcset=&#34;https://martinh.net/img/tshirt-friend-of-blahaj_hu_21f2ee970ca7a3b7.jpg 800w,/img/tshirt-friend-of-blahaj_hu_1002da49cc1ed88c.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/tshirt-friend-of-blahaj.jpg&#34;
        /&gt;
  
  &lt;figcaption&gt;Hacked tshirt, now with Friend of Blåhaj design replacing boring corporate logo&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;It&amp;rsquo;s now 2025, and as part of documenting this make for Mayke I found that the &lt;a href=&#34;https://press.invincible.ink/shirt-friend-of-blahaj/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Friends of Blåhaj design was created by Talen Lee&lt;/a&gt;. If you like it, Talen sells a wide range of posters, stickers, mugs, tshirts etc with variants of this design.&lt;/p&gt;
&lt;a
  class=&#34;!rounded-md bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700&#34;
  href=&#34;https://press.invincible.ink/shirt-friend-of-blahaj/&#34;
  target=&#34;_self&#34;
  
  role=&#34;button&#34;&gt;
  
Check out Talen Lee&#39;s site

&lt;/a&gt;

&lt;p&gt;This might all seem like a bit of silly fun, which it most certainly is. However, every visible sign of solidarity helps trans folk to know that they are valid and important. Showing solidarity also helps to discourage bigots and establish a counter-narrative of acceptance and tolerance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Above all, remember that you might not realise that you have privilege until it&amp;rsquo;s taken away. And by then, it&amp;rsquo;s too late&amp;hellip;&lt;/strong&gt;&lt;/p&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/friends-of-blahaj/featured-tshirt-friend-of-blahah-cccamp2023.jpg" />
    </item>
    
    <item>
      <title>Glitchy GIFs with glitch_this</title>
      <link>https://martinh.net/hacks/glitchy-gifs/</link>
      <pubDate>Thu, 01 May 2025 15:12:34 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/hacks/glitchy-gifs/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/cccamp2023-dome-and-lasers.jpg&#34;,&#34;\/img\/cccamp2023-tree-ring-and-star.jpg&#34;,&#34;\/img\/cccamp2023-woodland-orb.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;
  Turning some images into a glitchy GIF using open source command line tools
&lt;/div&gt;

&lt;p&gt;OK, so there are lots of apps and websites out there that will let you glitch an image and/or turn a bunch of images into a GIF.&lt;/p&gt;
&lt;p&gt;But what if you just wanted to&amp;hellip; do it yourself? And in a Unix-y way, with source code, scripting and command line shenanigans?&lt;/p&gt;
&lt;p&gt;I came across a &lt;a href=&#34;https://github.com/TotallyNotChase/glitch-this&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;great little utility for glitching images called &lt;em&gt;glitch_this&lt;/em&gt;&lt;/a&gt;,
which works on both static images and GIFs.&lt;/p&gt;
&lt;p&gt;You can turn a static image into a glitchy GIF with a simple incantation like:&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;glitch_this -c -g small_bighead.jpg 2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Of course, I glitched myself first of all:&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w33&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;320&#34;
          height=&#34;320&#34;
          src=&#34;https://martinh.net/img/glitched_small_bighead_hu_2d49f18b3718c940.gif&#34;
          srcset=&#34;https://martinh.net/img/glitched_small_bighead_hu_2d49f18b3718c940.gif 800w,/img/glitched_small_bighead_hu_a32f448ed8ce2a90.gif 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/glitched_small_bighead.gif&#34;
        /&gt;
  
  &lt;figcaption&gt;Glitchy GIF of a 3D scan of my head&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;That went well, and I wondered about how to make a &amp;ldquo;meta-GIF&amp;rdquo; that combined several GIFs. It turns out that this is something &lt;a href=&#34;https://imagemagick.org/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;the venerable ImageMagick image manipulation toolkit&lt;/a&gt; can do very easily:&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;convert file1.gif file2.gif file3.gif newfile.gif&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;ImageMagick is basically an entire Turing-complete programming environment in a trenchcoat, so you can also get it to apply interesting effects as you go along. There&amp;rsquo;s a very interesting site called &lt;a href=&#34;http://www.fmwconcepts.com/imagemagick/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Fred&amp;rsquo;s ImageMagick Scripts&lt;/a&gt; which is probably the motherlode for anyone interested in experimenting with this stuff.&lt;/p&gt;
&lt;p&gt;You might find that you want to work with a bunch of images that are slghtly different sizes, and ImageMagick can be very helpful in fixing that, e.g. here we turn an image into a (possibly) smaller version of itself with fixed 320 x 320 resolution:&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;convert foo.jpg -resize &lt;span class=&#34;se&#34;&gt;\!&lt;/span&gt;320x320 bar.jpg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;So if we had a bunch of pictures then we could write a shell script to do something like&amp;hellip; resize them all to a consistent size, turn them into glitchy GIFs, and make a combined GIF out of the whole set. Something like this&amp;hellip;&lt;/p&gt;
&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; I in IMG*&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  convert &lt;span class=&#34;nv&#34;&gt;$I&lt;/span&gt; -resize &lt;span class=&#34;se&#34;&gt;\!&lt;/span&gt;320x320 small_&lt;span class=&#34;nv&#34;&gt;$I&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  glitch_this -c -g -l &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$I&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;convert -delay &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; glitched_small_*gif loopy_goodness.gif&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Please note that the GIFs generated by &lt;em&gt;glitch_this&lt;/em&gt; will loop indefinitely unless you add the &lt;em&gt;-l&lt;/em&gt; parameter to specify the number of loops. And infinitely looping GIFs are tricky to amalgamate&amp;hellip;&lt;/p&gt;
&lt;p&gt;You might see some glitched meta-GIFs on this site. Oh look, here&amp;rsquo;s one now 😉&lt;/p&gt;

&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;&#34;
          width=&#34;1024&#34;
          height=&#34;768&#34;
          src=&#34;https://martinh.net/img/delicious-glitched-clams_hu_e618dd5a45722147.gif&#34;
          srcset=&#34;https://martinh.net/img/delicious-glitched-clams_hu_e618dd5a45722147.gif 800w,/img/delicious-glitched-clams_hu_83107bdb9276c263.gif 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/delicious-glitched-clams.gif&#34;
        /&gt;
  
  &lt;figcaption&gt;Glitchy GIF of some graffiti art including Delicious Clams in Sheffield&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;p&gt;PS One loose end - sometimes the glitched GIF doesn&amp;rsquo;t load at first, but does if the page is reloaded.&lt;/p&gt;
</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://martinh.net/hacks/glitchy-gifs/featured_delicious_clams.png" />
    </item>
    
    <item>
      <title>Martin Hamilton | Contact</title>
      <link>https://martinh.net/contact/</link>
      <pubDate>Thu, 01 May 2025 13:02:28 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/contact/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/cccamp2023-dome-and-lasers.jpg&#34;,&#34;\/img\/cccamp2023-tree-ring-and-star.jpg&#34;,&#34;\/img\/cccamp2023-woodland-orb.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;



&lt;h1 class=&#34;relative group&#34;&gt;Get in touch
    &lt;div id=&#34;get-in-touch&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#get-in-touch&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;I&amp;rsquo;m always interested in talking to people about potential new projects, so please feel free to drop me a line (email: &lt;a href=&#34;mailto:m@martinh.net?subject=Hello%40Martin&#34; &gt;m@martinh.net&lt;/a&gt;) to chat about how I can help you. I aim to respond to emails within two working days.&lt;/p&gt;
&lt;a
  class=&#34;!rounded-md bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700&#34;
  href=&#34;mailto:m@martinh.net?subject=Hello%40Martin&#34;
  target=&#34;_self&#34;
  
  role=&#34;button&#34;&gt;
  
Get in touch

&lt;/a&gt;

</description>
      
    </item>
    
    <item>
      <title>Martin Hamilton | Services</title>
      <link>https://martinh.net/services/</link>
      <pubDate>Thu, 01 May 2025 13:02:18 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/services/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/37c3-laser-threads.jpg&#34;,&#34;\/img\/cccamp2023-dome-and-lasers.jpg&#34;,&#34;\/img\/cccamp2023-tree-ring-and-star.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;



&lt;h1 class=&#34;relative group&#34;&gt;Innovation advice
    &lt;div id=&#34;innovation-advice&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#innovation-advice&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;Work I have led on has influenced government policy and corporate/institutional strategies, including the UK government&amp;rsquo;s Education Technology Strategy, Digital Strategy, Future of Compute Review, DCMS Areas of Research Interest and Horizon Scanning activities more generally. As a recognised expert I have been invited to give evidence to &lt;a href=&#34;https://www.parliamentlive.tv/Event/Index/245f53ae-0b55-438c-a2fd-94b95ed0a369&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Parliamentary Select Committees&lt;/a&gt;, contributed to All Party Parliamentary Groups and often &lt;a href=&#34;https://martinh.net/portfolio&#34; &gt;given media interviews&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I can help you to devise and refine your own innovation strategies - particularly around digital technologies, sector shock, transition and resilience. Approaches tend to vary based on the project but can include a mixture of keynote presentations; online, hybrid and in-person workshops and roundtables; desk based research and 1:1 interviews.&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;Bid development
    &lt;div id=&#34;bid-development&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#bid-development&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;With &lt;a href=&#34;https://grantify.io&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Grantify&lt;/a&gt;, I&amp;rsquo;ve supported over 150 startups to access government funding from sources like Innovate UK, the European Innovation Council (EIC) Accelerator and Small Business Innovation Research (SBIR) in the United States. I also have eight years&amp;rsquo; experience assessing hundreds of Innovate UK funding proposals for over £500 million of investment.&lt;/p&gt;
&lt;p&gt;Thanks to this real-world experience I have a very good idea of what makes for a successful proposal to funders or investors, and I can help you craft that winning bid. Check out the &lt;a href=&#34;https://martinh.net/testimonials/&#34; &gt;testimonials&lt;/a&gt; section of this site for feedback from some of my clients.&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;Project and programme management
    &lt;div id=&#34;project-and-programme-management&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#project-and-programme-management&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;I have over twenty years&amp;rsquo; experience of project and programme management including multi-million pound procurements. Most recently I have been coordinating the £4.5M &lt;a href=&#34;https://excalibur.ac.uk/hes&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;ExCALIBUR Hardware &amp;amp; Enabling Software&lt;/a&gt; programme, which has chartered a series of next generation pre-Exascale High Performance Computing (HPC) testbeds.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve supported procurements from inception through requirements gathering and managing the tender process to commissioning and acceptance testing, and am familiar with procurement vehicles like Dynamic Purchasing Systems. I&amp;rsquo;ve provided day-to-day project and programme management and reporting assistance using tools like Jira to track progress against objectives. I&amp;rsquo;m also comfortable with managing exceptions such as supply chain delays and liaising with funders / senior management.&lt;/p&gt;
</description>
      
    </item>
    
    <item>
      <title>Martin Hamilton | Testimonials</title>
      <link>https://martinh.net/testimonials/</link>
      <pubDate>Thu, 01 May 2025 13:02:15 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/testimonials/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/37c3-fairydust-tribute.jpg&#34;,&#34;\/img\/cccamp2023-chaos-unicorn.jpg&#34;,&#34;\/img\/cccamp2023-mirror-thing1.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;


&lt;p&gt;(See my &lt;a href=&#34;https://uk.linkedin.com/in/martinhamilton&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;LinkedIn profile&lt;/a&gt; for these and other recommendations.)&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;&amp;ldquo;High quality advice and guidance&amp;rdquo;
    &lt;div id=&#34;high-quality-advice-and-guidance&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#high-quality-advice-and-guidance&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;
&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w20&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;Photo of Jon Smith&#34;
          width=&#34;100&#34;
          height=&#34;100&#34;
          src=&#34;https://martinh.net/img/testimonials/jon-smith_hu_68865281d55c0cd.jpg&#34;
          srcset=&#34;https://martinh.net/img/testimonials/jon-smith_hu_68865281d55c0cd.jpg 800w,/img/testimonials/jon-smith_hu_a206a276fee6e40b.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/testimonials/jon-smith.jpg&#34;
        /&gt;
  
  
  &lt;/figure&gt;
&lt;strong&gt;Jon Smith - CEO at Pobble&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Martin helped us to draft an Innovate UK grant bid which was sucessful in what will have been one of the most competitive rounds ever. Martin was highly knowledgeable about what assessors look for and provided lots of very specific feedback which enhanced our application no end. If we do another bid the first person I&amp;rsquo;ll be calling is Martin, I couldn&amp;rsquo;t recommend him enough to support you. Super good value for such high quality advice and guidance.&amp;rdquo;&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;&amp;ldquo;Informed how we work with over 500 universities in 50 countries&amp;rdquo;
    &lt;div id=&#34;informed-how-we-work-with-over-500-universities-in-50-countries&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#informed-how-we-work-with-over-500-universities-in-50-countries&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;
&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w20&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;Photo of Faye Taylor&#34;
          width=&#34;100&#34;
          height=&#34;100&#34;
          src=&#34;https://martinh.net/img/testimonials/faye-taylor_hu_f51658347d3dc929.jpg&#34;
          srcset=&#34;https://martinh.net/img/testimonials/faye-taylor_hu_f51658347d3dc929.jpg 800w,/img/testimonials/faye-taylor_hu_f615c0c2f28a87d0.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/testimonials/faye-taylor.jpg&#34;
        /&gt;
  
  
  &lt;/figure&gt;
&lt;strong&gt;Faye Taylor - Deputy Director, International Strategy &amp;amp; Partnerships at Department for Education&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Martin led on a tech review for the Association of Commonwealth Universities, helping us to better understand our members&amp;rsquo; digital capability and our own areas of digital strength and expertise. As part of this work Martin interviewed key members of the ACU staff, undertook a landmark member survey and analysed the results to produce a summary report and recommendations. The results of this project have gone on to inform how we work with over 500 universities in 50 countries.&amp;rdquo;&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;&amp;ldquo;Definitely recommend!&amp;rdquo;
    &lt;div id=&#34;definitely-recommend&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#definitely-recommend&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;
&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w20&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;Photo of Josh Perry&#34;
          width=&#34;100&#34;
          height=&#34;100&#34;
          src=&#34;https://martinh.net/img/testimonials/josh-perry_hu_78e5f367ecd7eba7.jpg&#34;
          srcset=&#34;https://martinh.net/img/testimonials/josh-perry_hu_78e5f367ecd7eba7.jpg 800w,/img/testimonials/josh-perry_hu_d052c230a4aa5b67.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/testimonials/josh-perry.jpg&#34;
        /&gt;
  
  
  &lt;/figure&gt;
&lt;strong&gt;Joshua Perry - Founder at Assembly, co-founder at Smartgrade&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Martin helped us draft an application for an Innovate UK grant. We were successful in an incredibly competitive field, and there&amp;rsquo;s no doubt in my mind that the clarity of Martin&amp;rsquo;s feedback improved the quality of our submission. His costs were very reasonable and he&amp;rsquo;s also a thoroughly decent chap - we&amp;rsquo;d definitely recommend working with him!&amp;rdquo;&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;&amp;ldquo;Hands on developer and leader&amp;rdquo;
    &lt;div id=&#34;hands-on-developer-and-leader&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#hands-on-developer-and-leader&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;
&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w20&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;Photo of Dave Beckett&#34;
          width=&#34;100&#34;
          height=&#34;100&#34;
          src=&#34;https://martinh.net/img/testimonials/dave-beckett_hu_da20e7ca08a26bfd.jpg&#34;
          srcset=&#34;https://martinh.net/img/testimonials/dave-beckett_hu_da20e7ca08a26bfd.jpg 800w,/img/testimonials/dave-beckett_hu_4d2cfae028298a41.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/testimonials/dave-beckett.jpg&#34;
        /&gt;
  
  
  &lt;/figure&gt;
&lt;strong&gt;Dave Beckett - Staff System Engineer at Google Cloud - Ex-Twitter, Yahoo!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Martin is a hands on developer and leader who professionally developed and operated a UK national cache service, research projects in caching and web searching, dealing with multiple technical and project issues as well as developing innovative solutions.&amp;rdquo;&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;&amp;ldquo;Massive help&amp;rdquo;
    &lt;div id=&#34;massive-help&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#massive-help&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;
&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w20&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;Photo of Moktar Alqaderi&#34;
          width=&#34;100&#34;
          height=&#34;100&#34;
          src=&#34;https://martinh.net/img/testimonials/moktar-alqaderi_hu_ab220453c98006ef.jpg&#34;
          srcset=&#34;https://martinh.net/img/testimonials/moktar-alqaderi_hu_ab220453c98006ef.jpg 800w,/img/testimonials/moktar-alqaderi_hu_63170e76377b8c53.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/testimonials/moktar-alqaderi.jpg&#34;
        /&gt;
  
  
  &lt;/figure&gt;
&lt;strong&gt;Moktar Alqaderi - Founder and CEO at Progressay&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Martin has years of experience working with edtech startups and his advice was a massive help in preparing our Innovate UK funding proposal! Truly one of the experts in the field!&amp;rdquo;&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;&amp;ldquo;Outstanding skills&amp;rdquo;
    &lt;div id=&#34;outstanding-skills&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#outstanding-skills&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;
&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w20&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;Photo of Simon Bowie-Britton&#34;
          width=&#34;100&#34;
          height=&#34;100&#34;
          src=&#34;https://martinh.net/img/testimonials/simon-bowie-britton_hu_be4b19708ca9ae3c.jpg&#34;
          srcset=&#34;https://martinh.net/img/testimonials/simon-bowie-britton_hu_be4b19708ca9ae3c.jpg 800w,/img/testimonials/simon-bowie-britton_hu_5be25811a2ed2d30.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/testimonials/simon-bowie-britton.jpg&#34;
        /&gt;
  
  
  &lt;/figure&gt;
&lt;strong&gt;Simon Bowie-Britton - Chief Technology Officer at Trium Capital&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Martin has outstanding skills, both in the technical arenas of Linux and networking. It&amp;rsquo;s always a pleasure to discuss ideas and issues with Martin as he often highlights alternative and better ways to solve a problem.&amp;rdquo;&lt;/p&gt;

&lt;h1 class=&#34;relative group&#34;&gt;&amp;ldquo;Reliable and professional&amp;rdquo;
    &lt;div id=&#34;reliable-and-professional&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#reliable-and-professional&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;
&lt;figure&gt;
        &lt;img
          class=&#34;my-0 rounded-md grid-w20&#34;
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          fetchpriority=&#34;auto&#34;
          alt=&#34;Photo of Anish Bagga&#34;
          width=&#34;100&#34;
          height=&#34;100&#34;
          src=&#34;https://martinh.net/img/testimonials/anish-bagga_hu_eba49ce2650babbb.jpg&#34;
          srcset=&#34;https://martinh.net/img/testimonials/anish-bagga_hu_eba49ce2650babbb.jpg 800w,/img/testimonials/anish-bagga_hu_c8f02d1dd5f12f0b.jpg 1280w&#34;
          sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
          data-zoom-src=&#34;https://martinh.net/img/testimonials/anish-bagga.jpg&#34;
        /&gt;
  
  
  &lt;/figure&gt;
&lt;strong&gt;Anish Bagga - CEO at Unitu&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;I thoroughly enjoyed working with Martin - very reliable and professional. We worked recently on an Innovate UK bid and as it was our first bid, it can be quite daunting, but Martin did a fantastic job of supporting and helping us to understand what assessors are looking for and how to best communicate it. I look forward to more future collaborations with Martin.&amp;rdquo;&lt;/p&gt;
</description>
      
    </item>
    
    <item>
      <title>Martin Hamilton | Publications</title>
      <link>https://martinh.net/publications/</link>
      <pubDate>Thu, 01 May 2025 06:05:24 -0400</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/publications/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/emf2024-lasers-over-tents.jpg&#34;,&#34;\/img\/emf2024-illuminated-trees.jpg&#34;,&#34;\/img\/38c3-orange-cats.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;



&lt;h1 class=&#34;relative group&#34;&gt;Selected publications
    &lt;div id=&#34;selected-publications&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#selected-publications&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;p&gt;Moody, V and Hamilton, M (2024) &lt;strong&gt;Mapping federation journeys for optimising the UK digital research infrastructure&lt;/strong&gt;. Jisc online publication: &lt;a href=&#34;https://repository.jisc.ac.uk/9516/1/federated-digital-research-infrastructure-full-report.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;https://repository.jisc.ac.uk/9516/1/federated-digital-research-infrastructure-full-report.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hamilton, M (2023) &lt;strong&gt;Fast forward or digital mirage—benchmarking education system responses to COVID, and what comes after?&lt;/strong&gt; In Benchmarking Library, Information and Education Services, New Strategic Choices in Challenging Times. Editors: Baker, D; Ellis, L; Williams, C and Wragg, C. ISBN: 9780323956628. &lt;a href=&#34;https://doi.org/10.1016/B978-0-323-95662-8.00010-2&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;https://doi.org/10.1016/B978-0-323-95662-8.00010-2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Glass, C and Lazauskas, T (2022) &lt;strong&gt;Review of Digital Research Infrastructure Requirements for AI.&lt;/strong&gt; The Alan Turing Institute online publication: &lt;a href=&#34;https://www.turing.ac.uk/research/publications/review-digital-research-infrastructure-requirements-ai&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;https://www.turing.ac.uk/research/publications/review-digital-research-infrastructure-requirements-ai&lt;/a&gt; [MH listed as a contributor]&lt;/p&gt;
&lt;p&gt;Hamilton, M (2021) &lt;strong&gt;Look to the future now, it’s only just begun: The changing role of libraries during and after COVID-19.&lt;/strong&gt; In Chandos Digital Information Review: Libraries, Digital Information, and COVID. Editors: Baker, D and Ellis, L. Pages 281-289. ISBN 9780323884938. &lt;a href=&#34;https://doi.org/10.1016/B978-0-323-88493-8.00024-0&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;https://doi.org/10.1016/B978-0-323-88493-8.00024-0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hamilton, M (2020) &lt;strong&gt;Envisioning Education 4.0—A scenario planning approach to predicting the future.&lt;/strong&gt; In Chandos Digital Information Review: Future Directions in Digital Information. Editors: Baker, D and Ellis, L. Pages 267-283. ISBN 9780128221440. &lt;a href=&#34;https://doi.org/10.1016/B978-0-12-822144-0.00015-X&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;https://doi.org/10.1016/B978-0-12-822144-0.00015-X&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hamilton, M; Shackleton, L and Mann, R (2020) &lt;strong&gt;Higher education during COVID-19: A snapshot of digital engagement in Commonwealth universities.&lt;/strong&gt; Association of Commonwealth Universities online publication: &lt;a href=&#34;https://www.acu.ac.uk/media/2345/acu-digital-engagement-survey-detailed-results.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;https://www.acu.ac.uk/media/2345/acu-digital-engagement-survey-detailed-results.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hamilton, M (editor); Hatton, P; Jenner, C; Pallas, J; Real, A and Yates, J (2017) &lt;strong&gt;Report of 2017 UK National e-Infrastructure Survey of HEIs and Research Institutes.&lt;/strong&gt; National e-Infrastructure Project Directors Group (PDG) and HPC-SIG online publication: &lt;a href=&#34;https://hpc-sig.org.uk/index.php/publications/2017-national-e-infrastructure-report/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;https://hpc-sig.org.uk/index.php/publications/2017-national-e-infrastructure-report/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hamilton, M (editor); Jenner, C; Pallas, J; Real, A; Richards, A and Yates, J (2015) &lt;strong&gt;Report of 2015 UK National e-Infrastructure Survey of HEIs and Research Institutes.&lt;/strong&gt; National e-Infrastructure Project Directors Group (PDG) and HPC-SIG online publication: &lt;a href=&#34;https://hpc-sig.org.uk/index.php/publications/2015-national-e-infrastructure-survey-report/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;https://hpc-sig.org.uk/index.php/publications/2015-national-e-infrastructure-survey-report/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Yates, J; Hamilton, M (editor); Dhanoa, H; Jenner, C; Chue Hong, N; Hettrick, S; Parchment, O; Real, A; Richards, A and Burbidge, S (2014) &lt;strong&gt;Report of the 2014 UK National e-Infrastructure Survey of HEIs and Research Institutes.&lt;/strong&gt; National e-Infrastructure Project Directors Group (PDG) and HPC-SIG online publication: &lt;a href=&#34;https://hpc-sig.org.uk/index.php/publications/2014-national-e-infrastructure-report/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;https://hpc-sig.org.uk/index.php/publications/2014-national-e-infrastructure-report/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Fergusson, D; Colling, D; de Roure, D; Hamilton, M (editor), Matthews, B; Pallas, J; Salmon, D and Yates, J (2014) &lt;strong&gt;Imagining the UK National Data Infrastructure - Connecting up Big Data in the UK.&lt;/strong&gt; National e-Infrastructure Project Directors Group (PDG) online publication: &lt;a href=&#34;https://www.scribd.com/document/260531862/Imagining-the-UK-National-Data-Infrastructure-Recommendations&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;https://www.scribd.com/document/260531862/Imagining-the-UK-National-Data-Infrastructure-Recommendations&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hamilton, Martin and Manuel, Sue (2013): &lt;strong&gt;Metadata is a Love Note to the Future: UK Higher Education Research Data Management Survey.&lt;/strong&gt; Loughborough University online publication: &lt;a href=&#34;https://hdl.handle.net/2134/13526&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;https://hdl.handle.net/2134/13526&lt;/a&gt;&lt;/p&gt;
</description>
      
    </item>
    
    <item>
      <title>Martin Hamilton | Résumé</title>
      <link>https://martinh.net/resume/</link>
      <pubDate>Thu, 01 May 2025 10:02:19 +0000</pubDate>
      <author>m@martinh.net (Martin Hamilton)</author>
      <guid>https://martinh.net/resume/</guid>
      <description>&lt;div id=&#34;kenburns-background&#34; class=&#34;kenburns-background&#34;&gt;&lt;/div&gt;

&lt;script&gt;
    const images = [
        &#34;\/img\/38c3-cats-gaze-upwards.jpg&#34;,&#34;\/img\/emf2024-ledome-and-nullsector.jpg&#34;,&#34;\/img\/38c3-orange-cats.jpg&#34;,
    ];
    const randomImage = images[Math.floor(Math.random() * images.length)];
    document.getElementById(&#34;kenburns-background&#34;).style.backgroundImage = `url(&#39;${randomImage}&#39;)`;
&lt;/script&gt;



&lt;h1 class=&#34;relative group&#34;&gt;Current
    &lt;div id=&#34;current&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#current&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;strong&gt;2020-&lt;/strong&gt;&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;Director @ MartinH.Net Un Limited, digital innovation consultancy&lt;/strong&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Duties:&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Advice and support for digital strategy and disruptive innovation&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Some recent clients and projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grantify: supported over 150 startups to develop their business plans and secure investment from Innovate UK, EIC Accelerator and SBIR.&lt;/li&gt;
&lt;li&gt;Association of Commonwealth Universities: supported their review of members&amp;rsquo; digital capability and COVID response.&lt;/li&gt;
&lt;li&gt;LGfL: helped to run the Department for Education’s Edtech Demonstrator schools network, supporting over 4,000 schools in their transition to remote learning during the coronavirus pandemic.&lt;/li&gt;
&lt;li&gt;LGfL: helped to migrate and consolidate corporate web presence using Acquia Drupal and Site Studio platform to replace earlier sites and systems.&lt;/li&gt;
&lt;li&gt;UCL: coordinated ExCALIBUR Hardware &amp;amp; Enabling Software, the UK’s next generation supercomputing pathfinder programme.&lt;/li&gt;
&lt;li&gt;The Alan Turing Institute: supported their UKRI chartered review of the UK AI research community requirements for Digital Research Infrastructure.&lt;/li&gt;
&lt;li&gt;N8 Centre of Excellence in Computationally Intensive Research (N8CIR): supported hybrid delivery of the UKRI Digital Research Infrastructure Retreat via Airmeet.&lt;/li&gt;
&lt;li&gt;SUMS Consulting: supported digital innovation at universities.&lt;/li&gt;
&lt;li&gt;Jisc: supported their UKRI chartered review of Federation for Digital Research Infrastructure.&lt;/li&gt;
&lt;li&gt;STFC: supported their Exascale supercomputing requirements gathering.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt; &lt;strong&gt;2024-&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;2021-2024&lt;/strong&gt;&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;Expert Adviser @ DSIT, the UK Government Department responsible for Science, Technology and Innovation&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;Expert Adviser @ DCMS, the UK Government Department responsible for Culture, Media and Sport&lt;/strong&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Duties:&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Supporting the Chief Scientific Adviser to inform policy development&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;As a member of the DSIT/DCMS College of Experts, synthesizing evidence and knowledge of research for policymakers.&lt;/li&gt;
&lt;li&gt;Focus areas including digital expertise and understanding of future technology; analysis of DSIT/DCMS sector structures and characteristics; sector shock, transition and resilience.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;strong&gt;2015-&lt;/strong&gt;&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;Assessor @ Innovate UK, the UK’s innovation agency&lt;/strong&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Duties:&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Funding commercialisation of R&amp;amp;D innovation from universities and startups&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Evaluated hundreds of funding applications to Innovate UK to support decision making for hundreds of millions of pounds of public investment in businesses building products around emerging technologies such as augmented reality and artificial intelligence.&lt;/li&gt;
&lt;li&gt;Worked on a wide range of programmes including Industrial Strategy Challenge Fund Future Flight programme, which is investing £300m in building out the infrastructure for flying cars, electric aircraft and commercial drone delivery.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 class=&#34;relative group&#34;&gt;Previous Roles
    &lt;div id=&#34;previous-roles&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#previous-roles&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;strong&gt;2014-2020&lt;/strong&gt;&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;Futurist @ Jisc, non-profit shared services for research &amp;amp; education&lt;/strong&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Duties:&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Running innovation lab for £100m turnover firm active in 50+ countries&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Led a team prototyping edtech interventions with universities and colleges around emerging technologies like Virtual and Augmented Reality.&lt;/li&gt;
&lt;li&gt;Conceived and led on Jisc’s Education 4.0 campaign on the opportunities and challenges of Fourth Industrial Revolution technologies for teaching and learning.&lt;/li&gt;
&lt;li&gt;Personally invited to give evidence to Education Select Committee and DCMS Select Committee enquiries. Convened round tables of edtech practitioners contributing to the Department for Education’s Edtech Strategy development.&lt;/li&gt;
&lt;li&gt;Recognition as an edtech thought leader (interviews in the Guardian, Daily Telegraph, Big Issue, Wired, Nature etc) and keynote speaker (BETT, ALT-C, Future Edtech etc).&lt;/li&gt;
&lt;li&gt;Widely published columnist in my own right e.g. in Education Technology, University Business, TES, Information Professional and Times Higher Education.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;strong&gt;2012-2014&lt;/strong&gt;&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;Centre Manager @ HPC Midlands, supercomputing for research &amp;amp; industry&lt;/strong&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Duties:&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Setting up a new High Performance Computing facility for the Midlands&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Secured £1.4m of funding from EPSRC to set up a new high performance computing centre as a partnership between Loughborough University and the University of Leicester.&lt;/li&gt;
&lt;li&gt;Procured and commissioned a new £1m supercomputer, directed enabling mechanical and electrical works, recruited staff to operate the facility.&lt;/li&gt;
&lt;li&gt;Negotiated commercial contracts and information security arrangements with a wide range of clients including E.ON, Alstom and Rolls-Royce.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;strong&gt;2008-2014&lt;/strong&gt;&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;Head of Internet Services @ Loughborough University, a top 10 university&lt;/strong&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Duties:&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Leading the transition to Cloud Computing and e-Learning/e-Assessment&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Led on Loughborough’s project to implement cloud groupware. Deep student engagement leading to a “bake-off” between Google and Microsoft solutions and selection of Google Apps for Education (now GSuite).&lt;/li&gt;
&lt;li&gt;Led legal negotiations on what became the standard GSuite service agreement for EMEA customers, coordinated technical aspects of cloud migration and support for embedding Google technologies.&lt;/li&gt;
&lt;li&gt;Organised international GSuite user group conferences in 2011, 2012 and 2014.&lt;/li&gt;
&lt;li&gt;Headed up the University’s e-Learning systems team, leading a big push to VLE adoption (Moodle), e-Assessment (QuestionMark Perception) and lecture capture (Echo360).&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;strong&gt;2002-2008&lt;/strong&gt;&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;Network Manager @ Loughborough University, a top 10 university&lt;/strong&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Duties:&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Lift and shift replacement of campus network, pervasive wireless rollout&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Led on a £2m project to replace the entire campus network infrastructure, upgrading in the process from a mixture of obsolete technologies (10Base2 Ethernet, ATM, FDDI) from different vendors to a single sourced Cisco Gigabit Ethernet solution which I also designed. This was a massive project as Loughborough’s campus is over 400 acres with 350+ buildings.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;strong&gt;1992-2002&lt;/strong&gt;&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;Researcher and Internet consultant @ various organisations&lt;/strong&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Duties:&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Supporting organisations to embrace the Internet and the Web&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Active in a number of Internet Engineering Task Force (IETF) working groups during the Internet’s 1990s Cambrian Explosion, where I co-invented the “www.” standard for designating website domain names subsequently codified as Internet standard RFC2219/BCP17.&lt;/li&gt;
&lt;li&gt;Consulted on Internet technologies for companies as diverse as Cap Gemini, eBookers and British Gas.&lt;/li&gt;
&lt;li&gt;Worked as a Computer Science researcher on the UK electronic libraries programme (eLib), developing the ROADS subject gateway software for cataloguing Internet resources.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 class=&#34;relative group&#34;&gt;Volunteering and committee membership
    &lt;div id=&#34;volunteering-and-committee-membership&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#volunteering-and-committee-membership&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Times Higher Awards judge (2014-2019)&lt;/li&gt;
&lt;li&gt;Association for Learning Technology (ALT) conference programme committee (2012-2015)&lt;/li&gt;
&lt;li&gt;Elected to British Computer Society ELITE committee (Fellows and senior IT leaders group)&lt;/li&gt;
&lt;li&gt;Co-chair of UKRI Cloud for Research Working Group (2015-2019)&lt;/li&gt;
&lt;li&gt;Co-chair of UK National e-Infrastructure Project Directors Group (2014-2018)&lt;/li&gt;
&lt;li&gt;National Childbirth Trust (NCT) volunteer for Loughborough branch, helping to run Messy Play sessions for toddlers, Nearly New Sales and editing the branch newsletter&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 class=&#34;relative group&#34;&gt;Honorifics
    &lt;div id=&#34;honorifics&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#honorifics&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Chartered Fellow of the British Computer Society (FBCS CITP), 2008-2025&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 class=&#34;relative group&#34;&gt;Education
    &lt;div id=&#34;education&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#education&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Masters in Business Administration (MBA), Loughborough University&lt;/li&gt;
&lt;li&gt;Postgraduate Certificate in Management, Loughborough University&lt;/li&gt;
&lt;li&gt;Computer Studies (2.1 Hons BSc), Loughborough University&lt;/li&gt;
&lt;/ul&gt;
</description>
      
    </item>
    
  </channel>
</rss>
