<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title> - Blog</title>
      <link>https://claytonwramsey.com/blog/</link>
      <description></description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://claytonwramsey.com/blog/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Fri, 27 Mar 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Soft lock picking in real life</title>
          <pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate>
          <author>Clayton Ramsey</author>
          <link>https://claytonwramsey.com/blog/soft-lock-picking/</link>
          <guid>https://claytonwramsey.com/blog/soft-lock-picking/</guid>
          <description xml:base="https://claytonwramsey.com/blog/soft-lock-picking/">&lt;p&gt;Last weekend, I played a fun little indie game called &lt;em&gt;Real Life Soft Lock Picking&lt;&#x2F;em&gt;.
To play, just lose your phone, wallet, and keys all at the same time.&lt;&#x2F;p&gt;
&lt;p&gt;You will then be &lt;em&gt;soft locked&lt;&#x2F;em&gt;: despite every system in the world working as intended, you’ll be locked out of your home, unable to make any progress or even feed yourself.
The only way out is by &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;playlist?list=PL-UR_8lpdcfepFOyC7AY-AVKN-S_rH0bM&quot;&gt;soft lock picking&lt;&#x2F;a&gt;, where you have to escape from a soft lock with a mix of cleverness and extraordinary patience.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;homeward-bound&quot;&gt;Homeward bound&lt;&#x2F;h2&gt;
&lt;p&gt;Once soft locked, your first problem is going to be finding some way to eat and sleep.
Having locked your front door, you can’t get into your home.
I live alone, so there were no spare copies of my home key except my landlord’s — but naturally, since I was phoneless, I had no way to contact him.&lt;&#x2F;p&gt;
&lt;p&gt;In any event, I lost all my things late on a Saturday night, so it would be unreasonable to expect my landlord to be available anyway.
Once soft-locked, you are at the mercy of others; luckily, I had a friend who was willing to feed and house me until I got my stuff back.
I’m left wondering about the people who aren’t as fortunate as me: people who have just moved, or who are traveling, or parents with kids that will all need food and shelter on short notice.
Even when resources for them exist, you still need a way to find them and reach them, and without a phone, money, or transportation, it’s nearly impossible.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;catch-twenty-two-factor-authentication&quot;&gt;Catch twenty-two factor authentication&lt;&#x2F;h2&gt;
&lt;p&gt;Even with the most pressing issues solved, you’re still soft locked.
Your best lead to finding your stuff is using a tool like Find My to locate your phone and hoping that your phone is in the same place as all your other valuables.
However, you probably won’t even be able to access Find My, since everything will be locked by two-factor authentication.&lt;&#x2F;p&gt;
&lt;p&gt;Back in the day, you only needed a username and password to sign into anything.
Since passwords leak &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;List_of_data_breaches&quot;&gt;all the time&lt;&#x2F;a&gt;, most systems now demand that sign-ons from new devices pass two-factor authentication.
Typically, this means that after trying the half-dozen or so passwords that you can remember, you will be greeted by a fun little message like this:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;div style=&quot;background-color: rgba(0, 0, 0, 0.1); border-radius: 15px; padding: 10px&quot;&gt;&lt;h3 style=&quot;margin-top: 0px; text-align: center&quot;&gt;Let&#x27;s make sure it&#x27;s really you&lt;&#x2F;h3&gt;
&lt;p style=&quot;text-align: center; text-indent: 0; font-size: 150%&quot;&gt;
[ ] [ ] [ ] [ ] [ ] [ ]
&lt;&#x2F;p&gt;
&lt;p&gt;We’ve sent a text to your phone with a 6-digit code.
Enter that code above in the next 10 minutes to prove it’s really you.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=XfELJU1mRMg&quot;&gt;Email me a code instead&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;file:&#x2F;&#x2F;&#x2F;dev&#x2F;null&quot;&gt;Contact support&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;This leaves you with a circular problem:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;You need to access your accounts to locate your phone.&lt;&#x2F;li&gt;
&lt;li&gt;You need to pass two-factor authentication to access your accounts.&lt;&#x2F;li&gt;
&lt;li&gt;You need your phone to pass two-factor authentication.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;If I could get back into my apartment, I could at least use my laptop to try bypassing two-factor authentication.
But after a morning texting him from a borrowed phone, my landlord wasn’t answering my texts, so that was right out.&lt;&#x2F;p&gt;
&lt;p&gt;After a few tries, I found that Apple’s authentication system is a fickle lover: sometimes, it will decide that your login attempt is cool enough to bypass two-factor authentication.
With this in hand, I tracked down my phone (and all my other stuff) to the home of a confused gentlement who had accidentally grabbed the wrong bag.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;leaving-keys-around&quot;&gt;Leaving keys around&lt;&#x2F;h2&gt;
&lt;p&gt;In hindsight, it’s possible for a prudent person to leave themselves keys to make soft locks a little easier to pick.
They can be physical, like leaving a real key with a friend, or metaphorical, like getting more ways to access your accounts.
Maybe using just using Nix would have fixed this.&lt;&#x2F;p&gt;
&lt;p&gt;But expecting users to leave keys for themselves is a design mistake: Every backup method will eventuall fail.
Users lose stuff and forget things all the time, and soft locking a user for that is just an exercise in automated cruelty.
We make products to serve people, and not the other way around.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Garbage collection in Rust got a little better</title>
          <pubDate>Sun, 28 Dec 2025 00:00:00 +0000</pubDate>
          <author>Clayton Ramsey</author>
          <link>https://claytonwramsey.com/blog/dumpster2/</link>
          <guid>https://claytonwramsey.com/blog/dumpster2/</guid>
          <description xml:base="https://claytonwramsey.com/blog/dumpster2/">&lt;blockquote&gt;
&lt;p&gt;Every language attempts to expand until it can be Java. Those languages which cannot so expand are replaced by ones which can.&lt;&#x2F;p&gt;
&lt;footer&gt;&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Jamie_Zawinski#Zawinski&#x27;s_Law&quot;&gt;some smart programmer, probably&lt;&#x2F;a&gt;&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;A long time ago, I wrote a &lt;a href=&quot;&#x2F;blog&#x2F;dumpster&quot;&gt;garbage collector&lt;&#x2F;a&gt;, called &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;claytonwramsey&#x2F;dumpster&quot;&gt;&lt;code&gt;dumpster&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, in Rust.
If I may say so myself, it was a delightful garbage collector.
However, I think it was imperfect, so I’m writing up this blog post to write about new improvements coming to &lt;code&gt;dumpster&lt;&#x2F;code&gt; after two years in the wild.
For this post, I selected just a couple of the cooler changes to &lt;code&gt;dumpster&lt;&#x2F;code&gt;, mostly to share the joy of working on this project.
I’ll try my best to explain the changes for those without much expertise in garbage collection and brag a bit about how cool they are.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;recap-episode&quot;&gt;Recap episode&lt;&#x2F;h2&gt;
&lt;p&gt;To summarize the 6,000-word article that I wrote last time, &lt;code&gt;dumpster&lt;&#x2F;code&gt; is a garbage collection library with an emphasis on performance, flexibility, and correctness.
&lt;code&gt;dumpster&lt;&#x2F;code&gt; exposes a &lt;code&gt;Gc&amp;lt;T&amp;gt;&lt;&#x2F;code&gt; type, similar to the Rust standard library’s &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;rc&#x2F;struct.Rc.html&quot;&gt;&lt;code&gt;Rc&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; or &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;sync&#x2F;struct.Arc.html&quot;&gt;&lt;code&gt;Arc&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, that wraps some garbage-collected value of type &lt;code&gt;T&lt;&#x2F;code&gt;.
A &lt;code&gt;Gc&lt;&#x2F;code&gt; is a garbage-collected pointer, so users can fearlessly create reference cycles in their code.
For instance, a user could make a struct that contains a garbage-collected reference to itself, without causing the same memory leaks arising from using &lt;code&gt;Rc&lt;&#x2F;code&gt; for the same goal.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;std&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;cell&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;OnceCell&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;dumpster&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;Trace&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;unsync&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Gc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;Trace&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;Foo&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; pointer to this same struct!
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;this&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;OnceCell&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Gc&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; foo &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Gc&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;Foo &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; this&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;OnceCell&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;foo&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;this&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;set&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;foo&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Were `foo` in an `Rc`, this would leak!
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;dumpster&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;unsync&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;collect&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; still collects foo!
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You might not think that a garbage collector is useful in Rust, but it shows up in surprisingly many places.
I personally got into garbage collection while implementing a language runtime: Rust is a great language for writing interpreters, but unlike Go or Java, you can’t rely on the language runtime to do garbage collection for you.
Likewise, it’s a big help in graph algorithms, which can have pointer spaghetti going all over the place.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;all-in-on-dynamic-dispatch&quot;&gt;All in on dynamic dispatch&lt;&#x2F;h2&gt;
&lt;p&gt;To collect cycles, &lt;code&gt;dumpster&lt;&#x2F;code&gt; needs some way of inspecting every garbage collected value for any &lt;code&gt;Gc&lt;&#x2F;code&gt;s that they may contain.
We achieve our inspection by forcing garbage-collected values to implement a special trait, called &lt;code&gt;Trace&lt;&#x2F;code&gt;.
&lt;code&gt;Trace&lt;&#x2F;code&gt; borrows the &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Visitor_pattern&quot;&gt;visitor pattern&lt;&#x2F;a&gt;: every time we want to do something to a garbage-collected value, we ask that value to accept a visitor, delegate that visitor to its fields, recursively going down until it reaches a &lt;code&gt;Gc&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; details differ from the real implementation,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; but this is close enough
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;Trace&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;accept&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;V&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Visitor&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;self&lt;&#x2F;span&gt;, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;visitor&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;V&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; `dumpster` defines visitors to access fields
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;Visitor&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;visit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Trace&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;self&lt;&#x2F;span&gt;, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;gc&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Gc&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Previously, &lt;code&gt;Trace&lt;&#x2F;code&gt; was not &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;reference&#x2F;items&#x2F;traits.html#dyn-compatibility&quot;&gt;&lt;code&gt;dyn&lt;&#x2F;code&gt;-compatible&lt;&#x2F;a&gt;.
Even though &lt;code&gt;dumpster&lt;&#x2F;code&gt; supported dynamically-sized types inside of a &lt;code&gt;Gc&lt;&#x2F;code&gt;, we still couldn’t stow a trait object inside a &lt;code&gt;Gc&lt;&#x2F;code&gt;, such as with &lt;code&gt;Gc&amp;lt;dyn Any&amp;gt;&lt;&#x2F;code&gt;.
I find this aesthetically displeasing: we’ve already filled &lt;code&gt;dumpster&lt;&#x2F;code&gt; with Java-isms, so we should find some way to go all the way on dynamic dispatch.&lt;&#x2F;p&gt;
&lt;p&gt;The heart of the problem is that, in Rust, generics and dynamic dispatch don’t mix.
When we write &lt;code&gt;&amp;lt;V: Visitor&amp;gt;&lt;&#x2F;code&gt; in the signature for &lt;code&gt;accept&lt;&#x2F;code&gt;, we declare that we must make a new implementation for &lt;code&gt;accept&lt;&#x2F;code&gt; for every type &lt;code&gt;V&lt;&#x2F;code&gt; that calls it.
That means everything has to be pinned down at compile time, so we can’t just erase type information as &lt;code&gt;dyn&lt;&#x2F;code&gt;-compatibility requires.
However, Rust does polymorphism like this for good reasons: having that compile-time information enables loads of optimizations.
So, how do we manage to keep the same flexibility and performance as compile-time generics while gaining the ability to use dynamic dispatch?&lt;&#x2F;p&gt;
&lt;p&gt;I didn’t figure this out, but a brilliant contributor to the project by the name of &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bluurryy&#x2F;&quot;&gt;bluurryy&lt;&#x2F;a&gt; did.
They had a great insight: we can pin down an exact list of every &lt;code&gt;Visitor&lt;&#x2F;code&gt; that &lt;code&gt;dumpster&lt;&#x2F;code&gt; requires for a garbage collected value inside of our library, and with a little trait magic, we can force client code to accept our visitors without ever knowing what they are.
This means that we still get the compile-time performance guarantees, but since the list of visitors is fixed, it’s possible to make &lt;code&gt;Trace&lt;&#x2F;code&gt; &lt;code&gt;dyn&lt;&#x2F;code&gt;-compatible.&lt;&#x2F;p&gt;
&lt;p&gt;To do so, &lt;code&gt;bluurryy&lt;&#x2F;code&gt; broke &lt;code&gt;Trace&lt;&#x2F;code&gt; into a few traits, augmenting &lt;code&gt;Trace&lt;&#x2F;code&gt; with &lt;code&gt;TraceWith&amp;lt;V&amp;gt;&lt;&#x2F;code&gt; and &lt;code&gt;TraceWithV&lt;&#x2F;code&gt;.
Client code must implement &lt;code&gt;TraceWith&amp;lt;V&amp;gt;&lt;&#x2F;code&gt; for all &lt;code&gt;V: Visitor&lt;&#x2F;code&gt;, since it’s impossible for them to implement &lt;code&gt;Trace&lt;&#x2F;code&gt; or &lt;code&gt;TraceWithV&lt;&#x2F;code&gt; directly.
Internally, &lt;code&gt;TraceWithV&lt;&#x2F;code&gt; has a list of all the possible visitors.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; again, papering over some details
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; main public-facing trait
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;Trace&lt;&#x2F;span&gt;: TraceWithV &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; clients must implement this instead of Trace
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;TraceWith&lt;&#x2F;span&gt;&amp;lt;V&amp;gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;accept&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;self&lt;&#x2F;span&gt;, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;visitor&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;V&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-module z-rust&quot;&gt;mod&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-module z-rust&quot;&gt;secret&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; can update this list of requirements to add more visitors
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;TraceWithV&lt;&#x2F;span&gt;: TraceWith&amp;lt;Visitor1&amp;gt; + TraceWith&amp;lt;Visitor2&amp;gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-impl z-rust&quot;&gt;impl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt; TraceWithV &lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;for&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;T&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;where&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;      T&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;TraceWith&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;Visitor1&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; + &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;TraceWith&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;Visitor2&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;Visitor1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-impl z-rust&quot;&gt;impl&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;Visitor &lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;for&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;Visitor1&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;*&lt;&#x2F;span&gt; ... &lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;Visitor2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-impl z-rust&quot;&gt;impl&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;Visitor &lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;for&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;Visitor2&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;*&lt;&#x2F;span&gt; ... &lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Since &lt;code&gt;TraceWithV&lt;&#x2F;code&gt; and &lt;code&gt;Trace&lt;&#x2F;code&gt; have no generics in any of their types or methods, &lt;code&gt;Trace&lt;&#x2F;code&gt; is dyn-compatible, so it’s finally possible to write (admittedly clunky) dynamic-dispatched code.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;dumpster&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;unsync&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;coerce_gc&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; Gc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    Trace&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;MyTrait&lt;&#x2F;span&gt;: Trace &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-impl z-rust&quot;&gt;impl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Trace&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt; MyTrait &lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;for&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;T&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; gc&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Gc&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;i32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Gc&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; gc&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Gc&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;dyn MyTrait&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;coerce_gc!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;gc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;making-cyclic-data-structures&quot;&gt;Making cyclic data structures&lt;&#x2F;h2&gt;
&lt;p&gt;If you thought my very first example, creating a self-referential &lt;code&gt;Gc&lt;&#x2F;code&gt;, was a little clunky, then you’re not alone!
I find it a total pain everywhere from tests to documentation to application code to blog posts.
In order to have a self-reference, each garbage-collected value must contain some sort of interior mutability to smuggle a pointer into itself.
Since the simplest and most common use case is for a garbage-collected value to keep a pointer to itself, there should be an easy way to construct a simple self-referential &lt;code&gt;Gc&lt;&#x2F;code&gt; like &lt;code&gt;Foo&lt;&#x2F;code&gt; above.&lt;&#x2F;p&gt;
&lt;p&gt;Creativity is overrated.
There’s already a function that does that in the standard library, called &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;rc&#x2F;struct.Rc.html#method.new_cyclic&quot;&gt;&lt;code&gt;Rc::new_cyclic&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; (or &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;sync&#x2F;struct.Arc.html#method.new_cyclic&quot;&gt;&lt;code&gt;Arc::new_cyclic&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;).
In a &lt;code&gt;new_cyclic&lt;&#x2F;code&gt; function, client code can construct a &lt;code&gt;Gc&lt;&#x2F;code&gt; by passing in a helper function that builds a value out of a pointer to itself.
For example, we could rewrite the construction for &lt;code&gt;Foo&lt;&#x2F;code&gt; using a straightforward call to &lt;code&gt;new_cyclic&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;std&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;cell&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;OnceCell&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;dumpster&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;Trace&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;unsync&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Gc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;Trace&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;Foo&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; pointer to this same struct!
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;this&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Gc&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; foo &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Gc&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new_cyclic&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;this&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;Foo &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; this &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;However, the standard library’s approach (passing around a separately-typed weak pointer) won’t work for &lt;code&gt;Gc&lt;&#x2F;code&gt;s.
The whole point of a &lt;code&gt;Gc&lt;&#x2F;code&gt; is that we guarantee that it is (almost) always valid, even in the face of cycles, so we can’t just make up a &lt;code&gt;WeakGc&lt;&#x2F;code&gt; type.&lt;&#x2F;p&gt;
&lt;p&gt;I chose to solve my problems by reusing the one good idea I had in this project: abusing the visitor pattern.
When client code calls &lt;code&gt;new_cyclic&lt;&#x2F;code&gt; with some constructor &lt;code&gt;f&lt;&#x2F;code&gt;, we can lie: instead of having the &lt;code&gt;this&lt;&#x2F;code&gt; pointer actually point to an allocation, we’ll just pass in a garbage, dead &lt;code&gt;Gc&lt;&#x2F;code&gt;.
This dead &lt;code&gt;Gc&lt;&#x2F;code&gt; will contain a garbage sentinel value instead of a pointer, so it doesn’t actually point to a value yet.
Then, once the value has been constructed and &lt;code&gt;f&lt;&#x2F;code&gt; returns, we’ll use our visitor to rehydrate every dead &lt;code&gt;Gc&lt;&#x2F;code&gt; into a live one.
Since we only rehydrate dead &lt;code&gt;Gc&lt;&#x2F;code&gt;s, containing garbage values, the client code can include other, perfectly valid &lt;code&gt;Gc&lt;&#x2F;code&gt;s in their returned value without anything breaking.
This approach is sound since we can just crash the program if client code attempts to dereference a dead &lt;code&gt;Gc&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;At first, I thought this was only possible in my single-threaded &lt;code&gt;unsync&lt;&#x2F;code&gt; implementation of &lt;code&gt;Gc&lt;&#x2F;code&gt;.
I had assumed that malicious client code could smuggle out a reference to the value returned from &lt;code&gt;f&lt;&#x2F;code&gt;, making the rehydration process for &lt;code&gt;Gc&lt;&#x2F;code&gt;s into Undefined Behavior due to the shared-xor-borrow rule.
However, the Rust type system came to save me once again: since returning a value from &lt;code&gt;f&lt;&#x2F;code&gt; is a move, it necessarily invalidates all borrows against the newly-constructed value.
Since the implementation of &lt;code&gt;Trace&lt;&#x2F;code&gt; expressly forbids weird pointer types from being stored in a &lt;code&gt;Gc&lt;&#x2F;code&gt;, it’s impossible for client code to observe the rehydration process.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;breadheel&quot;&gt;Breadheel&lt;&#x2F;h2&gt;
&lt;p&gt;There were actually a lot of big changes to &lt;code&gt;dumpster&lt;&#x2F;code&gt; in the last two years!
I have only finite energy and time, so I’ve highlighted just two of the coolest ideas.
I had a lot of fun implementing all this, and there’s still a lot more to do!
For instance, I want to see if I can get niche-optimization for zero-overhead &lt;code&gt;Option&amp;lt;Gc&amp;gt;&lt;&#x2F;code&gt; and, of course, I always want to crank out extra performance.
But for now, I think this is a good place for &lt;code&gt;dumpster&lt;&#x2F;code&gt; to be: it’s fast, powerful, and as always a little cute.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>My second year of grad school: reflections</title>
          <pubDate>Sun, 17 Aug 2025 00:00:00 +0000</pubDate>
          <author>Clayton Ramsey</author>
          <link>https://claytonwramsey.com/blog/second-year/</link>
          <guid>https://claytonwramsey.com/blog/second-year/</guid>
          <description xml:base="https://claytonwramsey.com/blog/second-year/">&lt;p&gt;Two years of Ph.D. study have made me twice as smart as before!&lt;&#x2F;p&gt;
&lt;p&gt;Well, not really.
But I’ve still grown a lot, and I’ve added up a lot of achievements.
Admittedly, there hasn’t been much outward change, since I’ve no more publications than last year, but I think I’m in a far better shape than the &lt;a href=&quot;&#x2F;blog&#x2F;first-year&quot;&gt;last time&lt;&#x2F;a&gt; I wrote a reflection.
I’ve pushed my prior work in front of loads of eyeballs, especially since I presented it at a number of places, from on campus at Rice to two different workshops at ICRA.
Meanwhile, my long-running ongoing project in task in motion planning is finally wrapping up, so I am now getting ready to publish a paper requiring many-times more work than my first project.
More importantly, though, I think I’ve grown and developed as a researcher and a programmer.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;establishing-my-own-direction&quot;&gt;Establishing my own direction&lt;&#x2F;h2&gt;
&lt;p&gt;This year, my personal theme has been establishing independence.
In the fall, I checked in regularly with my mentors-&lt;em&gt;cum&lt;&#x2F;em&gt;-collaborators &lt;a href=&quot;https:&#x2F;&#x2F;wbthomason.com&#x2F;&quot;&gt;Wil&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;zkingston.com&#x2F;&quot;&gt;Zak&lt;&#x2F;a&gt;, as well as with my doctoral advisor, Lydia, for tactical direction; now, I pick out my own directions and fire off progress updates for vibe-checks.
To toot my own horn: I think this was a big success!
Last year, I feared I wasn’t cut out for it; I am quite proud of my growth here.&lt;&#x2F;p&gt;
&lt;p&gt;Admittedly, my research strategies are pretty weird: I’ve no tolerance eating frogs, so I establish direction via, essentially, play.
I pick my tools, problems, and approaches mostly based on personal excitement; the net result is that I optimize myself into a niche of things that I like.
Day-to-day, this means I spend my time thinking about data structures and hardware acceleration; there is a tiny monkey in my brain pleased only when millisecond counts in my benchmarks go down.
I do not know how long this approach will last or how far it will take me, but for now it is excellent for my morale.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;getting-blocked&quot;&gt;Getting blocked&lt;&#x2F;h2&gt;
&lt;p&gt;I struggle to maintain focus, even on things I like working on.
It’s worst when I’m blocked: I encounter a problem that I don’t fully understand, requiring at the a context-switch into some other documentation or a coworker’s help.
Each blockage is an off-ramp to go do something else; I’d suddenly find myself checking my email, bothering an intern, or just playing with an easier project.
Likewise, I’m introverted and dislike asking others for help, so I wait far too long to seek help when I get stuck — if I do at all.
The net result is blocked projects stay blocked until I work up the willpower to work on them again.&lt;&#x2F;p&gt;
&lt;p&gt;The longer a project spends in a blocked state, the worse it gets, since making progress now requires facing my own non-progress.
Like any properly maladjusted grad student, I stake my happiness on my work progress, so a slow-moving project is also a depressing project.
Continuing from a blocked state then requires not only the standard willpower for working on something hard or socially stressful but also the emotional wherewithal to engage with a project that already makes me feel bad.
The net result is a vicious cycle: I fall behind, feel bad about it, don’t continue, and fall further behind.&lt;&#x2F;p&gt;
&lt;p&gt;Under normal conditions I can manage this cycle well enough, but this year has been harder for me.
My research work is much more independent now, so I find I have less immediate feedback; if I want tactical advice, I usually have to ask for it.
More personally, my mother’s third and likely final cancer diagnosis has demanded that I spend much of my free time with her, about a three hour drive away from home.
Sometimes I feel that I spend my weeks carting between sleep and work and mom in a dreamlike fug.
Going to work, staying focused, and even doing things I normally find fun are all just a little harder now; the net result is that my own productivity is far more variable than it used to be.&lt;&#x2F;p&gt;
&lt;p&gt;My internship at JSC during the summer was probably the worst case of non-progress that I’ve had since, frankly, middle school.
My mom’s health issues were reaching a head, and I burned an hour commuting each way to the outskirts of Houston to spend all day in a windowless concrete box; such conditions are not conducive to clarity of focus or concentration of will.
By the end, I felt I had next to nothing to show for the summer’s work, especially compared to my peers.&lt;&#x2F;p&gt;
&lt;p&gt;Were I older and wiser, perhaps I could conclude with a motivating tale of my resourcefulness and growth; however, the astute reader will note the publication date.
I’m writing just after the summer has ended, so I’m fresh off of that experience.
I have some cause for hope though; during the school year, my commute becomes a ten-minute bike ride to a office with a window.
If my surroundings can tank my productivity, then maybe my surroundings can also revive them.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;having-fun-with-my-tools&quot;&gt;Having fun with my tools&lt;&#x2F;h2&gt;
&lt;p&gt;On to more exciting topics!&lt;&#x2F;p&gt;
&lt;p&gt;My current work is in task and motion planning; the details are irrelevant to this post, but in short, solving such planning problems requires gluing a plethora of dependencies together.
Each dependency special in its own way, making dependency management an exercise in organized chaos.&lt;&#x2F;p&gt;
&lt;p&gt;The worst offender was task planning: my task planner was a Python script that takes in file-paths with problem definitions, then sets off a chain of dominoes converting the problem into an intermediate representation (another file), and finally firing off a separate search binary compiled from C++ to generate an infinite stream of solutions.
Naturally, there is no way to inspect the process, nor to programmatically request just one solution in a stream, so I wrote a hacky wrapper using &lt;code&gt;inotify&lt;&#x2F;code&gt; to inspect the planner’s output in &lt;code&gt;&#x2F;tmp&lt;&#x2F;code&gt; and send IPC signals to stop and start the planner process group whenever I needed another task plan.
Of course, any mistake in this management would fill my hard drive with nine hundred gigabytes of task plans.
If I don’t catch it, no problem!
My desktop environment will notify me by crashing on out-of-storage errors.&lt;&#x2F;p&gt;
&lt;p&gt;After a few months mired in build scripts and template errors, I just gave up.
I rewrote the entire motion planning framework in Rust, and eventually rewrote my task planners too, then forked my simulation tools to make compile times faster.
On the whole, the rewrites of all my dependencies spanned maybe ten thousand lines of code, and took me a month or two of cumulative effort spread across the fall semester (and my winter break).&lt;&#x2F;p&gt;
&lt;p&gt;Conventional wisdom dictates that one should never do a total rewrite of their software, but in my case, it was a great choice!
Rewriting the motion planner gave me finer control over the planner (good for building on top of it), while rewriting the task planner yielded an order-of-magnitude speedup.
The difference is stark: I spent much of the fall of this year spinning my wheels, with very little clue of what to do and how to do it.
Once I started rewriting my entire project in Rust, I had a second wind: working on the project was way more fun, so I was able to move much more quickly.&lt;&#x2F;p&gt;
&lt;p&gt;I’ve come to think of my own research as a sort of play: the more fun I’m having, the more progress I make, and the more progress I make, the more fun I’m having.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-spot-of-hope&quot;&gt;A spot of hope?&lt;&#x2F;h2&gt;
&lt;p&gt;After over a year of work, I finally have a research project chugging along (mostly) smoothly.
I’m targeting a publication deadline in mid-September, so I have a lot of writing to do, but I am confident that I can make it.
Look out for a blog post when the project is (eventually) done!!&lt;&#x2F;p&gt;
&lt;p&gt;Personally, I feel that this has shown a lot of growth for me.
I can now set my own research directions, but I still struggle with motivation and time management.
In all, though, I’m looking forward to new projects building off my current work, and also maybe to getting sidetracked and building some weird tools.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>I&#x27;d rather read the prompt</title>
          <pubDate>Sat, 03 May 2025 00:00:00 +0000</pubDate>
          <author>Clayton Ramsey</author>
          <link>https://claytonwramsey.com/blog/prompt/</link>
          <guid>https://claytonwramsey.com/blog/prompt/</guid>
          <description xml:base="https://claytonwramsey.com/blog/prompt/">&lt;p&gt;When I grade students’ assignments, I sometimes see answers like this:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Utilizing Euler angles for rotation representation could have the following possible downsides:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gimbal lock&lt;&#x2F;strong&gt;: In certain positions, orientations can reach a singularity, which prevents them from continuously rotating without a sudden change in the coordinate values.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Numeric instability&lt;&#x2F;strong&gt;: Using Euler angles could cause numeric computations to be less precise, which can add up and produce inaccuracies if used often.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Non-unique coordinates&lt;&#x2F;strong&gt;: Another downside of Euler angles is that some rotations do not have a unique representation in Euler angles, particularly at singularities.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The downsides of Euler angles make them difficult to utilize in robotics.
It’s important to note that very few implementations employ Euler angles for robotics.
Instead, one could use rotation matrices or quaternions to facilitate more efficient rotation representation.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;[Not a student’s real answer, but my handmade synthesis of the style and content of many answers]&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;You only have to read one or two of these answers to know exactly what’s up: the students just copy-pasted the output from a large language model, most likely ChatGPT.
They are invariably verbose, interminably waffly, and insipidly fixated on the bullet-points-with-bold style.
The prose rarely surpasses the sixth-grade book report, constantly repeating the prompt, presumably to prove that they’re staying on topic.&lt;&#x2F;p&gt;
&lt;p&gt;As an instructor, I am always saddened to read this.
The ChatGPT rhetorical style is distinctive enough that I can catch it, but not so distinctive to be worth passing along to an honor council.
Even if I did, I’m not sure the marginal gains in the integrity of the class would be worth the hours spent litigating the issue.&lt;&#x2F;p&gt;
&lt;p&gt;I write this article as a plea to everyone: not just my students, but the blog posters and Reddit commenters and weak-accept paper authors and Reviewer 2.
&lt;strong&gt;Don’t let a computer write for you!&lt;&#x2F;strong&gt;
I say this not for reasons of intellectual honesty, or for the spirit of fairness.
I say this because I believe that your original thoughts are far more interesting, meaningful, and valuable than whatever a large language model can transform them into.
For the rest of this piece, I’ll briefly examine some guesses as to why people write with large language models so often, and argue that there’s no good reason to use one for creative expression.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-do-people-do-this&quot;&gt;Why do people do this?&lt;&#x2F;h2&gt;
&lt;p&gt;I’m not much of a generative-model user myself, but I know many people who heavily rely upon them.
From my own experience, I see a few reasons why people use such models to speak for them.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;It doesn’t matter.&lt;&#x2F;strong&gt;
I think this belief is most common in classroom settings.
A typical belief among students is that classes are a series of hurdles to be overcome; at the end of this obstacle course, they shall receive a degree as testament to their completion of these assignments.
I think this is also the source of increasing language model use in in &lt;a href=&quot;https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;2403.07183&quot;&gt;paper reviews&lt;&#x2F;a&gt;.
Many researchers consider reviewing ancillary to their already-burdensome jobs; some feel they cannot spare time to write a good review and so pass the work along to a language model.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;The model produces better work.&lt;&#x2F;strong&gt;
Some of my peers believe that large language models produce strictly better writing than they could produce on their own.
Anecdotally, this phenomenon seems more common among English-as-a-second-language speakers.
I also see it a lot with first-time programmers, for whom programming is a set of mysterious incantations to be memorized and recited.
I think this is also the cause of language model use in some forms of &lt;a href=&quot;https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;2404.01268&quot;&gt;academic writing&lt;&#x2F;a&gt;: it differs from the prior case with paper reviews in that, presumably, the authors believe that their paper matters, but don’t believe they can produce sufficient writing.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;There’s skin in the game.&lt;&#x2F;strong&gt;
This last cause is least common among individuals, but probably accounts for the overwhelming majority of language pollution on the Internet.
Examples of skin-in-the-game writing include astroturfing, customer service chatbots, and the rambling prologues found in online baking recipes.
This writing is never meant to be read by a human and does not carry any authorial intent at all.
For this essay, I’m primarily interested in the motivations for private individuals, so I’ll avoid discussing this much; however, I have included it for sake of completeness.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-do-we-write-anyway&quot;&gt;Why do we write, anyway?&lt;&#x2F;h2&gt;
&lt;p&gt;I believe that the main reason a human should write is to &lt;em&gt;communicate original thoughts&lt;&#x2F;em&gt;.
To be clear, I don’t believe that these thoughts need to be special or academic.
Your vacation, your dog, and your favorite color are all fair game.
However, these thoughts should be &lt;em&gt;yours&lt;&#x2F;em&gt;: there’s no point in wasting ink to communicate someone else’s thoughts.&lt;&#x2F;p&gt;
&lt;p&gt;In that sense, using a language model to write is worse than plagiarism.
When copying another person’s words, one doesn’t communicate their own original thoughts, but at least they are communicating a human’s thoughts.
A language model, by construction, has no original thoughts of its own; publishing its output is a pointless exercise.&lt;&#x2F;p&gt;
&lt;p&gt;Returning to our reasons for using a language model, we can now examine them once more with this definition in mind.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;if-it-s-not-worth-doing-it-s-not-worth-doing-well&quot;&gt;If it’s not worth doing, it’s not worth doing well&lt;&#x2F;h3&gt;
&lt;p&gt;The model output in the doesn’t-matter category falls under two classes to me: the stuff that actually doesn’t matter and the stuff that actually does matter.
I’ll start with the things that don’t matter.
When someone comments under a Reddit post with a computer-generated summary of the original text, I honestly believe that everyone in the world would be better off had they not done so.
Either the article is so vapid that a summary provides all of its value, in which case, it does not merit the engagement of a comment, or it demands a real reading by a real human for comprehension, in which case the summary is pointless.
In essence, writing such a comment wastes everyone’s time.
This is the case for all of the disposable uses of a model.&lt;&#x2F;p&gt;
&lt;p&gt;Meanwhile, there are uses which seem disposable at a surface-level and which in practice are not so disposable (the actually-does-matter category).
I should hope that the purpose of a class writing exercise is not to create an artifact of text but force the student to think; a language model produces the former, not the latter.
For paper reviewers, it’s worse: a half-assed review will produce little more than make-work for the original authors and tell the editor nothing they didn’t already know.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;if-it-s-worth-doing-it-s-worth-doing-badly&quot;&gt;If it’s worth doing, it’s worth doing badly&lt;&#x2F;h3&gt;
&lt;p&gt;I’ll now cover the opposite case: my peers who see generative models as superior to their own output.
I see this most often in professional communication, typically to produce fluff or fix the tone of their original prompts.
Every single time, the model obscures the original meaning and adds layers of superfluous nonsense to even the simplest of ideas.
If you’re lucky, it at least won’t be wrong, but most often the model will completely fabricate critical details of the original writing and produce something completely incomprehensible.
No matter how bad any original human’s writing is, I can (hopefully?) trust that they have some kind of internal understanding to share; with a language model, there is no such luck.&lt;&#x2F;p&gt;
&lt;p&gt;I have a little more sympathy for programmers, but the long-term results are more insidious.
You might recall Peter Naur’s &lt;cite&gt;Programming as Theory Building&lt;&#x2F;cite&gt;: writing a sufficiently complex program requires not only the artifact of code (that is, the program source), but a &lt;dfn&gt;theory&lt;&#x2F;dfn&gt; of the program, in which an individual must fully understand the logical structure behind the code.
Vibe coding; that is, writing programs almost exclusively by language-model generation; produces an artifact with no theory behind it.
The result is simple: with no theory, the produced code is practically useless.
In Naur’s terms, such a program is &lt;dfn&gt;dead&lt;&#x2F;dfn&gt;; in our case, it’s stillborn.
It should come as no surprise that nearly every vibe-coded app on the Internet struggles with security issues; look no further than &lt;a href=&quot;https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=43553031#43554611&quot;&gt;the vibe-coded recipe app that leaks its OpenAI keys&lt;&#x2F;a&gt;.
Every time one generates code by prompt, they create a new stillborn program; vibe coding is the art of stitching together their corpses into Frankenstein’s monster.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;an-annotated-exercise&quot;&gt;An annotated exercise&lt;&#x2F;h2&gt;
&lt;p&gt;As an experiment, I copied the thesis statement of this essay into Google Gemini and prompted it to complete the essay.
Below the spoiler is its complete response.&lt;&#x2F;p&gt;
&lt;details&gt;
  &lt;summary&gt;The complete prompt and output.&lt;&#x2F;summary&gt;
&lt;p&gt;Prompt:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;The following is an introduction to a short essay which I have written. Complete the essay by writing 2 short paragraphs.&lt;&#x2F;p&gt;
&lt;p&gt;I write this article as a plea to everyone: not just my students, but the blog posters and Reddit commenters and weak-accept paper authors and Reviewer 2.
&lt;strong&gt;Don’t let a computer write for you!&lt;&#x2F;strong&gt;
I say this not for reasons of intellectual honesty, or for the spirit of fairness.
I say this because I believe that your original thoughts are far more interesting, meaningful, and valuable than whatever a large language model can transform them into.
For the rest of this piece, I’ll briefly examine some guesses as to why people write with large language models so often, and argue that there’s no good reason to use one for creative expression.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Output:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s fascinating to consider why so many are turning to large language models for writing. Perhaps it stems from a desire for efficiency, a wish to quickly generate text without the perceived effort of crafting each sentence. The allure of instant output can be strong, especially in a world that often prioritizes speed. For students facing deadlines, or blog posters needing content, the temptation to shortcut the writing process might feel overwhelming. There could also be a sense of insecurity, a feeling that one’s own writing isn’t “good enough” and that a language model can somehow elevate it. This might be particularly true for those navigating the often critical world of academic reviews or the sometimes harsh landscape of online commentary.&lt;&#x2F;p&gt;
&lt;p&gt;However, this reliance on artificial intelligence fundamentally misunderstands the very essence of creative expression. Your individual voice, shaped by your unique experiences, perspectives, and even your struggles to articulate an idea, is what makes your writing resonate. A language model, trained on vast datasets of existing text, can only ever produce a pastiche, a reflection of what has already been said. It lacks the spark of genuine insight, the unexpected turn of phrase that comes from wrestling with a concept until it becomes your own. To surrender your voice to an algorithm is to diminish the potential for true connection and the profound satisfaction of communicating your own original thoughts to the world.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;&#x2F;details&gt;
&lt;p&gt;The resulting text is, put plainly, &lt;em&gt;boring&lt;&#x2F;em&gt;.
In its 234-word output, the model produces merely a lengthy rehash of the same prompt.
Tonally, it provides no more than sweeping and pointless generality, and any points earned for its brobdingnagian vocabulary are immediately lost to its total lack of taste in using it.
For example, consider the following sentence:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Perhaps it stems from a desire for efficiency, a wish to quickly generate text without the perceived effort of crafting each sentence.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Gemini has produced a big sentence for a small thought.
I can trivially cut two-thirds of it and remove nothing of substance:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Perhaps it stems from a desire for efficiency.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;With some care, I can trim it a little more.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Perhaps people do it for efficiency.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;So, in short, a language model is great for making nonsense, and not so great for anything else.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;just-show-me-the-prompt&quot;&gt;Just show me the prompt&lt;&#x2F;h2&gt;
&lt;p&gt;I now circle back to my main point: I have never seen any form of create generative model output (be that image, text, audio, or video) which I would rather see than the original prompt.
The resulting output has less substance than the prompt and lacks any human vision in its creation.
The whole point of making creative work is to share one’s own experience - if there’s no experience to share, why bother?
If it’s not worth writing, it’s not worth reading.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>How I make figures</title>
          <pubDate>Fri, 02 May 2025 00:00:00 +0000</pubDate>
          <author>Clayton Ramsey</author>
          <link>https://claytonwramsey.com/blog/drawings/</link>
          <guid>https://claytonwramsey.com/blog/drawings/</guid>
          <description xml:base="https://claytonwramsey.com/blog/drawings/">&lt;p&gt;As a grad student, I have to give a lot of presentations, and all those presentations have to look good.
Inevitably this means that I have to make a lot of pictures.
This is a short little post about how I make “explanatory” figures: diagrams and models and such.&lt;&#x2F;p&gt;
&lt;p&gt;I prefer to make my own figures, since I’m always disappointed to see AI-generated stock photos.
To be honest, I’d rather they just tell me what prompt they gave to the model, rather than the output.
In some presentations I might also borrow figures from others’ work (with attribution, of course), but most of the time, I just make my own.
For this article, I’ll walk through the creation process for one figure.
The details aren’t super important, but in this case it’s a search tree, a la Monte Carlo Tree Search.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sketches&quot;&gt;Sketches&lt;&#x2F;h2&gt;
&lt;figure &gt;
  &lt;div style=&quot;display: flex&quot;&gt;
    &lt;div style=&quot;width: 50%&quot;&gt;&lt;img src=&quot;raw.jpg&quot; alt=&quot;Raw diagram of a tree of boxes&quot;&#x2F;&gt;&lt;&#x2F;div&gt;
    &lt;div style=&quot;width: 50%&quot;&gt;&lt;img src=&quot;scanned.jpg&quot; alt=&quot;Scanned diagram of a tree of boxes&quot;&#x2F;&gt;&lt;&#x2F;div&gt;
    &lt;&#x2F;div&gt;
  &lt;figcaption&gt;Hand-sketched figures, before and after touching them up.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;My figures usually start life as sketches done in pen in a notebook.
If I can find one, I’ll use graph paper to make things line up nicely on a grid.
Usually, I don’t have it, so I just draw it on ordinary college-ruled stuff.&lt;&#x2F;p&gt;
&lt;p&gt;I then take a picture of the sketch with my phone, and fiddle with my phone’s built-in color adjustment until it’s all just black and white.
Sometimes this is the end state of my figure, since I often don’t need perfectly gorgeous slides, and I quite like the scrappy look of the doodles.&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img src=&quot;traced.svg&quot; alt=&quot;Traced diagram&quot; type=&quot;text&#x2F;svg&quot; class=&quot;night-invert&quot; &#x2F;&gt;
  &lt;figcaption&gt;The diagram after tracing.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;If I want something just a little bit sharper than the scanned drawing, but still a little scrappy, I’ll throw the scanned drawing into Inkscape and have it trace the figure.
This gives cleaner lines and yields scalable figures, but sometimes it smudges things up.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;nicer-figures&quot;&gt;Nicer figures&lt;&#x2F;h2&gt;
&lt;figure&gt;
&lt;div style=&quot;display: flex&quot;&gt;
&lt;div style=&quot;width: 45%&quot;&gt;
&lt;!-- make width 100% for this figure --&gt;
&lt;style&gt;
.typst-display {
  width: 100% !important;
}
&lt;&#x2F;style&gt;
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%20143.73228346456693%20200.4251968503937%22%20width%3D%22143.73228346456693pt%22%20height%3D%22210.4251968503937pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%281%201%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2829.690293939755335%2028.346456692913385%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22none%22%20stroke%3D%22%23000000%22%20stroke-width%3D%221.3%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22miter%22%20stroke-miterlimit%3D%224%22%20d%3D%22M%2027.002619%200%20C%2027.002619%200%200%2027.002619%200%2027.002619%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2828.346456692913385%2044.91091312056989%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M%205.494037%200%20C%205.494037%200%200%2011.782001%200%2011.782001%20C%200%2011.782001%2011.782001%206.2879634%2011.782001%206.2879634%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2870.86614173228347%2028.346456692913385%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22none%22%20stroke%3D%22%23000000%22%20stroke-width%3D%221.3%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22miter%22%20stroke-miterlimit%3D%224%22%20d%3D%22M%200%200%20C%200%200%200%2026.445984%200%2026.445984%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2866.41987997677265%2044.47690961157615%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M%200%200%20C%200%200%204.446262%2012.216003%204.446262%2012.216003%20C%204.446262%2012.216003%208.892524%200%208.892524%200%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2885.03937007874016%2028.346456692913385%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22none%22%20stroke%3D%22%23000000%22%20stroke-width%3D%221.3%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22miter%22%20stroke-miterlimit%3D%224%22%20d%3D%22M%200%200%20C%200%200%2027.002619%2027.002619%2027.002619%2027.002619%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28101.60382650639666%2044.91091312056989%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M%200%206.2879634%20C%200%206.2879634%2011.782001%2011.782001%2011.782001%2011.782001%20C%2011.782001%2011.782001%206.2879634%200%206.2879634%200%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2814.173228346456693%2085.03937007874016%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22none%22%20stroke%3D%22%23000000%22%20stroke-width%3D%221.3%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22miter%22%20stroke-miterlimit%3D%224%22%20d%3D%22M%200%200%20C%200%200%200%2026.445984%200%2026.445984%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.72696659094588%20101.16982299740292%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M%200%200%20C%200%200%204.446262%2012.216003%204.446262%2012.216003%20C%204.446262%2012.216003%208.892524%200%208.892524%200%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2870.86614173228347%2085.03937007874016%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22none%22%20stroke%3D%22%23000000%22%20stroke-width%3D%221.3%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22miter%22%20stroke-miterlimit%3D%224%22%20d%3D%22M%200%200%20C%200%200%200%2026.445984%200%2026.445984%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2866.41987997677265%20101.16982299740292%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M%200%200%20C%200%200%204.446262%2012.216003%204.446262%2012.216003%20C%204.446262%2012.216003%208.892524%200%208.892524%200%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2814.173228346456693%20141.73228346456693%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22none%22%20stroke%3D%22%23000000%22%20stroke-width%3D%221.3%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22miter%22%20stroke-miterlimit%3D%224%22%20d%3D%22M%200%200%20C%200%200%200%2026.445984%200%2026.445984%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.72696659094588%20157.8627363832297%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M%200%200%20C%200%200%204.446262%2012.216003%204.446262%2012.216003%20C%204.446262%2012.216003%208.892524%200%208.892524%200%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2828.346456692913385%20141.73228346456693%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22none%22%20stroke%3D%22%23000000%22%20stroke-width%3D%221.3%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22miter%22%20stroke-miterlimit%3D%224%22%20d%3D%22M%200%200%20C%200%200%2027.002619%2027.002619%2027.002619%2027.002619%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2844.91091312056989%20158.29673989222343%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M%200%206.2879634%20C%200%206.2879634%2011.782001%2011.782001%2011.782001%2011.782001%20C%2011.782001%2011.782001%206.2879634%200%206.2879634%200%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2856.69291338582677%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22%23bfcdd0%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%23000000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22butt%22%20stroke-linejoin%3D%22miter%22%20stroke-miterlimit%3D%224%22%20d%3D%22M%200%200%20C%200%200%200%2028.346457%200%2028.346457%20C%200%2028.346457%2028.346457%2028.346457%2028.346457%2028.346457%20C%2028.346457%2028.346457%2028.346457%200%2028.346457%200%20C%2028.346457%200%200%200%200%200%20C%200%200%200%200%200%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2056.69291338582677%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22%23bfcdd0%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%23000000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22butt%22%20stroke-linejoin%3D%22miter%22%20stroke-miterlimit%3D%224%22%20d%3D%22M%200%200%20C%200%200%200%2028.346457%200%2028.346457%20C%200%2028.346457%2028.346457%2028.346457%2028.346457%2028.346457%20C%2028.346457%2028.346457%2028.346457%200%2028.346457%200%20C%2028.346457%200%200%200%200%200%20C%200%200%200%200%200%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2856.69291338582677%2056.69291338582677%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22%23bfcdd0%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%23000000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22butt%22%20stroke-linejoin%3D%22miter%22%20stroke-miterlimit%3D%224%22%20d%3D%22M%200%200%20C%200%200%200%2028.346457%200%2028.346457%20C%200%2028.346457%2028.346457%2028.346457%2028.346457%2028.346457%20C%2028.346457%2028.346457%2028.346457%200%2028.346457%200%20C%2028.346457%200%200%200%200%200%20C%200%200%200%200%200%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28113.38582677165354%2056.69291338582677%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22none%22%20stroke%3D%22%23000000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22butt%22%20stroke-linejoin%3D%22miter%22%20stroke-miterlimit%3D%224%22%20stroke-dashoffset%3D%220%22%20stroke-dasharray%3D%222%202%22%20d%3D%22M%200%200%20C%200%200%200%2028.346457%200%2028.346457%20C%200%2028.346457%2028.346457%2028.346457%2028.346457%2028.346457%20C%2028.346457%2028.346457%2028.346457%200%2028.346457%200%20C%2028.346457%200%200%200%200%200%20C%200%200%200%200%200%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%20113.38582677165354%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22%23bfcdd0%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%23000000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22butt%22%20stroke-linejoin%3D%22miter%22%20stroke-miterlimit%3D%224%22%20d%3D%22M%200%200%20C%200%200%200%2028.346457%200%2028.346457%20C%200%2028.346457%2028.346457%2028.346457%2028.346457%2028.346457%20C%2028.346457%2028.346457%2028.346457%200%2028.346457%200%20C%2028.346457%200%200%200%200%200%20C%200%200%200%200%200%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2856.69291338582677%20113.38582677165354%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22none%22%20stroke%3D%22%23000000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22butt%22%20stroke-linejoin%3D%22miter%22%20stroke-miterlimit%3D%224%22%20stroke-dashoffset%3D%220%22%20stroke-dasharray%3D%222%202%22%20d%3D%22M%200%200%20C%200%200%200%2028.346457%200%2028.346457%20C%200%2028.346457%2028.346457%2028.346457%2028.346457%2028.346457%20C%2028.346457%2028.346457%2028.346457%200%2028.346457%200%20C%2028.346457%200%200%200%200%200%20C%200%200%200%200%200%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%20170.07874015748033%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22%23bfcdd0%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%23000000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22butt%22%20stroke-linejoin%3D%22miter%22%20stroke-miterlimit%3D%224%22%20d%3D%22M%200%200%20C%200%200%200%2028.346457%200%2028.346457%20C%200%2028.346457%2028.346457%2028.346457%2028.346457%2028.346457%20C%2028.346457%2028.346457%2028.346457%200%2028.346457%200%20C%2028.346457%200%200%200%200%200%20C%200%200%200%200%200%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2856.69291338582677%20170.07874015748033%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22none%22%20stroke%3D%22%23000000%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22butt%22%20stroke-linejoin%3D%22miter%22%20stroke-miterlimit%3D%224%22%20stroke-dashoffset%3D%220%22%20stroke-dasharray%3D%222%202%22%20d%3D%22M%200%200%20C%200%200%200%2028.346457%200%2028.346457%20C%200%2028.346457%2028.346457%2028.346457%2028.346457%2028.346457%20C%2028.346457%2028.346457%2028.346457%200%2028.346457%200%20C%2028.346457%200%200%200%200%200%20C%200%200%200%200%200%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-display typst-doc&quot; style=&quot; width: 13.06657122405154em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;div&gt;
&lt;div style=&quot;width: 10%&quot;&gt;&lt;&#x2F;div&gt;
&lt;div style=&quot;width: 45%&quot;&gt;
&lt;img src=&quot;inkscape.svg&quot; class=&quot;night-invert&quot; &#x2F;&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;figcaption&gt;The diagrams, prepared in Typst (left) and Inkscape (right).&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;If I have to produce something official-looking, I usually have two approaches: making the document in Inkscape or generating it in Typst.
This part is usually pretty easy, but it’s a little boring, since most of the creative part is done.
I often end up doing a lot of yak shaving instead of making the final versions of these figures.&lt;&#x2F;p&gt;
&lt;p&gt;Both tools are flawed in their own special ways.
Although Typst (in this instance, using &lt;a href=&quot;https:&#x2F;&#x2F;typst.app&#x2F;universe&#x2F;package&#x2F;fletcher&#x2F;&quot;&gt;Fletcher&lt;&#x2F;a&gt;) is much more ergonomic than TikZ, it’s still text-based figure generation and suffers from all the same hackiness.
Meanwhile, Inkscape is clunky, and it’s hard to get good, consistent-looking drawings even when using a grid.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>No longer writing my own damn HTML</title>
          <pubDate>Tue, 11 Feb 2025 00:00:00 +0000</pubDate>
          <author>Clayton Ramsey</author>
          <link>https://claytonwramsey.com/blog/no-html/</link>
          <guid>https://claytonwramsey.com/blog/no-html/</guid>
          <description xml:base="https://claytonwramsey.com/blog/no-html/">&lt;p&gt;I’ve (mostly) given up on hand-writing HTML for my personal blog.
Previously, &lt;a href=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;own-html&#x2F;&quot;&gt;I wrote all the HTML for this site by hand&lt;&#x2F;a&gt;
Over the past few days, I recently ported my whole blog from HTML to &lt;a href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;&quot;&gt;Zola&lt;&#x2F;a&gt;.
I’m writing this post partly to explain why and how I did it, and in part as a response to &lt;a href=&quot;https:&#x2F;&#x2F;devpoga.org&#x2F;i-blog-with-raw-html&#x2F;&quot;&gt;other&lt;&#x2F;a&gt; &lt;a href=&quot;https:&#x2F;&#x2F;misc.l3m.in&#x2F;txt&#x2F;raw_txt.txt&quot;&gt;posts&lt;&#x2F;a&gt; about writing a blog using spartan tooling.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;papercuts&quot;&gt;Papercuts&lt;&#x2F;h2&gt;
&lt;p&gt;So, why change over?
In short, I just got sick of it.
I stand by my original claims from when I ported from Jekyll to HTML: namely, handwriting HTML is honestly not that hard.
However, writing every post added a few small papercuts that made writing harder than it had to be.&lt;&#x2F;p&gt;
&lt;p&gt;To write a new article, I’d have to go through a long sequence of steps:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Copy-paste an older article to get the correct headers and navbar.&lt;&#x2F;li&gt;
&lt;li&gt;Manually edit the title blocks, description, and some links.&lt;&#x2F;li&gt;
&lt;li&gt;Write the post, using &lt;code&gt;&amp;lt;p&amp;gt;&lt;&#x2F;code&gt; and &lt;code&gt;&amp;lt;section&amp;gt;&lt;&#x2F;code&gt; manually.&lt;&#x2F;li&gt;
&lt;li&gt;Painstakingly check for mistakes and polish errors.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;The story got worse whenever I had to do anything involving math: I wanted to avoid shipping JavaScript to users, so I wrote all my math in MathML.
MathML is many things, but “writable by humans” is not one of them.
Instead, I used a &lt;a href=&quot;https:&#x2F;&#x2F;temml.org&#x2F;&quot;&gt;converter tool&lt;&#x2F;a&gt; once I had finished writing each article and then copy-pasted every formula into the post.
It felt like an exercise in pointless manual labor.&lt;&#x2F;p&gt;
&lt;p&gt;I also wanted to highlight code, but I wasn’t going to submit myself to the misery of writing &lt;code&gt;span&lt;&#x2F;code&gt;s for every keyword.
As a workaround, I shipped &lt;a href=&quot;https:&#x2F;&#x2F;highlightjs.org&#x2F;&quot;&gt;Highlight.js&lt;&#x2F;a&gt; with all my blog articles, which I never really liked.
My site was static, so why should I force users to do rendering work on their machines?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;an-ad-hoc-informally-specified-bug-ridden-slow-implementation-of-half-of-common-lisp-a-static-site-generator&quot;&gt;An ad-hoc, informally-specified, bug-ridden, slow implementation of half of &lt;del&gt;Common Lisp&lt;&#x2F;del&gt; a static site generator&lt;&#x2F;h2&gt;
&lt;p&gt;Eventually, I got sick of manually converting my equations, so I wrote a Python script to automatically convert LaTeX expressions to MathML in my blog posts.
I started considering writing an automated tool for inserting my navbars into the HTML files, and then I realized that I was completely wasting my time.
After some shopping around, I decided Zola was the least deranged of the existing site generators, so I tried rolling with it.&lt;&#x2F;p&gt;
&lt;p&gt;My main requirements were that I wanted to manually implement my own styling and and I needed server-side support for math and code, and I could do both with Zola (albeit requiring a little bit of effort).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-it-works&quot;&gt;How it works&lt;&#x2F;h2&gt;
&lt;p&gt;Right now, this website is served by GitHub Pages via some convoluted manually written actions.
I could have made things easier, but I decided it’s the twenty-first century and I should act like it: instead of using KaTeX or MathJaX, I’m using a &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cestef&#x2F;zola&quot;&gt;fork&lt;&#x2F;a&gt; of Zola with Typst support written by &lt;a href=&quot;https:&#x2F;&#x2F;cstef.dev&#x2F;&quot;&gt;cstef&lt;&#x2F;a&gt;.
This is a little hacky, but I think it has all the features I really want, so I don’t mind pinning myself to one specific version for now.&lt;&#x2F;p&gt;
&lt;p&gt;I ported over all my posts into Markdown using &lt;a href=&quot;https:&#x2F;&#x2F;pandoc.org&#x2F;index.html&quot;&gt;pandoc&lt;&#x2F;a&gt;.
It wasn’t perfect, but I only had to do a little bit of manual editing, which is far better than rewriting all my posts by hand.
The most annoying part was math, since pandoc seemed to butcher all my math expressions, converting them to an incomprehensible style of LaTeX that I manually converted into Typst.&lt;&#x2F;p&gt;
&lt;p&gt;Because I was using a weird fork of Zola, I had to write my own action pipeline to deploy everything.
It was a pain.
GitHub Actions is one of the most annoying specification languages I’ve ever had the misfortune to use.
After half an hour of finagling I finally got everything to work somewhat consistently, mostly by cargo-culting my way through YAML specifications.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;have-i-learned-anything&quot;&gt;Have I learned anything?&lt;&#x2F;h2&gt;
&lt;p&gt;I don’t think I’m any better at website administration now, but at least I know it won’t be too hard to jump ship if I change my mind again.
I certainly can write my blog posts a lot faster, and the “activation energy” for starting a new post is much lower.
My hope is that I’ll take advantage of this and start writing more!&lt;&#x2F;p&gt;
&lt;p&gt;So, to make a long story short, I can only say one thing.
For thousands of years, man has invented technology to ameliorate the petty pains and discomforts of his life.
It would be an insult not to use it.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Solving 20 billion Wordle problems per second</title>
          <pubDate>Mon, 25 Nov 2024 00:00:00 +0000</pubDate>
          <author>Clayton Ramsey</author>
          <link>https://claytonwramsey.com/blog/simd-wordle/</link>
          <guid>https://claytonwramsey.com/blog/simd-wordle/</guid>
          <description xml:base="https://claytonwramsey.com/blog/simd-wordle/">&lt;p&gt;Wordle is a mostly-solved problem, but we can mostly-solve it faster.
Every so often, I get caught with the puzzle automation mind virus, and
feel a burning need to write an engine for solving a pointless little
game or puzzle. This time, I got caught by Wordle. To my knowledge,
I’ve implemented the fastest implementation of a word grader out there.
Of course, I’m nearly three years late to the party, but I had fun
writing all this, which is all that matters to me. If you don’t care
about the journey as much as me, you can check out the source code
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;claytonwramsey&#x2F;wordle_simd&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-even-is-wordle&quot;&gt;What even is Wordle?&lt;&#x2F;h2&gt;
&lt;p&gt;In case you lived under a rock around 3 years ago, Wordle is a little
word-guessing game developed by &lt;a href=&quot;https:&#x2F;&#x2F;www.powerlanguage.co.uk&#x2F;&quot;&gt;Josh
Wardle&lt;&#x2F;a&gt;. The goal is to guess a
five-letter English word by sampling different words. Every time you
give a guess, you receive a &lt;dfn&gt;grade&lt;&#x2F;dfn&gt;, which is an assignment of
five colors to the letters in your guess.&lt;&#x2F;p&gt;
&lt;p&gt;Given some guess &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%209.347%2021.878999999999998%22%20width%3D%229.347pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF5A736AF78F00E66632FD1D047F362F0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF5A736AF78F00E66632FD1D047F362F0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.67%205.083%20C%207.67%204.966%207.735%204.836%207.8780003%204.7060003%20C%208.177%204.42%208.333%204.0690002%208.333%203.653%20C%208.333%203.4320002%208.255%203.081%208.099%202.5740001%20C%207.618%201.014%207.007%200.234%206.2660003%200.234%20C%205.655%200.234%205.356%200.58500004%205.356%201.3000001%20C%205.356%201.547%205.408%201.8460001%205.499%202.223%20C%205.7330003%203.1590002%205.98%204.0820003%206.201%205.031%20C%206.227%205.122%206.2400002%205.1740003%206.2400002%205.2130003%20C%206.2400002%205.473%206.097%205.603%205.8110003%205.603%20C%205.551%205.603%205.382%205.473%205.291%205.2130003%20L%204.771%203.1850002%20C%204.576%202.431%204.433%202.171%204.433%201.495%20C%204.433%201.391%204.433%201.3130001%204.446%201.274%20C%204.1470003%200.58500004%203.77%200.234%203.315%200.234%20C%202.665%200.234%202.3400002%200.611%202.3400002%201.352%20C%202.3400002%201.8330001%202.561%202.652%203.003%203.809%20C%203.1460001%204.199%203.224%204.472%203.224%204.6410003%20C%203.224%205.278%202.756%205.7460003%202.119%205.7460003%20C%201.534%205.7460003%201.092%205.421%200.767%204.771%20C%200.507%204.264%200.377%203.913%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.754%203.549%200.78000003%203.627%200.832%203.809%20C%201.144%204.849%201.5600001%205.369%202.08%205.369%20C%202.262%205.369%202.3530002%205.2390003%202.3530002%204.992%20C%202.3530002%204.797%202.275%204.511%202.132%204.1210003%20C%201.651%202.8600001%201.404%202.002%201.404%201.521%20C%201.404%200.416%202.145%20-0.143%203.276%20-0.143%20C%203.822%20-0.143%204.264%200.13%204.6150002%200.689%20C%204.875%200.13%205.408%20-0.143%206.227%20-0.143%20C%207.033%20-0.143%207.67%200.39000002%208.125%201.4560001%20C%208.424%202.132%208.983%203.926%208.983%204.797%20C%208.983%204.992%208.97%205.122%208.957%205.1870003%20C%208.905%205.434%208.658%205.7460003%208.372%205.7460003%20C%208.034%205.7460003%207.67%205.421%207.67%205.083%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.8497272727272727em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; and solution word &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.0969999999999995%2021.878999999999998%22%20width%3D%226.0969999999999995pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g499F08A684580F4577B4142873182B8F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g499F08A684580F4577B4142873182B8F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.46%204.602%20C%205.46%205.343%204.7060003%205.7460003%203.9%205.7460003%20C%203.081%205.7460003%202.496%205.499%202.145%205.005%20C%201.8460001%204.576%201.69%204.186%201.69%203.835%20C%201.69%203.1460001%202.145%202.704%203.042%202.509%20C%203.4190001%202.444%203.7050002%202.3530002%203.926%202.249%20C%204.199%202.132%204.329%201.911%204.329%201.599%20C%204.329%201.365%204.225%201.105%204.004%200.806%20C%203.7310002%200.42900002%203.25%200.234%202.561%200.234%20C%201.8590001%200.234%201.404%200.42900002%201.196%200.806%20C%201.612%200.79300004%201.963%201.131%201.963%201.547%20C%201.963%201.872%201.794%202.0410001%201.4430001%202.0410001%20C%200.975%202.0410001%200.676%201.612%200.676%201.144%20C%200.676%200.286%201.612%20-0.143%202.548%20-0.143%20C%203.523%20-0.143%204.225%200.143%204.6410003%200.72800004%20C%204.992%201.209%205.1610003%201.638%205.1610003%202.028%20C%205.1610003%202.5870001%204.888%203.003%204.355%203.276%20C%203.9520001%203.4190001%203.64%203.51%203.4450002%203.549%20C%202.99%203.6660001%202.522%203.7050002%202.522%204.264%20C%202.522%204.953%203.1720002%205.369%203.9%205.369%20C%204.446%205.369%204.797%205.2000003%204.966%204.875%20C%204.6800003%204.823%204.381%204.576%204.381%204.251%20C%204.381%203.9780002%204.524%203.835%204.823%203.835%20C%205.2260003%203.835%205.46%204.199%205.46%204.602%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5542727272727273em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, the grade &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.525999999999999%2021.878999999999998%22%20width%3D%226.525999999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9E2AD06FF54CF56D71BB33B9D0AE859D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9E2AD06FF54CF56D71BB33B9D0AE859D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%200.19500001%20-1.8330001%20C%200.19500001%20-2.392%200.78000003%20-2.665%201.95%20-2.665%20C%202.561%20-2.665%203.1330001%20-2.509%203.64%20-2.21%20C%204.212%20-1.872%204.563%20-1.417%204.7060003%20-0.85800004%20L%206.123%204.849%20C%206.149%204.979%206.162%205.057%206.162%205.096%20C%206.162%205.356%206.019%205.486%205.7460003%205.486%20C%205.46%205.486%205.278%205.33%205.1870003%205.031%20C%204.901%205.512%204.511%205.7460003%204.03%205.7460003%20C%203.198%205.7460003%202.457%205.33%201.82%204.498%20C%201.235%203.7180002%200.936%202.8990002%200.936%202.0540001%20C%200.936%200.92300004%201.599%20-0.039%202.691%20-0.039%20C%203.198%20-0.039%203.6660001%200.18200001%204.0950003%200.611%20L%203.7050002%20-0.92300004%20C%203.328%20-1.82%202.743%20-2.275%201.924%20-2.275%20C%201.5860001%20-2.275%201.3000001%20-2.249%201.066%20-2.197%20C%201.339%20-2.0540001%201.469%20-1.8330001%201.469%20-1.534%20C%201.469%20-1.209%201.2870001%20-1.04%200.936%20-1.04%20C%200.52%20-1.04%200.19500001%20-1.417%200.19500001%20-1.8330001%20Z%20M%204.6280003%205.096%20C%204.888%204.823%205.018%204.563%205.018%204.303%20C%205.018%204.29%205.005%204.225%204.979%204.1340003%20L%204.368%201.677%20C%204.29%201.378%204.0690002%201.066%203.7180002%200.78000003%20C%203.367%200.49400002%203.029%200.351%202.73%200.351%20C%202.21%200.351%201.95%200.72800004%201.95%201.482%20C%201.95%202.197%202.392%203.783%202.652%204.251%20C%203.055%204.992%203.51%205.356%204.043%205.356%20C%204.277%205.356%204.472%205.2650003%204.6280003%205.096%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5932727272727272em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; for letter &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%204.484999999999999%2021.878999999999998%22%20width%3D%224.484999999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gBE3DA9ADBFA5A0562B5A912A74131728%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gBE3DA9ADBFA5A0562B5A912A74131728%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.6920002%208.073%20C%203.6920002%208.424%203.523%208.593%203.1720002%208.593%20C%202.808%208.593%202.444%208.229%202.444%207.8650002%20C%202.444%207.514%202.6260002%207.3450003%202.977%207.3450003%20C%203.341%207.3450003%203.6920002%207.709%203.6920002%208.073%20Z%20M%203.367%201.794%20C%203.081%200.767%202.665%200.24700001%202.132%200.24700001%20C%201.963%200.24700001%201.872%200.36400002%201.872%200.611%20C%201.872%200.832%202.249%201.95%203.016%203.9780002%20C%203.1200001%204.277%203.1720002%204.511%203.1720002%204.6800003%20C%203.1720002%205.317%202.73%205.7850003%202.093%205.7850003%20C%201.534%205.7850003%201.092%205.46%200.767%204.797%20C%200.507%204.264%200.377%203.913%200.377%203.744%20C%200.377%203.627%200.442%203.575%200.58500004%203.575%20C%200.754%203.575%200.78000003%203.653%200.832%203.835%20C%201.131%204.875%201.534%205.395%202.0540001%205.395%20C%202.223%205.395%202.3140001%205.278%202.3140001%205.031%20C%202.3140001%204.849%202.275%204.6410003%202.184%204.394%20C%201.885%203.575%201.5730001%202.704%201.3130001%202.015%20C%201.118%201.495%201.014%201.144%201.014%200.962%20C%201.014%200.32500002%201.482%20-0.143%202.106%20-0.143%20C%202.665%20-0.143%203.107%200.18200001%203.4320002%200.832%20C%203.6790001%201.339%203.809%201.69%203.809%201.885%20C%203.809%202.002%203.744%202.0670002%203.601%202.0670002%20C%203.562%202.0670002%203.367%201.95%203.367%201.794%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.40772727272727266em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;
of a guess is defined as follows:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;If &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2041.55002222222223%2021.878999999999998%22%20width%3D%2241.55002222222223pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF5A736AF78F00E66632FD1D047F362F0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.308%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g57ECFA2274B7656477185E6A0F04ED0B%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2817.323511111111113%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g537FBDF575D6B4DBC59EE2318104781F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2831.048622222222225%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g499F08A684580F4577B4142873182B8F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2837.14562222222223%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g57ECFA2274B7656477185E6A0F04ED0B%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF5A736AF78F00E66632FD1D047F362F0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.67%205.083%20C%207.67%204.966%207.735%204.836%207.8780003%204.7060003%20C%208.177%204.42%208.333%204.0690002%208.333%203.653%20C%208.333%203.4320002%208.255%203.081%208.099%202.5740001%20C%207.618%201.014%207.007%200.234%206.2660003%200.234%20C%205.655%200.234%205.356%200.58500004%205.356%201.3000001%20C%205.356%201.547%205.408%201.8460001%205.499%202.223%20C%205.7330003%203.1590002%205.98%204.0820003%206.201%205.031%20C%206.227%205.122%206.2400002%205.1740003%206.2400002%205.2130003%20C%206.2400002%205.473%206.097%205.603%205.8110003%205.603%20C%205.551%205.603%205.382%205.473%205.291%205.2130003%20L%204.771%203.1850002%20C%204.576%202.431%204.433%202.171%204.433%201.495%20C%204.433%201.391%204.433%201.3130001%204.446%201.274%20C%204.1470003%200.58500004%203.77%200.234%203.315%200.234%20C%202.665%200.234%202.3400002%200.611%202.3400002%201.352%20C%202.3400002%201.8330001%202.561%202.652%203.003%203.809%20C%203.1460001%204.199%203.224%204.472%203.224%204.6410003%20C%203.224%205.278%202.756%205.7460003%202.119%205.7460003%20C%201.534%205.7460003%201.092%205.421%200.767%204.771%20C%200.507%204.264%200.377%203.913%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.754%203.549%200.78000003%203.627%200.832%203.809%20C%201.144%204.849%201.5600001%205.369%202.08%205.369%20C%202.262%205.369%202.3530002%205.2390003%202.3530002%204.992%20C%202.3530002%204.797%202.275%204.511%202.132%204.1210003%20C%201.651%202.8600001%201.404%202.002%201.404%201.521%20C%201.404%200.416%202.145%20-0.143%203.276%20-0.143%20C%203.822%20-0.143%204.264%200.13%204.6150002%200.689%20C%204.875%200.13%205.408%20-0.143%206.227%20-0.143%20C%207.033%20-0.143%207.67%200.39000002%208.125%201.4560001%20C%208.424%202.132%208.983%203.926%208.983%204.797%20C%208.983%204.992%208.97%205.122%208.957%205.1870003%20C%208.905%205.434%208.658%205.7460003%208.372%205.7460003%20C%208.034%205.7460003%207.67%205.421%207.67%205.083%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g57ECFA2274B7656477185E6A0F04ED0B%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.9575002%205.6511%20C%202.9575002%205.8695%202.7846%206.0333004%202.5662%206.0333004%20C%202.2932%206.0333004%202.0293%205.7785%202.0293%205.5055003%20C%202.0293%205.2871003%202.2022002%205.1233%202.4206002%205.1233%20C%202.6936002%205.1233%202.9575002%205.3781004%202.9575002%205.6511%20Z%20M%201.7472%204.0404%20C%201.3195001%204.0404%200.98280007%203.8220003%200.7371%203.3852%20C%200.5278%203.0212002%200.4277%202.7664%200.4277%202.6208%20C%200.4277%202.5207002%200.49140003%202.4752002%200.6097%202.4752002%20C%200.7098%202.4752002%200.7735%202.5298002%200.80990005%202.6390002%20C%201.0192001%203.3579001%201.3195001%203.7128003%201.7199%203.7128003%20C%201.8473%203.7128003%201.9110001%203.6218002%201.9110001%203.4307%20C%201.9110001%203.3124%201.82%203.0212002%201.638%202.548%20L%201.0738001%201.1011001%20C%201.0192001%200.95550007%200.9919%200.8281%200.9919%200.7098%20C%200.9919%200.23660001%201.4014001%20-0.091000006%201.8746%20-0.091000006%20C%202.3023%20-0.091000006%202.6299002%200.12740001%202.8756%200.5733%20C%203.0849001%200.9373%203.1850002%201.1830001%203.1850002%201.3195001%20C%203.1850002%201.4196%203.1213002%201.4742%203.003%201.4742%20C%202.9484%201.4651%202.8847%201.4196%202.821%201.3286%20C%202.8119001%201.3195001%202.8028002%201.3013%202.8028002%201.2922001%20C%202.5935001%200.59150004%202.2932%200.23660001%201.9019%200.23660001%20C%201.7745001%200.23660001%201.7108%200.3276%201.7108%200.50960004%20C%201.7108%200.64610004%201.7563001%200.83720005%201.8564001%201.0738001%20L%202.5753002%202.9393%20C%202.6117%203.0394%202.6299002%203.1395001%202.6299002%203.2396002%20C%202.6299002%203.7128003%202.2204%204.0404%201.7472%204.0404%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g537FBDF575D6B4DBC59EE2318104781F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%204.771%20L%201.04%204.771%20C%200.832%204.771%200.72800004%204.6670003%200.72800004%204.472%20C%200.72800004%204.277%200.832%204.173%201.04%204.173%20L%209.074%204.173%20C%209.282001%204.173%209.386001%204.277%209.386001%204.472%20C%209.386001%204.6280003%209.243%204.771%209.074%204.771%20Z%20M%209.074%202.3270001%20L%201.04%202.3270001%20C%200.832%202.3270001%200.72800004%202.223%200.72800004%202.028%20C%200.72800004%201.8330001%200.832%201.7290001%201.04%201.7290001%20L%209.074%201.7290001%20C%209.282001%201.7290001%209.386001%201.8330001%209.386001%202.028%20C%209.386001%202.197%209.243%202.3270001%209.074%202.3270001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g499F08A684580F4577B4142873182B8F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.46%204.602%20C%205.46%205.343%204.7060003%205.7460003%203.9%205.7460003%20C%203.081%205.7460003%202.496%205.499%202.145%205.005%20C%201.8460001%204.576%201.69%204.186%201.69%203.835%20C%201.69%203.1460001%202.145%202.704%203.042%202.509%20C%203.4190001%202.444%203.7050002%202.3530002%203.926%202.249%20C%204.199%202.132%204.329%201.911%204.329%201.599%20C%204.329%201.365%204.225%201.105%204.004%200.806%20C%203.7310002%200.42900002%203.25%200.234%202.561%200.234%20C%201.8590001%200.234%201.404%200.42900002%201.196%200.806%20C%201.612%200.79300004%201.963%201.131%201.963%201.547%20C%201.963%201.872%201.794%202.0410001%201.4430001%202.0410001%20C%200.975%202.0410001%200.676%201.612%200.676%201.144%20C%200.676%200.286%201.612%20-0.143%202.548%20-0.143%20C%203.523%20-0.143%204.225%200.143%204.6410003%200.72800004%20C%204.992%201.209%205.1610003%201.638%205.1610003%202.028%20C%205.1610003%202.5870001%204.888%203.003%204.355%203.276%20C%203.9520001%203.4190001%203.64%203.51%203.4450002%203.549%20C%202.99%203.6660001%202.522%203.7050002%202.522%204.264%20C%202.522%204.953%203.1720002%205.369%203.9%205.369%20C%204.446%205.369%204.797%205.2000003%204.966%204.875%20C%204.6800003%204.823%204.381%204.576%204.381%204.251%20C%204.381%203.9780002%204.524%203.835%204.823%203.835%20C%205.2260003%203.835%205.46%204.199%205.46%204.602%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.7772747474747486em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2010.6054%2021.878999999999998%22%20width%3D%2210.6054pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9E2AD06FF54CF56D71BB33B9D0AE859D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.201%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g57ECFA2274B7656477185E6A0F04ED0B%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9E2AD06FF54CF56D71BB33B9D0AE859D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%200.19500001%20-1.8330001%20C%200.19500001%20-2.392%200.78000003%20-2.665%201.95%20-2.665%20C%202.561%20-2.665%203.1330001%20-2.509%203.64%20-2.21%20C%204.212%20-1.872%204.563%20-1.417%204.7060003%20-0.85800004%20L%206.123%204.849%20C%206.149%204.979%206.162%205.057%206.162%205.096%20C%206.162%205.356%206.019%205.486%205.7460003%205.486%20C%205.46%205.486%205.278%205.33%205.1870003%205.031%20C%204.901%205.512%204.511%205.7460003%204.03%205.7460003%20C%203.198%205.7460003%202.457%205.33%201.82%204.498%20C%201.235%203.7180002%200.936%202.8990002%200.936%202.0540001%20C%200.936%200.92300004%201.599%20-0.039%202.691%20-0.039%20C%203.198%20-0.039%203.6660001%200.18200001%204.0950003%200.611%20L%203.7050002%20-0.92300004%20C%203.328%20-1.82%202.743%20-2.275%201.924%20-2.275%20C%201.5860001%20-2.275%201.3000001%20-2.249%201.066%20-2.197%20C%201.339%20-2.0540001%201.469%20-1.8330001%201.469%20-1.534%20C%201.469%20-1.209%201.2870001%20-1.04%200.936%20-1.04%20C%200.52%20-1.04%200.19500001%20-1.417%200.19500001%20-1.8330001%20Z%20M%204.6280003%205.096%20C%204.888%204.823%205.018%204.563%205.018%204.303%20C%205.018%204.29%205.005%204.225%204.979%204.1340003%20L%204.368%201.677%20C%204.29%201.378%204.0690002%201.066%203.7180002%200.78000003%20C%203.367%200.49400002%203.029%200.351%202.73%200.351%20C%202.21%200.351%201.95%200.72800004%201.95%201.482%20C%201.95%202.197%202.392%203.783%202.652%204.251%20C%203.055%204.992%203.51%205.356%204.043%205.356%20C%204.277%205.356%204.472%205.2650003%204.6280003%205.096%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g57ECFA2274B7656477185E6A0F04ED0B%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.9575002%205.6511%20C%202.9575002%205.8695%202.7846%206.0333004%202.5662%206.0333004%20C%202.2932%206.0333004%202.0293%205.7785%202.0293%205.5055003%20C%202.0293%205.2871003%202.2022002%205.1233%202.4206002%205.1233%20C%202.6936002%205.1233%202.9575002%205.3781004%202.9575002%205.6511%20Z%20M%201.7472%204.0404%20C%201.3195001%204.0404%200.98280007%203.8220003%200.7371%203.3852%20C%200.5278%203.0212002%200.4277%202.7664%200.4277%202.6208%20C%200.4277%202.5207002%200.49140003%202.4752002%200.6097%202.4752002%20C%200.7098%202.4752002%200.7735%202.5298002%200.80990005%202.6390002%20C%201.0192001%203.3579001%201.3195001%203.7128003%201.7199%203.7128003%20C%201.8473%203.7128003%201.9110001%203.6218002%201.9110001%203.4307%20C%201.9110001%203.3124%201.82%203.0212002%201.638%202.548%20L%201.0738001%201.1011001%20C%201.0192001%200.95550007%200.9919%200.8281%200.9919%200.7098%20C%200.9919%200.23660001%201.4014001%20-0.091000006%201.8746%20-0.091000006%20C%202.3023%20-0.091000006%202.6299002%200.12740001%202.8756%200.5733%20C%203.0849001%200.9373%203.1850002%201.1830001%203.1850002%201.3195001%20C%203.1850002%201.4196%203.1213002%201.4742%203.003%201.4742%20C%202.9484%201.4651%202.8847%201.4196%202.821%201.3286%20C%202.8119001%201.3195001%202.8028002%201.3013%202.8028002%201.2922001%20C%202.5935001%200.59150004%202.2932%200.23660001%201.9019%200.23660001%20C%201.7745001%200.23660001%201.7108%200.3276%201.7108%200.50960004%20C%201.7108%200.64610004%201.7563001%200.83720005%201.8564001%201.0738001%20L%202.5753002%202.9393%20C%202.6117%203.0394%202.6299002%203.1395001%202.6299002%203.2396002%20C%202.6299002%203.7128003%202.2204%204.0404%201.7472%204.0404%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.9641272727272727em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; is green.&lt;&#x2F;li&gt;
&lt;li&gt;If &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2041.55002222222223%2021.878999999999998%22%20width%3D%2241.55002222222223pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF5A736AF78F00E66632FD1D047F362F0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.308%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g57ECFA2274B7656477185E6A0F04ED0B%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2817.323511111111113%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gBAF84F82FF13BF094AE85583C2FAC9AF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2831.048622222222225%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g499F08A684580F4577B4142873182B8F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2837.14562222222223%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g57ECFA2274B7656477185E6A0F04ED0B%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF5A736AF78F00E66632FD1D047F362F0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.67%205.083%20C%207.67%204.966%207.735%204.836%207.8780003%204.7060003%20C%208.177%204.42%208.333%204.0690002%208.333%203.653%20C%208.333%203.4320002%208.255%203.081%208.099%202.5740001%20C%207.618%201.014%207.007%200.234%206.2660003%200.234%20C%205.655%200.234%205.356%200.58500004%205.356%201.3000001%20C%205.356%201.547%205.408%201.8460001%205.499%202.223%20C%205.7330003%203.1590002%205.98%204.0820003%206.201%205.031%20C%206.227%205.122%206.2400002%205.1740003%206.2400002%205.2130003%20C%206.2400002%205.473%206.097%205.603%205.8110003%205.603%20C%205.551%205.603%205.382%205.473%205.291%205.2130003%20L%204.771%203.1850002%20C%204.576%202.431%204.433%202.171%204.433%201.495%20C%204.433%201.391%204.433%201.3130001%204.446%201.274%20C%204.1470003%200.58500004%203.77%200.234%203.315%200.234%20C%202.665%200.234%202.3400002%200.611%202.3400002%201.352%20C%202.3400002%201.8330001%202.561%202.652%203.003%203.809%20C%203.1460001%204.199%203.224%204.472%203.224%204.6410003%20C%203.224%205.278%202.756%205.7460003%202.119%205.7460003%20C%201.534%205.7460003%201.092%205.421%200.767%204.771%20C%200.507%204.264%200.377%203.913%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.754%203.549%200.78000003%203.627%200.832%203.809%20C%201.144%204.849%201.5600001%205.369%202.08%205.369%20C%202.262%205.369%202.3530002%205.2390003%202.3530002%204.992%20C%202.3530002%204.797%202.275%204.511%202.132%204.1210003%20C%201.651%202.8600001%201.404%202.002%201.404%201.521%20C%201.404%200.416%202.145%20-0.143%203.276%20-0.143%20C%203.822%20-0.143%204.264%200.13%204.6150002%200.689%20C%204.875%200.13%205.408%20-0.143%206.227%20-0.143%20C%207.033%20-0.143%207.67%200.39000002%208.125%201.4560001%20C%208.424%202.132%208.983%203.926%208.983%204.797%20C%208.983%204.992%208.97%205.122%208.957%205.1870003%20C%208.905%205.434%208.658%205.7460003%208.372%205.7460003%20C%208.034%205.7460003%207.67%205.421%207.67%205.083%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g57ECFA2274B7656477185E6A0F04ED0B%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.9575002%205.6511%20C%202.9575002%205.8695%202.7846%206.0333004%202.5662%206.0333004%20C%202.2932%206.0333004%202.0293%205.7785%202.0293%205.5055003%20C%202.0293%205.2871003%202.2022002%205.1233%202.4206002%205.1233%20C%202.6936002%205.1233%202.9575002%205.3781004%202.9575002%205.6511%20Z%20M%201.7472%204.0404%20C%201.3195001%204.0404%200.98280007%203.8220003%200.7371%203.3852%20C%200.5278%203.0212002%200.4277%202.7664%200.4277%202.6208%20C%200.4277%202.5207002%200.49140003%202.4752002%200.6097%202.4752002%20C%200.7098%202.4752002%200.7735%202.5298002%200.80990005%202.6390002%20C%201.0192001%203.3579001%201.3195001%203.7128003%201.7199%203.7128003%20C%201.8473%203.7128003%201.9110001%203.6218002%201.9110001%203.4307%20C%201.9110001%203.3124%201.82%203.0212002%201.638%202.548%20L%201.0738001%201.1011001%20C%201.0192001%200.95550007%200.9919%200.8281%200.9919%200.7098%20C%200.9919%200.23660001%201.4014001%20-0.091000006%201.8746%20-0.091000006%20C%202.3023%20-0.091000006%202.6299002%200.12740001%202.8756%200.5733%20C%203.0849001%200.9373%203.1850002%201.1830001%203.1850002%201.3195001%20C%203.1850002%201.4196%203.1213002%201.4742%203.003%201.4742%20C%202.9484%201.4651%202.8847%201.4196%202.821%201.3286%20C%202.8119001%201.3195001%202.8028002%201.3013%202.8028002%201.2922001%20C%202.5935001%200.59150004%202.2932%200.23660001%201.9019%200.23660001%20C%201.7745001%200.23660001%201.7108%200.3276%201.7108%200.50960004%20C%201.7108%200.64610004%201.7563001%200.83720005%201.8564001%201.0738001%20L%202.5753002%202.9393%20C%202.6117%203.0394%202.6299002%203.1395001%202.6299002%203.2396002%20C%202.6299002%203.7128003%202.2204%204.0404%201.7472%204.0404%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gBAF84F82FF13BF094AE85583C2FAC9AF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%202.3140001%20L%205.044%202.3140001%20L%205.7200003%204.186%20L%209.074%204.186%20C%209.282001%204.186%209.386001%204.29%209.386001%204.498%20C%209.386001%204.7060003%209.282001%204.81%209.074%204.81%20L%205.954%204.81%20L%207.488%209.074%20C%207.514%209.113%207.527%209.139%207.527%209.178%20C%207.527%209.386001%207.4230003%209.49%207.215%209.49%20C%207.046%209.49%206.955%209.425%206.9160004%209.282001%20L%205.291%204.81%20L%201.04%204.81%20C%200.832%204.81%200.72800004%204.7060003%200.72800004%204.498%20C%200.72800004%204.29%200.832%204.186%201.04%204.186%20L%205.07%204.186%20L%204.394%202.3140001%20L%201.04%202.3140001%20C%200.832%202.3140001%200.72800004%202.21%200.72800004%202.002%20C%200.72800004%201.794%200.832%201.69%201.04%201.69%20L%204.16%201.69%20L%202.6130002%20-2.5740001%20C%202.6000001%20-2.6000001%202.6000001%20-2.639%202.6000001%20-2.678%20C%202.6000001%20-2.8860002%202.704%20-2.99%202.9120002%20-2.99%20C%203.068%20-2.99%203.1590002%20-2.925%203.198%20-2.782%20L%204.823%201.69%20L%209.074%201.69%20C%209.282001%201.69%209.386001%201.794%209.386001%202.002%20C%209.386001%202.158%209.243%202.3140001%209.074%202.3140001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g499F08A684580F4577B4142873182B8F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.46%204.602%20C%205.46%205.343%204.7060003%205.7460003%203.9%205.7460003%20C%203.081%205.7460003%202.496%205.499%202.145%205.005%20C%201.8460001%204.576%201.69%204.186%201.69%203.835%20C%201.69%203.1460001%202.145%202.704%203.042%202.509%20C%203.4190001%202.444%203.7050002%202.3530002%203.926%202.249%20C%204.199%202.132%204.329%201.911%204.329%201.599%20C%204.329%201.365%204.225%201.105%204.004%200.806%20C%203.7310002%200.42900002%203.25%200.234%202.561%200.234%20C%201.8590001%200.234%201.404%200.42900002%201.196%200.806%20C%201.612%200.79300004%201.963%201.131%201.963%201.547%20C%201.963%201.872%201.794%202.0410001%201.4430001%202.0410001%20C%200.975%202.0410001%200.676%201.612%200.676%201.144%20C%200.676%200.286%201.612%20-0.143%202.548%20-0.143%20C%203.523%20-0.143%204.225%200.143%204.6410003%200.72800004%20C%204.992%201.209%205.1610003%201.638%205.1610003%202.028%20C%205.1610003%202.5870001%204.888%203.003%204.355%203.276%20C%203.9520001%203.4190001%203.64%203.51%203.4450002%203.549%20C%202.99%203.6660001%202.522%203.7050002%202.522%204.264%20C%202.522%204.953%203.1720002%205.369%203.9%205.369%20C%204.446%205.369%204.797%205.2000003%204.966%204.875%20C%204.6800003%204.823%204.381%204.576%204.381%204.251%20C%204.381%203.9780002%204.524%203.835%204.823%203.835%20C%205.2260003%203.835%205.46%204.199%205.46%204.602%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.7772747474747486em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; and there is another letter &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2042.17792222222222%2021.878999999999998%22%20width%3D%2242.17792222222222pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g499F08A684580F4577B4142873182B8F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.0969999999999995%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g373ADE973C69AFF7A8D032D115FC8595%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2814.740411111111111%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g537FBDF575D6B4DBC59EE2318104781F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2828.465522222222223%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF5A736AF78F00E66632FD1D047F362F0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2837.77352222222222%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g57ECFA2274B7656477185E6A0F04ED0B%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g499F08A684580F4577B4142873182B8F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.46%204.602%20C%205.46%205.343%204.7060003%205.7460003%203.9%205.7460003%20C%203.081%205.7460003%202.496%205.499%202.145%205.005%20C%201.8460001%204.576%201.69%204.186%201.69%203.835%20C%201.69%203.1460001%202.145%202.704%203.042%202.509%20C%203.4190001%202.444%203.7050002%202.3530002%203.926%202.249%20C%204.199%202.132%204.329%201.911%204.329%201.599%20C%204.329%201.365%204.225%201.105%204.004%200.806%20C%203.7310002%200.42900002%203.25%200.234%202.561%200.234%20C%201.8590001%200.234%201.404%200.42900002%201.196%200.806%20C%201.612%200.79300004%201.963%201.131%201.963%201.547%20C%201.963%201.872%201.794%202.0410001%201.4430001%202.0410001%20C%200.975%202.0410001%200.676%201.612%200.676%201.144%20C%200.676%200.286%201.612%20-0.143%202.548%20-0.143%20C%203.523%20-0.143%204.225%200.143%204.6410003%200.72800004%20C%204.992%201.209%205.1610003%201.638%205.1610003%202.028%20C%205.1610003%202.5870001%204.888%203.003%204.355%203.276%20C%203.9520001%203.4190001%203.64%203.51%203.4450002%203.549%20C%202.99%203.6660001%202.522%203.7050002%202.522%204.264%20C%202.522%204.953%203.1720002%205.369%203.9%205.369%20C%204.446%205.369%204.797%205.2000003%204.966%204.875%20C%204.6800003%204.823%204.381%204.576%204.381%204.251%20C%204.381%203.9780002%204.524%203.835%204.823%203.835%20C%205.2260003%203.835%205.46%204.199%205.46%204.602%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g373ADE973C69AFF7A8D032D115FC8595%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.9949002%205.6511%20C%203.9949002%205.8695%203.8220003%206.0333004%203.6036003%206.0333004%20C%203.3397002%206.0333004%203.0667002%205.7694%203.0667002%205.5055003%20C%203.0667002%205.2871003%203.2396002%205.1233%203.4580002%205.1233%20C%203.7310002%205.1233%203.9949002%205.3781004%203.9949002%205.6511%20Z%20M%202.6754%204.0313%20C%202.1658%204.0313%201.7199%203.6946%201.4833001%203.3761%20C%201.2103001%202.9848%201.0738001%202.73%201.0738001%202.6117%20C%201.0738001%202.5116%201.1375%202.4661002%201.2558%202.4661002%20C%201.3468001%202.4661002%201.4196%202.5298002%201.4742%202.6481001%20C%201.5743%202.8665001%201.6926%203.0576%201.8291001%203.2305002%20C%202.0930002%203.5490003%202.3660002%203.7037%202.6481001%203.7037%20C%202.821%203.7037%202.9120002%203.5672002%202.9120002%203.3033001%20C%202.9120002%203.1941001%202.9029002%203.1031%202.8847%203.0394%20L%202.0293%20-0.4095%20C%201.9019%20-0.92820007%201.4924%20-1.5288%200.91%20-1.5288%20C%200.8281%20-1.5288%200.75530005%20-1.5197%200.6825%20-1.5015%20C%200.8463%20-1.4014001%200.92820007%20-1.2467%200.92820007%20-1.0556%20C%200.92820007%20-0.80990005%200.8008%20-0.6825%200.546%20-0.6825%20C%200.23660001%20-0.6825%200%20-0.94640005%200%20-1.2558%20C%200%20-1.6744001%200.455%20-1.8564001%200.91910005%20-1.8564001%20C%201.1284001%20-1.8564001%201.3559%20-1.82%201.5925001%20-1.7381%20C%202.1567001%20-1.547%202.6663%20-1.0101%202.8119001%20-0.4004%20L%203.6218002%202.821%20C%203.6491%202.9393%203.6673002%203.0485%203.6673002%203.1486%20C%203.6673002%203.6764002%203.2032%204.0313%202.6754%204.0313%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g537FBDF575D6B4DBC59EE2318104781F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%204.771%20L%201.04%204.771%20C%200.832%204.771%200.72800004%204.6670003%200.72800004%204.472%20C%200.72800004%204.277%200.832%204.173%201.04%204.173%20L%209.074%204.173%20C%209.282001%204.173%209.386001%204.277%209.386001%204.472%20C%209.386001%204.6280003%209.243%204.771%209.074%204.771%20Z%20M%209.074%202.3270001%20L%201.04%202.3270001%20C%200.832%202.3270001%200.72800004%202.223%200.72800004%202.028%20C%200.72800004%201.8330001%200.832%201.7290001%201.04%201.7290001%20L%209.074%201.7290001%20C%209.282001%201.7290001%209.386001%201.8330001%209.386001%202.028%20C%209.386001%202.197%209.243%202.3270001%209.074%202.3270001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF5A736AF78F00E66632FD1D047F362F0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.67%205.083%20C%207.67%204.966%207.735%204.836%207.8780003%204.7060003%20C%208.177%204.42%208.333%204.0690002%208.333%203.653%20C%208.333%203.4320002%208.255%203.081%208.099%202.5740001%20C%207.618%201.014%207.007%200.234%206.2660003%200.234%20C%205.655%200.234%205.356%200.58500004%205.356%201.3000001%20C%205.356%201.547%205.408%201.8460001%205.499%202.223%20C%205.7330003%203.1590002%205.98%204.0820003%206.201%205.031%20C%206.227%205.122%206.2400002%205.1740003%206.2400002%205.2130003%20C%206.2400002%205.473%206.097%205.603%205.8110003%205.603%20C%205.551%205.603%205.382%205.473%205.291%205.2130003%20L%204.771%203.1850002%20C%204.576%202.431%204.433%202.171%204.433%201.495%20C%204.433%201.391%204.433%201.3130001%204.446%201.274%20C%204.1470003%200.58500004%203.77%200.234%203.315%200.234%20C%202.665%200.234%202.3400002%200.611%202.3400002%201.352%20C%202.3400002%201.8330001%202.561%202.652%203.003%203.809%20C%203.1460001%204.199%203.224%204.472%203.224%204.6410003%20C%203.224%205.278%202.756%205.7460003%202.119%205.7460003%20C%201.534%205.7460003%201.092%205.421%200.767%204.771%20C%200.507%204.264%200.377%203.913%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.754%203.549%200.78000003%203.627%200.832%203.809%20C%201.144%204.849%201.5600001%205.369%202.08%205.369%20C%202.262%205.369%202.3530002%205.2390003%202.3530002%204.992%20C%202.3530002%204.797%202.275%204.511%202.132%204.1210003%20C%201.651%202.8600001%201.404%202.002%201.404%201.521%20C%201.404%200.416%202.145%20-0.143%203.276%20-0.143%20C%203.822%20-0.143%204.264%200.13%204.6150002%200.689%20C%204.875%200.13%205.408%20-0.143%206.227%20-0.143%20C%207.033%20-0.143%207.67%200.39000002%208.125%201.4560001%20C%208.424%202.132%208.983%203.926%208.983%204.797%20C%208.983%204.992%208.97%205.122%208.957%205.1870003%20C%208.905%205.434%208.658%205.7460003%208.372%205.7460003%20C%208.034%205.7460003%207.67%205.421%207.67%205.083%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g57ECFA2274B7656477185E6A0F04ED0B%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.9575002%205.6511%20C%202.9575002%205.8695%202.7846%206.0333004%202.5662%206.0333004%20C%202.2932%206.0333004%202.0293%205.7785%202.0293%205.5055003%20C%202.0293%205.2871003%202.2022002%205.1233%202.4206002%205.1233%20C%202.6936002%205.1233%202.9575002%205.3781004%202.9575002%205.6511%20Z%20M%201.7472%204.0404%20C%201.3195001%204.0404%200.98280007%203.8220003%200.7371%203.3852%20C%200.5278%203.0212002%200.4277%202.7664%200.4277%202.6208%20C%200.4277%202.5207002%200.49140003%202.4752002%200.6097%202.4752002%20C%200.7098%202.4752002%200.7735%202.5298002%200.80990005%202.6390002%20C%201.0192001%203.3579001%201.3195001%203.7128003%201.7199%203.7128003%20C%201.8473%203.7128003%201.9110001%203.6218002%201.9110001%203.4307%20C%201.9110001%203.3124%201.82%203.0212002%201.638%202.548%20L%201.0738001%201.1011001%20C%201.0192001%200.95550007%200.9919%200.8281%200.9919%200.7098%20C%200.9919%200.23660001%201.4014001%20-0.091000006%201.8746%20-0.091000006%20C%202.3023%20-0.091000006%202.6299002%200.12740001%202.8756%200.5733%20C%203.0849001%200.9373%203.1850002%201.1830001%203.1850002%201.3195001%20C%203.1850002%201.4196%203.1213002%201.4742%203.003%201.4742%20C%202.9484%201.4651%202.8847%201.4196%202.821%201.3286%20C%202.8119001%201.3195001%202.8028002%201.3013%202.8028002%201.2922001%20C%202.5935001%200.59150004%202.2932%200.23660001%201.9019%200.23660001%20C%201.7745001%200.23660001%201.7108%200.3276%201.7108%200.50960004%20C%201.7108%200.64610004%201.7563001%200.83720005%201.8564001%201.0738001%20L%202.5753002%202.9393%20C%202.6117%203.0394%202.6299002%203.1395001%202.6299002%203.2396002%20C%202.6299002%203.7128003%202.2204%204.0404%201.7472%204.0404%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.8343565656565657em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;,
&lt;em&gt;and&lt;&#x2F;em&gt; &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2011.1293%2021.878999999999998%22%20width%3D%2211.1293pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g499F08A684580F4577B4142873182B8F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.0969999999999995%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g373ADE973C69AFF7A8D032D115FC8595%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g499F08A684580F4577B4142873182B8F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.46%204.602%20C%205.46%205.343%204.7060003%205.7460003%203.9%205.7460003%20C%203.081%205.7460003%202.496%205.499%202.145%205.005%20C%201.8460001%204.576%201.69%204.186%201.69%203.835%20C%201.69%203.1460001%202.145%202.704%203.042%202.509%20C%203.4190001%202.444%203.7050002%202.3530002%203.926%202.249%20C%204.199%202.132%204.329%201.911%204.329%201.599%20C%204.329%201.365%204.225%201.105%204.004%200.806%20C%203.7310002%200.42900002%203.25%200.234%202.561%200.234%20C%201.8590001%200.234%201.404%200.42900002%201.196%200.806%20C%201.612%200.79300004%201.963%201.131%201.963%201.547%20C%201.963%201.872%201.794%202.0410001%201.4430001%202.0410001%20C%200.975%202.0410001%200.676%201.612%200.676%201.144%20C%200.676%200.286%201.612%20-0.143%202.548%20-0.143%20C%203.523%20-0.143%204.225%200.143%204.6410003%200.72800004%20C%204.992%201.209%205.1610003%201.638%205.1610003%202.028%20C%205.1610003%202.5870001%204.888%203.003%204.355%203.276%20C%203.9520001%203.4190001%203.64%203.51%203.4450002%203.549%20C%202.99%203.6660001%202.522%203.7050002%202.522%204.264%20C%202.522%204.953%203.1720002%205.369%203.9%205.369%20C%204.446%205.369%204.797%205.2000003%204.966%204.875%20C%204.6800003%204.823%204.381%204.576%204.381%204.251%20C%204.381%203.9780002%204.524%203.835%204.823%203.835%20C%205.2260003%203.835%205.46%204.199%205.46%204.602%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g373ADE973C69AFF7A8D032D115FC8595%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.9949002%205.6511%20C%203.9949002%205.8695%203.8220003%206.0333004%203.6036003%206.0333004%20C%203.3397002%206.0333004%203.0667002%205.7694%203.0667002%205.5055003%20C%203.0667002%205.2871003%203.2396002%205.1233%203.4580002%205.1233%20C%203.7310002%205.1233%203.9949002%205.3781004%203.9949002%205.6511%20Z%20M%202.6754%204.0313%20C%202.1658%204.0313%201.7199%203.6946%201.4833001%203.3761%20C%201.2103001%202.9848%201.0738001%202.73%201.0738001%202.6117%20C%201.0738001%202.5116%201.1375%202.4661002%201.2558%202.4661002%20C%201.3468001%202.4661002%201.4196%202.5298002%201.4742%202.6481001%20C%201.5743%202.8665001%201.6926%203.0576%201.8291001%203.2305002%20C%202.0930002%203.5490003%202.3660002%203.7037%202.6481001%203.7037%20C%202.821%203.7037%202.9120002%203.5672002%202.9120002%203.3033001%20C%202.9120002%203.1941001%202.9029002%203.1031%202.8847%203.0394%20L%202.0293%20-0.4095%20C%201.9019%20-0.92820007%201.4924%20-1.5288%200.91%20-1.5288%20C%200.8281%20-1.5288%200.75530005%20-1.5197%200.6825%20-1.5015%20C%200.8463%20-1.4014001%200.92820007%20-1.2467%200.92820007%20-1.0556%20C%200.92820007%20-0.80990005%200.8008%20-0.6825%200.546%20-0.6825%20C%200.23660001%20-0.6825%200%20-0.94640005%200%20-1.2558%20C%200%20-1.6744001%200.455%20-1.8564001%200.91910005%20-1.8564001%20C%201.1284001%20-1.8564001%201.3559%20-1.82%201.5925001%20-1.7381%20C%202.1567001%20-1.547%202.6663%20-1.0101%202.8119001%20-0.4004%20L%203.6218002%202.821%20C%203.6491%202.9393%203.6673002%203.0485%203.6673002%203.1486%20C%203.6673002%203.6764002%203.2032%204.0313%202.6754%204.0313%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.0117545454545456em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; has not matched with an earlier letter &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2020.792199999999994%2021.878999999999998%22%20width%3D%2220.792199999999994pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF5A736AF78F00E66632FD1D047F362F0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.308%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g25DCB8AAC3EF5151140B6552C8372967%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2816.3878%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g57ECFA2274B7656477185E6A0F04ED0B%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF5A736AF78F00E66632FD1D047F362F0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.67%205.083%20C%207.67%204.966%207.735%204.836%207.8780003%204.7060003%20C%208.177%204.42%208.333%204.0690002%208.333%203.653%20C%208.333%203.4320002%208.255%203.081%208.099%202.5740001%20C%207.618%201.014%207.007%200.234%206.2660003%200.234%20C%205.655%200.234%205.356%200.58500004%205.356%201.3000001%20C%205.356%201.547%205.408%201.8460001%205.499%202.223%20C%205.7330003%203.1590002%205.98%204.0820003%206.201%205.031%20C%206.227%205.122%206.2400002%205.1740003%206.2400002%205.2130003%20C%206.2400002%205.473%206.097%205.603%205.8110003%205.603%20C%205.551%205.603%205.382%205.473%205.291%205.2130003%20L%204.771%203.1850002%20C%204.576%202.431%204.433%202.171%204.433%201.495%20C%204.433%201.391%204.433%201.3130001%204.446%201.274%20C%204.1470003%200.58500004%203.77%200.234%203.315%200.234%20C%202.665%200.234%202.3400002%200.611%202.3400002%201.352%20C%202.3400002%201.8330001%202.561%202.652%203.003%203.809%20C%203.1460001%204.199%203.224%204.472%203.224%204.6410003%20C%203.224%205.278%202.756%205.7460003%202.119%205.7460003%20C%201.534%205.7460003%201.092%205.421%200.767%204.771%20C%200.507%204.264%200.377%203.913%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.754%203.549%200.78000003%203.627%200.832%203.809%20C%201.144%204.849%201.5600001%205.369%202.08%205.369%20C%202.262%205.369%202.3530002%205.2390003%202.3530002%204.992%20C%202.3530002%204.797%202.275%204.511%202.132%204.1210003%20C%201.651%202.8600001%201.404%202.002%201.404%201.521%20C%201.404%200.416%202.145%20-0.143%203.276%20-0.143%20C%203.822%20-0.143%204.264%200.13%204.6150002%200.689%20C%204.875%200.13%205.408%20-0.143%206.227%20-0.143%20C%207.033%20-0.143%207.67%200.39000002%208.125%201.4560001%20C%208.424%202.132%208.983%203.926%208.983%204.797%20C%208.983%204.992%208.97%205.122%208.957%205.1870003%20C%208.905%205.434%208.658%205.7460003%208.372%205.7460003%20C%208.034%205.7460003%207.67%205.421%207.67%205.083%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g25DCB8AAC3EF5151140B6552C8372967%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.0606003%20-0.4095%20C%206.2153%20-0.47320002%206.3791003%20-0.3549%206.3791003%20-0.20930001%20C%206.3791003%20-0.118300006%206.3336%20-0.0546%206.2517004%20-0.0182%20L%201.3923%202.275%20L%206.2517004%204.5682%20C%206.3336%204.6046%206.3791003%204.6683%206.3791003%204.7502003%20C%206.3791003%204.9049%206.3063%204.9777%206.1607003%204.9777%20C%206.1243005%204.9777%206.0879%204.9686003%206.0606003%204.9595003%20L%200.83720005%202.4843001%20C%200.7462%202.4388%200.70070004%202.3751001%200.70070004%202.275%20C%200.70070004%202.1749%200.7462%202.1112%200.83720005%202.0657%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g57ECFA2274B7656477185E6A0F04ED0B%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.9575002%205.6511%20C%202.9575002%205.8695%202.7846%206.0333004%202.5662%206.0333004%20C%202.2932%206.0333004%202.0293%205.7785%202.0293%205.5055003%20C%202.0293%205.2871003%202.2022002%205.1233%202.4206002%205.1233%20C%202.6936002%205.1233%202.9575002%205.3781004%202.9575002%205.6511%20Z%20M%201.7472%204.0404%20C%201.3195001%204.0404%200.98280007%203.8220003%200.7371%203.3852%20C%200.5278%203.0212002%200.4277%202.7664%200.4277%202.6208%20C%200.4277%202.5207002%200.49140003%202.4752002%200.6097%202.4752002%20C%200.7098%202.4752002%200.7735%202.5298002%200.80990005%202.6390002%20C%201.0192001%203.3579001%201.3195001%203.7128003%201.7199%203.7128003%20C%201.8473%203.7128003%201.9110001%203.6218002%201.9110001%203.4307%20C%201.9110001%203.3124%201.82%203.0212002%201.638%202.548%20L%201.0738001%201.1011001%20C%201.0192001%200.95550007%200.9919%200.8281%200.9919%200.7098%20C%200.9919%200.23660001%201.4014001%20-0.091000006%201.8746%20-0.091000006%20C%202.3023%20-0.091000006%202.6299002%200.12740001%202.8756%200.5733%20C%203.0849001%200.9373%203.1850002%201.1830001%203.1850002%201.3195001%20C%203.1850002%201.4196%203.1213002%201.4742%203.003%201.4742%20C%202.9484%201.4651%202.8847%201.4196%202.821%201.3286%20C%202.8119001%201.3195001%202.8028002%201.3013%202.8028002%201.2922001%20C%202.5935001%200.59150004%202.2932%200.23660001%201.9019%200.23660001%20C%201.7745001%200.23660001%201.7108%200.3276%201.7108%200.50960004%20C%201.7108%200.64610004%201.7563001%200.83720005%201.8564001%201.0738001%20L%202.5753002%202.9393%20C%202.6117%203.0394%202.6299002%203.1395001%202.6299002%203.2396002%20C%202.6299002%203.7128003%202.2204%204.0404%201.7472%204.0404%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.8901999999999994em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, then
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2010.6054%2021.878999999999998%22%20width%3D%2210.6054pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9E2AD06FF54CF56D71BB33B9D0AE859D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.201%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g57ECFA2274B7656477185E6A0F04ED0B%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9E2AD06FF54CF56D71BB33B9D0AE859D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%200.19500001%20-1.8330001%20C%200.19500001%20-2.392%200.78000003%20-2.665%201.95%20-2.665%20C%202.561%20-2.665%203.1330001%20-2.509%203.64%20-2.21%20C%204.212%20-1.872%204.563%20-1.417%204.7060003%20-0.85800004%20L%206.123%204.849%20C%206.149%204.979%206.162%205.057%206.162%205.096%20C%206.162%205.356%206.019%205.486%205.7460003%205.486%20C%205.46%205.486%205.278%205.33%205.1870003%205.031%20C%204.901%205.512%204.511%205.7460003%204.03%205.7460003%20C%203.198%205.7460003%202.457%205.33%201.82%204.498%20C%201.235%203.7180002%200.936%202.8990002%200.936%202.0540001%20C%200.936%200.92300004%201.599%20-0.039%202.691%20-0.039%20C%203.198%20-0.039%203.6660001%200.18200001%204.0950003%200.611%20L%203.7050002%20-0.92300004%20C%203.328%20-1.82%202.743%20-2.275%201.924%20-2.275%20C%201.5860001%20-2.275%201.3000001%20-2.249%201.066%20-2.197%20C%201.339%20-2.0540001%201.469%20-1.8330001%201.469%20-1.534%20C%201.469%20-1.209%201.2870001%20-1.04%200.936%20-1.04%20C%200.52%20-1.04%200.19500001%20-1.417%200.19500001%20-1.8330001%20Z%20M%204.6280003%205.096%20C%204.888%204.823%205.018%204.563%205.018%204.303%20C%205.018%204.29%205.005%204.225%204.979%204.1340003%20L%204.368%201.677%20C%204.29%201.378%204.0690002%201.066%203.7180002%200.78000003%20C%203.367%200.49400002%203.029%200.351%202.73%200.351%20C%202.21%200.351%201.95%200.72800004%201.95%201.482%20C%201.95%202.197%202.392%203.783%202.652%204.251%20C%203.055%204.992%203.51%205.356%204.043%205.356%20C%204.277%205.356%204.472%205.2650003%204.6280003%205.096%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g57ECFA2274B7656477185E6A0F04ED0B%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.9575002%205.6511%20C%202.9575002%205.8695%202.7846%206.0333004%202.5662%206.0333004%20C%202.2932%206.0333004%202.0293%205.7785%202.0293%205.5055003%20C%202.0293%205.2871003%202.2022002%205.1233%202.4206002%205.1233%20C%202.6936002%205.1233%202.9575002%205.3781004%202.9575002%205.6511%20Z%20M%201.7472%204.0404%20C%201.3195001%204.0404%200.98280007%203.8220003%200.7371%203.3852%20C%200.5278%203.0212002%200.4277%202.7664%200.4277%202.6208%20C%200.4277%202.5207002%200.49140003%202.4752002%200.6097%202.4752002%20C%200.7098%202.4752002%200.7735%202.5298002%200.80990005%202.6390002%20C%201.0192001%203.3579001%201.3195001%203.7128003%201.7199%203.7128003%20C%201.8473%203.7128003%201.9110001%203.6218002%201.9110001%203.4307%20C%201.9110001%203.3124%201.82%203.0212002%201.638%202.548%20L%201.0738001%201.1011001%20C%201.0192001%200.95550007%200.9919%200.8281%200.9919%200.7098%20C%200.9919%200.23660001%201.4014001%20-0.091000006%201.8746%20-0.091000006%20C%202.3023%20-0.091000006%202.6299002%200.12740001%202.8756%200.5733%20C%203.0849001%200.9373%203.1850002%201.1830001%203.1850002%201.3195001%20C%203.1850002%201.4196%203.1213002%201.4742%203.003%201.4742%20C%202.9484%201.4651%202.8847%201.4196%202.821%201.3286%20C%202.8119001%201.3195001%202.8028002%201.3013%202.8028002%201.2922001%20C%202.5935001%200.59150004%202.2932%200.23660001%201.9019%200.23660001%20C%201.7745001%200.23660001%201.7108%200.3276%201.7108%200.50960004%20C%201.7108%200.64610004%201.7563001%200.83720005%201.8564001%201.0738001%20L%202.5753002%202.9393%20C%202.6117%203.0394%202.6299002%203.1395001%202.6299002%203.2396002%20C%202.6299002%203.7128003%202.2204%204.0404%201.7472%204.0404%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.9641272727272727em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; is yellow.&lt;&#x2F;li&gt;
&lt;li&gt;Otherwise, &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2010.6054%2021.878999999999998%22%20width%3D%2210.6054pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9E2AD06FF54CF56D71BB33B9D0AE859D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.201%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g57ECFA2274B7656477185E6A0F04ED0B%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9E2AD06FF54CF56D71BB33B9D0AE859D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%200.19500001%20-1.8330001%20C%200.19500001%20-2.392%200.78000003%20-2.665%201.95%20-2.665%20C%202.561%20-2.665%203.1330001%20-2.509%203.64%20-2.21%20C%204.212%20-1.872%204.563%20-1.417%204.7060003%20-0.85800004%20L%206.123%204.849%20C%206.149%204.979%206.162%205.057%206.162%205.096%20C%206.162%205.356%206.019%205.486%205.7460003%205.486%20C%205.46%205.486%205.278%205.33%205.1870003%205.031%20C%204.901%205.512%204.511%205.7460003%204.03%205.7460003%20C%203.198%205.7460003%202.457%205.33%201.82%204.498%20C%201.235%203.7180002%200.936%202.8990002%200.936%202.0540001%20C%200.936%200.92300004%201.599%20-0.039%202.691%20-0.039%20C%203.198%20-0.039%203.6660001%200.18200001%204.0950003%200.611%20L%203.7050002%20-0.92300004%20C%203.328%20-1.82%202.743%20-2.275%201.924%20-2.275%20C%201.5860001%20-2.275%201.3000001%20-2.249%201.066%20-2.197%20C%201.339%20-2.0540001%201.469%20-1.8330001%201.469%20-1.534%20C%201.469%20-1.209%201.2870001%20-1.04%200.936%20-1.04%20C%200.52%20-1.04%200.19500001%20-1.417%200.19500001%20-1.8330001%20Z%20M%204.6280003%205.096%20C%204.888%204.823%205.018%204.563%205.018%204.303%20C%205.018%204.29%205.005%204.225%204.979%204.1340003%20L%204.368%201.677%20C%204.29%201.378%204.0690002%201.066%203.7180002%200.78000003%20C%203.367%200.49400002%203.029%200.351%202.73%200.351%20C%202.21%200.351%201.95%200.72800004%201.95%201.482%20C%201.95%202.197%202.392%203.783%202.652%204.251%20C%203.055%204.992%203.51%205.356%204.043%205.356%20C%204.277%205.356%204.472%205.2650003%204.6280003%205.096%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g57ECFA2274B7656477185E6A0F04ED0B%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.9575002%205.6511%20C%202.9575002%205.8695%202.7846%206.0333004%202.5662%206.0333004%20C%202.2932%206.0333004%202.0293%205.7785%202.0293%205.5055003%20C%202.0293%205.2871003%202.2022002%205.1233%202.4206002%205.1233%20C%202.6936002%205.1233%202.9575002%205.3781004%202.9575002%205.6511%20Z%20M%201.7472%204.0404%20C%201.3195001%204.0404%200.98280007%203.8220003%200.7371%203.3852%20C%200.5278%203.0212002%200.4277%202.7664%200.4277%202.6208%20C%200.4277%202.5207002%200.49140003%202.4752002%200.6097%202.4752002%20C%200.7098%202.4752002%200.7735%202.5298002%200.80990005%202.6390002%20C%201.0192001%203.3579001%201.3195001%203.7128003%201.7199%203.7128003%20C%201.8473%203.7128003%201.9110001%203.6218002%201.9110001%203.4307%20C%201.9110001%203.3124%201.82%203.0212002%201.638%202.548%20L%201.0738001%201.1011001%20C%201.0192001%200.95550007%200.9919%200.8281%200.9919%200.7098%20C%200.9919%200.23660001%201.4014001%20-0.091000006%201.8746%20-0.091000006%20C%202.3023%20-0.091000006%202.6299002%200.12740001%202.8756%200.5733%20C%203.0849001%200.9373%203.1850002%201.1830001%203.1850002%201.3195001%20C%203.1850002%201.4196%203.1213002%201.4742%203.003%201.4742%20C%202.9484%201.4651%202.8847%201.4196%202.821%201.3286%20C%202.8119001%201.3195001%202.8028002%201.3013%202.8028002%201.2922001%20C%202.5935001%200.59150004%202.2932%200.23660001%201.9019%200.23660001%20C%201.7745001%200.23660001%201.7108%200.3276%201.7108%200.50960004%20C%201.7108%200.64610004%201.7563001%200.83720005%201.8564001%201.0738001%20L%202.5753002%202.9393%20C%202.6117%203.0394%202.6299002%203.1395001%202.6299002%203.2396002%20C%202.6299002%203.7128003%202.2204%204.0404%201.7472%204.0404%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.9641272727272727em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; is black.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The yellow cases are the trickiest part. Here’s an example: if we
guessed &lt;code&gt;roses&lt;&#x2F;code&gt; against the solution &lt;code&gt;horse&lt;&#x2F;code&gt;, we would find that the &lt;code&gt;h&lt;&#x2F;code&gt;
is black, since it appears nowhere in the solution. The &lt;code&gt;o&lt;&#x2F;code&gt; would be
green, since it perfectly matches up between the guess and the solution,
but &lt;code&gt;s&lt;&#x2F;code&gt; will be more complex. The first &lt;code&gt;s&lt;&#x2F;code&gt; in &lt;code&gt;roses&lt;&#x2F;code&gt; would be yellow,
since it matches with the fourth letter of &lt;code&gt;horse&lt;&#x2F;code&gt;, but the second would
be black, as there are no more &lt;code&gt;s&lt;&#x2F;code&gt; left for it to match in &lt;code&gt;horse&lt;&#x2F;code&gt; after
satisfying the first &lt;code&gt;s&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Lots of people like to go with an unconditional first two guesses - for
instance, no matter the puzzle, my brother always opens with &lt;code&gt;trace&lt;&#x2F;code&gt; and
&lt;code&gt;lions&lt;&#x2F;code&gt;. A natural question: given knowledge of the set of legal guesses
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2013.988%2021.878999999999998%22%20width%3D%2213.988pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g39839232D9B855C6E487282AC713D032%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g39839232D9B855C6E487282AC713D032%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2012.428%208.84%20C%2012.181001%208.84%2011.336%208.879%2011.089001%208.879%20C%2010.894%208.879%2010.79%208.775001%2010.79%208.58%20C%2010.79%208.45%2010.868%208.385%2011.024%208.372%20C%2011.505%208.359%2011.739%208.216001%2011.739%207.9300003%20C%2011.739%207.852%2011.687%207.722%2011.583%207.527%20L%208.177%201.625%20L%207.722%207.826%20C%207.67%208.294001%207.9820004%208.372%208.567%208.372%20C%208.84%208.372%208.97%208.476%208.97%208.684%20C%208.97%208.814%208.892%208.879%208.723001%208.879%20C%208.437%208.879%207.4360003%208.84%207.15%208.84%20C%206.9030004%208.84%206.045%208.879%205.7980003%208.879%20C%205.603%208.879%205.499%208.775001%205.499%208.567%20C%205.499%208.437%205.616%208.372%205.863%208.372%20C%206.2660003%208.372%206.474%208.281%206.487%208.099%20L%206.565%207.124%20L%203.3930001%201.625%20L%202.925%207.9690003%20C%202.8860002%208.294001%203.4320002%208.372%203.848%208.372%20C%204.0690002%208.372%204.173%208.476%204.173%208.684%20C%204.173%208.814%204.0950003%208.879%203.9390001%208.879%20C%203.653%208.879%202.639%208.84%202.3530002%208.84%20C%202.106%208.84%201.248%208.879%201.001%208.879%20C%200.806%208.879%200.71500003%208.775001%200.71500003%208.58%20C%200.71500003%208.437%200.845%208.372%201.092%208.372%20C%201.638%208.372%201.69%208.346%201.7160001%207.9560003%20L%202.301%200.091000006%20C%202.3140001%20-0.156%202.405%20-0.286%202.561%20-0.286%20C%202.73%20-0.26%202.795%20-0.221%202.8990002%20-0.026%20C%202.9120002%20-0.013%202.9120002%200%202.9120002%200.013%20L%206.617%206.422%20L%207.085%200.091000006%20C%207.098%20-0.156%207.189%20-0.286%207.3450003%20-0.286%20C%207.4750004%20-0.286%207.592%20-0.19500001%207.696%20-0.013%20L%2011.934%207.306%20C%2012.285%207.9430003%2012.532001%208.307%2013.325%208.372%20C%2013.559%208.398%2013.624001%208.463%2013.624001%208.684%20C%2013.624001%208.814%2013.559%208.879%2013.416%208.879%20C%2013.234%208.879%2012.610001%208.84%2012.428%208.84%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.2716363636363637em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; and the set of possible solutions &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2040.07322222222222%2021.878999999999998%22%20width%3D%2240.07322222222222pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g473A773CF9C84C71D45CCEACC9585112%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2812.360111111111111%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA92B4421839DEBCD116E3337D38137D1%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2826.08522222222222%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g39839232D9B855C6E487282AC713D032%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g473A773CF9C84C71D45CCEACC9585112%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.7290001%202.0410001%20C%201.7290001%202.3530002%201.768%202.6130002%201.8330001%202.821%20C%201.8330001%202.951%201.768%203.016%201.625%203.016%20C%201.5600001%203.016%201.508%202.99%201.482%202.964%20C%201.417%202.8990002%200.676%200.104%200.676%20-0.104%20C%200.676%20-0.221%200.741%20-0.286%200.871%20-0.286%20C%200.936%20-0.286%201.0270001%20-0.221%201.144%20-0.078%20L%201.7290001%200.611%20C%202.184%200.013%202.9120002%20-0.286%203.9%20-0.286%20C%204.758%20-0.286%205.512%200.065%206.188%200.754%20C%206.8640003%201.4430001%207.202%202.21%207.202%203.068%20C%207.202%203.6790001%206.994%204.199%206.565%204.6150002%20C%206.3700004%204.784%206.11%204.927%205.7850003%205.044%20C%205.486%205.109%205.2000003%205.1870003%204.914%205.2650003%20L%204.056%205.499%20C%203.627%205.616%203.302%206.097%203.302%206.617%20C%203.302%207.176%203.523%207.657%203.9780002%208.073%20C%204.433%208.489%204.94%208.6970005%205.499%208.6970005%20C%206.695%208.6970005%207.293%208.047%207.293%206.76%20C%207.293%206.526%207.241%206.2660003%207.241%206.045%20L%207.241%206.006%20C%207.28%205.915%207.3450003%205.863%207.4490004%205.863%20C%207.566%205.863%207.644%205.967%207.696%206.162%20L%208.385%208.983%20C%208.385%209.1%208.32%209.165%208.190001%209.165%20C%208.125%209.165%208.034%209.1%207.9170003%208.957%20L%207.3580003%208.281%20C%206.994%208.866%206.383%209.165%205.512%209.165%20C%204.6930003%209.165%203.9520001%208.853001%203.302%208.242001%20C%202.6260002%207.618%202.288%206.9030004%202.288%206.084%20C%202.288%205.1480002%202.8990002%204.407%203.6660001%204.199%20L%205.031%203.848%20C%205.7330003%203.653%206.175%203.4060001%206.175%202.535%20C%206.175%201.937%205.941%201.404%205.486%200.936%20C%205.031%200.468%204.511%200.221%203.926%200.221%20C%202.652%200.221%201.7290001%200.78000003%201.7290001%202.0410001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA92B4421839DEBCD116E3337D38137D1%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%208.6970005%201.131%20L%204.914%201.131%20C%204.017%201.131%203.276%201.4300001%202.652%202.0540001%20C%202.028%202.678%201.7160001%203.4320002%201.7160001%204.329%20C%201.7160001%205.2260003%202.028%205.98%202.652%206.604%20C%203.276%207.228%204.017%207.527%204.914%207.527%20L%208.6970005%207.527%20C%208.905%207.527%209.009%207.631%209.009%207.839%20C%209.009%208.047%208.905%208.151%208.6970005%208.151%20L%204.914%208.151%20C%203.848%208.151%202.951%207.787%202.21%207.046%20C%201.469%206.3050003%201.105%205.395%201.105%204.329%20C%201.105%203.263%201.469%202.3530002%202.21%201.612%20C%202.951%200.871%203.848%200.507%204.914%200.507%20L%208.6970005%200.507%20C%208.905%200.507%209.009%200.611%209.009%200.819%20C%209.009%200.98800004%208.866%201.131%208.6970005%201.131%20Z%20M%208.6970005%20-1.04%20L%201.69%20-1.04%20C%201.495%20-1.04%201.391%20-1.144%201.391%20-1.339%20C%201.391%20-1.547%201.495%20-1.651%201.69%20-1.651%20L%208.6970005%20-1.651%20C%208.905%20-1.651%209.009%20-1.547%209.009%20-1.339%20C%209.009%20-1.183%208.866%20-1.04%208.6970005%20-1.04%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g39839232D9B855C6E487282AC713D032%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2012.428%208.84%20C%2012.181001%208.84%2011.336%208.879%2011.089001%208.879%20C%2010.894%208.879%2010.79%208.775001%2010.79%208.58%20C%2010.79%208.45%2010.868%208.385%2011.024%208.372%20C%2011.505%208.359%2011.739%208.216001%2011.739%207.9300003%20C%2011.739%207.852%2011.687%207.722%2011.583%207.527%20L%208.177%201.625%20L%207.722%207.826%20C%207.67%208.294001%207.9820004%208.372%208.567%208.372%20C%208.84%208.372%208.97%208.476%208.97%208.684%20C%208.97%208.814%208.892%208.879%208.723001%208.879%20C%208.437%208.879%207.4360003%208.84%207.15%208.84%20C%206.9030004%208.84%206.045%208.879%205.7980003%208.879%20C%205.603%208.879%205.499%208.775001%205.499%208.567%20C%205.499%208.437%205.616%208.372%205.863%208.372%20C%206.2660003%208.372%206.474%208.281%206.487%208.099%20L%206.565%207.124%20L%203.3930001%201.625%20L%202.925%207.9690003%20C%202.8860002%208.294001%203.4320002%208.372%203.848%208.372%20C%204.0690002%208.372%204.173%208.476%204.173%208.684%20C%204.173%208.814%204.0950003%208.879%203.9390001%208.879%20C%203.653%208.879%202.639%208.84%202.3530002%208.84%20C%202.106%208.84%201.248%208.879%201.001%208.879%20C%200.806%208.879%200.71500003%208.775001%200.71500003%208.58%20C%200.71500003%208.437%200.845%208.372%201.092%208.372%20C%201.638%208.372%201.69%208.346%201.7160001%207.9560003%20L%202.301%200.091000006%20C%202.3140001%20-0.156%202.405%20-0.286%202.561%20-0.286%20C%202.73%20-0.26%202.795%20-0.221%202.8990002%20-0.026%20C%202.9120002%20-0.013%202.9120002%200%202.9120002%200.013%20L%206.617%206.422%20L%207.085%200.091000006%20C%207.098%20-0.156%207.189%20-0.286%207.3450003%20-0.286%20C%207.4750004%20-0.286%207.592%20-0.19500001%207.696%20-0.013%20L%2011.934%207.306%20C%2012.285%207.9430003%2012.532001%208.307%2013.325%208.372%20C%2013.559%208.398%2013.624001%208.463%2013.624001%208.684%20C%2013.624001%208.814%2013.559%208.879%2013.416%208.879%20C%2013.234%208.879%2012.610001%208.84%2012.428%208.84%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.643020202020202em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, what is the best
unconditional opener?&lt;&#x2F;p&gt;
&lt;p&gt;In practice, this is actually quite difficult to answer, as doing so
would require evaluating every possible sequence of guesses, which would
take enormous amounts of time. However, we can approximate the quality
of an opener using entropy: every time we play an opener, we’re given a
pair of grades. There are only so many words which satisfy those grades.
Given that we’ve received some grade &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.525999999999999%2021.878999999999998%22%20width%3D%226.525999999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9E2AD06FF54CF56D71BB33B9D0AE859D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9E2AD06FF54CF56D71BB33B9D0AE859D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%200.19500001%20-1.8330001%20C%200.19500001%20-2.392%200.78000003%20-2.665%201.95%20-2.665%20C%202.561%20-2.665%203.1330001%20-2.509%203.64%20-2.21%20C%204.212%20-1.872%204.563%20-1.417%204.7060003%20-0.85800004%20L%206.123%204.849%20C%206.149%204.979%206.162%205.057%206.162%205.096%20C%206.162%205.356%206.019%205.486%205.7460003%205.486%20C%205.46%205.486%205.278%205.33%205.1870003%205.031%20C%204.901%205.512%204.511%205.7460003%204.03%205.7460003%20C%203.198%205.7460003%202.457%205.33%201.82%204.498%20C%201.235%203.7180002%200.936%202.8990002%200.936%202.0540001%20C%200.936%200.92300004%201.599%20-0.039%202.691%20-0.039%20C%203.198%20-0.039%203.6660001%200.18200001%204.0950003%200.611%20L%203.7050002%20-0.92300004%20C%203.328%20-1.82%202.743%20-2.275%201.924%20-2.275%20C%201.5860001%20-2.275%201.3000001%20-2.249%201.066%20-2.197%20C%201.339%20-2.0540001%201.469%20-1.8330001%201.469%20-1.534%20C%201.469%20-1.209%201.2870001%20-1.04%200.936%20-1.04%20C%200.52%20-1.04%200.19500001%20-1.417%200.19500001%20-1.8330001%20Z%20M%204.6280003%205.096%20C%204.888%204.823%205.018%204.563%205.018%204.303%20C%205.018%204.29%205.005%204.225%204.979%204.1340003%20L%204.368%201.677%20C%204.29%201.378%204.0690002%201.066%203.7180002%200.78000003%20C%203.367%200.49400002%203.029%200.351%202.73%200.351%20C%202.21%200.351%201.95%200.72800004%201.95%201.482%20C%201.95%202.197%202.392%203.783%202.652%204.251%20C%203.055%204.992%203.51%205.356%204.043%205.356%20C%204.277%205.356%204.472%205.2650003%204.6280003%205.096%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5932727272727272em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; for our word &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%209.347%2021.878999999999998%22%20width%3D%229.347pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF5A736AF78F00E66632FD1D047F362F0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF5A736AF78F00E66632FD1D047F362F0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.67%205.083%20C%207.67%204.966%207.735%204.836%207.8780003%204.7060003%20C%208.177%204.42%208.333%204.0690002%208.333%203.653%20C%208.333%203.4320002%208.255%203.081%208.099%202.5740001%20C%207.618%201.014%207.007%200.234%206.2660003%200.234%20C%205.655%200.234%205.356%200.58500004%205.356%201.3000001%20C%205.356%201.547%205.408%201.8460001%205.499%202.223%20C%205.7330003%203.1590002%205.98%204.0820003%206.201%205.031%20C%206.227%205.122%206.2400002%205.1740003%206.2400002%205.2130003%20C%206.2400002%205.473%206.097%205.603%205.8110003%205.603%20C%205.551%205.603%205.382%205.473%205.291%205.2130003%20L%204.771%203.1850002%20C%204.576%202.431%204.433%202.171%204.433%201.495%20C%204.433%201.391%204.433%201.3130001%204.446%201.274%20C%204.1470003%200.58500004%203.77%200.234%203.315%200.234%20C%202.665%200.234%202.3400002%200.611%202.3400002%201.352%20C%202.3400002%201.8330001%202.561%202.652%203.003%203.809%20C%203.1460001%204.199%203.224%204.472%203.224%204.6410003%20C%203.224%205.278%202.756%205.7460003%202.119%205.7460003%20C%201.534%205.7460003%201.092%205.421%200.767%204.771%20C%200.507%204.264%200.377%203.913%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.754%203.549%200.78000003%203.627%200.832%203.809%20C%201.144%204.849%201.5600001%205.369%202.08%205.369%20C%202.262%205.369%202.3530002%205.2390003%202.3530002%204.992%20C%202.3530002%204.797%202.275%204.511%202.132%204.1210003%20C%201.651%202.8600001%201.404%202.002%201.404%201.521%20C%201.404%200.416%202.145%20-0.143%203.276%20-0.143%20C%203.822%20-0.143%204.264%200.13%204.6150002%200.689%20C%204.875%200.13%205.408%20-0.143%206.227%20-0.143%20C%207.033%20-0.143%207.67%200.39000002%208.125%201.4560001%20C%208.424%202.132%208.983%203.926%208.983%204.797%20C%208.983%204.992%208.97%205.122%208.957%205.1870003%20C%208.905%205.434%208.658%205.7460003%208.372%205.7460003%20C%208.034%205.7460003%207.67%205.421%207.67%205.083%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.8497272727272727em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, let
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2026.085799999999992%2021.878999999999998%22%20width%3D%2226.085799999999992pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3BD2F2FDE487A05197DD8782434E5CF8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.6290000000000004%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g85ECDEF6D1A203054FCE0649F3F909BA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.7614%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFC98DFC6AC571E08609462EE8FE4B58A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2814.3013%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA6E22E1A936CF71CA47572B43AD6A447%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2821.817899999999995%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7D299A6131B3280793FD45559284A61%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3BD2F2FDE487A05197DD8782434E5CF8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.264%204.225%20C%204.264%203.9%204.433%203.7310002%204.784%203.7310002%20C%205.2520003%203.7310002%205.551%204.1340003%205.551%204.602%20C%205.551%205.33%204.784%205.7460003%204.004%205.7460003%20C%203.107%205.7460003%202.288%205.356%201.5860001%204.589%20C%200.884%203.822%200.533%202.977%200.533%202.0670002%20C%200.533%200.79300004%201.378%20-0.143%202.652%20-0.143%20C%203.341%20-0.143%203.9520001%200.026%204.485%200.351%20C%204.927%200.624%205.2520003%200.897%205.46%201.1700001%20C%205.551%201.2870001%205.59%201.378%205.59%201.417%20C%205.59%201.5600001%205.525%201.638%205.382%201.638%20C%205.317%201.638%205.2520003%201.5860001%205.1740003%201.482%20C%204.745%200.91%204.212%200.546%203.601%200.39000002%20C%203.198%200.286%202.8990002%200.234%202.678%200.234%20C%201.937%200.234%201.5730001%200.689%201.5730001%201.5860001%20C%201.5730001%202.392%201.95%203.562%202.262%204.1210003%20C%202.5740001%204.6930003%203.237%205.369%204.004%205.369%20C%204.498%205.369%204.836%205.2260003%205.018%204.953%20C%204.6150002%204.914%204.264%204.6540003%204.264%204.225%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g85ECDEF6D1A203054FCE0649F3F909BA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.275%20-0.0182%20C%202.6299002%20-0.0182%202.9848%200.118300006%203.3306%200.4004%20C%203.0758002%20-0.6825%202.9029002%20-1.5288%201.6926%20-1.5288%20C%201.4651%20-1.5288%201.2649001%20-1.5197%201.1011001%20-1.4924%20C%201.2467%20-1.3923%201.3195001%20-1.2467%201.3195001%20-1.0556%20C%201.3195001%20-0.80990005%201.1921%20-0.6916%200.9373%20-0.6916%20C%200.6279%20-0.6916%200.39130002%20-0.9646%200.39130002%20-1.274%20C%200.39130002%20-1.547%200.5551%20-1.7199%200.8827%20-1.7836001%20C%201.1284001%20-1.8291001%201.4014001%20-1.8564001%201.7017001%20-1.8564001%20C%202.1931%20-1.8564001%202.6299002%20-1.7654%203.0121002%20-1.5834%20C%203.4762%20-1.3559%203.7583%20-1.0283%203.8675%20-0.6006%20L%204.8412004%203.3215%20C%204.8685%203.4216%204.8776%203.4853%204.8776%203.5217001%20C%204.8776%203.7310002%204.7684%203.8402002%204.5409%203.8402002%20C%204.3316%203.8402002%204.1951003%203.7401001%204.1132%203.5490003%20C%203.8948002%203.8584%203.5945%204.0131%203.2032%204.0131%20C%202.5935001%204.0131%202.0566%203.7492%201.5834%203.2214%20C%201.1102%202.6936002%200.8736%202.1112%200.8736%201.4833001%20C%200.8736%200.637%201.4287001%20-0.0182%202.275%20-0.0182%20Z%20M%203.6491%203.5217001%20C%203.8584%203.3306%203.9585001%203.1486%203.9676%202.9666002%20L%203.5399%201.2194%20C%203.5126002%201.1193%203.4580002%201.0192001%203.3579001%200.90090007%20C%203.0212002%200.5005%202.6754%200.3003%202.3023%200.3003%20C%201.8746%200.3003%201.6653%200.5733%201.6653%201.1193%20C%201.6653%201.3377%201.7199%201.6471001%201.82%202.0384002%20C%201.9201001%202.4297001%202.0202%202.7118%202.1294%202.8938%20C%202.4479%203.4216%202.8028002%203.6855001%203.2032%203.6855001%20C%203.3761%203.6855001%203.5308%203.6309001%203.6491%203.5217001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gFC98DFC6AC571E08609462EE8FE4B58A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.8938%20-2.2568002%20C%202.9757001%20-2.2568002%203.0212002%20-2.2113001%203.0212002%20-2.1294%20C%203.0212002%20-2.1021001%203.003%20-2.0657%202.9757001%20-2.0293%20C%202.5025%20-1.6653%202.1203%20-1.0647%201.8382001%20-0.23660001%20C%201.5925001%200.4823%201.4651%201.1921%201.4651%201.8928001%20L%201.4651%202.6572%20C%201.4651%203.3579001%201.5925001%204.0677004%201.8382001%204.7866%20C%202.1203%205.6147003%202.5025%206.2153%202.9757001%206.5793004%20C%203.003%206.6066003%203.0212002%206.643%203.0212002%206.6794004%20C%203.0212002%206.7613%202.9757001%206.8068004%202.8938%206.8068004%20C%202.8847%206.8068004%202.8574002%206.7977004%202.8301%206.7795005%20C%202.2841%206.3609004%201.8291001%205.7421002%201.4560001%204.914%20C%201.1011001%204.1223%200.91910005%203.3761%200.91910005%202.6572%20L%200.91910005%201.8928001%20C%200.91910005%201.1739%201.1011001%200.4277%201.4560001%20-0.36400002%20C%201.8291001%20-1.1921%202.2841%20-1.8109001%202.8301%20-2.2295%20C%202.8574002%20-2.2477%202.8847%20-2.2568002%202.8938%20-2.2568002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA6E22E1A936CF71CA47572B43AD6A447%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.6157002%204.0222%20C%206.3609004%204.0222%206.0879%203.7674003%206.0879%203.5126002%20C%206.0879%203.4307%206.1698003%203.3033001%206.3336%203.1304002%20C%206.4974003%202.9575002%206.5793004%202.7482002%206.5793004%202.5207002%20C%206.5793004%202.3205001%206.4701004%201.9292%206.2517004%201.3377%20C%206.0788%200.83720005%205.6693%200.2275%205.0869%200.2275%20C%204.6228004%200.2275%204.3953004%200.4823%204.3953004%200.9919%20C%204.3953004%201.547%204.7775%202.7846%204.9413004%203.3852%20C%204.9686003%203.5035002%204.9868%203.5763001%204.9868%203.6036003%20C%204.9868%203.7856002%204.8321004%203.9221%204.6501%203.9221%20C%204.4226003%203.9221%204.2861004%203.8311002%204.2315%203.64%20C%204.1041%203.1941001%203.8038%202.0111%203.7856002%201.9383001%20C%203.6946%201.5743%203.6491%201.2922001%203.64%201.1011001%20C%203.6673002%200.94640005%203.5854%200.75530005%203.3943002%200.50960004%20C%203.2396002%200.3185%203.0485%200.2275%202.821%200.2275%20C%202.3023%200.2275%202.0475001%200.49140003%202.0475001%201.0192001%20C%202.0475001%201.3377%202.1931%201.8564001%202.4752002%202.5753002%20C%202.6026%202.9029002%202.6663%203.1213002%202.6663%203.2214%20C%202.6663%203.6855001%202.2477%204.0131%201.7745001%204.0131%20C%201.3377%204.0131%200.9919%203.7947001%200.7462%203.367%20C%200.53690004%203.003%200.4277%202.7482002%200.4277%202.6117%20C%200.4277%202.5116%200.49140003%202.457%200.61880004%202.457%20C%200.7189%202.457%200.78260005%202.5116%200.80990005%202.6299002%20C%201.0283%203.3397002%201.3377%203.6946%201.7472%203.6946%20C%201.8746%203.6946%201.9383001%203.6036003%201.9383001%203.4125001%20C%201.9383001%203.2851002%201.9019%203.1213002%201.82%202.9120002%20C%201.6562%202.4934%201.5379001%202.1658%201.4560001%201.9292%20C%201.3559%201.6107%201.3013%201.3468001%201.3013%201.1375%20C%201.3013%200.2912%201.9019%20-0.091000006%202.7846%20-0.091000006%20C%203.1941001%20-0.091000006%203.5308%200.1001%203.8038%200.47320002%20C%204.0313%200.1001%204.4408%20-0.091000006%205.0505004%20-0.091000006%20C%205.6329%20-0.091000006%206.1061%200.2639%206.4610004%200.98280007%20C%206.7249002%201.5015%207.0980005%202.6026%207.0980005%203.276%20C%207.0980005%203.6582003%206.9342003%204.0222%206.6157002%204.0222%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7D299A6131B3280793FD45559284A61%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%200.7098%20-2.2295%20C%201.2558%20-1.8109001%201.7108%20-1.1921%202.0839%20-0.36400002%20C%202.4388%200.4277%202.6208%201.1739%202.6208%201.8928001%20L%202.6208%202.6572%20C%202.6208%203.3761%202.4388%204.1223%202.0839%204.914%20C%201.7108%205.7421002%201.2558%206.3609004%200.7098%206.7795005%20C%200.6825%206.7977004%200.6552%206.8068004%200.64610004%206.8068004%20C%200.56420004%206.8068004%200.5187%206.7613%200.5187%206.6794004%20C%200.5187%206.643%200.53690004%206.6066003%200.56420004%206.5793004%20C%201.0374%206.2153%201.4196%205.6147003%201.7017001%204.7866%20C%201.9474001%204.0677004%202.0748%203.3579001%202.0748%202.6572%20L%202.0748%201.8928001%20C%202.0748%201.1921%201.9474001%200.4823%201.7017001%20-0.23660001%20C%201.4196%20-1.0647%201.0374%20-1.6653%200.56420004%20-2.0293%20C%200.53690004%20-2.0657%200.5187%20-2.1021001%200.5187%20-2.1294%20C%200.5187%20-2.2113001%200.56420004%20-2.2568002%200.64610004%20-2.2568002%20C%200.6552%20-2.2568002%200.6825%20-2.2477%200.7098%20-2.2295%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.371436363636363em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; be number of possible remaining words which could have given
the grade. Then the expected remaining entropy after guessing &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%209.347%2021.878999999999998%22%20width%3D%229.347pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF5A736AF78F00E66632FD1D047F362F0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF5A736AF78F00E66632FD1D047F362F0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.67%205.083%20C%207.67%204.966%207.735%204.836%207.8780003%204.7060003%20C%208.177%204.42%208.333%204.0690002%208.333%203.653%20C%208.333%203.4320002%208.255%203.081%208.099%202.5740001%20C%207.618%201.014%207.007%200.234%206.2660003%200.234%20C%205.655%200.234%205.356%200.58500004%205.356%201.3000001%20C%205.356%201.547%205.408%201.8460001%205.499%202.223%20C%205.7330003%203.1590002%205.98%204.0820003%206.201%205.031%20C%206.227%205.122%206.2400002%205.1740003%206.2400002%205.2130003%20C%206.2400002%205.473%206.097%205.603%205.8110003%205.603%20C%205.551%205.603%205.382%205.473%205.291%205.2130003%20L%204.771%203.1850002%20C%204.576%202.431%204.433%202.171%204.433%201.495%20C%204.433%201.391%204.433%201.3130001%204.446%201.274%20C%204.1470003%200.58500004%203.77%200.234%203.315%200.234%20C%202.665%200.234%202.3400002%200.611%202.3400002%201.352%20C%202.3400002%201.8330001%202.561%202.652%203.003%203.809%20C%203.1460001%204.199%203.224%204.472%203.224%204.6410003%20C%203.224%205.278%202.756%205.7460003%202.119%205.7460003%20C%201.534%205.7460003%201.092%205.421%200.767%204.771%20C%200.507%204.264%200.377%203.913%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.754%203.549%200.78000003%203.627%200.832%203.809%20C%201.144%204.849%201.5600001%205.369%202.08%205.369%20C%202.262%205.369%202.3530002%205.2390003%202.3530002%204.992%20C%202.3530002%204.797%202.275%204.511%202.132%204.1210003%20C%201.651%202.8600001%201.404%202.002%201.404%201.521%20C%201.404%200.416%202.145%20-0.143%203.276%20-0.143%20C%203.822%20-0.143%204.264%200.13%204.6150002%200.689%20C%204.875%200.13%205.408%20-0.143%206.227%20-0.143%20C%207.033%20-0.143%207.67%200.39000002%208.125%201.4560001%20C%208.424%202.132%208.983%203.926%208.983%204.797%20C%208.983%204.992%208.97%205.122%208.957%205.1870003%20C%208.905%205.434%208.658%205.7460003%208.372%205.7460003%20C%208.034%205.7460003%207.67%205.421%207.67%205.083%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.8497272727272727em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; is the
average of &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2073.11893333333332%2021.878999999999998%22%20width%3D%2273.11893333333332pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3BD2F2FDE487A05197DD8782434E5CF8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.6290000000000004%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g85ECDEF6D1A203054FCE0649F3F909BA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.7614%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFC98DFC6AC571E08609462EE8FE4B58A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2814.3013%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA6E22E1A936CF71CA47572B43AD6A447%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2821.817899999999995%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7D299A6131B3280793FD45559284A61%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2828.25246666666666%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1E5377FCBB1A07E0E1F5441C1515230A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCF3CD6CDE4276477C56A604EC4E71E42%22%20x%3D%223.6140000000000003%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCF8898C9600A817392ACC3BA6AB6A96C%22%20x%3D%2210.114%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2847.033133333333325%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3BD2F2FDE487A05197DD8782434E5CF8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2852.66213333333332%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g85ECDEF6D1A203054FCE0649F3F909BA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2857.79453333333333%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFC98DFC6AC571E08609462EE8FE4B58A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2861.33443333333332%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA6E22E1A936CF71CA47572B43AD6A447%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2868.8510333333333%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7D299A6131B3280793FD45559284A61%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3BD2F2FDE487A05197DD8782434E5CF8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.264%204.225%20C%204.264%203.9%204.433%203.7310002%204.784%203.7310002%20C%205.2520003%203.7310002%205.551%204.1340003%205.551%204.602%20C%205.551%205.33%204.784%205.7460003%204.004%205.7460003%20C%203.107%205.7460003%202.288%205.356%201.5860001%204.589%20C%200.884%203.822%200.533%202.977%200.533%202.0670002%20C%200.533%200.79300004%201.378%20-0.143%202.652%20-0.143%20C%203.341%20-0.143%203.9520001%200.026%204.485%200.351%20C%204.927%200.624%205.2520003%200.897%205.46%201.1700001%20C%205.551%201.2870001%205.59%201.378%205.59%201.417%20C%205.59%201.5600001%205.525%201.638%205.382%201.638%20C%205.317%201.638%205.2520003%201.5860001%205.1740003%201.482%20C%204.745%200.91%204.212%200.546%203.601%200.39000002%20C%203.198%200.286%202.8990002%200.234%202.678%200.234%20C%201.937%200.234%201.5730001%200.689%201.5730001%201.5860001%20C%201.5730001%202.392%201.95%203.562%202.262%204.1210003%20C%202.5740001%204.6930003%203.237%205.369%204.004%205.369%20C%204.498%205.369%204.836%205.2260003%205.018%204.953%20C%204.6150002%204.914%204.264%204.6540003%204.264%204.225%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g85ECDEF6D1A203054FCE0649F3F909BA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.275%20-0.0182%20C%202.6299002%20-0.0182%202.9848%200.118300006%203.3306%200.4004%20C%203.0758002%20-0.6825%202.9029002%20-1.5288%201.6926%20-1.5288%20C%201.4651%20-1.5288%201.2649001%20-1.5197%201.1011001%20-1.4924%20C%201.2467%20-1.3923%201.3195001%20-1.2467%201.3195001%20-1.0556%20C%201.3195001%20-0.80990005%201.1921%20-0.6916%200.9373%20-0.6916%20C%200.6279%20-0.6916%200.39130002%20-0.9646%200.39130002%20-1.274%20C%200.39130002%20-1.547%200.5551%20-1.7199%200.8827%20-1.7836001%20C%201.1284001%20-1.8291001%201.4014001%20-1.8564001%201.7017001%20-1.8564001%20C%202.1931%20-1.8564001%202.6299002%20-1.7654%203.0121002%20-1.5834%20C%203.4762%20-1.3559%203.7583%20-1.0283%203.8675%20-0.6006%20L%204.8412004%203.3215%20C%204.8685%203.4216%204.8776%203.4853%204.8776%203.5217001%20C%204.8776%203.7310002%204.7684%203.8402002%204.5409%203.8402002%20C%204.3316%203.8402002%204.1951003%203.7401001%204.1132%203.5490003%20C%203.8948002%203.8584%203.5945%204.0131%203.2032%204.0131%20C%202.5935001%204.0131%202.0566%203.7492%201.5834%203.2214%20C%201.1102%202.6936002%200.8736%202.1112%200.8736%201.4833001%20C%200.8736%200.637%201.4287001%20-0.0182%202.275%20-0.0182%20Z%20M%203.6491%203.5217001%20C%203.8584%203.3306%203.9585001%203.1486%203.9676%202.9666002%20L%203.5399%201.2194%20C%203.5126002%201.1193%203.4580002%201.0192001%203.3579001%200.90090007%20C%203.0212002%200.5005%202.6754%200.3003%202.3023%200.3003%20C%201.8746%200.3003%201.6653%200.5733%201.6653%201.1193%20C%201.6653%201.3377%201.7199%201.6471001%201.82%202.0384002%20C%201.9201001%202.4297001%202.0202%202.7118%202.1294%202.8938%20C%202.4479%203.4216%202.8028002%203.6855001%203.2032%203.6855001%20C%203.3761%203.6855001%203.5308%203.6309001%203.6491%203.5217001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gFC98DFC6AC571E08609462EE8FE4B58A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.8938%20-2.2568002%20C%202.9757001%20-2.2568002%203.0212002%20-2.2113001%203.0212002%20-2.1294%20C%203.0212002%20-2.1021001%203.003%20-2.0657%202.9757001%20-2.0293%20C%202.5025%20-1.6653%202.1203%20-1.0647%201.8382001%20-0.23660001%20C%201.5925001%200.4823%201.4651%201.1921%201.4651%201.8928001%20L%201.4651%202.6572%20C%201.4651%203.3579001%201.5925001%204.0677004%201.8382001%204.7866%20C%202.1203%205.6147003%202.5025%206.2153%202.9757001%206.5793004%20C%203.003%206.6066003%203.0212002%206.643%203.0212002%206.6794004%20C%203.0212002%206.7613%202.9757001%206.8068004%202.8938%206.8068004%20C%202.8847%206.8068004%202.8574002%206.7977004%202.8301%206.7795005%20C%202.2841%206.3609004%201.8291001%205.7421002%201.4560001%204.914%20C%201.1011001%204.1223%200.91910005%203.3761%200.91910005%202.6572%20L%200.91910005%201.8928001%20C%200.91910005%201.1739%201.1011001%200.4277%201.4560001%20-0.36400002%20C%201.8291001%20-1.1921%202.2841%20-1.8109001%202.8301%20-2.2295%20C%202.8574002%20-2.2477%202.8847%20-2.2568002%202.8938%20-2.2568002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA6E22E1A936CF71CA47572B43AD6A447%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.6157002%204.0222%20C%206.3609004%204.0222%206.0879%203.7674003%206.0879%203.5126002%20C%206.0879%203.4307%206.1698003%203.3033001%206.3336%203.1304002%20C%206.4974003%202.9575002%206.5793004%202.7482002%206.5793004%202.5207002%20C%206.5793004%202.3205001%206.4701004%201.9292%206.2517004%201.3377%20C%206.0788%200.83720005%205.6693%200.2275%205.0869%200.2275%20C%204.6228004%200.2275%204.3953004%200.4823%204.3953004%200.9919%20C%204.3953004%201.547%204.7775%202.7846%204.9413004%203.3852%20C%204.9686003%203.5035002%204.9868%203.5763001%204.9868%203.6036003%20C%204.9868%203.7856002%204.8321004%203.9221%204.6501%203.9221%20C%204.4226003%203.9221%204.2861004%203.8311002%204.2315%203.64%20C%204.1041%203.1941001%203.8038%202.0111%203.7856002%201.9383001%20C%203.6946%201.5743%203.6491%201.2922001%203.64%201.1011001%20C%203.6673002%200.94640005%203.5854%200.75530005%203.3943002%200.50960004%20C%203.2396002%200.3185%203.0485%200.2275%202.821%200.2275%20C%202.3023%200.2275%202.0475001%200.49140003%202.0475001%201.0192001%20C%202.0475001%201.3377%202.1931%201.8564001%202.4752002%202.5753002%20C%202.6026%202.9029002%202.6663%203.1213002%202.6663%203.2214%20C%202.6663%203.6855001%202.2477%204.0131%201.7745001%204.0131%20C%201.3377%204.0131%200.9919%203.7947001%200.7462%203.367%20C%200.53690004%203.003%200.4277%202.7482002%200.4277%202.6117%20C%200.4277%202.5116%200.49140003%202.457%200.61880004%202.457%20C%200.7189%202.457%200.78260005%202.5116%200.80990005%202.6299002%20C%201.0283%203.3397002%201.3377%203.6946%201.7472%203.6946%20C%201.8746%203.6946%201.9383001%203.6036003%201.9383001%203.4125001%20C%201.9383001%203.2851002%201.9019%203.1213002%201.82%202.9120002%20C%201.6562%202.4934%201.5379001%202.1658%201.4560001%201.9292%20C%201.3559%201.6107%201.3013%201.3468001%201.3013%201.1375%20C%201.3013%200.2912%201.9019%20-0.091000006%202.7846%20-0.091000006%20C%203.1941001%20-0.091000006%203.5308%200.1001%203.8038%200.47320002%20C%204.0313%200.1001%204.4408%20-0.091000006%205.0505004%20-0.091000006%20C%205.6329%20-0.091000006%206.1061%200.2639%206.4610004%200.98280007%20C%206.7249002%201.5015%207.0980005%202.6026%207.0980005%203.276%20C%207.0980005%203.6582003%206.9342003%204.0222%206.6157002%204.0222%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7D299A6131B3280793FD45559284A61%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%200.7098%20-2.2295%20C%201.2558%20-1.8109001%201.7108%20-1.1921%202.0839%20-0.36400002%20C%202.4388%200.4277%202.6208%201.1739%202.6208%201.8928001%20L%202.6208%202.6572%20C%202.6208%203.3761%202.4388%204.1223%202.0839%204.914%20C%201.7108%205.7421002%201.2558%206.3609004%200.7098%206.7795005%20C%200.6825%206.7977004%200.6552%206.8068004%200.64610004%206.8068004%20C%200.56420004%206.8068004%200.5187%206.7613%200.5187%206.6794004%20C%200.5187%206.643%200.53690004%206.6066003%200.56420004%206.5793004%20C%201.0374%206.2153%201.4196%205.6147003%201.7017001%204.7866%20C%201.9474001%204.0677004%202.0748%203.3579001%202.0748%202.6572%20L%202.0748%201.8928001%20C%202.0748%201.1921%201.9474001%200.4823%201.7017001%20-0.23660001%20C%201.4196%20-1.0647%201.0374%20-1.6653%200.56420004%20-2.0293%20C%200.53690004%20-2.0657%200.5187%20-2.1021001%200.5187%20-2.1294%20C%200.5187%20-2.2113001%200.56420004%20-2.2568002%200.64610004%20-2.2568002%20C%200.6552%20-2.2568002%200.6825%20-2.2477%200.7098%20-2.2295%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1E5377FCBB1A07E0E1F5441C1515230A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.872%200.039%20L%203.315%200%20L%203.315%200.507%20C%202.8470001%200.507%202.561%200.52%202.47%200.572%20C%202.379%200.624%202.3400002%200.78000003%202.3400002%201.0270001%20L%202.3400002%209.022%20L%200.42900002%208.879%20L%200.42900002%208.385%20C%200.884%208.385%201.1700001%208.346%201.261%208.268001%20C%201.352%208.190001%201.404%208.008%201.404%207.709%20L%201.404%201.0270001%20C%201.404%200.78000003%201.365%200.624%201.274%200.572%20C%201.183%200.52%200.897%200.507%200.42900002%200.507%20L%200.42900002%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCF3CD6CDE4276477C56A604EC4E71E42%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.237%20-0.143%20C%204.043%20-0.143%204.719%200.143%205.278%200.71500003%20C%205.837%201.2870001%206.123%201.9760001%206.123%202.782%20C%206.123%203.601%205.85%204.316%205.304%204.914%20C%204.758%205.512%204.0690002%205.8240004%203.25%205.8240004%20C%202.431%205.8240004%201.755%205.512%201.196%204.914%20C%200.637%204.316%200.36400002%203.601%200.36400002%202.782%20C%200.36400002%201.9760001%200.637%201.2870001%201.196%200.71500003%20C%201.755%200.143%202.444%20-0.143%203.237%20-0.143%20Z%20M%203.25%200.273%20C%202.6260002%200.273%202.158%200.546%201.8330001%201.105%20C%201.625%201.469%201.521%202.0670002%201.521%202.8860002%20C%201.521%203.6790001%201.625%204.251%201.82%204.6150002%20C%202.132%205.1740003%202.6000001%205.447%203.237%205.447%20C%203.848%205.447%204.316%205.1740003%204.6410003%204.6410003%20C%204.862%204.277%204.966%203.6920002%204.966%202.8860002%20C%204.966%201.378%204.524%200.273%203.25%200.273%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCF8898C9600A817392ACC3BA6AB6A96C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.603%205.889%20C%205.109%205.889%204.6540003%205.6940002%204.238%205.304%20C%203.848%205.603%203.4060001%205.7460003%202.8990002%205.7460003%20C%201.781%205.7460003%200.767%204.914%200.767%203.822%20C%200.767%203.276%200.962%202.834%201.352%202.496%20C%201.105%202.184%200.975%201.8330001%200.975%201.4300001%20C%200.975%200.936%201.144%200.559%201.469%200.312%20C%200.92300004%200.13%200.36400002%20-0.338%200.36400002%20-1.001%20C%200.36400002%20-1.5600001%200.72800004%20-2.002%201.4430001%20-2.3140001%20C%201.9890001%20-2.561%202.5870001%20-2.678%203.237%20-2.678%20C%203.9%20-2.678%204.511%20-2.561%205.057%20-2.3140001%20C%205.7720003%20-2.002%206.123%20-1.5600001%206.123%20-0.975%20C%206.123%20-0.286%205.837%200.221%205.2650003%200.546%20C%204.6670003%200.871%204.004%200.91%203.042%200.91%20C%202.47%200.91%202.158%200.91%202.093%200.92300004%20C%201.7290001%200.975%201.469%201.326%201.469%201.7290001%20C%201.469%201.924%201.521%202.106%201.638%202.262%20C%202.002%202.015%202.418%201.885%202.8990002%201.885%20C%204.017%201.885%205.018%202.717%205.018%203.809%20C%205.018%204.316%204.849%204.732%204.511%205.057%20C%204.836%205.356%205.1870003%205.499%205.564%205.499%20C%205.499%205.434%205.46%205.33%205.46%205.2000003%20C%205.46%204.914%205.603%204.771%205.889%204.771%20C%206.162%204.771%206.3050003%204.914%206.3050003%205.2130003%20C%206.3050003%205.616%205.993%205.889%205.603%205.889%20Z%20M%202.8990002%205.343%20C%203.601%205.343%203.9520001%204.836%203.9520001%203.822%20C%203.9520001%202.795%203.601%202.275%202.8990002%202.275%20C%202.184%202.275%201.8330001%202.782%201.8330001%203.809%20C%201.8330001%204.836%202.184%205.343%202.8990002%205.343%20Z%20M%202.132%200.052%20L%202.8860002%200.052%20C%203.562%200.052%204.1080003%200.013%204.524%20-0.078%20C%205.083%20-0.19500001%205.356%20-0.507%205.356%20-1.001%20C%205.356%20-1.417%205.096%20-1.742%204.576%20-1.9890001%20C%204.173%20-2.184%203.7310002%20-2.275%203.25%20-2.275%20C%202.782%20-2.275%202.3400002%20-2.184%201.924%20-1.9890001%20C%201.391%20-1.742%201.131%20-1.417%201.131%20-1.001%20C%201.131%20-0.455%201.599%200.052%202.132%200.052%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 6.647175757575756em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; for every possible grade &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.525999999999999%2021.878999999999998%22%20width%3D%226.525999999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9E2AD06FF54CF56D71BB33B9D0AE859D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9E2AD06FF54CF56D71BB33B9D0AE859D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%200.19500001%20-1.8330001%20C%200.19500001%20-2.392%200.78000003%20-2.665%201.95%20-2.665%20C%202.561%20-2.665%203.1330001%20-2.509%203.64%20-2.21%20C%204.212%20-1.872%204.563%20-1.417%204.7060003%20-0.85800004%20L%206.123%204.849%20C%206.149%204.979%206.162%205.057%206.162%205.096%20C%206.162%205.356%206.019%205.486%205.7460003%205.486%20C%205.46%205.486%205.278%205.33%205.1870003%205.031%20C%204.901%205.512%204.511%205.7460003%204.03%205.7460003%20C%203.198%205.7460003%202.457%205.33%201.82%204.498%20C%201.235%203.7180002%200.936%202.8990002%200.936%202.0540001%20C%200.936%200.92300004%201.599%20-0.039%202.691%20-0.039%20C%203.198%20-0.039%203.6660001%200.18200001%204.0950003%200.611%20L%203.7050002%20-0.92300004%20C%203.328%20-1.82%202.743%20-2.275%201.924%20-2.275%20C%201.5860001%20-2.275%201.3000001%20-2.249%201.066%20-2.197%20C%201.339%20-2.0540001%201.469%20-1.8330001%201.469%20-1.534%20C%201.469%20-1.209%201.2870001%20-1.04%200.936%20-1.04%20C%200.52%20-1.04%200.19500001%20-1.417%200.19500001%20-1.8330001%20Z%20M%204.6280003%205.096%20C%204.888%204.823%205.018%204.563%205.018%204.303%20C%205.018%204.29%205.005%204.225%204.979%204.1340003%20L%204.368%201.677%20C%204.29%201.378%204.0690002%201.066%203.7180002%200.78000003%20C%203.367%200.49400002%203.029%200.351%202.73%200.351%20C%202.21%200.351%201.95%200.72800004%201.95%201.482%20C%201.95%202.197%202.392%203.783%202.652%204.251%20C%203.055%204.992%203.51%205.356%204.043%205.356%20C%204.277%205.356%204.472%205.2650003%204.6280003%205.096%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5932727272727272em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;To keep things simple, I won’t go into the gritty details of why this
is so good. There are a billion other articles on it, so go look up your
favorite one if you’d like to learn more about the math. The rest of
this article will be focused on pure performance engineering. In order
to calculate the expected remaining information for every possible
opener, we’ll have to construct a grade for every combination of an
opener and the true word. Wordle canonically has 12947 words with 2309
possible solutions, so that means we’d have to compute up to
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%20108.57455555555553%2021.878999999999998%22%20width%3D%22108.57455555555553pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g946CC60F6553DE6CBD049CD3C05E1499%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.5%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2813%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6241B92D7B3222BD1CFDB236F66EFFD2%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2819.5%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1A20228482D81F7ABB77A9FB65C5C5E4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2826%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC3246547705A1FE533226DF54E94D9D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2835.55788888888888%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g612E5637A63753D5AA9DA09B759B0D5E%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2844.946777777777775%206.5%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%281.3000000000000012%203.7569999999999992%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g926D2660840F60BD26CB1948E0E27444%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.8500000000000005%203.7569999999999992%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g34A5C14ED9FB7DDEF99FAC79056D90F7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.4%203.7569999999999992%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g622CA137E75F1C7B312DB93983F80BDA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2814.95%203.7569999999999992%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4693E3A3EB6D2365B1DA5DB621129A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2819.5%203.7569999999999992%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g83A6B6FF257ED71588483547005EE45F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.086049999999998%2013.363999999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g86111C2D5C8682C53BDA9AD6152C9992%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%281.3000000000000012%205.629%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22none%22%20stroke%3D%22%23000000%22%20stroke-width%3D%220.624%22%20stroke-linecap%3D%22butt%22%20stroke-linejoin%3D%22miter%22%20stroke-miterlimit%3D%224%22%20d%3D%22M%200%200%20L%2022.75%200%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2828.238888888888887%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g612E5637A63753D5AA9DA09B759B0D5E%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2882.57455555555553%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2889.07455555555553%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC6F50C046BCA623FDEE933D413AC9522%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2895.57455555555553%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g698CEE4C4A10701C318E944B9229759%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28102.07455555555553%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6241B92D7B3222BD1CFDB236F66EFFD2%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g946CC60F6553DE6CBD049CD3C05E1499%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.497%208.658%20C%202.964%208.112%202.184%207.839%201.1570001%207.839%20L%201.1570001%207.3320003%20C%201.8330001%207.3320003%202.392%207.4360003%202.821%207.644%20L%202.821%201.066%20C%202.821%200.832%202.769%200.676%202.652%200.611%20C%202.535%200.546%202.21%200.507%201.69%200.507%20L%201.235%200.507%20L%201.235%200%20C%201.5600001%200.026%202.262%200.039%203.341%200.039%20C%204.42%200.039%205.122%200.026%205.447%200%20L%205.447%200.507%20L%204.992%200.507%20C%204.459%200.507%204.1340003%200.546%204.03%200.611%20C%203.926%200.676%203.861%200.832%203.861%201.066%20L%203.861%208.268001%20C%203.861%208.58%203.835%208.658%203.497%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g626C7FE0610F5A21B7FCC6F361F06C4A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.081%208.658%20C%202.418%208.658%201.8590001%208.424%201.378%207.9560003%20C%200.897%207.488%200.65000004%206.942%200.65000004%206.2790003%20C%200.65000004%205.837%200.975%205.512%201.378%205.512%20C%201.768%205.512%202.093%205.85%202.093%206.2400002%20C%202.093%206.669%201.781%206.968%201.365%206.968%20C%201.326%206.968%201.3000001%206.968%201.274%206.955%20C%201.521%207.592%202.093%208.151%202.9120002%208.151%20C%203.9780002%208.151%204.576%207.228%204.576%206.11%20C%204.576%205.2390003%204.1340003%204.303%203.25%203.315%20L%200.806%200.559%20C%200.637%200.36400002%200.65000004%200.377%200.65000004%200%20L%205.473%200%20L%205.85%202.3400002%20L%205.421%202.3400002%20C%205.317%201.677%205.2260003%201.3000001%205.1480002%201.183%20C%205.083%201.118%204.6930003%201.092%203.9780002%201.092%20L%201.807%201.092%20L%203.068%202.3270001%20C%203.9520001%203.1590002%205.07%204.056%205.447%204.745%20C%205.7070003%205.2000003%205.837%205.655%205.837%206.11%20C%205.837%207.644%204.6410003%208.658%203.081%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6241B92D7B3222BD1CFDB236F66EFFD2%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.508%201.82%20C%201.079%201.82%200.871%201.599%200.871%201.1570001%20C%200.871%200.18200001%201.664%20-0.286%202.691%20-0.286%20C%203.7310002%20-0.286%204.563%200.234%205.1740003%201.2870001%20C%205.681%202.158%205.941%203.1590002%205.941%204.277%20C%205.941%205.928%205.642%207.098%205.044%207.787%20C%204.537%208.372%203.9520001%208.658%203.289%208.658%20C%202.522%208.658%201.885%208.385%201.378%207.826%20C%200.819%207.241%200.546%206.539%200.546%205.7200003%20C%200.546%204.927%200.78000003%204.251%201.248%203.6920002%20C%201.742%203.094%202.379%202.795%203.1460001%202.795%20C%203.822%202.795%204.342%203.1590002%204.6930003%203.887%20L%204.6930003%203.7180002%20C%204.6930003%202.301%204.446%201.339%203.9390001%200.819%20C%203.536%200.39000002%203.107%200.18200001%202.678%200.18200001%20C%202.158%200.18200001%201.781%200.299%201.534%200.546%20C%201.937%200.546%202.145%200.78000003%202.145%201.183%20C%202.145%201.547%201.872%201.82%201.508%201.82%20Z%20M%203.1590002%203.198%20C%202.652%203.198%202.275%203.4580002%202.015%203.9780002%20C%201.872%204.277%201.794%204.862%201.794%205.7070003%20C%201.794%206.552%201.885%207.124%202.0540001%207.4490004%20C%202.3400002%207.9690003%202.756%208.229%203.289%208.229%20C%203.822%208.229%204.212%207.9040003%204.459%207.254%20C%204.602%206.9030004%204.6930003%206.3050003%204.6930003%205.46%20C%204.6930003%204.329%204.186%203.198%203.1590002%203.198%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1A20228482D81F7ABB77A9FB65C5C5E4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.589%208.801001%20C%204.472%208.801001%204.368%208.736%204.29%208.619%20L%200.36400002%202.5870001%20L%200.36400002%202.119%20L%203.757%202.119%20L%203.757%201.053%20C%203.757%200.819%203.7050002%200.663%203.614%200.598%20C%203.523%200.533%203.276%200.507%202.8470001%200.507%20L%202.522%200.507%20L%202.522%200%20C%202.8990002%200.026%203.497%200.039%204.303%200.039%20C%205.109%200.039%205.7070003%200.026%206.084%200%20L%206.084%200.507%20L%205.7590003%200.507%20C%205.33%200.507%205.083%200.533%204.992%200.598%20C%204.901%200.663%204.849%200.819%204.849%201.053%20L%204.849%202.119%20L%206.123%202.119%20L%206.123%202.6260002%20L%204.849%202.6260002%20L%204.849%208.58%20C%204.849%208.71%204.758%208.801001%204.589%208.801001%20Z%20M%203.835%207.189%20L%203.835%202.6260002%20L%200.871%202.6260002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC3246547705A1FE533226DF54E94D9D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.175%207.852%20C%206.2660003%207.9690003%206.3050003%208.1380005%206.3050003%208.372%20L%203.1590002%208.372%20C%202.262%208.372%201.755%208.424%201.664%208.541%20C%201.625%208.58%201.5860001%208.6710005%201.5600001%208.788%20L%201.1570001%208.788%20L%200.71500003%206.032%20L%201.144%206.032%20C%201.274%206.76%201.378%207.15%201.4560001%207.215%20C%201.495%207.254%201.898%207.28%202.665%207.28%20L%205.2130003%207.28%20L%203.835%205.33%20C%202.782%203.835%202.262%202.223%202.262%200.468%20C%202.262%20-0.039%202.47%20-0.286%202.8990002%20-0.286%20C%203.328%20-0.286%203.536%20-0.039%203.536%200.468%20L%203.536%201.131%20C%203.536%203.107%203.848%204.537%204.459%205.408%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g612E5637A63753D5AA9DA09B759B0D5E%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.2520003%204.836%20C%205.1610003%204.836%205.07%204.81%205.005%204.758%20L%203.471%203.627%20L%203.6660001%205.525%20C%203.7050002%205.7850003%203.497%206.006%203.25%206.006%20C%203.003%206.006%202.795%205.7850003%202.834%205.525%20L%203.029%203.627%20L%201.495%204.758%20C%201.4300001%204.81%201.339%204.836%201.248%204.836%20C%201.014%204.836%200.819%204.6410003%200.819%204.407%20C%200.819%204.225%200.91%204.0950003%201.079%204.017%20L%202.821%203.25%20L%201.079%202.483%20C%200.91%202.405%200.819%202.275%200.819%202.093%20C%200.819%201.8590001%201.014%201.664%201.248%201.664%20C%201.339%201.664%201.4300001%201.69%201.495%201.742%20L%203.029%202.8730001%20L%202.834%200.975%20C%202.795%200.71500003%203.003%200.507%203.25%200.507%20C%203.497%200.507%203.7050002%200.71500003%203.6660001%200.975%20L%203.471%202.8730001%20L%205.005%201.742%20C%205.07%201.69%205.1610003%201.664%205.2520003%201.664%20C%205.395%201.664%205.512%201.7290001%205.603%201.8460001%20C%205.7980003%202.106%205.655%202.379%205.421%202.483%20L%203.6790001%203.25%20L%205.421%204.017%20C%205.59%204.0950003%205.681%204.225%205.681%204.407%20C%205.681%204.6410003%205.486%204.836%205.2520003%204.836%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g926D2660840F60BD26CB1948E0E27444%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.4479%206.0606003%20C%202.0748%205.6784%201.5288%205.4873004%200.80990005%205.4873004%20L%200.80990005%205.1324%20C%201.2831%205.1324%201.6744001%205.2052%201.9747001%205.3508%20L%201.9747001%200.7462%20C%201.9747001%200.5824%201.9383001%200.47320002%201.8564001%200.4277%20C%201.7745001%200.3822%201.547%200.3549%201.1830001%200.3549%20L%200.86450005%200.3549%20L%200.86450005%200%20C%201.092%200.0182%201.5834%200.0273%202.3387%200.0273%20C%203.094%200.0273%203.5854%200.0182%203.8129%200%20L%203.8129%200.3549%20L%203.4944%200.3549%20C%203.1213002%200.3549%202.8938%200.3822%202.821%200.4277%20C%202.7482002%200.47320002%202.7027001%200.5824%202.7027001%200.7462%20L%202.7027001%205.7876%20C%202.7027001%206.006%202.6845002%206.0606003%202.4479%206.0606003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g34A5C14ED9FB7DDEF99FAC79056D90F7%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.1567001%206.0606003%20C%201.6926%206.0606003%201.3013%205.8968%200.9646%205.5692%20C%200.6279%205.2416%200.455%204.8594003%200.455%204.3953004%20C%200.455%204.0859003%200.6825%203.8584%200.9646%203.8584%20C%201.2376001%203.8584%201.4651%204.0950003%201.4651%204.368%20C%201.4651%204.6683%201.2467%204.8776%200.95550007%204.8776%20C%200.92820007%204.8776%200.91%204.8776%200.89180005%204.8685%20C%201.0647%205.3144%201.4651%205.7057004%202.0384002%205.7057004%20C%202.7846%205.7057004%203.2032%205.0596004%203.2032%204.277%20C%203.2032%203.6673002%202.8938%203.0121002%202.275%202.3205001%20L%200.56420004%200.39130002%20C%200.44590002%200.25480002%200.455%200.2639%200.455%200%20L%203.8311002%200%20L%204.0950003%201.638%20L%203.7947001%201.638%20C%203.7219002%201.1739%203.6582003%200.91%203.6036003%200.8281%20C%203.5581002%200.78260005%203.2851002%200.7644%202.7846%200.7644%20L%201.2649001%200.7644%20L%202.1476002%201.6289%20C%202.7664%202.2113001%203.5490003%202.8392%203.8129%203.3215%20C%203.9949002%203.64%204.0859003%203.9585001%204.0859003%204.277%20C%204.0859003%205.3508%203.2487001%206.0606003%202.1567001%206.0606003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g622CA137E75F1C7B312DB93983F80BDA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0556%201.274%20C%200.75530005%201.274%200.6097%201.1193%200.6097%200.80990005%20C%200.6097%200.12740001%201.1648%20-0.2002%201.8837001%20-0.2002%20C%202.6117%20-0.2002%203.1941001%200.1638%203.6218002%200.90090007%20C%203.9767%201.5106001%204.1587%202.2113001%204.1587%202.9939%20C%204.1587%204.1496%203.9494002%204.9686003%203.5308%205.4509%20C%203.1759002%205.8604%202.7664%206.0606003%202.3023%206.0606003%20C%201.7654%206.0606003%201.3195001%205.8695%200.9646%205.4782004%20C%200.5733%205.0687003%200.3822%204.5773%200.3822%204.004%20C%200.3822%203.4489002%200.546%202.9757001%200.8736%202.5844002%20C%201.2194%202.1658%201.6653%201.9565%202.2022002%201.9565%20C%202.6754%201.9565%203.0394%202.2113001%203.2851002%202.7209%20L%203.2851002%202.6026%20C%203.2851002%201.6107%203.1122%200.9373%202.7573001%200.5733%20C%202.4752002%200.273%202.1749%200.12740001%201.8746%200.12740001%20C%201.5106001%200.12740001%201.2467%200.20930001%201.0738001%200.3822%20C%201.3559%200.3822%201.5015%200.546%201.5015%200.8281%20C%201.5015%201.0829%201.3104%201.274%201.0556%201.274%20Z%20M%202.2113001%202.2386%20C%201.8564001%202.2386%201.5925001%202.4206002%201.4105%202.7846%20C%201.3104%202.9939%201.2558%203.4034002%201.2558%203.9949002%20C%201.2558%204.5864%201.3195001%204.9868%201.4378%205.2143%20C%201.638%205.5783%201.9292%205.7603%202.3023%205.7603%20C%202.6754%205.7603%202.9484%205.5328%203.1213002%205.0778003%20C%203.2214%204.8321004%203.2851002%204.4135003%203.2851002%203.8220003%20C%203.2851002%203.0303001%202.9302%202.2386%202.2113001%202.2386%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4693E3A3EB6D2365B1DA5DB621129A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.2123%206.1607003%20C%203.1304002%206.1607003%203.0576%206.1152%203.003%206.0333004%20L%200.25480002%201.8109001%20L%200.25480002%201.4833001%20L%202.6299002%201.4833001%20L%202.6299002%200.7371%20C%202.6299002%200.5733%202.5935001%200.46410003%202.5298002%200.41860002%20C%202.4661002%200.3731%202.2932%200.3549%201.9929001%200.3549%20L%201.7654%200.3549%20L%201.7654%200%20C%202.0293%200.0182%202.4479%200.0273%203.0121002%200.0273%20C%203.5763001%200.0273%203.9949002%200.0182%204.2588%200%20L%204.2588%200.3549%20L%204.0313%200.3549%20C%203.7310002%200.3549%203.5581002%200.3731%203.4944%200.41860002%20C%203.4307%200.46410003%203.3943002%200.5733%203.3943002%200.7371%20L%203.3943002%201.4833001%20L%204.2861004%201.4833001%20L%204.2861004%201.8382001%20L%203.3943002%201.8382001%20L%203.3943002%206.006%20C%203.3943002%206.097%203.3306%206.1607003%203.2123%206.1607003%20Z%20M%202.6845002%205.0323%20L%202.6845002%201.8382001%20L%200.6097%201.8382001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g83A6B6FF257ED71588483547005EE45F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.4853%204.5864%20C%203.7856002%204.5864%203.9312003%204.7411003%203.9312003%205.0505004%20C%203.9312003%205.7057004%203.4398%206.0606003%202.7664%206.0606003%20C%202.0111%206.0606003%201.4105%205.7057004%200.9646%204.9868%20C%200.5733%204.368%200.3822%203.6673002%200.3822%202.8756%20C%200.3822%201.7199%200.59150004%200.91%201.0192001%200.4277%20C%201.3832%200.0091%201.8018001%20-0.2002%202.2841%20-0.2002%20C%202.8392%20-0.2002%203.2942002%200.0091%203.6491%200.4277%20C%203.9858003%200.8281%204.1587%201.3104%204.1587%201.8655001%20C%204.1587%202.4206002%203.9949002%202.8938%203.6673002%203.2851002%20C%203.3215%203.7037%202.8756%203.9221%202.3387%203.9221%20C%201.8655001%203.9221%201.5015%203.6582003%201.2558%203.1486%20L%201.2558%203.2032%20C%201.2558%204.2315%201.5106001%205.1051%202.0566%205.5055003%20C%202.2932%205.6784%202.5389001%205.7603%202.7846%205.7603%20C%203.1122%205.7603%203.3488002%205.6693%203.5035002%205.4782004%20C%203.1941001%205.4782004%203.0394%205.3053%203.0394%205.0323%20C%203.0394%204.7775%203.2305002%204.5864%203.4853%204.5864%20Z%20M%203.1304002%203.094%20C%203.2305002%202.8847%203.2851002%202.4752002%203.2851002%201.8746%20C%203.2851002%201.2831%203.2396002%200.89180005%203.1395001%200.6916%20C%202.9575002%200.3185%202.6754%200.12740001%202.2841%200.12740001%20C%202.0202%200.12740001%201.82%200.2184%201.6744001%200.4004%20C%201.5561%200.546%201.4742%200.67340004%201.4378%200.7735%20C%201.3286%201.0556%201.274%201.4833001%201.274%202.0657%20C%201.274%202.3205001%201.3104%202.5662%201.3741001%202.8028002%20C%201.4924%203.2305002%201.8291001%203.6309001%202.3296%203.6309001%20C%202.6845002%203.6309001%202.9575002%203.4489002%203.1304002%203.094%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g86111C2D5C8682C53BDA9AD6152C9992%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0829%203.8584%20C%201.3741001%203.8584%201.5925001%204.0768003%201.5925001%204.368%20C%201.5925001%204.6956%201.4196%204.8685%201.0829%204.8776%20C%201.2831%205.3053%201.7381%205.6511%202.3296%205.6511%20C%203.1304002%205.6511%203.6582003%205.0505004%203.6582003%204.2497%20C%203.6582003%203.8129%203.5035002%203.3943002%203.1850002%202.9848%20C%203.0303001%202.7755%202.9120002%202.6299002%202.8301%202.548%20L%200.67340004%200.4095%20C%200.5551%200.3003%200.5733%200.273%200.5733%200%20L%204.3225%200%20L%204.6046%201.7108%20L%204.2224%201.7108%20C%204.1587%201.2285%204.0859003%200.94640005%204.004%200.8827%20C%203.9585001%200.8554%203.6764002%200.83720005%203.1395001%200.83720005%20L%201.5925001%200.83720005%20C%202.2022002%201.3741001%202.7664%201.8564001%203.3033001%202.2841%20C%203.7128003%202.6026%204.004%202.8847%204.1860003%203.1304002%20C%204.459%203.4853%204.5955%203.8584%204.5955%204.2497%20C%204.5955%204.8139%204.3771%205.2598004%203.9312003%205.5874004%20C%203.5399%205.8877%203.0485%206.0424004%202.4661002%206.0424004%20C%201.9656001%206.0424004%201.5379001%205.8968%201.1648%205.6056004%20C%200.7735%205.2871003%200.5733%204.8867%200.5733%204.3953004%20C%200.5733%204.0859003%200.8008%203.8584%201.0829%203.8584%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC6F50C046BCA623FDEE933D413AC9522%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.9390001%204.589%20C%204.797%204.914%205.603%205.7330003%205.603%206.8380003%20C%205.603%207.3970003%205.33%207.852%204.797%208.203%20C%204.329%208.502%203.796%208.658%203.198%208.658%20C%202.6130002%208.658%202.106%208.502%201.651%208.203%20C%201.144%207.8650002%200.884%207.4230003%200.884%206.8640003%20C%200.884%206.435%201.1700001%206.136%201.5860001%206.136%20C%202.002%206.136%202.288%206.435%202.288%206.8510003%20C%202.288%207.28%202.0410001%207.514%201.547%207.54%20C%201.885%207.9950004%202.418%208.229%203.1460001%208.229%20C%203.926%208.229%204.316%207.774%204.316%206.8510003%20C%204.316%206.3050003%204.212%205.85%204.017%205.473%20C%203.6660001%204.849%203.1850002%204.732%202.379%204.732%20C%202.223%204.7060003%202.145%204.6410003%202.145%204.524%20C%202.145%204.329%202.236%204.329%202.496%204.329%20L%203.055%204.329%20C%204.03%204.329%204.524%203.64%204.524%202.249%20C%204.524%201.144%204.1210003%200.18200001%203.1330001%200.18200001%20C%202.288%200.18200001%201.664%200.468%201.2870001%201.04%20C%201.742%201.0270001%202.08%201.365%202.08%201.807%20C%202.08%202.249%201.755%202.5740001%201.3130001%202.5740001%20C%200.806%202.5740001%200.546%202.3140001%200.546%201.781%20C%200.546%201.144%200.832%200.637%201.404%200.234%20C%201.911%20-0.117%202.509%20-0.286%203.1720002%20-0.286%20C%203.913%20-0.286%204.55%20-0.039%205.109%200.442%20C%205.668%200.92300004%205.941%201.521%205.941%202.249%20C%205.941%203.471%204.979%204.316%203.9390001%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g698CEE4C4A10701C318E944B9229759%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.237%20-0.286%20C%205.07%20-0.286%205.98%201.196%205.98%204.16%20C%205.98%206.149%205.564%207.4750004%204.745%208.125%20C%204.29%208.476%203.783%208.658%203.25%208.658%20C%201.417%208.658%200.507%207.163%200.507%204.16%20C%200.507%201.768%201.144%20-0.286%203.237%20-0.286%20Z%20M%204.6930003%206.8120003%20C%204.784%206.3570004%204.823%205.525%204.823%204.316%20C%204.823%203.1200001%204.771%202.236%204.6800003%201.664%20C%204.511%200.624%204.03%200.104%203.237%200.104%20C%202.938%200.104%202.639%200.221%202.366%200.442%20C%202.015%200.741%201.807%201.352%201.7160001%202.288%20C%201.677%202.6130002%201.664%203.289%201.664%204.316%20C%201.664%205.447%201.7030001%206.2400002%201.768%206.669%20C%201.885%207.3840003%202.119%207.839%202.483%208.034%20C%202.769%208.190001%203.016%208.268001%203.237%208.268001%20C%204.0820003%208.268001%204.55%207.579%204.6930003%206.8120003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 9.87041414141414em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; total grades, or about 193 billion grades
total. For the rest of this article, we’re going to focus on churning
through grade computation as fast as possible, in the hopes of getting
out our optimal opener.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-best-first-word&quot;&gt;The best first word&lt;&#x2F;h2&gt;
&lt;p&gt;To start off, any naive solution won’t be fast enough for finding the
best two-word opener. In fact, even getting a benchmark for that would
be a fool’s errand. As a proxy for that, we’ll start by looking at the
best &lt;em&gt;one&lt;&#x2F;em&gt;-word opener; that is, the single first guess which minimizes
the expected remaining entropy in the problem. Doing so will require
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2070.94677777777777%2021.878999999999998%22%20width%3D%2270.94677777777777pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g946CC60F6553DE6CBD049CD3C05E1499%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.5%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2813%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6241B92D7B3222BD1CFDB236F66EFFD2%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2819.5%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1A20228482D81F7ABB77A9FB65C5C5E4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2826%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC3246547705A1FE533226DF54E94D9D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2835.55788888888888%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g612E5637A63753D5AA9DA09B759B0D5E%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2844.946777777777775%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2851.446777777777775%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC6F50C046BCA623FDEE933D413AC9522%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2857.946777777777775%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g698CEE4C4A10701C318E944B9229759%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2864.44677777777777%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6241B92D7B3222BD1CFDB236F66EFFD2%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g946CC60F6553DE6CBD049CD3C05E1499%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.497%208.658%20C%202.964%208.112%202.184%207.839%201.1570001%207.839%20L%201.1570001%207.3320003%20C%201.8330001%207.3320003%202.392%207.4360003%202.821%207.644%20L%202.821%201.066%20C%202.821%200.832%202.769%200.676%202.652%200.611%20C%202.535%200.546%202.21%200.507%201.69%200.507%20L%201.235%200.507%20L%201.235%200%20C%201.5600001%200.026%202.262%200.039%203.341%200.039%20C%204.42%200.039%205.122%200.026%205.447%200%20L%205.447%200.507%20L%204.992%200.507%20C%204.459%200.507%204.1340003%200.546%204.03%200.611%20C%203.926%200.676%203.861%200.832%203.861%201.066%20L%203.861%208.268001%20C%203.861%208.58%203.835%208.658%203.497%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g626C7FE0610F5A21B7FCC6F361F06C4A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.081%208.658%20C%202.418%208.658%201.8590001%208.424%201.378%207.9560003%20C%200.897%207.488%200.65000004%206.942%200.65000004%206.2790003%20C%200.65000004%205.837%200.975%205.512%201.378%205.512%20C%201.768%205.512%202.093%205.85%202.093%206.2400002%20C%202.093%206.669%201.781%206.968%201.365%206.968%20C%201.326%206.968%201.3000001%206.968%201.274%206.955%20C%201.521%207.592%202.093%208.151%202.9120002%208.151%20C%203.9780002%208.151%204.576%207.228%204.576%206.11%20C%204.576%205.2390003%204.1340003%204.303%203.25%203.315%20L%200.806%200.559%20C%200.637%200.36400002%200.65000004%200.377%200.65000004%200%20L%205.473%200%20L%205.85%202.3400002%20L%205.421%202.3400002%20C%205.317%201.677%205.2260003%201.3000001%205.1480002%201.183%20C%205.083%201.118%204.6930003%201.092%203.9780002%201.092%20L%201.807%201.092%20L%203.068%202.3270001%20C%203.9520001%203.1590002%205.07%204.056%205.447%204.745%20C%205.7070003%205.2000003%205.837%205.655%205.837%206.11%20C%205.837%207.644%204.6410003%208.658%203.081%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6241B92D7B3222BD1CFDB236F66EFFD2%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.508%201.82%20C%201.079%201.82%200.871%201.599%200.871%201.1570001%20C%200.871%200.18200001%201.664%20-0.286%202.691%20-0.286%20C%203.7310002%20-0.286%204.563%200.234%205.1740003%201.2870001%20C%205.681%202.158%205.941%203.1590002%205.941%204.277%20C%205.941%205.928%205.642%207.098%205.044%207.787%20C%204.537%208.372%203.9520001%208.658%203.289%208.658%20C%202.522%208.658%201.885%208.385%201.378%207.826%20C%200.819%207.241%200.546%206.539%200.546%205.7200003%20C%200.546%204.927%200.78000003%204.251%201.248%203.6920002%20C%201.742%203.094%202.379%202.795%203.1460001%202.795%20C%203.822%202.795%204.342%203.1590002%204.6930003%203.887%20L%204.6930003%203.7180002%20C%204.6930003%202.301%204.446%201.339%203.9390001%200.819%20C%203.536%200.39000002%203.107%200.18200001%202.678%200.18200001%20C%202.158%200.18200001%201.781%200.299%201.534%200.546%20C%201.937%200.546%202.145%200.78000003%202.145%201.183%20C%202.145%201.547%201.872%201.82%201.508%201.82%20Z%20M%203.1590002%203.198%20C%202.652%203.198%202.275%203.4580002%202.015%203.9780002%20C%201.872%204.277%201.794%204.862%201.794%205.7070003%20C%201.794%206.552%201.885%207.124%202.0540001%207.4490004%20C%202.3400002%207.9690003%202.756%208.229%203.289%208.229%20C%203.822%208.229%204.212%207.9040003%204.459%207.254%20C%204.602%206.9030004%204.6930003%206.3050003%204.6930003%205.46%20C%204.6930003%204.329%204.186%203.198%203.1590002%203.198%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1A20228482D81F7ABB77A9FB65C5C5E4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.589%208.801001%20C%204.472%208.801001%204.368%208.736%204.29%208.619%20L%200.36400002%202.5870001%20L%200.36400002%202.119%20L%203.757%202.119%20L%203.757%201.053%20C%203.757%200.819%203.7050002%200.663%203.614%200.598%20C%203.523%200.533%203.276%200.507%202.8470001%200.507%20L%202.522%200.507%20L%202.522%200%20C%202.8990002%200.026%203.497%200.039%204.303%200.039%20C%205.109%200.039%205.7070003%200.026%206.084%200%20L%206.084%200.507%20L%205.7590003%200.507%20C%205.33%200.507%205.083%200.533%204.992%200.598%20C%204.901%200.663%204.849%200.819%204.849%201.053%20L%204.849%202.119%20L%206.123%202.119%20L%206.123%202.6260002%20L%204.849%202.6260002%20L%204.849%208.58%20C%204.849%208.71%204.758%208.801001%204.589%208.801001%20Z%20M%203.835%207.189%20L%203.835%202.6260002%20L%200.871%202.6260002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC3246547705A1FE533226DF54E94D9D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.175%207.852%20C%206.2660003%207.9690003%206.3050003%208.1380005%206.3050003%208.372%20L%203.1590002%208.372%20C%202.262%208.372%201.755%208.424%201.664%208.541%20C%201.625%208.58%201.5860001%208.6710005%201.5600001%208.788%20L%201.1570001%208.788%20L%200.71500003%206.032%20L%201.144%206.032%20C%201.274%206.76%201.378%207.15%201.4560001%207.215%20C%201.495%207.254%201.898%207.28%202.665%207.28%20L%205.2130003%207.28%20L%203.835%205.33%20C%202.782%203.835%202.262%202.223%202.262%200.468%20C%202.262%20-0.039%202.47%20-0.286%202.8990002%20-0.286%20C%203.328%20-0.286%203.536%20-0.039%203.536%200.468%20L%203.536%201.131%20C%203.536%203.107%203.848%204.537%204.459%205.408%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g612E5637A63753D5AA9DA09B759B0D5E%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.2520003%204.836%20C%205.1610003%204.836%205.07%204.81%205.005%204.758%20L%203.471%203.627%20L%203.6660001%205.525%20C%203.7050002%205.7850003%203.497%206.006%203.25%206.006%20C%203.003%206.006%202.795%205.7850003%202.834%205.525%20L%203.029%203.627%20L%201.495%204.758%20C%201.4300001%204.81%201.339%204.836%201.248%204.836%20C%201.014%204.836%200.819%204.6410003%200.819%204.407%20C%200.819%204.225%200.91%204.0950003%201.079%204.017%20L%202.821%203.25%20L%201.079%202.483%20C%200.91%202.405%200.819%202.275%200.819%202.093%20C%200.819%201.8590001%201.014%201.664%201.248%201.664%20C%201.339%201.664%201.4300001%201.69%201.495%201.742%20L%203.029%202.8730001%20L%202.834%200.975%20C%202.795%200.71500003%203.003%200.507%203.25%200.507%20C%203.497%200.507%203.7050002%200.71500003%203.6660001%200.975%20L%203.471%202.8730001%20L%205.005%201.742%20C%205.07%201.69%205.1610003%201.664%205.2520003%201.664%20C%205.395%201.664%205.512%201.7290001%205.603%201.8460001%20C%205.7980003%202.106%205.655%202.379%205.421%202.483%20L%203.6790001%203.25%20L%205.421%204.017%20C%205.59%204.0950003%205.681%204.225%205.681%204.407%20C%205.681%204.6410003%205.486%204.836%205.2520003%204.836%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC6F50C046BCA623FDEE933D413AC9522%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.9390001%204.589%20C%204.797%204.914%205.603%205.7330003%205.603%206.8380003%20C%205.603%207.3970003%205.33%207.852%204.797%208.203%20C%204.329%208.502%203.796%208.658%203.198%208.658%20C%202.6130002%208.658%202.106%208.502%201.651%208.203%20C%201.144%207.8650002%200.884%207.4230003%200.884%206.8640003%20C%200.884%206.435%201.1700001%206.136%201.5860001%206.136%20C%202.002%206.136%202.288%206.435%202.288%206.8510003%20C%202.288%207.28%202.0410001%207.514%201.547%207.54%20C%201.885%207.9950004%202.418%208.229%203.1460001%208.229%20C%203.926%208.229%204.316%207.774%204.316%206.8510003%20C%204.316%206.3050003%204.212%205.85%204.017%205.473%20C%203.6660001%204.849%203.1850002%204.732%202.379%204.732%20C%202.223%204.7060003%202.145%204.6410003%202.145%204.524%20C%202.145%204.329%202.236%204.329%202.496%204.329%20L%203.055%204.329%20C%204.03%204.329%204.524%203.64%204.524%202.249%20C%204.524%201.144%204.1210003%200.18200001%203.1330001%200.18200001%20C%202.288%200.18200001%201.664%200.468%201.2870001%201.04%20C%201.742%201.0270001%202.08%201.365%202.08%201.807%20C%202.08%202.249%201.755%202.5740001%201.3130001%202.5740001%20C%200.806%202.5740001%200.546%202.3140001%200.546%201.781%20C%200.546%201.144%200.832%200.637%201.404%200.234%20C%201.911%20-0.117%202.509%20-0.286%203.1720002%20-0.286%20C%203.913%20-0.286%204.55%20-0.039%205.109%200.442%20C%205.668%200.92300004%205.941%201.521%205.941%202.249%20C%205.941%203.471%204.979%204.316%203.9390001%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g698CEE4C4A10701C318E944B9229759%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.237%20-0.286%20C%205.07%20-0.286%205.98%201.196%205.98%204.16%20C%205.98%206.149%205.564%207.4750004%204.745%208.125%20C%204.29%208.476%203.783%208.658%203.25%208.658%20C%201.417%208.658%200.507%207.163%200.507%204.16%20C%200.507%201.768%201.144%20-0.286%203.237%20-0.286%20Z%20M%204.6930003%206.8120003%20C%204.784%206.3570004%204.823%205.525%204.823%204.316%20C%204.823%203.1200001%204.771%202.236%204.6800003%201.664%20C%204.511%200.624%204.03%200.104%203.237%200.104%20C%202.938%200.104%202.639%200.221%202.366%200.442%20C%202.015%200.741%201.807%201.352%201.7160001%202.288%20C%201.677%202.6130002%201.664%203.289%201.664%204.316%20C%201.664%205.447%201.7030001%206.2400002%201.768%206.669%20C%201.885%207.3840003%202.119%207.839%202.483%208.034%20C%202.769%208.190001%203.016%208.268001%203.237%208.268001%20C%204.0820003%208.268001%204.55%207.579%204.6930003%206.8120003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 6.44970707070707em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; or just under 30 million grades.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-simplest-approach&quot;&gt;The simplest approach&lt;&#x2F;h3&gt;
&lt;p&gt;I’ll start off with a naive implementation of a grader to give a
baseline for our future improvements. The simplest approach is to take
two passes through the solution. On the first pass, we make note of all
green letters in the grade, and write down any unmatched letters in the
solution. On the second pass, we travel through the guessed word and
mark any letters of the guess whcih correspond to an unmatched letter as
yellow. To be fully general, we could store each word as a &lt;code&gt;&amp;amp;str&lt;&#x2F;code&gt;, each
color as one member of an &lt;code&gt;enum&lt;&#x2F;code&gt;, and then give grades as a
&lt;code&gt;Vec&amp;lt;Color&amp;gt;&lt;&#x2F;code&gt;. To store the set of unmatched letters, the most general
version would be a &lt;code&gt;HashMap&amp;lt;char, usize&amp;gt;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;For the rest of this article, I’ll call the data structure which stores
the number of unmatched characters in the solution the &lt;dfn&gt;yellow bank&lt;&#x2F;dfn&gt;,
or just &lt;dfn&gt;bank&lt;&#x2F;dfn&gt; for short.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;Rust&quot; class=&quot;language-Rust z-code&quot;&gt;&lt;code class=&quot;language-Rust&quot; data-lang=&quot;Rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;std&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;collections&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;HashMap&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;Clone&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; Copy&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; PartialEq&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; Eq&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-enum z-rust&quot;&gt;enum&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-enum z-rust&quot;&gt;Color&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    Black&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    Yellow&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    Green&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-type z-rust&quot;&gt;type&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-type z-rust&quot;&gt;Word&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;str&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-type z-rust&quot;&gt;type&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-type z-rust&quot;&gt;Grade&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;Color&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;grade&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;w&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;Word, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;sol&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;Word&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; Grade&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;w&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;len&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; sol&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;len&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; bank&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;HashMap&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;char&lt;&#x2F;span&gt;, &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;HashMap&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; grade &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;with_capacity&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;w&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;len&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;wc&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; sc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; w&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;chars&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;zip&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;sol&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;chars&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; wc &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;==&lt;&#x2F;span&gt; sc &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            grade&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;push&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Color&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Green&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;else&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            grade&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;push&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Color&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Black&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;bank&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;entry&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;sc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;or_default&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;wc&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; g&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; w&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;chars&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;zip&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; grade&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;c&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; bank&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;get_mut&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;wc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;c &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-rust&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;g &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;==&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Color&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Black &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;c &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;-=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;g &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Color&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Yellow&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    grade
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Without even running this code, it should be apparent that it’s quite
slow. Creating a &lt;code&gt;HashMap&lt;&#x2F;code&gt; and a &lt;code&gt;Vec&lt;&#x2F;code&gt; for every single grading means
calling multiple allocations at each cycle, which is always disastrous
for hot loops. Because of this, I won’t even try to use it to calculate
the best two-word opener. Instead, I’ll do my comparisons of grading
speed on a slightly smaller task: calculating the best single-word
opener.&lt;&#x2F;p&gt;
&lt;p&gt;To do this calculation, we’ll need to compute the entropy after each
possible opening guess, meaning we’ll need to grade &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2070.94677777777777%2021.878999999999998%22%20width%3D%2270.94677777777777pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.5%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC6F50C046BCA623FDEE933D413AC9522%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2813%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g698CEE4C4A10701C318E944B9229759%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2819.5%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6241B92D7B3222BD1CFDB236F66EFFD2%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2828.888888888888886%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g612E5637A63753D5AA9DA09B759B0D5E%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2838.27777777777777%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g946CC60F6553DE6CBD049CD3C05E1499%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2844.77777777777777%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2851.27777777777777%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6241B92D7B3222BD1CFDB236F66EFFD2%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2857.77777777777777%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1A20228482D81F7ABB77A9FB65C5C5E4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2864.27777777777777%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC3246547705A1FE533226DF54E94D9D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g626C7FE0610F5A21B7FCC6F361F06C4A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.081%208.658%20C%202.418%208.658%201.8590001%208.424%201.378%207.9560003%20C%200.897%207.488%200.65000004%206.942%200.65000004%206.2790003%20C%200.65000004%205.837%200.975%205.512%201.378%205.512%20C%201.768%205.512%202.093%205.85%202.093%206.2400002%20C%202.093%206.669%201.781%206.968%201.365%206.968%20C%201.326%206.968%201.3000001%206.968%201.274%206.955%20C%201.521%207.592%202.093%208.151%202.9120002%208.151%20C%203.9780002%208.151%204.576%207.228%204.576%206.11%20C%204.576%205.2390003%204.1340003%204.303%203.25%203.315%20L%200.806%200.559%20C%200.637%200.36400002%200.65000004%200.377%200.65000004%200%20L%205.473%200%20L%205.85%202.3400002%20L%205.421%202.3400002%20C%205.317%201.677%205.2260003%201.3000001%205.1480002%201.183%20C%205.083%201.118%204.6930003%201.092%203.9780002%201.092%20L%201.807%201.092%20L%203.068%202.3270001%20C%203.9520001%203.1590002%205.07%204.056%205.447%204.745%20C%205.7070003%205.2000003%205.837%205.655%205.837%206.11%20C%205.837%207.644%204.6410003%208.658%203.081%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC6F50C046BCA623FDEE933D413AC9522%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.9390001%204.589%20C%204.797%204.914%205.603%205.7330003%205.603%206.8380003%20C%205.603%207.3970003%205.33%207.852%204.797%208.203%20C%204.329%208.502%203.796%208.658%203.198%208.658%20C%202.6130002%208.658%202.106%208.502%201.651%208.203%20C%201.144%207.8650002%200.884%207.4230003%200.884%206.8640003%20C%200.884%206.435%201.1700001%206.136%201.5860001%206.136%20C%202.002%206.136%202.288%206.435%202.288%206.8510003%20C%202.288%207.28%202.0410001%207.514%201.547%207.54%20C%201.885%207.9950004%202.418%208.229%203.1460001%208.229%20C%203.926%208.229%204.316%207.774%204.316%206.8510003%20C%204.316%206.3050003%204.212%205.85%204.017%205.473%20C%203.6660001%204.849%203.1850002%204.732%202.379%204.732%20C%202.223%204.7060003%202.145%204.6410003%202.145%204.524%20C%202.145%204.329%202.236%204.329%202.496%204.329%20L%203.055%204.329%20C%204.03%204.329%204.524%203.64%204.524%202.249%20C%204.524%201.144%204.1210003%200.18200001%203.1330001%200.18200001%20C%202.288%200.18200001%201.664%200.468%201.2870001%201.04%20C%201.742%201.0270001%202.08%201.365%202.08%201.807%20C%202.08%202.249%201.755%202.5740001%201.3130001%202.5740001%20C%200.806%202.5740001%200.546%202.3140001%200.546%201.781%20C%200.546%201.144%200.832%200.637%201.404%200.234%20C%201.911%20-0.117%202.509%20-0.286%203.1720002%20-0.286%20C%203.913%20-0.286%204.55%20-0.039%205.109%200.442%20C%205.668%200.92300004%205.941%201.521%205.941%202.249%20C%205.941%203.471%204.979%204.316%203.9390001%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g698CEE4C4A10701C318E944B9229759%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.237%20-0.286%20C%205.07%20-0.286%205.98%201.196%205.98%204.16%20C%205.98%206.149%205.564%207.4750004%204.745%208.125%20C%204.29%208.476%203.783%208.658%203.25%208.658%20C%201.417%208.658%200.507%207.163%200.507%204.16%20C%200.507%201.768%201.144%20-0.286%203.237%20-0.286%20Z%20M%204.6930003%206.8120003%20C%204.784%206.3570004%204.823%205.525%204.823%204.316%20C%204.823%203.1200001%204.771%202.236%204.6800003%201.664%20C%204.511%200.624%204.03%200.104%203.237%200.104%20C%202.938%200.104%202.639%200.221%202.366%200.442%20C%202.015%200.741%201.807%201.352%201.7160001%202.288%20C%201.677%202.6130002%201.664%203.289%201.664%204.316%20C%201.664%205.447%201.7030001%206.2400002%201.768%206.669%20C%201.885%207.3840003%202.119%207.839%202.483%208.034%20C%202.769%208.190001%203.016%208.268001%203.237%208.268001%20C%204.0820003%208.268001%204.55%207.579%204.6930003%206.8120003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6241B92D7B3222BD1CFDB236F66EFFD2%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.508%201.82%20C%201.079%201.82%200.871%201.599%200.871%201.1570001%20C%200.871%200.18200001%201.664%20-0.286%202.691%20-0.286%20C%203.7310002%20-0.286%204.563%200.234%205.1740003%201.2870001%20C%205.681%202.158%205.941%203.1590002%205.941%204.277%20C%205.941%205.928%205.642%207.098%205.044%207.787%20C%204.537%208.372%203.9520001%208.658%203.289%208.658%20C%202.522%208.658%201.885%208.385%201.378%207.826%20C%200.819%207.241%200.546%206.539%200.546%205.7200003%20C%200.546%204.927%200.78000003%204.251%201.248%203.6920002%20C%201.742%203.094%202.379%202.795%203.1460001%202.795%20C%203.822%202.795%204.342%203.1590002%204.6930003%203.887%20L%204.6930003%203.7180002%20C%204.6930003%202.301%204.446%201.339%203.9390001%200.819%20C%203.536%200.39000002%203.107%200.18200001%202.678%200.18200001%20C%202.158%200.18200001%201.781%200.299%201.534%200.546%20C%201.937%200.546%202.145%200.78000003%202.145%201.183%20C%202.145%201.547%201.872%201.82%201.508%201.82%20Z%20M%203.1590002%203.198%20C%202.652%203.198%202.275%203.4580002%202.015%203.9780002%20C%201.872%204.277%201.794%204.862%201.794%205.7070003%20C%201.794%206.552%201.885%207.124%202.0540001%207.4490004%20C%202.3400002%207.9690003%202.756%208.229%203.289%208.229%20C%203.822%208.229%204.212%207.9040003%204.459%207.254%20C%204.602%206.9030004%204.6930003%206.3050003%204.6930003%205.46%20C%204.6930003%204.329%204.186%203.198%203.1590002%203.198%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g612E5637A63753D5AA9DA09B759B0D5E%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.2520003%204.836%20C%205.1610003%204.836%205.07%204.81%205.005%204.758%20L%203.471%203.627%20L%203.6660001%205.525%20C%203.7050002%205.7850003%203.497%206.006%203.25%206.006%20C%203.003%206.006%202.795%205.7850003%202.834%205.525%20L%203.029%203.627%20L%201.495%204.758%20C%201.4300001%204.81%201.339%204.836%201.248%204.836%20C%201.014%204.836%200.819%204.6410003%200.819%204.407%20C%200.819%204.225%200.91%204.0950003%201.079%204.017%20L%202.821%203.25%20L%201.079%202.483%20C%200.91%202.405%200.819%202.275%200.819%202.093%20C%200.819%201.8590001%201.014%201.664%201.248%201.664%20C%201.339%201.664%201.4300001%201.69%201.495%201.742%20L%203.029%202.8730001%20L%202.834%200.975%20C%202.795%200.71500003%203.003%200.507%203.25%200.507%20C%203.497%200.507%203.7050002%200.71500003%203.6660001%200.975%20L%203.471%202.8730001%20L%205.005%201.742%20C%205.07%201.69%205.1610003%201.664%205.2520003%201.664%20C%205.395%201.664%205.512%201.7290001%205.603%201.8460001%20C%205.7980003%202.106%205.655%202.379%205.421%202.483%20L%203.6790001%203.25%20L%205.421%204.017%20C%205.59%204.0950003%205.681%204.225%205.681%204.407%20C%205.681%204.6410003%205.486%204.836%205.2520003%204.836%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g946CC60F6553DE6CBD049CD3C05E1499%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.497%208.658%20C%202.964%208.112%202.184%207.839%201.1570001%207.839%20L%201.1570001%207.3320003%20C%201.8330001%207.3320003%202.392%207.4360003%202.821%207.644%20L%202.821%201.066%20C%202.821%200.832%202.769%200.676%202.652%200.611%20C%202.535%200.546%202.21%200.507%201.69%200.507%20L%201.235%200.507%20L%201.235%200%20C%201.5600001%200.026%202.262%200.039%203.341%200.039%20C%204.42%200.039%205.122%200.026%205.447%200%20L%205.447%200.507%20L%204.992%200.507%20C%204.459%200.507%204.1340003%200.546%204.03%200.611%20C%203.926%200.676%203.861%200.832%203.861%201.066%20L%203.861%208.268001%20C%203.861%208.58%203.835%208.658%203.497%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1A20228482D81F7ABB77A9FB65C5C5E4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.589%208.801001%20C%204.472%208.801001%204.368%208.736%204.29%208.619%20L%200.36400002%202.5870001%20L%200.36400002%202.119%20L%203.757%202.119%20L%203.757%201.053%20C%203.757%200.819%203.7050002%200.663%203.614%200.598%20C%203.523%200.533%203.276%200.507%202.8470001%200.507%20L%202.522%200.507%20L%202.522%200%20C%202.8990002%200.026%203.497%200.039%204.303%200.039%20C%205.109%200.039%205.7070003%200.026%206.084%200%20L%206.084%200.507%20L%205.7590003%200.507%20C%205.33%200.507%205.083%200.533%204.992%200.598%20C%204.901%200.663%204.849%200.819%204.849%201.053%20L%204.849%202.119%20L%206.123%202.119%20L%206.123%202.6260002%20L%204.849%202.6260002%20L%204.849%208.58%20C%204.849%208.71%204.758%208.801001%204.589%208.801001%20Z%20M%203.835%207.189%20L%203.835%202.6260002%20L%200.871%202.6260002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC3246547705A1FE533226DF54E94D9D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.175%207.852%20C%206.2660003%207.9690003%206.3050003%208.1380005%206.3050003%208.372%20L%203.1590002%208.372%20C%202.262%208.372%201.755%208.424%201.664%208.541%20C%201.625%208.58%201.5860001%208.6710005%201.5600001%208.788%20L%201.1570001%208.788%20L%200.71500003%206.032%20L%201.144%206.032%20C%201.274%206.76%201.378%207.15%201.4560001%207.215%20C%201.495%207.254%201.898%207.28%202.665%207.28%20L%205.2130003%207.28%20L%203.835%205.33%20C%202.782%203.835%202.262%202.223%202.262%200.468%20C%202.262%20-0.039%202.47%20-0.286%202.8990002%20-0.286%20C%203.328%20-0.286%203.536%20-0.039%203.536%200.468%20L%203.536%201.131%20C%203.536%203.107%203.848%204.537%204.459%205.408%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 6.44970707070707em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;
words, or about 29 million.&lt;&#x2F;p&gt;
&lt;p&gt;Without further ado, here are my results:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;Method&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Runtime (ms)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Mean grading time (ns)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Speedup&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Naive&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3840.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;129.00&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1.0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;We’ll populate this table with further rows as we implement new methods
to compare against.&lt;&#x2F;p&gt;
&lt;p&gt;And, if you care, the best unconditional single-word opener is &lt;code&gt;soare&lt;&#x2F;code&gt;,
with an expected remaining information of 5.29 bits in the puzzle. For
reference, the 2309 possible solutions to a Wordle problem require 11.2
bits of information, so this yields a pretty big jump in your knowledge
of the puzzle! Since all other methods will be computing the same
result, I won’t bother reporting that, but instead we’ll just
calculate how long it takes them to do the same process.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;a-little-less-naive&quot;&gt;A little less naive&lt;&#x2F;h3&gt;
&lt;p&gt;The obvious next step is to see if we can avoid the allocations in our
implementation of &lt;code&gt;grade&lt;&#x2F;code&gt;. Actually, it’s not too hard to do! We’ll
make a few key insights:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Every possible guess and solution has exactly 5 letters.&lt;&#x2F;li&gt;
&lt;li&gt;Every possible guess and solution is exclusively made from ASCII
characters.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Since words are only five letters, we can replace variable-length &lt;code&gt;str&lt;&#x2F;code&gt;s
and &lt;code&gt;Vec&lt;&#x2F;code&gt;s with simple fixed-size arrays, preventing some allocations.
Additionally, since all letters are lowercase ASCII, we can model each
letter of each word as a number from 0 through 255 (inclusive), one for
each ASCII codepoint.&lt;&#x2F;p&gt;
&lt;p&gt;Once our letters are restricted, we can squint a little at our
yellow-bank map. The values no longer need to be &lt;code&gt;usize&lt;&#x2F;code&gt;s, since the
bank caps out at 5 letters saved per entry. Likewise, the keys are now
just numbers from 0 through 255, so instead of using an expensive
hash-map, we can just use a 256-element array of &lt;code&gt;u8&lt;&#x2F;code&gt; to store all our
unmatched letters.&lt;&#x2F;p&gt;
&lt;p&gt;We can put these insights together to make a very performant and
allocation-free implementation of our grade function. I’ll call this
the “sensible” implementation.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;Rust&quot; class=&quot;language-Rust z-code&quot;&gt;&lt;code class=&quot;language-Rust&quot; data-lang=&quot;Rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-type z-rust&quot;&gt;type&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-type z-rust&quot;&gt;Word&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-type z-rust&quot;&gt;type&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-type z-rust&quot;&gt;Grade&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;Color&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;grade&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;w&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Word, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;soln&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Word&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; Grade&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; bank &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-numeric z-rust&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;256&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; grade &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Color&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Black&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;wc&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; sc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; g&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; w&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;zip&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;soln&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;zip&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; grade&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; wc &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;==&lt;&#x2F;span&gt; sc &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;g &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Color&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Green&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;else&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            bank&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;sc &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;wc&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; g&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; w&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;zip&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; grade&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;g &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;==&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Color&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Black &lt;span class=&quot;z-keyword z-operator z-logical z-rust&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt; bank&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;wc &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            bank&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;wc &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;-=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;g &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Color&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Yellow&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    grade
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This implementation gives us a respectable 5x improvement in speed.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;Method&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Runtime (ms)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Mean grading time (ns)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Speedup&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Naive&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3840.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;129.00&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1.0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Sensible&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;659.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;22.00&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5.8&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Were I writing standard application code, I think this would have been a
good place to stop. It requires a few assumptions, but they are mostly
reasonable, and the code is in my opinion quite readable.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;&#x2F;strong&gt; Were I wearing my software-engineer hat, I would be a lot more
systematic about enforcing invariants for all my types. However, this is
only a blog post, and so I play fast and loose with my code quality for
sake of brevity.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;packing-it-all-down&quot;&gt;Packing it all down&lt;&#x2F;h3&gt;
&lt;p&gt;In the previous step, each &lt;code&gt;Word&lt;&#x2F;code&gt; was exactly 5 bytes. Often, if we pack
our data into a single integer, we can get some big performance
improvements, but the 3-byte overhead of a &lt;code&gt;u64&lt;&#x2F;code&gt; seems a little too big.
Is there a better way?&lt;&#x2F;p&gt;
&lt;p&gt;Well, maybe. We’ll have to start with another restrictive assumption.
Previously, we allowed any letter in a word to be a byte, so all values
of a &lt;code&gt;u8&lt;&#x2F;code&gt; were fair game. In our dataset, however, we find that every
word is a lowercase alphabetical string. This takes the number of
possible characters from 256 to just 26. Doing a little bit of math, the
minimum data needed to represent 5 26-letter words is &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2040.44733333333333%2021.878999999999998%22%20width%3D%2240.44733333333333pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g852C161DBA81AE451BE48CA650A341BC%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%288.666666666666666%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1E5377FCBB1A07E0E1F5441C1515230A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCF3CD6CDE4276477C56A604EC4E71E42%22%20x%3D%223.6140000000000003%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCF8898C9600A817392ACC3BA6AB6A96C%22%20x%3D%2210.114%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2827.447333333333333%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2833.94733333333333%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB75D9C1DC26232CB27049808D2AE9BFE%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g852C161DBA81AE451BE48CA650A341BC%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.534%204.0950003%20C%201.599%204.0950003%201.677%204.1470003%201.742%204.238%20C%202.132%204.823%202.665%205.109%203.341%205.109%20C%203.796%205.109%204.1470003%204.849%204.381%204.316%20C%204.524%203.9650002%204.602%203.4320002%204.602%202.717%20C%204.602%201.898%204.498%201.326%204.303%200.98800004%20C%203.9780002%200.455%203.536%200.18200001%202.977%200.18200001%20C%202.106%200.18200001%201.417%200.806%201.183%201.482%20C%201.222%201.469%201.248%201.482%201.3000001%201.482%20C%201.69%201.482%202.015%201.781%202.015%202.171%20C%202.015%202.5740001%201.69%202.8470001%201.3000001%202.8470001%20C%200.845%202.8470001%200.65000004%202.6000001%200.65000004%202.119%20C%200.65000004%200.819%201.7030001%20-0.286%203.003%20-0.286%20C%203.796%20-0.286%204.472%200%205.018%200.572%20C%205.564%201.144%205.837%201.8330001%205.837%202.6260002%20C%205.837%203.38%205.616%204.03%205.1740003%204.589%20C%204.6930003%205.2000003%204.0950003%205.499%203.367%205.499%20C%202.756%205.499%202.223%205.304%201.794%204.914%20L%201.794%207.228%20C%202.145%207.124%202.483%207.072%202.834%207.072%20C%203.4320002%207.072%203.9520001%207.215%204.394%207.514%20C%204.797%207.761%205.07%208.008%205.2260003%208.242001%20C%205.304%208.346%205.343%208.424%205.343%208.463%20C%205.343%208.593%205.278%208.658%205.1480002%208.658%20C%204.433%208.385%203.822%208.242001%203.328%208.242001%20C%202.743%208.242001%202.184%208.359%201.651%208.606%20C%201.5860001%208.632%201.534%208.645%201.482%208.645%20C%201.365%208.645%201.3000001%208.528%201.3000001%208.281%20L%201.3000001%204.485%20C%201.3000001%204.212%201.3000001%204.0950003%201.534%204.0950003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1E5377FCBB1A07E0E1F5441C1515230A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.872%200.039%20L%203.315%200%20L%203.315%200.507%20C%202.8470001%200.507%202.561%200.52%202.47%200.572%20C%202.379%200.624%202.3400002%200.78000003%202.3400002%201.0270001%20L%202.3400002%209.022%20L%200.42900002%208.879%20L%200.42900002%208.385%20C%200.884%208.385%201.1700001%208.346%201.261%208.268001%20C%201.352%208.190001%201.404%208.008%201.404%207.709%20L%201.404%201.0270001%20C%201.404%200.78000003%201.365%200.624%201.274%200.572%20C%201.183%200.52%200.897%200.507%200.42900002%200.507%20L%200.42900002%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCF3CD6CDE4276477C56A604EC4E71E42%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.237%20-0.143%20C%204.043%20-0.143%204.719%200.143%205.278%200.71500003%20C%205.837%201.2870001%206.123%201.9760001%206.123%202.782%20C%206.123%203.601%205.85%204.316%205.304%204.914%20C%204.758%205.512%204.0690002%205.8240004%203.25%205.8240004%20C%202.431%205.8240004%201.755%205.512%201.196%204.914%20C%200.637%204.316%200.36400002%203.601%200.36400002%202.782%20C%200.36400002%201.9760001%200.637%201.2870001%201.196%200.71500003%20C%201.755%200.143%202.444%20-0.143%203.237%20-0.143%20Z%20M%203.25%200.273%20C%202.6260002%200.273%202.158%200.546%201.8330001%201.105%20C%201.625%201.469%201.521%202.0670002%201.521%202.8860002%20C%201.521%203.6790001%201.625%204.251%201.82%204.6150002%20C%202.132%205.1740003%202.6000001%205.447%203.237%205.447%20C%203.848%205.447%204.316%205.1740003%204.6410003%204.6410003%20C%204.862%204.277%204.966%203.6920002%204.966%202.8860002%20C%204.966%201.378%204.524%200.273%203.25%200.273%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCF8898C9600A817392ACC3BA6AB6A96C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.603%205.889%20C%205.109%205.889%204.6540003%205.6940002%204.238%205.304%20C%203.848%205.603%203.4060001%205.7460003%202.8990002%205.7460003%20C%201.781%205.7460003%200.767%204.914%200.767%203.822%20C%200.767%203.276%200.962%202.834%201.352%202.496%20C%201.105%202.184%200.975%201.8330001%200.975%201.4300001%20C%200.975%200.936%201.144%200.559%201.469%200.312%20C%200.92300004%200.13%200.36400002%20-0.338%200.36400002%20-1.001%20C%200.36400002%20-1.5600001%200.72800004%20-2.002%201.4430001%20-2.3140001%20C%201.9890001%20-2.561%202.5870001%20-2.678%203.237%20-2.678%20C%203.9%20-2.678%204.511%20-2.561%205.057%20-2.3140001%20C%205.7720003%20-2.002%206.123%20-1.5600001%206.123%20-0.975%20C%206.123%20-0.286%205.837%200.221%205.2650003%200.546%20C%204.6670003%200.871%204.004%200.91%203.042%200.91%20C%202.47%200.91%202.158%200.91%202.093%200.92300004%20C%201.7290001%200.975%201.469%201.326%201.469%201.7290001%20C%201.469%201.924%201.521%202.106%201.638%202.262%20C%202.002%202.015%202.418%201.885%202.8990002%201.885%20C%204.017%201.885%205.018%202.717%205.018%203.809%20C%205.018%204.316%204.849%204.732%204.511%205.057%20C%204.836%205.356%205.1870003%205.499%205.564%205.499%20C%205.499%205.434%205.46%205.33%205.46%205.2000003%20C%205.46%204.914%205.603%204.771%205.889%204.771%20C%206.162%204.771%206.3050003%204.914%206.3050003%205.2130003%20C%206.3050003%205.616%205.993%205.889%205.603%205.889%20Z%20M%202.8990002%205.343%20C%203.601%205.343%203.9520001%204.836%203.9520001%203.822%20C%203.9520001%202.795%203.601%202.275%202.8990002%202.275%20C%202.184%202.275%201.8330001%202.782%201.8330001%203.809%20C%201.8330001%204.836%202.184%205.343%202.8990002%205.343%20Z%20M%202.132%200.052%20L%202.8860002%200.052%20C%203.562%200.052%204.1080003%200.013%204.524%20-0.078%20C%205.083%20-0.19500001%205.356%20-0.507%205.356%20-1.001%20C%205.356%20-1.417%205.096%20-1.742%204.576%20-1.9890001%20C%204.173%20-2.184%203.7310002%20-2.275%203.25%20-2.275%20C%202.782%20-2.275%202.3400002%20-2.184%201.924%20-1.9890001%20C%201.391%20-1.742%201.131%20-1.417%201.131%20-1.001%20C%201.131%20-0.455%201.599%200.052%202.132%200.052%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g626C7FE0610F5A21B7FCC6F361F06C4A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.081%208.658%20C%202.418%208.658%201.8590001%208.424%201.378%207.9560003%20C%200.897%207.488%200.65000004%206.942%200.65000004%206.2790003%20C%200.65000004%205.837%200.975%205.512%201.378%205.512%20C%201.768%205.512%202.093%205.85%202.093%206.2400002%20C%202.093%206.669%201.781%206.968%201.365%206.968%20C%201.326%206.968%201.3000001%206.968%201.274%206.955%20C%201.521%207.592%202.093%208.151%202.9120002%208.151%20C%203.9780002%208.151%204.576%207.228%204.576%206.11%20C%204.576%205.2390003%204.1340003%204.303%203.25%203.315%20L%200.806%200.559%20C%200.637%200.36400002%200.65000004%200.377%200.65000004%200%20L%205.473%200%20L%205.85%202.3400002%20L%205.421%202.3400002%20C%205.317%201.677%205.2260003%201.3000001%205.1480002%201.183%20C%205.083%201.118%204.6930003%201.092%203.9780002%201.092%20L%201.807%201.092%20L%203.068%202.3270001%20C%203.9520001%203.1590002%205.07%204.056%205.447%204.745%20C%205.7070003%205.2000003%205.837%205.655%205.837%206.11%20C%205.837%207.644%204.6410003%208.658%203.081%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB75D9C1DC26232CB27049808D2AE9BFE%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.979%206.552%20C%205.408%206.552%205.616%206.7730002%205.616%207.215%20C%205.616%208.151%204.914%208.658%203.9520001%208.658%20C%202.8730001%208.658%202.015%208.151%201.378%207.124%20C%200.819%206.2400002%200.546%205.2390003%200.546%204.1080003%20C%200.546%202.457%200.845%201.3000001%201.4560001%200.611%20C%201.9760001%200.013%202.5740001%20-0.286%203.263%20-0.286%20C%204.056%20-0.286%204.7060003%200.013%205.2130003%200.611%20C%205.6940002%201.183%205.941%201.872%205.941%202.665%20C%205.941%203.4580002%205.7070003%204.1340003%205.2390003%204.6930003%20C%204.745%205.291%204.1080003%205.603%203.341%205.603%20C%202.665%205.603%202.145%205.2260003%201.794%204.498%20L%201.794%204.576%20C%201.794%206.045%202.158%207.293%202.938%207.8650002%20C%203.276%208.112%203.627%208.229%203.9780002%208.229%20C%204.446%208.229%204.784%208.099%205.005%207.826%20C%204.563%207.826%204.342%207.579%204.342%207.189%20C%204.342%206.8250003%204.6150002%206.552%204.979%206.552%20Z%20M%204.472%204.42%20C%204.6150002%204.1210003%204.6930003%203.536%204.6930003%202.678%20C%204.6930003%201.8330001%204.6280003%201.274%204.485%200.98800004%20C%204.225%200.455%203.822%200.18200001%203.263%200.18200001%20C%202.8860002%200.18200001%202.6000001%200.312%202.392%200.572%20C%202.223%200.78000003%202.106%200.962%202.0540001%201.105%20C%201.898%201.508%201.82%202.119%201.82%202.951%20C%201.82%203.315%201.872%203.6660001%201.963%204.004%20C%202.132%204.6150002%202.6130002%205.1870003%203.328%205.1870003%20C%203.835%205.1870003%204.225%204.927%204.472%204.42%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.677030303030303em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;
bits, or just over 23.5 bits. This is a good sign - that means we can
represent each word as a &lt;code&gt;u32&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;It’s actually even better than that. We only need 5 bits to represent
each letter, so a packed array of 5 letters is only 25 bits. To get down
to the theoretical minimum of 24 bits, we’d need to do
multiplies-and-modulos to pack or extract each letter, but when
representing each letter as its own independent bits, we can use (much
faster) bitshift and masking operations.&lt;&#x2F;p&gt;
&lt;p&gt;But enough talking! Let’s get to the code. Let’s start by redefining
our &lt;code&gt;Word&lt;&#x2F;code&gt;s.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;Rust&quot; class=&quot;language-Rust z-code&quot;&gt;&lt;code class=&quot;language-Rust&quot; data-lang=&quot;Rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-type z-rust&quot;&gt;type&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-type z-rust&quot;&gt;Word&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is a packed representation, so for a word &lt;code&gt;w&lt;&#x2F;code&gt;, to get the &lt;code&gt;i&lt;&#x2F;code&gt;-th
letter of &lt;code&gt;w&lt;&#x2F;code&gt;, we can unpack it with a bit-shift and mask - to extract
out the letter, simply compute &lt;code&gt;(w &amp;gt;&amp;gt; (5 * i)) &amp;amp; 0b11111&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Likewise, each &lt;code&gt;Color&lt;&#x2F;code&gt; is only one of three values, so we can pack
&lt;code&gt;Color&lt;&#x2F;code&gt;s into two bits. With five &lt;code&gt;Color&lt;&#x2F;code&gt;s per grade, then we can pack a
&lt;code&gt;Grade&lt;&#x2F;code&gt; into a single &lt;code&gt;u16&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-type z-rust&quot;&gt;type&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-type z-rust&quot;&gt;Grade&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u16&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, each entry in the yellow bank can have a maximum of 5 letters,
so each entry needs only 3 bits. Across all 26 letters, that means we
can fit the entire yellow bank in 78 bits, so we can fit it in a single
&lt;code&gt;u128&lt;&#x2F;code&gt;. Putting this all together, we can take the previous sensible
implementation and convert it to use packed integers instead of arrays.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;Rust&quot; class=&quot;language-Rust z-code&quot;&gt;&lt;code class=&quot;language-Rust&quot; data-lang=&quot;Rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;GREEN&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u16&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-binary z-rust&quot;&gt;0b10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;YELLOW&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u16&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-binary z-rust&quot;&gt;0b01&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;BLACK&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u16&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-binary z-rust&quot;&gt;0b00&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;grade&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;guess&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Word, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;soln&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Word&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; Grade&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; yellow_bank &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-numeric z-rust&quot;&gt;u128&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; grade &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-numeric z-rust&quot;&gt;u16&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; guess2 &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; guess&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; soln2 &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; soln&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;_&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; matches_bottom_5 &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;guess2 &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;^&lt;&#x2F;span&gt; soln2&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-rust&quot;&gt;0x1f&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;==&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; matches_bottom_5 &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            grade &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;|=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;GREEN&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;else&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; sc &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; soln2 &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-rust&quot;&gt;0x1f&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            yellow_bank &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; sc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        grade &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        guess2 &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        soln2 &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; c &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;guess &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-rust&quot;&gt;0x1f&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; grade &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-binary z-rust&quot;&gt;0b11&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;==&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;BLACK&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; nyellow &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;yellow_bank &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; c&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-binary z-rust&quot;&gt;0b111&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; nyellow &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                yellow_bank &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;-=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; c&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                grade &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;|=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;YELLOW&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    grade
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This code is of course far more convoluted than the previous
implementation. However, it comes with a nice bump to performance!&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;Method&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Runtime (ms)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Mean grading time (ns)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Speedup&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Naive&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3840.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;129.00&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1.0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Sensible&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;659.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;22.00&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5.8&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Packed&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;309.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;10.34&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;12.4&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;going-for-a-squeeze&quot;&gt;Going for a squeeze&lt;&#x2F;h3&gt;
&lt;p&gt;We’re now reaching the point where it’s actually quite difficult to
come up with any more optimizations. However, there’s one more place
that I thought of to optimize, and it’s going to require one last
assumption.&lt;&#x2F;p&gt;
&lt;p&gt;If you scroll through the list of answers, you’ll notice that they’re
all relatively normal English words. Normal English words tend to have a
nice mix of vowels and consonants, and the list contains no degenerate
onamotopoeia like &lt;code&gt;aaaaa&lt;&#x2F;code&gt;. The result: &lt;strong&gt;every word on the answer list
contains no more than 3 duplicate letters.&lt;&#x2F;strong&gt; (This is true for the word
list too, but it’s not relevant to the optimization).&lt;&#x2F;p&gt;
&lt;p&gt;We can use that upper bound on duplicate letters to shrink our
yellow-letters bank. We now only need 2 bits per letter to represent
every entry in the yellow bank, so we can fit the whole thing in a
single &lt;code&gt;u64&lt;&#x2F;code&gt;. Generally speaking, &lt;code&gt;u128&lt;&#x2F;code&gt; arithmetic is quite slow, so
this is a big improvement for our performance. I’ll call this
implementation &lt;strong&gt;squeeze&lt;&#x2F;strong&gt;, since we squeeze everything down as tightly
as it can go.&lt;&#x2F;p&gt;
&lt;p&gt;Otherwise, the code is about the same, so I’m hiding the source behind
the spoiler dropdown below.&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;click me for code!&lt;&#x2F;summary&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;grade&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;guess&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Word, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;soln&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Word&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; Grade&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; yellow_bank &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-numeric z-rust&quot;&gt;u64&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; grade &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-numeric z-rust&quot;&gt;u16&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; guess2 &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; guess&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; soln2 &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; soln&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;_&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; matches_bottom_5 &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;guess2 &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;^&lt;&#x2F;span&gt; soln2&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-rust&quot;&gt;0x1f&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;==&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; matches_bottom_5 &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            grade &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;|=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;GREEN&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;else&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; sc &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; soln2 &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-rust&quot;&gt;0x1f&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            yellow_bank &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; sc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        grade &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        guess2 &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        soln2 &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; c &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;guess &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-rust&quot;&gt;0x1f&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; grade &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-binary z-rust&quot;&gt;0b11&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;==&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;BLACK&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; nyellow &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;yellow_bank &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; c&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-binary z-rust&quot;&gt;0b11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; nyellow &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                yellow_bank &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;-=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; c&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                grade &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;|=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;YELLOW&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    grade
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;details&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;Method&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Runtime (ms)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Mean grading time (ns)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Speedup&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Naive&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3840.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;129.00&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1.0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Sensible&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;659.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;22.00&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5.8&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Packed&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;309.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;10.34&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;12.4&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Squeeze&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;224.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7.49&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;17.1&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;multiple-data-multiple-problems&quot;&gt;Multiple data, multiple problems&lt;&#x2F;h3&gt;
&lt;p&gt;We’ve just about exhausted all of our sequential performance capacity.
However, computers can do a lot more with a lot more than one operation
at a time! If you’ve seen any of my &lt;a href=&quot;&#x2F;blog&#x2F;captree&quot;&gt;real work&lt;&#x2F;a&gt;, you
might know that I’m a big fan of single-instruction, multiple-data
(SIMD) parallelism.&lt;&#x2F;p&gt;
&lt;p&gt;Using SIMD, we have access to special instructions on our CPU. Ordinary
instructions let us do fine-grained atomic operations, such as adding
two numbers together. SIMD instructions take that one step further: we
use one instruction to do many (typically 4 or 8) of the same operation
on many values. The chief difficulty of using SIMD is that &lt;strong&gt;every unit
of parallelism must be doing the same thing&lt;&#x2F;strong&gt;. In other words, if our
sequential code has an if-else-statement in it, the parallelized version
must execute both branches of that statement. Fortunately for us,
though, our squeezed SIMD parallel algorithm has very few if-statements,
and the bodies that they execute are quite cheap.&lt;&#x2F;p&gt;
&lt;p&gt;The next problem is (once again) the yellow bank. If we are grading &lt;code&gt;L&lt;&#x2F;code&gt;
guesses in parallel, then we could represent our guess and solution
words as a vector of &lt;code&gt;L&lt;&#x2F;code&gt; &lt;code&gt;u32&lt;&#x2F;code&gt;s, but the yellow bank would have to be a
vector of &lt;code&gt;L&lt;&#x2F;code&gt; &lt;code&gt;u64&lt;&#x2F;code&gt;s. Converting between two different lane widths is
very expensive in SIMD code, so we need to use the same integers for
both the words and the yellow bank. However, if we expand each lane to
use a &lt;code&gt;u64&lt;&#x2F;code&gt; for each word, then we’ve wasted half our parallelism.&lt;&#x2F;p&gt;
&lt;p&gt;My solution: split the bank in half. We’ll make two SIMD vectors to
represent the yellow bank. The first vector can hold the entries in the
bank corresponding to the first 16 letters of the alphabet, while the
second vector can hold the entries corresponding to the last 10. The
chief benefit is that we now only need to use &lt;code&gt;u32&lt;&#x2F;code&gt;s to represent our
data, so we can dodge all the transfer costs for changing lane sizes.&lt;&#x2F;p&gt;
&lt;p&gt;Of course, this complicates the process of actually fetching and storing
numbers in the yellow bank. To make this all work, we have to construct
a bitmask for each character of the solution, and then mask every single
operation involving the yellow bank with operations like &lt;code&gt;select&lt;&#x2F;code&gt;. But
after a little finagling, it’s all possible!&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;gradel&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;const&lt;&#x2F;span&gt; L&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;words&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;Word, L&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;solns&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;Word, L&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;, L&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;where&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;LaneCount&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;L&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; SupportedLaneCount,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; split yellow bank since u128 not supported
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; yellows &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;, L&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; grade &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; guess2 &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; words&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; soln2 &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; solns&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; sixteen &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;16&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;_&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; matches_bottom_5 &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;guess2 &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;^&lt;&#x2F;span&gt; soln2&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-rust&quot;&gt;0x1f&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;simd_eq&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        grade &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;|=&lt;&#x2F;span&gt; matches_bottom_5
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;cast&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;select&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;GREEN&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;BLACK&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; sc &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; soln2 &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-rust&quot;&gt;0x1f&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; is_first_sixteen &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; sc&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;simd_lt&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;sixteen&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        yellows&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-rust&quot;&gt;!&lt;&#x2F;span&gt;matches_bottom_5 &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; is_first_sixteen&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;select&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; sc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        yellows&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-rust&quot;&gt;!&lt;&#x2F;span&gt;matches_bottom_5 &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-rust&quot;&gt;!&lt;&#x2F;span&gt;is_first_sixteen&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;select&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;            &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;sc &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; sixteen&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;            &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        grade &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        guess2 &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        soln2 &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; c &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;words &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-rust&quot;&gt;0x1f&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;cast&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; is_first_sixteen &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; c&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;simd_lt&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;sixteen&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; offset_c &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; is_first_sixteen&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;select&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;c&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; c &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; sixteen&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; needs_yellow &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;grade &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-binary z-rust&quot;&gt;0b11&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;simd_eq&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;BLACK&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;cast&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; n_yellow &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;is_first_sixteen&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;select&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;yellows&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; yellows&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; offset_c&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-binary z-rust&quot;&gt;0b11&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; got_yellow &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; needs_yellow &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;n_yellow&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;simd_gt&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        grade &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;|=&lt;&#x2F;span&gt; got_yellow
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;cast&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;select&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;YELLOW&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; subs &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; offset_c&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        yellows&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;-=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;got_yellow &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; is_first_sixteen&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;select&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;subs&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        yellows&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;-=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;got_yellow &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-rust&quot;&gt;!&lt;&#x2F;span&gt;is_first_sixteen&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;select&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;subs&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    grade
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The above code is as fast as it is incomprehensible. It’s polymorphic
over the lane count, so we can run our benchmarks for each lane count to
see which is fastest. My computer supports up to AVX2, so I expected the
8-lane implementation to be the fastest.&lt;&#x2F;p&gt;
&lt;p&gt;And we get great performance boosts! Our final performance for the SIMD
approach runs fifty times faster than the original naive implementation.
However, our numbers for average grading time are no longer truly
meaningful, since I calculated them by dividing the total grades
required by the total time taken, so the average times are a
representation of throughput, not latency.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;Method&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Runtime (ms)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Mean grading time (ns)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Speedup&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Naive&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3840.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;129.00&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1.0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Sensible&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;659.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;22.00&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5.8&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Packed&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;309.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;10.34&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;12.4&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Squeeze&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;224.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7.49&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;17.1&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;SIMD (1 lane)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;361.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;12.08&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;10.6&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;SIMD (2 lanes)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;370.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;12.38&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;10.4&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;SIMD (4 lanes)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;87.4&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2.91&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;43.9&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;SIMD (8 lanes)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;49.8&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1.67&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;77.1&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;SIMD (16 lanes)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;55.5&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1.86&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;69.2&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;SIMD (32 lanes)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;52.8&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1.77&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;72.7&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;turbo-parallelism&quot;&gt;Turbo-parallelism&lt;&#x2F;h3&gt;
&lt;p&gt;If going parallel in SIMD worked well for us, then going parallel with
threads will probably work great too. Luckily, selecting the best word
is an embarrasingly parallel problem: at the end of the day, all we’re
doing is calculating a minimum.&lt;&#x2F;p&gt;
&lt;p&gt;For our first-word benchmark, we’ll divvy up the 12947 guess words into
a chunk for every thread. For instance, if we have 32 threads, each
thread gets either 404 or 405 guess words in its chunk. Each thread
computes the best word in its apportioned chunk, then once all threads
are done, we select the best word from all the chunks.&lt;&#x2F;p&gt;
&lt;p&gt;This code is really easy to implement with &lt;code&gt;std::thread::scope&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; chunk_size &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;*&lt;&#x2F;span&gt; some number &lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; words &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;*&lt;&#x2F;span&gt; list of possible guesses &lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; answers &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;*&lt;&#x2F;span&gt; list of possible answer words &lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;scope&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;s&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; handles&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;_&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; words
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;chunks&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;chunk_size&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;enumerate&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;map&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;j&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;c&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            s&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;spawn&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;move&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-rust&quot;&gt;||&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; best_ent &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;INFINITY&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; best_word_id &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;MAX&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;i&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; w&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; c&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;enumerate&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; imagine `entropy_after` returns
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; the expected remaining entropy after
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; guessing `w`
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; ent &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;entropy_after&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;w&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; answers&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; ent &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; best_ent &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                        best_ent &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; ent&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                        best_word_id &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; i&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;best_ent&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; best_word_id &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; j &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; chunk_size&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; best_ent &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;INFINITY&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; best_id &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;MAX&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; handle &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; handles &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;ent&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; id&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; handle&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; ent &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; best_ent &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            best_ent &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; ent&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            best_id &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; id&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;best_ent&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; best_id&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;My one gripe about this code is I have to manually implement the
minimization loop twice. Normally, I would use &lt;code&gt;Iterator::min&lt;&#x2F;code&gt;, but
since floating-point numbers lack total order, we have to roll our own
&lt;code&gt;min&lt;&#x2F;code&gt; implementation for floats.&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;simd-wordle&#x2F;scaling.svg&quot; alt=&quot;Parallel scaling of grading. Here, L refers to the number of lanes used by the SIMD-parallel version.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;When we run the benchmarks, we see pretty good per-thread scaling! The
performance grows linearly with the number of threads until we reach 16
threads. I think the reason for the sudden dropoff is a quirk of
processor architecture. On the 7950X, there are 32 threads on 16 cores,
so the 17th thread has to share a core with another thread. This causes
contention and produces a performance drop. As the thread count
increases, the performance gains slow, and then start to drop at the
very end.&lt;&#x2F;p&gt;
&lt;p&gt;If we want to eke out more performance, though, we’ll need to give each
thread a little more flexibility in its schedule. There are currently
two limitations to this method:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;We have to wait for the slowest thread. Even though each thread
theoretically gets the same work, sometimes one thread will take
extra time. The remaining threads have to sit around waiting for the
slow thread to finish up instead of contributing meaningful work.&lt;&#x2F;li&gt;
&lt;li&gt;If we want to scale up to finding the best two-word opener, we’ll
have to spawn a bunch of threads thousands of times. The overhead is
pretty small compared to the grading time, but it adds up when
we’re trying to solve a massive number of problems.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;I’ll solve both of these issues later, but for now, just know that
there’s a better way to go about it - I shall discuss it in detail
shortly. For now, I’ll leave you with the final first-round scaling
table.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;Method&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Runtime (ms)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Mean grading time (ns)&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Speedup&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Naive&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;3840.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;129.00&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1.0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Sensible&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;659.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;22.00&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;5.8&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Packed&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;309.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;10.34&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;12.4&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Squeeze&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;224.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7.49&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;17.1&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;SIMD (1 lane)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;361.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;12.08&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;10.6&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;SIMD (2 lanes)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;370.0&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;12.38&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;10.4&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;SIMD (4 lanes)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;87.4&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2.91&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;43.9&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;SIMD (8 lanes)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;49.8&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1.67&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;77.1&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;SIMD (16 lanes)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;55.5&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1.86&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;69.2&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;SIMD (32 lanes)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;52.8&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1.77&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;72.7&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Parallel (32 threads, 8 lanes)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;4.8&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;0.16&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;🏅 798.0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;the-super-solver&quot;&gt;The super-solver&lt;&#x2F;h2&gt;
&lt;p&gt;Our grader is now fast enough that we can actually move on to trying to
solve the original problem: finding the best unconditional two-word
opener. However, there are still a few optimizations left! Right now,
checking every possible opener on a single thread would take about 42
minutes, which isn’t horrible, but it’s more than I have patience for.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;pruning-it-down&quot;&gt;Pruning it down&lt;&#x2F;h3&gt;
&lt;p&gt;Not all words are made equal. &lt;code&gt;salon&lt;&#x2F;code&gt; and &lt;code&gt;trice&lt;&#x2F;code&gt; might be a great
opener, but &lt;code&gt;qajaq&lt;&#x2F;code&gt; followed immediately by &lt;code&gt;qajaq&lt;&#x2F;code&gt; again is probably
not so good. Ideally, we’d like to avoid doing such a poor job at
grading at all possible.&lt;&#x2F;p&gt;
&lt;p&gt;We can take a branch-and-bound approach: at any point in our search, we
know the best possible opener so far will leave us with expected
remaining entropy &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2026.700699999999994%2021.878999999999998%22%20width%3D%2226.700699999999994pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%283.7960000000000007%2012.35%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCE9E9520A0290DE6ACB5770D3F9EFC00%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g42445E1EBAF5307FB8C297D0478333B9%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.803%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7C707578FA33FC5F4974517BD3CD702D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3C402A3AAC495DD2DB174F02BB0D7DF0%22%20x%3D%227.5802999999999985%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6276E6C0547F2BCFEC62983F27BE06B8%22%20x%3D%2210.1101%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCE9E9520A0290DE6ACB5770D3F9EFC00%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.018%206.695%20L%205.2390003%206.9290004%20L%203.25%209.022%20L%201.261%206.9290004%20L%201.482%206.695%20L%203.25%208.034%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g42445E1EBAF5307FB8C297D0478333B9%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2011.453%208.684%20C%2011.453%208.814%2011.375%208.879%2011.219%208.879%20L%209.568%208.84%20L%207.9170003%208.879%20C%207.709%208.879%207.618%208.762%207.618%208.567%20C%207.618%208.476%207.657%208.411%207.722%208.398%20C%207.852%208.385%207.9560003%208.372%208.021%208.372%20C%208.424%208.359%208.645%208.333%208.71%208.32%20C%208.775001%208.307%208.814%208.268001%208.814%208.203%20C%208.801001%208.1640005%208.788%208.086%208.762%207.9690003%20L%207.9950004%204.875%20L%204.173%204.875%20L%204.927%207.826%20C%204.992%208.099%205.109%208.268001%205.278%208.333%20C%205.369%208.359%205.59%208.372%205.954%208.372%20C%206.3050003%208.372%206.448%208.372%206.448%208.684%20C%206.448%208.814%206.3700004%208.879%206.214%208.879%20L%204.563%208.84%20L%202.8990002%208.879%20C%202.691%208.879%202.6000001%208.762%202.6000001%208.567%20C%202.6000001%208.476%202.639%208.411%202.717%208.398%20C%202.8470001%208.385%202.951%208.372%203.016%208.372%20C%203.4190001%208.359%203.653%208.333%203.7180002%208.32%20C%203.783%208.307%203.809%208.268001%203.809%208.203%20C%203.809%208.177%203.796%208.099%203.757%207.9690003%20L%202.028%201.066%20C%201.963%200.78000003%201.8330001%200.611%201.638%200.546%20C%201.547%200.52%201.3130001%200.507%200.91%200.507%20C%200.624%200.507%200.507%200.481%200.507%200.19500001%20C%200.507%200.065%200.58500004%200%200.741%200%20L%202.379%200.039%20L%203.198%200.026%20C%203.341%200.026%203.887%200%204.03%200%20C%204.238%200%204.342%200.104%204.342%200.312%20C%204.342%200.442%204.199%200.507%203.926%200.507%20C%203.4060001%200.507%203.1460001%200.559%203.1460001%200.676%20C%203.1460001%200.676%203.1590002%200.71500003%203.1850002%200.884%20L%204.056%204.368%20L%207.8650002%204.368%20L%206.994%200.884%20C%206.955%200.689%206.7990003%200.559%206.539%200.52%20C%206.474%200.507%206.2530003%200.507%205.876%200.507%20C%205.629%200.507%205.512%200.403%205.512%200.19500001%20C%205.512%200.065%205.59%200%205.7460003%200%20L%207.3840003%200.039%20L%208.203%200.026%20C%208.346%200.026%208.879%200%209.048%200%20C%209.2560005%200%209.360001%200.104%209.360001%200.312%20C%209.360001%200.442%209.217%200.507%208.944%200.507%20C%208.411%200.507%208.151%200.559%208.151%200.676%20C%208.151%200.676%208.1640005%200.71500003%208.190001%200.884%20L%209.932%207.826%20C%209.997%208.099%2010.114%208.268001%2010.283%208.333%20C%2010.361%208.359%2010.582%208.372%2010.959001%208.372%20C%2011.297%208.372%2011.453%208.372%2011.453%208.684%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7C707578FA33FC5F4974517BD3CD702D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.8665001%203.7583%20C%203.2851002%203.7583%203.4944%203.4398%203.4944%202.7937002%20L%203.4944%200.7189%20C%203.4944%200.546%203.4671001%200.4368%203.4034002%200.4004%20C%203.3397002%200.36400002%203.1304002%200.3458%202.7937002%200.3458%20L%202.7937002%200%20L%203.8493001%200.0273%20L%204.8958%200%20L%204.8958%200.3458%20C%204.5591%200.3458%204.3589%200.36400002%204.2952003%200.4004%20C%204.2315%200.4368%204.1951003%200.546%204.1951003%200.7189%20L%204.1951003%202.3569002%20C%204.1951003%203.0849001%204.6683%203.7583%205.3690004%203.7583%20C%205.7967%203.7583%206.006%203.4398%206.006%202.7937002%20L%206.006%200.7189%20C%206.006%200.546%205.9696%200.4368%205.9059005%200.4004%20C%205.8422003%200.36400002%205.6329%200.3458%205.2962003%200.3458%20L%205.2962003%200%20L%206.3518004%200.0273%20L%207.3983%200%20L%207.3983%200.3458%20C%207.1071005%200.3458%206.9160004%200.3549%206.8250003%200.3822%20C%206.734%200.4095%206.6976004%200.47320002%206.6976004%200.5824%20L%206.6976004%202.2841%20C%206.6976004%202.7118%206.6794004%203.0121002%206.6521%203.1850002%20C%206.5611005%203.7401001%206.1516004%204.0222%205.4327%204.0222%20C%204.8594003%204.0222%204.4317%203.7583%204.1405%203.2214%20C%204.0131%203.7583%203.6127002%204.0222%202.9302%204.0222%20C%202.3569002%204.0222%201.9201001%203.7492%201.6289%203.2032%20L%201.6289%204.0222%20L%200.2912%203.9221%20L%200.2912%203.5763001%20C%200.61880004%203.5763001%200.819%203.5490003%200.89180005%203.4944%20C%200.9646%203.4398%200.9919%203.3215%200.9919%203.1122%20L%200.9919%200.7189%20C%200.9919%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3458%200.2912%200.3458%20L%200.2912%200%20L%201.3468001%200.0273%20L%202.3933%200%20L%202.3933%200.3458%20C%202.0566%200.3458%201.8473%200.36400002%201.7836001%200.4004%20C%201.7199%200.4368%201.6835%200.546%201.6835%200.7189%20L%201.6835%202.3569002%20C%201.6835%203.094%202.1658%203.7583%202.8665001%203.7583%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3C402A3AAC495DD2DB174F02BB0D7DF0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.7654%205.4691%20C%201.7654%205.7421002%201.5379001%205.9787%201.2649001%205.9787%20C%200.9919%205.9787%200.75530005%205.7421002%200.75530005%205.4691%20C%200.75530005%205.1961%200.98280007%204.9504004%201.2558%204.9504004%20C%201.5379001%204.9504004%201.7654%205.1870003%201.7654%205.4691%20Z%20M%201.3013%200.0273%20L%202.2477%200%20L%202.2477%200.3549%20C%201.9474001%200.3549%201.7654%200.3731%201.7108%200.4095%20C%201.6562%200.44590002%201.638%200.546%201.638%200.7098%20L%201.638%204.0495%20L%200.33670002%203.9403002%20L%200.33670002%203.5945%20C%200.637%203.5945%200.8281%203.5672002%200.89180005%203.5217001%20C%200.95550007%203.4762%200.98280007%203.3488002%200.98280007%203.1395001%20L%200.98280007%200.7189%20C%200.98280007%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3549%200.3003%200.3549%20L%200.3003%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6276E6C0547F2BCFEC62983F27BE06B8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.8574002%203.7583%20C%203.2669%203.7583%203.4762%203.4398%203.4762%202.7937002%20L%203.4762%200.7189%20C%203.4762%200.546%203.4489002%200.4368%203.3852%200.4004%20C%203.3215%200.36400002%203.1213002%200.3458%202.7846%200.3458%20L%202.7846%200%20L%203.8311002%200.0273%20L%204.8685%200%20L%204.8685%200.3458%20C%204.5773%200.3458%204.3862%200.3549%204.2952003%200.3822%20C%204.2042003%200.4095%204.1678%200.47320002%204.1678%200.5824%20L%204.1678%202.2841%20C%204.1678%202.7118%204.1587%203.0121002%204.1314%203.1850002%20C%204.0404%203.7401001%203.6309001%204.0222%202.9120002%204.0222%20C%202.3387%204.0222%201.9110001%203.7492%201.6289%203.2032%20L%201.6289%204.0222%20L%200.2912%203.9221%20L%200.2912%203.5763001%20C%200.61880004%203.5763001%200.819%203.5490003%200.89180005%203.4944%20C%200.9646%203.4398%200.9919%203.3215%200.9919%203.1122%20L%200.9919%200.7189%20C%200.9919%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3458%200.2912%200.3458%20L%200.2912%200%20L%201.3377%200.0273%20L%202.3751001%200%20L%202.3751001%200.3458%20C%202.0384002%200.3458%201.8473%200.36400002%201.7836001%200.4004%20C%201.7199%200.4368%201.6835%200.546%201.6835%200.7189%20L%201.6835%202.3569002%20C%201.6835%203.094%202.1476002%203.7583%202.8574002%203.7583%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.427336363636363em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; after grading the opener. We
also know the initial entropy after no guesses&lt;&#x2F;p&gt;
&lt;p&gt;Hstart, which is a tad over 11 bits for our 2309 opening words. Given a
new opener &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2036.208466666666666%2021.878999999999998%22%20width%3D%2236.208466666666666pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF5A736AF78F00E66632FD1D047F362F0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.308%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7A5F85FE66C6FD3E604C68F5A7949524%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.213899999999999%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA5EFA28F31DFDD7E2EC069AC1C132FF5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2820.994566666666664%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF5A736AF78F00E66632FD1D047F362F0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2830.302566666666664%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g86111C2D5C8682C53BDA9AD6152C9992%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF5A736AF78F00E66632FD1D047F362F0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.67%205.083%20C%207.67%204.966%207.735%204.836%207.8780003%204.7060003%20C%208.177%204.42%208.333%204.0690002%208.333%203.653%20C%208.333%203.4320002%208.255%203.081%208.099%202.5740001%20C%207.618%201.014%207.007%200.234%206.2660003%200.234%20C%205.655%200.234%205.356%200.58500004%205.356%201.3000001%20C%205.356%201.547%205.408%201.8460001%205.499%202.223%20C%205.7330003%203.1590002%205.98%204.0820003%206.201%205.031%20C%206.227%205.122%206.2400002%205.1740003%206.2400002%205.2130003%20C%206.2400002%205.473%206.097%205.603%205.8110003%205.603%20C%205.551%205.603%205.382%205.473%205.291%205.2130003%20L%204.771%203.1850002%20C%204.576%202.431%204.433%202.171%204.433%201.495%20C%204.433%201.391%204.433%201.3130001%204.446%201.274%20C%204.1470003%200.58500004%203.77%200.234%203.315%200.234%20C%202.665%200.234%202.3400002%200.611%202.3400002%201.352%20C%202.3400002%201.8330001%202.561%202.652%203.003%203.809%20C%203.1460001%204.199%203.224%204.472%203.224%204.6410003%20C%203.224%205.278%202.756%205.7460003%202.119%205.7460003%20C%201.534%205.7460003%201.092%205.421%200.767%204.771%20C%200.507%204.264%200.377%203.913%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.754%203.549%200.78000003%203.627%200.832%203.809%20C%201.144%204.849%201.5600001%205.369%202.08%205.369%20C%202.262%205.369%202.3530002%205.2390003%202.3530002%204.992%20C%202.3530002%204.797%202.275%204.511%202.132%204.1210003%20C%201.651%202.8600001%201.404%202.002%201.404%201.521%20C%201.404%200.416%202.145%20-0.143%203.276%20-0.143%20C%203.822%20-0.143%204.264%200.13%204.6150002%200.689%20C%204.875%200.13%205.408%20-0.143%206.227%20-0.143%20C%207.033%20-0.143%207.67%200.39000002%208.125%201.4560001%20C%208.424%202.132%208.983%203.926%208.983%204.797%20C%208.983%204.992%208.97%205.122%208.957%205.1870003%20C%208.905%205.434%208.658%205.7460003%208.372%205.7460003%20C%208.034%205.7460003%207.67%205.421%207.67%205.083%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7A5F85FE66C6FD3E604C68F5A7949524%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.7573001%206.0424004%20C%202.3660002%205.6602%201.7836001%205.4691%200.9919%205.4691%20L%200.9919%205.0687003%20C%201.5288%205.0687003%201.9565%205.1506004%202.2841%205.3053%20L%202.2841%200.7735%20C%202.2841%200.6552%202.275%200.5824%202.2477%200.546%20C%202.2022002%200.44590002%201.9292%200.39130002%201.4287001%200.39130002%20L%201.0556%200.39130002%20L%201.0556%200%20L%202.6754%200.0364%20L%204.3043003%200%20L%204.3043003%200.39130002%20L%203.9312003%200.39130002%20C%203.4307%200.39130002%203.1577%200.44590002%203.1031%200.546%20C%203.0849001%200.5824%203.0758002%200.6552%203.0758002%200.7735%20L%203.0758002%205.7512%20C%203.0758002%205.9969%203.0394%206.0424004%202.7573001%206.0424004%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA5EFA28F31DFDD7E2EC069AC1C132FF5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.807%201.378%20C%201.391%201.378%201.118%201.066%201.118%200.65000004%20C%201.118%200.26%201.417%20-0.065%201.807%20-0.065%20C%201.9890001%20-0.065%202.145%20-0.013%202.262%200.104%20L%202.275%200%20C%202.275%20-0.819%202.002%20-1.521%201.4560001%20-2.08%20C%201.365%20-2.184%201.3130001%20-2.262%201.3130001%20-2.3140001%20C%201.3130001%20-2.444%201.365%20-2.509%201.482%20-2.509%20C%201.599%20-2.509%201.755%20-2.3530002%201.9760001%20-2.0540001%20C%202.418%20-1.4300001%202.639%20-0.741%202.639%200%20C%202.639%200.689%202.405%201.378%201.807%201.378%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g86111C2D5C8682C53BDA9AD6152C9992%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0829%203.8584%20C%201.3741001%203.8584%201.5925001%204.0768003%201.5925001%204.368%20C%201.5925001%204.6956%201.4196%204.8685%201.0829%204.8776%20C%201.2831%205.3053%201.7381%205.6511%202.3296%205.6511%20C%203.1304002%205.6511%203.6582003%205.0505004%203.6582003%204.2497%20C%203.6582003%203.8129%203.5035002%203.3943002%203.1850002%202.9848%20C%203.0303001%202.7755%202.9120002%202.6299002%202.8301%202.548%20L%200.67340004%200.4095%20C%200.5551%200.3003%200.5733%200.273%200.5733%200%20L%204.3225%200%20L%204.6046%201.7108%20L%204.2224%201.7108%20C%204.1587%201.2285%204.0859003%200.94640005%204.004%200.8827%20C%203.9585001%200.8554%203.6764002%200.83720005%203.1395001%200.83720005%20L%201.5925001%200.83720005%20C%202.2022002%201.3741001%202.7664%201.8564001%203.3033001%202.2841%20C%203.7128003%202.6026%204.004%202.8847%204.1860003%203.1304002%20C%204.459%203.4853%204.5955%203.8584%204.5955%204.2497%20C%204.5955%204.8139%204.3771%205.2598004%203.9312003%205.5874004%20C%203.5399%205.8877%203.0485%206.0424004%202.4661002%206.0424004%20C%201.9656001%206.0424004%201.5379001%205.8968%201.1648%205.6056004%20C%200.7735%205.2871003%200.5733%204.8867%200.5733%204.3953004%20C%200.5733%204.0859003%200.8008%203.8584%201.0829%203.8584%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.2916787878787876em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; we know that the grades from these guesses can yield no more
information than the sum of their independent information &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2018.2507%2021.878999999999998%22%20width%3D%2218.2507pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA90A5FB19785A81BDA1414C0220D47A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.070000000000001%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA6E22E1A936CF71CA47572B43AD6A447%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2812.5866%2020.837699999999998%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gBF441491D650852933F0AA730170C5BF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA90A5FB19785A81BDA1414C0220D47A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.461%208.6710005%20C%206.461%208.814%206.383%208.879%206.214%208.879%20L%204.537%208.84%20L%202.834%208.879%20C%202.6260002%208.892%202.522%208.788%202.522%208.567%20C%202.522%208.437%202.665%208.372%202.938%208.372%20C%203.497%208.372%203.77%208.307%203.77%208.190001%20C%203.77%208.125%203.757%208.06%203.744%207.9950004%20L%202.015%201.066%20C%201.95%200.78000003%201.82%200.611%201.625%200.546%20C%201.534%200.52%201.3000001%200.507%200.897%200.507%20C%200.572%200.507%200.442%200.49400002%200.442%200.19500001%20C%200.442%200.065%200.52%200%200.689%200%20L%202.3530002%200.039%20L%204.0690002%200%20C%204.277%20-0.013%204.381%200.091000006%204.381%200.299%20C%204.381%200.507%204.225%200.507%203.9390001%200.507%20C%203.4320002%200.507%203.1200001%200.481%203.1200001%200.689%20C%203.1200001%200.754%203.1330001%200.845%203.1720002%200.975%20L%204.888%207.826%20C%204.953%208.099%205.083%208.268001%205.278%208.333%20C%205.369%208.359%205.603%208.372%206.006%208.372%20C%206.3180003%208.372%206.461%208.385%206.461%208.6710005%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA6E22E1A936CF71CA47572B43AD6A447%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.6157002%204.0222%20C%206.3609004%204.0222%206.0879%203.7674003%206.0879%203.5126002%20C%206.0879%203.4307%206.1698003%203.3033001%206.3336%203.1304002%20C%206.4974003%202.9575002%206.5793004%202.7482002%206.5793004%202.5207002%20C%206.5793004%202.3205001%206.4701004%201.9292%206.2517004%201.3377%20C%206.0788%200.83720005%205.6693%200.2275%205.0869%200.2275%20C%204.6228004%200.2275%204.3953004%200.4823%204.3953004%200.9919%20C%204.3953004%201.547%204.7775%202.7846%204.9413004%203.3852%20C%204.9686003%203.5035002%204.9868%203.5763001%204.9868%203.6036003%20C%204.9868%203.7856002%204.8321004%203.9221%204.6501%203.9221%20C%204.4226003%203.9221%204.2861004%203.8311002%204.2315%203.64%20C%204.1041%203.1941001%203.8038%202.0111%203.7856002%201.9383001%20C%203.6946%201.5743%203.6491%201.2922001%203.64%201.1011001%20C%203.6673002%200.94640005%203.5854%200.75530005%203.3943002%200.50960004%20C%203.2396002%200.3185%203.0485%200.2275%202.821%200.2275%20C%202.3023%200.2275%202.0475001%200.49140003%202.0475001%201.0192001%20C%202.0475001%201.3377%202.1931%201.8564001%202.4752002%202.5753002%20C%202.6026%202.9029002%202.6663%203.1213002%202.6663%203.2214%20C%202.6663%203.6855001%202.2477%204.0131%201.7745001%204.0131%20C%201.3377%204.0131%200.9919%203.7947001%200.7462%203.367%20C%200.53690004%203.003%200.4277%202.7482002%200.4277%202.6117%20C%200.4277%202.5116%200.49140003%202.457%200.61880004%202.457%20C%200.7189%202.457%200.78260005%202.5116%200.80990005%202.6299002%20C%201.0283%203.3397002%201.3377%203.6946%201.7472%203.6946%20C%201.8746%203.6946%201.9383001%203.6036003%201.9383001%203.4125001%20C%201.9383001%203.2851002%201.9019%203.1213002%201.82%202.9120002%20C%201.6562%202.4934%201.5379001%202.1658%201.4560001%201.9292%20C%201.3559%201.6107%201.3013%201.3468001%201.3013%201.1375%20C%201.3013%200.2912%201.9019%20-0.091000006%202.7846%20-0.091000006%20C%203.1941001%20-0.091000006%203.5308%200.1001%203.8038%200.47320002%20C%204.0313%200.1001%204.4408%20-0.091000006%205.0505004%20-0.091000006%20C%205.6329%20-0.091000006%206.1061%200.2639%206.4610004%200.98280007%20C%206.7249002%201.5015%207.0980005%202.6026%207.0980005%203.276%20C%207.0980005%203.6582003%206.9342003%204.0222%206.6157002%204.0222%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gBF441491D650852933F0AA730170C5BF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.3400002%204.329%20C%202.0410001%204.056%201.6185%203.9195%201.066%203.9195%20L%200.92950004%203.9195%20L%200.92950004%203.5815%20L%201.066%203.5815%20C%201.3975%203.5815%201.6965001%203.64%201.9695001%203.7505%20L%201.9695001%200.57850003%20C%201.9695001%200.507%201.963%200.455%201.9435%200.42900002%20C%201.911%200.36400002%201.7030001%200.3315%201.3195%200.3315%20L%200.975%200.3315%20L%200.975%200%20C%201.2285%200.0195%201.664%200.026%202.288%200.026%20C%202.9120002%200.026%203.3475%200.0195%203.601%200%20L%203.601%200.3315%20L%203.2565%200.3315%20C%202.8730001%200.3315%202.665%200.36400002%202.6260002%200.42900002%20C%202.6130002%200.455%202.6065001%200.507%202.6065001%200.57850003%20L%202.6065001%204.1080003%20C%202.6065001%204.329%202.5805001%204.329%202.3400002%204.329%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.6591545454545453em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; and &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2018.2507%2021.878999999999998%22%20width%3D%2218.2507pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA90A5FB19785A81BDA1414C0220D47A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.070000000000001%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA6E22E1A936CF71CA47572B43AD6A447%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2812.5866%2020.837699999999998%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1928CEC6E065D8496B1E1E47395F0ECF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA90A5FB19785A81BDA1414C0220D47A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.461%208.6710005%20C%206.461%208.814%206.383%208.879%206.214%208.879%20L%204.537%208.84%20L%202.834%208.879%20C%202.6260002%208.892%202.522%208.788%202.522%208.567%20C%202.522%208.437%202.665%208.372%202.938%208.372%20C%203.497%208.372%203.77%208.307%203.77%208.190001%20C%203.77%208.125%203.757%208.06%203.744%207.9950004%20L%202.015%201.066%20C%201.95%200.78000003%201.82%200.611%201.625%200.546%20C%201.534%200.52%201.3000001%200.507%200.897%200.507%20C%200.572%200.507%200.442%200.49400002%200.442%200.19500001%20C%200.442%200.065%200.52%200%200.689%200%20L%202.3530002%200.039%20L%204.0690002%200%20C%204.277%20-0.013%204.381%200.091000006%204.381%200.299%20C%204.381%200.507%204.225%200.507%203.9390001%200.507%20C%203.4320002%200.507%203.1200001%200.481%203.1200001%200.689%20C%203.1200001%200.754%203.1330001%200.845%203.1720002%200.975%20L%204.888%207.826%20C%204.953%208.099%205.083%208.268001%205.278%208.333%20C%205.369%208.359%205.603%208.372%206.006%208.372%20C%206.3180003%208.372%206.461%208.385%206.461%208.6710005%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA6E22E1A936CF71CA47572B43AD6A447%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.6157002%204.0222%20C%206.3609004%204.0222%206.0879%203.7674003%206.0879%203.5126002%20C%206.0879%203.4307%206.1698003%203.3033001%206.3336%203.1304002%20C%206.4974003%202.9575002%206.5793004%202.7482002%206.5793004%202.5207002%20C%206.5793004%202.3205001%206.4701004%201.9292%206.2517004%201.3377%20C%206.0788%200.83720005%205.6693%200.2275%205.0869%200.2275%20C%204.6228004%200.2275%204.3953004%200.4823%204.3953004%200.9919%20C%204.3953004%201.547%204.7775%202.7846%204.9413004%203.3852%20C%204.9686003%203.5035002%204.9868%203.5763001%204.9868%203.6036003%20C%204.9868%203.7856002%204.8321004%203.9221%204.6501%203.9221%20C%204.4226003%203.9221%204.2861004%203.8311002%204.2315%203.64%20C%204.1041%203.1941001%203.8038%202.0111%203.7856002%201.9383001%20C%203.6946%201.5743%203.6491%201.2922001%203.64%201.1011001%20C%203.6673002%200.94640005%203.5854%200.75530005%203.3943002%200.50960004%20C%203.2396002%200.3185%203.0485%200.2275%202.821%200.2275%20C%202.3023%200.2275%202.0475001%200.49140003%202.0475001%201.0192001%20C%202.0475001%201.3377%202.1931%201.8564001%202.4752002%202.5753002%20C%202.6026%202.9029002%202.6663%203.1213002%202.6663%203.2214%20C%202.6663%203.6855001%202.2477%204.0131%201.7745001%204.0131%20C%201.3377%204.0131%200.9919%203.7947001%200.7462%203.367%20C%200.53690004%203.003%200.4277%202.7482002%200.4277%202.6117%20C%200.4277%202.5116%200.49140003%202.457%200.61880004%202.457%20C%200.7189%202.457%200.78260005%202.5116%200.80990005%202.6299002%20C%201.0283%203.3397002%201.3377%203.6946%201.7472%203.6946%20C%201.8746%203.6946%201.9383001%203.6036003%201.9383001%203.4125001%20C%201.9383001%203.2851002%201.9019%203.1213002%201.82%202.9120002%20C%201.6562%202.4934%201.5379001%202.1658%201.4560001%201.9292%20C%201.3559%201.6107%201.3013%201.3468001%201.3013%201.1375%20C%201.3013%200.2912%201.9019%20-0.091000006%202.7846%20-0.091000006%20C%203.1941001%20-0.091000006%203.5308%200.1001%203.8038%200.47320002%20C%204.0313%200.1001%204.4408%20-0.091000006%205.0505004%20-0.091000006%20C%205.6329%20-0.091000006%206.1061%200.2639%206.4610004%200.98280007%20C%206.7249002%201.5015%207.0980005%202.6026%207.0980005%203.276%20C%207.0980005%203.6582003%206.9342003%204.0222%206.6157002%204.0222%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1928CEC6E065D8496B1E1E47395F0ECF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%200.98800004%202.756%20C%201.222%202.756%201.391%202.925%201.391%203.1590002%20C%201.391%203.3865001%201.274%203.523%201.0465%203.562%20C%201.248%203.8545%201.5600001%203.9975002%201.9825001%203.9975002%20C%202.6000001%203.9975002%203.094%203.614%203.094%203.016%20C%203.094%202.6065001%202.808%202.158%202.236%201.6705%20L%200.676%200.338%20C%200.624%200.29250002%200.598%200.2535%200.5915%200.221%20L%200.5915%200%20L%203.614%200%20L%203.835%201.2935001%20L%203.51%201.2935001%20C%203.4515002%200.9425%203.3930001%200.7475%203.3345%200.702%20C%203.302%200.6825%203.0745%200.6695%202.665%200.6695%20L%201.4885%200.6695%20C%202.3270001%201.2870001%202.509%201.4105%203.0485%201.794%20C%203.3085%201.9825001%203.4905%202.158%203.601%202.3205001%20C%203.7505%202.548%203.8285%202.782%203.8285%203.0225%20C%203.8285%203.4580002%203.64%203.7895%203.2695%204.0235%20C%202.951%204.225%202.5675%204.329%202.1125%204.329%20C%201.7290001%204.329%201.391%204.2315%201.0985%204.043%20C%200.7605%203.8285%200.5915%203.536%200.5915%203.1720002%20C%200.5915%202.925%200.78650004%202.756%200.98800004%202.756%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.6591545454545453em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.
In other words, we can bound the expected remaining entropy
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2039.2613%2021.878999999999998%22%20width%3D%2239.2613pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%206.5%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g42445E1EBAF5307FB8C297D0478333B9%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.543%2012.09%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA6E22E1A936CF71CA47572B43AD6A447%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2818.0596%2014.337700000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gBF441491D650852933F0AA730170C5BF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2822.995699999999996%2012.09%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC898B3495D6F31A5F8D8F6DCFCE49FA2%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2826.080599999999993%2012.09%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA6E22E1A936CF71CA47572B43AD6A447%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2833.597199999999994%2014.337700000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1928CEC6E065D8496B1E1E47395F0ECF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g42445E1EBAF5307FB8C297D0478333B9%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2011.453%208.684%20C%2011.453%208.814%2011.375%208.879%2011.219%208.879%20L%209.568%208.84%20L%207.9170003%208.879%20C%207.709%208.879%207.618%208.762%207.618%208.567%20C%207.618%208.476%207.657%208.411%207.722%208.398%20C%207.852%208.385%207.9560003%208.372%208.021%208.372%20C%208.424%208.359%208.645%208.333%208.71%208.32%20C%208.775001%208.307%208.814%208.268001%208.814%208.203%20C%208.801001%208.1640005%208.788%208.086%208.762%207.9690003%20L%207.9950004%204.875%20L%204.173%204.875%20L%204.927%207.826%20C%204.992%208.099%205.109%208.268001%205.278%208.333%20C%205.369%208.359%205.59%208.372%205.954%208.372%20C%206.3050003%208.372%206.448%208.372%206.448%208.684%20C%206.448%208.814%206.3700004%208.879%206.214%208.879%20L%204.563%208.84%20L%202.8990002%208.879%20C%202.691%208.879%202.6000001%208.762%202.6000001%208.567%20C%202.6000001%208.476%202.639%208.411%202.717%208.398%20C%202.8470001%208.385%202.951%208.372%203.016%208.372%20C%203.4190001%208.359%203.653%208.333%203.7180002%208.32%20C%203.783%208.307%203.809%208.268001%203.809%208.203%20C%203.809%208.177%203.796%208.099%203.757%207.9690003%20L%202.028%201.066%20C%201.963%200.78000003%201.8330001%200.611%201.638%200.546%20C%201.547%200.52%201.3130001%200.507%200.91%200.507%20C%200.624%200.507%200.507%200.481%200.507%200.19500001%20C%200.507%200.065%200.58500004%200%200.741%200%20L%202.379%200.039%20L%203.198%200.026%20C%203.341%200.026%203.887%200%204.03%200%20C%204.238%200%204.342%200.104%204.342%200.312%20C%204.342%200.442%204.199%200.507%203.926%200.507%20C%203.4060001%200.507%203.1460001%200.559%203.1460001%200.676%20C%203.1460001%200.676%203.1590002%200.71500003%203.1850002%200.884%20L%204.056%204.368%20L%207.8650002%204.368%20L%206.994%200.884%20C%206.955%200.689%206.7990003%200.559%206.539%200.52%20C%206.474%200.507%206.2530003%200.507%205.876%200.507%20C%205.629%200.507%205.512%200.403%205.512%200.19500001%20C%205.512%200.065%205.59%200%205.7460003%200%20L%207.3840003%200.039%20L%208.203%200.026%20C%208.346%200.026%208.879%200%209.048%200%20C%209.2560005%200%209.360001%200.104%209.360001%200.312%20C%209.360001%200.442%209.217%200.507%208.944%200.507%20C%208.411%200.507%208.151%200.559%208.151%200.676%20C%208.151%200.676%208.1640005%200.71500003%208.190001%200.884%20L%209.932%207.826%20C%209.997%208.099%2010.114%208.268001%2010.283%208.333%20C%2010.361%208.359%2010.582%208.372%2010.959001%208.372%20C%2011.297%208.372%2011.453%208.372%2011.453%208.684%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA6E22E1A936CF71CA47572B43AD6A447%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.6157002%204.0222%20C%206.3609004%204.0222%206.0879%203.7674003%206.0879%203.5126002%20C%206.0879%203.4307%206.1698003%203.3033001%206.3336%203.1304002%20C%206.4974003%202.9575002%206.5793004%202.7482002%206.5793004%202.5207002%20C%206.5793004%202.3205001%206.4701004%201.9292%206.2517004%201.3377%20C%206.0788%200.83720005%205.6693%200.2275%205.0869%200.2275%20C%204.6228004%200.2275%204.3953004%200.4823%204.3953004%200.9919%20C%204.3953004%201.547%204.7775%202.7846%204.9413004%203.3852%20C%204.9686003%203.5035002%204.9868%203.5763001%204.9868%203.6036003%20C%204.9868%203.7856002%204.8321004%203.9221%204.6501%203.9221%20C%204.4226003%203.9221%204.2861004%203.8311002%204.2315%203.64%20C%204.1041%203.1941001%203.8038%202.0111%203.7856002%201.9383001%20C%203.6946%201.5743%203.6491%201.2922001%203.64%201.1011001%20C%203.6673002%200.94640005%203.5854%200.75530005%203.3943002%200.50960004%20C%203.2396002%200.3185%203.0485%200.2275%202.821%200.2275%20C%202.3023%200.2275%202.0475001%200.49140003%202.0475001%201.0192001%20C%202.0475001%201.3377%202.1931%201.8564001%202.4752002%202.5753002%20C%202.6026%202.9029002%202.6663%203.1213002%202.6663%203.2214%20C%202.6663%203.6855001%202.2477%204.0131%201.7745001%204.0131%20C%201.3377%204.0131%200.9919%203.7947001%200.7462%203.367%20C%200.53690004%203.003%200.4277%202.7482002%200.4277%202.6117%20C%200.4277%202.5116%200.49140003%202.457%200.61880004%202.457%20C%200.7189%202.457%200.78260005%202.5116%200.80990005%202.6299002%20C%201.0283%203.3397002%201.3377%203.6946%201.7472%203.6946%20C%201.8746%203.6946%201.9383001%203.6036003%201.9383001%203.4125001%20C%201.9383001%203.2851002%201.9019%203.1213002%201.82%202.9120002%20C%201.6562%202.4934%201.5379001%202.1658%201.4560001%201.9292%20C%201.3559%201.6107%201.3013%201.3468001%201.3013%201.1375%20C%201.3013%200.2912%201.9019%20-0.091000006%202.7846%20-0.091000006%20C%203.1941001%20-0.091000006%203.5308%200.1001%203.8038%200.47320002%20C%204.0313%200.1001%204.4408%20-0.091000006%205.0505004%20-0.091000006%20C%205.6329%20-0.091000006%206.1061%200.2639%206.4610004%200.98280007%20C%206.7249002%201.5015%207.0980005%202.6026%207.0980005%203.276%20C%207.0980005%203.6582003%206.9342003%204.0222%206.6157002%204.0222%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gBF441491D650852933F0AA730170C5BF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.3400002%204.329%20C%202.0410001%204.056%201.6185%203.9195%201.066%203.9195%20L%200.92950004%203.9195%20L%200.92950004%203.5815%20L%201.066%203.5815%20C%201.3975%203.5815%201.6965001%203.64%201.9695001%203.7505%20L%201.9695001%200.57850003%20C%201.9695001%200.507%201.963%200.455%201.9435%200.42900002%20C%201.911%200.36400002%201.7030001%200.3315%201.3195%200.3315%20L%200.975%200.3315%20L%200.975%200%20C%201.2285%200.0195%201.664%200.026%202.288%200.026%20C%202.9120002%200.026%203.3475%200.0195%203.601%200%20L%203.601%200.3315%20L%203.2565%200.3315%20C%202.8730001%200.3315%202.665%200.36400002%202.6260002%200.42900002%20C%202.6130002%200.455%202.6065001%200.507%202.6065001%200.57850003%20L%202.6065001%204.1080003%20C%202.6065001%204.329%202.5805001%204.329%202.3400002%204.329%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC898B3495D6F31A5F8D8F6DCFCE49FA2%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.5379001%201.0465001%20C%201.2467%201.0465001%201.0192001%200.80990005%201.0192001%200.50960004%20C%201.0192001%200.1911%201.2376001%20-0.045500003%201.547%20-0.045500003%20C%201.6653%20-0.045500003%201.7745001%20-0.0091%201.8655001%200.0546%20C%201.8473%20-0.546%201.6289%20-1.0556%201.2103001%20-1.4651%20C%201.1648%20-1.5106001%201.1375%20-1.547%201.1375%20-1.5925001%20C%201.1375%20-1.7017001%201.1921%20-1.7563001%201.2922001%20-1.7563001%20C%201.3559%20-1.7563001%201.4469%20-1.6835%201.5834%20-1.5379001%20C%201.8837001%20-1.2103001%202.1749%20-0.546%202.1749%200.045500003%20C%202.1749%200.546%201.9929001%201.0465001%201.5379001%201.0465001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1928CEC6E065D8496B1E1E47395F0ECF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%200.98800004%202.756%20C%201.222%202.756%201.391%202.925%201.391%203.1590002%20C%201.391%203.3865001%201.274%203.523%201.0465%203.562%20C%201.248%203.8545%201.5600001%203.9975002%201.9825001%203.9975002%20C%202.6000001%203.9975002%203.094%203.614%203.094%203.016%20C%203.094%202.6065001%202.808%202.158%202.236%201.6705%20L%200.676%200.338%20C%200.624%200.29250002%200.598%200.2535%200.5915%200.221%20L%200.5915%200%20L%203.614%200%20L%203.835%201.2935001%20L%203.51%201.2935001%20C%203.4515002%200.9425%203.3930001%200.7475%203.3345%200.702%20C%203.302%200.6825%203.0745%200.6695%202.665%200.6695%20L%201.4885%200.6695%20C%202.3270001%201.2870001%202.509%201.4105%203.0485%201.794%20C%203.3085%201.9825001%203.4905%202.158%203.601%202.3205001%20C%203.7505%202.548%203.8285%202.782%203.8285%203.0225%20C%203.8285%203.4580002%203.64%203.7895%203.2695%204.0235%20C%202.951%204.225%202.5675%204.329%202.1125%204.329%20C%201.7290001%204.329%201.391%204.2315%201.0985%204.043%20C%200.7605%203.8285%200.5915%203.536%200.5915%203.1720002%20C%200.5915%202.925%200.78650004%202.756%200.98800004%202.756%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.5692090909090908em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; with a simple sum.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%20166.8540222222222%2015.497999999999998%22%20width%3D%22166.8540222222222pt%22%20height%3D%2215.497999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%209.619399999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g916A0FDC7B1E38973AC21AE8A18C7097%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2812.726%204.537399999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3D8B5710B01B27E735F12F138C779193%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2811.354000000000001%2013.077399999999997%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD542F1C4FBE62D49FD45FA11C76082CD%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2819.4488%2015.497999999999998%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC16502AFD0E9C28D25330148E73591AE%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2824.764599999999998%2013.077399999999997%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA4045F1A2DDEF46A8E6AD78A2F3130A7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2828.0868%2013.077399999999997%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD542F1C4FBE62D49FD45FA11C76082CD%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2836.1816%2015.497999999999998%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB988DF0790AB6D7865A852A7ADA9ABA3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2846.170288888888884%209.619399999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3910D3FF68908CF90C5DA3A134B55046%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2860.95117777777778%209.619399999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g916A0FDC7B1E38973AC21AE8A18C7097%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2873.67717777777777%204.537399999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3D8B5710B01B27E735F12F138C779193%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2872.30517777777779%2013.077399999999997%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF4B58B14EB19A505C11EA3FCC4A53BA1%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gDB2943FFBC6DC044D5055755D408F24A%22%20x%3D%223.8611999999999997%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gEA99451C33DDC9992351AB86326E9111%22%20x%3D%227.673399999999999%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9B7E807C2DC207656E84155EB328974E%22%20x%3D%2212.5734%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gDB2943FFBC6DC044D5055755D408F24A%22%20x%3D%2216.415%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2896.42748888888889%209.619399999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAFE0A8BCDA9876748FDA14F9102DEC98%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28110.4306%209.619399999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g2F6198AAB0E04D660D35A7CB2E805FA0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28117.7806%204.537399999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3D8B5710B01B27E735F12F138C779193%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28115.8906%2013.077399999999997%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD542F1C4FBE62D49FD45FA11C76082CD%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28123.9854%2015.497999999999998%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC16502AFD0E9C28D25330148E73591AE%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28133.1963111111111%209.619399999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAFE0A8BCDA9876748FDA14F9102DEC98%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28147.1994222222222%209.619399999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g2F6198AAB0E04D660D35A7CB2E805FA0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28154.5494222222222%204.537399999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3D8B5710B01B27E735F12F138C779193%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28152.65942222222222%2013.077399999999997%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD542F1C4FBE62D49FD45FA11C76082CD%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28160.75422222222218%2015.497999999999998%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB988DF0790AB6D7865A852A7ADA9ABA3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g916A0FDC7B1E38973AC21AE8A18C7097%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2012.334001%209.352%20C%2012.334001%209.492001%2012.25%209.562%2012.082001%209.562%20L%2010.304%209.52%20L%208.526%209.562%20C%208.302%209.562%208.204%209.436%208.204%209.226%20C%208.204%209.128%208.246%209.058001%208.316%209.044001%20C%208.456%209.030001%208.568%209.016001%208.6380005%209.016001%20C%209.0720005%209.002%209.31%208.974%209.38%208.96%20C%209.450001%208.946%209.492001%208.904%209.492001%208.834001%20C%209.478001%208.792%209.464001%208.708%209.436%208.582001%20L%208.610001%205.25%20L%204.494%205.25%20L%205.306%208.428%20C%205.3760004%208.722%205.5020003%208.904%205.684%208.974%20C%205.782%209.002%206.02%209.016001%206.412%209.016001%20C%206.7900004%209.016001%206.9440002%209.016001%206.9440002%209.352%20C%206.9440002%209.492001%206.86%209.562%206.6920004%209.562%20L%204.914%209.52%20L%203.122%209.562%20C%202.898%209.562%202.8000002%209.436%202.8000002%209.226%20C%202.8000002%209.128%202.842%209.058001%202.926%209.044001%20C%203.066%209.030001%203.1780002%209.016001%203.2480001%209.016001%20C%203.6820002%209.002%203.934%208.974%204.004%208.96%20C%204.0740004%208.946%204.102%208.904%204.102%208.834001%20C%204.102%208.806001%204.0880003%208.722%204.046%208.582001%20L%202.184%201.148%20C%202.114%200.84000003%201.9740001%200.658%201.764%200.588%20C%201.666%200.56%201.414%200.546%200.98%200.546%20C%200.67200005%200.546%200.546%200.518%200.546%200.21000001%20C%200.546%200.07%200.63%200%200.79800004%200%20L%202.562%200.042000003%20L%203.444%200.028%20C%203.598%200.028%204.1860003%200%204.34%200%20C%204.564%200%204.676%200.112%204.676%200.33600003%20C%204.676%200.476%204.5220003%200.546%204.228%200.546%20C%203.6680002%200.546%203.388%200.602%203.388%200.72800004%20C%203.388%200.72800004%203.4020002%200.77000004%203.43%200.952%20L%204.368%204.704%20L%208.47%204.704%20L%207.532%200.952%20C%207.4900002%200.74200004%207.322%200.602%207.0420003%200.56%20C%206.972%200.546%206.734%200.546%206.328%200.546%20C%206.0620003%200.546%205.9360003%200.43400002%205.9360003%200.21000001%20C%205.9360003%200.07%206.02%200%206.188%200%20L%207.952%200.042000003%20L%208.834001%200.028%20C%208.988%200.028%209.562%200%209.744%200%20C%209.968%200%2010.08%200.112%2010.08%200.33600003%20C%2010.08%200.476%209.926001%200.546%209.632%200.546%20C%209.058001%200.546%208.778%200.602%208.778%200.72800004%20C%208.778%200.72800004%208.792%200.77000004%208.820001%200.952%20L%2010.696%208.428%20C%2010.766001%208.722%2010.892%208.904%2011.074%208.974%20C%2011.158%209.002%2011.396%209.016001%2011.802%209.016001%20C%2012.166%209.016001%2012.334001%209.016001%2012.334001%209.352%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3D8B5710B01B27E735F12F138C779193%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.254%202.793%20L%201.127%203.6064%20C%200.9702%203.7338%200.74480003%203.6652%200.6468%203.4986%20C%200.5488%203.332%200.60760003%203.0968%200.78400004%203.0184%20L%202.058%202.45%20L%200.78400004%201.8914%20C%200.60760003%201.813%200.5488%201.5778%200.6468%201.4112%20C%200.74480003%201.2446%200.9702%201.176%201.127%201.2936%20L%202.254%202.1168%20L%202.107%200.735%20C%202.0874%200.5292%202.2638001%200.37240002%202.45%200.37240002%20C%202.6362%200.37240002%202.8126001%200.5292%202.793%200.735%20L%202.6460001%202.1168%20L%203.773%201.2936%20C%203.9396%201.176%204.1552%201.2446%204.2532%201.4112%20C%204.3512%201.5778%204.2924%201.813%204.116%201.8914%20L%202.842%202.45%20L%204.116%203.0184%20C%204.2924%203.0968%204.3512%203.332%204.2532%203.4986%20C%204.1552%203.6652%203.9298%203.7338%203.773%203.6064%20L%202.6460001%202.793%20L%202.793%204.1748%20C%202.8126001%204.3708%202.6362%204.5374002%202.45%204.5374002%20C%202.2638001%204.5374002%202.0874%204.3708%202.107%204.1748%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD542F1C4FBE62D49FD45FA11C76082CD%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.1246%204.3316%20C%206.8502%204.3316%206.5562%204.0572%206.5562%203.7828%20C%206.5562%203.6946%206.6444%203.5574%206.8208003%203.3712%20C%206.9972%203.185%207.0854%202.9596%207.0854%202.7146%20C%207.0854%202.499%206.9678%202.0776%206.7326%201.4406%20C%206.5464%200.9016%206.1054%200.245%205.4782%200.245%20C%204.9784%200.245%204.7334%200.5194%204.7334%201.0682%20C%204.7334%201.666%205.145%202.9988%205.3214%203.6456%20C%205.3508%203.773%205.3704%203.8514001%205.3704%203.8808%20C%205.3704%204.0768%205.2038%204.2238%205.0078%204.2238%20C%204.7628%204.2238%204.6158%204.1258%204.557%203.92%20C%204.4198003%203.4398%204.0964003%202.1658%204.0768%202.0874%20C%203.9788%201.6954%203.9298%201.3916%203.92%201.1858%20C%203.9494%201.0192%203.8612%200.81340003%203.6554%200.5488%20C%203.4888%200.343%203.283%200.245%203.038%200.245%20C%202.4794%200.245%202.205%200.5292%202.205%201.0976%20C%202.205%201.4406%202.3618%201.9992%202.6656%202.7734%20C%202.8028%203.1262%202.8714%203.3614001%202.8714%203.4692001%20C%202.8714%203.969%202.4206%204.3218%201.911%204.3218%20C%201.4406%204.3218%201.0682%204.0866%200.8036%203.626%20C%200.5782%203.234%200.46060002%202.9596%200.46060002%202.8126001%20C%200.46060002%202.7048001%200.5292%202.6460001%200.6664%202.6460001%20C%200.7742%202.6460001%200.8428%202.7048001%200.8722%202.8322%20C%201.1074001%203.5966%201.4406%203.9788%201.8816%203.9788%20C%202.0188%203.9788%202.0874%203.8808%202.0874%203.675%20C%202.0874%203.5378%202.0482001%203.3614001%201.96%203.1360002%20C%201.7836%202.6852%201.6562%202.3324%201.5680001%202.0776%20C%201.4602001%201.7346001%201.4014%201.4504%201.4014%201.225%20C%201.4014%200.3136%202.0482001%20-0.098000005%202.9988%20-0.098000005%20C%203.4398%20-0.098000005%203.8024%200.1078%204.0964003%200.5096%20C%204.3414%200.1078%204.7824%20-0.098000005%205.439%20-0.098000005%20C%206.0662003%20-0.098000005%206.5758%200.2842%206.958%201.0584%20C%207.2422%201.617%207.644%202.8028%207.644%203.528%20C%207.644%203.9396%207.4676%204.3316%207.1246%204.3316%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC16502AFD0E9C28D25330148E73591AE%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.52%204.662%20C%202.198%204.368%201.743%204.221%201.148%204.221%20L%201.001%204.221%20L%201.001%203.857%20L%201.148%203.857%20C%201.505%203.857%201.827%203.92%202.121%204.039%20L%202.121%200.623%20C%202.121%200.546%202.114%200.49%202.0930002%200.462%20C%202.058%200.39200002%201.8340001%200.35700002%201.421%200.35700002%20L%201.0500001%200.35700002%20L%201.0500001%200%20C%201.3230001%200.021000002%201.792%200.028%202.464%200.028%20C%203.1360002%200.028%203.605%200.021000002%203.878%200%20L%203.878%200.35700002%20L%203.5070002%200.35700002%20C%203.094%200.35700002%202.8700001%200.39200002%202.828%200.462%20C%202.8140001%200.49%202.8070002%200.546%202.8070002%200.623%20L%202.8070002%204.4240003%20C%202.8070002%204.662%202.779%204.662%202.52%204.662%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA4045F1A2DDEF46A8E6AD78A2F3130A7%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.6562%201.127%20C%201.3426%201.127%201.0976%200.8722%201.0976%200.5488%20C%201.0976%200.2058%201.3328%20-0.049000002%201.666%20-0.049000002%20C%201.7934%20-0.049000002%201.911%20-0.0098%202.009%200.0588%20C%201.9894%20-0.588%201.7542%20-1.1368%201.3034%20-1.5778%20C%201.2544%20-1.6268001%201.225%20-1.666%201.225%20-1.715%20C%201.225%20-1.8326%201.2838%20-1.8914%201.3916%20-1.8914%20C%201.4602001%20-1.8914%201.5582%20-1.813%201.7052001%20-1.6562%20C%202.0286%20-1.3034%202.3422%20-0.588%202.3422%200.049000002%20C%202.3422%200.588%202.1462%201.127%201.6562%201.127%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB988DF0790AB6D7865A852A7ADA9ABA3%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.064%202.9680002%20C%201.316%202.9680002%201.498%203.15%201.498%203.4020002%20C%201.498%203.647%201.3720001%203.7940001%201.1270001%203.8360002%20C%201.3440001%204.151%201.6800001%204.3050003%202.135%204.3050003%20C%202.8000002%204.3050003%203.332%203.8920002%203.332%203.2480001%20C%203.332%202.8070002%203.0240002%202.3240001%202.408%201.799%20L%200.72800004%200.36400002%20C%200.67200005%200.315%200.644%200.273%200.637%200.238%20L%200.637%200%20L%203.8920002%200%20L%204.13%201.393%20L%203.7800002%201.393%20C%203.717%201.015%203.654%200.805%203.591%200.75600004%20C%203.556%200.735%203.311%200.721%202.8700001%200.721%20L%201.603%200.721%20C%202.506%201.386%202.7020001%201.519%203.283%201.932%20C%203.5630002%202.135%203.759%202.3240001%203.878%202.499%20C%204.039%202.7440002%204.123%202.996%204.123%203.255%20C%204.123%203.7240002%203.92%204.0810003%203.5210001%204.333%20C%203.1780002%204.55%202.765%204.662%202.275%204.662%20C%201.8620001%204.662%201.498%204.557%201.1830001%204.354%20C%200.819%204.123%200.637%203.808%200.637%203.4160001%20C%200.637%203.15%200.847%202.9680002%201.064%202.9680002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3910D3FF68908CF90C5DA3A134B55046%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.576%204.34%20C%209.716001%204.4100003%209.786%204.5080004%209.786%204.662%20C%209.786%204.816%209.716001%204.928%209.576%204.998%20L%201.5400001%208.806001%20C%201.498%208.820001%201.442%208.834001%201.386%208.834001%20C%201.1620001%208.834001%201.0500001%208.722%201.0500001%208.484%20C%201.0500001%208.358%201.12%208.26%201.246%208.204%20L%208.722%204.662%20L%201.246%201.12%20C%201.12%201.064%201.0500001%200.966%201.0500001%200.84000003%20C%201.0500001%200.602%201.1620001%200.49%201.386%200.49%20C%201.442%200.49%201.498%200.504%201.5400001%200.532%20Z%20M%209.492001%20-1.008%20L%201.4000001%20-1.008%20C%201.176%20-1.008%201.064%20-1.12%201.064%20-1.33%20C%201.064%20-1.554%201.176%20-1.666%201.4000001%20-1.666%20L%209.492001%20-1.666%20C%209.716001%20-1.666%209.828%20-1.554%209.828%20-1.33%20C%209.828%20-1.1620001%209.674001%20-1.008%209.492001%20-1.008%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF4B58B14EB19A505C11EA3FCC4A53BA1%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.528%201.274%20C%203.528%202.0188%203.0184%202.4892%202.009%202.6852%20C%201.5484%202.7734%201.2544%202.8812%201.0976%202.989%20C%200.9408%203.0968%200.8624%203.2536001%200.8624%203.4398%20C%200.8624%203.9004002%201.2054%204.1258%201.8914%204.1258%20C%202.5578%204.1258%202.9204001%203.7534%202.9694%202.9988%20C%202.9792001%202.9204001%203.0282001%202.8812%203.1262%202.8812%20C%203.234%202.8812%203.2928%202.9694%203.2928%203.1458%20L%203.2928%204.116%20C%203.2928%204.3022%203.2438%204.3904%203.1458%204.3904%20C%203.038%204.3904%202.891%204.214%202.793%204.1356%20C%202.548%204.3022%202.2442%204.3904%201.8914%204.3904%20C%201.0192%204.3904%200.3234%203.9984%200.3234%203.1654%20C%200.3234%202.8322%200.46060002%202.548%200.74480003%202.3226001%20C%201.0878%202.0384%201.4112%201.9796001%202.0286%201.8718001%20C%202.6656%201.7444%202.989%201.4602001%202.989%201.0192%20C%202.989%200.46060002%202.6460001%200.1764%201.9502001%200.1764%20C%201.274%200.1764%200.8428%200.6272%200.6566%201.519%20C%200.6272%201.6464%200.5782%201.715%200.49%201.715%20C%200.3822%201.715%200.3234%201.617%200.3234%201.4308%20L%200.3234%200.1666%20C%200.3234%20-0.0196%200.37240002%20-0.1078%200.4704%20-0.1078%20C%200.4998%20-0.1078%200.5488%20-0.0784%200.6272%20-0.0098%20C%200.8036%200.147%200.7252%200.1176%200.9016%200.294%20C%201.1858%200.0294%201.5386%20-0.1078%201.9502001%20-0.1078%20C%202.8812%20-0.1078%203.528%200.37240002%203.528%201.274%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gDB2943FFBC6DC044D5055755D408F24A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.2536001%201.2348%20L%203.2536001%201.8228%20L%202.94%201.8228%20L%202.94%201.2544%20C%202.94%200.7644%202.7636%200.2156%202.3324%200.2156%20C%201.9306%200.2156%201.7346001%200.5488%201.7346001%201.2152001%20L%201.7346001%203.871%20L%203.0968%203.871%20L%203.0968%204.2434%20L%201.7346001%204.2434%20L%201.7346001%206.027%20L%201.421%206.027%20C%201.4112%205.7036%201.3818%205.4194%201.3132%205.1646%20C%201.1466%204.5178%200.7644%204.1846%200.18620001%204.1552%20L%200.18620001%203.871%20L%200.9996%203.871%20L%200.9996%201.2348%20C%200.9996%200.6566%201.176%200.2842%201.519%200.098000005%20C%201.7836%20-0.0392%202.0286%20-0.1078%202.2736%20-0.1078%20C%202.9204001%20-0.1078%203.2536001%200.53900003%203.2536001%201.2348%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gEA99451C33DDC9992351AB86326E9111%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.7334%200.8918%20L%204.7334%201.47%20L%204.4198003%201.47%20L%204.4198003%200.8918%20C%204.4198003%200.5096%204.3120003%200.3136%204.1062%200.3136%20C%203.9102%200.3136%203.7926002%200.5586%203.7926002%200.7546%20L%203.7926002%202.6852%20C%203.7926002%203.0282001%203.7534%203.283%203.6848001%203.4594%20C%203.4496%204.0376%202.7734%204.3904%202.0874%204.3904%20C%201.3328%204.3904%200.588%203.969%200.588%203.2634%20C%200.588%202.94%200.7546%202.7734%201.0780001%202.7734%20C%201.4014%202.7734%201.5582%202.9302%201.5582%203.2536001%20C%201.5582%203.5378%201.4112%203.7044%201.1074001%203.7338%20C%201.3230001%203.9788%201.6464%204.1062%202.0678%204.1062%20C%202.6754%204.1062%203.0478%203.5476%203.0478%202.9106%20L%203.0478%202.5872%20C%202.2834%202.5382001%201.7052001%202.4206%201.3034%202.2344%20C%200.6468%201.9306%200.3136%201.5092%200.3136%200.9506%20C%200.3136%200.6958%200.4116%200.4802%200.5978%200.3136%20C%200.9114%200.0294%201.3426%20-0.1078%201.8914%20-0.1078%20C%202.4696%20-0.1078%202.8812%200.1372%203.1360002%200.637%20C%203.2046%200.2646%203.479%20-0.0588%203.9004002%20-0.0588%20C%204.4198003%20-0.0588%204.7334%200.3528%204.7334%200.8918%20Z%20M%201.96%200.1764%20C%201.5092%200.1764%201.1368%200.5096%201.1368%200.9604%20C%201.1368%201.8718001%202.0874%202.2638001%203.0478%202.3128%20L%203.0478%201.3818%20C%203.0478%200.7252%202.6166%200.1764%201.96%200.1764%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9B7E807C2DC207656E84155EB328974E%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.5672%203.7044%20C%203.5672%204.0866%203.2046%204.3316%202.8224%204.3316%20C%202.3226001%204.3316%201.9404%204.0376%201.6856%203.4398%20L%201.6856%204.3316%20L%200.2744%204.2238%20L%200.2744%203.8514001%20C%200.6174%203.8514001%200.8232%203.822%200.9016%203.7632%20C%200.98%203.7044%201.0192%203.5770001%201.0192%203.3516%20L%201.0192%200.7742%20C%201.0192%200.588%200.98980004%200.4704%200.92120004%200.4312%20C%200.85260004%200.39200002%200.637%200.37240002%200.2744%200.37240002%20L%200.2744%200%20L%201.4014%200.0294%20C%201.813%200.0392%202.2344%200.0294%202.6558%200%20L%202.6558%200.37240002%20L%202.4206%200.37240002%20C%202.0972%200.37240002%201.8914%200.4018%201.8228%200.4508%20C%201.7542%200.4998%201.7248%200.6174%201.7248%200.7938%20L%201.7248%202.2736%20C%201.7248%202.695%201.8032%203.0772%201.9502001%203.4006%20C%202.1462%203.822%202.4304001%204.0376%202.8126001%204.0474%20C%202.7146%203.9494%202.6656%203.8318%202.6656%203.6946%20C%202.6656%203.3908%202.8126001%203.2438%203.1164%203.2438%20C%203.381%203.2438%203.5672%203.4496%203.5672%203.7044%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAFE0A8BCDA9876748FDA14F9102DEC98%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.772%203.7800002%20L%201.12%203.7800002%20C%200.896%203.7800002%200.78400004%203.6820002%200.78400004%203.5%20C%200.78400004%203.318%200.896%203.22%201.12%203.22%20L%209.772%203.22%20C%209.996%203.22%2010.108001%203.318%2010.108001%203.5%20C%2010.108001%203.6680002%209.940001%203.7800002%209.772%203.7800002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g2F6198AAB0E04D660D35A7CB2E805FA0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.958%209.338%20C%206.958%209.492001%206.874%209.562%206.6920004%209.562%20L%204.886%209.52%20L%203.052%209.562%20C%202.828%209.576%202.716%209.464001%202.716%209.226%20C%202.716%209.086%202.8700001%209.016001%203.164%209.016001%20C%203.766%209.016001%204.06%208.946%204.06%208.820001%20C%204.06%208.75%204.046%208.68%204.032%208.610001%20L%202.17%201.148%20C%202.1000001%200.84000003%201.96%200.658%201.75%200.588%20C%201.6520001%200.56%201.4000001%200.546%200.966%200.546%20C%200.616%200.546%200.476%200.532%200.476%200.21000001%20C%200.476%200.07%200.56%200%200.74200004%200%20L%202.5340002%200.042000003%20L%204.382%200%20C%204.606%20-0.014%204.718%200.098000005%204.718%200.322%20C%204.718%200.546%204.55%200.546%204.242%200.546%20C%203.696%200.546%203.3600001%200.518%203.3600001%200.74200004%20C%203.3600001%200.81200004%203.374%200.91%203.4160001%201.0500001%20L%205.264%208.428%20C%205.334%208.722%205.474%208.904%205.684%208.974%20C%205.782%209.002%206.0340004%209.016001%206.4680004%209.016001%20C%206.8040004%209.016001%206.958%209.030001%206.958%209.338%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-display typst-doc&quot; style=&quot; width: 15.168547474747472em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;If we find &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2083.03822222222222%2021.878999999999998%22%20width%3D%2283.03822222222222pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%206.5%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g42445E1EBAF5307FB8C297D0478333B9%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.543%2012.09%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA6E22E1A936CF71CA47572B43AD6A447%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2818.0596%2014.337700000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gBF441491D650852933F0AA730170C5BF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2822.995699999999996%2012.09%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC898B3495D6F31A5F8D8F6DCFCE49FA2%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2826.080599999999993%2012.09%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA6E22E1A936CF71CA47572B43AD6A447%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2833.597199999999994%2014.337700000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1928CEC6E065D8496B1E1E47395F0ECF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2842.87241111111111%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g5C604D13B30524419EF6FEF420594664%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2856.597522222222224%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g42445E1EBAF5307FB8C297D0478333B9%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2867.14052222222222%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7C707578FA33FC5F4974517BD3CD702D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3C402A3AAC495DD2DB174F02BB0D7DF0%22%20x%3D%227.5802999999999985%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6276E6C0547F2BCFEC62983F27BE06B8%22%20x%3D%2210.1101%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g42445E1EBAF5307FB8C297D0478333B9%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2011.453%208.684%20C%2011.453%208.814%2011.375%208.879%2011.219%208.879%20L%209.568%208.84%20L%207.9170003%208.879%20C%207.709%208.879%207.618%208.762%207.618%208.567%20C%207.618%208.476%207.657%208.411%207.722%208.398%20C%207.852%208.385%207.9560003%208.372%208.021%208.372%20C%208.424%208.359%208.645%208.333%208.71%208.32%20C%208.775001%208.307%208.814%208.268001%208.814%208.203%20C%208.801001%208.1640005%208.788%208.086%208.762%207.9690003%20L%207.9950004%204.875%20L%204.173%204.875%20L%204.927%207.826%20C%204.992%208.099%205.109%208.268001%205.278%208.333%20C%205.369%208.359%205.59%208.372%205.954%208.372%20C%206.3050003%208.372%206.448%208.372%206.448%208.684%20C%206.448%208.814%206.3700004%208.879%206.214%208.879%20L%204.563%208.84%20L%202.8990002%208.879%20C%202.691%208.879%202.6000001%208.762%202.6000001%208.567%20C%202.6000001%208.476%202.639%208.411%202.717%208.398%20C%202.8470001%208.385%202.951%208.372%203.016%208.372%20C%203.4190001%208.359%203.653%208.333%203.7180002%208.32%20C%203.783%208.307%203.809%208.268001%203.809%208.203%20C%203.809%208.177%203.796%208.099%203.757%207.9690003%20L%202.028%201.066%20C%201.963%200.78000003%201.8330001%200.611%201.638%200.546%20C%201.547%200.52%201.3130001%200.507%200.91%200.507%20C%200.624%200.507%200.507%200.481%200.507%200.19500001%20C%200.507%200.065%200.58500004%200%200.741%200%20L%202.379%200.039%20L%203.198%200.026%20C%203.341%200.026%203.887%200%204.03%200%20C%204.238%200%204.342%200.104%204.342%200.312%20C%204.342%200.442%204.199%200.507%203.926%200.507%20C%203.4060001%200.507%203.1460001%200.559%203.1460001%200.676%20C%203.1460001%200.676%203.1590002%200.71500003%203.1850002%200.884%20L%204.056%204.368%20L%207.8650002%204.368%20L%206.994%200.884%20C%206.955%200.689%206.7990003%200.559%206.539%200.52%20C%206.474%200.507%206.2530003%200.507%205.876%200.507%20C%205.629%200.507%205.512%200.403%205.512%200.19500001%20C%205.512%200.065%205.59%200%205.7460003%200%20L%207.3840003%200.039%20L%208.203%200.026%20C%208.346%200.026%208.879%200%209.048%200%20C%209.2560005%200%209.360001%200.104%209.360001%200.312%20C%209.360001%200.442%209.217%200.507%208.944%200.507%20C%208.411%200.507%208.151%200.559%208.151%200.676%20C%208.151%200.676%208.1640005%200.71500003%208.190001%200.884%20L%209.932%207.826%20C%209.997%208.099%2010.114%208.268001%2010.283%208.333%20C%2010.361%208.359%2010.582%208.372%2010.959001%208.372%20C%2011.297%208.372%2011.453%208.372%2011.453%208.684%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA6E22E1A936CF71CA47572B43AD6A447%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.6157002%204.0222%20C%206.3609004%204.0222%206.0879%203.7674003%206.0879%203.5126002%20C%206.0879%203.4307%206.1698003%203.3033001%206.3336%203.1304002%20C%206.4974003%202.9575002%206.5793004%202.7482002%206.5793004%202.5207002%20C%206.5793004%202.3205001%206.4701004%201.9292%206.2517004%201.3377%20C%206.0788%200.83720005%205.6693%200.2275%205.0869%200.2275%20C%204.6228004%200.2275%204.3953004%200.4823%204.3953004%200.9919%20C%204.3953004%201.547%204.7775%202.7846%204.9413004%203.3852%20C%204.9686003%203.5035002%204.9868%203.5763001%204.9868%203.6036003%20C%204.9868%203.7856002%204.8321004%203.9221%204.6501%203.9221%20C%204.4226003%203.9221%204.2861004%203.8311002%204.2315%203.64%20C%204.1041%203.1941001%203.8038%202.0111%203.7856002%201.9383001%20C%203.6946%201.5743%203.6491%201.2922001%203.64%201.1011001%20C%203.6673002%200.94640005%203.5854%200.75530005%203.3943002%200.50960004%20C%203.2396002%200.3185%203.0485%200.2275%202.821%200.2275%20C%202.3023%200.2275%202.0475001%200.49140003%202.0475001%201.0192001%20C%202.0475001%201.3377%202.1931%201.8564001%202.4752002%202.5753002%20C%202.6026%202.9029002%202.6663%203.1213002%202.6663%203.2214%20C%202.6663%203.6855001%202.2477%204.0131%201.7745001%204.0131%20C%201.3377%204.0131%200.9919%203.7947001%200.7462%203.367%20C%200.53690004%203.003%200.4277%202.7482002%200.4277%202.6117%20C%200.4277%202.5116%200.49140003%202.457%200.61880004%202.457%20C%200.7189%202.457%200.78260005%202.5116%200.80990005%202.6299002%20C%201.0283%203.3397002%201.3377%203.6946%201.7472%203.6946%20C%201.8746%203.6946%201.9383001%203.6036003%201.9383001%203.4125001%20C%201.9383001%203.2851002%201.9019%203.1213002%201.82%202.9120002%20C%201.6562%202.4934%201.5379001%202.1658%201.4560001%201.9292%20C%201.3559%201.6107%201.3013%201.3468001%201.3013%201.1375%20C%201.3013%200.2912%201.9019%20-0.091000006%202.7846%20-0.091000006%20C%203.1941001%20-0.091000006%203.5308%200.1001%203.8038%200.47320002%20C%204.0313%200.1001%204.4408%20-0.091000006%205.0505004%20-0.091000006%20C%205.6329%20-0.091000006%206.1061%200.2639%206.4610004%200.98280007%20C%206.7249002%201.5015%207.0980005%202.6026%207.0980005%203.276%20C%207.0980005%203.6582003%206.9342003%204.0222%206.6157002%204.0222%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gBF441491D650852933F0AA730170C5BF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.3400002%204.329%20C%202.0410001%204.056%201.6185%203.9195%201.066%203.9195%20L%200.92950004%203.9195%20L%200.92950004%203.5815%20L%201.066%203.5815%20C%201.3975%203.5815%201.6965001%203.64%201.9695001%203.7505%20L%201.9695001%200.57850003%20C%201.9695001%200.507%201.963%200.455%201.9435%200.42900002%20C%201.911%200.36400002%201.7030001%200.3315%201.3195%200.3315%20L%200.975%200.3315%20L%200.975%200%20C%201.2285%200.0195%201.664%200.026%202.288%200.026%20C%202.9120002%200.026%203.3475%200.0195%203.601%200%20L%203.601%200.3315%20L%203.2565%200.3315%20C%202.8730001%200.3315%202.665%200.36400002%202.6260002%200.42900002%20C%202.6130002%200.455%202.6065001%200.507%202.6065001%200.57850003%20L%202.6065001%204.1080003%20C%202.6065001%204.329%202.5805001%204.329%202.3400002%204.329%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC898B3495D6F31A5F8D8F6DCFCE49FA2%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.5379001%201.0465001%20C%201.2467%201.0465001%201.0192001%200.80990005%201.0192001%200.50960004%20C%201.0192001%200.1911%201.2376001%20-0.045500003%201.547%20-0.045500003%20C%201.6653%20-0.045500003%201.7745001%20-0.0091%201.8655001%200.0546%20C%201.8473%20-0.546%201.6289%20-1.0556%201.2103001%20-1.4651%20C%201.1648%20-1.5106001%201.1375%20-1.547%201.1375%20-1.5925001%20C%201.1375%20-1.7017001%201.1921%20-1.7563001%201.2922001%20-1.7563001%20C%201.3559%20-1.7563001%201.4469%20-1.6835%201.5834%20-1.5379001%20C%201.8837001%20-1.2103001%202.1749%20-0.546%202.1749%200.045500003%20C%202.1749%200.546%201.9929001%201.0465001%201.5379001%201.0465001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1928CEC6E065D8496B1E1E47395F0ECF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%200.98800004%202.756%20C%201.222%202.756%201.391%202.925%201.391%203.1590002%20C%201.391%203.3865001%201.274%203.523%201.0465%203.562%20C%201.248%203.8545%201.5600001%203.9975002%201.9825001%203.9975002%20C%202.6000001%203.9975002%203.094%203.614%203.094%203.016%20C%203.094%202.6065001%202.808%202.158%202.236%201.6705%20L%200.676%200.338%20C%200.624%200.29250002%200.598%200.2535%200.5915%200.221%20L%200.5915%200%20L%203.614%200%20L%203.835%201.2935001%20L%203.51%201.2935001%20C%203.4515002%200.9425%203.3930001%200.7475%203.3345%200.702%20C%203.302%200.6825%203.0745%200.6695%202.665%200.6695%20L%201.4885%200.6695%20C%202.3270001%201.2870001%202.509%201.4105%203.0485%201.794%20C%203.3085%201.9825001%203.4905%202.158%203.601%202.3205001%20C%203.7505%202.548%203.8285%202.782%203.8285%203.0225%20C%203.8285%203.4580002%203.64%203.7895%203.2695%204.0235%20C%202.951%204.225%202.5675%204.329%202.1125%204.329%20C%201.7290001%204.329%201.391%204.2315%201.0985%204.043%20C%200.7605%203.8285%200.5915%203.536%200.5915%203.1720002%20C%200.5915%202.925%200.78650004%202.756%200.98800004%202.756%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g5C604D13B30524419EF6FEF420594664%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%208.892%204.03%20C%209.022%204.0950003%209.087%204.186%209.087%204.329%20C%209.087%204.472%209.022%204.576%208.892%204.6410003%20L%201.4300001%208.177%20C%201.391%208.190001%201.339%208.203%201.2870001%208.203%20C%201.079%208.203%200.975%208.099%200.975%207.8780003%20C%200.975%207.761%201.04%207.67%201.1570001%207.618%20L%208.099%204.329%20L%201.1570001%201.04%20C%201.04%200.98800004%200.975%200.897%200.975%200.78000003%20C%200.975%200.559%201.079%200.455%201.2870001%200.455%20C%201.339%200.455%201.391%200.468%201.4300001%200.49400002%20Z%20M%208.814%20-0.936%20L%201.3000001%20-0.936%20C%201.092%20-0.936%200.98800004%20-1.04%200.98800004%20-1.235%20C%200.98800004%20-1.4430001%201.092%20-1.547%201.3000001%20-1.547%20L%208.814%20-1.547%20C%209.022%20-1.547%209.126%20-1.4430001%209.126%20-1.235%20C%209.126%20-1.079%208.983%20-0.936%208.814%20-0.936%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7C707578FA33FC5F4974517BD3CD702D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.8665001%203.7583%20C%203.2851002%203.7583%203.4944%203.4398%203.4944%202.7937002%20L%203.4944%200.7189%20C%203.4944%200.546%203.4671001%200.4368%203.4034002%200.4004%20C%203.3397002%200.36400002%203.1304002%200.3458%202.7937002%200.3458%20L%202.7937002%200%20L%203.8493001%200.0273%20L%204.8958%200%20L%204.8958%200.3458%20C%204.5591%200.3458%204.3589%200.36400002%204.2952003%200.4004%20C%204.2315%200.4368%204.1951003%200.546%204.1951003%200.7189%20L%204.1951003%202.3569002%20C%204.1951003%203.0849001%204.6683%203.7583%205.3690004%203.7583%20C%205.7967%203.7583%206.006%203.4398%206.006%202.7937002%20L%206.006%200.7189%20C%206.006%200.546%205.9696%200.4368%205.9059005%200.4004%20C%205.8422003%200.36400002%205.6329%200.3458%205.2962003%200.3458%20L%205.2962003%200%20L%206.3518004%200.0273%20L%207.3983%200%20L%207.3983%200.3458%20C%207.1071005%200.3458%206.9160004%200.3549%206.8250003%200.3822%20C%206.734%200.4095%206.6976004%200.47320002%206.6976004%200.5824%20L%206.6976004%202.2841%20C%206.6976004%202.7118%206.6794004%203.0121002%206.6521%203.1850002%20C%206.5611005%203.7401001%206.1516004%204.0222%205.4327%204.0222%20C%204.8594003%204.0222%204.4317%203.7583%204.1405%203.2214%20C%204.0131%203.7583%203.6127002%204.0222%202.9302%204.0222%20C%202.3569002%204.0222%201.9201001%203.7492%201.6289%203.2032%20L%201.6289%204.0222%20L%200.2912%203.9221%20L%200.2912%203.5763001%20C%200.61880004%203.5763001%200.819%203.5490003%200.89180005%203.4944%20C%200.9646%203.4398%200.9919%203.3215%200.9919%203.1122%20L%200.9919%200.7189%20C%200.9919%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3458%200.2912%200.3458%20L%200.2912%200%20L%201.3468001%200.0273%20L%202.3933%200%20L%202.3933%200.3458%20C%202.0566%200.3458%201.8473%200.36400002%201.7836001%200.4004%20C%201.7199%200.4368%201.6835%200.546%201.6835%200.7189%20L%201.6835%202.3569002%20C%201.6835%203.094%202.1658%203.7583%202.8665001%203.7583%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3C402A3AAC495DD2DB174F02BB0D7DF0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.7654%205.4691%20C%201.7654%205.7421002%201.5379001%205.9787%201.2649001%205.9787%20C%200.9919%205.9787%200.75530005%205.7421002%200.75530005%205.4691%20C%200.75530005%205.1961%200.98280007%204.9504004%201.2558%204.9504004%20C%201.5379001%204.9504004%201.7654%205.1870003%201.7654%205.4691%20Z%20M%201.3013%200.0273%20L%202.2477%200%20L%202.2477%200.3549%20C%201.9474001%200.3549%201.7654%200.3731%201.7108%200.4095%20C%201.6562%200.44590002%201.638%200.546%201.638%200.7098%20L%201.638%204.0495%20L%200.33670002%203.9403002%20L%200.33670002%203.5945%20C%200.637%203.5945%200.8281%203.5672002%200.89180005%203.5217001%20C%200.95550007%203.4762%200.98280007%203.3488002%200.98280007%203.1395001%20L%200.98280007%200.7189%20C%200.98280007%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3549%200.3003%200.3549%20L%200.3003%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6276E6C0547F2BCFEC62983F27BE06B8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.8574002%203.7583%20C%203.2669%203.7583%203.4762%203.4398%203.4762%202.7937002%20L%203.4762%200.7189%20C%203.4762%200.546%203.4489002%200.4368%203.3852%200.4004%20C%203.3215%200.36400002%203.1213002%200.3458%202.7846%200.3458%20L%202.7846%200%20L%203.8311002%200.0273%20L%204.8685%200%20L%204.8685%200.3458%20C%204.5773%200.3458%204.3862%200.3549%204.2952003%200.3822%20C%204.2042003%200.4095%204.1678%200.47320002%204.1678%200.5824%20L%204.1678%202.2841%20C%204.1678%202.7118%204.1587%203.0121002%204.1314%203.1850002%20C%204.0404%203.7401001%203.6309001%204.0222%202.9120002%204.0222%20C%202.3387%204.0222%201.9110001%203.7492%201.6289%203.2032%20L%201.6289%204.0222%20L%200.2912%203.9221%20L%200.2912%203.5763001%20C%200.61880004%203.5763001%200.819%203.5490003%200.89180005%203.4944%20C%200.9646%203.4398%200.9919%203.3215%200.9919%203.1122%20L%200.9919%200.7189%20C%200.9919%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3458%200.2912%200.3458%20L%200.2912%200%20L%201.3377%200.0273%20L%202.3751001%200%20L%202.3751001%200.3458%20C%202.0384002%200.3458%201.8473%200.36400002%201.7836001%200.4004%20C%201.7199%200.4368%201.6835%200.546%201.6835%200.7189%20L%201.6835%202.3569002%20C%201.6835%203.094%202.1476002%203.7583%202.8574002%203.7583%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 7.548929292929293em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, then we know that guessing &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2036.208466666666666%2021.878999999999998%22%20width%3D%2236.208466666666666pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF5A736AF78F00E66632FD1D047F362F0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.308%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7A5F85FE66C6FD3E604C68F5A7949524%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.213899999999999%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA5EFA28F31DFDD7E2EC069AC1C132FF5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2820.994566666666664%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF5A736AF78F00E66632FD1D047F362F0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2830.302566666666664%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g86111C2D5C8682C53BDA9AD6152C9992%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF5A736AF78F00E66632FD1D047F362F0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.67%205.083%20C%207.67%204.966%207.735%204.836%207.8780003%204.7060003%20C%208.177%204.42%208.333%204.0690002%208.333%203.653%20C%208.333%203.4320002%208.255%203.081%208.099%202.5740001%20C%207.618%201.014%207.007%200.234%206.2660003%200.234%20C%205.655%200.234%205.356%200.58500004%205.356%201.3000001%20C%205.356%201.547%205.408%201.8460001%205.499%202.223%20C%205.7330003%203.1590002%205.98%204.0820003%206.201%205.031%20C%206.227%205.122%206.2400002%205.1740003%206.2400002%205.2130003%20C%206.2400002%205.473%206.097%205.603%205.8110003%205.603%20C%205.551%205.603%205.382%205.473%205.291%205.2130003%20L%204.771%203.1850002%20C%204.576%202.431%204.433%202.171%204.433%201.495%20C%204.433%201.391%204.433%201.3130001%204.446%201.274%20C%204.1470003%200.58500004%203.77%200.234%203.315%200.234%20C%202.665%200.234%202.3400002%200.611%202.3400002%201.352%20C%202.3400002%201.8330001%202.561%202.652%203.003%203.809%20C%203.1460001%204.199%203.224%204.472%203.224%204.6410003%20C%203.224%205.278%202.756%205.7460003%202.119%205.7460003%20C%201.534%205.7460003%201.092%205.421%200.767%204.771%20C%200.507%204.264%200.377%203.913%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.754%203.549%200.78000003%203.627%200.832%203.809%20C%201.144%204.849%201.5600001%205.369%202.08%205.369%20C%202.262%205.369%202.3530002%205.2390003%202.3530002%204.992%20C%202.3530002%204.797%202.275%204.511%202.132%204.1210003%20C%201.651%202.8600001%201.404%202.002%201.404%201.521%20C%201.404%200.416%202.145%20-0.143%203.276%20-0.143%20C%203.822%20-0.143%204.264%200.13%204.6150002%200.689%20C%204.875%200.13%205.408%20-0.143%206.227%20-0.143%20C%207.033%20-0.143%207.67%200.39000002%208.125%201.4560001%20C%208.424%202.132%208.983%203.926%208.983%204.797%20C%208.983%204.992%208.97%205.122%208.957%205.1870003%20C%208.905%205.434%208.658%205.7460003%208.372%205.7460003%20C%208.034%205.7460003%207.67%205.421%207.67%205.083%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7A5F85FE66C6FD3E604C68F5A7949524%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.7573001%206.0424004%20C%202.3660002%205.6602%201.7836001%205.4691%200.9919%205.4691%20L%200.9919%205.0687003%20C%201.5288%205.0687003%201.9565%205.1506004%202.2841%205.3053%20L%202.2841%200.7735%20C%202.2841%200.6552%202.275%200.5824%202.2477%200.546%20C%202.2022002%200.44590002%201.9292%200.39130002%201.4287001%200.39130002%20L%201.0556%200.39130002%20L%201.0556%200%20L%202.6754%200.0364%20L%204.3043003%200%20L%204.3043003%200.39130002%20L%203.9312003%200.39130002%20C%203.4307%200.39130002%203.1577%200.44590002%203.1031%200.546%20C%203.0849001%200.5824%203.0758002%200.6552%203.0758002%200.7735%20L%203.0758002%205.7512%20C%203.0758002%205.9969%203.0394%206.0424004%202.7573001%206.0424004%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA5EFA28F31DFDD7E2EC069AC1C132FF5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.807%201.378%20C%201.391%201.378%201.118%201.066%201.118%200.65000004%20C%201.118%200.26%201.417%20-0.065%201.807%20-0.065%20C%201.9890001%20-0.065%202.145%20-0.013%202.262%200.104%20L%202.275%200%20C%202.275%20-0.819%202.002%20-1.521%201.4560001%20-2.08%20C%201.365%20-2.184%201.3130001%20-2.262%201.3130001%20-2.3140001%20C%201.3130001%20-2.444%201.365%20-2.509%201.482%20-2.509%20C%201.599%20-2.509%201.755%20-2.3530002%201.9760001%20-2.0540001%20C%202.418%20-1.4300001%202.639%20-0.741%202.639%200%20C%202.639%200.689%202.405%201.378%201.807%201.378%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g86111C2D5C8682C53BDA9AD6152C9992%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0829%203.8584%20C%201.3741001%203.8584%201.5925001%204.0768003%201.5925001%204.368%20C%201.5925001%204.6956%201.4196%204.8685%201.0829%204.8776%20C%201.2831%205.3053%201.7381%205.6511%202.3296%205.6511%20C%203.1304002%205.6511%203.6582003%205.0505004%203.6582003%204.2497%20C%203.6582003%203.8129%203.5035002%203.3943002%203.1850002%202.9848%20C%203.0303001%202.7755%202.9120002%202.6299002%202.8301%202.548%20L%200.67340004%200.4095%20C%200.5551%200.3003%200.5733%200.273%200.5733%200%20L%204.3225%200%20L%204.6046%201.7108%20L%204.2224%201.7108%20C%204.1587%201.2285%204.0859003%200.94640005%204.004%200.8827%20C%203.9585001%200.8554%203.6764002%200.83720005%203.1395001%200.83720005%20L%201.5925001%200.83720005%20C%202.2022002%201.3741001%202.7664%201.8564001%203.3033001%202.2841%20C%203.7128003%202.6026%204.004%202.8847%204.1860003%203.1304002%20C%204.459%203.4853%204.5955%203.8584%204.5955%204.2497%20C%204.5955%204.8139%204.3771%205.2598004%203.9312003%205.5874004%20C%203.5399%205.8877%203.0485%206.0424004%202.4661002%206.0424004%20C%201.9656001%206.0424004%201.5379001%205.8968%201.1648%205.6056004%20C%200.7735%205.2871003%200.5733%204.8867%200.5733%204.3953004%20C%200.5733%204.0859003%200.8008%203.8584%201.0829%203.8584%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.2916787878787876em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; will never yield a better result.
That means we can skip the process of grading every possible solution, and simply throw away that
guess.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-new-word-order&quot;&gt;The new word order&lt;&#x2F;h3&gt;
&lt;p&gt;Once we have this pruning technique, the next step is obvious: we want
to get the best possible value of &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2030.053399999999996%2021.878999999999998%22%20width%3D%2230.053399999999996pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g42445E1EBAF5307FB8C297D0478333B9%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.543%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gE9415263C11E60DC5CFBBA09ADE8FC8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC5B71332A0E90E792E3FAAE3C83A1E5A%22%20x%3D%223.5853999999999995%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g244F502A10CDC70DE9AAA4877DC1FE65%22%20x%3D%227.125299999999999%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3BD2AAC8F92468FB204CF6E7AF8DFF03%22%20x%3D%2211.675299999999998%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC5B71332A0E90E792E3FAAE3C83A1E5A%22%20x%3D%2215.242499999999998%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g42445E1EBAF5307FB8C297D0478333B9%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2011.453%208.684%20C%2011.453%208.814%2011.375%208.879%2011.219%208.879%20L%209.568%208.84%20L%207.9170003%208.879%20C%207.709%208.879%207.618%208.762%207.618%208.567%20C%207.618%208.476%207.657%208.411%207.722%208.398%20C%207.852%208.385%207.9560003%208.372%208.021%208.372%20C%208.424%208.359%208.645%208.333%208.71%208.32%20C%208.775001%208.307%208.814%208.268001%208.814%208.203%20C%208.801001%208.1640005%208.788%208.086%208.762%207.9690003%20L%207.9950004%204.875%20L%204.173%204.875%20L%204.927%207.826%20C%204.992%208.099%205.109%208.268001%205.278%208.333%20C%205.369%208.359%205.59%208.372%205.954%208.372%20C%206.3050003%208.372%206.448%208.372%206.448%208.684%20C%206.448%208.814%206.3700004%208.879%206.214%208.879%20L%204.563%208.84%20L%202.8990002%208.879%20C%202.691%208.879%202.6000001%208.762%202.6000001%208.567%20C%202.6000001%208.476%202.639%208.411%202.717%208.398%20C%202.8470001%208.385%202.951%208.372%203.016%208.372%20C%203.4190001%208.359%203.653%208.333%203.7180002%208.32%20C%203.783%208.307%203.809%208.268001%203.809%208.203%20C%203.809%208.177%203.796%208.099%203.757%207.9690003%20L%202.028%201.066%20C%201.963%200.78000003%201.8330001%200.611%201.638%200.546%20C%201.547%200.52%201.3130001%200.507%200.91%200.507%20C%200.624%200.507%200.507%200.481%200.507%200.19500001%20C%200.507%200.065%200.58500004%200%200.741%200%20L%202.379%200.039%20L%203.198%200.026%20C%203.341%200.026%203.887%200%204.03%200%20C%204.238%200%204.342%200.104%204.342%200.312%20C%204.342%200.442%204.199%200.507%203.926%200.507%20C%203.4060001%200.507%203.1460001%200.559%203.1460001%200.676%20C%203.1460001%200.676%203.1590002%200.71500003%203.1850002%200.884%20L%204.056%204.368%20L%207.8650002%204.368%20L%206.994%200.884%20C%206.955%200.689%206.7990003%200.559%206.539%200.52%20C%206.474%200.507%206.2530003%200.507%205.876%200.507%20C%205.629%200.507%205.512%200.403%205.512%200.19500001%20C%205.512%200.065%205.59%200%205.7460003%200%20L%207.3840003%200.039%20L%208.203%200.026%20C%208.346%200.026%208.879%200%209.048%200%20C%209.2560005%200%209.360001%200.104%209.360001%200.312%20C%209.360001%200.442%209.217%200.507%208.944%200.507%20C%208.411%200.507%208.151%200.559%208.151%200.676%20C%208.151%200.676%208.1640005%200.71500003%208.190001%200.884%20L%209.932%207.826%20C%209.997%208.099%2010.114%208.268001%2010.283%208.333%20C%2010.361%208.359%2010.582%208.372%2010.959001%208.372%20C%2011.297%208.372%2011.453%208.372%2011.453%208.684%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gE9415263C11E60DC5CFBBA09ADE8FC8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.276%201.1830001%20C%203.276%201.8746%202.8028002%202.3114002%201.8655001%202.4934%20C%201.4378%202.5753002%201.1648%202.6754%201.0192001%202.7755%20C%200.8736%202.8756%200.8008%203.0212002%200.8008%203.1941001%20C%200.8008%203.6218002%201.1193%203.8311002%201.7563001%203.8311002%20C%202.3751001%203.8311002%202.7118%203.4853%202.7573001%202.7846%20C%202.7664%202.7118%202.8119001%202.6754%202.9029002%202.6754%20C%203.003%202.6754%203.0576%202.7573001%203.0576%202.9211001%20L%203.0576%203.8220003%20C%203.0576%203.9949002%203.0121002%204.0768003%202.9211001%204.0768003%20C%202.821%204.0768003%202.6845002%203.913%202.5935001%203.8402002%20C%202.3660002%203.9949002%202.0839%204.0768003%201.7563001%204.0768003%20C%200.94640005%204.0768003%200.3003%203.7128003%200.3003%202.9393%20C%200.3003%202.6299002%200.4277%202.3660002%200.6916%202.1567001%20C%201.0101%201.8928001%201.3104%201.8382001%201.8837001%201.7381%20C%202.4752002%201.6198001%202.7755%201.3559%202.7755%200.94640005%20C%202.7755%200.4277%202.457%200.1638%201.8109001%200.1638%20C%201.1830001%200.1638%200.78260005%200.5824%200.6097%201.4105%20C%200.5824%201.5288%200.53690004%201.5925001%200.455%201.5925001%20C%200.3549%201.5925001%200.3003%201.5015%200.3003%201.3286%20L%200.3003%200.15470001%20C%200.3003%20-0.0182%200.3458%20-0.1001%200.4368%20-0.1001%20C%200.46410003%20-0.1001%200.50960004%20-0.0728%200.5824%20-0.0091%20C%200.7462%200.1365%200.67340004%200.1092%200.83720005%200.273%20C%201.1011001%200.0273%201.4287001%20-0.1001%201.8109001%20-0.1001%20C%202.6754%20-0.1001%203.276%200.3458%203.276%201.1830001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC5B71332A0E90E792E3FAAE3C83A1E5A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.0212002%201.1466%20L%203.0212002%201.6926%20L%202.73%201.6926%20L%202.73%201.1648%20C%202.73%200.7098%202.5662%200.2002%202.1658%200.2002%20C%201.7927%200.2002%201.6107%200.50960004%201.6107%201.1284001%20L%201.6107%203.5945%20L%202.8756%203.5945%20L%202.8756%203.9403002%20L%201.6107%203.9403002%20L%201.6107%205.5965004%20L%201.3195001%205.5965004%20C%201.3104%205.2962003%201.2831%205.0323%201.2194%204.7957%20C%201.0647%204.1951003%200.7098%203.8857002%200.1729%203.8584%20L%200.1729%203.5945%20L%200.92820007%203.5945%20L%200.92820007%201.1466%20C%200.92820007%200.6097%201.092%200.2639%201.4105%200.091000006%20C%201.6562%20-0.0364%201.8837001%20-0.1001%202.1112%20-0.1001%20C%202.7118%20-0.1001%203.0212002%200.5005%203.0212002%201.1466%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g244F502A10CDC70DE9AAA4877DC1FE65%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.3953004%200.8281%20L%204.3953004%201.365%20L%204.1041%201.365%20L%204.1041%200.8281%20C%204.1041%200.47320002%204.004%200.2912%203.8129%200.2912%20C%203.6309001%200.2912%203.5217001%200.5187%203.5217001%200.70070004%20L%203.5217001%202.4934%20C%203.5217001%202.8119001%203.4853%203.0485%203.4216%203.2123%20C%203.2032%203.7492%202.5753002%204.0768003%201.9383001%204.0768003%20C%201.2376001%204.0768003%200.546%203.6855001%200.546%203.0303001%20C%200.546%202.73%200.70070004%202.5753002%201.001%202.5753002%20C%201.3013%202.5753002%201.4469%202.7209%201.4469%203.0212002%20C%201.4469%203.2851002%201.3104%203.4398%201.0283%203.4671001%20C%201.2285%203.6946%201.5288%203.8129%201.9201001%203.8129%20C%202.4843001%203.8129%202.8301%203.2942002%202.8301%202.7027001%20L%202.8301%202.4024%20C%202.1203%202.3569002%201.5834%202.2477%201.2103001%202.0748%20C%200.6006%201.7927%200.2912%201.4014001%200.2912%200.8827%20C%200.2912%200.64610004%200.3822%200.44590002%200.5551%200.2912%20C%200.8463%200.0273%201.2467%20-0.1001%201.7563001%20-0.1001%20C%202.2932%20-0.1001%202.6754%200.12740001%202.9120002%200.59150004%20C%202.9757001%200.24570002%203.2305002%20-0.0546%203.6218002%20-0.0546%20C%204.1041%20-0.0546%204.3953004%200.3276%204.3953004%200.8281%20Z%20M%201.82%200.1638%20C%201.4014001%200.1638%201.0556%200.47320002%201.0556%200.89180005%20C%201.0556%201.7381%201.9383001%202.1021001%202.8301%202.1476002%20L%202.8301%201.2831%20C%202.8301%200.67340004%202.4297001%200.1638%201.82%200.1638%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3BD2AAC8F92468FB204CF6E7AF8DFF03%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.3124%203.4398%20C%203.3124%203.7947001%202.9757001%204.0222%202.6208%204.0222%20C%202.1567001%204.0222%201.8018001%203.7492%201.5652001%203.1941001%20L%201.5652001%204.0222%20L%200.25480002%203.9221%20L%200.25480002%203.5763001%20C%200.5733%203.5763001%200.7644%203.5490003%200.83720005%203.4944%20C%200.91%203.4398%200.94640005%203.3215%200.94640005%203.1122%20L%200.94640005%200.7189%20C%200.94640005%200.546%200.91910005%200.4368%200.8554%200.4004%20C%200.7917%200.36400002%200.59150004%200.3458%200.25480002%200.3458%20L%200.25480002%200%20L%201.3013%200.0273%20C%201.6835%200.0364%202.0748%200.0273%202.4661002%200%20L%202.4661002%200.3458%20L%202.2477%200.3458%20C%201.9474001%200.3458%201.7563001%200.3731%201.6926%200.41860002%20C%201.6289%200.46410003%201.6016%200.5733%201.6016%200.7371%20L%201.6016%202.1112%20C%201.6016%202.5025%201.6744001%202.8574002%201.8109001%203.1577%20C%201.9929001%203.5490003%202.2568002%203.7492%202.6117%203.7583%20C%202.5207002%203.6673002%202.4752002%203.5581002%202.4752002%203.4307%20C%202.4752002%203.1486%202.6117%203.0121002%202.8938%203.0121002%20C%203.1395001%203.0121002%203.3124%203.2032%203.3124%203.4398%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.7321272727272725em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; to prune as many guesses as possible.
We can’t assume we’ve
been given the truth, since that would be cheating, but we do already
have an excellent proxy for finding out which guesses might be good. We
can just use the words which minimize the remaing entropy.&lt;&#x2F;p&gt;
&lt;p&gt;In my implementation, I did a triangular search: we work our way
downward in the list of words by remaining entropy. The best three
single-word openers are &lt;code&gt;soare&lt;&#x2F;code&gt;, &lt;code&gt;roate&lt;&#x2F;code&gt;, and &lt;code&gt;raise&lt;&#x2F;code&gt;, so we’d start by
checking &lt;code&gt;soare, roate&lt;&#x2F;code&gt;, then &lt;code&gt;soare, raise&lt;&#x2F;code&gt;, and finally
&lt;code&gt;roate, raise&lt;&#x2F;code&gt;. I decided to skip repeated word pairs as it’s pretty
obvious that they wouldn’t be any good.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;parallelism-round-2&quot;&gt;Parallelism, round 2&lt;&#x2F;h3&gt;
&lt;p&gt;Finally, we can circle back around to building a multithreaded solver.
We’d like to build a parallel system which is sufficiently
coarse-grained that each thread doesn’t waste time coordinating, but
also ensures that each thread is always fed with work.&lt;&#x2F;p&gt;
&lt;p&gt;The easiest way to do this is with a task queue: at the start of the
program, we spin out all the worker threads. All the threads share a
list of tasks that they need to work on; whenever a thread is done with
its current task, it grabs the next task from the list. In the general
case, the main issue with task queues is that if they are too
fine-grained the contention over the next item in the task queue will
cause slowdowns.&lt;&#x2F;p&gt;
&lt;p&gt;We have a very easy workaround, though. Let’s imagine that our program
has been given &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2021.215999999999998%2021.878999999999998%22%20width%3D%2221.215999999999998pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g17AF90F25DACF254827E59F8A3A9E6D4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%283.6140000000000003%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g39839232D9B855C6E487282AC713D032%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2817.601999999999997%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g17AF90F25DACF254827E59F8A3A9E6D4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g17AF90F25DACF254827E59F8A3A9E6D4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.807%20-3.25%20C%201.9760001%20-3.25%202.0670002%20-3.1460001%202.0670002%20-2.938%20L%202.0670002%209.438%20C%202.0670002%209.646%201.9760001%209.75%201.807%209.75%20C%201.638%209.75%201.547%209.646%201.547%209.438%20L%201.547%20-2.938%20C%201.547%20-3.1460001%201.638%20-3.25%201.807%20-3.25%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g39839232D9B855C6E487282AC713D032%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2012.428%208.84%20C%2012.181001%208.84%2011.336%208.879%2011.089001%208.879%20C%2010.894%208.879%2010.79%208.775001%2010.79%208.58%20C%2010.79%208.45%2010.868%208.385%2011.024%208.372%20C%2011.505%208.359%2011.739%208.216001%2011.739%207.9300003%20C%2011.739%207.852%2011.687%207.722%2011.583%207.527%20L%208.177%201.625%20L%207.722%207.826%20C%207.67%208.294001%207.9820004%208.372%208.567%208.372%20C%208.84%208.372%208.97%208.476%208.97%208.684%20C%208.97%208.814%208.892%208.879%208.723001%208.879%20C%208.437%208.879%207.4360003%208.84%207.15%208.84%20C%206.9030004%208.84%206.045%208.879%205.7980003%208.879%20C%205.603%208.879%205.499%208.775001%205.499%208.567%20C%205.499%208.437%205.616%208.372%205.863%208.372%20C%206.2660003%208.372%206.474%208.281%206.487%208.099%20L%206.565%207.124%20L%203.3930001%201.625%20L%202.925%207.9690003%20C%202.8860002%208.294001%203.4320002%208.372%203.848%208.372%20C%204.0690002%208.372%204.173%208.476%204.173%208.684%20C%204.173%208.814%204.0950003%208.879%203.9390001%208.879%20C%203.653%208.879%202.639%208.84%202.3530002%208.84%20C%202.106%208.84%201.248%208.879%201.001%208.879%20C%200.806%208.879%200.71500003%208.775001%200.71500003%208.58%20C%200.71500003%208.437%200.845%208.372%201.092%208.372%20C%201.638%208.372%201.69%208.346%201.7160001%207.9560003%20L%202.301%200.091000006%20C%202.3140001%20-0.156%202.405%20-0.286%202.561%20-0.286%20C%202.73%20-0.26%202.795%20-0.221%202.8990002%20-0.026%20C%202.9120002%20-0.013%202.9120002%200%202.9120002%200.013%20L%206.617%206.422%20L%207.085%200.091000006%20C%207.098%20-0.156%207.189%20-0.286%207.3450003%20-0.286%20C%207.4750004%20-0.286%207.592%20-0.19500001%207.696%20-0.013%20L%2011.934%207.306%20C%2012.285%207.9430003%2012.532001%208.307%2013.325%208.372%20C%2013.559%208.398%2013.624001%208.463%2013.624001%208.684%20C%2013.624001%208.814%2013.559%208.879%2013.416%208.879%20C%2013.234%208.879%2012.610001%208.84%2012.428%208.84%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.9287272727272724em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; valid guess words. The number of words is known to us at the start
of the program. We can then represent the next word in the task queue as
a single integer representing the index of the next word. Then each
thread can acquire a new task by incrementing a single number, with no
other coordination required. Once a thread has acquired a word &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%209.347%2021.878999999999998%22%20width%3D%229.347pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF5A736AF78F00E66632FD1D047F362F0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF5A736AF78F00E66632FD1D047F362F0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.67%205.083%20C%207.67%204.966%207.735%204.836%207.8780003%204.7060003%20C%208.177%204.42%208.333%204.0690002%208.333%203.653%20C%208.333%203.4320002%208.255%203.081%208.099%202.5740001%20C%207.618%201.014%207.007%200.234%206.2660003%200.234%20C%205.655%200.234%205.356%200.58500004%205.356%201.3000001%20C%205.356%201.547%205.408%201.8460001%205.499%202.223%20C%205.7330003%203.1590002%205.98%204.0820003%206.201%205.031%20C%206.227%205.122%206.2400002%205.1740003%206.2400002%205.2130003%20C%206.2400002%205.473%206.097%205.603%205.8110003%205.603%20C%205.551%205.603%205.382%205.473%205.291%205.2130003%20L%204.771%203.1850002%20C%204.576%202.431%204.433%202.171%204.433%201.495%20C%204.433%201.391%204.433%201.3130001%204.446%201.274%20C%204.1470003%200.58500004%203.77%200.234%203.315%200.234%20C%202.665%200.234%202.3400002%200.611%202.3400002%201.352%20C%202.3400002%201.8330001%202.561%202.652%203.003%203.809%20C%203.1460001%204.199%203.224%204.472%203.224%204.6410003%20C%203.224%205.278%202.756%205.7460003%202.119%205.7460003%20C%201.534%205.7460003%201.092%205.421%200.767%204.771%20C%200.507%204.264%200.377%203.913%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.754%203.549%200.78000003%203.627%200.832%203.809%20C%201.144%204.849%201.5600001%205.369%202.08%205.369%20C%202.262%205.369%202.3530002%205.2390003%202.3530002%204.992%20C%202.3530002%204.797%202.275%204.511%202.132%204.1210003%20C%201.651%202.8600001%201.404%202.002%201.404%201.521%20C%201.404%200.416%202.145%20-0.143%203.276%20-0.143%20C%203.822%20-0.143%204.264%200.13%204.6150002%200.689%20C%204.875%200.13%205.408%20-0.143%206.227%20-0.143%20C%207.033%20-0.143%207.67%200.39000002%208.125%201.4560001%20C%208.424%202.132%208.983%203.926%208.983%204.797%20C%208.983%204.992%208.97%205.122%208.957%205.1870003%20C%208.905%205.434%208.658%205.7460003%208.372%205.7460003%20C%208.034%205.7460003%207.67%205.421%207.67%205.083%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.8497272727272727em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, it can test every single pair of words &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2028.906366666666663%2021.878999999999998%22%20width%3D%2228.906366666666663pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF5A736AF78F00E66632FD1D047F362F0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.347%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA5EFA28F31DFDD7E2EC069AC1C132FF5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.127666666666666%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF5A736AF78F00E66632FD1D047F362F0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2824.474666666666664%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF9C7830800E71C75A67D819743D6D92F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF5A736AF78F00E66632FD1D047F362F0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.67%205.083%20C%207.67%204.966%207.735%204.836%207.8780003%204.7060003%20C%208.177%204.42%208.333%204.0690002%208.333%203.653%20C%208.333%203.4320002%208.255%203.081%208.099%202.5740001%20C%207.618%201.014%207.007%200.234%206.2660003%200.234%20C%205.655%200.234%205.356%200.58500004%205.356%201.3000001%20C%205.356%201.547%205.408%201.8460001%205.499%202.223%20C%205.7330003%203.1590002%205.98%204.0820003%206.201%205.031%20C%206.227%205.122%206.2400002%205.1740003%206.2400002%205.2130003%20C%206.2400002%205.473%206.097%205.603%205.8110003%205.603%20C%205.551%205.603%205.382%205.473%205.291%205.2130003%20L%204.771%203.1850002%20C%204.576%202.431%204.433%202.171%204.433%201.495%20C%204.433%201.391%204.433%201.3130001%204.446%201.274%20C%204.1470003%200.58500004%203.77%200.234%203.315%200.234%20C%202.665%200.234%202.3400002%200.611%202.3400002%201.352%20C%202.3400002%201.8330001%202.561%202.652%203.003%203.809%20C%203.1460001%204.199%203.224%204.472%203.224%204.6410003%20C%203.224%205.278%202.756%205.7460003%202.119%205.7460003%20C%201.534%205.7460003%201.092%205.421%200.767%204.771%20C%200.507%204.264%200.377%203.913%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.754%203.549%200.78000003%203.627%200.832%203.809%20C%201.144%204.849%201.5600001%205.369%202.08%205.369%20C%202.262%205.369%202.3530002%205.2390003%202.3530002%204.992%20C%202.3530002%204.797%202.275%204.511%202.132%204.1210003%20C%201.651%202.8600001%201.404%202.002%201.404%201.521%20C%201.404%200.416%202.145%20-0.143%203.276%20-0.143%20C%203.822%20-0.143%204.264%200.13%204.6150002%200.689%20C%204.875%200.13%205.408%20-0.143%206.227%20-0.143%20C%207.033%20-0.143%207.67%200.39000002%208.125%201.4560001%20C%208.424%202.132%208.983%203.926%208.983%204.797%20C%208.983%204.992%208.97%205.122%208.957%205.1870003%20C%208.905%205.434%208.658%205.7460003%208.372%205.7460003%20C%208.034%205.7460003%207.67%205.421%207.67%205.083%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA5EFA28F31DFDD7E2EC069AC1C132FF5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.807%201.378%20C%201.391%201.378%201.118%201.066%201.118%200.65000004%20C%201.118%200.26%201.417%20-0.065%201.807%20-0.065%20C%201.9890001%20-0.065%202.145%20-0.013%202.262%200.104%20L%202.275%200%20C%202.275%20-0.819%202.002%20-1.521%201.4560001%20-2.08%20C%201.365%20-2.184%201.3130001%20-2.262%201.3130001%20-2.3140001%20C%201.3130001%20-2.444%201.365%20-2.509%201.482%20-2.509%20C%201.599%20-2.509%201.755%20-2.3530002%201.9760001%20-2.0540001%20C%202.418%20-1.4300001%202.639%20-0.741%202.639%200%20C%202.639%200.689%202.405%201.378%201.807%201.378%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF9C7830800E71C75A67D819743D6D92F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.5844002%204.9959%20C%202.3569002%204.9959%202.2022002%204.9049%202.1203%204.7138004%20L%200.59150004%200.8736%20L%201.001%200.8736%20L%203.0212002%204.2133%20C%203.0667002%204.2952003%203.094%204.3862%203.094%204.4863%20C%203.094%204.7593%202.8574002%204.9959%202.5844002%204.9959%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.627851515151515em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, which will take a decent chunk of time. The whole queue is quite
easy to implement, since we can just store our task queue state as a
single &lt;code&gt;AtomicUsize&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The last problem is sharing our minimum information. If we had atomic
floats, we could use fetch-min operations to update our lower bound on
the expected remaining information. However, most CPU archtectures do
not support such operations. Instead, we can do a cheap trick: convert
every float to a fixed-point number. In my case, I just approximated the
remaining entropy to the nearest one-millionth, then did all the
multithreaded operations with integers.&lt;&#x2F;p&gt;
&lt;p&gt;The final result: we were able to get our unconditional openers in just
15 seconds.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;txt&quot; class=&quot;language-txt z-code&quot;&gt;&lt;code class=&quot;language-txt&quot; data-lang=&quot;txt&quot;&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;~&#x2F;p&#x2F;wordle (master|✔) $ time .&#x2F;target&#x2F;release&#x2F;wordle answers.txt words.txt
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;n_threads = 32
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Top 10:
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;clint, soare: 1.5440189
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;cline, roast: 1.559105
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;socle, riant: 1.5603062
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;close, riant: 1.5661579
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;crine, loast: 1.572707
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;ceorl, saint: 1.5766429
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sonce, trail: 1.5812799
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;roist, lance: 1.5888369
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;salon, trice: 1.5888534
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;clote, sarin: 1.5904317
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;________________________________________________________
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Executed in   14.99 secs    fish           external
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    usr time  462.77 secs  402.00 micros  462.77 secs
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    sys time    0.34 secs  109.00 micros    0.34 secs
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Our final answer: &lt;code&gt;soare&lt;&#x2F;code&gt;, &lt;code&gt;clint&lt;&#x2F;code&gt; is the best unconditional two-word
opener for Wordle. &lt;code&gt;salon&lt;&#x2F;code&gt;, &lt;code&gt;trice&lt;&#x2F;code&gt; also gets an honorable mention for
being the best opener whose guesses are also possible answers, so you
have a chance at getting a perfect one-guess solution.&lt;&#x2F;p&gt;
&lt;p&gt;One more thing: my brother’s favorite guess of (&lt;code&gt;trace&lt;&#x2F;code&gt;, &lt;code&gt;lions&lt;&#x2F;code&gt;) is
the 197th-best opener, with an expected remaining entropy of 1.687 bits.
That’s pretty good overall, given that there are nearly 84 million
possible opening pairs.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;closing-time&quot;&gt;Closing time&lt;&#x2F;h2&gt;
&lt;p&gt;I had a lot of fun doing this project! I feel a little bad about taking
so long to write it up - I started working on it about a year ago,
tabled the project, and only recently restarted about 2 months ago.
It’s nice to be finally (sort of) finished! If you want to use the
source code, check it out on GitHub here
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;claytonwramsey&#x2F;wordle_simd&quot;&gt;here&lt;&#x2F;a&gt; (AGPL-licensed).&lt;&#x2F;p&gt;
&lt;p&gt;I especially liked the process of building out faster and faster
versions of the grader. The coolest part to me was that there was a
continous gradient between generality and performance: we can keep
adding stronger and stronger assumptions, getting a small performance
bump every time.&lt;&#x2F;p&gt;
&lt;p&gt;I probably didn’t save any time working on this: the naive
implementation is only a few hundred times slower than the final
parallel version, so finding the best unconditional opener with the
naive solution would have only required about 3 hours of computation. I
certainly wasted far more than 3 hours optimizing this implementation.&lt;&#x2F;p&gt;
&lt;p&gt;I also have to apologize: the title is a bit of a stretch (sorry for
clickbaiting you). I calculated it approximately by dividing the total
number of checks required by the number time taken. The reason it’s not
so accurate is that the pruning process significantly reduces the number
of checks required, so our real grading throughput is more along the
lines of just a few billion grades per second.&lt;&#x2F;p&gt;
&lt;p&gt;If I come back to this project, I want to aim my sights a little higher.
I think it’s reasonably possible to calculate a true optimal policy for
solving Wordle in a decent amount of time. The optimal solutions are
known, but I think it would be fun to see if it’s possible to bring it
into the range of “check my email” level speed.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Effect polymorphism fixes dependency inversion</title>
          <pubDate>Sat, 05 Oct 2024 00:00:00 +0000</pubDate>
          <author>Clayton Ramsey</author>
          <link>https://claytonwramsey.com/blog/effect-polymorphism/</link>
          <guid>https://claytonwramsey.com/blog/effect-polymorphism/</guid>
          <description xml:base="https://claytonwramsey.com/blog/effect-polymorphism/">&lt;p&gt;TL;DR: Local programmer is inconvenienced by error-handling boilerplate,
writes uninformed article about experimental programming language
features. More at 11.&lt;&#x2F;p&gt;
&lt;p&gt;I’ve encountered lots of pain points when dependency-inverting things,
especially when working with combinators. Most recently, I’ve been
thinking about how I might expose Python bindings for a &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;claytonwramsey&#x2F;rumple&quot;&gt;half-baked
motion planning library&lt;&#x2F;a&gt; I’m
building. The chief problem is that I want users to provide their own
configuration spaces, samplers, robots, and collision checkers. If those
are implemented in Python, they can throw an exception at any time,
yielding an error in the corresponding PyO3 API. The problem is that all
of my functions which might call into that behavior don’t return an
error - what am I to do?&lt;&#x2F;p&gt;
&lt;p&gt;I’m not the only one with this sort of problem!
&lt;a href=&quot;https:&#x2F;&#x2F;without.boats&#x2F;blog&#x2F;the-problem-of-effects&#x2F;&quot;&gt;boats&lt;&#x2F;a&gt; has been
writing about this for nearly five years, and &lt;a href=&quot;https:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;63798662&quot;&gt;handling iterators of
results is still a pain&lt;&#x2F;a&gt;.
As the &lt;code&gt;async&lt;&#x2F;code&gt; story for Rust has improved, we’ve seen similar results
on the pain (or lack thereof) of &lt;a href=&quot;https:&#x2F;&#x2F;morestina.net&#x2F;blog&#x2F;1686&#x2F;rust-async-is-colored&quot;&gt;function coloring in
Rust&lt;&#x2F;a&gt;. In short,
crossing control-flow boundaries in statically typed languages is
painful and difficult.&lt;&#x2F;p&gt;
&lt;p&gt;First off, a disclaimer: I am more interested in programming language
theory than the average joe, but I’m still not an expert. I’ve only
read a little bit on the topic of algebraic effects, so I may get some
things wrong - I’m a roboticist, not a category theorist. The purpose
of this article is not so much to propose a novel contribution as to
draw attention to a common problem and an elegant solution.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;dependency-inversion&quot;&gt;Dependency inversion&lt;&#x2F;h2&gt;
&lt;p&gt;For the sake of this post, I’ll refer to &lt;dfn&gt;dependency inversion&lt;&#x2F;dfn&gt;
as the practice of taking a subroutine in a procedure and taking it out
as an argument. For example, consider the following Rust code:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;my_sum&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; total &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        total &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;magic_number&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    total
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;magic_number&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; x &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This would be a case of an &lt;em&gt;uninverted&lt;&#x2F;em&gt; dependency; that is, &lt;code&gt;my_sum&lt;&#x2F;code&gt;
depends on &lt;code&gt;magic_number&lt;&#x2F;code&gt; and knows it specifically by name. However, if
we factored out &lt;code&gt;magic_number&lt;&#x2F;code&gt; into a user provided file, this would
invert the dependency:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;my_sum&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;N&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; MagicNumber&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; total &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        total &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;N&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;magic_number&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    total
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;MagicNumber&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;magic_number&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This has a lot of benefits, mostly for code reuse. We can now use these
generic functions to build simple combinators and compose them into
bigger things!&lt;&#x2F;p&gt;
&lt;p&gt;In fact, this toy example is pretty close to what a simple iterator
combinator (such as
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;iter&#x2F;trait.Iterator.html#method.sum&quot;&gt;&lt;code&gt;std::iterator::Sum&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;)
does. For the most part, people are quite happy with it and it gets the
job done.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;my-problem&quot;&gt;My problem&lt;&#x2F;h2&gt;
&lt;p&gt;What if a user-provided &lt;code&gt;magic_number&lt;&#x2F;code&gt; implementation is fallible?
Perhaps it requires file I&#x2F;O, or has a chance of dividing by zero, or
maybe it calls out to some FFI code. In current Rust, we have a few
prospects:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Panic! Whenever &lt;code&gt;magic_number&lt;&#x2F;code&gt; encounters an error state, we can
just crash the program. This works fine until you are woken up at 3
A.M. with calls about your broken website.&lt;&#x2F;li&gt;
&lt;li&gt;Panic, but gracefully. Whatever top-level code calls &lt;code&gt;my_sum&lt;&#x2F;code&gt; can
catch the panic using
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;panic&#x2F;fn.catch_unwind.html&quot;&gt;&lt;code&gt;catch_unwind&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.
The catch with catching is that unwinding is slow and unpredictable.
In fact, programs compiled with &lt;code&gt;panic = &quot;abort&quot;&lt;&#x2F;code&gt; will never catch a
panic.&lt;&#x2F;li&gt;
&lt;li&gt;Go nuclear. Make a copy of &lt;code&gt;MagicNumber&lt;&#x2F;code&gt; specifically for the case
of fallible implementations of &lt;code&gt;magic_number&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The nuclear option would look something like this.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;try_my_sum&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;N&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; TryMagicNumber&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; total &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        total &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;N&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;try_magic_number&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    total
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;TryMagicNumber&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-type z-rust&quot;&gt;type&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-type z-rust&quot;&gt;Error&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;try_magic_number&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Result&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;, &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Error&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So, with a little bit of brute force, we’ve come up with an API that
can handle fallibility. It’s annoying to maintain, sure, but at least
we’ve achieved maximum flexibility. But wait! What if we want to make
an implementation of &lt;code&gt;magic_number&lt;&#x2F;code&gt; using an unsafe function! Then we’d
have to make a new trait!&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;UnsafeMagicNumber&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-type z-rust&quot;&gt;type&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-type z-rust&quot;&gt;Error&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;unsafe&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;unsafe_magic_number&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And what if we want to use this functionality with a function that was
both unsafe and fallible?&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;TryUnsafeMagicNumber&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-type z-rust&quot;&gt;type&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-type z-rust&quot;&gt;Error&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;unsafe&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;try_unsafe_magic_number&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Result&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;, &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Error&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now imagine if we wanted to make a version of &lt;code&gt;magic_number&lt;&#x2F;code&gt; that worked
via dynamic-dispatch. To do so, we’d have to make a new trait
&lt;code&gt;ObjectMagicNumber&lt;&#x2F;code&gt;, since &lt;code&gt;MagicNumber&lt;&#x2F;code&gt; is not object-safe. Then we’d
need to make even more traits for every version of it!&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;ObectMagicNumber&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;object_magic_number&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;self&lt;&#x2F;span&gt;, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;TryObjectMagicNumber&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;*&lt;&#x2F;span&gt; ... &lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;UnsafeObjectMagicNumber&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;*&lt;&#x2F;span&gt; ... &lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;TryUnsafeObjectMagicNumber&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;*&lt;&#x2F;span&gt; ... &lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then we have to consider all the many other variations on this
once-simple API: mutability, allocations, I&#x2F;O, blocking, &lt;code&gt;const&lt;&#x2F;code&gt;,
&lt;code&gt;async&lt;&#x2F;code&gt;. The list goes on. If we had &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.799999999999999%2021.878999999999998%22%20width%3D%227.799999999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCC2D6A7770FCF135D0D1A78A9F87C718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCC2D6A7770FCF135D0D1A78A9F87C718%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.981%201.781%20C%206.682%200.754%206.2530003%200.234%205.7200003%200.234%20C%205.551%200.234%205.46%200.36400002%205.46%200.611%20C%205.46%200.79300004%205.538%201.092%205.6940002%201.495%20C%206.214%202.9120002%206.474%203.848%206.474%204.329%20C%206.474%205.2390003%205.863%205.7460003%204.953%205.7460003%20C%204.186%205.7460003%203.523%205.408%202.99%204.719%20C%202.8860002%205.291%202.431%205.7460003%201.768%205.7460003%20C%201.04%205.7460003%200.754%205.07%200.572%204.485%20C%200.442%204.0690002%200.377%203.822%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.963%205.369%202.08%205.1870003%202.08%204.823%20C%202.08%204.6540003%202.015%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4430001%20-0.143%20C%201.69%20-0.143%201.872%20-0.013%201.963%200.24700001%20C%201.9890001%200.312%202.0670002%200.637%202.21%201.196%20L%202.483%202.3530002%20L%202.8730001%203.835%20C%203.016%204.1340003%203.237%204.433%203.51%204.745%20C%203.887%205.1610003%204.355%205.369%204.914%205.369%20C%205.343%205.369%205.551%205.083%205.551%204.524%20C%205.551%204.03%205.278%203.042%204.719%201.5600001%20C%204.6280003%201.326%204.589%201.131%204.589%200.962%20C%204.589%200.32500002%205.07%20-0.143%205.6940002%20-0.143%20C%206.2660003%20-0.143%206.721%200.18200001%207.046%200.832%20C%207.293%201.352%207.4230003%201.7030001%207.4230003%201.872%20C%207.4230003%201.9890001%207.3580003%202.0540001%207.215%202.0540001%20C%207.176%202.0540001%206.981%201.937%206.981%201.781%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.709090909090909em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; such properties, we’d need to
create &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2013.652599999999998%2021.878999999999998%22%20width%3D%2213.652599999999998pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.5%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC6909A185FA3625676D693EED70DCC0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g626C7FE0610F5A21B7FCC6F361F06C4A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.081%208.658%20C%202.418%208.658%201.8590001%208.424%201.378%207.9560003%20C%200.897%207.488%200.65000004%206.942%200.65000004%206.2790003%20C%200.65000004%205.837%200.975%205.512%201.378%205.512%20C%201.768%205.512%202.093%205.85%202.093%206.2400002%20C%202.093%206.669%201.781%206.968%201.365%206.968%20C%201.326%206.968%201.3000001%206.968%201.274%206.955%20C%201.521%207.592%202.093%208.151%202.9120002%208.151%20C%203.9780002%208.151%204.576%207.228%204.576%206.11%20C%204.576%205.2390003%204.1340003%204.303%203.25%203.315%20L%200.806%200.559%20C%200.637%200.36400002%200.65000004%200.377%200.65000004%200%20L%205.473%200%20L%205.85%202.3400002%20L%205.421%202.3400002%20C%205.317%201.677%205.2260003%201.3000001%205.1480002%201.183%20C%205.083%201.118%204.6930003%201.092%203.9780002%201.092%20L%201.807%201.092%20L%203.068%202.3270001%20C%203.9520001%203.1590002%205.07%204.056%205.447%204.745%20C%205.7070003%205.2000003%205.837%205.655%205.837%206.11%20C%205.837%207.644%204.6410003%208.658%203.081%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC6909A185FA3625676D693EED70DCC0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.4924%204.0131%20C%201.1921%204.0131%200.94640005%203.8493001%200.75530005%203.5126002%20C%200.6279%203.2851002%200.5278%203.0485%200.46410003%202.7846%20C%200.4368%202.6845002%200.4277%202.6299002%200.4277%202.6117%20C%200.4277%202.5116%200.49140003%202.457%200.61880004%202.457%20C%200.7917%202.457%200.8008%202.5571%200.8463%202.7482002%20C%201.001%203.3761%201.2103001%203.6946%201.4742%203.6946%20C%201.6471001%203.6946%201.7290001%203.5581002%201.7290001%203.2851002%20C%201.7290001%203.1850002%201.6835%202.9484%201.5834%202.5571%20L%201.1011001%200.6097%20C%201.0374%200.36400002%201.0101%200.23660001%201.0101%200.2275%20C%201.0101%200.0182%201.1284001%20-0.091000006%201.3559%20-0.091000006%20C%201.5288%20-0.091000006%201.6562%20-0.0182%201.7381%200.12740001%20C%201.7654%200.18200001%201.82%200.3731%201.9019%200.6916%20L%202.0930002%201.4924%20C%202.2022002%201.9201001%202.2659001%202.1567001%202.2841%202.2113001%20C%202.3569002%202.4479%202.4661002%202.6754%202.6208%202.8847%20C%203.003%203.4216%203.4398%203.6946%203.9403002%203.6946%20C%204.2679%203.6946%204.4317%203.4944%204.4317%203.1031%20C%204.4317%202.7482002%204.2588%202.1203%203.9039001%201.2103001%20C%203.8129%200.97370005%203.7674003%200.80990005%203.7674003%200.7098%20C%203.7674003%200.2184%204.1678%20-0.091000006%204.6592%20-0.091000006%20C%205.0869%20-0.091000006%205.4327%200.12740001%205.6784%200.56420004%20C%205.8877%200.9373%205.9878%201.1830001%205.9878%201.3104%20C%205.9878%201.4105%205.9241004%201.4651%205.8058004%201.4651%20C%205.7421002%201.4560001%205.6784%201.4105%205.6147003%201.3195001%20C%205.6056004%201.3104%205.6056004%201.2922001%205.6056004%201.2831%20C%205.3963003%200.5824%205.0869%200.2275%204.6865%200.2275%20C%204.5591%200.2275%204.4954%200.3185%204.4954%200.50960004%20C%204.4954%200.637%204.5682%200.8736%204.7047%201.2194%20C%205.0232%202.0293%205.1779003%202.6117%205.1779003%202.9575002%20C%205.1779003%203.3761%205.0323%203.6673002%204.7502003%203.8220003%20C%204.5227003%203.9494002%204.2588%204.0131%203.9767%204.0131%20C%203.3852%204.0131%202.8847%203.7583%202.4843001%203.2487001%20C%202.4024%203.6946%202.0111%204.0131%201.4924%204.0131%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.2411454545454543em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; traits and &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2013.652599999999998%2021.878999999999998%22%20width%3D%2213.652599999999998pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.5%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC6909A185FA3625676D693EED70DCC0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g626C7FE0610F5A21B7FCC6F361F06C4A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.081%208.658%20C%202.418%208.658%201.8590001%208.424%201.378%207.9560003%20C%200.897%207.488%200.65000004%206.942%200.65000004%206.2790003%20C%200.65000004%205.837%200.975%205.512%201.378%205.512%20C%201.768%205.512%202.093%205.85%202.093%206.2400002%20C%202.093%206.669%201.781%206.968%201.365%206.968%20C%201.326%206.968%201.3000001%206.968%201.274%206.955%20C%201.521%207.592%202.093%208.151%202.9120002%208.151%20C%203.9780002%208.151%204.576%207.228%204.576%206.11%20C%204.576%205.2390003%204.1340003%204.303%203.25%203.315%20L%200.806%200.559%20C%200.637%200.36400002%200.65000004%200.377%200.65000004%200%20L%205.473%200%20L%205.85%202.3400002%20L%205.421%202.3400002%20C%205.317%201.677%205.2260003%201.3000001%205.1480002%201.183%20C%205.083%201.118%204.6930003%201.092%203.9780002%201.092%20L%201.807%201.092%20L%203.068%202.3270001%20C%203.9520001%203.1590002%205.07%204.056%205.447%204.745%20C%205.7070003%205.2000003%205.837%205.655%205.837%206.11%20C%205.837%207.644%204.6410003%208.658%203.081%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC6909A185FA3625676D693EED70DCC0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.4924%204.0131%20C%201.1921%204.0131%200.94640005%203.8493001%200.75530005%203.5126002%20C%200.6279%203.2851002%200.5278%203.0485%200.46410003%202.7846%20C%200.4368%202.6845002%200.4277%202.6299002%200.4277%202.6117%20C%200.4277%202.5116%200.49140003%202.457%200.61880004%202.457%20C%200.7917%202.457%200.8008%202.5571%200.8463%202.7482002%20C%201.001%203.3761%201.2103001%203.6946%201.4742%203.6946%20C%201.6471001%203.6946%201.7290001%203.5581002%201.7290001%203.2851002%20C%201.7290001%203.1850002%201.6835%202.9484%201.5834%202.5571%20L%201.1011001%200.6097%20C%201.0374%200.36400002%201.0101%200.23660001%201.0101%200.2275%20C%201.0101%200.0182%201.1284001%20-0.091000006%201.3559%20-0.091000006%20C%201.5288%20-0.091000006%201.6562%20-0.0182%201.7381%200.12740001%20C%201.7654%200.18200001%201.82%200.3731%201.9019%200.6916%20L%202.0930002%201.4924%20C%202.2022002%201.9201001%202.2659001%202.1567001%202.2841%202.2113001%20C%202.3569002%202.4479%202.4661002%202.6754%202.6208%202.8847%20C%203.003%203.4216%203.4398%203.6946%203.9403002%203.6946%20C%204.2679%203.6946%204.4317%203.4944%204.4317%203.1031%20C%204.4317%202.7482002%204.2588%202.1203%203.9039001%201.2103001%20C%203.8129%200.97370005%203.7674003%200.80990005%203.7674003%200.7098%20C%203.7674003%200.2184%204.1678%20-0.091000006%204.6592%20-0.091000006%20C%205.0869%20-0.091000006%205.4327%200.12740001%205.6784%200.56420004%20C%205.8877%200.9373%205.9878%201.1830001%205.9878%201.3104%20C%205.9878%201.4105%205.9241004%201.4651%205.8058004%201.4651%20C%205.7421002%201.4560001%205.6784%201.4105%205.6147003%201.3195001%20C%205.6056004%201.3104%205.6056004%201.2922001%205.6056004%201.2831%20C%205.3963003%200.5824%205.0869%200.2275%204.6865%200.2275%20C%204.5591%200.2275%204.4954%200.3185%204.4954%200.50960004%20C%204.4954%200.637%204.5682%200.8736%204.7047%201.2194%20C%205.0232%202.0293%205.1779003%202.6117%205.1779003%202.9575002%20C%205.1779003%203.3761%205.0323%203.6673002%204.7502003%203.8220003%20C%204.5227003%203.9494002%204.2588%204.0131%203.9767%204.0131%20C%203.3852%204.0131%202.8847%203.7583%202.4843001%203.2487001%20C%202.4024%203.6946%202.0111%204.0131%201.4924%204.0131%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.2411454545454543em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; functions to handle them all. Each one
of these variations is reasonable, but we know that since we can’t
accept all of them, we must accept none of them.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-are-effects-anyway&quot;&gt;What are effects, anyway?&lt;&#x2F;h2&gt;
&lt;p&gt;Intuitively, effects are a way of trying to abstract away all these
possible variations on a function in a clean and generic way. Every
function has some set of effects, and effects are inherited: if &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.54%2021.878999999999998%22%20width%3D%227.54pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9613EA3878B139E19656A35D87E70181%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9613EA3878B139E19656A35D87E70181%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.176%208.229%20C%207.176%208.801001%206.617%209.165%206.006%209.165%20C%205.2000003%209.165%204.6410003%208.645%204.342%207.618%20C%204.277%207.3840003%204.1340003%206.721%203.926%205.629%20L%203.081%205.629%20C%202.795%205.629%202.652%205.616%202.652%205.343%20C%202.652%205.2000003%202.782%205.135%203.055%205.135%20L%203.835%205.135%20L%202.8860002%200.104%20C%202.743%20-0.637%202.6130002%20-1.183%202.496%20-1.547%20C%202.3400002%20-2.028%202.119%20-2.275%201.8330001%20-2.275%20C%201.638%20-2.275%201.482%20-2.223%201.339%20-2.132%20C%201.755%20-2.0670002%201.963%20-1.82%201.963%20-1.404%20C%201.963%20-1.066%201.794%20-0.897%201.4430001%20-0.897%20C%201.001%20-0.897%200.689%20-1.2870001%200.689%20-1.7290001%20C%200.689%20-2.301%201.222%20-2.665%201.8330001%20-2.665%20C%202.158%20-2.665%202.457%20-2.535%202.704%20-2.262%20C%203.1200001%20-1.8330001%203.4450002%20-1.222%203.6790001%20-0.403%20C%203.822%200.104%203.9520001%200.598%204.043%201.092%20L%204.797%205.135%20L%205.863%205.135%20C%206.162%205.135%206.2920003%205.1480002%206.2920003%205.447%20C%206.2920003%205.564%206.162%205.629%205.902%205.629%20L%204.901%205.629%20C%204.979%206.162%205.343%208.125%205.46%208.372%20C%205.59%208.645%205.7720003%208.775001%206.006%208.775001%20C%206.201%208.775001%206.3700004%208.723001%206.513%208.632%20C%206.11%208.541%205.902%208.307%205.902%207.9040003%20C%205.902%207.566%206.071%207.3970003%206.422%207.3970003%20C%206.8640003%207.3970003%207.176%207.787%207.176%208.229%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6854545454545454em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; has
effect &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2010.296%2021.878999999999998%22%20width%3D%2210.296pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9308D3AA5B63656D688EAB82DBF8B4B8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9308D3AA5B63656D688EAB82DBF8B4B8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.5870001%208.528%20C%202.5870001%208.398%202.73%208.333%203.003%208.333%20C%203.523%208.333%203.783%208.281%203.783%208.1640005%20C%203.783%208.125%203.757%208.034%203.7180002%207.8650002%20L%202.028%201.066%20C%201.963%200.78000003%201.8330001%200.611%201.638%200.546%20C%201.547%200.52%201.3130001%200.507%200.91%200.507%20C%200.624%200.507%200.49400002%200.481%200.49400002%200.208%20C%200.49400002%200.065%200.637%200%200.91%200%20L%207.579%200%20C%207.8910003%200%207.9170003%200.026%208.021%200.24700001%20L%208.541%201.417%20C%208.892%202.223%209.139%202.821%209.282001%203.224%20C%209.2560005%203.341%209.217%203.4190001%209.074%203.4190001%20C%208.983%203.4190001%208.905%203.354%208.853001%203.237%20C%208.528%202.47%208.216001%201.885%207.9040003%201.469%20C%207.3840003%200.767%206.617%200.507%205.395%200.507%20L%203.51%200.507%20C%203.38%200.507%203.289%200.507%203.237%200.52%20C%203.1590002%200.52%203.1200001%200.546%203.1200001%200.58500004%20C%203.1200001%200.611%203.1460001%200.702%203.1850002%200.871%20L%204.043%204.342%20L%205.278%204.342%20C%205.889%204.342%206.214%204.264%206.2790003%204.0950003%20C%206.3050003%204.03%206.3180003%203.9390001%206.3180003%203.809%20C%206.3180003%203.64%206.2920003%203.4320002%206.227%203.1850002%20C%206.201%203.1200001%206.188%203.068%206.188%203.029%20C%206.188%202.8990002%206.2660003%202.834%206.409%202.834%20C%206.526%202.834%206.604%202.938%206.656%203.1330001%20L%207.3840003%206.149%20C%207.3840003%206.2790003%207.3190002%206.3440003%207.176%206.3440003%20C%207.072%206.3440003%206.994%206.2530003%206.955%206.071%20C%206.8250003%205.564%206.656%205.2390003%206.435%205.083%20C%206.214%204.927%205.85%204.849%205.317%204.849%20L%204.173%204.849%20L%204.927%207.8780003%20C%205.031%208.32%205.031%208.333%205.577%208.333%20L%207.3840003%208.333%20C%208.047%208.333%208.502%208.268001%208.749001%208.1380005%20C%209.113%207.9430003%209.295%207.553%209.295%206.968%20C%209.295%206.747%209.282001%206.513%209.243%206.2920003%20C%209.243%206.2660003%209.243%206.227%209.2300005%206.175%20L%209.2300005%206.058%20C%209.2300005%205.915%209.295%205.85%209.425%205.85%20C%209.555%205.85%209.633%205.967%209.659%206.214%20L%209.919001%208.437%20C%209.958%208.801001%209.867001%208.84%209.516%208.84%20L%203.029%208.84%20C%202.73%208.84%202.5870001%208.827001%202.5870001%208.528%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.9359999999999999em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, and &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.525999999999999%2021.878999999999998%22%20width%3D%226.525999999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9E2AD06FF54CF56D71BB33B9D0AE859D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9E2AD06FF54CF56D71BB33B9D0AE859D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%200.19500001%20-1.8330001%20C%200.19500001%20-2.392%200.78000003%20-2.665%201.95%20-2.665%20C%202.561%20-2.665%203.1330001%20-2.509%203.64%20-2.21%20C%204.212%20-1.872%204.563%20-1.417%204.7060003%20-0.85800004%20L%206.123%204.849%20C%206.149%204.979%206.162%205.057%206.162%205.096%20C%206.162%205.356%206.019%205.486%205.7460003%205.486%20C%205.46%205.486%205.278%205.33%205.1870003%205.031%20C%204.901%205.512%204.511%205.7460003%204.03%205.7460003%20C%203.198%205.7460003%202.457%205.33%201.82%204.498%20C%201.235%203.7180002%200.936%202.8990002%200.936%202.0540001%20C%200.936%200.92300004%201.599%20-0.039%202.691%20-0.039%20C%203.198%20-0.039%203.6660001%200.18200001%204.0950003%200.611%20L%203.7050002%20-0.92300004%20C%203.328%20-1.82%202.743%20-2.275%201.924%20-2.275%20C%201.5860001%20-2.275%201.3000001%20-2.249%201.066%20-2.197%20C%201.339%20-2.0540001%201.469%20-1.8330001%201.469%20-1.534%20C%201.469%20-1.209%201.2870001%20-1.04%200.936%20-1.04%20C%200.52%20-1.04%200.19500001%20-1.417%200.19500001%20-1.8330001%20Z%20M%204.6280003%205.096%20C%204.888%204.823%205.018%204.563%205.018%204.303%20C%205.018%204.29%205.005%204.225%204.979%204.1340003%20L%204.368%201.677%20C%204.29%201.378%204.0690002%201.066%203.7180002%200.78000003%20C%203.367%200.49400002%203.029%200.351%202.73%200.351%20C%202.21%200.351%201.95%200.72800004%201.95%201.482%20C%201.95%202.197%202.392%203.783%202.652%204.251%20C%203.055%204.992%203.51%205.356%204.043%205.356%20C%204.277%205.356%204.472%205.2650003%204.6280003%205.096%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5932727272727272em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; calls &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.54%2021.878999999999998%22%20width%3D%227.54pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9613EA3878B139E19656A35D87E70181%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9613EA3878B139E19656A35D87E70181%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.176%208.229%20C%207.176%208.801001%206.617%209.165%206.006%209.165%20C%205.2000003%209.165%204.6410003%208.645%204.342%207.618%20C%204.277%207.3840003%204.1340003%206.721%203.926%205.629%20L%203.081%205.629%20C%202.795%205.629%202.652%205.616%202.652%205.343%20C%202.652%205.2000003%202.782%205.135%203.055%205.135%20L%203.835%205.135%20L%202.8860002%200.104%20C%202.743%20-0.637%202.6130002%20-1.183%202.496%20-1.547%20C%202.3400002%20-2.028%202.119%20-2.275%201.8330001%20-2.275%20C%201.638%20-2.275%201.482%20-2.223%201.339%20-2.132%20C%201.755%20-2.0670002%201.963%20-1.82%201.963%20-1.404%20C%201.963%20-1.066%201.794%20-0.897%201.4430001%20-0.897%20C%201.001%20-0.897%200.689%20-1.2870001%200.689%20-1.7290001%20C%200.689%20-2.301%201.222%20-2.665%201.8330001%20-2.665%20C%202.158%20-2.665%202.457%20-2.535%202.704%20-2.262%20C%203.1200001%20-1.8330001%203.4450002%20-1.222%203.6790001%20-0.403%20C%203.822%200.104%203.9520001%200.598%204.043%201.092%20L%204.797%205.135%20L%205.863%205.135%20C%206.162%205.135%206.2920003%205.1480002%206.2920003%205.447%20C%206.2920003%205.564%206.162%205.629%205.902%205.629%20L%204.901%205.629%20C%204.979%206.162%205.343%208.125%205.46%208.372%20C%205.59%208.645%205.7720003%208.775001%206.006%208.775001%20C%206.201%208.775001%206.3700004%208.723001%206.513%208.632%20C%206.11%208.541%205.902%208.307%205.902%207.9040003%20C%205.902%207.566%206.071%207.3970003%206.422%207.3970003%20C%206.8640003%207.3970003%207.176%207.787%207.176%208.229%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6854545454545454em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, then &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.525999999999999%2021.878999999999998%22%20width%3D%226.525999999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9E2AD06FF54CF56D71BB33B9D0AE859D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9E2AD06FF54CF56D71BB33B9D0AE859D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%200.19500001%20-1.8330001%20C%200.19500001%20-2.392%200.78000003%20-2.665%201.95%20-2.665%20C%202.561%20-2.665%203.1330001%20-2.509%203.64%20-2.21%20C%204.212%20-1.872%204.563%20-1.417%204.7060003%20-0.85800004%20L%206.123%204.849%20C%206.149%204.979%206.162%205.057%206.162%205.096%20C%206.162%205.356%206.019%205.486%205.7460003%205.486%20C%205.46%205.486%205.278%205.33%205.1870003%205.031%20C%204.901%205.512%204.511%205.7460003%204.03%205.7460003%20C%203.198%205.7460003%202.457%205.33%201.82%204.498%20C%201.235%203.7180002%200.936%202.8990002%200.936%202.0540001%20C%200.936%200.92300004%201.599%20-0.039%202.691%20-0.039%20C%203.198%20-0.039%203.6660001%200.18200001%204.0950003%200.611%20L%203.7050002%20-0.92300004%20C%203.328%20-1.82%202.743%20-2.275%201.924%20-2.275%20C%201.5860001%20-2.275%201.3000001%20-2.249%201.066%20-2.197%20C%201.339%20-2.0540001%201.469%20-1.8330001%201.469%20-1.534%20C%201.469%20-1.209%201.2870001%20-1.04%200.936%20-1.04%20C%200.52%20-1.04%200.19500001%20-1.417%200.19500001%20-1.8330001%20Z%20M%204.6280003%205.096%20C%204.888%204.823%205.018%204.563%205.018%204.303%20C%205.018%204.29%205.005%204.225%204.979%204.1340003%20L%204.368%201.677%20C%204.29%201.378%204.0690002%201.066%203.7180002%200.78000003%20C%203.367%200.49400002%203.029%200.351%202.73%200.351%20C%202.21%200.351%201.95%200.72800004%201.95%201.482%20C%201.95%202.197%202.392%203.783%202.652%204.251%20C%203.055%204.992%203.51%205.356%204.043%205.356%20C%204.277%205.356%204.472%205.2650003%204.6280003%205.096%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5932727272727272em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; also has effect &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2010.296%2021.878999999999998%22%20width%3D%2210.296pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9308D3AA5B63656D688EAB82DBF8B4B8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9308D3AA5B63656D688EAB82DBF8B4B8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.5870001%208.528%20C%202.5870001%208.398%202.73%208.333%203.003%208.333%20C%203.523%208.333%203.783%208.281%203.783%208.1640005%20C%203.783%208.125%203.757%208.034%203.7180002%207.8650002%20L%202.028%201.066%20C%201.963%200.78000003%201.8330001%200.611%201.638%200.546%20C%201.547%200.52%201.3130001%200.507%200.91%200.507%20C%200.624%200.507%200.49400002%200.481%200.49400002%200.208%20C%200.49400002%200.065%200.637%200%200.91%200%20L%207.579%200%20C%207.8910003%200%207.9170003%200.026%208.021%200.24700001%20L%208.541%201.417%20C%208.892%202.223%209.139%202.821%209.282001%203.224%20C%209.2560005%203.341%209.217%203.4190001%209.074%203.4190001%20C%208.983%203.4190001%208.905%203.354%208.853001%203.237%20C%208.528%202.47%208.216001%201.885%207.9040003%201.469%20C%207.3840003%200.767%206.617%200.507%205.395%200.507%20L%203.51%200.507%20C%203.38%200.507%203.289%200.507%203.237%200.52%20C%203.1590002%200.52%203.1200001%200.546%203.1200001%200.58500004%20C%203.1200001%200.611%203.1460001%200.702%203.1850002%200.871%20L%204.043%204.342%20L%205.278%204.342%20C%205.889%204.342%206.214%204.264%206.2790003%204.0950003%20C%206.3050003%204.03%206.3180003%203.9390001%206.3180003%203.809%20C%206.3180003%203.64%206.2920003%203.4320002%206.227%203.1850002%20C%206.201%203.1200001%206.188%203.068%206.188%203.029%20C%206.188%202.8990002%206.2660003%202.834%206.409%202.834%20C%206.526%202.834%206.604%202.938%206.656%203.1330001%20L%207.3840003%206.149%20C%207.3840003%206.2790003%207.3190002%206.3440003%207.176%206.3440003%20C%207.072%206.3440003%206.994%206.2530003%206.955%206.071%20C%206.8250003%205.564%206.656%205.2390003%206.435%205.083%20C%206.214%204.927%205.85%204.849%205.317%204.849%20L%204.173%204.849%20L%204.927%207.8780003%20C%205.031%208.32%205.031%208.333%205.577%208.333%20L%207.3840003%208.333%20C%208.047%208.333%208.502%208.268001%208.749001%208.1380005%20C%209.113%207.9430003%209.295%207.553%209.295%206.968%20C%209.295%206.747%209.282001%206.513%209.243%206.2920003%20C%209.243%206.2660003%209.243%206.227%209.2300005%206.175%20L%209.2300005%206.058%20C%209.2300005%205.915%209.295%205.85%209.425%205.85%20C%209.555%205.85%209.633%205.967%209.659%206.214%20L%209.919001%208.437%20C%209.958%208.801001%209.867001%208.84%209.516%208.84%20L%203.029%208.84%20C%202.73%208.84%202.5870001%208.827001%202.5870001%208.528%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.9359999999999999em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;To build some examples, let’s make a new fake programming language
called RustE (Rust, with Effects). We’ll make only a few syntactic
changes, allowing the creation of effects and for effects to be
annotated with a &lt;code&gt;can&lt;&#x2F;code&gt; clause describing their effects.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;effect Bar &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;foo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;can Bar &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;println!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;bar!&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If we made a new function &lt;code&gt;baz&lt;&#x2F;code&gt; which called &lt;code&gt;foo&lt;&#x2F;code&gt;, &lt;code&gt;baz&lt;&#x2F;code&gt; would also
have to have the effect &lt;code&gt;Bar&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;baz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-support z-function z-rust&quot;&gt;foo&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; compile error! baz() calls foo(), which has effect Bar, but baz() cannot Bar!
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;qux&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;can Bar &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-support z-function z-rust&quot;&gt;foo&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; this is ok though
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To avoid the &lt;a href=&quot;https:&#x2F;&#x2F;journal.stuffwithstuff.com&#x2F;2015&#x2F;02&#x2F;01&#x2F;what-color-is-your-function&quot;&gt;function
coloring&lt;&#x2F;a&gt;
problem, we’ll also allow for &lt;code&gt;handle&lt;&#x2F;code&gt; clauses, which allow a function
&lt;em&gt;without&lt;&#x2F;em&gt; an effect to call a function &lt;em&gt;with&lt;&#x2F;em&gt; an effect.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;baz2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    handle Bar &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Bar was handled, so no compile error
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-support z-function z-rust&quot;&gt;foo&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We can add some texture by letting effects also call procedures which go
all the way up to their handlers. The handler can choose to resume,
returning execution to the effect caller, or to &lt;code&gt;break&lt;&#x2F;code&gt;, escaping from
the handler to the scope outside the handler.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;effect GetWidget &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;make_widget&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;eat_widgets&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;can GetWidget &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;loop&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; w &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;GetWidget&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;make_widget&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;println!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;mm, tasty &lt;span class=&quot;z-constant z-other z-placeholder z-rust&quot;&gt;{w}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;feed_widgets&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; widgets &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;vec!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    handle GetWidget &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;make_widget&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;match&lt;&#x2F;span&gt; widgets&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;pop&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;w&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt; w&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-support z-type z-rust&quot;&gt;None&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;break&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-support z-function z-rust&quot;&gt;eat_widgets&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;println!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;out of widgets :(&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; expected output:
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; ----------------
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; mm, tasty 3
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; mm, tasty 2
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; mm, tasty 1
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; out of widgets :(
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Our final wrinkle: effects and their functions may have generic types!&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;effect &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Fail&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;E&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;fail&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; E&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-rust&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;do_my_best&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;can &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Fail&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-lifetime z-rust&quot;&gt;&amp;#39;static&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;str&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; x &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;==&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Fail&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;fail&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;can&amp;#39;t divide by zero&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;else&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;println!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-placeholder z-rust&quot;&gt;{}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;&#x2F;&lt;&#x2F;span&gt; x&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    handle &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Fail&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-lifetime z-rust&quot;&gt;&amp;#39;static&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;str&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;fail&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;s&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-lifetime z-rust&quot;&gt;&amp;#39;static&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;str&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-rust&quot;&gt;!&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;println!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-placeholder z-rust&quot;&gt;{s}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;break&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-support z-function z-rust&quot;&gt;do_my_best&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-support z-function z-rust&quot;&gt;do_my_best&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;effects-can-model-lots-of-kinds-of-functions&quot;&gt;Effects can model lots of kinds of functions&lt;&#x2F;h2&gt;
&lt;p&gt;We can model many language features as special cases pf effects. In
fact, the handling the effect &lt;code&gt;Fail&lt;&#x2F;code&gt; in the example above is equivalent
to a &lt;code&gt;try&lt;&#x2F;code&gt;-&lt;code&gt;catch&lt;&#x2F;code&gt; statement with checked exceptions!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;unsafe&lt;&#x2F;code&gt; is also pretty trivially an effect - any function which is
unsafe can have the &lt;code&gt;Unsafe&lt;&#x2F;code&gt; effect, while any &lt;code&gt;unsafe&lt;&#x2F;code&gt; block desugars
to a handler. If you added effects to the original Rust language, it
might be possible to integrate them in a backward-compatible way into
the language.&lt;&#x2F;p&gt;
&lt;p&gt;The same applies for &lt;code&gt;async&lt;&#x2F;code&gt;, I&#x2F;O, and allocations. If you squint hard
enough, you might be able to imagine a case where interior mutability is
a sort of effect handler too. Surprisingly enough, &lt;code&gt;const&lt;&#x2F;code&gt; isn’t really
an effect, but non-&lt;code&gt;const&lt;&#x2F;code&gt; code is! Non-&lt;code&gt;const&lt;&#x2F;code&gt; code can call &lt;code&gt;const&lt;&#x2F;code&gt;
functions, but not the other way around, so running at runtime is the
effect. I suppose you could alternately come up with &quot;contravariant&quot;
effects, by which any function with contravariant effect &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2014.727699999999999%2021.878999999999998%22%20width%3D%2214.727699999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9308D3AA5B63656D688EAB82DBF8B4B8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.296%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF9C7830800E71C75A67D819743D6D92F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9308D3AA5B63656D688EAB82DBF8B4B8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.5870001%208.528%20C%202.5870001%208.398%202.73%208.333%203.003%208.333%20C%203.523%208.333%203.783%208.281%203.783%208.1640005%20C%203.783%208.125%203.757%208.034%203.7180002%207.8650002%20L%202.028%201.066%20C%201.963%200.78000003%201.8330001%200.611%201.638%200.546%20C%201.547%200.52%201.3130001%200.507%200.91%200.507%20C%200.624%200.507%200.49400002%200.481%200.49400002%200.208%20C%200.49400002%200.065%200.637%200%200.91%200%20L%207.579%200%20C%207.8910003%200%207.9170003%200.026%208.021%200.24700001%20L%208.541%201.417%20C%208.892%202.223%209.139%202.821%209.282001%203.224%20C%209.2560005%203.341%209.217%203.4190001%209.074%203.4190001%20C%208.983%203.4190001%208.905%203.354%208.853001%203.237%20C%208.528%202.47%208.216001%201.885%207.9040003%201.469%20C%207.3840003%200.767%206.617%200.507%205.395%200.507%20L%203.51%200.507%20C%203.38%200.507%203.289%200.507%203.237%200.52%20C%203.1590002%200.52%203.1200001%200.546%203.1200001%200.58500004%20C%203.1200001%200.611%203.1460001%200.702%203.1850002%200.871%20L%204.043%204.342%20L%205.278%204.342%20C%205.889%204.342%206.214%204.264%206.2790003%204.0950003%20C%206.3050003%204.03%206.3180003%203.9390001%206.3180003%203.809%20C%206.3180003%203.64%206.2920003%203.4320002%206.227%203.1850002%20C%206.201%203.1200001%206.188%203.068%206.188%203.029%20C%206.188%202.8990002%206.2660003%202.834%206.409%202.834%20C%206.526%202.834%206.604%202.938%206.656%203.1330001%20L%207.3840003%206.149%20C%207.3840003%206.2790003%207.3190002%206.3440003%207.176%206.3440003%20C%207.072%206.3440003%206.994%206.2530003%206.955%206.071%20C%206.8250003%205.564%206.656%205.2390003%206.435%205.083%20C%206.214%204.927%205.85%204.849%205.317%204.849%20L%204.173%204.849%20L%204.927%207.8780003%20C%205.031%208.32%205.031%208.333%205.577%208.333%20L%207.3840003%208.333%20C%208.047%208.333%208.502%208.268001%208.749001%208.1380005%20C%209.113%207.9430003%209.295%207.553%209.295%206.968%20C%209.295%206.747%209.282001%206.513%209.243%206.2920003%20C%209.243%206.2660003%209.243%206.227%209.2300005%206.175%20L%209.2300005%206.058%20C%209.2300005%205.915%209.295%205.85%209.425%205.85%20C%209.555%205.85%209.633%205.967%209.659%206.214%20L%209.919001%208.437%20C%209.958%208.801001%209.867001%208.84%209.516%208.84%20L%203.029%208.84%20C%202.73%208.84%202.5870001%208.827001%202.5870001%208.528%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF9C7830800E71C75A67D819743D6D92F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.5844002%204.9959%20C%202.3569002%204.9959%202.2022002%204.9049%202.1203%204.7138004%20L%200.59150004%200.8736%20L%201.001%200.8736%20L%203.0212002%204.2133%20C%203.0667002%204.2952003%203.094%204.3862%203.094%204.4863%20C%203.094%204.7593%202.8574002%204.9959%202.5844002%204.9959%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.338881818181818em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;
may only call functions which also have the effect &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2014.727699999999999%2021.878999999999998%22%20width%3D%2214.727699999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9308D3AA5B63656D688EAB82DBF8B4B8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.296%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF9C7830800E71C75A67D819743D6D92F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9308D3AA5B63656D688EAB82DBF8B4B8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.5870001%208.528%20C%202.5870001%208.398%202.73%208.333%203.003%208.333%20C%203.523%208.333%203.783%208.281%203.783%208.1640005%20C%203.783%208.125%203.757%208.034%203.7180002%207.8650002%20L%202.028%201.066%20C%201.963%200.78000003%201.8330001%200.611%201.638%200.546%20C%201.547%200.52%201.3130001%200.507%200.91%200.507%20C%200.624%200.507%200.49400002%200.481%200.49400002%200.208%20C%200.49400002%200.065%200.637%200%200.91%200%20L%207.579%200%20C%207.8910003%200%207.9170003%200.026%208.021%200.24700001%20L%208.541%201.417%20C%208.892%202.223%209.139%202.821%209.282001%203.224%20C%209.2560005%203.341%209.217%203.4190001%209.074%203.4190001%20C%208.983%203.4190001%208.905%203.354%208.853001%203.237%20C%208.528%202.47%208.216001%201.885%207.9040003%201.469%20C%207.3840003%200.767%206.617%200.507%205.395%200.507%20L%203.51%200.507%20C%203.38%200.507%203.289%200.507%203.237%200.52%20C%203.1590002%200.52%203.1200001%200.546%203.1200001%200.58500004%20C%203.1200001%200.611%203.1460001%200.702%203.1850002%200.871%20L%204.043%204.342%20L%205.278%204.342%20C%205.889%204.342%206.214%204.264%206.2790003%204.0950003%20C%206.3050003%204.03%206.3180003%203.9390001%206.3180003%203.809%20C%206.3180003%203.64%206.2920003%203.4320002%206.227%203.1850002%20C%206.201%203.1200001%206.188%203.068%206.188%203.029%20C%206.188%202.8990002%206.2660003%202.834%206.409%202.834%20C%206.526%202.834%206.604%202.938%206.656%203.1330001%20L%207.3840003%206.149%20C%207.3840003%206.2790003%207.3190002%206.3440003%207.176%206.3440003%20C%207.072%206.3440003%206.994%206.2530003%206.955%206.071%20C%206.8250003%205.564%206.656%205.2390003%206.435%205.083%20C%206.214%204.927%205.85%204.849%205.317%204.849%20L%204.173%204.849%20L%204.927%207.8780003%20C%205.031%208.32%205.031%208.333%205.577%208.333%20L%207.3840003%208.333%20C%208.047%208.333%208.502%208.268001%208.749001%208.1380005%20C%209.113%207.9430003%209.295%207.553%209.295%206.968%20C%209.295%206.747%209.282001%206.513%209.243%206.2920003%20C%209.243%206.2660003%209.243%206.227%209.2300005%206.175%20L%209.2300005%206.058%20C%209.2300005%205.915%209.295%205.85%209.425%205.85%20C%209.555%205.85%209.633%205.967%209.659%206.214%20L%209.919001%208.437%20C%209.958%208.801001%209.867001%208.84%209.516%208.84%20L%203.029%208.84%20C%202.73%208.84%202.5870001%208.827001%202.5870001%208.528%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF9C7830800E71C75A67D819743D6D92F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.5844002%204.9959%20C%202.3569002%204.9959%202.2022002%204.9049%202.1203%204.7138004%20L%200.59150004%200.8736%20L%201.001%200.8736%20L%203.0212002%204.2133%20C%203.0667002%204.2952003%203.094%204.3862%203.094%204.4863%20C%203.094%204.7593%202.8574002%204.9959%202.5844002%204.9959%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.338881818181818em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;. Then
&lt;code&gt;const&lt;&#x2F;code&gt; would be one such contravariant effect, but, honestly, it’s not
worth the hassle.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;effect-polymorphism-comes-in&quot;&gt;Effect polymorphism comes in&lt;&#x2F;h2&gt;
&lt;p&gt;In the same way that a function could be polymorphic over types (as with
generics), why not have functions be polymorphic over &lt;em&gt;effects&lt;&#x2F;em&gt;? If we
return to our original example of &lt;code&gt;my_sum&lt;&#x2F;code&gt;, we can fold all the possible
versions of &lt;code&gt;my_sum&lt;&#x2F;code&gt; from &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2013.652599999999998%2021.878999999999998%22%20width%3D%2213.652599999999998pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.5%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC6909A185FA3625676D693EED70DCC0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g626C7FE0610F5A21B7FCC6F361F06C4A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.081%208.658%20C%202.418%208.658%201.8590001%208.424%201.378%207.9560003%20C%200.897%207.488%200.65000004%206.942%200.65000004%206.2790003%20C%200.65000004%205.837%200.975%205.512%201.378%205.512%20C%201.768%205.512%202.093%205.85%202.093%206.2400002%20C%202.093%206.669%201.781%206.968%201.365%206.968%20C%201.326%206.968%201.3000001%206.968%201.274%206.955%20C%201.521%207.592%202.093%208.151%202.9120002%208.151%20C%203.9780002%208.151%204.576%207.228%204.576%206.11%20C%204.576%205.2390003%204.1340003%204.303%203.25%203.315%20L%200.806%200.559%20C%200.637%200.36400002%200.65000004%200.377%200.65000004%200%20L%205.473%200%20L%205.85%202.3400002%20L%205.421%202.3400002%20C%205.317%201.677%205.2260003%201.3000001%205.1480002%201.183%20C%205.083%201.118%204.6930003%201.092%203.9780002%201.092%20L%201.807%201.092%20L%203.068%202.3270001%20C%203.9520001%203.1590002%205.07%204.056%205.447%204.745%20C%205.7070003%205.2000003%205.837%205.655%205.837%206.11%20C%205.837%207.644%204.6410003%208.658%203.081%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC6909A185FA3625676D693EED70DCC0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.4924%204.0131%20C%201.1921%204.0131%200.94640005%203.8493001%200.75530005%203.5126002%20C%200.6279%203.2851002%200.5278%203.0485%200.46410003%202.7846%20C%200.4368%202.6845002%200.4277%202.6299002%200.4277%202.6117%20C%200.4277%202.5116%200.49140003%202.457%200.61880004%202.457%20C%200.7917%202.457%200.8008%202.5571%200.8463%202.7482002%20C%201.001%203.3761%201.2103001%203.6946%201.4742%203.6946%20C%201.6471001%203.6946%201.7290001%203.5581002%201.7290001%203.2851002%20C%201.7290001%203.1850002%201.6835%202.9484%201.5834%202.5571%20L%201.1011001%200.6097%20C%201.0374%200.36400002%201.0101%200.23660001%201.0101%200.2275%20C%201.0101%200.0182%201.1284001%20-0.091000006%201.3559%20-0.091000006%20C%201.5288%20-0.091000006%201.6562%20-0.0182%201.7381%200.12740001%20C%201.7654%200.18200001%201.82%200.3731%201.9019%200.6916%20L%202.0930002%201.4924%20C%202.2022002%201.9201001%202.2659001%202.1567001%202.2841%202.2113001%20C%202.3569002%202.4479%202.4661002%202.6754%202.6208%202.8847%20C%203.003%203.4216%203.4398%203.6946%203.9403002%203.6946%20C%204.2679%203.6946%204.4317%203.4944%204.4317%203.1031%20C%204.4317%202.7482002%204.2588%202.1203%203.9039001%201.2103001%20C%203.8129%200.97370005%203.7674003%200.80990005%203.7674003%200.7098%20C%203.7674003%200.2184%204.1678%20-0.091000006%204.6592%20-0.091000006%20C%205.0869%20-0.091000006%205.4327%200.12740001%205.6784%200.56420004%20C%205.8877%200.9373%205.9878%201.1830001%205.9878%201.3104%20C%205.9878%201.4105%205.9241004%201.4651%205.8058004%201.4651%20C%205.7421002%201.4560001%205.6784%201.4105%205.6147003%201.3195001%20C%205.6056004%201.3104%205.6056004%201.2922001%205.6056004%201.2831%20C%205.3963003%200.5824%205.0869%200.2275%204.6865%200.2275%20C%204.5591%200.2275%204.4954%200.3185%204.4954%200.50960004%20C%204.4954%200.637%204.5682%200.8736%204.7047%201.2194%20C%205.0232%202.0293%205.1779003%202.6117%205.1779003%202.9575002%20C%205.1779003%203.3761%205.0323%203.6673002%204.7502003%203.8220003%20C%204.5227003%203.9494002%204.2588%204.0131%203.9767%204.0131%20C%203.3852%204.0131%202.8847%203.7583%202.4843001%203.2487001%20C%202.4024%203.6946%202.0111%204.0131%201.4924%204.0131%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.2411454545454543em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; variants to just one.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;MagicNumber&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    effect Effect&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;magic_number&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt; can &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Effect&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;my_sum&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;N&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; MagicNumber&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt; can &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;N&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Effect&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; total &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        total &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;N&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;magic_number&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    total
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I’m pretty happy with this! There’s very little ceremony involved, and
we get to express vastly more things than we could before!&lt;&#x2F;p&gt;
&lt;p&gt;Of course, once we have something like this system, there are a lot of
obvious questions:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Is there a complement to &lt;code&gt;type _ = impl Trait&lt;&#x2F;code&gt; for effects?&lt;&#x2F;li&gt;
&lt;li&gt;How should effects compose?&lt;&#x2F;li&gt;
&lt;li&gt;Can we treat effects like data?&lt;&#x2F;li&gt;
&lt;li&gt;Can we do introspection or reflection on effects?&lt;&#x2F;li&gt;
&lt;li&gt;Can we do dynamic-dispatch on effects at runtime?&lt;&#x2F;li&gt;
&lt;li&gt;If Rust also got linear types, how would they compose with
cancellation in effect handlers?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;For now, though, it would be really nice to just write code which is
polymorphic over its effects.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;i-m-no-closer-to-fixing-my-python-issues&quot;&gt;I’m no closer to fixing my Python issues&lt;&#x2F;h2&gt;
&lt;p&gt;It’s one thing to muse about a solution to my problem and another thing
entirely to actually solve it. As much as I would like to go completely
down the rabbit hole and implement a dream language with algebraic
effects, linear types, trait-based polymorphism, and zero-cost
abstraction, I also have to get my projects done some time this century.&lt;&#x2F;p&gt;
&lt;p&gt;There’s been a lot of ink spilled about efficiently compiling algebraic
effects, but at the time of writing there’s no mainstream programming
language that does so. &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;koka-lang&#x2F;koka&quot;&gt;Koka&lt;&#x2F;a&gt; is
probably the closest thing that we have to such a language, but it’s
admittedly not production-ready.&lt;&#x2F;p&gt;
&lt;p&gt;For now, I will probably end up just making code that has weird effects
panic. It’s not the best choice, but it’s good enough for now.&lt;&#x2F;p&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;aedancullen.com&#x2F;&quot;&gt;Aedan&lt;&#x2F;a&gt;,
&lt;a href=&quot;https:&#x2F;&#x2F;shreyasminocha.me&#x2F;&quot;&gt;Shreyas&lt;&#x2F;a&gt;, and &lt;a href=&quot;https:&#x2F;&#x2F;wisha.page&#x2F;&quot;&gt;Wisha&lt;&#x2F;a&gt;
for reviewing this post!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Reflections on a year of grad school</title>
          <pubDate>Thu, 15 Aug 2024 00:00:00 +0000</pubDate>
          <author>Clayton Ramsey</author>
          <link>https://claytonwramsey.com/blog/first-year/</link>
          <guid>https://claytonwramsey.com/blog/first-year/</guid>
          <description xml:base="https://claytonwramsey.com/blog/first-year/">&lt;p&gt;I’m no wiser than last year, but at least I know a few more things.
August 15 marks one year of Ph.D. research, so I’m writing up my
experience with grad school for the sake of prospective grad students
and also as a time capsule for myself. Overall, my experience so far was
a huge success! I’ve had a lot of fun, made new friends, and produced
surprisingly good work, and I’m excited for the future.&lt;&#x2F;p&gt;
&lt;p&gt;As a brief greatest-hits list, I’ll note some of the big milestones I
achieved in the past year below — some personal and some professional.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;I won two fellowships (&lt;a href=&quot;https:&#x2F;&#x2F;www.nasa.gov&#x2F;nasa-space-technology-graduate-research-opportunities-nstgro&#x2F;&quot;&gt;NASA
NSTGRO&lt;&#x2F;a&gt;
and &lt;a href=&quot;https:&#x2F;&#x2F;ndseg.sysplus.com&#x2F;NDSEG&#x2F;about&#x2F;&quot;&gt;DOD NDSEG&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;I wrote a whole conference paper for &lt;a href=&quot;&#x2F;blog&#x2F;captree&quot;&gt;a project&lt;&#x2F;a&gt; and
presented it at &lt;a href=&quot;https:&#x2F;&#x2F;roboticsconference.org&quot;&gt;RSS&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;I started learning Mandarin!&lt;&#x2F;li&gt;
&lt;li&gt;I started ballroom dancing and also got a lot better at Lindy hop.&lt;&#x2F;li&gt;
&lt;li&gt;I passed my senior solo free dance test for my third “&lt;a href=&quot;https:&#x2F;&#x2F;www.usfigureskating.org&#x2F;skate&#x2F;test-structure&quot;&gt;gold
medal&lt;&#x2F;a&gt;” in
figure skating.&lt;&#x2F;li&gt;
&lt;li&gt;I set up &lt;a href=&quot;&#x2F;&quot;&gt;this very website!&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;finding-the-fun&quot;&gt;Finding the fun&lt;&#x2F;h2&gt;
&lt;p&gt;The common wisdom about graduate studies is that it requires
extraordinary self-discipline: a doctoral researcher is free to do
whatever they want, so they must direct themselves with little outside
guidance. Sadly, I am wildly undisciplined. I &lt;em&gt;hate&lt;&#x2F;em&gt; working on boring
things, and as soon as I have to actually engage with something I don’t
like, I give up and do something else, even if I cared about my original
task.&lt;&#x2F;p&gt;
&lt;p&gt;Perhaps the best case of this was when I was working on my fellowship
applications. I like writing, but don’t enjoy selling myself and find
the whole statement-writing process distasteful. Whenever I tried to
make progress on them, I would just stare at the document and feel bad
about my terminally slow progress. If this blog post were a fellowship
statement, I’d have to come up with some heartwarming story about how I
eventually made it suck less, but the truth is I didn’t. The process is
miserable and I only finished the applications by sucking it up and
pounding some words out at the very last minute.&lt;&#x2F;p&gt;
&lt;p&gt;Right now, my current project is in the same state. I’m not really sure
what I’m doing, and I’m a little lost as to what I should be doing
anyway. Meanwhile, I have a bunch of new responsibilities (combination
system administrator, teaching assistant, and gofer) which while not
particularly onerous offer a constant supply of distraction. I’m
currently living the cycle of opening up my project, writing a few lines
of probably-incorrect code, and then giving up and checking my email for
a simpler and better-defined task. The net result: on the outside, I
seem productive, but in reality I feel like I’m making no progress at
all.&lt;&#x2F;p&gt;
&lt;p&gt;Perhaps the long-term takeaway is that I have to stick to fun projects,
or at least find ways of making projects fun for myself. I’m happiest
when deep in the weeds of high-performance systems programming, and I
don’t mind debugging convoluted multithreaded algorithms — lockless
algorithms hold a special place in my heart. However, dependency
management, Python, Docker, hyperparameter tuning, and all that is just
exhausting to me in a way that makes me want to quit immediately. Maybe
the academic freedom of research is good for me, then, since it lets me
choose projects where I can actually make some sort of contribution.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;marketing-and-more&quot;&gt;Marketing and more&lt;&#x2F;h2&gt;
&lt;p&gt;Many academics, myself included, are quiet and reserved. This is
exclusively to our detriment.&lt;&#x2F;p&gt;
&lt;p&gt;I traveled to two conferences this year, and my biggest takeaway is that
advertisement, connections, and presentation dominate career outcomes.
When presenting work outwards, flashcraft often beats substance. If you
want attention for your work, you have to come up with a sufficiently
dramatic and exciting demonstration. On the converse, there’s an
extraodinary amount of research out there which is excellent in quality
but poorly advertised (in addition to some poor-quality,
poorly-advertised work).&lt;&#x2F;p&gt;
&lt;p&gt;When I presented my research at RSS, I had a pretty &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=BzDKdrU1VpM&quot;&gt;nice
demo&lt;&#x2F;a&gt; of a robot arm
dodging pool noodles as we waved them around the lab. When I made my
presentations for my work, I got some really excellent advice: move the
demo to the very front of the presentation to catch the audience’s
attention. This worked very well, and I was told my talk was quite
memorable. I think more than a few attendees knew me as “pool noodle
guy;” so to speak, the demo was much more important to my
community-wide impact than the rest of the methodology.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;getting-sidetracked&quot;&gt;Getting sidetracked&lt;&#x2F;h2&gt;
&lt;p&gt;I try very hard to have things that I do for fun outside of grad school.
You might notice that I stopped writing technical blog posts this
spring - that’s because I didn’t want to spend all day coding and
writing to come home to more coding and writing!&lt;&#x2F;p&gt;
&lt;p&gt;Now I’ve picked up a lot of non-technical hobbies. I started dancing a
few years ago, but now I dance a lot more often and do a lot more
styles. Although figure skating took something of a back burner for me
when I was in undergrad, I’m now making an effort to regularly
practice. I also tried learning to play guitar and re-learning playing
saxophone, but I bounced off of both (music is too hard!).&lt;&#x2F;p&gt;
&lt;p&gt;But the biggest side-thing I’ve gotten into recently is learning a new
language, namely, Mandarin. I realized that graduate students at my
university have free tuition, and on a whim last winter I decided to
take advantage of that. I signed up for introductory Chinese and since
haven’t looked back. I’m not sure how far I’ll go with it, but so far
I’m having a great time. According to Anki, I’ve spent some 56 hours
practicing vocabulary so far, and I’ve probably done about that much
again in real practice time. That’s nothing compared to the amount of
practice the average native speaker gets, but if I keep this up for a
few more years I might have a chance at sounding coherent :).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;looking-forward&quot;&gt;Looking forward&lt;&#x2F;h2&gt;
&lt;p&gt;My advisor, Lydia, is often busy being a famous roboticist, so for the
past year, &lt;a href=&quot;https:&#x2F;&#x2F;wbthomason.com&#x2F;&quot;&gt;Wil&lt;&#x2F;a&gt; and
&lt;a href=&quot;https:&#x2F;&#x2F;zkingston.com&#x2F;&quot;&gt;Zak&lt;&#x2F;a&gt;, two postdocs in the lab, have handled
day-to-day advising for me. However, they’re both leaving to &lt;del&gt;get real
jobs&lt;&#x2F;del&gt; further advance their careers.&lt;&#x2F;p&gt;
&lt;p&gt;This means I’ll have much less direct guidance in the future. My
former-postdocs plan to keep in touch, but I expect I’ll have to set a
lot more of my own direction. This is a little alarming to me: I worry
I’ll spend months or years chasing some impossible or irrelevant topic.
On the upside, though, it means I get to drill down into the stuff that
I personally find cool!&lt;&#x2F;p&gt;
&lt;p&gt;The arc of my thesis is also taking shape. My current guess is that my
thesis will revolve around taking robot planning (in all its forms) into
real-time applications. If I have my way, I’ll make that happen with a
mix of clever algorithms and software engineering, using a healthy
amount of parallelism to crank out as much performance as possible,
especially on limited hardware. Dovetailing with that, I want to try
exploring ways of improving fault tolerance and dynamic perception in
robotics, but I have fewer concrete ideas in mind for near-future
approaches.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Making robots plan faster with SIMD and Rust</title>
          <pubDate>Sat, 08 Jun 2024 00:00:00 +0000</pubDate>
          <author>Clayton Ramsey</author>
          <link>https://claytonwramsey.com/blog/captree/</link>
          <guid>https://claytonwramsey.com/blog/captree/</guid>
          <description xml:base="https://claytonwramsey.com/blog/captree/">&lt;p&gt;Systems programming and data structures meet to make instant
collision-checking.&lt;&#x2F;p&gt;
&lt;p&gt;I’m now wrapping up the first “real” research project of my Ph.D.,
which is both exciting and very stressful at the same time. I got to
experiment with a lot of really cool things, but most of them didn’t
actually work. I’m writing this blog post as a chance to explain all
the things I tried that didn’t work out, as well as to share the untold
story of the paper.&lt;&#x2F;p&gt;
&lt;p&gt;Special thanks to my collaborators at the &lt;a href=&quot;https:&#x2F;&#x2F;kavrakilab.org&quot;&gt;Kavraki
Lab&lt;&#x2F;a&gt;: &lt;a href=&quot;https:&#x2F;&#x2F;zkingston.com&#x2F;&quot;&gt;Zak Kingston&lt;&#x2F;a&gt;,
&lt;a href=&quot;https:&#x2F;&#x2F;wbthomason.com&#x2F;&quot;&gt;Wil Thomason&lt;&#x2F;a&gt;, and my advisor &lt;a href=&quot;https:&#x2F;&#x2F;profiles.rice.edu&#x2F;faculty&#x2F;lydia-e-kavraki&quot;&gt;Lydia
Kavraki&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;If you want to skip straight to just reading the final paper (which
we’ll be presenting at &lt;a href=&quot;https:&#x2F;&#x2F;roboticsconference.org&quot;&gt;Robotics: Science and
Systems&lt;&#x2F;a&gt;) check it out on arXiV
&lt;a href=&quot;https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;2406.02807&quot;&gt;here&lt;&#x2F;a&gt;. Alternately, if you want to
check out the code, take a look at the C++ implementation
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;kavrakilab&#x2F;vamp&quot;&gt;here&lt;&#x2F;a&gt; or the Rust implementation
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;claytonwramsey&#x2F;captree&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-problem-at-hand&quot;&gt;The problem at hand&lt;&#x2F;h2&gt;
&lt;p&gt;When we talk about &lt;dfn&gt;motion planning&lt;&#x2F;dfn&gt;, we refer to a relatively
simple problem: given a start position and an end position, find a safe,
continuous movement for a robot to move from the start to the end. There
are millions of variations on the problem setup (kinodynamic
constraints! uncertainty! multiple robots! multi-modal actions!
underactuation!) but all them look kind of similar if you squint hard
enough. There are lots of algorithms for planning - optimization-based,
controls-based, sampling-based, learning-based, and so on. In all these
algorithms, especially in sampling-based planning, we need an efficient
collision-checking routine for determining if a robot’s state is valid,
since the planning algorithm will perform thousands of collision-checks
for every plan.&lt;&#x2F;p&gt;
&lt;p&gt;A few months ago, Wil and Zak (two postdocs in my lab) published a
&lt;a href=&quot;https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;2309.14545v2&quot;&gt;paper&lt;&#x2F;a&gt; demonstrating dramatic
speedups by using SIMD and precompilation for motion planning. However,
their approach assumed that they had access to a primitive
representation of the environment, which is rarely the case in reality.
In many applications, robots must plan using their observed sensor
data - namely, point clouds.&lt;&#x2F;p&gt;
&lt;figure style=&quot;display: flex&quot;&gt;
&lt;div style=&quot;width: 50%&quot;&gt;
&lt;img src=&quot;panda.png&quot; &#x2F;&gt;
A Franka Emika Panda robot arm.
&lt;&#x2F;div&gt;
&lt;div style=&quot;width: 50%&quot;&gt;
&lt;img src=&quot;panda_sphere.png&quot; &#x2F;&gt;
A spherical approximation of the robot&#x27;s geometry.
&lt;&#x2F;div&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;We can start by assuming that our robot can be modeled as a set of balls
over some distance metric. Using the &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2014.7589%2021.878999999999998%22%20width%3D%2214.7589pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gDEE7FD83CDFF4315AA4AAA53EF2A34BF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%288.853000000000002%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g86111C2D5C8682C53BDA9AD6152C9992%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gDEE7FD83CDFF4315AA4AAA53EF2A34BF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.76%208.6710005%20C%206.76%208.814%206.669%208.879%206.5%208.879%20L%204.602%208.84%20L%202.8990002%208.879%20C%202.704%208.892%202.6000001%208.788%202.6000001%208.567%20C%202.6000001%208.476%202.639%208.411%202.717%208.398%20C%202.834%208.385%202.938%208.372%203.003%208.372%20C%203.4060001%208.359%203.627%208.333%203.6920002%208.32%20C%203.757%208.307%203.796%208.268001%203.796%208.203%20C%203.796%208.177%203.783%208.099%203.744%207.9690003%20L%202.028%201.066%20C%201.95%200.78000003%201.82%200.611%201.625%200.546%20C%201.547%200.52%201.3130001%200.507%200.91%200.507%20C%200.637%200.507%200.507%200.403%200.507%200.19500001%20C%200.507%200.065%200.637%200%200.91%200%20L%206.8510003%200%20C%207.176%200%207.202%200%207.293%200.24700001%20L%208.307%203.029%20C%208.346%203.1200001%208.359%203.1850002%208.359%203.224%20C%208.359%203.354%208.294001%203.4190001%208.151%203.4190001%20C%208.021%203.4190001%207.9560003%203.302%207.8910003%203.1200001%20C%207.644%202.483%207.4100003%202.002%207.215%201.7030001%20C%206.734%200.975%205.915%200.507%204.719%200.507%20L%203.51%200.507%20C%203.367%200.507%203.276%200.507%203.237%200.52%20C%203.1460001%200.52%203.107%200.546%203.107%200.58500004%20C%203.107%200.611%203.1330001%200.702%203.1720002%200.871%20L%204.901%207.813%20C%204.979%208.112%205.1480002%208.281%205.395%208.346%20C%205.473%208.359%205.7460003%208.372%206.214%208.372%20C%206.578%208.372%206.76%208.372%206.76%208.6710005%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g86111C2D5C8682C53BDA9AD6152C9992%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0829%203.8584%20C%201.3741001%203.8584%201.5925001%204.0768003%201.5925001%204.368%20C%201.5925001%204.6956%201.4196%204.8685%201.0829%204.8776%20C%201.2831%205.3053%201.7381%205.6511%202.3296%205.6511%20C%203.1304002%205.6511%203.6582003%205.0505004%203.6582003%204.2497%20C%203.6582003%203.8129%203.5035002%203.3943002%203.1850002%202.9848%20C%203.0303001%202.7755%202.9120002%202.6299002%202.8301%202.548%20L%200.67340004%200.4095%20C%200.5551%200.3003%200.5733%200.273%200.5733%200%20L%204.3225%200%20L%204.6046%201.7108%20L%204.2224%201.7108%20C%204.1587%201.2285%204.0859003%200.94640005%204.004%200.8827%20C%203.9585001%200.8554%203.6764002%200.83720005%203.1395001%200.83720005%20L%201.5925001%200.83720005%20C%202.2022002%201.3741001%202.7664%201.8564001%203.3033001%202.2841%20C%203.7128003%202.6026%204.004%202.8847%204.1860003%203.1304002%20C%204.459%203.4853%204.5955%203.8584%204.5955%204.2497%20C%204.5955%204.8139%204.3771%205.2598004%203.9312003%205.5874004%20C%203.5399%205.8877%203.0485%206.0424004%202.4661002%206.0424004%20C%201.9656001%206.0424004%201.5379001%205.8968%201.1648%205.6056004%20C%200.7735%205.2871003%200.5733%204.8867%200.5733%204.3953004%20C%200.5733%204.0859003%200.8008%203.8584%201.0829%203.8584%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.3417181818181818em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; norm, these balls are
spheres, which meshes conveniently with sphere-hierarchy representations
of robot geometry. This lets us neatly reduce the problem of
collision-checking all kinds of robot geometries into one simple case:
checking whether a some set of spheres collides with a set of points. In
addition to that, we would like to be able to do our collision checking
in parallel at an instruction level to radically improve our
performance.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;review-d-trees&quot;&gt;Review: &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.968%2021.878999999999998%22%20width%3D%226.968pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6BD6B5079591C663D089FFB042C868C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6BD6B5079591C663D089FFB042C868C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.317%204.589%20C%205.317%204.251%205.499%204.0820003%205.85%204.0820003%20C%206.3050003%204.0820003%206.604%204.485%206.604%204.927%20C%206.604%205.434%206.188%205.7850003%205.681%205.7850003%20C%205.096%205.7850003%204.472%205.395%203.783%204.6280003%20C%203.25%204.043%202.821%203.6660001%202.47%203.497%20L%203.783%208.827001%20C%203.757%208.944%203.7310002%209.022%203.562%209.022%20C%203.1460001%209.022%202.158%208.905%202.002%208.892%20C%201.807%208.866%201.7160001%208.775001%201.7160001%208.58%20C%201.7160001%208.45%201.8330001%208.385%202.0670002%208.385%20C%202.3140001%208.385%202.652%208.398%202.652%208.216001%20L%200.767%200.559%20C%200.72800004%200.416%200.71500003%200.32500002%200.71500003%200.273%20C%200.71500003%200%200.85800004%20-0.143%201.131%20-0.143%20C%201.352%20-0.143%201.521%20-0.039%201.612%200.156%20C%201.677%200.273%201.911%201.196%202.3270001%202.938%20C%203.003%202.8730001%203.7180002%202.548%203.7180002%201.898%20C%203.7180002%201.7030001%203.627%201.3130001%203.627%201.183%20C%203.627%200.442%204.1080003%20-0.143%204.849%20-0.143%20C%205.603%20-0.143%206.11%200.533%206.3700004%201.885%20C%206.3700004%202.002%206.3050003%202.0670002%206.175%202.0670002%20C%206.058%202.0670002%205.98%201.9760001%205.941%201.794%20C%205.655%200.767%205.304%200.24700001%204.875%200.24700001%20C%204.6410003%200.24700001%204.524%200.42900002%204.524%200.79300004%20C%204.524%201.001%204.6800003%201.7030001%204.6800003%201.911%20C%204.6800003%202.652%204.0820003%203.107%202.8730001%203.289%20C%203.1720002%203.497%203.51%203.796%203.874%204.186%20C%204.238%204.576%204.498%204.823%204.6670003%204.966%20C%205.018%205.2520003%205.356%205.395%205.655%205.395%20C%205.7850003%205.395%205.889%205.369%205.967%205.317%20C%205.616%205.2520003%205.317%204.927%205.317%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6334545454545455em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;-d trees&lt;&#x2F;h2&gt;
&lt;p&gt;There’s a simple solution to our collision-checking problem using a
&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Nearest_neighbor_search&quot;&gt;nearest-neighbors&lt;&#x2F;a&gt;
data structure. Given a point cloud represented as a set of points &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2010.166%2021.878999999999998%22%20width%3D%2210.166pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.215%208.879%20L%203.055%208.879%20C%202.756%208.879%202.6130002%208.866%202.6130002%208.58%20C%202.6130002%208.437%202.756%208.372%203.042%208.372%20C%203.302%208.372%203.822%208.411%203.822%208.203%20C%203.822%208.177%203.809%208.099%203.77%207.9690003%20L%202.0540001%201.066%20C%201.9760001%200.78000003%201.8460001%200.611%201.664%200.546%20C%201.5730001%200.52%201.339%200.507%200.936%200.507%20C%200.65000004%200.507%200.52%200.481%200.52%200.208%20C%200.52%200.065%200.598%200%200.767%200%20L%202.392%200.039%20L%203.224%200.026%20C%203.367%200.026%203.887%200%204.056%200%20C%204.264%200%204.368%200.104%204.368%200.312%20C%204.368%200.442%204.225%200.507%203.9520001%200.507%20C%203.4320002%200.507%203.1720002%200.559%203.1720002%200.676%20C%203.1720002%200.676%203.1850002%200.71500003%203.211%200.884%20L%203.9910002%204.056%20L%206.136%204.056%20C%206.981%204.056%207.787%204.316%208.541%204.823%20C%209.386001%205.382%209.802%206.071%209.802%206.8900003%20C%209.802%208.177%208.58%208.879%207.215%208.879%20Z%20M%206.8120003%208.372%20C%207.9430003%208.372%208.502%207.9820004%208.502%207.202%20C%208.502%206.474%208.1380005%205.499%207.761%205.1610003%20C%207.267%204.719%206.617%204.498%205.8110003%204.498%20L%204.0690002%204.498%20L%204.927%207.9300003%20C%205.031%208.372%205.031%208.372%205.577%208.372%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.9241818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;,
construct a nearest-neighbor data structure over &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2010.166%2021.878999999999998%22%20width%3D%2210.166pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.215%208.879%20L%203.055%208.879%20C%202.756%208.879%202.6130002%208.866%202.6130002%208.58%20C%202.6130002%208.437%202.756%208.372%203.042%208.372%20C%203.302%208.372%203.822%208.411%203.822%208.203%20C%203.822%208.177%203.809%208.099%203.77%207.9690003%20L%202.0540001%201.066%20C%201.9760001%200.78000003%201.8460001%200.611%201.664%200.546%20C%201.5730001%200.52%201.339%200.507%200.936%200.507%20C%200.65000004%200.507%200.52%200.481%200.52%200.208%20C%200.52%200.065%200.598%200%200.767%200%20L%202.392%200.039%20L%203.224%200.026%20C%203.367%200.026%203.887%200%204.056%200%20C%204.264%200%204.368%200.104%204.368%200.312%20C%204.368%200.442%204.225%200.507%203.9520001%200.507%20C%203.4320002%200.507%203.1720002%200.559%203.1720002%200.676%20C%203.1720002%200.676%203.1850002%200.71500003%203.211%200.884%20L%203.9910002%204.056%20L%206.136%204.056%20C%206.981%204.056%207.787%204.316%208.541%204.823%20C%209.386001%205.382%209.802%206.071%209.802%206.8900003%20C%209.802%208.177%208.58%208.879%207.215%208.879%20Z%20M%206.8120003%208.372%20C%207.9430003%208.372%208.502%207.9820004%208.502%207.202%20C%208.502%206.474%208.1380005%205.499%207.761%205.1610003%20C%207.267%204.719%206.617%204.498%205.8110003%204.498%20L%204.0690002%204.498%20L%204.927%207.9300003%20C%205.031%208.372%205.031%208.372%205.577%208.372%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.9241818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;. Then, whenever we
have to check whether some robot sphere with center &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; and radius &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.032%2021.878999999999998%22%20width%3D%226.032pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5483636363636364em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;
is in collision, we find the closest point &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.734%2021.878999999999998%22%20width%3D%226.734pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g254AE47CC15CC81C004457B9506AF3F3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g254AE47CC15CC81C004457B9506AF3F3%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.6150002%205.7460003%20C%204.043%205.7460003%203.497%205.447%202.964%204.849%20C%202.821%205.447%202.418%205.7460003%201.781%205.7460003%20C%201.248%205.7460003%200.85800004%205.317%200.58500004%204.472%20C%200.455%204.043%200.39000002%203.796%200.39000002%203.7180002%20C%200.39000002%203.601%200.455%203.536%200.598%203.536%20C%200.663%203.536%200.702%203.549%200.741%203.575%20C%200.806%203.6920002%200.845%203.783%200.85800004%203.874%20C%201.092%204.862%201.391%205.356%201.742%205.356%20C%201.9760001%205.356%202.093%205.1740003%202.093%204.823%20C%202.093%204.6280003%202.0670002%204.407%202.002%204.173%20L%200.572%20-1.534%20C%200.455%20-1.963%200.442%20-2.015%20-0.065%20-2.015%20C%20-0.299%20-2.015%20-0.416%20-2.119%20-0.416%20-2.3140001%20C%20-0.416%20-2.457%20-0.338%20-2.522%20-0.19500001%20-2.522%20C%200%20-2.522%200.676%20-2.483%200.871%20-2.483%20C%201.118%20-2.483%201.898%20-2.522%202.145%20-2.522%20C%202.3400002%20-2.522%202.431%20-2.418%202.431%20-2.21%20C%202.431%20-2.08%202.3140001%20-2.015%202.0670002%20-2.015%20C%201.8330001%20-2.015%201.482%20-2.028%201.482%20-1.872%20C%201.482%20-1.7030001%202.015%200.338%202.0670002%200.559%20C%202.3270001%200.078%202.717%20-0.169%203.237%20-0.169%20C%204.0820003%20-0.169%204.823%200.26%205.473%201.131%20C%206.071%201.924%206.3700004%202.769%206.3700004%203.64%20C%206.3700004%204.771%205.6940002%205.7460003%204.6150002%205.7460003%20Z%20M%204.576%205.356%20C%205.083%205.356%205.343%204.966%205.343%204.199%20C%205.343%203.848%205.2650003%203.38%205.122%202.795%20C%204.823%201.664%204.446%200.92300004%203.9910002%200.546%20C%203.7180002%200.32500002%203.471%200.208%203.224%200.208%20C%202.8470001%200.208%202.5870001%200.377%202.444%200.72800004%20C%202.3270001%201.001%202.262%201.196%202.262%201.3000001%20L%202.925%204.017%20C%202.99%204.303%203.224%204.602%203.588%204.901%20C%203.9520001%205.2000003%204.277%205.356%204.576%205.356%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6121818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; in &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2010.166%2021.878999999999998%22%20width%3D%2210.166pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.215%208.879%20L%203.055%208.879%20C%202.756%208.879%202.6130002%208.866%202.6130002%208.58%20C%202.6130002%208.437%202.756%208.372%203.042%208.372%20C%203.302%208.372%203.822%208.411%203.822%208.203%20C%203.822%208.177%203.809%208.099%203.77%207.9690003%20L%202.0540001%201.066%20C%201.9760001%200.78000003%201.8460001%200.611%201.664%200.546%20C%201.5730001%200.52%201.339%200.507%200.936%200.507%20C%200.65000004%200.507%200.52%200.481%200.52%200.208%20C%200.52%200.065%200.598%200%200.767%200%20L%202.392%200.039%20L%203.224%200.026%20C%203.367%200.026%203.887%200%204.056%200%20C%204.264%200%204.368%200.104%204.368%200.312%20C%204.368%200.442%204.225%200.507%203.9520001%200.507%20C%203.4320002%200.507%203.1720002%200.559%203.1720002%200.676%20C%203.1720002%200.676%203.1850002%200.71500003%203.211%200.884%20L%203.9910002%204.056%20L%206.136%204.056%20C%206.981%204.056%207.787%204.316%208.541%204.823%20C%209.386001%205.382%209.802%206.071%209.802%206.8900003%20C%209.802%208.177%208.58%208.879%207.215%208.879%20Z%20M%206.8120003%208.372%20C%207.9430003%208.372%208.502%207.9820004%208.502%207.202%20C%208.502%206.474%208.1380005%205.499%207.761%205.1610003%20C%207.267%204.719%206.617%204.498%205.8110003%204.498%20L%204.0690002%204.498%20L%204.927%207.9300003%20C%205.031%208.372%205.031%208.372%205.577%208.372%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.9241818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, and check
whether the distance from &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.734%2021.878999999999998%22%20width%3D%226.734pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g254AE47CC15CC81C004457B9506AF3F3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g254AE47CC15CC81C004457B9506AF3F3%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.6150002%205.7460003%20C%204.043%205.7460003%203.497%205.447%202.964%204.849%20C%202.821%205.447%202.418%205.7460003%201.781%205.7460003%20C%201.248%205.7460003%200.85800004%205.317%200.58500004%204.472%20C%200.455%204.043%200.39000002%203.796%200.39000002%203.7180002%20C%200.39000002%203.601%200.455%203.536%200.598%203.536%20C%200.663%203.536%200.702%203.549%200.741%203.575%20C%200.806%203.6920002%200.845%203.783%200.85800004%203.874%20C%201.092%204.862%201.391%205.356%201.742%205.356%20C%201.9760001%205.356%202.093%205.1740003%202.093%204.823%20C%202.093%204.6280003%202.0670002%204.407%202.002%204.173%20L%200.572%20-1.534%20C%200.455%20-1.963%200.442%20-2.015%20-0.065%20-2.015%20C%20-0.299%20-2.015%20-0.416%20-2.119%20-0.416%20-2.3140001%20C%20-0.416%20-2.457%20-0.338%20-2.522%20-0.19500001%20-2.522%20C%200%20-2.522%200.676%20-2.483%200.871%20-2.483%20C%201.118%20-2.483%201.898%20-2.522%202.145%20-2.522%20C%202.3400002%20-2.522%202.431%20-2.418%202.431%20-2.21%20C%202.431%20-2.08%202.3140001%20-2.015%202.0670002%20-2.015%20C%201.8330001%20-2.015%201.482%20-2.028%201.482%20-1.872%20C%201.482%20-1.7030001%202.015%200.338%202.0670002%200.559%20C%202.3270001%200.078%202.717%20-0.169%203.237%20-0.169%20C%204.0820003%20-0.169%204.823%200.26%205.473%201.131%20C%206.071%201.924%206.3700004%202.769%206.3700004%203.64%20C%206.3700004%204.771%205.6940002%205.7460003%204.6150002%205.7460003%20Z%20M%204.576%205.356%20C%205.083%205.356%205.343%204.966%205.343%204.199%20C%205.343%203.848%205.2650003%203.38%205.122%202.795%20C%204.823%201.664%204.446%200.92300004%203.9910002%200.546%20C%203.7180002%200.32500002%203.471%200.208%203.224%200.208%20C%202.8470001%200.208%202.5870001%200.377%202.444%200.72800004%20C%202.3270001%201.001%202.262%201.196%202.262%201.3000001%20L%202.925%204.017%20C%202.99%204.303%203.224%204.602%203.588%204.901%20C%203.9520001%205.2000003%204.277%205.356%204.576%205.356%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6121818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; is greater than &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.032%2021.878999999999998%22%20width%3D%226.032pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5483636363636364em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The canonical approach to computing nearest-neighbors is a &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;K-d_tree&quot;&gt;&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.968%2021.878999999999998%22%20width%3D%226.968pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6BD6B5079591C663D089FFB042C868C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6BD6B5079591C663D089FFB042C868C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.317%204.589%20C%205.317%204.251%205.499%204.0820003%205.85%204.0820003%20C%206.3050003%204.0820003%206.604%204.485%206.604%204.927%20C%206.604%205.434%206.188%205.7850003%205.681%205.7850003%20C%205.096%205.7850003%204.472%205.395%203.783%204.6280003%20C%203.25%204.043%202.821%203.6660001%202.47%203.497%20L%203.783%208.827001%20C%203.757%208.944%203.7310002%209.022%203.562%209.022%20C%203.1460001%209.022%202.158%208.905%202.002%208.892%20C%201.807%208.866%201.7160001%208.775001%201.7160001%208.58%20C%201.7160001%208.45%201.8330001%208.385%202.0670002%208.385%20C%202.3140001%208.385%202.652%208.398%202.652%208.216001%20L%200.767%200.559%20C%200.72800004%200.416%200.71500003%200.32500002%200.71500003%200.273%20C%200.71500003%200%200.85800004%20-0.143%201.131%20-0.143%20C%201.352%20-0.143%201.521%20-0.039%201.612%200.156%20C%201.677%200.273%201.911%201.196%202.3270001%202.938%20C%203.003%202.8730001%203.7180002%202.548%203.7180002%201.898%20C%203.7180002%201.7030001%203.627%201.3130001%203.627%201.183%20C%203.627%200.442%204.1080003%20-0.143%204.849%20-0.143%20C%205.603%20-0.143%206.11%200.533%206.3700004%201.885%20C%206.3700004%202.002%206.3050003%202.0670002%206.175%202.0670002%20C%206.058%202.0670002%205.98%201.9760001%205.941%201.794%20C%205.655%200.767%205.304%200.24700001%204.875%200.24700001%20C%204.6410003%200.24700001%204.524%200.42900002%204.524%200.79300004%20C%204.524%201.001%204.6800003%201.7030001%204.6800003%201.911%20C%204.6800003%202.652%204.0820003%203.107%202.8730001%203.289%20C%203.1720002%203.497%203.51%203.796%203.874%204.186%20C%204.238%204.576%204.498%204.823%204.6670003%204.966%20C%205.018%205.2520003%205.356%205.395%205.655%205.395%20C%205.7850003%205.395%205.889%205.369%205.967%205.317%20C%205.616%205.2520003%205.317%204.927%205.317%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6334545454545455em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;-d
tree&lt;&#x2F;a&gt; - a class of space
partitioning tree. There are many formulations, but I’ll use a
median-partitioning tree in this case.&lt;&#x2F;p&gt;
&lt;p&gt;At each branch of a &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.968%2021.878999999999998%22%20width%3D%226.968pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6BD6B5079591C663D089FFB042C868C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6BD6B5079591C663D089FFB042C868C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.317%204.589%20C%205.317%204.251%205.499%204.0820003%205.85%204.0820003%20C%206.3050003%204.0820003%206.604%204.485%206.604%204.927%20C%206.604%205.434%206.188%205.7850003%205.681%205.7850003%20C%205.096%205.7850003%204.472%205.395%203.783%204.6280003%20C%203.25%204.043%202.821%203.6660001%202.47%203.497%20L%203.783%208.827001%20C%203.757%208.944%203.7310002%209.022%203.562%209.022%20C%203.1460001%209.022%202.158%208.905%202.002%208.892%20C%201.807%208.866%201.7160001%208.775001%201.7160001%208.58%20C%201.7160001%208.45%201.8330001%208.385%202.0670002%208.385%20C%202.3140001%208.385%202.652%208.398%202.652%208.216001%20L%200.767%200.559%20C%200.72800004%200.416%200.71500003%200.32500002%200.71500003%200.273%20C%200.71500003%200%200.85800004%20-0.143%201.131%20-0.143%20C%201.352%20-0.143%201.521%20-0.039%201.612%200.156%20C%201.677%200.273%201.911%201.196%202.3270001%202.938%20C%203.003%202.8730001%203.7180002%202.548%203.7180002%201.898%20C%203.7180002%201.7030001%203.627%201.3130001%203.627%201.183%20C%203.627%200.442%204.1080003%20-0.143%204.849%20-0.143%20C%205.603%20-0.143%206.11%200.533%206.3700004%201.885%20C%206.3700004%202.002%206.3050003%202.0670002%206.175%202.0670002%20C%206.058%202.0670002%205.98%201.9760001%205.941%201.794%20C%205.655%200.767%205.304%200.24700001%204.875%200.24700001%20C%204.6410003%200.24700001%204.524%200.42900002%204.524%200.79300004%20C%204.524%201.001%204.6800003%201.7030001%204.6800003%201.911%20C%204.6800003%202.652%204.0820003%203.107%202.8730001%203.289%20C%203.1720002%203.497%203.51%203.796%203.874%204.186%20C%204.238%204.576%204.498%204.823%204.6670003%204.966%20C%205.018%205.2520003%205.356%205.395%205.655%205.395%20C%205.7850003%205.395%205.889%205.369%205.967%205.317%20C%205.616%205.2520003%205.317%204.927%205.317%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6334545454545455em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;-d tree, we split the the space into two
sub-volumes, each containing the same number of points, based on the
median value along one dimension. For instance, if we wanted to split
the points &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2076.57%2021.878999999999998%22%20width%3D%2276.57pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA6262B91DD08E704CA0D4DDB72CA2201%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.5%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g71010E02B37BE1C0875AD8D94171F929%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2811.557%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2818.057%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA5EFA28F31DFDD7E2EC069AC1C132FF5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2823.837666666666667%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC6F50C046BCA623FDEE933D413AC9522%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2830.337666666666667%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4D62189ABBC2948BAB13C269F5CB8E70%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2835.394666666666666%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA5EFA28F31DFDD7E2EC069AC1C132FF5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2841.175333333333334%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g71010E02B37BE1C0875AD8D94171F929%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2846.23233333333333%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1A20228482D81F7ABB77A9FB65C5C5E4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2852.73233333333333%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA5EFA28F31DFDD7E2EC069AC1C132FF5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2858.513%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1A20228482D81F7ABB77A9FB65C5C5E4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2865.013%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4D62189ABBC2948BAB13C269F5CB8E70%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2870.07%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g36941F7D89DC8FCF3A70FD9FDE4433F1%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA6262B91DD08E704CA0D4DDB72CA2201%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.7180002%20-1.5860001%20L%203.7180002%201.638%20C%203.7180002%202.379%203.263%202.925%202.366%203.25%20C%203.263%203.575%203.7180002%204.1210003%203.7180002%204.862%20L%203.7180002%208.086%20C%203.7180002%208.84%204.524%209.334001%205.317%209.334001%20C%205.46%209.334001%205.525%209.399%205.525%209.542%20C%205.525%209.685%205.46%209.75%205.317%209.75%20C%204.719%209.75%204.173%209.62%203.6920002%209.373%20C%203.081%209.061%202.782%208.632%202.782%208.086%20L%202.782%204.862%20C%202.782%204.043%202.002%203.4580002%201.183%203.4580002%20C%201.04%203.4580002%200.975%203.3930001%200.975%203.25%20C%200.975%203.107%201.04%203.042%201.183%203.042%20C%202.015%203.042%202.782%202.444%202.782%201.638%20L%202.782%20-1.5860001%20C%202.782%20-2.132%203.081%20-2.561%203.6920002%20-2.8730001%20C%204.173%20-3.1200001%204.719%20-3.25%205.317%20-3.25%20C%205.46%20-3.25%205.525%20-3.1850002%205.525%20-3.042%20C%205.525%20-2.8990002%205.46%20-2.834%205.317%20-2.834%20C%204.524%20-2.834%203.7180002%20-2.3400002%203.7180002%20-1.5860001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g71010E02B37BE1C0875AD8D94171F929%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.1340003%20-3.224%20C%204.251%20-3.224%204.316%20-3.1590002%204.316%20-3.042%20C%204.316%20-3.003%204.29%20-2.951%204.251%20-2.8990002%20C%203.575%20-2.379%203.029%20-1.521%202.6260002%20-0.338%20C%202.275%200.689%202.093%201.7030001%202.093%202.704%20L%202.093%203.796%20C%202.093%204.797%202.275%205.8110003%202.6260002%206.8380003%20C%203.029%208.021%203.575%208.879%204.251%209.399%20C%204.29%209.438%204.316%209.49%204.316%209.542%20C%204.316%209.659%204.251%209.724%204.1340003%209.724%20C%204.1210003%209.724%204.0820003%209.711%204.043%209.685%20C%203.263%209.087%202.6130002%208.203%202.08%207.02%20C%201.5730001%205.889%201.3130001%204.823%201.3130001%203.796%20L%201.3130001%202.704%20C%201.3130001%201.677%201.5730001%200.611%202.08%20-0.52%20C%202.6130002%20-1.7030001%203.263%20-2.5870001%204.043%20-3.1850002%20C%204.0820003%20-3.211%204.1210003%20-3.224%204.1340003%20-3.224%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g626C7FE0610F5A21B7FCC6F361F06C4A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.081%208.658%20C%202.418%208.658%201.8590001%208.424%201.378%207.9560003%20C%200.897%207.488%200.65000004%206.942%200.65000004%206.2790003%20C%200.65000004%205.837%200.975%205.512%201.378%205.512%20C%201.768%205.512%202.093%205.85%202.093%206.2400002%20C%202.093%206.669%201.781%206.968%201.365%206.968%20C%201.326%206.968%201.3000001%206.968%201.274%206.955%20C%201.521%207.592%202.093%208.151%202.9120002%208.151%20C%203.9780002%208.151%204.576%207.228%204.576%206.11%20C%204.576%205.2390003%204.1340003%204.303%203.25%203.315%20L%200.806%200.559%20C%200.637%200.36400002%200.65000004%200.377%200.65000004%200%20L%205.473%200%20L%205.85%202.3400002%20L%205.421%202.3400002%20C%205.317%201.677%205.2260003%201.3000001%205.1480002%201.183%20C%205.083%201.118%204.6930003%201.092%203.9780002%201.092%20L%201.807%201.092%20L%203.068%202.3270001%20C%203.9520001%203.1590002%205.07%204.056%205.447%204.745%20C%205.7070003%205.2000003%205.837%205.655%205.837%206.11%20C%205.837%207.644%204.6410003%208.658%203.081%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA5EFA28F31DFDD7E2EC069AC1C132FF5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.807%201.378%20C%201.391%201.378%201.118%201.066%201.118%200.65000004%20C%201.118%200.26%201.417%20-0.065%201.807%20-0.065%20C%201.9890001%20-0.065%202.145%20-0.013%202.262%200.104%20L%202.275%200%20C%202.275%20-0.819%202.002%20-1.521%201.4560001%20-2.08%20C%201.365%20-2.184%201.3130001%20-2.262%201.3130001%20-2.3140001%20C%201.3130001%20-2.444%201.365%20-2.509%201.482%20-2.509%20C%201.599%20-2.509%201.755%20-2.3530002%201.9760001%20-2.0540001%20C%202.418%20-1.4300001%202.639%20-0.741%202.639%200%20C%202.639%200.689%202.405%201.378%201.807%201.378%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC6F50C046BCA623FDEE933D413AC9522%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.9390001%204.589%20C%204.797%204.914%205.603%205.7330003%205.603%206.8380003%20C%205.603%207.3970003%205.33%207.852%204.797%208.203%20C%204.329%208.502%203.796%208.658%203.198%208.658%20C%202.6130002%208.658%202.106%208.502%201.651%208.203%20C%201.144%207.8650002%200.884%207.4230003%200.884%206.8640003%20C%200.884%206.435%201.1700001%206.136%201.5860001%206.136%20C%202.002%206.136%202.288%206.435%202.288%206.8510003%20C%202.288%207.28%202.0410001%207.514%201.547%207.54%20C%201.885%207.9950004%202.418%208.229%203.1460001%208.229%20C%203.926%208.229%204.316%207.774%204.316%206.8510003%20C%204.316%206.3050003%204.212%205.85%204.017%205.473%20C%203.6660001%204.849%203.1850002%204.732%202.379%204.732%20C%202.223%204.7060003%202.145%204.6410003%202.145%204.524%20C%202.145%204.329%202.236%204.329%202.496%204.329%20L%203.055%204.329%20C%204.03%204.329%204.524%203.64%204.524%202.249%20C%204.524%201.144%204.1210003%200.18200001%203.1330001%200.18200001%20C%202.288%200.18200001%201.664%200.468%201.2870001%201.04%20C%201.742%201.0270001%202.08%201.365%202.08%201.807%20C%202.08%202.249%201.755%202.5740001%201.3130001%202.5740001%20C%200.806%202.5740001%200.546%202.3140001%200.546%201.781%20C%200.546%201.144%200.832%200.637%201.404%200.234%20C%201.911%20-0.117%202.509%20-0.286%203.1720002%20-0.286%20C%203.913%20-0.286%204.55%20-0.039%205.109%200.442%20C%205.668%200.92300004%205.941%201.521%205.941%202.249%20C%205.941%203.471%204.979%204.316%203.9390001%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4D62189ABBC2948BAB13C269F5CB8E70%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.014%20-3.1850002%20C%201.794%20-2.5870001%202.444%20-1.7030001%202.977%20-0.52%20C%203.484%200.611%203.744%201.677%203.744%202.704%20L%203.744%203.796%20C%203.744%204.823%203.484%205.889%202.977%207.02%20C%202.444%208.203%201.794%209.087%201.014%209.685%20C%200.975%209.711%200.936%209.724%200.92300004%209.724%20C%200.806%209.724%200.741%209.659%200.741%209.542%20C%200.741%209.49%200.767%209.438%200.806%209.399%20C%201.482%208.879%202.028%208.021%202.431%206.8380003%20C%202.782%205.8110003%202.964%204.797%202.964%203.796%20L%202.964%202.704%20C%202.964%201.7030001%202.782%200.689%202.431%20-0.338%20C%202.028%20-1.521%201.482%20-2.379%200.806%20-2.8990002%20C%200.767%20-2.951%200.741%20-3.003%200.741%20-3.042%20C%200.741%20-3.1590002%200.806%20-3.224%200.92300004%20-3.224%20C%200.936%20-3.224%200.975%20-3.211%201.014%20-3.1850002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1A20228482D81F7ABB77A9FB65C5C5E4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.589%208.801001%20C%204.472%208.801001%204.368%208.736%204.29%208.619%20L%200.36400002%202.5870001%20L%200.36400002%202.119%20L%203.757%202.119%20L%203.757%201.053%20C%203.757%200.819%203.7050002%200.663%203.614%200.598%20C%203.523%200.533%203.276%200.507%202.8470001%200.507%20L%202.522%200.507%20L%202.522%200%20C%202.8990002%200.026%203.497%200.039%204.303%200.039%20C%205.109%200.039%205.7070003%200.026%206.084%200%20L%206.084%200.507%20L%205.7590003%200.507%20C%205.33%200.507%205.083%200.533%204.992%200.598%20C%204.901%200.663%204.849%200.819%204.849%201.053%20L%204.849%202.119%20L%206.123%202.119%20L%206.123%202.6260002%20L%204.849%202.6260002%20L%204.849%208.58%20C%204.849%208.71%204.758%208.801001%204.589%208.801001%20Z%20M%203.835%207.189%20L%203.835%202.6260002%20L%200.871%202.6260002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g36941F7D89DC8FCF3A70FD9FDE4433F1%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.7180002%204.862%20L%203.7180002%208.086%20C%203.7180002%208.632%203.4190001%209.061%202.808%209.373%20C%202.3270001%209.62%201.781%209.75%201.183%209.75%20C%201.04%209.75%200.975%209.685%200.975%209.542%20C%200.975%209.399%201.04%209.334001%201.183%209.334001%20C%201.9760001%209.334001%202.782%208.84%202.782%208.086%20L%202.782%204.862%20C%202.782%204.1210003%203.237%203.575%204.1340003%203.25%20C%203.237%202.925%202.782%202.379%202.782%201.638%20L%202.782%20-1.5860001%20C%202.782%20-2.3400002%201.9760001%20-2.834%201.183%20-2.834%20C%201.04%20-2.834%200.975%20-2.8990002%200.975%20-3.042%20C%200.975%20-3.1850002%201.04%20-3.25%201.183%20-3.25%20C%201.781%20-3.25%202.3270001%20-3.1200001%202.808%20-2.8730001%20C%203.4190001%20-2.561%203.7180002%20-2.132%203.7180002%20-1.5860001%20L%203.7180002%201.638%20C%203.7180002%202.444%204.485%203.042%205.317%203.042%20C%205.46%203.042%205.525%203.107%205.525%203.25%20C%205.525%203.3930001%205.46%203.4580002%205.317%203.4580002%20C%204.485%203.4580002%203.7180002%204.056%203.7180002%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 6.96090909090909em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; along the first dimension, we’d choose a
split value of 3, and if we were splitting along the second dimension,
we’d choose a split of 3.5. For efficiency, we’ll have our tree split
first on dimension 0 (&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;), then dimension 1 (&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.734%2021.878999999999998%22%20width%3D%226.734pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g84D080B73CDBD7E9A9D3A66F816BA19%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g84D080B73CDBD7E9A9D3A66F816BA19%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.119%205.7460003%20C%201.534%205.7460003%201.079%205.421%200.754%204.771%20C%200.507%204.264%200.377%203.913%200.377%203.7180002%20C%200.377%203.601%200.442%203.536%200.58500004%203.536%20C%200.767%203.536%200.78000003%203.614%200.832%203.809%20C%201.131%204.836%201.547%205.356%202.08%205.356%20C%202.249%205.356%202.3400002%205.2390003%202.3400002%205.005%20C%202.3400002%204.797%202.275%204.498%202.132%204.1210003%20C%201.638%202.782%201.391%201.885%201.391%201.404%20C%201.391%200.416%202.002%20-0.169%203.003%20-0.169%20C%203.4320002%20-0.169%203.835%20-0.013%204.199%200.299%20C%203.744%20-1.417%203.029%20-2.275%202.0540001%20-2.275%20C%201.612%20-2.275%201.3130001%20-2.132%201.1570001%20-1.8460001%20C%201.677%20-1.82%201.937%20-1.5730001%201.937%20-1.105%20C%201.937%20-0.78000003%201.768%20-0.611%201.417%20-0.611%20C%200.936%20-0.611%200.65000004%20-1.014%200.65000004%20-1.495%20C%200.65000004%20-2.21%201.3000001%20-2.665%202.0540001%20-2.665%20C%203.549%20-2.665%204.771%20-1.2870001%205.096%20-0.013%20L%206.3180003%204.901%20C%206.3570004%205.044%206.3700004%205.1480002%206.3700004%205.2130003%20C%206.3700004%205.473%206.227%205.603%205.954%205.603%20C%205.7460003%205.603%205.577%205.499%205.46%205.304%20C%205.382%205.031%205.317%204.797%205.278%204.602%20L%204.446%201.261%20C%204.316%200.79300004%203.627%200.208%203.042%200.208%20C%202.548%200.208%202.301%200.533%202.301%201.196%20C%202.301%201.742%202.522%202.5740001%202.951%203.6920002%20C%203.1200001%204.1470003%203.211%204.459%203.211%204.6410003%20C%203.211%205.278%202.756%205.7460003%202.119%205.7460003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6121818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;), and so on, until
looping back around to dimension 0.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;captree&#x2F;kdtree.png&quot; alt=&quot;The partitioned cells of a -d tree.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;When querying the nearest neighbor, we first do a quick binary search of
the tree to find a candidate closest point. Next, we perform a
branch-and-bound search of every other subtree, escaping early if the
test point is further from a volume from the candidate-closest point.
I’m staying light on the exact details here, since the point of this
article is not to explain how &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.968%2021.878999999999998%22%20width%3D%226.968pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6BD6B5079591C663D089FFB042C868C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6BD6B5079591C663D089FFB042C868C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.317%204.589%20C%205.317%204.251%205.499%204.0820003%205.85%204.0820003%20C%206.3050003%204.0820003%206.604%204.485%206.604%204.927%20C%206.604%205.434%206.188%205.7850003%205.681%205.7850003%20C%205.096%205.7850003%204.472%205.395%203.783%204.6280003%20C%203.25%204.043%202.821%203.6660001%202.47%203.497%20L%203.783%208.827001%20C%203.757%208.944%203.7310002%209.022%203.562%209.022%20C%203.1460001%209.022%202.158%208.905%202.002%208.892%20C%201.807%208.866%201.7160001%208.775001%201.7160001%208.58%20C%201.7160001%208.45%201.8330001%208.385%202.0670002%208.385%20C%202.3140001%208.385%202.652%208.398%202.652%208.216001%20L%200.767%200.559%20C%200.72800004%200.416%200.71500003%200.32500002%200.71500003%200.273%20C%200.71500003%200%200.85800004%20-0.143%201.131%20-0.143%20C%201.352%20-0.143%201.521%20-0.039%201.612%200.156%20C%201.677%200.273%201.911%201.196%202.3270001%202.938%20C%203.003%202.8730001%203.7180002%202.548%203.7180002%201.898%20C%203.7180002%201.7030001%203.627%201.3130001%203.627%201.183%20C%203.627%200.442%204.1080003%20-0.143%204.849%20-0.143%20C%205.603%20-0.143%206.11%200.533%206.3700004%201.885%20C%206.3700004%202.002%206.3050003%202.0670002%206.175%202.0670002%20C%206.058%202.0670002%205.98%201.9760001%205.941%201.794%20C%205.655%200.767%205.304%200.24700001%204.875%200.24700001%20C%204.6410003%200.24700001%204.524%200.42900002%204.524%200.79300004%20C%204.524%201.001%204.6800003%201.7030001%204.6800003%201.911%20C%204.6800003%202.652%204.0820003%203.107%202.8730001%203.289%20C%203.1720002%203.497%203.51%203.796%203.874%204.186%20C%204.238%204.576%204.498%204.823%204.6670003%204.966%20C%205.018%205.2520003%205.356%205.395%205.655%205.395%20C%205.7850003%205.395%205.889%205.369%205.967%205.317%20C%205.616%205.2520003%205.317%204.927%205.317%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6334545454545455em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;-d trees work.&lt;&#x2F;p&gt;
&lt;p&gt;These are very nice data structures, but they suffer from two core
issues for our application: first, &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.968%2021.878999999999998%22%20width%3D%226.968pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6BD6B5079591C663D089FFB042C868C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6BD6B5079591C663D089FFB042C868C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.317%204.589%20C%205.317%204.251%205.499%204.0820003%205.85%204.0820003%20C%206.3050003%204.0820003%206.604%204.485%206.604%204.927%20C%206.604%205.434%206.188%205.7850003%205.681%205.7850003%20C%205.096%205.7850003%204.472%205.395%203.783%204.6280003%20C%203.25%204.043%202.821%203.6660001%202.47%203.497%20L%203.783%208.827001%20C%203.757%208.944%203.7310002%209.022%203.562%209.022%20C%203.1460001%209.022%202.158%208.905%202.002%208.892%20C%201.807%208.866%201.7160001%208.775001%201.7160001%208.58%20C%201.7160001%208.45%201.8330001%208.385%202.0670002%208.385%20C%202.3140001%208.385%202.652%208.398%202.652%208.216001%20L%200.767%200.559%20C%200.72800004%200.416%200.71500003%200.32500002%200.71500003%200.273%20C%200.71500003%200%200.85800004%20-0.143%201.131%20-0.143%20C%201.352%20-0.143%201.521%20-0.039%201.612%200.156%20C%201.677%200.273%201.911%201.196%202.3270001%202.938%20C%203.003%202.8730001%203.7180002%202.548%203.7180002%201.898%20C%203.7180002%201.7030001%203.627%201.3130001%203.627%201.183%20C%203.627%200.442%204.1080003%20-0.143%204.849%20-0.143%20C%205.603%20-0.143%206.11%200.533%206.3700004%201.885%20C%206.3700004%202.002%206.3050003%202.0670002%206.175%202.0670002%20C%206.058%202.0670002%205.98%201.9760001%205.941%201.794%20C%205.655%200.767%205.304%200.24700001%204.875%200.24700001%20C%204.6410003%200.24700001%204.524%200.42900002%204.524%200.79300004%20C%204.524%201.001%204.6800003%201.7030001%204.6800003%201.911%20C%204.6800003%202.652%204.0820003%203.107%202.8730001%203.289%20C%203.1720002%203.497%203.51%203.796%203.874%204.186%20C%204.238%204.576%204.498%204.823%204.6670003%204.966%20C%205.018%205.2520003%205.356%205.395%205.655%205.395%20C%205.7850003%205.395%205.889%205.369%205.967%205.317%20C%205.616%205.2520003%205.317%204.927%205.317%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6334545454545455em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;-d trees have extremely poor cache
locality due to the fact that they jump around everywhere during a
search. Second, this approach is not at all amenable to SIMD
parallelism, which typically requires some amount of branchlessness. How
do we make something which is similarly performant (or better!) without
the same limitations?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;being-stupid-faster&quot;&gt;Being stupid faster&lt;&#x2F;h2&gt;
&lt;p&gt;We can start by noticing a neat quirk of the first pass on a &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.968%2021.878999999999998%22%20width%3D%226.968pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6BD6B5079591C663D089FFB042C868C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6BD6B5079591C663D089FFB042C868C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.317%204.589%20C%205.317%204.251%205.499%204.0820003%205.85%204.0820003%20C%206.3050003%204.0820003%206.604%204.485%206.604%204.927%20C%206.604%205.434%206.188%205.7850003%205.681%205.7850003%20C%205.096%205.7850003%204.472%205.395%203.783%204.6280003%20C%203.25%204.043%202.821%203.6660001%202.47%203.497%20L%203.783%208.827001%20C%203.757%208.944%203.7310002%209.022%203.562%209.022%20C%203.1460001%209.022%202.158%208.905%202.002%208.892%20C%201.807%208.866%201.7160001%208.775001%201.7160001%208.58%20C%201.7160001%208.45%201.8330001%208.385%202.0670002%208.385%20C%202.3140001%208.385%202.652%208.398%202.652%208.216001%20L%200.767%200.559%20C%200.72800004%200.416%200.71500003%200.32500002%200.71500003%200.273%20C%200.71500003%200%200.85800004%20-0.143%201.131%20-0.143%20C%201.352%20-0.143%201.521%20-0.039%201.612%200.156%20C%201.677%200.273%201.911%201.196%202.3270001%202.938%20C%203.003%202.8730001%203.7180002%202.548%203.7180002%201.898%20C%203.7180002%201.7030001%203.627%201.3130001%203.627%201.183%20C%203.627%200.442%204.1080003%20-0.143%204.849%20-0.143%20C%205.603%20-0.143%206.11%200.533%206.3700004%201.885%20C%206.3700004%202.002%206.3050003%202.0670002%206.175%202.0670002%20C%206.058%202.0670002%205.98%201.9760001%205.941%201.794%20C%205.655%200.767%205.304%200.24700001%204.875%200.24700001%20C%204.6410003%200.24700001%204.524%200.42900002%204.524%200.79300004%20C%204.524%201.001%204.6800003%201.7030001%204.6800003%201.911%20C%204.6800003%202.652%204.0820003%203.107%202.8730001%203.289%20C%203.1720002%203.497%203.51%203.796%203.874%204.186%20C%204.238%204.576%204.498%204.823%204.6670003%204.966%20C%205.018%205.2520003%205.356%205.395%205.655%205.395%20C%205.7850003%205.395%205.889%205.369%205.967%205.317%20C%205.616%205.2520003%205.317%204.927%205.317%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6334545454545455em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;-d tree:
the first downward pass can be done completely branchlessly and in a
very cache-friendly way. To do so, we’ll need to bring out a special
data layout for trees, called an Eytzinger layout. This &lt;a href=&quot;https:&#x2F;&#x2F;algorithmica.org&#x2F;en&#x2F;eytzinger&quot;&gt;Algorithmica
article&lt;&#x2F;a&gt; gives a beautiful
explanation of it, but I’ll try my own hand at an explanation as well.&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;captree&#x2F;eytzinger.svg&quot; alt=&quot;An illustration of the Eytzinger layout on a tree with 7 elements.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;In an Eytzinger layout, we implicitly describe the location of each
branch in the tree by its location in a buffer. We store all the tests
in some array (let’s call it &lt;code&gt;tests&lt;&#x2F;code&gt; for convenience), and for some
branch-point at index &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%204.484999999999999%2021.878999999999998%22%20width%3D%224.484999999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gBE3DA9ADBFA5A0562B5A912A74131728%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gBE3DA9ADBFA5A0562B5A912A74131728%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.6920002%208.073%20C%203.6920002%208.424%203.523%208.593%203.1720002%208.593%20C%202.808%208.593%202.444%208.229%202.444%207.8650002%20C%202.444%207.514%202.6260002%207.3450003%202.977%207.3450003%20C%203.341%207.3450003%203.6920002%207.709%203.6920002%208.073%20Z%20M%203.367%201.794%20C%203.081%200.767%202.665%200.24700001%202.132%200.24700001%20C%201.963%200.24700001%201.872%200.36400002%201.872%200.611%20C%201.872%200.832%202.249%201.95%203.016%203.9780002%20C%203.1200001%204.277%203.1720002%204.511%203.1720002%204.6800003%20C%203.1720002%205.317%202.73%205.7850003%202.093%205.7850003%20C%201.534%205.7850003%201.092%205.46%200.767%204.797%20C%200.507%204.264%200.377%203.913%200.377%203.744%20C%200.377%203.627%200.442%203.575%200.58500004%203.575%20C%200.754%203.575%200.78000003%203.653%200.832%203.835%20C%201.131%204.875%201.534%205.395%202.0540001%205.395%20C%202.223%205.395%202.3140001%205.278%202.3140001%205.031%20C%202.3140001%204.849%202.275%204.6410003%202.184%204.394%20C%201.885%203.575%201.5730001%202.704%201.3130001%202.015%20C%201.118%201.495%201.014%201.144%201.014%200.962%20C%201.014%200.32500002%201.482%20-0.143%202.106%20-0.143%20C%202.665%20-0.143%203.107%200.18200001%203.4320002%200.832%20C%203.6790001%201.339%203.809%201.69%203.809%201.885%20C%203.809%202.002%203.744%202.0670002%203.601%202.0670002%20C%203.562%202.0670002%203.367%201.95%203.367%201.794%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.40772727272727266em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, the left child will be at position &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2033.376777777777775%2021.878999999999998%22%20width%3D%2233.376777777777775pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.5%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gBE3DA9ADBFA5A0562B5A912A74131728%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2813.873888888888887%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFCDE359C75472195CEC97DC4B537C342%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2826.87677777777778%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g946CC60F6553DE6CBD049CD3C05E1499%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g626C7FE0610F5A21B7FCC6F361F06C4A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.081%208.658%20C%202.418%208.658%201.8590001%208.424%201.378%207.9560003%20C%200.897%207.488%200.65000004%206.942%200.65000004%206.2790003%20C%200.65000004%205.837%200.975%205.512%201.378%205.512%20C%201.768%205.512%202.093%205.85%202.093%206.2400002%20C%202.093%206.669%201.781%206.968%201.365%206.968%20C%201.326%206.968%201.3000001%206.968%201.274%206.955%20C%201.521%207.592%202.093%208.151%202.9120002%208.151%20C%203.9780002%208.151%204.576%207.228%204.576%206.11%20C%204.576%205.2390003%204.1340003%204.303%203.25%203.315%20L%200.806%200.559%20C%200.637%200.36400002%200.65000004%200.377%200.65000004%200%20L%205.473%200%20L%205.85%202.3400002%20L%205.421%202.3400002%20C%205.317%201.677%205.2260003%201.3000001%205.1480002%201.183%20C%205.083%201.118%204.6930003%201.092%203.9780002%201.092%20L%201.807%201.092%20L%203.068%202.3270001%20C%203.9520001%203.1590002%205.07%204.056%205.447%204.745%20C%205.7070003%205.2000003%205.837%205.655%205.837%206.11%20C%205.837%207.644%204.6410003%208.658%203.081%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gBE3DA9ADBFA5A0562B5A912A74131728%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.6920002%208.073%20C%203.6920002%208.424%203.523%208.593%203.1720002%208.593%20C%202.808%208.593%202.444%208.229%202.444%207.8650002%20C%202.444%207.514%202.6260002%207.3450003%202.977%207.3450003%20C%203.341%207.3450003%203.6920002%207.709%203.6920002%208.073%20Z%20M%203.367%201.794%20C%203.081%200.767%202.665%200.24700001%202.132%200.24700001%20C%201.963%200.24700001%201.872%200.36400002%201.872%200.611%20C%201.872%200.832%202.249%201.95%203.016%203.9780002%20C%203.1200001%204.277%203.1720002%204.511%203.1720002%204.6800003%20C%203.1720002%205.317%202.73%205.7850003%202.093%205.7850003%20C%201.534%205.7850003%201.092%205.46%200.767%204.797%20C%200.507%204.264%200.377%203.913%200.377%203.744%20C%200.377%203.627%200.442%203.575%200.58500004%203.575%20C%200.754%203.575%200.78000003%203.653%200.832%203.835%20C%201.131%204.875%201.534%205.395%202.0540001%205.395%20C%202.223%205.395%202.3140001%205.278%202.3140001%205.031%20C%202.3140001%204.849%202.275%204.6410003%202.184%204.394%20C%201.885%203.575%201.5730001%202.704%201.3130001%202.015%20C%201.118%201.495%201.014%201.144%201.014%200.962%20C%201.014%200.32500002%201.482%20-0.143%202.106%20-0.143%20C%202.665%20-0.143%203.107%200.18200001%203.4320002%200.832%20C%203.6790001%201.339%203.809%201.69%203.809%201.885%20C%203.809%202.002%203.744%202.0670002%203.601%202.0670002%20C%203.562%202.0670002%203.367%201.95%203.367%201.794%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gFCDE359C75472195CEC97DC4B537C342%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%203.562%20L%205.369%203.562%20L%205.369%207.267%20C%205.369%207.4750004%205.2650003%207.579%205.057%207.579%20C%204.849%207.579%204.745%207.4750004%204.745%207.267%20L%204.745%203.562%20L%201.04%203.562%20C%200.832%203.562%200.72800004%203.4580002%200.72800004%203.25%20C%200.72800004%203.042%200.832%202.938%201.04%202.938%20L%204.745%202.938%20L%204.745%20-0.767%20C%204.745%20-0.975%204.849%20-1.079%205.057%20-1.079%20C%205.2650003%20-1.079%205.369%20-0.975%205.369%20-0.767%20L%205.369%202.938%20L%209.074%202.938%20C%209.282001%202.938%209.386001%203.042%209.386001%203.25%20C%209.386001%203.4190001%209.243%203.562%209.074%203.562%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g946CC60F6553DE6CBD049CD3C05E1499%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.497%208.658%20C%202.964%208.112%202.184%207.839%201.1570001%207.839%20L%201.1570001%207.3320003%20C%201.8330001%207.3320003%202.392%207.4360003%202.821%207.644%20L%202.821%201.066%20C%202.821%200.832%202.769%200.676%202.652%200.611%20C%202.535%200.546%202.21%200.507%201.69%200.507%20L%201.235%200.507%20L%201.235%200%20C%201.5600001%200.026%202.262%200.039%203.341%200.039%20C%204.42%200.039%205.122%200.026%205.447%200%20L%205.447%200.507%20L%204.992%200.507%20C%204.459%200.507%204.1340003%200.546%204.03%200.611%20C%203.926%200.676%203.861%200.832%203.861%201.066%20L%203.861%208.268001%20C%203.861%208.58%203.835%208.658%203.497%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.034252525252525em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;,
while the right child will be at position &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2033.376777777777775%2021.878999999999998%22%20width%3D%2233.376777777777775pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.5%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gBE3DA9ADBFA5A0562B5A912A74131728%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2813.873888888888887%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFCDE359C75472195CEC97DC4B537C342%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2826.87677777777778%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g626C7FE0610F5A21B7FCC6F361F06C4A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.081%208.658%20C%202.418%208.658%201.8590001%208.424%201.378%207.9560003%20C%200.897%207.488%200.65000004%206.942%200.65000004%206.2790003%20C%200.65000004%205.837%200.975%205.512%201.378%205.512%20C%201.768%205.512%202.093%205.85%202.093%206.2400002%20C%202.093%206.669%201.781%206.968%201.365%206.968%20C%201.326%206.968%201.3000001%206.968%201.274%206.955%20C%201.521%207.592%202.093%208.151%202.9120002%208.151%20C%203.9780002%208.151%204.576%207.228%204.576%206.11%20C%204.576%205.2390003%204.1340003%204.303%203.25%203.315%20L%200.806%200.559%20C%200.637%200.36400002%200.65000004%200.377%200.65000004%200%20L%205.473%200%20L%205.85%202.3400002%20L%205.421%202.3400002%20C%205.317%201.677%205.2260003%201.3000001%205.1480002%201.183%20C%205.083%201.118%204.6930003%201.092%203.9780002%201.092%20L%201.807%201.092%20L%203.068%202.3270001%20C%203.9520001%203.1590002%205.07%204.056%205.447%204.745%20C%205.7070003%205.2000003%205.837%205.655%205.837%206.11%20C%205.837%207.644%204.6410003%208.658%203.081%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gBE3DA9ADBFA5A0562B5A912A74131728%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.6920002%208.073%20C%203.6920002%208.424%203.523%208.593%203.1720002%208.593%20C%202.808%208.593%202.444%208.229%202.444%207.8650002%20C%202.444%207.514%202.6260002%207.3450003%202.977%207.3450003%20C%203.341%207.3450003%203.6920002%207.709%203.6920002%208.073%20Z%20M%203.367%201.794%20C%203.081%200.767%202.665%200.24700001%202.132%200.24700001%20C%201.963%200.24700001%201.872%200.36400002%201.872%200.611%20C%201.872%200.832%202.249%201.95%203.016%203.9780002%20C%203.1200001%204.277%203.1720002%204.511%203.1720002%204.6800003%20C%203.1720002%205.317%202.73%205.7850003%202.093%205.7850003%20C%201.534%205.7850003%201.092%205.46%200.767%204.797%20C%200.507%204.264%200.377%203.913%200.377%203.744%20C%200.377%203.627%200.442%203.575%200.58500004%203.575%20C%200.754%203.575%200.78000003%203.653%200.832%203.835%20C%201.131%204.875%201.534%205.395%202.0540001%205.395%20C%202.223%205.395%202.3140001%205.278%202.3140001%205.031%20C%202.3140001%204.849%202.275%204.6410003%202.184%204.394%20C%201.885%203.575%201.5730001%202.704%201.3130001%202.015%20C%201.118%201.495%201.014%201.144%201.014%200.962%20C%201.014%200.32500002%201.482%20-0.143%202.106%20-0.143%20C%202.665%20-0.143%203.107%200.18200001%203.4320002%200.832%20C%203.6790001%201.339%203.809%201.69%203.809%201.885%20C%203.809%202.002%203.744%202.0670002%203.601%202.0670002%20C%203.562%202.0670002%203.367%201.95%203.367%201.794%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gFCDE359C75472195CEC97DC4B537C342%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%203.562%20L%205.369%203.562%20L%205.369%207.267%20C%205.369%207.4750004%205.2650003%207.579%205.057%207.579%20C%204.849%207.579%204.745%207.4750004%204.745%207.267%20L%204.745%203.562%20L%201.04%203.562%20C%200.832%203.562%200.72800004%203.4580002%200.72800004%203.25%20C%200.72800004%203.042%200.832%202.938%201.04%202.938%20L%204.745%202.938%20L%204.745%20-0.767%20C%204.745%20-0.975%204.849%20-1.079%205.057%20-1.079%20C%205.2650003%20-1.079%205.369%20-0.975%205.369%20-0.767%20L%205.369%202.938%20L%209.074%202.938%20C%209.282001%202.938%209.386001%203.042%209.386001%203.25%20C%209.386001%203.4190001%209.243%203.562%209.074%203.562%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.034252525252525em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;. If we assume that
the number of points in the tree is a power of 2, and that the tree is
perfectly balanced, we can create an extremely efficient method for the
first pass through the tree. If the number of points is not a power of
two, we can just pad the point cloud with points at &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2013%2021.878999999999998%22%20width%3D%2213pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g8E34018E57C2B89CFB0EEC86BABED315%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g8E34018E57C2B89CFB0EEC86BABED315%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.737%20-0.143%20C%2010.491%20-0.143%2011.115%200.169%2011.596001%200.78000003%20C%2012.038%201.352%2012.259%202.028%2012.259%202.808%20C%2012.259%203.575%2012.038%204.251%2011.609%204.823%20C%2011.128%205.434%2010.517%205.7460003%209.776%205.7460003%20C%208.892%205.7460003%208.125%205.408%207.488%204.732%20C%207.111%204.316%206.8120003%203.9390001%206.591%203.614%20C%206.032%204.277%205.655%204.6930003%205.473%204.849%20C%204.771%205.447%204.03%205.7460003%203.25%205.7460003%20C%202.496%205.7460003%201.872%205.434%201.391%204.823%20C%200.949%204.251%200.72800004%203.575%200.72800004%202.795%20C%200.72800004%202.028%200.949%201.352%201.378%200.78000003%20C%201.8590001%200.169%202.47%20-0.143%203.211%20-0.143%20C%204.0950003%20-0.143%204.862%200.19500001%205.499%200.871%20C%205.876%201.2870001%206.175%201.664%206.396%201.9890001%20C%206.955%201.326%207.3320003%200.91%207.514%200.754%20C%208.216001%200.156%208.957%20-0.143%209.737%20-0.143%20Z%20M%2011.869%202.808%20C%2011.869%202.444%2011.843%202.184%2011.804%202.028%20C%2011.739%201.781%2011.570001%201.521%2011.297%201.222%20C%2010.92%200.79300004%2010.465%200.572%209.945001%200.572%20C%209.386001%200.572%208.84%200.871%208.281%201.469%20C%207.696%202.184%207.267%202.717%206.994%203.081%20C%207.813%204.524%208.775001%205.2390003%209.867001%205.2390003%20C%2011.076%205.2390003%2011.869%204.0820003%2011.869%202.808%20Z%20M%201.118%202.795%20C%201.118%203.38%201.3000001%203.887%201.664%204.342%20C%202.028%204.797%202.483%205.031%203.042%205.031%20C%203.601%205.031%204.1470003%204.732%204.7060003%204.1340003%20C%205.291%203.4190001%205.7200003%202.8860002%205.993%202.522%20C%205.1740003%201.079%204.212%200.36400002%203.1200001%200.36400002%20C%201.911%200.36400002%201.118%201.521%201.118%202.795%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.1818181818181819em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;ForwardTree&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; contains 2^p - 1 tests
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;tests&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; contains 2^p points
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;points&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; Return the index representing
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; the cell in the tree containing `point`.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;first_pass&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;tests&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;], &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;point&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;; 3]&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; k &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;while&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; tests&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;len&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        i &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;from&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;tests&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;i&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; point&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        k &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;k &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;%&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    i &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; tests&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;len&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This first pass computes a &lt;code&gt;usize&lt;&#x2F;code&gt; identifying which point in &lt;code&gt;points&lt;&#x2F;code&gt;
is closest to &lt;code&gt;point&lt;&#x2F;code&gt;. Approximation isn’t really good enough for
collision checking, but we’ll find some other tricks for that later.
For now, we’ll notice that it’s pretty easy to render this code as a
parallel implementation using the nightly &lt;code&gt;portable_simd&lt;&#x2F;code&gt; feature for
Rust.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;std&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;prelude&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; LaneCount&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; Simd&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; SupportedLaneCount&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;first_pass_simd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;const&lt;&#x2F;span&gt; L&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;tests&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;points&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;, L&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;; 3],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;, L&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;where&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;LaneCount&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;L&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; SupportedLaneCount,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; k &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; nlog2 &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; tests&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;len&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;trailing_ones&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;_&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;nlog2 &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; tests &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;gather_or_default&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;tests&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; cmp &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; points&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;simd_ge&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;tests&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;to_int&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;cast&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; one &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        i &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;i &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; one&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; one &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;cmp &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; one&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        k &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;k &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;%&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    i &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;tests&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;len&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The above code does the exact same thing as &lt;code&gt;first_pass&lt;&#x2F;code&gt;, but this time
in parallel across a set of &lt;code&gt;L&lt;&#x2F;code&gt; different robot spheres. This means we
can get a speedup of up to &lt;code&gt;L&lt;&#x2F;code&gt; times on whole-robot collision checks.&lt;&#x2F;p&gt;
&lt;p&gt;Once we’ve extracted the identifier for our
approximate-nearest-neighbor, we can do a quick test for whether it’s
in collision by computing the distance to the center of the query
sphere.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; If this returns `true`, a sphere centered at `point`
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; with radius-squared `rsq` collides with a point in `t`.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; May erroneously return `false`.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;forward_coll&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;t&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;ForwardTree, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;point&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;; 3], &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;rsq&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;bool&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; id &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;first_pass&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;t&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;tests&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; point&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    point
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;zip&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;t&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;points&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;id&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;map&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&amp;amp;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;y&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;x &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; y&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;powi&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;sum&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;=&lt;&#x2F;span&gt; rsq
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Of course, we can also do our collision checking in a SIMD parallel
manner; however, the resulting code would be rather verbose and not very
interesting. Since we’ll need to throw that code away shortly anyway,
I’ll skip ahead to the good part, which is the performance results.&lt;&#x2F;p&gt;
&lt;p&gt;At these scales, a &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.968%2021.878999999999998%22%20width%3D%226.968pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6BD6B5079591C663D089FFB042C868C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6BD6B5079591C663D089FFB042C868C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.317%204.589%20C%205.317%204.251%205.499%204.0820003%205.85%204.0820003%20C%206.3050003%204.0820003%206.604%204.485%206.604%204.927%20C%206.604%205.434%206.188%205.7850003%205.681%205.7850003%20C%205.096%205.7850003%204.472%205.395%203.783%204.6280003%20C%203.25%204.043%202.821%203.6660001%202.47%203.497%20L%203.783%208.827001%20C%203.757%208.944%203.7310002%209.022%203.562%209.022%20C%203.1460001%209.022%202.158%208.905%202.002%208.892%20C%201.807%208.866%201.7160001%208.775001%201.7160001%208.58%20C%201.7160001%208.45%201.8330001%208.385%202.0670002%208.385%20C%202.3140001%208.385%202.652%208.398%202.652%208.216001%20L%200.767%200.559%20C%200.72800004%200.416%200.71500003%200.32500002%200.71500003%200.273%20C%200.71500003%200%200.85800004%20-0.143%201.131%20-0.143%20C%201.352%20-0.143%201.521%20-0.039%201.612%200.156%20C%201.677%200.273%201.911%201.196%202.3270001%202.938%20C%203.003%202.8730001%203.7180002%202.548%203.7180002%201.898%20C%203.7180002%201.7030001%203.627%201.3130001%203.627%201.183%20C%203.627%200.442%204.1080003%20-0.143%204.849%20-0.143%20C%205.603%20-0.143%206.11%200.533%206.3700004%201.885%20C%206.3700004%202.002%206.3050003%202.0670002%206.175%202.0670002%20C%206.058%202.0670002%205.98%201.9760001%205.941%201.794%20C%205.655%200.767%205.304%200.24700001%204.875%200.24700001%20C%204.6410003%200.24700001%204.524%200.42900002%204.524%200.79300004%20C%204.524%201.001%204.6800003%201.7030001%204.6800003%201.911%20C%204.6800003%202.652%204.0820003%203.107%202.8730001%203.289%20C%203.1720002%203.497%203.51%203.796%203.874%204.186%20C%204.238%204.576%204.498%204.823%204.6670003%204.966%20C%205.018%205.2520003%205.356%205.395%205.655%205.395%20C%205.7850003%205.395%205.889%205.369%205.967%205.317%20C%205.616%205.2520003%205.317%204.927%205.317%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6334545454545455em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;-d tree is the best competitor. Fortunately,
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sdd&#x2F;kiddo&quot;&gt;&lt;code&gt;kiddo&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, one of the fastest &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.968%2021.878999999999998%22%20width%3D%226.968pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6BD6B5079591C663D089FFB042C868C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6BD6B5079591C663D089FFB042C868C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.317%204.589%20C%205.317%204.251%205.499%204.0820003%205.85%204.0820003%20C%206.3050003%204.0820003%206.604%204.485%206.604%204.927%20C%206.604%205.434%206.188%205.7850003%205.681%205.7850003%20C%205.096%205.7850003%204.472%205.395%203.783%204.6280003%20C%203.25%204.043%202.821%203.6660001%202.47%203.497%20L%203.783%208.827001%20C%203.757%208.944%203.7310002%209.022%203.562%209.022%20C%203.1460001%209.022%202.158%208.905%202.002%208.892%20C%201.807%208.866%201.7160001%208.775001%201.7160001%208.58%20C%201.7160001%208.45%201.8330001%208.385%202.0670002%208.385%20C%202.3140001%208.385%202.652%208.398%202.652%208.216001%20L%200.767%200.559%20C%200.72800004%200.416%200.71500003%200.32500002%200.71500003%200.273%20C%200.71500003%200%200.85800004%20-0.143%201.131%20-0.143%20C%201.352%20-0.143%201.521%20-0.039%201.612%200.156%20C%201.677%200.273%201.911%201.196%202.3270001%202.938%20C%203.003%202.8730001%203.7180002%202.548%203.7180002%201.898%20C%203.7180002%201.7030001%203.627%201.3130001%203.627%201.183%20C%203.627%200.442%204.1080003%20-0.143%204.849%20-0.143%20C%205.603%20-0.143%206.11%200.533%206.3700004%201.885%20C%206.3700004%202.002%206.3050003%202.0670002%206.175%202.0670002%20C%206.058%202.0670002%205.98%201.9760001%205.941%201.794%20C%205.655%200.767%205.304%200.24700001%204.875%200.24700001%20C%204.6410003%200.24700001%204.524%200.42900002%204.524%200.79300004%20C%204.524%201.001%204.6800003%201.7030001%204.6800003%201.911%20C%204.6800003%202.652%204.0820003%203.107%202.8730001%203.289%20C%203.1720002%203.497%203.51%203.796%203.874%204.186%20C%204.238%204.576%204.498%204.823%204.6670003%204.966%20C%205.018%205.2520003%205.356%205.395%205.655%205.395%20C%205.7850003%205.395%205.889%205.369%205.967%205.317%20C%205.616%205.2520003%205.317%204.927%205.317%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6334545454545455em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;-d tree
implementations out there, is easy to install via Cargo. I’ll be using
that as a rough baseline for point cloud collision-checking. I found
that the fastest results came from using &lt;code&gt;within_unsorted&lt;&#x2F;code&gt; on an
&lt;code&gt;ImmutableKdTree&lt;&#x2F;code&gt;, so I’m using that as my baseline.&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;captree&#x2F;forward_vs_kdt_query.svg&quot; alt=&quot;A 2D line plot titled ‘Query performance of collision-checking structures.’ The x-axis is labeled as ‘Number of points in cloud,’ ranging from 0 to 60000, and the y-axis is labeled as ‘Collision check time (ns)’. There are three lines: ‘k-d tree (kiddo)’ in blue, ‘forward tree, sequential’ in green, and ‘forward tree, SIMD’ in green. All the lines grow roughly logarithmically. The blue line starts at around 60 ns, then grows to 250 ns. The orange line starts at around 20 ns, then grows to 60 ns. The green line starts at around 10 ns then grows to 20 ns.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;We see that this single-pass approach blows a normal &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.968%2021.878999999999998%22%20width%3D%226.968pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6BD6B5079591C663D089FFB042C868C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6BD6B5079591C663D089FFB042C868C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.317%204.589%20C%205.317%204.251%205.499%204.0820003%205.85%204.0820003%20C%206.3050003%204.0820003%206.604%204.485%206.604%204.927%20C%206.604%205.434%206.188%205.7850003%205.681%205.7850003%20C%205.096%205.7850003%204.472%205.395%203.783%204.6280003%20C%203.25%204.043%202.821%203.6660001%202.47%203.497%20L%203.783%208.827001%20C%203.757%208.944%203.7310002%209.022%203.562%209.022%20C%203.1460001%209.022%202.158%208.905%202.002%208.892%20C%201.807%208.866%201.7160001%208.775001%201.7160001%208.58%20C%201.7160001%208.45%201.8330001%208.385%202.0670002%208.385%20C%202.3140001%208.385%202.652%208.398%202.652%208.216001%20L%200.767%200.559%20C%200.72800004%200.416%200.71500003%200.32500002%200.71500003%200.273%20C%200.71500003%200%200.85800004%20-0.143%201.131%20-0.143%20C%201.352%20-0.143%201.521%20-0.039%201.612%200.156%20C%201.677%200.273%201.911%201.196%202.3270001%202.938%20C%203.003%202.8730001%203.7180002%202.548%203.7180002%201.898%20C%203.7180002%201.7030001%203.627%201.3130001%203.627%201.183%20C%203.627%200.442%204.1080003%20-0.143%204.849%20-0.143%20C%205.603%20-0.143%206.11%200.533%206.3700004%201.885%20C%206.3700004%202.002%206.3050003%202.0670002%206.175%202.0670002%20C%206.058%202.0670002%205.98%201.9760001%205.941%201.794%20C%205.655%200.767%205.304%200.24700001%204.875%200.24700001%20C%204.6410003%200.24700001%204.524%200.42900002%204.524%200.79300004%20C%204.524%201.001%204.6800003%201.7030001%204.6800003%201.911%20C%204.6800003%202.652%204.0820003%203.107%202.8730001%203.289%20C%203.1720002%203.497%203.51%203.796%203.874%204.186%20C%204.238%204.576%204.498%204.823%204.6670003%204.966%20C%205.018%205.2520003%205.356%205.395%205.655%205.395%20C%205.7850003%205.395%205.889%205.369%205.967%205.317%20C%205.616%205.2520003%205.317%204.927%205.317%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6334545454545455em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;-d tree out of
the water, yielding enormous speedups in query time from hundreds of
nanoseconds to only about 10 ns. Sadly, the SIMD addition is only a
modest improvement - this is because gather instructions are very slow
on my laptop’s processor. On other machines, there’s usually a more
appreciable performance improvement. This comparison also isn’t really
fair: &lt;code&gt;kiddo&lt;&#x2F;code&gt; is giving us an exact answer to whether we’re in
collision, while our forward tree is only returning an approximate
answer.&lt;&#x2F;p&gt;
&lt;p&gt;Not only that, our approximate answer isn’t even all that good. To test
this, I collected a real point cloud and measured the distribution of
position error when selecting nearest neighbors.&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;captree&#x2F;forward_error_cdf.svg&quot; alt=&quot;image&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Looking from the cumulative distribution function above, we see that
roughly 20% of points have an error of over 10 cm. In the world of
collision checking, that’s enormous - any padding conservative enough
to make this forward tree useful would make it impossible for a robot to
find a plan.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;missing-the-forest-for-the-trees&quot;&gt;Missing the forest for the trees&lt;&#x2F;h2&gt;
&lt;p&gt;My first idea for fixing this error issue was very simple: if one tree
was only right some of the time, we could get the results from multiple
trees and (hopefully) improve our accuracy.&lt;&#x2F;p&gt;
&lt;p&gt;This is not a new idea, per se: random forests are pretty well known in
the ML community. The core concept is this: we make &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%209.516%2021.878999999999998%22%20width%3D%229.516pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g944413807562C146930CA618B80BB3EA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g944413807562C146930CA618B80BB3EA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.472%208.203%20C%204.472%208.1640005%204.459%208.073%204.42%207.9430003%20L%202.704%201.079%20C%202.652%200.884%202.6000001%200.767%202.561%200.71500003%20C%202.444%200.572%202.002%200.507%201.222%200.507%20C%200.819%200.507%200.637%200.546%200.637%200.208%20C%200.637%200.065%200.72800004%200%200.897%200%20C%201.5600001%200%202.496%200.052%203.055%200.039%20L%204.1210003%200.026%20C%204.303%200.026%205.018%200%205.2390003%200%20C%205.46%200%205.564%200.104%205.564%200.312%20C%205.564%200.442%205.408%200.507%205.083%200.507%20C%204.407%200.507%204.017%200.533%203.9%200.598%20C%203.861%200.624%203.835%200.676%203.835%200.754%20L%205.59%207.839%20C%205.629%208.021%205.668%208.1380005%205.7070003%208.177%20C%205.7590003%208.255%206.071%208.294001%206.643%208.294001%20C%207.3580003%208.294001%207.852%208.242001%208.099%208.125%20C%208.346%208.008%208.476%207.735%208.476%207.293%20C%208.476%207.059%208.437%206.721%208.372%206.2790003%20C%208.346%206.175%208.333%206.097%208.333%206.032%20C%208.333%205.889%208.398%205.8110003%208.541%205.8110003%20C%208.658%205.8110003%208.736%205.928%208.775001%206.149%20L%209.126%208.385%20C%209.139%208.45%209.152%208.528%209.152%208.606%20C%209.152%208.736%209.022%208.801001%208.749001%208.801001%20L%201.625%208.801001%20C%201.2870001%208.801001%201.261%208.762%201.1570001%208.515%20L%200.39000002%206.2530003%20C%200.351%206.136%200.32500002%206.058%200.312%206.006%20C%200.312%205.876%200.377%205.8110003%200.52%205.8110003%20C%200.624%205.8110003%200.71500003%205.915%200.78000003%206.11%20C%201.105%207.059%201.4300001%207.644%201.7290001%207.8910003%20C%202.0670002%208.1640005%202.717%208.294001%203.6660001%208.294001%20L%204.173%208.294001%20C%204.316%208.294001%204.472%208.307%204.472%208.203%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.8650909090909091em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; different trees.
Each tree is randomly different somehow, yielding typically incorrect
errors. We can then take the best result from each tree for a
(hopefully) dramatic improvement in result quality.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;RandomTree&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;tests&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;points&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;seed&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For the sake of branchless parallelism, we’ll randomize each tree
according to a pseudo-random number generator. Then, when we search
through the tree, we determine the next axis to branch on based on the
outcome from the RNG.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; A simple PRNG.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;xorshift32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;x &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;^=&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;x &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;13&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;x &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;^=&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;x &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;17&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;x &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;^=&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;x &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;x
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;first_pass_rand&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;tests&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;], &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;point&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;; 3]&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;while&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; tests&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;len&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; k &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;xorshift32&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; x&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;%&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        i &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;from&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;tests&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;i&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; point&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    i &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; tests&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;len&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;An astute reader might note that this implementation branches on the
same dimension for each depth in each random tree, independent of which
subtree we search. This is intentional: it makes it easier to write a
branchless SIMD implementation of random tree querying. Otherwise, we’d
need a convoluted sequence of shuffles to get every element in the
correct lane, which would chew up the performance.&lt;&#x2F;p&gt;
&lt;p&gt;Young and full of hope, I tried checking the error distribution of the
random forest approach. I constructed a point cloud, randomly generated
a bunch of query points, and tested those points for their distance to
their nearest neighbor in the cloud.&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;captree&#x2F;forest_error.svg&quot; alt=&quot;image&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;When testing the error distribution for a forest, the results are less
than impressive. We get diminishing returns at around 4 trees in the
forest, with minimal gains from adding trees past that. Even with 10
trees in the forest, our maximum error could be as much as 20 cm.&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;captree&#x2F;forest_throughput.svg&quot; alt=&quot;image&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Even if that error distribution were better, queries to these forests
exhibit superlinear scaling with the number of trees, since together
they use so much memory that they can’t all fit in the cache. At around
10 trees, the SIMD performance of a forest is about the same as a &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.968%2021.878999999999998%22%20width%3D%226.968pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6BD6B5079591C663D089FFB042C868C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6BD6B5079591C663D089FFB042C868C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.317%204.589%20C%205.317%204.251%205.499%204.0820003%205.85%204.0820003%20C%206.3050003%204.0820003%206.604%204.485%206.604%204.927%20C%206.604%205.434%206.188%205.7850003%205.681%205.7850003%20C%205.096%205.7850003%204.472%205.395%203.783%204.6280003%20C%203.25%204.043%202.821%203.6660001%202.47%203.497%20L%203.783%208.827001%20C%203.757%208.944%203.7310002%209.022%203.562%209.022%20C%203.1460001%209.022%202.158%208.905%202.002%208.892%20C%201.807%208.866%201.7160001%208.775001%201.7160001%208.58%20C%201.7160001%208.45%201.8330001%208.385%202.0670002%208.385%20C%202.3140001%208.385%202.652%208.398%202.652%208.216001%20L%200.767%200.559%20C%200.72800004%200.416%200.71500003%200.32500002%200.71500003%200.273%20C%200.71500003%200%200.85800004%20-0.143%201.131%20-0.143%20C%201.352%20-0.143%201.521%20-0.039%201.612%200.156%20C%201.677%200.273%201.911%201.196%202.3270001%202.938%20C%203.003%202.8730001%203.7180002%202.548%203.7180002%201.898%20C%203.7180002%201.7030001%203.627%201.3130001%203.627%201.183%20C%203.627%200.442%204.1080003%20-0.143%204.849%20-0.143%20C%205.603%20-0.143%206.11%200.533%206.3700004%201.885%20C%206.3700004%202.002%206.3050003%202.0670002%206.175%202.0670002%20C%206.058%202.0670002%205.98%201.9760001%205.941%201.794%20C%205.655%200.767%205.304%200.24700001%204.875%200.24700001%20C%204.6410003%200.24700001%204.524%200.42900002%204.524%200.79300004%20C%204.524%201.001%204.6800003%201.7030001%204.6800003%201.911%20C%204.6800003%202.652%204.0820003%203.107%202.8730001%203.289%20C%203.1720002%203.497%203.51%203.796%203.874%204.186%20C%204.238%204.576%204.498%204.823%204.6670003%204.966%20C%205.018%205.2520003%205.356%205.395%205.655%205.395%20C%205.7850003%205.395%205.889%205.369%205.967%205.317%20C%205.616%205.2520003%205.317%204.927%205.317%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6334545454545455em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;-d
tree, but as we discussed before, the error isn’t good enough to
justify using it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-budget-for-affording&quot;&gt;A budget for affording&lt;&#x2F;h2&gt;
&lt;p&gt;Let’s briefly take stock of the situation. Using our forward tree, we
can quickly classify a query point as belonging to a single unit cell.
We know that for any fixed cell and radius of a test-sphere, there is a
fixed set of points in &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2010.166%2021.878999999999998%22%20width%3D%2210.166pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.215%208.879%20L%203.055%208.879%20C%202.756%208.879%202.6130002%208.866%202.6130002%208.58%20C%202.6130002%208.437%202.756%208.372%203.042%208.372%20C%203.302%208.372%203.822%208.411%203.822%208.203%20C%203.822%208.177%203.809%208.099%203.77%207.9690003%20L%202.0540001%201.066%20C%201.9760001%200.78000003%201.8460001%200.611%201.664%200.546%20C%201.5730001%200.52%201.339%200.507%200.936%200.507%20C%200.65000004%200.507%200.52%200.481%200.52%200.208%20C%200.52%200.065%200.598%200%200.767%200%20L%202.392%200.039%20L%203.224%200.026%20C%203.367%200.026%203.887%200%204.056%200%20C%204.264%200%204.368%200.104%204.368%200.312%20C%204.368%200.442%204.225%200.507%203.9520001%200.507%20C%203.4320002%200.507%203.1720002%200.559%203.1720002%200.676%20C%203.1720002%200.676%203.1850002%200.71500003%203.211%200.884%20L%203.9910002%204.056%20L%206.136%204.056%20C%206.981%204.056%207.787%204.316%208.541%204.823%20C%209.386001%205.382%209.802%206.071%209.802%206.8900003%20C%209.802%208.177%208.58%208.879%207.215%208.879%20Z%20M%206.8120003%208.372%20C%207.9430003%208.372%208.502%207.9820004%208.502%207.202%20C%208.502%206.474%208.1380005%205.499%207.761%205.1610003%20C%207.267%204.719%206.617%204.498%205.8110003%204.498%20L%204.0690002%204.498%20L%204.927%207.9300003%20C%205.031%208.372%205.031%208.372%205.577%208.372%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.9241818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; which are close enough to collide with at
least one point in the cell. If we’re targeting a particular robot, we
also know &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2023.526099999999996%2021.878999999999998%22%20width%3D%2223.526099999999996pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.863%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7C707578FA33FC5F4974517BD3CD702D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g244F502A10CDC70DE9AAA4877DC1FE65%22%20x%3D%227.5802999999999985%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g272D7D04C5DF2EB93D4A46F74DAF749C%22%20x%3D%2212.130299999999998%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7C707578FA33FC5F4974517BD3CD702D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.8665001%203.7583%20C%203.2851002%203.7583%203.4944%203.4398%203.4944%202.7937002%20L%203.4944%200.7189%20C%203.4944%200.546%203.4671001%200.4368%203.4034002%200.4004%20C%203.3397002%200.36400002%203.1304002%200.3458%202.7937002%200.3458%20L%202.7937002%200%20L%203.8493001%200.0273%20L%204.8958%200%20L%204.8958%200.3458%20C%204.5591%200.3458%204.3589%200.36400002%204.2952003%200.4004%20C%204.2315%200.4368%204.1951003%200.546%204.1951003%200.7189%20L%204.1951003%202.3569002%20C%204.1951003%203.0849001%204.6683%203.7583%205.3690004%203.7583%20C%205.7967%203.7583%206.006%203.4398%206.006%202.7937002%20L%206.006%200.7189%20C%206.006%200.546%205.9696%200.4368%205.9059005%200.4004%20C%205.8422003%200.36400002%205.6329%200.3458%205.2962003%200.3458%20L%205.2962003%200%20L%206.3518004%200.0273%20L%207.3983%200%20L%207.3983%200.3458%20C%207.1071005%200.3458%206.9160004%200.3549%206.8250003%200.3822%20C%206.734%200.4095%206.6976004%200.47320002%206.6976004%200.5824%20L%206.6976004%202.2841%20C%206.6976004%202.7118%206.6794004%203.0121002%206.6521%203.1850002%20C%206.5611005%203.7401001%206.1516004%204.0222%205.4327%204.0222%20C%204.8594003%204.0222%204.4317%203.7583%204.1405%203.2214%20C%204.0131%203.7583%203.6127002%204.0222%202.9302%204.0222%20C%202.3569002%204.0222%201.9201001%203.7492%201.6289%203.2032%20L%201.6289%204.0222%20L%200.2912%203.9221%20L%200.2912%203.5763001%20C%200.61880004%203.5763001%200.819%203.5490003%200.89180005%203.4944%20C%200.9646%203.4398%200.9919%203.3215%200.9919%203.1122%20L%200.9919%200.7189%20C%200.9919%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3458%200.2912%200.3458%20L%200.2912%200%20L%201.3468001%200.0273%20L%202.3933%200%20L%202.3933%200.3458%20C%202.0566%200.3458%201.8473%200.36400002%201.7836001%200.4004%20C%201.7199%200.4368%201.6835%200.546%201.6835%200.7189%20L%201.6835%202.3569002%20C%201.6835%203.094%202.1658%203.7583%202.8665001%203.7583%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g244F502A10CDC70DE9AAA4877DC1FE65%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.3953004%200.8281%20L%204.3953004%201.365%20L%204.1041%201.365%20L%204.1041%200.8281%20C%204.1041%200.47320002%204.004%200.2912%203.8129%200.2912%20C%203.6309001%200.2912%203.5217001%200.5187%203.5217001%200.70070004%20L%203.5217001%202.4934%20C%203.5217001%202.8119001%203.4853%203.0485%203.4216%203.2123%20C%203.2032%203.7492%202.5753002%204.0768003%201.9383001%204.0768003%20C%201.2376001%204.0768003%200.546%203.6855001%200.546%203.0303001%20C%200.546%202.73%200.70070004%202.5753002%201.001%202.5753002%20C%201.3013%202.5753002%201.4469%202.7209%201.4469%203.0212002%20C%201.4469%203.2851002%201.3104%203.4398%201.0283%203.4671001%20C%201.2285%203.6946%201.5288%203.8129%201.9201001%203.8129%20C%202.4843001%203.8129%202.8301%203.2942002%202.8301%202.7027001%20L%202.8301%202.4024%20C%202.1203%202.3569002%201.5834%202.2477%201.2103001%202.0748%20C%200.6006%201.7927%200.2912%201.4014001%200.2912%200.8827%20C%200.2912%200.64610004%200.3822%200.44590002%200.5551%200.2912%20C%200.8463%200.0273%201.2467%20-0.1001%201.7563001%20-0.1001%20C%202.2932%20-0.1001%202.6754%200.12740001%202.9120002%200.59150004%20C%202.9757001%200.24570002%203.2305002%20-0.0546%203.6218002%20-0.0546%20C%204.1041%20-0.0546%204.3953004%200.3276%204.3953004%200.8281%20Z%20M%201.82%200.1638%20C%201.4014001%200.1638%201.0556%200.47320002%201.0556%200.89180005%20C%201.0556%201.7381%201.9383001%202.1021001%202.8301%202.1476002%20L%202.8301%201.2831%20C%202.8301%200.67340004%202.4297001%200.1638%201.82%200.1638%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g272D7D04C5DF2EB93D4A46F74DAF749C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.8038%200.0273%20C%204.0131%200.0364%204.3134003%200.0273%204.6956%200%20L%204.6956%200.3458%20C%204.2133%200.3458%204.0313%200.3549%203.8402002%200.6097%20L%202.6572%202.1385%20C%203.0485%202.6208%203.3124%202.9484%203.4580002%203.1213002%20C%203.7128003%203.4125001%204.0677004%203.5672002%204.5318003%203.5763001%20L%204.5318003%203.9221%20C%204.277%203.9039001%204.0222%203.8948002%203.7674003%203.8948002%20C%203.4307%203.8948002%203.1304002%203.9039001%202.8665001%203.9221%20L%202.8665001%203.5763001%20C%203.0394%203.5581002%203.1304002%203.4762%203.1304002%203.3306%20C%203.1304002%203.2487001%203.0849001%203.1486%203.003%203.0394%20L%202.4752002%202.3842%20L%201.8018001%203.2487001%20C%201.7563001%203.3124%201.7290001%203.3579001%201.7290001%203.3852%20C%201.7290001%203.5035002%201.8382001%203.5672002%202.0475001%203.5763001%20L%202.0475001%203.9221%20L%201.0374%203.8948002%20C%200.8008%203.8857002%200.50960004%203.8948002%200.15470001%203.9221%20L%200.15470001%203.5763001%20C%200.4823%203.5763001%200.6916%203.5490003%200.78260005%203.5035002%20C%200.8736%203.4580002%201.0192001%203.3033001%201.2194%203.0394%20L%202.0839%201.9110001%20C%201.638%201.3377%201.365%200.9919%201.2649001%200.8736%20C%200.97370005%200.5187%200.59150004%200.3458%200.1092%200.3458%20L%200.1092%200%20C%200.44590002%200.0273%200.70070004%200.0364%200.89180005%200.0273%20L%201.7745001%200%20L%201.7745001%200.3458%20C%201.6016%200.3731%201.5197%200.455%201.5197%200.59150004%20C%201.5197%200.6279%201.5288%200.67340004%201.547%200.7189%20C%201.6016%200.83720005%201.8473%201.1466%202.2841%201.6653%20L%202.9393%200.80990005%20C%203.0394%200.6825%203.094%200.59150004%203.1213002%200.53690004%20C%203.1213002%200.41860002%203.0121002%200.3549%202.7937002%200.3458%20L%202.7937002%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.1387363636363634em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, the maximum radius of a sphere on the robot.
If we trust that we’ll never do a collision check for a sphere larger
than &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2023.526099999999996%2021.878999999999998%22%20width%3D%2223.526099999999996pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.863%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7C707578FA33FC5F4974517BD3CD702D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g244F502A10CDC70DE9AAA4877DC1FE65%22%20x%3D%227.5802999999999985%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g272D7D04C5DF2EB93D4A46F74DAF749C%22%20x%3D%2212.130299999999998%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7C707578FA33FC5F4974517BD3CD702D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.8665001%203.7583%20C%203.2851002%203.7583%203.4944%203.4398%203.4944%202.7937002%20L%203.4944%200.7189%20C%203.4944%200.546%203.4671001%200.4368%203.4034002%200.4004%20C%203.3397002%200.36400002%203.1304002%200.3458%202.7937002%200.3458%20L%202.7937002%200%20L%203.8493001%200.0273%20L%204.8958%200%20L%204.8958%200.3458%20C%204.5591%200.3458%204.3589%200.36400002%204.2952003%200.4004%20C%204.2315%200.4368%204.1951003%200.546%204.1951003%200.7189%20L%204.1951003%202.3569002%20C%204.1951003%203.0849001%204.6683%203.7583%205.3690004%203.7583%20C%205.7967%203.7583%206.006%203.4398%206.006%202.7937002%20L%206.006%200.7189%20C%206.006%200.546%205.9696%200.4368%205.9059005%200.4004%20C%205.8422003%200.36400002%205.6329%200.3458%205.2962003%200.3458%20L%205.2962003%200%20L%206.3518004%200.0273%20L%207.3983%200%20L%207.3983%200.3458%20C%207.1071005%200.3458%206.9160004%200.3549%206.8250003%200.3822%20C%206.734%200.4095%206.6976004%200.47320002%206.6976004%200.5824%20L%206.6976004%202.2841%20C%206.6976004%202.7118%206.6794004%203.0121002%206.6521%203.1850002%20C%206.5611005%203.7401001%206.1516004%204.0222%205.4327%204.0222%20C%204.8594003%204.0222%204.4317%203.7583%204.1405%203.2214%20C%204.0131%203.7583%203.6127002%204.0222%202.9302%204.0222%20C%202.3569002%204.0222%201.9201001%203.7492%201.6289%203.2032%20L%201.6289%204.0222%20L%200.2912%203.9221%20L%200.2912%203.5763001%20C%200.61880004%203.5763001%200.819%203.5490003%200.89180005%203.4944%20C%200.9646%203.4398%200.9919%203.3215%200.9919%203.1122%20L%200.9919%200.7189%20C%200.9919%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3458%200.2912%200.3458%20L%200.2912%200%20L%201.3468001%200.0273%20L%202.3933%200%20L%202.3933%200.3458%20C%202.0566%200.3458%201.8473%200.36400002%201.7836001%200.4004%20C%201.7199%200.4368%201.6835%200.546%201.6835%200.7189%20L%201.6835%202.3569002%20C%201.6835%203.094%202.1658%203.7583%202.8665001%203.7583%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g244F502A10CDC70DE9AAA4877DC1FE65%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.3953004%200.8281%20L%204.3953004%201.365%20L%204.1041%201.365%20L%204.1041%200.8281%20C%204.1041%200.47320002%204.004%200.2912%203.8129%200.2912%20C%203.6309001%200.2912%203.5217001%200.5187%203.5217001%200.70070004%20L%203.5217001%202.4934%20C%203.5217001%202.8119001%203.4853%203.0485%203.4216%203.2123%20C%203.2032%203.7492%202.5753002%204.0768003%201.9383001%204.0768003%20C%201.2376001%204.0768003%200.546%203.6855001%200.546%203.0303001%20C%200.546%202.73%200.70070004%202.5753002%201.001%202.5753002%20C%201.3013%202.5753002%201.4469%202.7209%201.4469%203.0212002%20C%201.4469%203.2851002%201.3104%203.4398%201.0283%203.4671001%20C%201.2285%203.6946%201.5288%203.8129%201.9201001%203.8129%20C%202.4843001%203.8129%202.8301%203.2942002%202.8301%202.7027001%20L%202.8301%202.4024%20C%202.1203%202.3569002%201.5834%202.2477%201.2103001%202.0748%20C%200.6006%201.7927%200.2912%201.4014001%200.2912%200.8827%20C%200.2912%200.64610004%200.3822%200.44590002%200.5551%200.2912%20C%200.8463%200.0273%201.2467%20-0.1001%201.7563001%20-0.1001%20C%202.2932%20-0.1001%202.6754%200.12740001%202.9120002%200.59150004%20C%202.9757001%200.24570002%203.2305002%20-0.0546%203.6218002%20-0.0546%20C%204.1041%20-0.0546%204.3953004%200.3276%204.3953004%200.8281%20Z%20M%201.82%200.1638%20C%201.4014001%200.1638%201.0556%200.47320002%201.0556%200.89180005%20C%201.0556%201.7381%201.9383001%202.1021001%202.8301%202.1476002%20L%202.8301%201.2831%20C%202.8301%200.67340004%202.4297001%200.1638%201.82%200.1638%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g272D7D04C5DF2EB93D4A46F74DAF749C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.8038%200.0273%20C%204.0131%200.0364%204.3134003%200.0273%204.6956%200%20L%204.6956%200.3458%20C%204.2133%200.3458%204.0313%200.3549%203.8402002%200.6097%20L%202.6572%202.1385%20C%203.0485%202.6208%203.3124%202.9484%203.4580002%203.1213002%20C%203.7128003%203.4125001%204.0677004%203.5672002%204.5318003%203.5763001%20L%204.5318003%203.9221%20C%204.277%203.9039001%204.0222%203.8948002%203.7674003%203.8948002%20C%203.4307%203.8948002%203.1304002%203.9039001%202.8665001%203.9221%20L%202.8665001%203.5763001%20C%203.0394%203.5581002%203.1304002%203.4762%203.1304002%203.3306%20C%203.1304002%203.2487001%203.0849001%203.1486%203.003%203.0394%20L%202.4752002%202.3842%20L%201.8018001%203.2487001%20C%201.7563001%203.3124%201.7290001%203.3579001%201.7290001%203.3852%20C%201.7290001%203.5035002%201.8382001%203.5672002%202.0475001%203.5763001%20L%202.0475001%203.9221%20L%201.0374%203.8948002%20C%200.8008%203.8857002%200.50960004%203.8948002%200.15470001%203.9221%20L%200.15470001%203.5763001%20C%200.4823%203.5763001%200.6916%203.5490003%200.78260005%203.5035002%20C%200.8736%203.4580002%201.0192001%203.3033001%201.2194%203.0394%20L%202.0839%201.9110001%20C%201.638%201.3377%201.365%200.9919%201.2649001%200.8736%20C%200.97370005%200.5187%200.59150004%200.3458%200.1092%200.3458%20L%200.1092%200%20C%200.44590002%200.0273%200.70070004%200.0364%200.89180005%200.0273%20L%201.7745001%200%20L%201.7745001%200.3458%20C%201.6016%200.3731%201.5197%200.455%201.5197%200.59150004%20C%201.5197%200.6279%201.5288%200.67340004%201.547%200.7189%20C%201.6016%200.83720005%201.8473%201.1466%202.2841%201.6653%20L%202.9393%200.80990005%20C%203.0394%200.6825%203.094%200.59150004%203.1213002%200.53690004%20C%203.1213002%200.41860002%203.0121002%200.3549%202.7937002%200.3458%20L%202.7937002%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.1387363636363634em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, then any query point in a given cell can only
ever collide with a fixed set of points in the cloud: namely, the set of
points whose distance to the cell is less than or equal to
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2023.526099999999996%2021.878999999999998%22%20width%3D%2223.526099999999996pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.863%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7C707578FA33FC5F4974517BD3CD702D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g244F502A10CDC70DE9AAA4877DC1FE65%22%20x%3D%227.5802999999999985%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g272D7D04C5DF2EB93D4A46F74DAF749C%22%20x%3D%2212.130299999999998%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7C707578FA33FC5F4974517BD3CD702D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.8665001%203.7583%20C%203.2851002%203.7583%203.4944%203.4398%203.4944%202.7937002%20L%203.4944%200.7189%20C%203.4944%200.546%203.4671001%200.4368%203.4034002%200.4004%20C%203.3397002%200.36400002%203.1304002%200.3458%202.7937002%200.3458%20L%202.7937002%200%20L%203.8493001%200.0273%20L%204.8958%200%20L%204.8958%200.3458%20C%204.5591%200.3458%204.3589%200.36400002%204.2952003%200.4004%20C%204.2315%200.4368%204.1951003%200.546%204.1951003%200.7189%20L%204.1951003%202.3569002%20C%204.1951003%203.0849001%204.6683%203.7583%205.3690004%203.7583%20C%205.7967%203.7583%206.006%203.4398%206.006%202.7937002%20L%206.006%200.7189%20C%206.006%200.546%205.9696%200.4368%205.9059005%200.4004%20C%205.8422003%200.36400002%205.6329%200.3458%205.2962003%200.3458%20L%205.2962003%200%20L%206.3518004%200.0273%20L%207.3983%200%20L%207.3983%200.3458%20C%207.1071005%200.3458%206.9160004%200.3549%206.8250003%200.3822%20C%206.734%200.4095%206.6976004%200.47320002%206.6976004%200.5824%20L%206.6976004%202.2841%20C%206.6976004%202.7118%206.6794004%203.0121002%206.6521%203.1850002%20C%206.5611005%203.7401001%206.1516004%204.0222%205.4327%204.0222%20C%204.8594003%204.0222%204.4317%203.7583%204.1405%203.2214%20C%204.0131%203.7583%203.6127002%204.0222%202.9302%204.0222%20C%202.3569002%204.0222%201.9201001%203.7492%201.6289%203.2032%20L%201.6289%204.0222%20L%200.2912%203.9221%20L%200.2912%203.5763001%20C%200.61880004%203.5763001%200.819%203.5490003%200.89180005%203.4944%20C%200.9646%203.4398%200.9919%203.3215%200.9919%203.1122%20L%200.9919%200.7189%20C%200.9919%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3458%200.2912%200.3458%20L%200.2912%200%20L%201.3468001%200.0273%20L%202.3933%200%20L%202.3933%200.3458%20C%202.0566%200.3458%201.8473%200.36400002%201.7836001%200.4004%20C%201.7199%200.4368%201.6835%200.546%201.6835%200.7189%20L%201.6835%202.3569002%20C%201.6835%203.094%202.1658%203.7583%202.8665001%203.7583%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g244F502A10CDC70DE9AAA4877DC1FE65%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.3953004%200.8281%20L%204.3953004%201.365%20L%204.1041%201.365%20L%204.1041%200.8281%20C%204.1041%200.47320002%204.004%200.2912%203.8129%200.2912%20C%203.6309001%200.2912%203.5217001%200.5187%203.5217001%200.70070004%20L%203.5217001%202.4934%20C%203.5217001%202.8119001%203.4853%203.0485%203.4216%203.2123%20C%203.2032%203.7492%202.5753002%204.0768003%201.9383001%204.0768003%20C%201.2376001%204.0768003%200.546%203.6855001%200.546%203.0303001%20C%200.546%202.73%200.70070004%202.5753002%201.001%202.5753002%20C%201.3013%202.5753002%201.4469%202.7209%201.4469%203.0212002%20C%201.4469%203.2851002%201.3104%203.4398%201.0283%203.4671001%20C%201.2285%203.6946%201.5288%203.8129%201.9201001%203.8129%20C%202.4843001%203.8129%202.8301%203.2942002%202.8301%202.7027001%20L%202.8301%202.4024%20C%202.1203%202.3569002%201.5834%202.2477%201.2103001%202.0748%20C%200.6006%201.7927%200.2912%201.4014001%200.2912%200.8827%20C%200.2912%200.64610004%200.3822%200.44590002%200.5551%200.2912%20C%200.8463%200.0273%201.2467%20-0.1001%201.7563001%20-0.1001%20C%202.2932%20-0.1001%202.6754%200.12740001%202.9120002%200.59150004%20C%202.9757001%200.24570002%203.2305002%20-0.0546%203.6218002%20-0.0546%20C%204.1041%20-0.0546%204.3953004%200.3276%204.3953004%200.8281%20Z%20M%201.82%200.1638%20C%201.4014001%200.1638%201.0556%200.47320002%201.0556%200.89180005%20C%201.0556%201.7381%201.9383001%202.1021001%202.8301%202.1476002%20L%202.8301%201.2831%20C%202.8301%200.67340004%202.4297001%200.1638%201.82%200.1638%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g272D7D04C5DF2EB93D4A46F74DAF749C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.8038%200.0273%20C%204.0131%200.0364%204.3134003%200.0273%204.6956%200%20L%204.6956%200.3458%20C%204.2133%200.3458%204.0313%200.3549%203.8402002%200.6097%20L%202.6572%202.1385%20C%203.0485%202.6208%203.3124%202.9484%203.4580002%203.1213002%20C%203.7128003%203.4125001%204.0677004%203.5672002%204.5318003%203.5763001%20L%204.5318003%203.9221%20C%204.277%203.9039001%204.0222%203.8948002%203.7674003%203.8948002%20C%203.4307%203.8948002%203.1304002%203.9039001%202.8665001%203.9221%20L%202.8665001%203.5763001%20C%203.0394%203.5581002%203.1304002%203.4762%203.1304002%203.3306%20C%203.1304002%203.2487001%203.0849001%203.1486%203.003%203.0394%20L%202.4752002%202.3842%20L%201.8018001%203.2487001%20C%201.7563001%203.3124%201.7290001%203.3579001%201.7290001%203.3852%20C%201.7290001%203.5035002%201.8382001%203.5672002%202.0475001%203.5763001%20L%202.0475001%203.9221%20L%201.0374%203.8948002%20C%200.8008%203.8857002%200.50960004%203.8948002%200.15470001%203.9221%20L%200.15470001%203.5763001%20C%200.4823%203.5763001%200.6916%203.5490003%200.78260005%203.5035002%20C%200.8736%203.4580002%201.0192001%203.3033001%201.2194%203.0394%20L%202.0839%201.9110001%20C%201.638%201.3377%201.365%200.9919%201.2649001%200.8736%20C%200.97370005%200.5187%200.59150004%200.3458%200.1092%200.3458%20L%200.1092%200%20C%200.44590002%200.0273%200.70070004%200.0364%200.89180005%200.0273%20L%201.7745001%200%20L%201.7745001%200.3458%20C%201.6016%200.3731%201.5197%200.455%201.5197%200.59150004%20C%201.5197%200.6279%201.5288%200.67340004%201.547%200.7189%20C%201.6016%200.83720005%201.8473%201.1466%202.2841%201.6653%20L%202.9393%200.80990005%20C%203.0394%200.6825%203.094%200.59150004%203.1213002%200.53690004%20C%203.1213002%200.41860002%203.0121002%200.3549%202.7937002%200.3458%20L%202.7937002%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.1387363636363634em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;captree&#x2F;affordance_min.svg&quot; alt=&quot;The cell containing  affords , , and  at radius , but not  or .&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Let’s call those points &lt;dfn&gt;afforded&lt;&#x2F;dfn&gt;; that is, for a given cell &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%205.954%2021.878999999999998%22%20width%3D%225.954pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3BD2F2FDE487A05197DD8782434E5CF8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3BD2F2FDE487A05197DD8782434E5CF8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.264%204.225%20C%204.264%203.9%204.433%203.7310002%204.784%203.7310002%20C%205.2520003%203.7310002%205.551%204.1340003%205.551%204.602%20C%205.551%205.33%204.784%205.7460003%204.004%205.7460003%20C%203.107%205.7460003%202.288%205.356%201.5860001%204.589%20C%200.884%203.822%200.533%202.977%200.533%202.0670002%20C%200.533%200.79300004%201.378%20-0.143%202.652%20-0.143%20C%203.341%20-0.143%203.9520001%200.026%204.485%200.351%20C%204.927%200.624%205.2520003%200.897%205.46%201.1700001%20C%205.551%201.2870001%205.59%201.378%205.59%201.417%20C%205.59%201.5600001%205.525%201.638%205.382%201.638%20C%205.317%201.638%205.2520003%201.5860001%205.1740003%201.482%20C%204.745%200.91%204.212%200.546%203.601%200.39000002%20C%203.198%200.286%202.8990002%200.234%202.678%200.234%20C%201.937%200.234%201.5730001%200.689%201.5730001%201.5860001%20C%201.5730001%202.392%201.95%203.562%202.262%204.1210003%20C%202.5740001%204.6930003%203.237%205.369%204.004%205.369%20C%204.498%205.369%204.836%205.2260003%205.018%204.953%20C%204.6150002%204.914%204.264%204.6540003%204.264%204.225%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5412727272727272em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;
and a radius &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.032%2021.878999999999998%22%20width%3D%226.032pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5483636363636364em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%205.954%2021.878999999999998%22%20width%3D%225.954pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3BD2F2FDE487A05197DD8782434E5CF8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3BD2F2FDE487A05197DD8782434E5CF8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.264%204.225%20C%204.264%203.9%204.433%203.7310002%204.784%203.7310002%20C%205.2520003%203.7310002%205.551%204.1340003%205.551%204.602%20C%205.551%205.33%204.784%205.7460003%204.004%205.7460003%20C%203.107%205.7460003%202.288%205.356%201.5860001%204.589%20C%200.884%203.822%200.533%202.977%200.533%202.0670002%20C%200.533%200.79300004%201.378%20-0.143%202.652%20-0.143%20C%203.341%20-0.143%203.9520001%200.026%204.485%200.351%20C%204.927%200.624%205.2520003%200.897%205.46%201.1700001%20C%205.551%201.2870001%205.59%201.378%205.59%201.417%20C%205.59%201.5600001%205.525%201.638%205.382%201.638%20C%205.317%201.638%205.2520003%201.5860001%205.1740003%201.482%20C%204.745%200.91%204.212%200.546%203.601%200.39000002%20C%203.198%200.286%202.8990002%200.234%202.678%200.234%20C%201.937%200.234%201.5730001%200.689%201.5730001%201.5860001%20C%201.5730001%202.392%201.95%203.562%202.262%204.1210003%20C%202.5740001%204.6930003%203.237%205.369%204.004%205.369%20C%204.498%205.369%204.836%205.2260003%205.018%204.953%20C%204.6150002%204.914%204.264%204.6540003%204.264%204.225%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5412727272727272em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; affords &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.734%2021.878999999999998%22%20width%3D%226.734pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g254AE47CC15CC81C004457B9506AF3F3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g254AE47CC15CC81C004457B9506AF3F3%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.6150002%205.7460003%20C%204.043%205.7460003%203.497%205.447%202.964%204.849%20C%202.821%205.447%202.418%205.7460003%201.781%205.7460003%20C%201.248%205.7460003%200.85800004%205.317%200.58500004%204.472%20C%200.455%204.043%200.39000002%203.796%200.39000002%203.7180002%20C%200.39000002%203.601%200.455%203.536%200.598%203.536%20C%200.663%203.536%200.702%203.549%200.741%203.575%20C%200.806%203.6920002%200.845%203.783%200.85800004%203.874%20C%201.092%204.862%201.391%205.356%201.742%205.356%20C%201.9760001%205.356%202.093%205.1740003%202.093%204.823%20C%202.093%204.6280003%202.0670002%204.407%202.002%204.173%20L%200.572%20-1.534%20C%200.455%20-1.963%200.442%20-2.015%20-0.065%20-2.015%20C%20-0.299%20-2.015%20-0.416%20-2.119%20-0.416%20-2.3140001%20C%20-0.416%20-2.457%20-0.338%20-2.522%20-0.19500001%20-2.522%20C%200%20-2.522%200.676%20-2.483%200.871%20-2.483%20C%201.118%20-2.483%201.898%20-2.522%202.145%20-2.522%20C%202.3400002%20-2.522%202.431%20-2.418%202.431%20-2.21%20C%202.431%20-2.08%202.3140001%20-2.015%202.0670002%20-2.015%20C%201.8330001%20-2.015%201.482%20-2.028%201.482%20-1.872%20C%201.482%20-1.7030001%202.015%200.338%202.0670002%200.559%20C%202.3270001%200.078%202.717%20-0.169%203.237%20-0.169%20C%204.0820003%20-0.169%204.823%200.26%205.473%201.131%20C%206.071%201.924%206.3700004%202.769%206.3700004%203.64%20C%206.3700004%204.771%205.6940002%205.7460003%204.6150002%205.7460003%20Z%20M%204.576%205.356%20C%205.083%205.356%205.343%204.966%205.343%204.199%20C%205.343%203.848%205.2650003%203.38%205.122%202.795%20C%204.823%201.664%204.446%200.92300004%203.9910002%200.546%20C%203.7180002%200.32500002%203.471%200.208%203.224%200.208%20C%202.8470001%200.208%202.5870001%200.377%202.444%200.72800004%20C%202.3270001%201.001%202.262%201.196%202.262%201.3000001%20L%202.925%204.017%20C%202.99%204.303%203.224%204.602%203.588%204.901%20C%203.9520001%205.2000003%204.277%205.356%204.576%205.356%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6121818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; if there exists a point &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2033.57322222222222%2021.878999999999998%22%20width%3D%2233.57322222222222pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2811.04711111111111%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g64CA8EBFD302DE0CE83A3B8E6DC4BE01%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2823.329222222222224%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB3A7EED547E264F7F332A0ED1D022FF0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g64CA8EBFD302DE0CE83A3B8E6DC4BE01%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.3190002%200.052%20L%204.849%200.052%20C%204.03%200.052%203.302%200.32500002%202.704%200.884%20C%202.106%201.4430001%201.768%202.119%201.69%202.938%20L%207.3190002%202.938%20C%207.527%202.938%207.631%203.042%207.631%203.25%20C%207.631%203.4580002%207.527%203.562%207.3190002%203.562%20L%201.69%203.562%20C%201.768%204.381%202.106%205.057%202.704%205.616%20C%203.302%206.175%204.03%206.448%204.849%206.448%20L%207.3190002%206.448%20C%207.527%206.448%207.631%206.552%207.631%206.747%20C%207.631%206.955%207.527%207.059%207.3190002%207.059%20L%204.849%207.059%20C%203.796%207.059%202.8990002%206.695%202.158%205.954%20C%201.417%205.2130003%201.053%204.316%201.053%203.25%20C%201.053%202.184%201.417%201.2870001%202.158%200.546%20C%202.8990002%20-0.19500001%203.796%20-0.559%204.849%20-0.559%20L%207.3190002%20-0.559%20C%207.527%20-0.559%207.631%20-0.455%207.631%20-0.24700001%20C%207.631%20-0.091000006%207.488%200.052%207.3190002%200.052%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB3A7EED547E264F7F332A0ED1D022FF0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.924%202.834%20C%201.924%204.498%202.652%206.188%203.471%207.124%20C%204.1340003%207.8910003%205.278%208.658%206.565%208.658%20C%207.9170003%208.658%208.58%207.631%208.58%206.227%20C%208.58%206.11%208.541%205.6940002%208.541%205.577%20C%208.541%205.46%208.619%205.395%208.788%205.395%20C%208.853001%205.395%208.905%205.408%208.944%205.421%20C%209.009%205.512%209.048%205.603%209.074%205.6940002%20L%209.88%208.983%20C%209.88%209.1%209.815001%209.165%209.685%209.165%20C%209.633%209.165%209.555%209.113%209.451%208.996%20L%208.606%208.047%20C%208.099%208.788%207.3840003%209.165%206.461%209.165%20C%205.7460003%209.165%205.044%208.996%204.329%208.6710005%20C%202.8860002%207.9950004%201.8330001%206.9290004%201.1570001%205.473%20C%200.819%204.758%200.65000004%204.03%200.65000004%203.289%20C%200.65000004%202.249%200.975%201.404%201.638%200.72800004%20C%202.301%200.052%203.1460001%20-0.286%204.186%20-0.286%20C%205.2130003%20-0.286%206.149%200.091000006%206.994%200.832%20C%207.3450003%201.131%207.644%201.495%207.8910003%201.898%20C%208.242001%202.483%208.424%202.8860002%208.424%203.1330001%20C%208.424%203.25%208.359%203.315%208.216001%203.315%20C%208.099%203.315%208.034%203.263%208.008%203.1460001%20C%207.735%202.301%207.306%201.625%206.721%201.144%20C%205.98%200.533%205.2000003%200.221%204.394%200.221%20C%202.834%200.221%201.924%201.274%201.924%202.834%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.052111111111111em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;
such that &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2060.658%2021.878999999999998%22%20width%3D%2260.658pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g17AF90F25DACF254827E59F8A3A9E6D4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%283.6140000000000003%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g254AE47CC15CC81C004457B9506AF3F3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2813.236888888888888%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9B4A74A66763B268E0058C1DD08B5046%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2826.239777777777775%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2833.675777777777775%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g17AF90F25DACF254827E59F8A3A9E6D4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2840.900888888888886%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB96EBFBEC04ED47E748D0E97A693AB26%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2854.626%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g17AF90F25DACF254827E59F8A3A9E6D4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.807%20-3.25%20C%201.9760001%20-3.25%202.0670002%20-3.1460001%202.0670002%20-2.938%20L%202.0670002%209.438%20C%202.0670002%209.646%201.9760001%209.75%201.807%209.75%20C%201.638%209.75%201.547%209.646%201.547%209.438%20L%201.547%20-2.938%20C%201.547%20-3.1460001%201.638%20-3.25%201.807%20-3.25%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g254AE47CC15CC81C004457B9506AF3F3%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.6150002%205.7460003%20C%204.043%205.7460003%203.497%205.447%202.964%204.849%20C%202.821%205.447%202.418%205.7460003%201.781%205.7460003%20C%201.248%205.7460003%200.85800004%205.317%200.58500004%204.472%20C%200.455%204.043%200.39000002%203.796%200.39000002%203.7180002%20C%200.39000002%203.601%200.455%203.536%200.598%203.536%20C%200.663%203.536%200.702%203.549%200.741%203.575%20C%200.806%203.6920002%200.845%203.783%200.85800004%203.874%20C%201.092%204.862%201.391%205.356%201.742%205.356%20C%201.9760001%205.356%202.093%205.1740003%202.093%204.823%20C%202.093%204.6280003%202.0670002%204.407%202.002%204.173%20L%200.572%20-1.534%20C%200.455%20-1.963%200.442%20-2.015%20-0.065%20-2.015%20C%20-0.299%20-2.015%20-0.416%20-2.119%20-0.416%20-2.3140001%20C%20-0.416%20-2.457%20-0.338%20-2.522%20-0.19500001%20-2.522%20C%200%20-2.522%200.676%20-2.483%200.871%20-2.483%20C%201.118%20-2.483%201.898%20-2.522%202.145%20-2.522%20C%202.3400002%20-2.522%202.431%20-2.418%202.431%20-2.21%20C%202.431%20-2.08%202.3140001%20-2.015%202.0670002%20-2.015%20C%201.8330001%20-2.015%201.482%20-2.028%201.482%20-1.872%20C%201.482%20-1.7030001%202.015%200.338%202.0670002%200.559%20C%202.3270001%200.078%202.717%20-0.169%203.237%20-0.169%20C%204.0820003%20-0.169%204.823%200.26%205.473%201.131%20C%206.071%201.924%206.3700004%202.769%206.3700004%203.64%20C%206.3700004%204.771%205.6940002%205.7460003%204.6150002%205.7460003%20Z%20M%204.576%205.356%20C%205.083%205.356%205.343%204.966%205.343%204.199%20C%205.343%203.848%205.2650003%203.38%205.122%202.795%20C%204.823%201.664%204.446%200.92300004%203.9910002%200.546%20C%203.7180002%200.32500002%203.471%200.208%203.224%200.208%20C%202.8470001%200.208%202.5870001%200.377%202.444%200.72800004%20C%202.3270001%201.001%202.262%201.196%202.262%201.3000001%20L%202.925%204.017%20C%202.99%204.303%203.224%204.602%203.588%204.901%20C%203.9520001%205.2000003%204.277%205.356%204.576%205.356%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9B4A74A66763B268E0058C1DD08B5046%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%203.51%20L%201.04%203.51%20C%200.832%203.51%200.72800004%203.4190001%200.72800004%203.25%20C%200.72800004%203.081%200.832%202.99%201.04%202.99%20L%209.074%202.99%20C%209.282001%202.99%209.386001%203.081%209.386001%203.25%20C%209.386001%203.4060001%209.2300005%203.51%209.074%203.51%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB96EBFBEC04ED47E748D0E97A693AB26%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%208.684%200.49400002%20C%208.918%200.377%209.139%200.572%209.139%200.78000003%20C%209.139%200.897%209.074%200.98800004%208.957%201.04%20L%202.015%204.329%20L%208.957%207.618%20C%209.074%207.67%209.139%207.761%209.139%207.8780003%20C%209.139%208.099%209.035%208.203%208.827001%208.203%20C%208.775001%208.203%208.723001%208.190001%208.684%208.177%20L%201.222%204.6410003%20C%201.092%204.576%201.0270001%204.472%201.0270001%204.329%20C%201.0270001%204.186%201.092%204.0950003%201.222%204.03%20Z%20M%208.814%20-0.936%20L%201.3000001%20-0.936%20C%201.092%20-0.936%200.98800004%20-1.04%200.98800004%20-1.235%20C%200.98800004%20-1.4430001%201.092%20-1.547%201.3000001%20-1.547%20L%208.814%20-1.547%20C%209.022%20-1.547%209.126%20-1.4430001%209.126%20-1.235%20C%209.126%20-1.079%208.983%20-0.936%208.814%20-0.936%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 5.514363636363637em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Using our knowledge of &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2023.526099999999996%2021.878999999999998%22%20width%3D%2223.526099999999996pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.863%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7C707578FA33FC5F4974517BD3CD702D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g244F502A10CDC70DE9AAA4877DC1FE65%22%20x%3D%227.5802999999999985%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g272D7D04C5DF2EB93D4A46F74DAF749C%22%20x%3D%2212.130299999999998%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7C707578FA33FC5F4974517BD3CD702D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.8665001%203.7583%20C%203.2851002%203.7583%203.4944%203.4398%203.4944%202.7937002%20L%203.4944%200.7189%20C%203.4944%200.546%203.4671001%200.4368%203.4034002%200.4004%20C%203.3397002%200.36400002%203.1304002%200.3458%202.7937002%200.3458%20L%202.7937002%200%20L%203.8493001%200.0273%20L%204.8958%200%20L%204.8958%200.3458%20C%204.5591%200.3458%204.3589%200.36400002%204.2952003%200.4004%20C%204.2315%200.4368%204.1951003%200.546%204.1951003%200.7189%20L%204.1951003%202.3569002%20C%204.1951003%203.0849001%204.6683%203.7583%205.3690004%203.7583%20C%205.7967%203.7583%206.006%203.4398%206.006%202.7937002%20L%206.006%200.7189%20C%206.006%200.546%205.9696%200.4368%205.9059005%200.4004%20C%205.8422003%200.36400002%205.6329%200.3458%205.2962003%200.3458%20L%205.2962003%200%20L%206.3518004%200.0273%20L%207.3983%200%20L%207.3983%200.3458%20C%207.1071005%200.3458%206.9160004%200.3549%206.8250003%200.3822%20C%206.734%200.4095%206.6976004%200.47320002%206.6976004%200.5824%20L%206.6976004%202.2841%20C%206.6976004%202.7118%206.6794004%203.0121002%206.6521%203.1850002%20C%206.5611005%203.7401001%206.1516004%204.0222%205.4327%204.0222%20C%204.8594003%204.0222%204.4317%203.7583%204.1405%203.2214%20C%204.0131%203.7583%203.6127002%204.0222%202.9302%204.0222%20C%202.3569002%204.0222%201.9201001%203.7492%201.6289%203.2032%20L%201.6289%204.0222%20L%200.2912%203.9221%20L%200.2912%203.5763001%20C%200.61880004%203.5763001%200.819%203.5490003%200.89180005%203.4944%20C%200.9646%203.4398%200.9919%203.3215%200.9919%203.1122%20L%200.9919%200.7189%20C%200.9919%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3458%200.2912%200.3458%20L%200.2912%200%20L%201.3468001%200.0273%20L%202.3933%200%20L%202.3933%200.3458%20C%202.0566%200.3458%201.8473%200.36400002%201.7836001%200.4004%20C%201.7199%200.4368%201.6835%200.546%201.6835%200.7189%20L%201.6835%202.3569002%20C%201.6835%203.094%202.1658%203.7583%202.8665001%203.7583%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g244F502A10CDC70DE9AAA4877DC1FE65%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.3953004%200.8281%20L%204.3953004%201.365%20L%204.1041%201.365%20L%204.1041%200.8281%20C%204.1041%200.47320002%204.004%200.2912%203.8129%200.2912%20C%203.6309001%200.2912%203.5217001%200.5187%203.5217001%200.70070004%20L%203.5217001%202.4934%20C%203.5217001%202.8119001%203.4853%203.0485%203.4216%203.2123%20C%203.2032%203.7492%202.5753002%204.0768003%201.9383001%204.0768003%20C%201.2376001%204.0768003%200.546%203.6855001%200.546%203.0303001%20C%200.546%202.73%200.70070004%202.5753002%201.001%202.5753002%20C%201.3013%202.5753002%201.4469%202.7209%201.4469%203.0212002%20C%201.4469%203.2851002%201.3104%203.4398%201.0283%203.4671001%20C%201.2285%203.6946%201.5288%203.8129%201.9201001%203.8129%20C%202.4843001%203.8129%202.8301%203.2942002%202.8301%202.7027001%20L%202.8301%202.4024%20C%202.1203%202.3569002%201.5834%202.2477%201.2103001%202.0748%20C%200.6006%201.7927%200.2912%201.4014001%200.2912%200.8827%20C%200.2912%200.64610004%200.3822%200.44590002%200.5551%200.2912%20C%200.8463%200.0273%201.2467%20-0.1001%201.7563001%20-0.1001%20C%202.2932%20-0.1001%202.6754%200.12740001%202.9120002%200.59150004%20C%202.9757001%200.24570002%203.2305002%20-0.0546%203.6218002%20-0.0546%20C%204.1041%20-0.0546%204.3953004%200.3276%204.3953004%200.8281%20Z%20M%201.82%200.1638%20C%201.4014001%200.1638%201.0556%200.47320002%201.0556%200.89180005%20C%201.0556%201.7381%201.9383001%202.1021001%202.8301%202.1476002%20L%202.8301%201.2831%20C%202.8301%200.67340004%202.4297001%200.1638%201.82%200.1638%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g272D7D04C5DF2EB93D4A46F74DAF749C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.8038%200.0273%20C%204.0131%200.0364%204.3134003%200.0273%204.6956%200%20L%204.6956%200.3458%20C%204.2133%200.3458%204.0313%200.3549%203.8402002%200.6097%20L%202.6572%202.1385%20C%203.0485%202.6208%203.3124%202.9484%203.4580002%203.1213002%20C%203.7128003%203.4125001%204.0677004%203.5672002%204.5318003%203.5763001%20L%204.5318003%203.9221%20C%204.277%203.9039001%204.0222%203.8948002%203.7674003%203.8948002%20C%203.4307%203.8948002%203.1304002%203.9039001%202.8665001%203.9221%20L%202.8665001%203.5763001%20C%203.0394%203.5581002%203.1304002%203.4762%203.1304002%203.3306%20C%203.1304002%203.2487001%203.0849001%203.1486%203.003%203.0394%20L%202.4752002%202.3842%20L%201.8018001%203.2487001%20C%201.7563001%203.3124%201.7290001%203.3579001%201.7290001%203.3852%20C%201.7290001%203.5035002%201.8382001%203.5672002%202.0475001%203.5763001%20L%202.0475001%203.9221%20L%201.0374%203.8948002%20C%200.8008%203.8857002%200.50960004%203.8948002%200.15470001%203.9221%20L%200.15470001%203.5763001%20C%200.4823%203.5763001%200.6916%203.5490003%200.78260005%203.5035002%20C%200.8736%203.4580002%201.0192001%203.3033001%201.2194%203.0394%20L%202.0839%201.9110001%20C%201.638%201.3377%201.365%200.9919%201.2649001%200.8736%20C%200.97370005%200.5187%200.59150004%200.3458%200.1092%200.3458%20L%200.1092%200%20C%200.44590002%200.0273%200.70070004%200.0364%200.89180005%200.0273%20L%201.7745001%200%20L%201.7745001%200.3458%20C%201.6016%200.3731%201.5197%200.455%201.5197%200.59150004%20C%201.5197%200.6279%201.5288%200.67340004%201.547%200.7189%20C%201.6016%200.83720005%201.8473%201.1466%202.2841%201.6653%20L%202.9393%200.80990005%20C%203.0394%200.6825%203.094%200.59150004%203.1213002%200.53690004%20C%203.1213002%200.41860002%203.0121002%200.3549%202.7937002%200.3458%20L%202.7937002%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.1387363636363634em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, we can annotate each leaf of
our forward-tree with the list of all afforded points. Then, when
checking for collision, we can traverse this list of afforded points and
test for collision against any of them. This allows us to convert our
approximate-nearest-neighbor guess into a completely accurate
range-nearest-neighbors query without . I currently call the resulting
structure an &lt;dfn&gt;collision-affording point tree&lt;&#x2F;dfn&gt;, or &lt;dfn&gt;CAPT&lt;&#x2F;dfn&gt; for
short.&lt;&#x2F;p&gt;
&lt;p&gt;Now, instead of storing a single point for each leaf of the tree, we’ll
store a list of points which might be in collision, called an
&lt;dfn&gt;affordance set&lt;&#x2F;dfn&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;Capt&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;tests&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;afforded&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;However, this data layout isn’t quite optimal. We’ve broken up our
possibly-colliding points into a bunch of different allocations,
requiring an extra size parameter on each and fragmenting our memory. We
can coagulate all the affordance set into one gigantic array, and then
use another lookup table to get the starting and ending indices relevant
to one point.&lt;&#x2F;p&gt;
&lt;p&gt;Additionally, to make SIMD parallelism easier, we can use a
struct-of-arrays layout for each point in &lt;code&gt;afforded&lt;&#x2F;code&gt;, which means that
we split out each dimension of every point, and store them in separate
buffers.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;Capt&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; contains n - 1 elements
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;tests&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; contains n + 1 elements
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;starts&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; each buffer contains aff_starts[n] elements
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;afforded&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; [&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;; 3],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once we have a cell index &lt;code&gt;id&lt;&#x2F;code&gt; from &lt;code&gt;first_pass&lt;&#x2F;code&gt;,
&lt;code&gt;afforded[starts[id]..starts[id + 1]]&lt;&#x2F;code&gt; will contain all the afforded
points for the cell.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;capt_collides&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;t&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;Capt, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;point&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;; 3], &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;rsq&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;bool&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; id &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;first_pass&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;t&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;tests&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; point&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;t&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;starts&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;id&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;t&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;starts&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;id &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;any&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        t&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;afforded
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;zip&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;point&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;map&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &amp;amp;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;b&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;a&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;i&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; b&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;powi&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;sum&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;=&lt;&#x2F;span&gt; rsq
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If we tried to parallelize collision-checking between our query spheres
and afforded points like we did in &lt;code&gt;first_pass&lt;&#x2F;code&gt;, we wouldn’t actually
see much performance benefit. I know this because that’s what I had
originally tried, and it was hardly faster than the sequential
implementation. The heart of the problem is that gather instructions are
comically slow on nearly all processors, so the CPU spends far more time
waiting for memory to arrive than it does on churning through
computations.&lt;&#x2F;p&gt;
&lt;p&gt;To fix this, we need to have a way to test for collision without
touching a large about of memory at the same time. The simplest fix is
the best: instead of parallelizing across queries, we parallelize across
afforded points for one query. We iterate sequentially through the query
spheres, but in parallel, we check whether &lt;code&gt;L&lt;&#x2F;code&gt; different afforded points
collide with the same sphere. The upside of this is that the data for
these points are stored contiguously, so we waste no time waiting on
gathers.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;capt_collides_simd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;const&lt;&#x2F;span&gt; L&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;t&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;Capt,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;points&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;, L&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;; 3],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;radii&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;, L&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;bool&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;where&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;LaneCount&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;L&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; SupportedLaneCount,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; ids &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;first_pass_simd&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;t&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;tests&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; points&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; start &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;gather_or_default&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;t&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;starts&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; ids&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; end &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;gather_or_default&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;t&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;starts&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; ids &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; l &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;L &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; pt &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;map&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;k&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;points&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;l&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; rsq &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;radii&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;l&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;powi&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; s &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;start&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;l&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;end&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;l&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;step_by&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;L&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; distsq &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;splat&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-float z-rust&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-float z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;pt_k&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; aff_k&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; pt&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;zip&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;t&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;afforded&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; assume `affordances[k]` is sufficiently long
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; for simplicity
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; diff &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; pt_k &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Simd&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;from_slice&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;aff_k&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;s&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                distsq &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; diff &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; diff&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; distsq&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;simd_le&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;rsq&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;any&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;return&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-rust&quot;&gt;true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-constant z-language z-rust&quot;&gt;false&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;squeezing-out-some-juice&quot;&gt;Squeezing out some juice&lt;&#x2F;h2&gt;
&lt;p&gt;The performance of this “default” tree is pretty good, but there’s
one place where it suffers a lot: non-colliding queries. If a query
sphere doesn’t collide with any afforded point, we have to check every
single afforded point. Some cells could afford hundreds of points, which
would yield extremely poor runtimes. We need some sort of fast-path
rejection for queries which are certainly not in collision.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;getting-in-order&quot;&gt;Getting in order&lt;&#x2F;h3&gt;
&lt;p&gt;I first observed that many query spheres had much smaller radii than the
maximum afforded radius of the tree. This means that many of the
afforded points for each cell would be further from the cell than the
query radius, meaning that they could never collide with a query sphere
of that radius.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;captree&#x2F;sort_affordance.svg&quot; alt=&quot;The cell affords 3 points at  that it doesn’t afford at , so a query sphere of radius  wouldn’t need to check collision against those points.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The first idea we had for this was to sort all the points in each
affordance set in descending order of distance to the cell. That way,
searches with small query radii would be able to terminate earlier: as
soon as the collision-check found a point further from the cell than the
query radius, the search could terminate immediately.&lt;&#x2F;p&gt;
&lt;p&gt;This was good for query performance, but came at a significant cost in
tree construction time. I’ll explain the details of construction later
in this post, but for now, know that this measure put construction times
into the worst-case regime of &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2063.40923333333333%2021.878999999999998%22%20width%3D%2263.40923333333333pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD64B3975C9A5026604F20A029CCF2ADF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.984%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6E0B9941E7AAA4C87C0B118CB162942E%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.47%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCC2D6A7770FCF135D0D1A78A9F87C718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2823.27%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g86111C2D5C8682C53BDA9AD6152C9992%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2831.342566666666663%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1E5377FCBB1A07E0E1F5441C1515230A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCF3CD6CDE4276477C56A604EC4E71E42%22%20x%3D%223.6140000000000003%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCF8898C9600A817392ACC3BA6AB6A96C%22%20x%3D%2210.114%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2850.12323333333334%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCC2D6A7770FCF135D0D1A78A9F87C718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2857.92323333333333%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g67EFC6A56ECEEA6CD53D2A781C7091DE%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD64B3975C9A5026604F20A029CCF2ADF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.126%203.4190001%20C%209.451%204.16%209.62%204.901%209.62%205.655%20C%209.62%206.669%209.321%207.501%208.71%208.1640005%20C%208.099%208.827001%207.293%209.165%206.2920003%209.165%20C%205.603%209.165%204.914%208.996%204.225%208.658%20C%202.821%207.9690003%201.794%206.8770003%201.131%205.395%20C%200.806%204.6670003%200.637%203.9390001%200.637%203.198%20C%200.637%202.171%200.936%201.339%201.547%200.689%20C%202.158%200.039%202.964%20-0.286%203.9780002%20-0.286%20C%204.6540003%20-0.286%205.33%20-0.117%206.019%200.208%20C%207.4360003%200.897%208.463%201.9760001%209.126%203.4190001%20Z%20M%208.372%206.162%20C%208.372%204.433%207.592%202.704%206.76%201.677%20C%206.188%200.962%205.2000003%200.156%204.056%200.156%20C%202.665%200.156%201.937%201.365%201.937%202.834%20C%201.937%203.289%202.028%203.9%202.197%204.6410003%20C%202.548%206.175%203.4320002%207.527%204.589%208.229%20C%205.1480002%208.567%205.6940002%208.736%206.214%208.736%20C%207.618%208.736%208.372%207.618%208.372%206.162%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6E0B9941E7AAA4C87C0B118CB162942E%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.524%20-3.861%20C%204.6410003%20-3.861%204.7060003%20-3.796%204.7060003%20-3.6790001%20C%204.7060003%20-3.614%204.6800003%20-3.575%204.6410003%20-3.536%20C%203.913%20-2.977%203.328%20-2.0410001%202.8860002%20-0.72800004%20C%202.509%200.403%202.3140001%201.495%202.3140001%202.5740001%20L%202.3140001%203.926%20C%202.3140001%205.005%202.509%206.097%202.8860002%207.228%20C%203.328%208.541%203.913%209.477%204.6410003%2010.036%20C%204.6800003%2010.075%204.7060003%2010.114%204.7060003%2010.179%20C%204.7060003%2010.2960005%204.6410003%2010.361%204.524%2010.361%20C%204.472%2010.361%204.433%2010.348001%204.42%2010.3220005%20C%203.575%209.672%202.8730001%208.71%202.3140001%207.4230003%20C%201.781%206.201%201.508%205.031%201.508%203.926%20L%201.508%202.5740001%20C%201.508%201.469%201.781%200.299%202.3140001%20-0.92300004%20C%202.8730001%20-2.21%203.575%20-3.1720002%204.42%20-3.822%20C%204.433%20-3.848%204.472%20-3.861%204.524%20-3.861%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCC2D6A7770FCF135D0D1A78A9F87C718%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.981%201.781%20C%206.682%200.754%206.2530003%200.234%205.7200003%200.234%20C%205.551%200.234%205.46%200.36400002%205.46%200.611%20C%205.46%200.79300004%205.538%201.092%205.6940002%201.495%20C%206.214%202.9120002%206.474%203.848%206.474%204.329%20C%206.474%205.2390003%205.863%205.7460003%204.953%205.7460003%20C%204.186%205.7460003%203.523%205.408%202.99%204.719%20C%202.8860002%205.291%202.431%205.7460003%201.768%205.7460003%20C%201.04%205.7460003%200.754%205.07%200.572%204.485%20C%200.442%204.0690002%200.377%203.822%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.963%205.369%202.08%205.1870003%202.08%204.823%20C%202.08%204.6540003%202.015%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4430001%20-0.143%20C%201.69%20-0.143%201.872%20-0.013%201.963%200.24700001%20C%201.9890001%200.312%202.0670002%200.637%202.21%201.196%20L%202.483%202.3530002%20L%202.8730001%203.835%20C%203.016%204.1340003%203.237%204.433%203.51%204.745%20C%203.887%205.1610003%204.355%205.369%204.914%205.369%20C%205.343%205.369%205.551%205.083%205.551%204.524%20C%205.551%204.03%205.278%203.042%204.719%201.5600001%20C%204.6280003%201.326%204.589%201.131%204.589%200.962%20C%204.589%200.32500002%205.07%20-0.143%205.6940002%20-0.143%20C%206.2660003%20-0.143%206.721%200.18200001%207.046%200.832%20C%207.293%201.352%207.4230003%201.7030001%207.4230003%201.872%20C%207.4230003%201.9890001%207.3580003%202.0540001%207.215%202.0540001%20C%207.176%202.0540001%206.981%201.937%206.981%201.781%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g86111C2D5C8682C53BDA9AD6152C9992%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0829%203.8584%20C%201.3741001%203.8584%201.5925001%204.0768003%201.5925001%204.368%20C%201.5925001%204.6956%201.4196%204.8685%201.0829%204.8776%20C%201.2831%205.3053%201.7381%205.6511%202.3296%205.6511%20C%203.1304002%205.6511%203.6582003%205.0505004%203.6582003%204.2497%20C%203.6582003%203.8129%203.5035002%203.3943002%203.1850002%202.9848%20C%203.0303001%202.7755%202.9120002%202.6299002%202.8301%202.548%20L%200.67340004%200.4095%20C%200.5551%200.3003%200.5733%200.273%200.5733%200%20L%204.3225%200%20L%204.6046%201.7108%20L%204.2224%201.7108%20C%204.1587%201.2285%204.0859003%200.94640005%204.004%200.8827%20C%203.9585001%200.8554%203.6764002%200.83720005%203.1395001%200.83720005%20L%201.5925001%200.83720005%20C%202.2022002%201.3741001%202.7664%201.8564001%203.3033001%202.2841%20C%203.7128003%202.6026%204.004%202.8847%204.1860003%203.1304002%20C%204.459%203.4853%204.5955%203.8584%204.5955%204.2497%20C%204.5955%204.8139%204.3771%205.2598004%203.9312003%205.5874004%20C%203.5399%205.8877%203.0485%206.0424004%202.4661002%206.0424004%20C%201.9656001%206.0424004%201.5379001%205.8968%201.1648%205.6056004%20C%200.7735%205.2871003%200.5733%204.8867%200.5733%204.3953004%20C%200.5733%204.0859003%200.8008%203.8584%201.0829%203.8584%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1E5377FCBB1A07E0E1F5441C1515230A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.872%200.039%20L%203.315%200%20L%203.315%200.507%20C%202.8470001%200.507%202.561%200.52%202.47%200.572%20C%202.379%200.624%202.3400002%200.78000003%202.3400002%201.0270001%20L%202.3400002%209.022%20L%200.42900002%208.879%20L%200.42900002%208.385%20C%200.884%208.385%201.1700001%208.346%201.261%208.268001%20C%201.352%208.190001%201.404%208.008%201.404%207.709%20L%201.404%201.0270001%20C%201.404%200.78000003%201.365%200.624%201.274%200.572%20C%201.183%200.52%200.897%200.507%200.42900002%200.507%20L%200.42900002%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCF3CD6CDE4276477C56A604EC4E71E42%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.237%20-0.143%20C%204.043%20-0.143%204.719%200.143%205.278%200.71500003%20C%205.837%201.2870001%206.123%201.9760001%206.123%202.782%20C%206.123%203.601%205.85%204.316%205.304%204.914%20C%204.758%205.512%204.0690002%205.8240004%203.25%205.8240004%20C%202.431%205.8240004%201.755%205.512%201.196%204.914%20C%200.637%204.316%200.36400002%203.601%200.36400002%202.782%20C%200.36400002%201.9760001%200.637%201.2870001%201.196%200.71500003%20C%201.755%200.143%202.444%20-0.143%203.237%20-0.143%20Z%20M%203.25%200.273%20C%202.6260002%200.273%202.158%200.546%201.8330001%201.105%20C%201.625%201.469%201.521%202.0670002%201.521%202.8860002%20C%201.521%203.6790001%201.625%204.251%201.82%204.6150002%20C%202.132%205.1740003%202.6000001%205.447%203.237%205.447%20C%203.848%205.447%204.316%205.1740003%204.6410003%204.6410003%20C%204.862%204.277%204.966%203.6920002%204.966%202.8860002%20C%204.966%201.378%204.524%200.273%203.25%200.273%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCF8898C9600A817392ACC3BA6AB6A96C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.603%205.889%20C%205.109%205.889%204.6540003%205.6940002%204.238%205.304%20C%203.848%205.603%203.4060001%205.7460003%202.8990002%205.7460003%20C%201.781%205.7460003%200.767%204.914%200.767%203.822%20C%200.767%203.276%200.962%202.834%201.352%202.496%20C%201.105%202.184%200.975%201.8330001%200.975%201.4300001%20C%200.975%200.936%201.144%200.559%201.469%200.312%20C%200.92300004%200.13%200.36400002%20-0.338%200.36400002%20-1.001%20C%200.36400002%20-1.5600001%200.72800004%20-2.002%201.4430001%20-2.3140001%20C%201.9890001%20-2.561%202.5870001%20-2.678%203.237%20-2.678%20C%203.9%20-2.678%204.511%20-2.561%205.057%20-2.3140001%20C%205.7720003%20-2.002%206.123%20-1.5600001%206.123%20-0.975%20C%206.123%20-0.286%205.837%200.221%205.2650003%200.546%20C%204.6670003%200.871%204.004%200.91%203.042%200.91%20C%202.47%200.91%202.158%200.91%202.093%200.92300004%20C%201.7290001%200.975%201.469%201.326%201.469%201.7290001%20C%201.469%201.924%201.521%202.106%201.638%202.262%20C%202.002%202.015%202.418%201.885%202.8990002%201.885%20C%204.017%201.885%205.018%202.717%205.018%203.809%20C%205.018%204.316%204.849%204.732%204.511%205.057%20C%204.836%205.356%205.1870003%205.499%205.564%205.499%20C%205.499%205.434%205.46%205.33%205.46%205.2000003%20C%205.46%204.914%205.603%204.771%205.889%204.771%20C%206.162%204.771%206.3050003%204.914%206.3050003%205.2130003%20C%206.3050003%205.616%205.993%205.889%205.603%205.889%20Z%20M%202.8990002%205.343%20C%203.601%205.343%203.9520001%204.836%203.9520001%203.822%20C%203.9520001%202.795%203.601%202.275%202.8990002%202.275%20C%202.184%202.275%201.8330001%202.782%201.8330001%203.809%20C%201.8330001%204.836%202.184%205.343%202.8990002%205.343%20Z%20M%202.132%200.052%20L%202.8860002%200.052%20C%203.562%200.052%204.1080003%200.013%204.524%20-0.078%20C%205.083%20-0.19500001%205.356%20-0.507%205.356%20-1.001%20C%205.356%20-1.417%205.096%20-1.742%204.576%20-1.9890001%20C%204.173%20-2.184%203.7310002%20-2.275%203.25%20-2.275%20C%202.782%20-2.275%202.3400002%20-2.184%201.924%20-1.9890001%20C%201.391%20-1.742%201.131%20-1.417%201.131%20-1.001%20C%201.131%20-0.455%201.599%200.052%202.132%200.052%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g67EFC6A56ECEEA6CD53D2A781C7091DE%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.066%20-3.822%20C%201.911%20-3.1720002%202.6130002%20-2.21%203.1720002%20-0.92300004%20C%203.7050002%200.299%203.9780002%201.469%203.9780002%202.5740001%20L%203.9780002%203.926%20C%203.9780002%205.031%203.7050002%206.201%203.1720002%207.4230003%20C%202.6130002%208.71%201.911%209.672%201.066%2010.3220005%20C%201.053%2010.348001%201.014%2010.361%200.962%2010.361%20C%200.845%2010.361%200.78000003%2010.2960005%200.78000003%2010.179%20C%200.78000003%2010.114%200.806%2010.075%200.845%2010.036%20C%201.5730001%209.477%202.158%208.541%202.6000001%207.228%20C%202.977%206.097%203.1720002%205.005%203.1720002%203.926%20L%203.1720002%202.5740001%20C%203.1720002%201.495%202.977%200.403%202.6000001%20-0.72800004%20C%202.158%20-2.0410001%201.5730001%20-2.977%200.845%20-3.536%20C%200.806%20-3.575%200.78000003%20-3.614%200.78000003%20-3.6790001%20C%200.78000003%20-3.796%200.845%20-3.861%200.962%20-3.861%20C%201.014%20-3.861%201.053%20-3.848%201.066%20-3.822%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 5.764475757575758em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; for trees containing
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.799999999999999%2021.878999999999998%22%20width%3D%227.799999999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCC2D6A7770FCF135D0D1A78A9F87C718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCC2D6A7770FCF135D0D1A78A9F87C718%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.981%201.781%20C%206.682%200.754%206.2530003%200.234%205.7200003%200.234%20C%205.551%200.234%205.46%200.36400002%205.46%200.611%20C%205.46%200.79300004%205.538%201.092%205.6940002%201.495%20C%206.214%202.9120002%206.474%203.848%206.474%204.329%20C%206.474%205.2390003%205.863%205.7460003%204.953%205.7460003%20C%204.186%205.7460003%203.523%205.408%202.99%204.719%20C%202.8860002%205.291%202.431%205.7460003%201.768%205.7460003%20C%201.04%205.7460003%200.754%205.07%200.572%204.485%20C%200.442%204.0690002%200.377%203.822%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.963%205.369%202.08%205.1870003%202.08%204.823%20C%202.08%204.6540003%202.015%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4430001%20-0.143%20C%201.69%20-0.143%201.872%20-0.013%201.963%200.24700001%20C%201.9890001%200.312%202.0670002%200.637%202.21%201.196%20L%202.483%202.3530002%20L%202.8730001%203.835%20C%203.016%204.1340003%203.237%204.433%203.51%204.745%20C%203.887%205.1610003%204.355%205.369%204.914%205.369%20C%205.343%205.369%205.551%205.083%205.551%204.524%20C%205.551%204.03%205.278%203.042%204.719%201.5600001%20C%204.6280003%201.326%204.589%201.131%204.589%200.962%20C%204.589%200.32500002%205.07%20-0.143%205.6940002%20-0.143%20C%206.2660003%20-0.143%206.721%200.18200001%207.046%200.832%20C%207.293%201.352%207.4230003%201.7030001%207.4230003%201.872%20C%207.4230003%201.9890001%207.3580003%202.0540001%207.215%202.0540001%20C%207.176%202.0540001%206.981%201.937%206.981%201.781%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.709090909090909em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; points. This is far too much time when &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.799999999999999%2021.878999999999998%22%20width%3D%227.799999999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCC2D6A7770FCF135D0D1A78A9F87C718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCC2D6A7770FCF135D0D1A78A9F87C718%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.981%201.781%20C%206.682%200.754%206.2530003%200.234%205.7200003%200.234%20C%205.551%200.234%205.46%200.36400002%205.46%200.611%20C%205.46%200.79300004%205.538%201.092%205.6940002%201.495%20C%206.214%202.9120002%206.474%203.848%206.474%204.329%20C%206.474%205.2390003%205.863%205.7460003%204.953%205.7460003%20C%204.186%205.7460003%203.523%205.408%202.99%204.719%20C%202.8860002%205.291%202.431%205.7460003%201.768%205.7460003%20C%201.04%205.7460003%200.754%205.07%200.572%204.485%20C%200.442%204.0690002%200.377%203.822%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.963%205.369%202.08%205.1870003%202.08%204.823%20C%202.08%204.6540003%202.015%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4430001%20-0.143%20C%201.69%20-0.143%201.872%20-0.013%201.963%200.24700001%20C%201.9890001%200.312%202.0670002%200.637%202.21%201.196%20L%202.483%202.3530002%20L%202.8730001%203.835%20C%203.016%204.1340003%203.237%204.433%203.51%204.745%20C%203.887%205.1610003%204.355%205.369%204.914%205.369%20C%205.343%205.369%205.551%205.083%205.551%204.524%20C%205.551%204.03%205.278%203.042%204.719%201.5600001%20C%204.6280003%201.326%204.589%201.131%204.589%200.962%20C%204.589%200.32500002%205.07%20-0.143%205.6940002%20-0.143%20C%206.2660003%20-0.143%206.721%200.18200001%207.046%200.832%20C%207.293%201.352%207.4230003%201.7030001%207.4230003%201.872%20C%207.4230003%201.9890001%207.3580003%202.0540001%207.215%202.0540001%20C%207.176%202.0540001%206.981%201.937%206.981%201.781%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.709090909090909em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; is measured in thousands;
in some of my tests it took 30 seconds to construct the tree on large
point clouds. In the end, I had to nix this feature for performance.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;shrinking-down&quot;&gt;Shrinking down&lt;&#x2F;h3&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;captree&#x2F;rmin.svg&quot; alt=&quot;The sphere centered on the representative point with radius  contains the entire cell, so all query spheres centered in this cell are in collision.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;While experimenting, I found that a very small minority of cells had
extremely large affordance sets. These cells were typically very small,
and in the middle of a big cluster of points. Often, because the cells
were so small, every single query sphere inside the cell would collide
with the representative point of the cell.&lt;&#x2F;p&gt;
&lt;p&gt;I decided to take advantage of this to reduce the peak affordance size.
We already accept that we know &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2023.526099999999996%2021.878999999999998%22%20width%3D%2223.526099999999996pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.863%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7C707578FA33FC5F4974517BD3CD702D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g244F502A10CDC70DE9AAA4877DC1FE65%22%20x%3D%227.5802999999999985%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g272D7D04C5DF2EB93D4A46F74DAF749C%22%20x%3D%2212.130299999999998%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7C707578FA33FC5F4974517BD3CD702D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.8665001%203.7583%20C%203.2851002%203.7583%203.4944%203.4398%203.4944%202.7937002%20L%203.4944%200.7189%20C%203.4944%200.546%203.4671001%200.4368%203.4034002%200.4004%20C%203.3397002%200.36400002%203.1304002%200.3458%202.7937002%200.3458%20L%202.7937002%200%20L%203.8493001%200.0273%20L%204.8958%200%20L%204.8958%200.3458%20C%204.5591%200.3458%204.3589%200.36400002%204.2952003%200.4004%20C%204.2315%200.4368%204.1951003%200.546%204.1951003%200.7189%20L%204.1951003%202.3569002%20C%204.1951003%203.0849001%204.6683%203.7583%205.3690004%203.7583%20C%205.7967%203.7583%206.006%203.4398%206.006%202.7937002%20L%206.006%200.7189%20C%206.006%200.546%205.9696%200.4368%205.9059005%200.4004%20C%205.8422003%200.36400002%205.6329%200.3458%205.2962003%200.3458%20L%205.2962003%200%20L%206.3518004%200.0273%20L%207.3983%200%20L%207.3983%200.3458%20C%207.1071005%200.3458%206.9160004%200.3549%206.8250003%200.3822%20C%206.734%200.4095%206.6976004%200.47320002%206.6976004%200.5824%20L%206.6976004%202.2841%20C%206.6976004%202.7118%206.6794004%203.0121002%206.6521%203.1850002%20C%206.5611005%203.7401001%206.1516004%204.0222%205.4327%204.0222%20C%204.8594003%204.0222%204.4317%203.7583%204.1405%203.2214%20C%204.0131%203.7583%203.6127002%204.0222%202.9302%204.0222%20C%202.3569002%204.0222%201.9201001%203.7492%201.6289%203.2032%20L%201.6289%204.0222%20L%200.2912%203.9221%20L%200.2912%203.5763001%20C%200.61880004%203.5763001%200.819%203.5490003%200.89180005%203.4944%20C%200.9646%203.4398%200.9919%203.3215%200.9919%203.1122%20L%200.9919%200.7189%20C%200.9919%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3458%200.2912%200.3458%20L%200.2912%200%20L%201.3468001%200.0273%20L%202.3933%200%20L%202.3933%200.3458%20C%202.0566%200.3458%201.8473%200.36400002%201.7836001%200.4004%20C%201.7199%200.4368%201.6835%200.546%201.6835%200.7189%20L%201.6835%202.3569002%20C%201.6835%203.094%202.1658%203.7583%202.8665001%203.7583%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g244F502A10CDC70DE9AAA4877DC1FE65%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.3953004%200.8281%20L%204.3953004%201.365%20L%204.1041%201.365%20L%204.1041%200.8281%20C%204.1041%200.47320002%204.004%200.2912%203.8129%200.2912%20C%203.6309001%200.2912%203.5217001%200.5187%203.5217001%200.70070004%20L%203.5217001%202.4934%20C%203.5217001%202.8119001%203.4853%203.0485%203.4216%203.2123%20C%203.2032%203.7492%202.5753002%204.0768003%201.9383001%204.0768003%20C%201.2376001%204.0768003%200.546%203.6855001%200.546%203.0303001%20C%200.546%202.73%200.70070004%202.5753002%201.001%202.5753002%20C%201.3013%202.5753002%201.4469%202.7209%201.4469%203.0212002%20C%201.4469%203.2851002%201.3104%203.4398%201.0283%203.4671001%20C%201.2285%203.6946%201.5288%203.8129%201.9201001%203.8129%20C%202.4843001%203.8129%202.8301%203.2942002%202.8301%202.7027001%20L%202.8301%202.4024%20C%202.1203%202.3569002%201.5834%202.2477%201.2103001%202.0748%20C%200.6006%201.7927%200.2912%201.4014001%200.2912%200.8827%20C%200.2912%200.64610004%200.3822%200.44590002%200.5551%200.2912%20C%200.8463%200.0273%201.2467%20-0.1001%201.7563001%20-0.1001%20C%202.2932%20-0.1001%202.6754%200.12740001%202.9120002%200.59150004%20C%202.9757001%200.24570002%203.2305002%20-0.0546%203.6218002%20-0.0546%20C%204.1041%20-0.0546%204.3953004%200.3276%204.3953004%200.8281%20Z%20M%201.82%200.1638%20C%201.4014001%200.1638%201.0556%200.47320002%201.0556%200.89180005%20C%201.0556%201.7381%201.9383001%202.1021001%202.8301%202.1476002%20L%202.8301%201.2831%20C%202.8301%200.67340004%202.4297001%200.1638%201.82%200.1638%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g272D7D04C5DF2EB93D4A46F74DAF749C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.8038%200.0273%20C%204.0131%200.0364%204.3134003%200.0273%204.6956%200%20L%204.6956%200.3458%20C%204.2133%200.3458%204.0313%200.3549%203.8402002%200.6097%20L%202.6572%202.1385%20C%203.0485%202.6208%203.3124%202.9484%203.4580002%203.1213002%20C%203.7128003%203.4125001%204.0677004%203.5672002%204.5318003%203.5763001%20L%204.5318003%203.9221%20C%204.277%203.9039001%204.0222%203.8948002%203.7674003%203.8948002%20C%203.4307%203.8948002%203.1304002%203.9039001%202.8665001%203.9221%20L%202.8665001%203.5763001%20C%203.0394%203.5581002%203.1304002%203.4762%203.1304002%203.3306%20C%203.1304002%203.2487001%203.0849001%203.1486%203.003%203.0394%20L%202.4752002%202.3842%20L%201.8018001%203.2487001%20C%201.7563001%203.3124%201.7290001%203.3579001%201.7290001%203.3852%20C%201.7290001%203.5035002%201.8382001%203.5672002%202.0475001%203.5763001%20L%202.0475001%203.9221%20L%201.0374%203.8948002%20C%200.8008%203.8857002%200.50960004%203.8948002%200.15470001%203.9221%20L%200.15470001%203.5763001%20C%200.4823%203.5763001%200.6916%203.5490003%200.78260005%203.5035002%20C%200.8736%203.4580002%201.0192001%203.3033001%201.2194%203.0394%20L%202.0839%201.9110001%20C%201.638%201.3377%201.365%200.9919%201.2649001%200.8736%20C%200.97370005%200.5187%200.59150004%200.3458%200.1092%200.3458%20L%200.1092%200%20C%200.44590002%200.0273%200.70070004%200.0364%200.89180005%200.0273%20L%201.7745001%200%20L%201.7745001%200.3458%20C%201.6016%200.3731%201.5197%200.455%201.5197%200.59150004%20C%201.5197%200.6279%201.5288%200.67340004%201.547%200.7189%20C%201.6016%200.83720005%201.8473%201.1466%202.2841%201.6653%20L%202.9393%200.80990005%20C%203.0394%200.6825%203.094%200.59150004%203.1213002%200.53690004%20C%203.1213002%200.41860002%203.0121002%200.3549%202.7937002%200.3458%20L%202.7937002%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.1387363636363634em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, so why not also provide
a minimum radius &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2021.760699999999996%2021.878999999999998%22%20width%3D%2221.760699999999996pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.863%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7C707578FA33FC5F4974517BD3CD702D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3C402A3AAC495DD2DB174F02BB0D7DF0%22%20x%3D%227.5802999999999985%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6276E6C0547F2BCFEC62983F27BE06B8%22%20x%3D%2210.1101%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7C707578FA33FC5F4974517BD3CD702D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.8665001%203.7583%20C%203.2851002%203.7583%203.4944%203.4398%203.4944%202.7937002%20L%203.4944%200.7189%20C%203.4944%200.546%203.4671001%200.4368%203.4034002%200.4004%20C%203.3397002%200.36400002%203.1304002%200.3458%202.7937002%200.3458%20L%202.7937002%200%20L%203.8493001%200.0273%20L%204.8958%200%20L%204.8958%200.3458%20C%204.5591%200.3458%204.3589%200.36400002%204.2952003%200.4004%20C%204.2315%200.4368%204.1951003%200.546%204.1951003%200.7189%20L%204.1951003%202.3569002%20C%204.1951003%203.0849001%204.6683%203.7583%205.3690004%203.7583%20C%205.7967%203.7583%206.006%203.4398%206.006%202.7937002%20L%206.006%200.7189%20C%206.006%200.546%205.9696%200.4368%205.9059005%200.4004%20C%205.8422003%200.36400002%205.6329%200.3458%205.2962003%200.3458%20L%205.2962003%200%20L%206.3518004%200.0273%20L%207.3983%200%20L%207.3983%200.3458%20C%207.1071005%200.3458%206.9160004%200.3549%206.8250003%200.3822%20C%206.734%200.4095%206.6976004%200.47320002%206.6976004%200.5824%20L%206.6976004%202.2841%20C%206.6976004%202.7118%206.6794004%203.0121002%206.6521%203.1850002%20C%206.5611005%203.7401001%206.1516004%204.0222%205.4327%204.0222%20C%204.8594003%204.0222%204.4317%203.7583%204.1405%203.2214%20C%204.0131%203.7583%203.6127002%204.0222%202.9302%204.0222%20C%202.3569002%204.0222%201.9201001%203.7492%201.6289%203.2032%20L%201.6289%204.0222%20L%200.2912%203.9221%20L%200.2912%203.5763001%20C%200.61880004%203.5763001%200.819%203.5490003%200.89180005%203.4944%20C%200.9646%203.4398%200.9919%203.3215%200.9919%203.1122%20L%200.9919%200.7189%20C%200.9919%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3458%200.2912%200.3458%20L%200.2912%200%20L%201.3468001%200.0273%20L%202.3933%200%20L%202.3933%200.3458%20C%202.0566%200.3458%201.8473%200.36400002%201.7836001%200.4004%20C%201.7199%200.4368%201.6835%200.546%201.6835%200.7189%20L%201.6835%202.3569002%20C%201.6835%203.094%202.1658%203.7583%202.8665001%203.7583%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3C402A3AAC495DD2DB174F02BB0D7DF0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.7654%205.4691%20C%201.7654%205.7421002%201.5379001%205.9787%201.2649001%205.9787%20C%200.9919%205.9787%200.75530005%205.7421002%200.75530005%205.4691%20C%200.75530005%205.1961%200.98280007%204.9504004%201.2558%204.9504004%20C%201.5379001%204.9504004%201.7654%205.1870003%201.7654%205.4691%20Z%20M%201.3013%200.0273%20L%202.2477%200%20L%202.2477%200.3549%20C%201.9474001%200.3549%201.7654%200.3731%201.7108%200.4095%20C%201.6562%200.44590002%201.638%200.546%201.638%200.7098%20L%201.638%204.0495%20L%200.33670002%203.9403002%20L%200.33670002%203.5945%20C%200.637%203.5945%200.8281%203.5672002%200.89180005%203.5217001%20C%200.95550007%203.4762%200.98280007%203.3488002%200.98280007%203.1395001%20L%200.98280007%200.7189%20C%200.98280007%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3549%200.3003%200.3549%20L%200.3003%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6276E6C0547F2BCFEC62983F27BE06B8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.8574002%203.7583%20C%203.2669%203.7583%203.4762%203.4398%203.4762%202.7937002%20L%203.4762%200.7189%20C%203.4762%200.546%203.4489002%200.4368%203.3852%200.4004%20C%203.3215%200.36400002%203.1213002%200.3458%202.7846%200.3458%20L%202.7846%200%20L%203.8311002%200.0273%20L%204.8685%200%20L%204.8685%200.3458%20C%204.5773%200.3458%204.3862%200.3549%204.2952003%200.3822%20C%204.2042003%200.4095%204.1678%200.47320002%204.1678%200.5824%20L%204.1678%202.2841%20C%204.1678%202.7118%204.1587%203.0121002%204.1314%203.1850002%20C%204.0404%203.7401001%203.6309001%204.0222%202.9120002%204.0222%20C%202.3387%204.0222%201.9110001%203.7492%201.6289%203.2032%20L%201.6289%204.0222%20L%200.2912%203.9221%20L%200.2912%203.5763001%20C%200.61880004%203.5763001%200.819%203.5490003%200.89180005%203.4944%20C%200.9646%203.4398%200.9919%203.3215%200.9919%203.1122%20L%200.9919%200.7189%20C%200.9919%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3458%200.2912%200.3458%20L%200.2912%200%20L%201.3377%200.0273%20L%202.3751001%200%20L%202.3751001%200.3458%20C%202.0384002%200.3458%201.8473%200.36400002%201.7836001%200.4004%20C%201.7199%200.4368%201.6835%200.546%201.6835%200.7189%20L%201.6835%202.3569002%20C%201.6835%203.094%202.1476002%203.7583%202.8574002%203.7583%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.9782454545454542em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;? If a sphere of radius
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2021.760699999999996%2021.878999999999998%22%20width%3D%2221.760699999999996pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.863%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7C707578FA33FC5F4974517BD3CD702D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3C402A3AAC495DD2DB174F02BB0D7DF0%22%20x%3D%227.5802999999999985%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6276E6C0547F2BCFEC62983F27BE06B8%22%20x%3D%2210.1101%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7C707578FA33FC5F4974517BD3CD702D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.8665001%203.7583%20C%203.2851002%203.7583%203.4944%203.4398%203.4944%202.7937002%20L%203.4944%200.7189%20C%203.4944%200.546%203.4671001%200.4368%203.4034002%200.4004%20C%203.3397002%200.36400002%203.1304002%200.3458%202.7937002%200.3458%20L%202.7937002%200%20L%203.8493001%200.0273%20L%204.8958%200%20L%204.8958%200.3458%20C%204.5591%200.3458%204.3589%200.36400002%204.2952003%200.4004%20C%204.2315%200.4368%204.1951003%200.546%204.1951003%200.7189%20L%204.1951003%202.3569002%20C%204.1951003%203.0849001%204.6683%203.7583%205.3690004%203.7583%20C%205.7967%203.7583%206.006%203.4398%206.006%202.7937002%20L%206.006%200.7189%20C%206.006%200.546%205.9696%200.4368%205.9059005%200.4004%20C%205.8422003%200.36400002%205.6329%200.3458%205.2962003%200.3458%20L%205.2962003%200%20L%206.3518004%200.0273%20L%207.3983%200%20L%207.3983%200.3458%20C%207.1071005%200.3458%206.9160004%200.3549%206.8250003%200.3822%20C%206.734%200.4095%206.6976004%200.47320002%206.6976004%200.5824%20L%206.6976004%202.2841%20C%206.6976004%202.7118%206.6794004%203.0121002%206.6521%203.1850002%20C%206.5611005%203.7401001%206.1516004%204.0222%205.4327%204.0222%20C%204.8594003%204.0222%204.4317%203.7583%204.1405%203.2214%20C%204.0131%203.7583%203.6127002%204.0222%202.9302%204.0222%20C%202.3569002%204.0222%201.9201001%203.7492%201.6289%203.2032%20L%201.6289%204.0222%20L%200.2912%203.9221%20L%200.2912%203.5763001%20C%200.61880004%203.5763001%200.819%203.5490003%200.89180005%203.4944%20C%200.9646%203.4398%200.9919%203.3215%200.9919%203.1122%20L%200.9919%200.7189%20C%200.9919%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3458%200.2912%200.3458%20L%200.2912%200%20L%201.3468001%200.0273%20L%202.3933%200%20L%202.3933%200.3458%20C%202.0566%200.3458%201.8473%200.36400002%201.7836001%200.4004%20C%201.7199%200.4368%201.6835%200.546%201.6835%200.7189%20L%201.6835%202.3569002%20C%201.6835%203.094%202.1658%203.7583%202.8665001%203.7583%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3C402A3AAC495DD2DB174F02BB0D7DF0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.7654%205.4691%20C%201.7654%205.7421002%201.5379001%205.9787%201.2649001%205.9787%20C%200.9919%205.9787%200.75530005%205.7421002%200.75530005%205.4691%20C%200.75530005%205.1961%200.98280007%204.9504004%201.2558%204.9504004%20C%201.5379001%204.9504004%201.7654%205.1870003%201.7654%205.4691%20Z%20M%201.3013%200.0273%20L%202.2477%200%20L%202.2477%200.3549%20C%201.9474001%200.3549%201.7654%200.3731%201.7108%200.4095%20C%201.6562%200.44590002%201.638%200.546%201.638%200.7098%20L%201.638%204.0495%20L%200.33670002%203.9403002%20L%200.33670002%203.5945%20C%200.637%203.5945%200.8281%203.5672002%200.89180005%203.5217001%20C%200.95550007%203.4762%200.98280007%203.3488002%200.98280007%203.1395001%20L%200.98280007%200.7189%20C%200.98280007%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3549%200.3003%200.3549%20L%200.3003%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6276E6C0547F2BCFEC62983F27BE06B8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.8574002%203.7583%20C%203.2669%203.7583%203.4762%203.4398%203.4762%202.7937002%20L%203.4762%200.7189%20C%203.4762%200.546%203.4489002%200.4368%203.3852%200.4004%20C%203.3215%200.36400002%203.1213002%200.3458%202.7846%200.3458%20L%202.7846%200%20L%203.8311002%200.0273%20L%204.8685%200%20L%204.8685%200.3458%20C%204.5773%200.3458%204.3862%200.3549%204.2952003%200.3822%20C%204.2042003%200.4095%204.1678%200.47320002%204.1678%200.5824%20L%204.1678%202.2841%20C%204.1678%202.7118%204.1587%203.0121002%204.1314%203.1850002%20C%204.0404%203.7401001%203.6309001%204.0222%202.9120002%204.0222%20C%202.3387%204.0222%201.9110001%203.7492%201.6289%203.2032%20L%201.6289%204.0222%20L%200.2912%203.9221%20L%200.2912%203.5763001%20C%200.61880004%203.5763001%200.819%203.5490003%200.89180005%203.4944%20C%200.9646%203.4398%200.9919%203.3215%200.9919%203.1122%20L%200.9919%200.7189%20C%200.9919%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3458%200.2912%200.3458%20L%200.2912%200%20L%201.3377%200.0273%20L%202.3751001%200%20L%202.3751001%200.3458%20C%202.0384002%200.3458%201.8473%200.36400002%201.7836001%200.4004%20C%201.7199%200.4368%201.6835%200.546%201.6835%200.7189%20L%201.6835%202.3569002%20C%201.6835%203.094%202.1476002%203.7583%202.8574002%203.7583%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.9782454545454542em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; collides with a point, then any other query sphere with
the same center should also collide, no matter what. For the small
cells, then, we can throw away all other points except the
representative point of the cell and store only a single point in its
afforded set.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;bounding-my-boxes&quot;&gt;Bounding my boxes&lt;&#x2F;h3&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;captree&#x2F;aabb.svg&quot; alt=&quot;The axis-aligned bounding box, in green, contains all points afforded by the cell.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;There’s one last notable case where the search spends a lot of time
needlessly checking for collisions. Cells near the edge of a cluster are
often long and skinny, with one tip of the cell being very close to the
cluster and the other tip extending far out into space. Those long,
skinny cells often take up the majority of the free space in the
environment, meaning most of our queries will actually be against a cell
which is mostly empty.&lt;&#x2F;p&gt;
&lt;p&gt;We’d like to be able to filter out queries which aren’t in collision
as fast as possible, ideally skipping the lengthy affordance set check.
Since often only one part of the cell contains afforded points, this
opens up a possibility for improvement: what if we just didn’t check
the spheres in the “empty” part of the cell?&lt;&#x2F;p&gt;
&lt;p&gt;To do this, we construct an axis-aligned bounding box (AABB) containing
the affordance set for each cell. If we’re lucky, the AABB will often
be much smaller than its cell.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;Capt&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; contains n - 1 elements
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;tests&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; contains n elements
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;aabbs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;Aabb&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; contains n + 1 elements
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;starts&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; each buffer contains aff_starts[n] elements
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;afforded&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; [&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Box&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;; 3],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;Clone&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; Copy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;Aabb&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;lo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; [&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;; 3],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;hi&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; [&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;; 3],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then, when querying, we can cheaply detect whether a query sphere
intersects the AABB. If it doesn’t, then we know that the sphere is not
in collision, and can avoid later expensive steps in collision-checking.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;intersects&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;aabb&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;Aabb, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;center&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;; 3], &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;rsq&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;bool&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    aabb&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;lo
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;zip&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;aabb&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;hi&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;zip&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;center&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;map&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;(&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;l&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;h&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; x&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;|&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;l&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; h&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; x&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;|&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;x&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;clamp&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;l&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; h&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; x&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;powi&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;sum&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;=&lt;&#x2F;span&gt; rsq
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; Rewritten from the previous version.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;capt_collides&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;t&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;Capt, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;point&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;; 3], &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;rsq&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;bool&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;  &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; id &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;first_pass&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;t&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;tests&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; point&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;  &lt;span class=&quot;z-support z-function z-rust&quot;&gt;intersects&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;t&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;aabbs&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;id&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; point&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; rsq&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;      &lt;span class=&quot;z-keyword z-operator z-logical z-rust&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;t&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;starts&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;id&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;t&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;starts&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;id &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;any&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;          t&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;afforded
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;              &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;              &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;zip&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;point&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;              &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;map&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &amp;amp;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;b&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;a&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;i&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; b&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;powi&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;              &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;sum&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;              &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;=&lt;&#x2F;span&gt; rsq
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With that, we have the complete collision-checking logic for a CAPT. The
process is simple: classify a query sphere as belonging to a cell, then
check whether the query sphere collides with any points sufficiently
close to the cell. This step can also be parallelized using SIMD by
batching collision checks with a set of afforded points in a cell;
however, I’m not including the sample code for that since it’s quite
complicated.&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;captree&#x2F;capt_throughput.svg&quot; alt=&quot;image&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;To see how well this tree performs, I’m showing the results from a
benchmark above. This plot shows the relative throughput of various
methods on a sequence of collision-checking queries. These queries were
recorded from a real motion planning problem, then I played the same
sequence of queries back with just the collision-checking to see how
much each collision-checking procedure took. All the numbers for the
Rust implementation were recorded on my laptop, though our paper’s
benchmarks ran on a somewhat beefier desktop computer.&lt;&#x2F;p&gt;
&lt;p&gt;We see that the CAPT is only slightly slower than the naive forward-only
tree. For some reason, it slows down dramatically once there are enough
points: this only occurs on my laptop, so I suspect it has something to
do with cache locality weirdness.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;under-construction&quot;&gt;Under construction&lt;&#x2F;h2&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;captree&#x2F;construct_top.svg&quot; alt=&quot;At the first step of construction, the cell is partitioned by its median plane on one axis.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;figure&gt;
&lt;div style=&quot;display: flex&quot;&gt;
&lt;img src=&quot;construct_left.svg&quot;
class=&quot;night-invert&quot; &#x2F;&gt;
&lt;div style=&quot;min-width: 50px&quot;&gt;
&lt;&#x2F;div&gt;
&lt;img src=&quot;construct_right.svg&quot;
class=&quot;night-invert&quot; &#x2F;&gt;
&lt;&#x2F;div&gt;
&lt;figcaption&gt;This produces two new cells, each with half as many points.
The affordance set is filtered down and then expanded to include points
from the opposite side of the partition.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;After all this, I still haven’t explained how these trees are
constructed. Efficiently constructing a CAPT is nontrivial, since the
brute-force approach to affordance set construction is a total
non-starter. Luckily, the construction procedure is much like that of a
normal &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.968%2021.878999999999998%22%20width%3D%226.968pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6BD6B5079591C663D089FFB042C868C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6BD6B5079591C663D089FFB042C868C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.317%204.589%20C%205.317%204.251%205.499%204.0820003%205.85%204.0820003%20C%206.3050003%204.0820003%206.604%204.485%206.604%204.927%20C%206.604%205.434%206.188%205.7850003%205.681%205.7850003%20C%205.096%205.7850003%204.472%205.395%203.783%204.6280003%20C%203.25%204.043%202.821%203.6660001%202.47%203.497%20L%203.783%208.827001%20C%203.757%208.944%203.7310002%209.022%203.562%209.022%20C%203.1460001%209.022%202.158%208.905%202.002%208.892%20C%201.807%208.866%201.7160001%208.775001%201.7160001%208.58%20C%201.7160001%208.45%201.8330001%208.385%202.0670002%208.385%20C%202.3140001%208.385%202.652%208.398%202.652%208.216001%20L%200.767%200.559%20C%200.72800004%200.416%200.71500003%200.32500002%200.71500003%200.273%20C%200.71500003%200%200.85800004%20-0.143%201.131%20-0.143%20C%201.352%20-0.143%201.521%20-0.039%201.612%200.156%20C%201.677%200.273%201.911%201.196%202.3270001%202.938%20C%203.003%202.8730001%203.7180002%202.548%203.7180002%201.898%20C%203.7180002%201.7030001%203.627%201.3130001%203.627%201.183%20C%203.627%200.442%204.1080003%20-0.143%204.849%20-0.143%20C%205.603%20-0.143%206.11%200.533%206.3700004%201.885%20C%206.3700004%202.002%206.3050003%202.0670002%206.175%202.0670002%20C%206.058%202.0670002%205.98%201.9760001%205.941%201.794%20C%205.655%200.767%205.304%200.24700001%204.875%200.24700001%20C%204.6410003%200.24700001%204.524%200.42900002%204.524%200.79300004%20C%204.524%201.001%204.6800003%201.7030001%204.6800003%201.911%20C%204.6800003%202.652%204.0820003%203.107%202.8730001%203.289%20C%203.1720002%203.497%203.51%203.796%203.874%204.186%20C%204.238%204.576%204.498%204.823%204.6670003%204.966%20C%205.018%205.2520003%205.356%205.395%205.655%205.395%20C%205.7850003%205.395%205.889%205.369%205.967%205.317%20C%205.616%205.2520003%205.317%204.927%205.317%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6334545454545455em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;-d tree.&lt;&#x2F;p&gt;
&lt;p&gt;We start out given some list of &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.799999999999999%2021.878999999999998%22%20width%3D%227.799999999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCC2D6A7770FCF135D0D1A78A9F87C718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCC2D6A7770FCF135D0D1A78A9F87C718%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.981%201.781%20C%206.682%200.754%206.2530003%200.234%205.7200003%200.234%20C%205.551%200.234%205.46%200.36400002%205.46%200.611%20C%205.46%200.79300004%205.538%201.092%205.6940002%201.495%20C%206.214%202.9120002%206.474%203.848%206.474%204.329%20C%206.474%205.2390003%205.863%205.7460003%204.953%205.7460003%20C%204.186%205.7460003%203.523%205.408%202.99%204.719%20C%202.8860002%205.291%202.431%205.7460003%201.768%205.7460003%20C%201.04%205.7460003%200.754%205.07%200.572%204.485%20C%200.442%204.0690002%200.377%203.822%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.963%205.369%202.08%205.1870003%202.08%204.823%20C%202.08%204.6540003%202.015%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4430001%20-0.143%20C%201.69%20-0.143%201.872%20-0.013%201.963%200.24700001%20C%201.9890001%200.312%202.0670002%200.637%202.21%201.196%20L%202.483%202.3530002%20L%202.8730001%203.835%20C%203.016%204.1340003%203.237%204.433%203.51%204.745%20C%203.887%205.1610003%204.355%205.369%204.914%205.369%20C%205.343%205.369%205.551%205.083%205.551%204.524%20C%205.551%204.03%205.278%203.042%204.719%201.5600001%20C%204.6280003%201.326%204.589%201.131%204.589%200.962%20C%204.589%200.32500002%205.07%20-0.143%205.6940002%20-0.143%20C%206.2660003%20-0.143%206.721%200.18200001%207.046%200.832%20C%207.293%201.352%207.4230003%201.7030001%207.4230003%201.872%20C%207.4230003%201.9890001%207.3580003%202.0540001%207.215%202.0540001%20C%207.176%202.0540001%206.981%201.937%206.981%201.781%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.709090909090909em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; points &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2010.166%2021.878999999999998%22%20width%3D%2210.166pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.215%208.879%20L%203.055%208.879%20C%202.756%208.879%202.6130002%208.866%202.6130002%208.58%20C%202.6130002%208.437%202.756%208.372%203.042%208.372%20C%203.302%208.372%203.822%208.411%203.822%208.203%20C%203.822%208.177%203.809%208.099%203.77%207.9690003%20L%202.0540001%201.066%20C%201.9760001%200.78000003%201.8460001%200.611%201.664%200.546%20C%201.5730001%200.52%201.339%200.507%200.936%200.507%20C%200.65000004%200.507%200.52%200.481%200.52%200.208%20C%200.52%200.065%200.598%200%200.767%200%20L%202.392%200.039%20L%203.224%200.026%20C%203.367%200.026%203.887%200%204.056%200%20C%204.264%200%204.368%200.104%204.368%200.312%20C%204.368%200.442%204.225%200.507%203.9520001%200.507%20C%203.4320002%200.507%203.1720002%200.559%203.1720002%200.676%20C%203.1720002%200.676%203.1850002%200.71500003%203.211%200.884%20L%203.9910002%204.056%20L%206.136%204.056%20C%206.981%204.056%207.787%204.316%208.541%204.823%20C%209.386001%205.382%209.802%206.071%209.802%206.8900003%20C%209.802%208.177%208.58%208.879%207.215%208.879%20Z%20M%206.8120003%208.372%20C%207.9430003%208.372%208.502%207.9820004%208.502%207.202%20C%208.502%206.474%208.1380005%205.499%207.761%205.1610003%20C%207.267%204.719%206.617%204.498%205.8110003%204.498%20L%204.0690002%204.498%20L%204.927%207.9300003%20C%205.031%208.372%205.031%208.372%205.577%208.372%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.9241818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, our point cloud. Since
our Eytzinger-layout-based search procedure requires &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.799999999999999%2021.878999999999998%22%20width%3D%227.799999999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCC2D6A7770FCF135D0D1A78A9F87C718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCC2D6A7770FCF135D0D1A78A9F87C718%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.981%201.781%20C%206.682%200.754%206.2530003%200.234%205.7200003%200.234%20C%205.551%200.234%205.46%200.36400002%205.46%200.611%20C%205.46%200.79300004%205.538%201.092%205.6940002%201.495%20C%206.214%202.9120002%206.474%203.848%206.474%204.329%20C%206.474%205.2390003%205.863%205.7460003%204.953%205.7460003%20C%204.186%205.7460003%203.523%205.408%202.99%204.719%20C%202.8860002%205.291%202.431%205.7460003%201.768%205.7460003%20C%201.04%205.7460003%200.754%205.07%200.572%204.485%20C%200.442%204.0690002%200.377%203.822%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.963%205.369%202.08%205.1870003%202.08%204.823%20C%202.08%204.6540003%202.015%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4430001%20-0.143%20C%201.69%20-0.143%201.872%20-0.013%201.963%200.24700001%20C%201.9890001%200.312%202.0670002%200.637%202.21%201.196%20L%202.483%202.3530002%20L%202.8730001%203.835%20C%203.016%204.1340003%203.237%204.433%203.51%204.745%20C%203.887%205.1610003%204.355%205.369%204.914%205.369%20C%205.343%205.369%205.551%205.083%205.551%204.524%20C%205.551%204.03%205.278%203.042%204.719%201.5600001%20C%204.6280003%201.326%204.589%201.131%204.589%200.962%20C%204.589%200.32500002%205.07%20-0.143%205.6940002%20-0.143%20C%206.2660003%20-0.143%206.721%200.18200001%207.046%200.832%20C%207.293%201.352%207.4230003%201.7030001%207.4230003%201.872%20C%207.4230003%201.9890001%207.3580003%202.0540001%207.215%202.0540001%20C%207.176%202.0540001%206.981%201.937%206.981%201.781%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.709090909090909em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; to be a power
of two, we compute &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2012.231699999999998%2021.878999999999998%22%20width%3D%2212.231699999999998pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCC2D6A7770FCF135D0D1A78A9F87C718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%287.799999999999999%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF9C7830800E71C75A67D819743D6D92F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCC2D6A7770FCF135D0D1A78A9F87C718%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.981%201.781%20C%206.682%200.754%206.2530003%200.234%205.7200003%200.234%20C%205.551%200.234%205.46%200.36400002%205.46%200.611%20C%205.46%200.79300004%205.538%201.092%205.6940002%201.495%20C%206.214%202.9120002%206.474%203.848%206.474%204.329%20C%206.474%205.2390003%205.863%205.7460003%204.953%205.7460003%20C%204.186%205.7460003%203.523%205.408%202.99%204.719%20C%202.8860002%205.291%202.431%205.7460003%201.768%205.7460003%20C%201.04%205.7460003%200.754%205.07%200.572%204.485%20C%200.442%204.0690002%200.377%203.822%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.963%205.369%202.08%205.1870003%202.08%204.823%20C%202.08%204.6540003%202.015%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4430001%20-0.143%20C%201.69%20-0.143%201.872%20-0.013%201.963%200.24700001%20C%201.9890001%200.312%202.0670002%200.637%202.21%201.196%20L%202.483%202.3530002%20L%202.8730001%203.835%20C%203.016%204.1340003%203.237%204.433%203.51%204.745%20C%203.887%205.1610003%204.355%205.369%204.914%205.369%20C%205.343%205.369%205.551%205.083%205.551%204.524%20C%205.551%204.03%205.278%203.042%204.719%201.5600001%20C%204.6280003%201.326%204.589%201.131%204.589%200.962%20C%204.589%200.32500002%205.07%20-0.143%205.6940002%20-0.143%20C%206.2660003%20-0.143%206.721%200.18200001%207.046%200.832%20C%207.293%201.352%207.4230003%201.7030001%207.4230003%201.872%20C%207.4230003%201.9890001%207.3580003%202.0540001%207.215%202.0540001%20C%207.176%202.0540001%206.981%201.937%206.981%201.781%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF9C7830800E71C75A67D819743D6D92F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.5844002%204.9959%20C%202.3569002%204.9959%202.2022002%204.9049%202.1203%204.7138004%20L%200.59150004%200.8736%20L%201.001%200.8736%20L%203.0212002%204.2133%20C%203.0667002%204.2952003%203.094%204.3862%203.094%204.4863%20C%203.094%204.7593%202.8574002%204.9959%202.5844002%204.9959%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.1119727272727271em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, which is the next power of two after
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.799999999999999%2021.878999999999998%22%20width%3D%227.799999999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCC2D6A7770FCF135D0D1A78A9F87C718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCC2D6A7770FCF135D0D1A78A9F87C718%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.981%201.781%20C%206.682%200.754%206.2530003%200.234%205.7200003%200.234%20C%205.551%200.234%205.46%200.36400002%205.46%200.611%20C%205.46%200.79300004%205.538%201.092%205.6940002%201.495%20C%206.214%202.9120002%206.474%203.848%206.474%204.329%20C%206.474%205.2390003%205.863%205.7460003%204.953%205.7460003%20C%204.186%205.7460003%203.523%205.408%202.99%204.719%20C%202.8860002%205.291%202.431%205.7460003%201.768%205.7460003%20C%201.04%205.7460003%200.754%205.07%200.572%204.485%20C%200.442%204.0690002%200.377%203.822%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.963%205.369%202.08%205.1870003%202.08%204.823%20C%202.08%204.6540003%202.015%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4430001%20-0.143%20C%201.69%20-0.143%201.872%20-0.013%201.963%200.24700001%20C%201.9890001%200.312%202.0670002%200.637%202.21%201.196%20L%202.483%202.3530002%20L%202.8730001%203.835%20C%203.016%204.1340003%203.237%204.433%203.51%204.745%20C%203.887%205.1610003%204.355%205.369%204.914%205.369%20C%205.343%205.369%205.551%205.083%205.551%204.524%20C%205.551%204.03%205.278%203.042%204.719%201.5600001%20C%204.6280003%201.326%204.589%201.131%204.589%200.962%20C%204.589%200.32500002%205.07%20-0.143%205.6940002%20-0.143%20C%206.2660003%20-0.143%206.721%200.18200001%207.046%200.832%20C%207.293%201.352%207.4230003%201.7030001%207.4230003%201.872%20C%207.4230003%201.9890001%207.3580003%202.0540001%207.215%202.0540001%20C%207.176%202.0540001%206.981%201.937%206.981%201.781%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.709090909090909em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, and then pad &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2010.166%2021.878999999999998%22%20width%3D%2210.166pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.215%208.879%20L%203.055%208.879%20C%202.756%208.879%202.6130002%208.866%202.6130002%208.58%20C%202.6130002%208.437%202.756%208.372%203.042%208.372%20C%203.302%208.372%203.822%208.411%203.822%208.203%20C%203.822%208.177%203.809%208.099%203.77%207.9690003%20L%202.0540001%201.066%20C%201.9760001%200.78000003%201.8460001%200.611%201.664%200.546%20C%201.5730001%200.52%201.339%200.507%200.936%200.507%20C%200.65000004%200.507%200.52%200.481%200.52%200.208%20C%200.52%200.065%200.598%200%200.767%200%20L%202.392%200.039%20L%203.224%200.026%20C%203.367%200.026%203.887%200%204.056%200%20C%204.264%200%204.368%200.104%204.368%200.312%20C%204.368%200.442%204.225%200.507%203.9520001%200.507%20C%203.4320002%200.507%203.1720002%200.559%203.1720002%200.676%20C%203.1720002%200.676%203.1850002%200.71500003%203.211%200.884%20L%203.9910002%204.056%20L%206.136%204.056%20C%206.981%204.056%207.787%204.316%208.541%204.823%20C%209.386001%205.382%209.802%206.071%209.802%206.8900003%20C%209.802%208.177%208.58%208.879%207.215%208.879%20Z%20M%206.8120003%208.372%20C%207.9430003%208.372%208.502%207.9820004%208.502%207.202%20C%208.502%206.474%208.1380005%205.499%207.761%205.1610003%20C%207.267%204.719%206.617%204.498%205.8110003%204.498%20L%204.0690002%204.498%20L%204.927%207.9300003%20C%205.031%208.372%205.031%208.372%205.577%208.372%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.9241818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; to length &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2012.231699999999998%2021.878999999999998%22%20width%3D%2212.231699999999998pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCC2D6A7770FCF135D0D1A78A9F87C718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%287.799999999999999%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF9C7830800E71C75A67D819743D6D92F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCC2D6A7770FCF135D0D1A78A9F87C718%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.981%201.781%20C%206.682%200.754%206.2530003%200.234%205.7200003%200.234%20C%205.551%200.234%205.46%200.36400002%205.46%200.611%20C%205.46%200.79300004%205.538%201.092%205.6940002%201.495%20C%206.214%202.9120002%206.474%203.848%206.474%204.329%20C%206.474%205.2390003%205.863%205.7460003%204.953%205.7460003%20C%204.186%205.7460003%203.523%205.408%202.99%204.719%20C%202.8860002%205.291%202.431%205.7460003%201.768%205.7460003%20C%201.04%205.7460003%200.754%205.07%200.572%204.485%20C%200.442%204.0690002%200.377%203.822%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.963%205.369%202.08%205.1870003%202.08%204.823%20C%202.08%204.6540003%202.015%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4430001%20-0.143%20C%201.69%20-0.143%201.872%20-0.013%201.963%200.24700001%20C%201.9890001%200.312%202.0670002%200.637%202.21%201.196%20L%202.483%202.3530002%20L%202.8730001%203.835%20C%203.016%204.1340003%203.237%204.433%203.51%204.745%20C%203.887%205.1610003%204.355%205.369%204.914%205.369%20C%205.343%205.369%205.551%205.083%205.551%204.524%20C%205.551%204.03%205.278%203.042%204.719%201.5600001%20C%204.6280003%201.326%204.589%201.131%204.589%200.962%20C%204.589%200.32500002%205.07%20-0.143%205.6940002%20-0.143%20C%206.2660003%20-0.143%206.721%200.18200001%207.046%200.832%20C%207.293%201.352%207.4230003%201.7030001%207.4230003%201.872%20C%207.4230003%201.9890001%207.3580003%202.0540001%207.215%202.0540001%20C%207.176%202.0540001%206.981%201.937%206.981%201.781%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF9C7830800E71C75A67D819743D6D92F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.5844002%204.9959%20C%202.3569002%204.9959%202.2022002%204.9049%202.1203%204.7138004%20L%200.59150004%200.8736%20L%201.001%200.8736%20L%203.0212002%204.2133%20C%203.0667002%204.2952003%203.094%204.3862%203.094%204.4863%20C%203.094%204.7593%202.8574002%204.9959%202.5844002%204.9959%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.1119727272727271em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; with points at
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2054.208699999999986%2021.878999999999998%22%20width%3D%2254.208699999999986pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g71010E02B37BE1C0875AD8D94171F929%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.057%2014.404%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g39AF4F7DB89C68BF62FB26912893AEDE%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2821.921899999999997%2014.404%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g39AF4F7DB89C68BF62FB26912893AEDE%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2838.7868%2014.404%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g39AF4F7DB89C68BF62FB26912893AEDE%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2849.15169999999999%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4D62189ABBC2948BAB13C269F5CB8E70%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g71010E02B37BE1C0875AD8D94171F929%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.1340003%20-3.224%20C%204.251%20-3.224%204.316%20-3.1590002%204.316%20-3.042%20C%204.316%20-3.003%204.29%20-2.951%204.251%20-2.8990002%20C%203.575%20-2.379%203.029%20-1.521%202.6260002%20-0.338%20C%202.275%200.689%202.093%201.7030001%202.093%202.704%20L%202.093%203.796%20C%202.093%204.797%202.275%205.8110003%202.6260002%206.8380003%20C%203.029%208.021%203.575%208.879%204.251%209.399%20C%204.29%209.438%204.316%209.49%204.316%209.542%20C%204.316%209.659%204.251%209.724%204.1340003%209.724%20C%204.1210003%209.724%204.0820003%209.711%204.043%209.685%20C%203.263%209.087%202.6130002%208.203%202.08%207.02%20C%201.5730001%205.889%201.3130001%204.823%201.3130001%203.796%20L%201.3130001%202.704%20C%201.3130001%201.677%201.5730001%200.611%202.08%20-0.52%20C%202.6130002%20-1.7030001%203.263%20-2.5870001%204.043%20-3.1850002%20C%204.0820003%20-3.211%204.1210003%20-3.224%204.1340003%20-3.224%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g39AF4F7DB89C68BF62FB26912893AEDE%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.6804004%20-0.091000006%20C%208.2355%20-0.091000006%208.7087%200.1092%209.0818%200.50960004%20C%209.454901%200.91%209.646001%201.4014001%209.646001%201.9656001%20C%209.646001%202.5207002%209.464001%203.003%209.1%203.4034002%20C%208.736%203.8038%208.2719%204.0131%207.7168%204.0131%20C%207.0889%204.0131%206.552%203.8129%206.097%203.4216%20C%205.7694%203.1395001%205.4873004%202.8392%205.2507%202.5389001%20C%204.9686003%202.8847%204.6592%203.1850002%204.3407%203.4489002%20C%203.8675%203.8220003%203.3124%204.0131%202.6754%204.0131%20C%202.1112%204.0131%201.6471001%203.8038%201.274%203.4034002%20C%200.90090007%203.003%200.7098%202.5207002%200.7098%201.9565%20C%200.7098%201.4014001%200.89180005%200.91%201.2558%200.50960004%20C%201.6198001%200.1092%202.0839%20-0.091000006%202.6390002%20-0.091000006%20C%203.2669%20-0.091000006%203.8038%200.1092%204.2588%200.5005%20C%204.5864%200.78260005%204.8685%201.0829%205.1051%201.3832%20C%205.3872004%201.0374%205.6966004%200.7371%206.0151005%200.47320002%20C%206.4883003%200.1001%207.0434003%20-0.091000006%207.6804004%20-0.091000006%20Z%20M%207.8351%200.47320002%20C%207.4347005%200.47320002%207.0525002%200.637%206.6976004%200.9646%20C%206.4064%201.2285%206.0424004%201.6289%205.5965004%202.1567001%20C%206.2153%203.1213002%206.9433002%203.6036003%207.7896004%203.6036003%20C%208.2264%203.6036003%208.590401%203.4398%208.8816%203.1122%20C%209.1728%202.7846%209.3184%202.4115002%209.3184%201.9656001%20C%209.3184%201.1466%208.6541%200.47320002%207.8351%200.47320002%20Z%20M%202.5207002%203.4489002%20C%202.9211001%203.4489002%203.3033001%203.2851002%203.6582003%202.9575002%20C%203.9494002%202.6936002%204.3134003%202.2932%204.7593%201.7654%20C%204.1405%200.8008%203.4125001%200.3185%202.5662%200.3185%20C%202.1294%200.3185%201.7654%200.47320002%201.4742%200.8008%20C%201.1830001%201.1284001%201.0374%201.5106001%201.0374%201.9565%20C%201.0374%202.7755%201.7017001%203.4489002%202.5207002%203.4489002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4D62189ABBC2948BAB13C269F5CB8E70%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.014%20-3.1850002%20C%201.794%20-2.5870001%202.444%20-1.7030001%202.977%20-0.52%20C%203.484%200.611%203.744%201.677%203.744%202.704%20L%203.744%203.796%20C%203.744%204.823%203.484%205.889%202.977%207.02%20C%202.444%208.203%201.794%209.087%201.014%209.685%20C%200.975%209.711%200.936%209.724%200.92300004%209.724%20C%200.806%209.724%200.741%209.659%200.741%209.542%20C%200.741%209.49%200.767%209.438%200.806%209.399%20C%201.482%208.879%202.028%208.021%202.431%206.8380003%20C%202.782%205.8110003%202.964%204.797%202.964%203.796%20L%202.964%202.704%20C%202.964%201.7030001%202.782%200.689%202.431%20-0.338%20C%202.028%20-1.521%201.482%20-2.379%200.806%20-2.8990002%20C%200.767%20-2.951%200.741%20-3.003%200.741%20-3.042%20C%200.741%20-3.1590002%200.806%20-3.224%200.92300004%20-3.224%20C%200.936%20-3.224%200.975%20-3.211%201.014%20-3.1850002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 4.928063636363635em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; to produce
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2014.597700000000001%2021.878999999999998%22%20width%3D%2214.597700000000001pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.166%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF9C7830800E71C75A67D819743D6D92F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.215%208.879%20L%203.055%208.879%20C%202.756%208.879%202.6130002%208.866%202.6130002%208.58%20C%202.6130002%208.437%202.756%208.372%203.042%208.372%20C%203.302%208.372%203.822%208.411%203.822%208.203%20C%203.822%208.177%203.809%208.099%203.77%207.9690003%20L%202.0540001%201.066%20C%201.9760001%200.78000003%201.8460001%200.611%201.664%200.546%20C%201.5730001%200.52%201.339%200.507%200.936%200.507%20C%200.65000004%200.507%200.52%200.481%200.52%200.208%20C%200.52%200.065%200.598%200%200.767%200%20L%202.392%200.039%20L%203.224%200.026%20C%203.367%200.026%203.887%200%204.056%200%20C%204.264%200%204.368%200.104%204.368%200.312%20C%204.368%200.442%204.225%200.507%203.9520001%200.507%20C%203.4320002%200.507%203.1720002%200.559%203.1720002%200.676%20C%203.1720002%200.676%203.1850002%200.71500003%203.211%200.884%20L%203.9910002%204.056%20L%206.136%204.056%20C%206.981%204.056%207.787%204.316%208.541%204.823%20C%209.386001%205.382%209.802%206.071%209.802%206.8900003%20C%209.802%208.177%208.58%208.879%207.215%208.879%20Z%20M%206.8120003%208.372%20C%207.9430003%208.372%208.502%207.9820004%208.502%207.202%20C%208.502%206.474%208.1380005%205.499%207.761%205.1610003%20C%207.267%204.719%206.617%204.498%205.8110003%204.498%20L%204.0690002%204.498%20L%204.927%207.9300003%20C%205.031%208.372%205.031%208.372%205.577%208.372%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF9C7830800E71C75A67D819743D6D92F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.5844002%204.9959%20C%202.3569002%204.9959%202.2022002%204.9049%202.1203%204.7138004%20L%200.59150004%200.8736%20L%201.001%200.8736%20L%203.0212002%204.2133%20C%203.0667002%204.2952003%203.094%204.3862%203.094%204.4863%20C%203.094%204.7593%202.8574002%204.9959%202.5844002%204.9959%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.3270636363636366em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Next, we recursively partition the tree, maintaining a candidate
affordance set &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.435%2021.878999999999998%22%20width%3D%226.435pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9D1F38ABCB2153B23C9405065FBCBDCC%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9D1F38ABCB2153B23C9405065FBCBDCC%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.106%201.196%20L%201.885%201.1700001%20C%202.509%201.781%202.99%202.223%203.315%202.522%20L%204.563%203.6790001%20C%204.862%203.9520001%205.1740003%204.29%205.473%204.6670003%20C%205.876%205.1610003%206.071%205.46%206.071%205.564%20C%206.071%205.681%206.006%205.7460003%205.876%205.7460003%20C%205.7850003%205.7460003%205.7070003%205.6940002%205.642%205.577%20C%205.317%205.044%205.018%204.784%204.732%204.784%20C%204.446%204.784%204.238%205.018%204.1210003%205.1740003%20C%203.809%205.551%203.497%205.7460003%203.198%205.7460003%20C%202.8600001%205.7460003%202.509%205.59%202.145%205.2520003%20C%201.781%204.914%201.599%204.576%201.599%204.238%20C%201.599%204.1080003%201.664%204.043%201.807%204.043%20C%201.898%204.043%201.9760001%204.1080003%202.028%204.225%20C%202.171%204.602%202.522%204.784%203.055%204.784%20C%203.237%204.784%203.497%204.719%203.848%204.602%20C%204.16%204.485%204.459%204.42%204.732%204.407%20C%204.004%203.6920002%203.4450002%203.1720002%203.042%202.821%20L%201.885%201.742%20C%201.69%201.547%201.4430001%201.2870001%201.1700001%200.962%20C%200.767%200.455%200.559%200.156%200.559%200.039%20C%200.559%20-0.078%200.624%20-0.143%200.767%20-0.143%20C%200.845%20-0.143%200.92300004%20-0.078%201.014%200.052%20C%201.339%200.559%201.69%200.819%202.0540001%200.819%20C%202.262%200.819%202.496%200.663%202.756%200.338%20C%203.016%200.013%203.315%20-0.143%203.614%20-0.143%20C%204.056%20-0.143%204.498%200.091000006%204.966%200.546%20C%205.434%201.001%205.668%201.4430001%205.668%201.872%20C%205.668%201.9890001%205.603%202.0540001%205.46%202.0540001%20C%205.369%202.0540001%205.291%201.9890001%205.2260003%201.8590001%20C%205.031%201.3000001%204.472%200.819%203.744%200.819%20C%203.4320002%200.819%202.418%201.196%202.106%201.196%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.585em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, initialized as an empty set; and a candidate volume
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%205.954%2021.878999999999998%22%20width%3D%225.954pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3BD2F2FDE487A05197DD8782434E5CF8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3BD2F2FDE487A05197DD8782434E5CF8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.264%204.225%20C%204.264%203.9%204.433%203.7310002%204.784%203.7310002%20C%205.2520003%203.7310002%205.551%204.1340003%205.551%204.602%20C%205.551%205.33%204.784%205.7460003%204.004%205.7460003%20C%203.107%205.7460003%202.288%205.356%201.5860001%204.589%20C%200.884%203.822%200.533%202.977%200.533%202.0670002%20C%200.533%200.79300004%201.378%20-0.143%202.652%20-0.143%20C%203.341%20-0.143%203.9520001%200.026%204.485%200.351%20C%204.927%200.624%205.2520003%200.897%205.46%201.1700001%20C%205.551%201.2870001%205.59%201.378%205.59%201.417%20C%205.59%201.5600001%205.525%201.638%205.382%201.638%20C%205.317%201.638%205.2520003%201.5860001%205.1740003%201.482%20C%204.745%200.91%204.212%200.546%203.601%200.39000002%20C%203.198%200.286%202.8990002%200.234%202.678%200.234%20C%201.937%200.234%201.5730001%200.689%201.5730001%201.5860001%20C%201.5730001%202.392%201.95%203.562%202.262%204.1210003%20C%202.5740001%204.6930003%203.237%205.369%204.004%205.369%20C%204.498%205.369%204.836%205.2260003%205.018%204.953%20C%204.6150002%204.914%204.264%204.6540003%204.264%204.225%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5412727272727272em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, initialized to the axis-aligned bounding box containing all of
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2015.291899999999998%2021.878999999999998%22%20width%3D%2215.291899999999998pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g5647EFCB342E6805BA924448C7CC8F84%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.386%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g691260D45B674C5129C354630D9E7DE4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g5647EFCB342E6805BA924448C7CC8F84%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.352%207.67%20L%201.352%201.235%20C%201.352%200.58500004%201.2870001%200.559%200.611%200.559%20C%200.338%200.559%200.208%200.468%200.208%200.286%20C%200.208%200.052%200.403%200%200.702%200%20L%204.212%200%20C%204.537%200%204.6930003%200.091000006%204.6930003%200.286%20C%204.6930003%200.468%204.55%200.559%204.277%200.559%20C%203.601%200.559%203.549%200.58500004%203.549%201.235%20L%203.549%204.03%20L%203.926%204.03%20L%205.85%201.079%20C%206.175%200.559%206.3700004%200.26%206.422%200.18200001%20C%206.5%200.065%206.656%200%206.8900003%200%20L%208.658%200%20C%208.983%200%209.139%200.091000006%209.139%200.286%20C%209.139%200.42900002%209.061%200.52%208.905%200.546%20C%208.58%200.611%208.125%201.066%207.527%201.898%20C%206.942%202.704%206.422%203.471%205.967%204.186%20C%207.4490004%204.472%208.190001%205.2260003%208.190001%206.448%20C%208.190001%207.3190002%207.8%207.9690003%207.02%208.372%20C%206.3440003%208.723001%205.577%208.905%204.732%208.905%20L%200.702%208.905%20C%200.377%208.905%200.208%208.814%200.208%208.619%20C%200.208%208.437%200.338%208.346%200.611%208.346%20C%201.2870001%208.346%201.352%208.32%201.352%207.67%20Z%20M%206.955%207.761%20C%207.4100003%207.488%207.631%207.046%207.631%206.448%20C%207.631%205.551%207.111%205.005%206.084%204.784%20C%206.3050003%205.1480002%206.422%205.6940002%206.422%206.435%20C%206.422%207.176%206.2790003%207.748%206.006%208.177%20C%206.3310003%208.086%206.656%207.9560003%206.955%207.761%20Z%20M%205.876%206.435%20C%205.876%205.629%205.7330003%205.122%205.447%204.914%20C%205.1610003%204.7060003%204.524%204.589%203.549%204.589%20L%203.549%207.709%20C%203.549%208.190001%203.7310002%208.346%204.29%208.346%20C%205.525%208.346%205.876%207.735%205.876%206.435%20Z%20M%205.369%204.1080003%20C%206.448%202.392%207.293%201.209%207.9300003%200.559%20L%206.8250003%200.559%20L%204.576%204.043%20C%204.6410003%204.056%204.6930003%204.056%204.732%204.056%20C%204.914%204.056%205.122%204.0690002%205.369%204.1080003%20Z%20M%201.82%208.346%20L%203.1200001%208.346%20C%203.042%208.203%203.003%208.008%203.003%207.748%20L%203.003%201.209%20C%203.003%200.936%203.029%200.71500003%203.081%200.559%20L%201.82%200.559%20C%201.872%200.71500003%201.898%200.936%201.898%201.209%20L%201.898%207.696%20C%201.898%207.9690003%201.872%208.190001%201.82%208.346%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g691260D45B674C5129C354630D9E7DE4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.2123%203.2123%20C%203.8220003%203.4580002%204.4044003%203.9949002%204.4044003%204.7684%20C%204.4044003%205.1779003%204.1860003%205.5055003%203.7583%205.7421002%20C%203.4034002%205.9423003%203.003%206.0424004%202.5571%206.0424004%20C%202.1112%206.0424004%201.7199%205.9514003%201.3832%205.7603%20C%200.97370005%205.5328%200.7644%205.2143%200.7644%204.8048%20C%200.7644%204.459%200.9373%204.2861004%201.274%204.2861004%20C%201.5561%204.2861004%201.7654%204.5045004%201.7654%204.7866%20C%201.7654%205.0687003%201.6198001%205.2325%201.3377%205.2780004%20C%201.6016%205.5601%201.9929001%205.7057004%202.5298002%205.7057004%20C%203.1213002%205.7057004%203.4580002%205.3508%203.4580002%204.7684%20C%203.4580002%204.3407%203.3397002%203.9949002%203.1122%203.7219002%20C%202.8574002%203.4216%202.6754%203.3761%202.1476002%203.3397002%20C%201.9019%203.3215%201.7381%203.3488002%201.7381%203.1668%20C%201.7381%203.0576%201.8291001%203.003%202.002%203.003%20L%202.4843001%203.003%20C%203.2669%203.003%203.6491%202.4115002%203.6491%201.5925001%20C%203.6491%200.7917%203.2851002%200.18200001%202.5207002%200.18200001%20C%201.8564001%200.18200001%201.3741001%200.36400002%201.0738001%200.7371%20C%201.3923%200.7735%201.5561%200.95550007%201.5561%201.274%20C%201.5561%201.5743%201.3286%201.8018001%201.0283%201.8018001%20C%200.67340004%201.8018001%200.49140003%201.6198001%200.49140003%201.2467%20C%200.49140003%200.78260005%200.72800004%200.4095%201.1921%200.1456%20C%201.5834%20-0.0728%202.0293%20-0.18200001%202.5389001%20-0.18200001%20C%203.094%20-0.18200001%203.5763001%20-0.0273%203.9949002%200.28210002%20C%204.4499%200.61880004%204.6774%201.0556%204.6774%201.5925001%20C%204.6774%202.4388%203.9403002%203.0212002%203.2123%203.2123%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.3901727272727271em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;. We partition &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2014.597700000000001%2021.878999999999998%22%20width%3D%2214.597700000000001pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.166%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF9C7830800E71C75A67D819743D6D92F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.215%208.879%20L%203.055%208.879%20C%202.756%208.879%202.6130002%208.866%202.6130002%208.58%20C%202.6130002%208.437%202.756%208.372%203.042%208.372%20C%203.302%208.372%203.822%208.411%203.822%208.203%20C%203.822%208.177%203.809%208.099%203.77%207.9690003%20L%202.0540001%201.066%20C%201.9760001%200.78000003%201.8460001%200.611%201.664%200.546%20C%201.5730001%200.52%201.339%200.507%200.936%200.507%20C%200.65000004%200.507%200.52%200.481%200.52%200.208%20C%200.52%200.065%200.598%200%200.767%200%20L%202.392%200.039%20L%203.224%200.026%20C%203.367%200.026%203.887%200%204.056%200%20C%204.264%200%204.368%200.104%204.368%200.312%20C%204.368%200.442%204.225%200.507%203.9520001%200.507%20C%203.4320002%200.507%203.1720002%200.559%203.1720002%200.676%20C%203.1720002%200.676%203.1850002%200.71500003%203.211%200.884%20L%203.9910002%204.056%20L%206.136%204.056%20C%206.981%204.056%207.787%204.316%208.541%204.823%20C%209.386001%205.382%209.802%206.071%209.802%206.8900003%20C%209.802%208.177%208.58%208.879%207.215%208.879%20Z%20M%206.8120003%208.372%20C%207.9430003%208.372%208.502%207.9820004%208.502%207.202%20C%208.502%206.474%208.1380005%205.499%207.761%205.1610003%20C%207.267%204.719%206.617%204.498%205.8110003%204.498%20L%204.0690002%204.498%20L%204.927%207.9300003%20C%205.031%208.372%205.031%208.372%205.577%208.372%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF9C7830800E71C75A67D819743D6D92F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.5844002%204.9959%20C%202.3569002%204.9959%202.2022002%204.9049%202.1203%204.7138004%20L%200.59150004%200.8736%20L%201.001%200.8736%20L%203.0212002%204.2133%20C%203.0667002%204.2952003%203.094%204.3862%203.094%204.4863%20C%203.094%204.7593%202.8574002%204.9959%202.5844002%204.9959%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.3270636363636366em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; by the following steps:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Compute the median plane for the current cell.&lt;&#x2F;li&gt;
&lt;li&gt;Split the cell by the median plane into two smaller cells, &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2020.6349%2021.878999999999998%22%20width%3D%2220.6349pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3BD2F2FDE487A05197DD8782434E5CF8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.6290000000000004%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4C626062D0179BB92EF2C6657A338664%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.179%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7A5F85FE66C6FD3E604C68F5A7949524%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.3569%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3333970CC28D4FC94DE5E983C20B1442%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3BD2F2FDE487A05197DD8782434E5CF8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.264%204.225%20C%204.264%203.9%204.433%203.7310002%204.784%203.7310002%20C%205.2520003%203.7310002%205.551%204.1340003%205.551%204.602%20C%205.551%205.33%204.784%205.7460003%204.004%205.7460003%20C%203.107%205.7460003%202.288%205.356%201.5860001%204.589%20C%200.884%203.822%200.533%202.977%200.533%202.0670002%20C%200.533%200.79300004%201.378%20-0.143%202.652%20-0.143%20C%203.341%20-0.143%203.9520001%200.026%204.485%200.351%20C%204.927%200.624%205.2520003%200.897%205.46%201.1700001%20C%205.551%201.2870001%205.59%201.378%205.59%201.417%20C%205.59%201.5600001%205.525%201.638%205.382%201.638%20C%205.317%201.638%205.2520003%201.5860001%205.1740003%201.482%20C%204.745%200.91%204.212%200.546%203.601%200.39000002%20C%203.198%200.286%202.8990002%200.234%202.678%200.234%20C%201.937%200.234%201.5730001%200.689%201.5730001%201.5860001%20C%201.5730001%202.392%201.95%203.562%202.262%204.1210003%20C%202.5740001%204.6930003%203.237%205.369%204.004%205.369%20C%204.498%205.369%204.836%205.2260003%205.018%204.953%20C%204.6150002%204.914%204.264%204.6540003%204.264%204.225%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4C626062D0179BB92EF2C6657A338664%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.6026%20-1.1102%20L%202.6026%201.1466%20C%202.6026%201.6653%202.2841%202.0475001%201.6562%202.275%20C%202.2841%202.5025%202.6026%202.8847%202.6026%203.4034002%20L%202.6026%205.6602%20C%202.6026%206.188%203.1668%206.5338%203.7219002%206.5338%20C%203.8220003%206.5338%203.8675%206.5793004%203.8675%206.6794004%20C%203.8675%206.7795005%203.8220003%206.8250003%203.7219002%206.8250003%20C%203.3033001%206.8250003%202.9211001%206.734%202.5844002%206.5611005%20C%202.1567001%206.3427005%201.9474001%206.0424004%201.9474001%205.6602%20L%201.9474001%203.4034002%20C%201.9474001%202.8301%201.4014001%202.4206002%200.8281%202.4206002%20C%200.72800004%202.4206002%200.6825%202.3751001%200.6825%202.275%20C%200.6825%202.1749%200.72800004%202.1294%200.8281%202.1294%20C%201.4105%202.1294%201.9474001%201.7108%201.9474001%201.1466%20L%201.9474001%20-1.1102%20C%201.9474001%20-1.4924%202.1567001%20-1.7927%202.5844002%20-2.0111%20C%202.9211001%20-2.184%203.3033001%20-2.275%203.7219002%20-2.275%20C%203.8220003%20-2.275%203.8675%20-2.2295%203.8675%20-2.1294%20C%203.8675%20-2.0293%203.8220003%20-1.9838%203.7219002%20-1.9838%20C%203.1668%20-1.9838%202.6026%20-1.638%202.6026%20-1.1102%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7A5F85FE66C6FD3E604C68F5A7949524%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.7573001%206.0424004%20C%202.3660002%205.6602%201.7836001%205.4691%200.9919%205.4691%20L%200.9919%205.0687003%20C%201.5288%205.0687003%201.9565%205.1506004%202.2841%205.3053%20L%202.2841%200.7735%20C%202.2841%200.6552%202.275%200.5824%202.2477%200.546%20C%202.2022002%200.44590002%201.9292%200.39130002%201.4287001%200.39130002%20L%201.0556%200.39130002%20L%201.0556%200%20L%202.6754%200.0364%20L%204.3043003%200%20L%204.3043003%200.39130002%20L%203.9312003%200.39130002%20C%203.4307%200.39130002%203.1577%200.44590002%203.1031%200.546%20C%203.0849001%200.5824%203.0758002%200.6552%203.0758002%200.7735%20L%203.0758002%205.7512%20C%203.0758002%205.9969%203.0394%206.0424004%202.7573001%206.0424004%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3333970CC28D4FC94DE5E983C20B1442%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.6026%203.4034002%20L%202.6026%205.6602%20C%202.6026%206.0424004%202.3933%206.3427005%201.9656001%206.5611005%20C%201.6289%206.734%201.2467%206.8250003%200.8281%206.8250003%20C%200.72800004%206.8250003%200.6825%206.7795005%200.6825%206.6794004%20C%200.6825%206.5793004%200.72800004%206.5338%200.8281%206.5338%20C%201.3832%206.5338%201.9474001%206.188%201.9474001%205.6602%20L%201.9474001%203.4034002%20C%201.9474001%202.8847%202.2659001%202.5025%202.8938%202.275%20C%202.2659001%202.0475001%201.9474001%201.6653%201.9474001%201.1466%20L%201.9474001%20-1.1102%20C%201.9474001%20-1.638%201.3832%20-1.9838%200.8281%20-1.9838%20C%200.72800004%20-1.9838%200.6825%20-2.0293%200.6825%20-2.1294%20C%200.6825%20-2.2295%200.72800004%20-2.275%200.8281%20-2.275%20C%201.2467%20-2.275%201.6289%20-2.184%201.9656001%20-2.0111%20C%202.3933%20-1.7927%202.6026%20-1.4924%202.6026%20-1.1102%20L%202.6026%201.1466%20C%202.6026%201.7108%203.1395001%202.1294%203.7219002%202.1294%20C%203.8220003%202.1294%203.8675%202.1749%203.8675%202.275%20C%203.8675%202.3751001%203.8220003%202.4206002%203.7219002%202.4206002%20C%203.1395001%202.4206002%202.6026%202.8392%202.6026%203.4034002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.8759em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;
and &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2011.5349%2021.878999999999998%22%20width%3D%2211.5349pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3BD2F2FDE487A05197DD8782434E5CF8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.6290000000000004%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g86111C2D5C8682C53BDA9AD6152C9992%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3BD2F2FDE487A05197DD8782434E5CF8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.264%204.225%20C%204.264%203.9%204.433%203.7310002%204.784%203.7310002%20C%205.2520003%203.7310002%205.551%204.1340003%205.551%204.602%20C%205.551%205.33%204.784%205.7460003%204.004%205.7460003%20C%203.107%205.7460003%202.288%205.356%201.5860001%204.589%20C%200.884%203.822%200.533%202.977%200.533%202.0670002%20C%200.533%200.79300004%201.378%20-0.143%202.652%20-0.143%20C%203.341%20-0.143%203.9520001%200.026%204.485%200.351%20C%204.927%200.624%205.2520003%200.897%205.46%201.1700001%20C%205.551%201.2870001%205.59%201.378%205.59%201.417%20C%205.59%201.5600001%205.525%201.638%205.382%201.638%20C%205.317%201.638%205.2520003%201.5860001%205.1740003%201.482%20C%204.745%200.91%204.212%200.546%203.601%200.39000002%20C%203.198%200.286%202.8990002%200.234%202.678%200.234%20C%201.937%200.234%201.5730001%200.689%201.5730001%201.5860001%20C%201.5730001%202.392%201.95%203.562%202.262%204.1210003%20C%202.5740001%204.6930003%203.237%205.369%204.004%205.369%20C%204.498%205.369%204.836%205.2260003%205.018%204.953%20C%204.6150002%204.914%204.264%204.6540003%204.264%204.225%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g86111C2D5C8682C53BDA9AD6152C9992%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0829%203.8584%20C%201.3741001%203.8584%201.5925001%204.0768003%201.5925001%204.368%20C%201.5925001%204.6956%201.4196%204.8685%201.0829%204.8776%20C%201.2831%205.3053%201.7381%205.6511%202.3296%205.6511%20C%203.1304002%205.6511%203.6582003%205.0505004%203.6582003%204.2497%20C%203.6582003%203.8129%203.5035002%203.3943002%203.1850002%202.9848%20C%203.0303001%202.7755%202.9120002%202.6299002%202.8301%202.548%20L%200.67340004%200.4095%20C%200.5551%200.3003%200.5733%200.273%200.5733%200%20L%204.3225%200%20L%204.6046%201.7108%20L%204.2224%201.7108%20C%204.1587%201.2285%204.0859003%200.94640005%204.004%200.8827%20C%203.9585001%200.8554%203.6764002%200.83720005%203.1395001%200.83720005%20L%201.5925001%200.83720005%20C%202.2022002%201.3741001%202.7664%201.8564001%203.3033001%202.2841%20C%203.7128003%202.6026%204.004%202.8847%204.1860003%203.1304002%20C%204.459%203.4853%204.5955%203.8584%204.5955%204.2497%20C%204.5955%204.8139%204.3771%205.2598004%203.9312003%205.5874004%20C%203.5399%205.8877%203.0485%206.0424004%202.4661002%206.0424004%20C%201.9656001%206.0424004%201.5379001%205.8968%201.1648%205.6056004%20C%200.7735%205.2871003%200.5733%204.8867%200.5733%204.3953004%20C%200.5733%204.0859003%200.8008%203.8584%201.0829%203.8584%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.0486272727272727em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;. Split the points in the cell into two subsets: those
below the median plane and those above the median plane; call them
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2012.9519%2021.878999999999998%22%20width%3D%2212.9519pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%287.046000000000001%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7A5F85FE66C6FD3E604C68F5A7949524%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.215%208.879%20L%203.055%208.879%20C%202.756%208.879%202.6130002%208.866%202.6130002%208.58%20C%202.6130002%208.437%202.756%208.372%203.042%208.372%20C%203.302%208.372%203.822%208.411%203.822%208.203%20C%203.822%208.177%203.809%208.099%203.77%207.9690003%20L%202.0540001%201.066%20C%201.9760001%200.78000003%201.8460001%200.611%201.664%200.546%20C%201.5730001%200.52%201.339%200.507%200.936%200.507%20C%200.65000004%200.507%200.52%200.481%200.52%200.208%20C%200.52%200.065%200.598%200%200.767%200%20L%202.392%200.039%20L%203.224%200.026%20C%203.367%200.026%203.887%200%204.056%200%20C%204.264%200%204.368%200.104%204.368%200.312%20C%204.368%200.442%204.225%200.507%203.9520001%200.507%20C%203.4320002%200.507%203.1720002%200.559%203.1720002%200.676%20C%203.1720002%200.676%203.1850002%200.71500003%203.211%200.884%20L%203.9910002%204.056%20L%206.136%204.056%20C%206.981%204.056%207.787%204.316%208.541%204.823%20C%209.386001%205.382%209.802%206.071%209.802%206.8900003%20C%209.802%208.177%208.58%208.879%207.215%208.879%20Z%20M%206.8120003%208.372%20C%207.9430003%208.372%208.502%207.9820004%208.502%207.202%20C%208.502%206.474%208.1380005%205.499%207.761%205.1610003%20C%207.267%204.719%206.617%204.498%205.8110003%204.498%20L%204.0690002%204.498%20L%204.927%207.9300003%20C%205.031%208.372%205.031%208.372%205.577%208.372%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7A5F85FE66C6FD3E604C68F5A7949524%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.7573001%206.0424004%20C%202.3660002%205.6602%201.7836001%205.4691%200.9919%205.4691%20L%200.9919%205.0687003%20C%201.5288%205.0687003%201.9565%205.1506004%202.2841%205.3053%20L%202.2841%200.7735%20C%202.2841%200.6552%202.275%200.5824%202.2477%200.546%20C%202.2022002%200.44590002%201.9292%200.39130002%201.4287001%200.39130002%20L%201.0556%200.39130002%20L%201.0556%200%20L%202.6754%200.0364%20L%204.3043003%200%20L%204.3043003%200.39130002%20L%203.9312003%200.39130002%20C%203.4307%200.39130002%203.1577%200.44590002%203.1031%200.546%20C%203.0849001%200.5824%203.0758002%200.6552%203.0758002%200.7735%20L%203.0758002%205.7512%20C%203.0758002%205.9969%203.0394%206.0424004%202.7573001%206.0424004%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.1774454545454545em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; and &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2012.9519%2021.878999999999998%22%20width%3D%2212.9519pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%287.046000000000001%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g86111C2D5C8682C53BDA9AD6152C9992%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.215%208.879%20L%203.055%208.879%20C%202.756%208.879%202.6130002%208.866%202.6130002%208.58%20C%202.6130002%208.437%202.756%208.372%203.042%208.372%20C%203.302%208.372%203.822%208.411%203.822%208.203%20C%203.822%208.177%203.809%208.099%203.77%207.9690003%20L%202.0540001%201.066%20C%201.9760001%200.78000003%201.8460001%200.611%201.664%200.546%20C%201.5730001%200.52%201.339%200.507%200.936%200.507%20C%200.65000004%200.507%200.52%200.481%200.52%200.208%20C%200.52%200.065%200.598%200%200.767%200%20L%202.392%200.039%20L%203.224%200.026%20C%203.367%200.026%203.887%200%204.056%200%20C%204.264%200%204.368%200.104%204.368%200.312%20C%204.368%200.442%204.225%200.507%203.9520001%200.507%20C%203.4320002%200.507%203.1720002%200.559%203.1720002%200.676%20C%203.1720002%200.676%203.1850002%200.71500003%203.211%200.884%20L%203.9910002%204.056%20L%206.136%204.056%20C%206.981%204.056%207.787%204.316%208.541%204.823%20C%209.386001%205.382%209.802%206.071%209.802%206.8900003%20C%209.802%208.177%208.58%208.879%207.215%208.879%20Z%20M%206.8120003%208.372%20C%207.9430003%208.372%208.502%207.9820004%208.502%207.202%20C%208.502%206.474%208.1380005%205.499%207.761%205.1610003%20C%207.267%204.719%206.617%204.498%205.8110003%204.498%20L%204.0690002%204.498%20L%204.927%207.9300003%20C%205.031%208.372%205.031%208.372%205.577%208.372%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g86111C2D5C8682C53BDA9AD6152C9992%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0829%203.8584%20C%201.3741001%203.8584%201.5925001%204.0768003%201.5925001%204.368%20C%201.5925001%204.6956%201.4196%204.8685%201.0829%204.8776%20C%201.2831%205.3053%201.7381%205.6511%202.3296%205.6511%20C%203.1304002%205.6511%203.6582003%205.0505004%203.6582003%204.2497%20C%203.6582003%203.8129%203.5035002%203.3943002%203.1850002%202.9848%20C%203.0303001%202.7755%202.9120002%202.6299002%202.8301%202.548%20L%200.67340004%200.4095%20C%200.5551%200.3003%200.5733%200.273%200.5733%200%20L%204.3225%200%20L%204.6046%201.7108%20L%204.2224%201.7108%20C%204.1587%201.2285%204.0859003%200.94640005%204.004%200.8827%20C%203.9585001%200.8554%203.6764002%200.83720005%203.1395001%200.83720005%20L%201.5925001%200.83720005%20C%202.2022002%201.3741001%202.7664%201.8564001%203.3033001%202.2841%20C%203.7128003%202.6026%204.004%202.8847%204.1860003%203.1304002%20C%204.459%203.4853%204.5955%203.8584%204.5955%204.2497%20C%204.5955%204.8139%204.3771%205.2598004%203.9312003%205.5874004%20C%203.5399%205.8877%203.0485%206.0424004%202.4661002%206.0424004%20C%201.9656001%206.0424004%201.5379001%205.8968%201.1648%205.6056004%20C%200.7735%205.2871003%200.5733%204.8867%200.5733%204.3953004%20C%200.5733%204.0859003%200.8008%203.8584%201.0829%203.8584%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.1774454545454545em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Construct new affordance sets &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2011.950899999999999%2021.878999999999998%22%20width%3D%2211.950899999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9D1F38ABCB2153B23C9405065FBCBDCC%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.045%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7A5F85FE66C6FD3E604C68F5A7949524%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9D1F38ABCB2153B23C9405065FBCBDCC%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.106%201.196%20L%201.885%201.1700001%20C%202.509%201.781%202.99%202.223%203.315%202.522%20L%204.563%203.6790001%20C%204.862%203.9520001%205.1740003%204.29%205.473%204.6670003%20C%205.876%205.1610003%206.071%205.46%206.071%205.564%20C%206.071%205.681%206.006%205.7460003%205.876%205.7460003%20C%205.7850003%205.7460003%205.7070003%205.6940002%205.642%205.577%20C%205.317%205.044%205.018%204.784%204.732%204.784%20C%204.446%204.784%204.238%205.018%204.1210003%205.1740003%20C%203.809%205.551%203.497%205.7460003%203.198%205.7460003%20C%202.8600001%205.7460003%202.509%205.59%202.145%205.2520003%20C%201.781%204.914%201.599%204.576%201.599%204.238%20C%201.599%204.1080003%201.664%204.043%201.807%204.043%20C%201.898%204.043%201.9760001%204.1080003%202.028%204.225%20C%202.171%204.602%202.522%204.784%203.055%204.784%20C%203.237%204.784%203.497%204.719%203.848%204.602%20C%204.16%204.485%204.459%204.42%204.732%204.407%20C%204.004%203.6920002%203.4450002%203.1720002%203.042%202.821%20L%201.885%201.742%20C%201.69%201.547%201.4430001%201.2870001%201.1700001%200.962%20C%200.767%200.455%200.559%200.156%200.559%200.039%20C%200.559%20-0.078%200.624%20-0.143%200.767%20-0.143%20C%200.845%20-0.143%200.92300004%20-0.078%201.014%200.052%20C%201.339%200.559%201.69%200.819%202.0540001%200.819%20C%202.262%200.819%202.496%200.663%202.756%200.338%20C%203.016%200.013%203.315%20-0.143%203.614%20-0.143%20C%204.056%20-0.143%204.498%200.091000006%204.966%200.546%20C%205.434%201.001%205.668%201.4430001%205.668%201.872%20C%205.668%201.9890001%205.603%202.0540001%205.46%202.0540001%20C%205.369%202.0540001%205.291%201.9890001%205.2260003%201.8590001%20C%205.031%201.3000001%204.472%200.819%203.744%200.819%20C%203.4320002%200.819%202.418%201.196%202.106%201.196%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7A5F85FE66C6FD3E604C68F5A7949524%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.7573001%206.0424004%20C%202.3660002%205.6602%201.7836001%205.4691%200.9919%205.4691%20L%200.9919%205.0687003%20C%201.5288%205.0687003%201.9565%205.1506004%202.2841%205.3053%20L%202.2841%200.7735%20C%202.2841%200.6552%202.275%200.5824%202.2477%200.546%20C%202.2022002%200.44590002%201.9292%200.39130002%201.4287001%200.39130002%20L%201.0556%200.39130002%20L%201.0556%200%20L%202.6754%200.0364%20L%204.3043003%200%20L%204.3043003%200.39130002%20L%203.9312003%200.39130002%20C%203.4307%200.39130002%203.1577%200.44590002%203.1031%200.546%20C%203.0849001%200.5824%203.0758002%200.6552%203.0758002%200.7735%20L%203.0758002%205.7512%20C%203.0758002%205.9969%203.0394%206.0424004%202.7573001%206.0424004%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.0864454545454545em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; and &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2011.950899999999999%2021.878999999999998%22%20width%3D%2211.950899999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9D1F38ABCB2153B23C9405065FBCBDCC%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.045%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g86111C2D5C8682C53BDA9AD6152C9992%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9D1F38ABCB2153B23C9405065FBCBDCC%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.106%201.196%20L%201.885%201.1700001%20C%202.509%201.781%202.99%202.223%203.315%202.522%20L%204.563%203.6790001%20C%204.862%203.9520001%205.1740003%204.29%205.473%204.6670003%20C%205.876%205.1610003%206.071%205.46%206.071%205.564%20C%206.071%205.681%206.006%205.7460003%205.876%205.7460003%20C%205.7850003%205.7460003%205.7070003%205.6940002%205.642%205.577%20C%205.317%205.044%205.018%204.784%204.732%204.784%20C%204.446%204.784%204.238%205.018%204.1210003%205.1740003%20C%203.809%205.551%203.497%205.7460003%203.198%205.7460003%20C%202.8600001%205.7460003%202.509%205.59%202.145%205.2520003%20C%201.781%204.914%201.599%204.576%201.599%204.238%20C%201.599%204.1080003%201.664%204.043%201.807%204.043%20C%201.898%204.043%201.9760001%204.1080003%202.028%204.225%20C%202.171%204.602%202.522%204.784%203.055%204.784%20C%203.237%204.784%203.497%204.719%203.848%204.602%20C%204.16%204.485%204.459%204.42%204.732%204.407%20C%204.004%203.6920002%203.4450002%203.1720002%203.042%202.821%20L%201.885%201.742%20C%201.69%201.547%201.4430001%201.2870001%201.1700001%200.962%20C%200.767%200.455%200.559%200.156%200.559%200.039%20C%200.559%20-0.078%200.624%20-0.143%200.767%20-0.143%20C%200.845%20-0.143%200.92300004%20-0.078%201.014%200.052%20C%201.339%200.559%201.69%200.819%202.0540001%200.819%20C%202.262%200.819%202.496%200.663%202.756%200.338%20C%203.016%200.013%203.315%20-0.143%203.614%20-0.143%20C%204.056%20-0.143%204.498%200.091000006%204.966%200.546%20C%205.434%201.001%205.668%201.4430001%205.668%201.872%20C%205.668%201.9890001%205.603%202.0540001%205.46%202.0540001%20C%205.369%202.0540001%205.291%201.9890001%205.2260003%201.8590001%20C%205.031%201.3000001%204.472%200.819%203.744%200.819%20C%203.4320002%200.819%202.418%201.196%202.106%201.196%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g86111C2D5C8682C53BDA9AD6152C9992%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0829%203.8584%20C%201.3741001%203.8584%201.5925001%204.0768003%201.5925001%204.368%20C%201.5925001%204.6956%201.4196%204.8685%201.0829%204.8776%20C%201.2831%205.3053%201.7381%205.6511%202.3296%205.6511%20C%203.1304002%205.6511%203.6582003%205.0505004%203.6582003%204.2497%20C%203.6582003%203.8129%203.5035002%203.3943002%203.1850002%202.9848%20C%203.0303001%202.7755%202.9120002%202.6299002%202.8301%202.548%20L%200.67340004%200.4095%20C%200.5551%200.3003%200.5733%200.273%200.5733%200%20L%204.3225%200%20L%204.6046%201.7108%20L%204.2224%201.7108%20C%204.1587%201.2285%204.0859003%200.94640005%204.004%200.8827%20C%203.9585001%200.8554%203.6764002%200.83720005%203.1395001%200.83720005%20L%201.5925001%200.83720005%20C%202.2022002%201.3741001%202.7664%201.8564001%203.3033001%202.2841%20C%203.7128003%202.6026%204.004%202.8847%204.1860003%203.1304002%20C%204.459%203.4853%204.5955%203.8584%204.5955%204.2497%20C%204.5955%204.8139%204.3771%205.2598004%203.9312003%205.5874004%20C%203.5399%205.8877%203.0485%206.0424004%202.4661002%206.0424004%20C%201.9656001%206.0424004%201.5379001%205.8968%201.1648%205.6056004%20C%200.7735%205.2871003%200.5733%204.8867%200.5733%204.3953004%20C%200.5733%204.0859003%200.8008%203.8584%201.0829%203.8584%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.0864454545454545em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, such that
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2063.122800000000005%2021.878999999999998%22%20width%3D%2263.122800000000005pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9D1F38ABCB2153B23C9405065FBCBDCC%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.045%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7A5F85FE66C6FD3E604C68F5A7949524%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.56201111111111%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g537FBDF575D6B4DBC59EE2318104781F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2829.287122222222223%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9D1F38ABCB2153B23C9405065FBCBDCC%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2838.61101111111111%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB790B32E2ED273DD2C51049F16F6407B%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2850.1709%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2857.2169%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g86111C2D5C8682C53BDA9AD6152C9992%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9D1F38ABCB2153B23C9405065FBCBDCC%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.106%201.196%20L%201.885%201.1700001%20C%202.509%201.781%202.99%202.223%203.315%202.522%20L%204.563%203.6790001%20C%204.862%203.9520001%205.1740003%204.29%205.473%204.6670003%20C%205.876%205.1610003%206.071%205.46%206.071%205.564%20C%206.071%205.681%206.006%205.7460003%205.876%205.7460003%20C%205.7850003%205.7460003%205.7070003%205.6940002%205.642%205.577%20C%205.317%205.044%205.018%204.784%204.732%204.784%20C%204.446%204.784%204.238%205.018%204.1210003%205.1740003%20C%203.809%205.551%203.497%205.7460003%203.198%205.7460003%20C%202.8600001%205.7460003%202.509%205.59%202.145%205.2520003%20C%201.781%204.914%201.599%204.576%201.599%204.238%20C%201.599%204.1080003%201.664%204.043%201.807%204.043%20C%201.898%204.043%201.9760001%204.1080003%202.028%204.225%20C%202.171%204.602%202.522%204.784%203.055%204.784%20C%203.237%204.784%203.497%204.719%203.848%204.602%20C%204.16%204.485%204.459%204.42%204.732%204.407%20C%204.004%203.6920002%203.4450002%203.1720002%203.042%202.821%20L%201.885%201.742%20C%201.69%201.547%201.4430001%201.2870001%201.1700001%200.962%20C%200.767%200.455%200.559%200.156%200.559%200.039%20C%200.559%20-0.078%200.624%20-0.143%200.767%20-0.143%20C%200.845%20-0.143%200.92300004%20-0.078%201.014%200.052%20C%201.339%200.559%201.69%200.819%202.0540001%200.819%20C%202.262%200.819%202.496%200.663%202.756%200.338%20C%203.016%200.013%203.315%20-0.143%203.614%20-0.143%20C%204.056%20-0.143%204.498%200.091000006%204.966%200.546%20C%205.434%201.001%205.668%201.4430001%205.668%201.872%20C%205.668%201.9890001%205.603%202.0540001%205.46%202.0540001%20C%205.369%202.0540001%205.291%201.9890001%205.2260003%201.8590001%20C%205.031%201.3000001%204.472%200.819%203.744%200.819%20C%203.4320002%200.819%202.418%201.196%202.106%201.196%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7A5F85FE66C6FD3E604C68F5A7949524%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.7573001%206.0424004%20C%202.3660002%205.6602%201.7836001%205.4691%200.9919%205.4691%20L%200.9919%205.0687003%20C%201.5288%205.0687003%201.9565%205.1506004%202.2841%205.3053%20L%202.2841%200.7735%20C%202.2841%200.6552%202.275%200.5824%202.2477%200.546%20C%202.2022002%200.44590002%201.9292%200.39130002%201.4287001%200.39130002%20L%201.0556%200.39130002%20L%201.0556%200%20L%202.6754%200.0364%20L%204.3043003%200%20L%204.3043003%200.39130002%20L%203.9312003%200.39130002%20C%203.4307%200.39130002%203.1577%200.44590002%203.1031%200.546%20C%203.0849001%200.5824%203.0758002%200.6552%203.0758002%200.7735%20L%203.0758002%205.7512%20C%203.0758002%205.9969%203.0394%206.0424004%202.7573001%206.0424004%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g537FBDF575D6B4DBC59EE2318104781F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%204.771%20L%201.04%204.771%20C%200.832%204.771%200.72800004%204.6670003%200.72800004%204.472%20C%200.72800004%204.277%200.832%204.173%201.04%204.173%20L%209.074%204.173%20C%209.282001%204.173%209.386001%204.277%209.386001%204.472%20C%209.386001%204.6280003%209.243%204.771%209.074%204.771%20Z%20M%209.074%202.3270001%20L%201.04%202.3270001%20C%200.832%202.3270001%200.72800004%202.223%200.72800004%202.028%20C%200.72800004%201.8330001%200.832%201.7290001%201.04%201.7290001%20L%209.074%201.7290001%20C%209.282001%201.7290001%209.386001%201.8330001%209.386001%202.028%20C%209.386001%202.197%209.243%202.3270001%209.074%202.3270001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB790B32E2ED273DD2C51049F16F6407B%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.342%20-0.26%20C%205.2390003%20-0.26%206.045%20-0.013%206.734%200.49400002%20C%207.501%201.053%207.8910003%201.768%207.8910003%202.639%20L%207.8910003%207.54%20C%207.8910003%207.748%207.787%207.852%207.579%207.852%20C%207.3840003%207.852%207.28%207.748%207.28%207.54%20L%207.28%202.639%20C%207.28%201.937%206.955%201.365%206.3050003%200.936%20C%205.7200003%200.546%205.07%200.351%204.342%200.351%20C%203.614%200.351%202.964%200.546%202.379%200.936%20C%201.7290001%201.365%201.404%201.937%201.404%202.639%20L%201.404%207.54%20C%201.404%207.748%201.3000001%207.852%201.105%207.852%20C%200.897%207.852%200.79300004%207.748%200.79300004%207.54%20L%200.79300004%202.639%20C%200.79300004%201.768%201.183%201.053%201.95%200.49400002%20C%202.639%20-0.013%203.4450002%20-0.26%204.342%20-0.26%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.215%208.879%20L%203.055%208.879%20C%202.756%208.879%202.6130002%208.866%202.6130002%208.58%20C%202.6130002%208.437%202.756%208.372%203.042%208.372%20C%203.302%208.372%203.822%208.411%203.822%208.203%20C%203.822%208.177%203.809%208.099%203.77%207.9690003%20L%202.0540001%201.066%20C%201.9760001%200.78000003%201.8460001%200.611%201.664%200.546%20C%201.5730001%200.52%201.339%200.507%200.936%200.507%20C%200.65000004%200.507%200.52%200.481%200.52%200.208%20C%200.52%200.065%200.598%200%200.767%200%20L%202.392%200.039%20L%203.224%200.026%20C%203.367%200.026%203.887%200%204.056%200%20C%204.264%200%204.368%200.104%204.368%200.312%20C%204.368%200.442%204.225%200.507%203.9520001%200.507%20C%203.4320002%200.507%203.1720002%200.559%203.1720002%200.676%20C%203.1720002%200.676%203.1850002%200.71500003%203.211%200.884%20L%203.9910002%204.056%20L%206.136%204.056%20C%206.981%204.056%207.787%204.316%208.541%204.823%20C%209.386001%205.382%209.802%206.071%209.802%206.8900003%20C%209.802%208.177%208.58%208.879%207.215%208.879%20Z%20M%206.8120003%208.372%20C%207.9430003%208.372%208.502%207.9820004%208.502%207.202%20C%208.502%206.474%208.1380005%205.499%207.761%205.1610003%20C%207.267%204.719%206.617%204.498%205.8110003%204.498%20L%204.0690002%204.498%20L%204.927%207.9300003%20C%205.031%208.372%205.031%208.372%205.577%208.372%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g86111C2D5C8682C53BDA9AD6152C9992%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0829%203.8584%20C%201.3741001%203.8584%201.5925001%204.0768003%201.5925001%204.368%20C%201.5925001%204.6956%201.4196%204.8685%201.0829%204.8776%20C%201.2831%205.3053%201.7381%205.6511%202.3296%205.6511%20C%203.1304002%205.6511%203.6582003%205.0505004%203.6582003%204.2497%20C%203.6582003%203.8129%203.5035002%203.3943002%203.1850002%202.9848%20C%203.0303001%202.7755%202.9120002%202.6299002%202.8301%202.548%20L%200.67340004%200.4095%20C%200.5551%200.3003%200.5733%200.273%200.5733%200%20L%204.3225%200%20L%204.6046%201.7108%20L%204.2224%201.7108%20C%204.1587%201.2285%204.0859003%200.94640005%204.004%200.8827%20C%203.9585001%200.8554%203.6764002%200.83720005%203.1395001%200.83720005%20L%201.5925001%200.83720005%20C%202.2022002%201.3741001%202.7664%201.8564001%203.3033001%202.2841%20C%203.7128003%202.6026%204.004%202.8847%204.1860003%203.1304002%20C%204.459%203.4853%204.5955%203.8584%204.5955%204.2497%20C%204.5955%204.8139%204.3771%205.2598004%203.9312003%205.5874004%20C%203.5399%205.8877%203.0485%206.0424004%202.4661002%206.0424004%20C%201.9656001%206.0424004%201.5379001%205.8968%201.1648%205.6056004%20C%200.7735%205.2871003%200.5733%204.8867%200.5733%204.3953004%20C%200.5733%204.0859003%200.8008%203.8584%201.0829%203.8584%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 5.738436363636364em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; and &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2072.22279999999999%2021.878999999999998%22%20width%3D%2272.22279999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9D1F38ABCB2153B23C9405065FBCBDCC%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.045%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4C626062D0179BB92EF2C6657A338664%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.595%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g86111C2D5C8682C53BDA9AD6152C9992%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.7729%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3333970CC28D4FC94DE5E983C20B1442%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2824.66201111111111%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g537FBDF575D6B4DBC59EE2318104781F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2838.387122222222224%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9D1F38ABCB2153B23C9405065FBCBDCC%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2847.71101111111111%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB790B32E2ED273DD2C51049F16F6407B%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2859.270900000000005%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2866.3169%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7A5F85FE66C6FD3E604C68F5A7949524%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9D1F38ABCB2153B23C9405065FBCBDCC%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.106%201.196%20L%201.885%201.1700001%20C%202.509%201.781%202.99%202.223%203.315%202.522%20L%204.563%203.6790001%20C%204.862%203.9520001%205.1740003%204.29%205.473%204.6670003%20C%205.876%205.1610003%206.071%205.46%206.071%205.564%20C%206.071%205.681%206.006%205.7460003%205.876%205.7460003%20C%205.7850003%205.7460003%205.7070003%205.6940002%205.642%205.577%20C%205.317%205.044%205.018%204.784%204.732%204.784%20C%204.446%204.784%204.238%205.018%204.1210003%205.1740003%20C%203.809%205.551%203.497%205.7460003%203.198%205.7460003%20C%202.8600001%205.7460003%202.509%205.59%202.145%205.2520003%20C%201.781%204.914%201.599%204.576%201.599%204.238%20C%201.599%204.1080003%201.664%204.043%201.807%204.043%20C%201.898%204.043%201.9760001%204.1080003%202.028%204.225%20C%202.171%204.602%202.522%204.784%203.055%204.784%20C%203.237%204.784%203.497%204.719%203.848%204.602%20C%204.16%204.485%204.459%204.42%204.732%204.407%20C%204.004%203.6920002%203.4450002%203.1720002%203.042%202.821%20L%201.885%201.742%20C%201.69%201.547%201.4430001%201.2870001%201.1700001%200.962%20C%200.767%200.455%200.559%200.156%200.559%200.039%20C%200.559%20-0.078%200.624%20-0.143%200.767%20-0.143%20C%200.845%20-0.143%200.92300004%20-0.078%201.014%200.052%20C%201.339%200.559%201.69%200.819%202.0540001%200.819%20C%202.262%200.819%202.496%200.663%202.756%200.338%20C%203.016%200.013%203.315%20-0.143%203.614%20-0.143%20C%204.056%20-0.143%204.498%200.091000006%204.966%200.546%20C%205.434%201.001%205.668%201.4430001%205.668%201.872%20C%205.668%201.9890001%205.603%202.0540001%205.46%202.0540001%20C%205.369%202.0540001%205.291%201.9890001%205.2260003%201.8590001%20C%205.031%201.3000001%204.472%200.819%203.744%200.819%20C%203.4320002%200.819%202.418%201.196%202.106%201.196%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4C626062D0179BB92EF2C6657A338664%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.6026%20-1.1102%20L%202.6026%201.1466%20C%202.6026%201.6653%202.2841%202.0475001%201.6562%202.275%20C%202.2841%202.5025%202.6026%202.8847%202.6026%203.4034002%20L%202.6026%205.6602%20C%202.6026%206.188%203.1668%206.5338%203.7219002%206.5338%20C%203.8220003%206.5338%203.8675%206.5793004%203.8675%206.6794004%20C%203.8675%206.7795005%203.8220003%206.8250003%203.7219002%206.8250003%20C%203.3033001%206.8250003%202.9211001%206.734%202.5844002%206.5611005%20C%202.1567001%206.3427005%201.9474001%206.0424004%201.9474001%205.6602%20L%201.9474001%203.4034002%20C%201.9474001%202.8301%201.4014001%202.4206002%200.8281%202.4206002%20C%200.72800004%202.4206002%200.6825%202.3751001%200.6825%202.275%20C%200.6825%202.1749%200.72800004%202.1294%200.8281%202.1294%20C%201.4105%202.1294%201.9474001%201.7108%201.9474001%201.1466%20L%201.9474001%20-1.1102%20C%201.9474001%20-1.4924%202.1567001%20-1.7927%202.5844002%20-2.0111%20C%202.9211001%20-2.184%203.3033001%20-2.275%203.7219002%20-2.275%20C%203.8220003%20-2.275%203.8675%20-2.2295%203.8675%20-2.1294%20C%203.8675%20-2.0293%203.8220003%20-1.9838%203.7219002%20-1.9838%20C%203.1668%20-1.9838%202.6026%20-1.638%202.6026%20-1.1102%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g86111C2D5C8682C53BDA9AD6152C9992%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0829%203.8584%20C%201.3741001%203.8584%201.5925001%204.0768003%201.5925001%204.368%20C%201.5925001%204.6956%201.4196%204.8685%201.0829%204.8776%20C%201.2831%205.3053%201.7381%205.6511%202.3296%205.6511%20C%203.1304002%205.6511%203.6582003%205.0505004%203.6582003%204.2497%20C%203.6582003%203.8129%203.5035002%203.3943002%203.1850002%202.9848%20C%203.0303001%202.7755%202.9120002%202.6299002%202.8301%202.548%20L%200.67340004%200.4095%20C%200.5551%200.3003%200.5733%200.273%200.5733%200%20L%204.3225%200%20L%204.6046%201.7108%20L%204.2224%201.7108%20C%204.1587%201.2285%204.0859003%200.94640005%204.004%200.8827%20C%203.9585001%200.8554%203.6764002%200.83720005%203.1395001%200.83720005%20L%201.5925001%200.83720005%20C%202.2022002%201.3741001%202.7664%201.8564001%203.3033001%202.2841%20C%203.7128003%202.6026%204.004%202.8847%204.1860003%203.1304002%20C%204.459%203.4853%204.5955%203.8584%204.5955%204.2497%20C%204.5955%204.8139%204.3771%205.2598004%203.9312003%205.5874004%20C%203.5399%205.8877%203.0485%206.0424004%202.4661002%206.0424004%20C%201.9656001%206.0424004%201.5379001%205.8968%201.1648%205.6056004%20C%200.7735%205.2871003%200.5733%204.8867%200.5733%204.3953004%20C%200.5733%204.0859003%200.8008%203.8584%201.0829%203.8584%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3333970CC28D4FC94DE5E983C20B1442%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.6026%203.4034002%20L%202.6026%205.6602%20C%202.6026%206.0424004%202.3933%206.3427005%201.9656001%206.5611005%20C%201.6289%206.734%201.2467%206.8250003%200.8281%206.8250003%20C%200.72800004%206.8250003%200.6825%206.7795005%200.6825%206.6794004%20C%200.6825%206.5793004%200.72800004%206.5338%200.8281%206.5338%20C%201.3832%206.5338%201.9474001%206.188%201.9474001%205.6602%20L%201.9474001%203.4034002%20C%201.9474001%202.8847%202.2659001%202.5025%202.8938%202.275%20C%202.2659001%202.0475001%201.9474001%201.6653%201.9474001%201.1466%20L%201.9474001%20-1.1102%20C%201.9474001%20-1.638%201.3832%20-1.9838%200.8281%20-1.9838%20C%200.72800004%20-1.9838%200.6825%20-2.0293%200.6825%20-2.1294%20C%200.6825%20-2.2295%200.72800004%20-2.275%200.8281%20-2.275%20C%201.2467%20-2.275%201.6289%20-2.184%201.9656001%20-2.0111%20C%202.3933%20-1.7927%202.6026%20-1.4924%202.6026%20-1.1102%20L%202.6026%201.1466%20C%202.6026%201.7108%203.1395001%202.1294%203.7219002%202.1294%20C%203.8220003%202.1294%203.8675%202.1749%203.8675%202.275%20C%203.8675%202.3751001%203.8220003%202.4206002%203.7219002%202.4206002%20C%203.1395001%202.4206002%202.6026%202.8392%202.6026%203.4034002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g537FBDF575D6B4DBC59EE2318104781F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%204.771%20L%201.04%204.771%20C%200.832%204.771%200.72800004%204.6670003%200.72800004%204.472%20C%200.72800004%204.277%200.832%204.173%201.04%204.173%20L%209.074%204.173%20C%209.282001%204.173%209.386001%204.277%209.386001%204.472%20C%209.386001%204.6280003%209.243%204.771%209.074%204.771%20Z%20M%209.074%202.3270001%20L%201.04%202.3270001%20C%200.832%202.3270001%200.72800004%202.223%200.72800004%202.028%20C%200.72800004%201.8330001%200.832%201.7290001%201.04%201.7290001%20L%209.074%201.7290001%20C%209.282001%201.7290001%209.386001%201.8330001%209.386001%202.028%20C%209.386001%202.197%209.243%202.3270001%209.074%202.3270001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB790B32E2ED273DD2C51049F16F6407B%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.342%20-0.26%20C%205.2390003%20-0.26%206.045%20-0.013%206.734%200.49400002%20C%207.501%201.053%207.8910003%201.768%207.8910003%202.639%20L%207.8910003%207.54%20C%207.8910003%207.748%207.787%207.852%207.579%207.852%20C%207.3840003%207.852%207.28%207.748%207.28%207.54%20L%207.28%202.639%20C%207.28%201.937%206.955%201.365%206.3050003%200.936%20C%205.7200003%200.546%205.07%200.351%204.342%200.351%20C%203.614%200.351%202.964%200.546%202.379%200.936%20C%201.7290001%201.365%201.404%201.937%201.404%202.639%20L%201.404%207.54%20C%201.404%207.748%201.3000001%207.852%201.105%207.852%20C%200.897%207.852%200.79300004%207.748%200.79300004%207.54%20L%200.79300004%202.639%20C%200.79300004%201.768%201.183%201.053%201.95%200.49400002%20C%202.639%20-0.013%203.4450002%20-0.26%204.342%20-0.26%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC1E50EDB8B3DD37ED1FFE5C377F69BCA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.215%208.879%20L%203.055%208.879%20C%202.756%208.879%202.6130002%208.866%202.6130002%208.58%20C%202.6130002%208.437%202.756%208.372%203.042%208.372%20C%203.302%208.372%203.822%208.411%203.822%208.203%20C%203.822%208.177%203.809%208.099%203.77%207.9690003%20L%202.0540001%201.066%20C%201.9760001%200.78000003%201.8460001%200.611%201.664%200.546%20C%201.5730001%200.52%201.339%200.507%200.936%200.507%20C%200.65000004%200.507%200.52%200.481%200.52%200.208%20C%200.52%200.065%200.598%200%200.767%200%20L%202.392%200.039%20L%203.224%200.026%20C%203.367%200.026%203.887%200%204.056%200%20C%204.264%200%204.368%200.104%204.368%200.312%20C%204.368%200.442%204.225%200.507%203.9520001%200.507%20C%203.4320002%200.507%203.1720002%200.559%203.1720002%200.676%20C%203.1720002%200.676%203.1850002%200.71500003%203.211%200.884%20L%203.9910002%204.056%20L%206.136%204.056%20C%206.981%204.056%207.787%204.316%208.541%204.823%20C%209.386001%205.382%209.802%206.071%209.802%206.8900003%20C%209.802%208.177%208.58%208.879%207.215%208.879%20Z%20M%206.8120003%208.372%20C%207.9430003%208.372%208.502%207.9820004%208.502%207.202%20C%208.502%206.474%208.1380005%205.499%207.761%205.1610003%20C%207.267%204.719%206.617%204.498%205.8110003%204.498%20L%204.0690002%204.498%20L%204.927%207.9300003%20C%205.031%208.372%205.031%208.372%205.577%208.372%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7A5F85FE66C6FD3E604C68F5A7949524%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.7573001%206.0424004%20C%202.3660002%205.6602%201.7836001%205.4691%200.9919%205.4691%20L%200.9919%205.0687003%20C%201.5288%205.0687003%201.9565%205.1506004%202.2841%205.3053%20L%202.2841%200.7735%20C%202.2841%200.6552%202.275%200.5824%202.2477%200.546%20C%202.2022002%200.44590002%201.9292%200.39130002%201.4287001%200.39130002%20L%201.0556%200.39130002%20L%201.0556%200%20L%202.6754%200.0364%20L%204.3043003%200%20L%204.3043003%200.39130002%20L%203.9312003%200.39130002%20C%203.4307%200.39130002%203.1577%200.44590002%203.1031%200.546%20C%203.0849001%200.5824%203.0758002%200.6552%203.0758002%200.7735%20L%203.0758002%205.7512%20C%203.0758002%205.9969%203.0394%206.0424004%202.7573001%206.0424004%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 6.56570909090909em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Filter out all points in &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2011.950899999999999%2021.878999999999998%22%20width%3D%2211.950899999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9D1F38ABCB2153B23C9405065FBCBDCC%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.045%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7A5F85FE66C6FD3E604C68F5A7949524%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9D1F38ABCB2153B23C9405065FBCBDCC%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.106%201.196%20L%201.885%201.1700001%20C%202.509%201.781%202.99%202.223%203.315%202.522%20L%204.563%203.6790001%20C%204.862%203.9520001%205.1740003%204.29%205.473%204.6670003%20C%205.876%205.1610003%206.071%205.46%206.071%205.564%20C%206.071%205.681%206.006%205.7460003%205.876%205.7460003%20C%205.7850003%205.7460003%205.7070003%205.6940002%205.642%205.577%20C%205.317%205.044%205.018%204.784%204.732%204.784%20C%204.446%204.784%204.238%205.018%204.1210003%205.1740003%20C%203.809%205.551%203.497%205.7460003%203.198%205.7460003%20C%202.8600001%205.7460003%202.509%205.59%202.145%205.2520003%20C%201.781%204.914%201.599%204.576%201.599%204.238%20C%201.599%204.1080003%201.664%204.043%201.807%204.043%20C%201.898%204.043%201.9760001%204.1080003%202.028%204.225%20C%202.171%204.602%202.522%204.784%203.055%204.784%20C%203.237%204.784%203.497%204.719%203.848%204.602%20C%204.16%204.485%204.459%204.42%204.732%204.407%20C%204.004%203.6920002%203.4450002%203.1720002%203.042%202.821%20L%201.885%201.742%20C%201.69%201.547%201.4430001%201.2870001%201.1700001%200.962%20C%200.767%200.455%200.559%200.156%200.559%200.039%20C%200.559%20-0.078%200.624%20-0.143%200.767%20-0.143%20C%200.845%20-0.143%200.92300004%20-0.078%201.014%200.052%20C%201.339%200.559%201.69%200.819%202.0540001%200.819%20C%202.262%200.819%202.496%200.663%202.756%200.338%20C%203.016%200.013%203.315%20-0.143%203.614%20-0.143%20C%204.056%20-0.143%204.498%200.091000006%204.966%200.546%20C%205.434%201.001%205.668%201.4430001%205.668%201.872%20C%205.668%201.9890001%205.603%202.0540001%205.46%202.0540001%20C%205.369%202.0540001%205.291%201.9890001%205.2260003%201.8590001%20C%205.031%201.3000001%204.472%200.819%203.744%200.819%20C%203.4320002%200.819%202.418%201.196%202.106%201.196%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7A5F85FE66C6FD3E604C68F5A7949524%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.7573001%206.0424004%20C%202.3660002%205.6602%201.7836001%205.4691%200.9919%205.4691%20L%200.9919%205.0687003%20C%201.5288%205.0687003%201.9565%205.1506004%202.2841%205.3053%20L%202.2841%200.7735%20C%202.2841%200.6552%202.275%200.5824%202.2477%200.546%20C%202.2022002%200.44590002%201.9292%200.39130002%201.4287001%200.39130002%20L%201.0556%200.39130002%20L%201.0556%200%20L%202.6754%200.0364%20L%204.3043003%200%20L%204.3043003%200.39130002%20L%203.9312003%200.39130002%20C%203.4307%200.39130002%203.1577%200.44590002%203.1031%200.546%20C%203.0849001%200.5824%203.0758002%200.6552%203.0758002%200.7735%20L%203.0758002%205.7512%20C%203.0758002%205.9969%203.0394%206.0424004%202.7573001%206.0424004%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.0864454545454545em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; which are not afforded by &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2011.5349%2021.878999999999998%22%20width%3D%2211.5349pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3BD2F2FDE487A05197DD8782434E5CF8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.6290000000000004%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7A5F85FE66C6FD3E604C68F5A7949524%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3BD2F2FDE487A05197DD8782434E5CF8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.264%204.225%20C%204.264%203.9%204.433%203.7310002%204.784%203.7310002%20C%205.2520003%203.7310002%205.551%204.1340003%205.551%204.602%20C%205.551%205.33%204.784%205.7460003%204.004%205.7460003%20C%203.107%205.7460003%202.288%205.356%201.5860001%204.589%20C%200.884%203.822%200.533%202.977%200.533%202.0670002%20C%200.533%200.79300004%201.378%20-0.143%202.652%20-0.143%20C%203.341%20-0.143%203.9520001%200.026%204.485%200.351%20C%204.927%200.624%205.2520003%200.897%205.46%201.1700001%20C%205.551%201.2870001%205.59%201.378%205.59%201.417%20C%205.59%201.5600001%205.525%201.638%205.382%201.638%20C%205.317%201.638%205.2520003%201.5860001%205.1740003%201.482%20C%204.745%200.91%204.212%200.546%203.601%200.39000002%20C%203.198%200.286%202.8990002%200.234%202.678%200.234%20C%201.937%200.234%201.5730001%200.689%201.5730001%201.5860001%20C%201.5730001%202.392%201.95%203.562%202.262%204.1210003%20C%202.5740001%204.6930003%203.237%205.369%204.004%205.369%20C%204.498%205.369%204.836%205.2260003%205.018%204.953%20C%204.6150002%204.914%204.264%204.6540003%204.264%204.225%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7A5F85FE66C6FD3E604C68F5A7949524%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.7573001%206.0424004%20C%202.3660002%205.6602%201.7836001%205.4691%200.9919%205.4691%20L%200.9919%205.0687003%20C%201.5288%205.0687003%201.9565%205.1506004%202.2841%205.3053%20L%202.2841%200.7735%20C%202.2841%200.6552%202.275%200.5824%202.2477%200.546%20C%202.2022002%200.44590002%201.9292%200.39130002%201.4287001%200.39130002%20L%201.0556%200.39130002%20L%201.0556%200%20L%202.6754%200.0364%20L%204.3043003%200%20L%204.3043003%200.39130002%20L%203.9312003%200.39130002%20C%203.4307%200.39130002%203.1577%200.44590002%203.1031%200.546%20C%203.0849001%200.5824%203.0758002%200.6552%203.0758002%200.7735%20L%203.0758002%205.7512%20C%203.0758002%205.9969%203.0394%206.0424004%202.7573001%206.0424004%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.0486272727272727em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;
at radius &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2023.526099999999996%2021.878999999999998%22%20width%3D%2223.526099999999996pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.863%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7C707578FA33FC5F4974517BD3CD702D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g244F502A10CDC70DE9AAA4877DC1FE65%22%20x%3D%227.5802999999999985%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g272D7D04C5DF2EB93D4A46F74DAF749C%22%20x%3D%2212.130299999999998%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7C707578FA33FC5F4974517BD3CD702D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.8665001%203.7583%20C%203.2851002%203.7583%203.4944%203.4398%203.4944%202.7937002%20L%203.4944%200.7189%20C%203.4944%200.546%203.4671001%200.4368%203.4034002%200.4004%20C%203.3397002%200.36400002%203.1304002%200.3458%202.7937002%200.3458%20L%202.7937002%200%20L%203.8493001%200.0273%20L%204.8958%200%20L%204.8958%200.3458%20C%204.5591%200.3458%204.3589%200.36400002%204.2952003%200.4004%20C%204.2315%200.4368%204.1951003%200.546%204.1951003%200.7189%20L%204.1951003%202.3569002%20C%204.1951003%203.0849001%204.6683%203.7583%205.3690004%203.7583%20C%205.7967%203.7583%206.006%203.4398%206.006%202.7937002%20L%206.006%200.7189%20C%206.006%200.546%205.9696%200.4368%205.9059005%200.4004%20C%205.8422003%200.36400002%205.6329%200.3458%205.2962003%200.3458%20L%205.2962003%200%20L%206.3518004%200.0273%20L%207.3983%200%20L%207.3983%200.3458%20C%207.1071005%200.3458%206.9160004%200.3549%206.8250003%200.3822%20C%206.734%200.4095%206.6976004%200.47320002%206.6976004%200.5824%20L%206.6976004%202.2841%20C%206.6976004%202.7118%206.6794004%203.0121002%206.6521%203.1850002%20C%206.5611005%203.7401001%206.1516004%204.0222%205.4327%204.0222%20C%204.8594003%204.0222%204.4317%203.7583%204.1405%203.2214%20C%204.0131%203.7583%203.6127002%204.0222%202.9302%204.0222%20C%202.3569002%204.0222%201.9201001%203.7492%201.6289%203.2032%20L%201.6289%204.0222%20L%200.2912%203.9221%20L%200.2912%203.5763001%20C%200.61880004%203.5763001%200.819%203.5490003%200.89180005%203.4944%20C%200.9646%203.4398%200.9919%203.3215%200.9919%203.1122%20L%200.9919%200.7189%20C%200.9919%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3458%200.2912%200.3458%20L%200.2912%200%20L%201.3468001%200.0273%20L%202.3933%200%20L%202.3933%200.3458%20C%202.0566%200.3458%201.8473%200.36400002%201.7836001%200.4004%20C%201.7199%200.4368%201.6835%200.546%201.6835%200.7189%20L%201.6835%202.3569002%20C%201.6835%203.094%202.1658%203.7583%202.8665001%203.7583%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g244F502A10CDC70DE9AAA4877DC1FE65%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.3953004%200.8281%20L%204.3953004%201.365%20L%204.1041%201.365%20L%204.1041%200.8281%20C%204.1041%200.47320002%204.004%200.2912%203.8129%200.2912%20C%203.6309001%200.2912%203.5217001%200.5187%203.5217001%200.70070004%20L%203.5217001%202.4934%20C%203.5217001%202.8119001%203.4853%203.0485%203.4216%203.2123%20C%203.2032%203.7492%202.5753002%204.0768003%201.9383001%204.0768003%20C%201.2376001%204.0768003%200.546%203.6855001%200.546%203.0303001%20C%200.546%202.73%200.70070004%202.5753002%201.001%202.5753002%20C%201.3013%202.5753002%201.4469%202.7209%201.4469%203.0212002%20C%201.4469%203.2851002%201.3104%203.4398%201.0283%203.4671001%20C%201.2285%203.6946%201.5288%203.8129%201.9201001%203.8129%20C%202.4843001%203.8129%202.8301%203.2942002%202.8301%202.7027001%20L%202.8301%202.4024%20C%202.1203%202.3569002%201.5834%202.2477%201.2103001%202.0748%20C%200.6006%201.7927%200.2912%201.4014001%200.2912%200.8827%20C%200.2912%200.64610004%200.3822%200.44590002%200.5551%200.2912%20C%200.8463%200.0273%201.2467%20-0.1001%201.7563001%20-0.1001%20C%202.2932%20-0.1001%202.6754%200.12740001%202.9120002%200.59150004%20C%202.9757001%200.24570002%203.2305002%20-0.0546%203.6218002%20-0.0546%20C%204.1041%20-0.0546%204.3953004%200.3276%204.3953004%200.8281%20Z%20M%201.82%200.1638%20C%201.4014001%200.1638%201.0556%200.47320002%201.0556%200.89180005%20C%201.0556%201.7381%201.9383001%202.1021001%202.8301%202.1476002%20L%202.8301%201.2831%20C%202.8301%200.67340004%202.4297001%200.1638%201.82%200.1638%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g272D7D04C5DF2EB93D4A46F74DAF749C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.8038%200.0273%20C%204.0131%200.0364%204.3134003%200.0273%204.6956%200%20L%204.6956%200.3458%20C%204.2133%200.3458%204.0313%200.3549%203.8402002%200.6097%20L%202.6572%202.1385%20C%203.0485%202.6208%203.3124%202.9484%203.4580002%203.1213002%20C%203.7128003%203.4125001%204.0677004%203.5672002%204.5318003%203.5763001%20L%204.5318003%203.9221%20C%204.277%203.9039001%204.0222%203.8948002%203.7674003%203.8948002%20C%203.4307%203.8948002%203.1304002%203.9039001%202.8665001%203.9221%20L%202.8665001%203.5763001%20C%203.0394%203.5581002%203.1304002%203.4762%203.1304002%203.3306%20C%203.1304002%203.2487001%203.0849001%203.1486%203.003%203.0394%20L%202.4752002%202.3842%20L%201.8018001%203.2487001%20C%201.7563001%203.3124%201.7290001%203.3579001%201.7290001%203.3852%20C%201.7290001%203.5035002%201.8382001%203.5672002%202.0475001%203.5763001%20L%202.0475001%203.9221%20L%201.0374%203.8948002%20C%200.8008%203.8857002%200.50960004%203.8948002%200.15470001%203.9221%20L%200.15470001%203.5763001%20C%200.4823%203.5763001%200.6916%203.5490003%200.78260005%203.5035002%20C%200.8736%203.4580002%201.0192001%203.3033001%201.2194%203.0394%20L%202.0839%201.9110001%20C%201.638%201.3377%201.365%200.9919%201.2649001%200.8736%20C%200.97370005%200.5187%200.59150004%200.3458%200.1092%200.3458%20L%200.1092%200%20C%200.44590002%200.0273%200.70070004%200.0364%200.89180005%200.0273%20L%201.7745001%200%20L%201.7745001%200.3458%20C%201.6016%200.3731%201.5197%200.455%201.5197%200.59150004%20C%201.5197%200.6279%201.5288%200.67340004%201.547%200.7189%20C%201.6016%200.83720005%201.8473%201.1466%202.2841%201.6653%20L%202.9393%200.80990005%20C%203.0394%200.6825%203.094%200.59150004%203.1213002%200.53690004%20C%203.1213002%200.41860002%203.0121002%200.3549%202.7937002%200.3458%20L%202.7937002%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.1387363636363634em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;. Do the same for &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2011.950899999999999%2021.878999999999998%22%20width%3D%2211.950899999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9D1F38ABCB2153B23C9405065FBCBDCC%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.045%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g86111C2D5C8682C53BDA9AD6152C9992%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9D1F38ABCB2153B23C9405065FBCBDCC%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.106%201.196%20L%201.885%201.1700001%20C%202.509%201.781%202.99%202.223%203.315%202.522%20L%204.563%203.6790001%20C%204.862%203.9520001%205.1740003%204.29%205.473%204.6670003%20C%205.876%205.1610003%206.071%205.46%206.071%205.564%20C%206.071%205.681%206.006%205.7460003%205.876%205.7460003%20C%205.7850003%205.7460003%205.7070003%205.6940002%205.642%205.577%20C%205.317%205.044%205.018%204.784%204.732%204.784%20C%204.446%204.784%204.238%205.018%204.1210003%205.1740003%20C%203.809%205.551%203.497%205.7460003%203.198%205.7460003%20C%202.8600001%205.7460003%202.509%205.59%202.145%205.2520003%20C%201.781%204.914%201.599%204.576%201.599%204.238%20C%201.599%204.1080003%201.664%204.043%201.807%204.043%20C%201.898%204.043%201.9760001%204.1080003%202.028%204.225%20C%202.171%204.602%202.522%204.784%203.055%204.784%20C%203.237%204.784%203.497%204.719%203.848%204.602%20C%204.16%204.485%204.459%204.42%204.732%204.407%20C%204.004%203.6920002%203.4450002%203.1720002%203.042%202.821%20L%201.885%201.742%20C%201.69%201.547%201.4430001%201.2870001%201.1700001%200.962%20C%200.767%200.455%200.559%200.156%200.559%200.039%20C%200.559%20-0.078%200.624%20-0.143%200.767%20-0.143%20C%200.845%20-0.143%200.92300004%20-0.078%201.014%200.052%20C%201.339%200.559%201.69%200.819%202.0540001%200.819%20C%202.262%200.819%202.496%200.663%202.756%200.338%20C%203.016%200.013%203.315%20-0.143%203.614%20-0.143%20C%204.056%20-0.143%204.498%200.091000006%204.966%200.546%20C%205.434%201.001%205.668%201.4430001%205.668%201.872%20C%205.668%201.9890001%205.603%202.0540001%205.46%202.0540001%20C%205.369%202.0540001%205.291%201.9890001%205.2260003%201.8590001%20C%205.031%201.3000001%204.472%200.819%203.744%200.819%20C%203.4320002%200.819%202.418%201.196%202.106%201.196%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g86111C2D5C8682C53BDA9AD6152C9992%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0829%203.8584%20C%201.3741001%203.8584%201.5925001%204.0768003%201.5925001%204.368%20C%201.5925001%204.6956%201.4196%204.8685%201.0829%204.8776%20C%201.2831%205.3053%201.7381%205.6511%202.3296%205.6511%20C%203.1304002%205.6511%203.6582003%205.0505004%203.6582003%204.2497%20C%203.6582003%203.8129%203.5035002%203.3943002%203.1850002%202.9848%20C%203.0303001%202.7755%202.9120002%202.6299002%202.8301%202.548%20L%200.67340004%200.4095%20C%200.5551%200.3003%200.5733%200.273%200.5733%200%20L%204.3225%200%20L%204.6046%201.7108%20L%204.2224%201.7108%20C%204.1587%201.2285%204.0859003%200.94640005%204.004%200.8827%20C%203.9585001%200.8554%203.6764002%200.83720005%203.1395001%200.83720005%20L%201.5925001%200.83720005%20C%202.2022002%201.3741001%202.7664%201.8564001%203.3033001%202.2841%20C%203.7128003%202.6026%204.004%202.8847%204.1860003%203.1304002%20C%204.459%203.4853%204.5955%203.8584%204.5955%204.2497%20C%204.5955%204.8139%204.3771%205.2598004%203.9312003%205.5874004%20C%203.5399%205.8877%203.0485%206.0424004%202.4661002%206.0424004%20C%201.9656001%206.0424004%201.5379001%205.8968%201.1648%205.6056004%20C%200.7735%205.2871003%200.5733%204.8867%200.5733%204.3953004%20C%200.5733%204.0859003%200.8008%203.8584%201.0829%203.8584%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.0864454545454545em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; and &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2011.5349%2021.878999999999998%22%20width%3D%2211.5349pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3BD2F2FDE487A05197DD8782434E5CF8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.6290000000000004%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7A5F85FE66C6FD3E604C68F5A7949524%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3BD2F2FDE487A05197DD8782434E5CF8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.264%204.225%20C%204.264%203.9%204.433%203.7310002%204.784%203.7310002%20C%205.2520003%203.7310002%205.551%204.1340003%205.551%204.602%20C%205.551%205.33%204.784%205.7460003%204.004%205.7460003%20C%203.107%205.7460003%202.288%205.356%201.5860001%204.589%20C%200.884%203.822%200.533%202.977%200.533%202.0670002%20C%200.533%200.79300004%201.378%20-0.143%202.652%20-0.143%20C%203.341%20-0.143%203.9520001%200.026%204.485%200.351%20C%204.927%200.624%205.2520003%200.897%205.46%201.1700001%20C%205.551%201.2870001%205.59%201.378%205.59%201.417%20C%205.59%201.5600001%205.525%201.638%205.382%201.638%20C%205.317%201.638%205.2520003%201.5860001%205.1740003%201.482%20C%204.745%200.91%204.212%200.546%203.601%200.39000002%20C%203.198%200.286%202.8990002%200.234%202.678%200.234%20C%201.937%200.234%201.5730001%200.689%201.5730001%201.5860001%20C%201.5730001%202.392%201.95%203.562%202.262%204.1210003%20C%202.5740001%204.6930003%203.237%205.369%204.004%205.369%20C%204.498%205.369%204.836%205.2260003%205.018%204.953%20C%204.6150002%204.914%204.264%204.6540003%204.264%204.225%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7A5F85FE66C6FD3E604C68F5A7949524%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.7573001%206.0424004%20C%202.3660002%205.6602%201.7836001%205.4691%200.9919%205.4691%20L%200.9919%205.0687003%20C%201.5288%205.0687003%201.9565%205.1506004%202.2841%205.3053%20L%202.2841%200.7735%20C%202.2841%200.6552%202.275%200.5824%202.2477%200.546%20C%202.2022002%200.44590002%201.9292%200.39130002%201.4287001%200.39130002%20L%201.0556%200.39130002%20L%201.0556%200%20L%202.6754%200.0364%20L%204.3043003%200%20L%204.3043003%200.39130002%20L%203.9312003%200.39130002%20C%203.4307%200.39130002%203.1577%200.44590002%203.1031%200.546%20C%203.0849001%200.5824%203.0758002%200.6552%203.0758002%200.7735%20L%203.0758002%205.7512%20C%203.0758002%205.9969%203.0394%206.0424004%202.7573001%206.0424004%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.0486272727272727em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Recursively repeat this process for both partitioned cells until
each cell contains only one point.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;I’m intentionally avoiding code in my description here because the code
required to construct the tree is quite verbose. I’ve made a
stripped-down version in the spoiler block below for completeness,
though.&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;*deep breath*&lt;&#x2F;summary&gt;
&lt;p&gt;First, a helper function for determining whether a sphere contains all
of a cell:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;sphere_contains&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;center&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;; 3], &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;rsq&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;vol&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;Aabb&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;bool&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    vol&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;lo
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;into_iter&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;zip&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;vol&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;hi&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;zip&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;center&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;map&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;(&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;l&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;h&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; c&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;|&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; c &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; l &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; h &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; c &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; h &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; c &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;else&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; c &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; l &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;powi&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;sum&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;=&lt;&#x2F;span&gt; rsq
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We start by padding the points to a power of two, then immediately call
out to a helper function to populate all the buffers.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;capt_new&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;points&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;; 3]], &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;r_range&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; Capt&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; n2 &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; points&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;len&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;next_power_of_two&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; points2&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;_&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;vec!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;INFINITY&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; n2&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    points2&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;points&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;len&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;copy_from_slice&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;points&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; tests &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;vec!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;NAN&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; n2 &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;into_boxed_slice&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; afforded &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; starts &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;vec!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; aabbs &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-support z-function z-rust&quot;&gt;capt_new_help&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; points2&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; tests&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; aabbs&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; afforded&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; starts&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        r_range&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        Aabb &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            lo&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;NEG_INFINITY&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            hi&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;INFINITY&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    Capt &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        tests&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        aabbs&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; aabbs&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;into_boxed_slice&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        starts&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; starts&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;into_boxed_slice&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        afforded&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; afforded&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;map&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;into_boxed_slice&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Next, we write the main recursive helper function for splitting up cells
and populating the affordance sets. If this looks convoluted, remember
that the version used in the final code was even worse.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;allow&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;clippy::too_many_arguments&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;capt_new_help&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;points&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; [[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;; 3]],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;tests&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; [&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;aabbs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;Aabb&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;afforded&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; [&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;; 3],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;starts&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;k&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;r_range&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;in_range&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;cell&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Aabb,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Base case: only one point in the cell means this is a leaf
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;rep&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;points &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; AABB of all afforded points
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; aabb &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; Aabb &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; lo&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; rep&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; hi&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; rep &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Exclude padded infinites from affordance sets
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; rep&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;is_finite&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Representative point comes first
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;for_each&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;k&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;afforded&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;push&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;rep&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Don&amp;#39;t include other points if the cell is small enough
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-rust&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;sphere_contains&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;rep&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; r_range&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-float z-rust&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;powi&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;cell&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; p &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; in_range &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; k &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;..&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                        &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Expand AABB to contain afforded points
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; p&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; aabb&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;lo&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                            aabb&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;lo&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; p&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;else&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; aabb&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;hi&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; p&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                            aabb&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;hi&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; p&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                        afforded&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;push&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;p&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Update starts to match this region of afforded
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        starts&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;push&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;afforded&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;len&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        aabbs&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;push&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;aabb&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;return&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Recursive case: splitting a cell
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Compute the median plane of the cell
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;lh&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; med_hi&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;_&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; points
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;select_nth_unstable_by&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;points&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;len&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;&#x2F;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;b&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            a&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;partial_cmp&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;b&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; med_lo &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; lh
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;max_by&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;b&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;a&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;partial_cmp&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;b&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; test &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;med_lo&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; med_hi&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;&#x2F;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-float z-rust&quot;&gt;2.&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-float z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    tests&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;i&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; test&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Split the volumes
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; lo_range &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; in_range&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; hi_range &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; in_range&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; lo_vol &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; cell&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    lo_vol&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;hi&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; test&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; hi_vol &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; cell&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    hi_vol&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;lo&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; test&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Compute the new afforded sets
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    lo_range&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;retain&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;p&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;intersects&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;lo_vol&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; p&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; r_range&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-float z-rust&quot;&gt;1.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;powi&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    hi_range&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;retain&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;p&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;intersects&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;hi_vol&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; p&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; r_range&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-float z-rust&quot;&gt;1.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;powi&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;lhs&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; rhs&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; points&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;split_at_mut&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;points&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;len&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;&#x2F;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    lo_range&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;extend&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;rhs&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;filter&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;p&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;p&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;=&lt;&#x2F;span&gt; test &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; r_range&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    hi_range&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;extend&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;lhs&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;filter&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;p&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;p&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt; test &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; r_range&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; Recur for each half of the split
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-support z-function z-rust&quot;&gt;capt_new_help&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        lhs&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        tests&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        aabbs&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        afforded&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        starts&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;k &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;%&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        r_range&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        lo_range&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        lo_vol&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-support z-function z-rust&quot;&gt;capt_new_help&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        rhs&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        tests&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        aabbs&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        afforded&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        starts&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;k &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;%&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        r_range&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        hi_range&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        hi_vol&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;details&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;captree&#x2F;construct_time.svg&quot; alt=&quot;image&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Unfortunately, even with some extra engineering work, our construction
times for the tree still sucked. I even tried transforming the recursive
construction procedure into a stack-based iterative one. At the end of
the day, the core problem is simply algorithmic: if the average
affordance-set size is &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, and there are &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.799999999999999%2021.878999999999998%22%20width%3D%227.799999999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCC2D6A7770FCF135D0D1A78A9F87C718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCC2D6A7770FCF135D0D1A78A9F87C718%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.981%201.781%20C%206.682%200.754%206.2530003%200.234%205.7200003%200.234%20C%205.551%200.234%205.46%200.36400002%205.46%200.611%20C%205.46%200.79300004%205.538%201.092%205.6940002%201.495%20C%206.214%202.9120002%206.474%203.848%206.474%204.329%20C%206.474%205.2390003%205.863%205.7460003%204.953%205.7460003%20C%204.186%205.7460003%203.523%205.408%202.99%204.719%20C%202.8860002%205.291%202.431%205.7460003%201.768%205.7460003%20C%201.04%205.7460003%200.754%205.07%200.572%204.485%20C%200.442%204.0690002%200.377%203.822%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.963%205.369%202.08%205.1870003%202.08%204.823%20C%202.08%204.6540003%202.015%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4430001%20-0.143%20C%201.69%20-0.143%201.872%20-0.013%201.963%200.24700001%20C%201.9890001%200.312%202.0670002%200.637%202.21%201.196%20L%202.483%202.3530002%20L%202.8730001%203.835%20C%203.016%204.1340003%203.237%204.433%203.51%204.745%20C%203.887%205.1610003%204.355%205.369%204.914%205.369%20C%205.343%205.369%205.551%205.083%205.551%204.524%20C%205.551%204.03%205.278%203.042%204.719%201.5600001%20C%204.6280003%201.326%204.589%201.131%204.589%200.962%20C%204.589%200.32500002%205.07%20-0.143%205.6940002%20-0.143%20C%206.2660003%20-0.143%206.721%200.18200001%207.046%200.832%20C%207.293%201.352%207.4230003%201.7030001%207.4230003%201.872%20C%207.4230003%201.9890001%207.3580003%202.0540001%207.215%202.0540001%20C%207.176%202.0540001%206.981%201.937%206.981%201.781%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.709090909090909em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; points, construction takes
roughly &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2041.74300000000001%2021.878999999999998%22%20width%3D%2241.74300000000001pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD64B3975C9A5026604F20A029CCF2ADF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.984%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g71010E02B37BE1C0875AD8D94171F929%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.041%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6BD6B5079591C663D089FFB042C868C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2822.009%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCC2D6A7770FCF135D0D1A78A9F87C718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2829.809%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2836.686%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4D62189ABBC2948BAB13C269F5CB8E70%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD64B3975C9A5026604F20A029CCF2ADF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.126%203.4190001%20C%209.451%204.16%209.62%204.901%209.62%205.655%20C%209.62%206.669%209.321%207.501%208.71%208.1640005%20C%208.099%208.827001%207.293%209.165%206.2920003%209.165%20C%205.603%209.165%204.914%208.996%204.225%208.658%20C%202.821%207.9690003%201.794%206.8770003%201.131%205.395%20C%200.806%204.6670003%200.637%203.9390001%200.637%203.198%20C%200.637%202.171%200.936%201.339%201.547%200.689%20C%202.158%200.039%202.964%20-0.286%203.9780002%20-0.286%20C%204.6540003%20-0.286%205.33%20-0.117%206.019%200.208%20C%207.4360003%200.897%208.463%201.9760001%209.126%203.4190001%20Z%20M%208.372%206.162%20C%208.372%204.433%207.592%202.704%206.76%201.677%20C%206.188%200.962%205.2000003%200.156%204.056%200.156%20C%202.665%200.156%201.937%201.365%201.937%202.834%20C%201.937%203.289%202.028%203.9%202.197%204.6410003%20C%202.548%206.175%203.4320002%207.527%204.589%208.229%20C%205.1480002%208.567%205.6940002%208.736%206.214%208.736%20C%207.618%208.736%208.372%207.618%208.372%206.162%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g71010E02B37BE1C0875AD8D94171F929%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.1340003%20-3.224%20C%204.251%20-3.224%204.316%20-3.1590002%204.316%20-3.042%20C%204.316%20-3.003%204.29%20-2.951%204.251%20-2.8990002%20C%203.575%20-2.379%203.029%20-1.521%202.6260002%20-0.338%20C%202.275%200.689%202.093%201.7030001%202.093%202.704%20L%202.093%203.796%20C%202.093%204.797%202.275%205.8110003%202.6260002%206.8380003%20C%203.029%208.021%203.575%208.879%204.251%209.399%20C%204.29%209.438%204.316%209.49%204.316%209.542%20C%204.316%209.659%204.251%209.724%204.1340003%209.724%20C%204.1210003%209.724%204.0820003%209.711%204.043%209.685%20C%203.263%209.087%202.6130002%208.203%202.08%207.02%20C%201.5730001%205.889%201.3130001%204.823%201.3130001%203.796%20L%201.3130001%202.704%20C%201.3130001%201.677%201.5730001%200.611%202.08%20-0.52%20C%202.6130002%20-1.7030001%203.263%20-2.5870001%204.043%20-3.1850002%20C%204.0820003%20-3.211%204.1210003%20-3.224%204.1340003%20-3.224%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6BD6B5079591C663D089FFB042C868C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.317%204.589%20C%205.317%204.251%205.499%204.0820003%205.85%204.0820003%20C%206.3050003%204.0820003%206.604%204.485%206.604%204.927%20C%206.604%205.434%206.188%205.7850003%205.681%205.7850003%20C%205.096%205.7850003%204.472%205.395%203.783%204.6280003%20C%203.25%204.043%202.821%203.6660001%202.47%203.497%20L%203.783%208.827001%20C%203.757%208.944%203.7310002%209.022%203.562%209.022%20C%203.1460001%209.022%202.158%208.905%202.002%208.892%20C%201.807%208.866%201.7160001%208.775001%201.7160001%208.58%20C%201.7160001%208.45%201.8330001%208.385%202.0670002%208.385%20C%202.3140001%208.385%202.652%208.398%202.652%208.216001%20L%200.767%200.559%20C%200.72800004%200.416%200.71500003%200.32500002%200.71500003%200.273%20C%200.71500003%200%200.85800004%20-0.143%201.131%20-0.143%20C%201.352%20-0.143%201.521%20-0.039%201.612%200.156%20C%201.677%200.273%201.911%201.196%202.3270001%202.938%20C%203.003%202.8730001%203.7180002%202.548%203.7180002%201.898%20C%203.7180002%201.7030001%203.627%201.3130001%203.627%201.183%20C%203.627%200.442%204.1080003%20-0.143%204.849%20-0.143%20C%205.603%20-0.143%206.11%200.533%206.3700004%201.885%20C%206.3700004%202.002%206.3050003%202.0670002%206.175%202.0670002%20C%206.058%202.0670002%205.98%201.9760001%205.941%201.794%20C%205.655%200.767%205.304%200.24700001%204.875%200.24700001%20C%204.6410003%200.24700001%204.524%200.42900002%204.524%200.79300004%20C%204.524%201.001%204.6800003%201.7030001%204.6800003%201.911%20C%204.6800003%202.652%204.0820003%203.107%202.8730001%203.289%20C%203.1720002%203.497%203.51%203.796%203.874%204.186%20C%204.238%204.576%204.498%204.823%204.6670003%204.966%20C%205.018%205.2520003%205.356%205.395%205.655%205.395%20C%205.7850003%205.395%205.889%205.369%205.967%205.317%20C%205.616%205.2520003%205.317%204.927%205.317%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCC2D6A7770FCF135D0D1A78A9F87C718%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.981%201.781%20C%206.682%200.754%206.2530003%200.234%205.7200003%200.234%20C%205.551%200.234%205.46%200.36400002%205.46%200.611%20C%205.46%200.79300004%205.538%201.092%205.6940002%201.495%20C%206.214%202.9120002%206.474%203.848%206.474%204.329%20C%206.474%205.2390003%205.863%205.7460003%204.953%205.7460003%20C%204.186%205.7460003%203.523%205.408%202.99%204.719%20C%202.8860002%205.291%202.431%205.7460003%201.768%205.7460003%20C%201.04%205.7460003%200.754%205.07%200.572%204.485%20C%200.442%204.0690002%200.377%203.822%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.963%205.369%202.08%205.1870003%202.08%204.823%20C%202.08%204.6540003%202.015%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4430001%20-0.143%20C%201.69%20-0.143%201.872%20-0.013%201.963%200.24700001%20C%201.9890001%200.312%202.0670002%200.637%202.21%201.196%20L%202.483%202.3530002%20L%202.8730001%203.835%20C%203.016%204.1340003%203.237%204.433%203.51%204.745%20C%203.887%205.1610003%204.355%205.369%204.914%205.369%20C%205.343%205.369%205.551%205.083%205.551%204.524%20C%205.551%204.03%205.278%203.042%204.719%201.5600001%20C%204.6280003%201.326%204.589%201.131%204.589%200.962%20C%204.589%200.32500002%205.07%20-0.143%205.6940002%20-0.143%20C%206.2660003%20-0.143%206.721%200.18200001%207.046%200.832%20C%207.293%201.352%207.4230003%201.7030001%207.4230003%201.872%20C%207.4230003%201.9890001%207.3580003%202.0540001%207.215%202.0540001%20C%207.176%202.0540001%206.981%201.937%206.981%201.781%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4D62189ABBC2948BAB13C269F5CB8E70%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.014%20-3.1850002%20C%201.794%20-2.5870001%202.444%20-1.7030001%202.977%20-0.52%20C%203.484%200.611%203.744%201.677%203.744%202.704%20L%203.744%203.796%20C%203.744%204.823%203.484%205.889%202.977%207.02%20C%202.444%208.203%201.794%209.087%201.014%209.685%20C%200.975%209.711%200.936%209.724%200.92300004%209.724%20C%200.806%209.724%200.741%209.659%200.741%209.542%20C%200.741%209.49%200.767%209.438%200.806%209.399%20C%201.482%208.879%202.028%208.021%202.431%206.8380003%20C%202.782%205.8110003%202.964%204.797%202.964%203.796%20L%202.964%202.704%20C%202.964%201.7030001%202.782%200.689%202.431%20-0.338%20C%202.028%20-1.521%201.482%20-2.379%200.806%20-2.8990002%20C%200.767%20-2.951%200.741%20-3.003%200.741%20-3.042%20C%200.741%20-3.1590002%200.806%20-3.224%200.92300004%20-3.224%20C%200.936%20-3.224%200.975%20-3.211%201.014%20-3.1850002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.7948181818181825em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; time for sufficiently large &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;. In most cases, &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;
grows with &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.799999999999999%2021.878999999999998%22%20width%3D%227.799999999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCC2D6A7770FCF135D0D1A78A9F87C718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCC2D6A7770FCF135D0D1A78A9F87C718%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.981%201.781%20C%206.682%200.754%206.2530003%200.234%205.7200003%200.234%20C%205.551%200.234%205.46%200.36400002%205.46%200.611%20C%205.46%200.79300004%205.538%201.092%205.6940002%201.495%20C%206.214%202.9120002%206.474%203.848%206.474%204.329%20C%206.474%205.2390003%205.863%205.7460003%204.953%205.7460003%20C%204.186%205.7460003%203.523%205.408%202.99%204.719%20C%202.8860002%205.291%202.431%205.7460003%201.768%205.7460003%20C%201.04%205.7460003%200.754%205.07%200.572%204.485%20C%200.442%204.0690002%200.377%203.822%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.963%205.369%202.08%205.1870003%202.08%204.823%20C%202.08%204.6540003%202.015%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4430001%20-0.143%20C%201.69%20-0.143%201.872%20-0.013%201.963%200.24700001%20C%201.9890001%200.312%202.0670002%200.637%202.21%201.196%20L%202.483%202.3530002%20L%202.8730001%203.835%20C%203.016%204.1340003%203.237%204.433%203.51%204.745%20C%203.887%205.1610003%204.355%205.369%204.914%205.369%20C%205.343%205.369%205.551%205.083%205.551%204.524%20C%205.551%204.03%205.278%203.042%204.719%201.5600001%20C%204.6280003%201.326%204.589%201.131%204.589%200.962%20C%204.589%200.32500002%205.07%20-0.143%205.6940002%20-0.143%20C%206.2660003%20-0.143%206.721%200.18200001%207.046%200.832%20C%207.293%201.352%207.4230003%201.7030001%207.4230003%201.872%20C%207.4230003%201.9890001%207.3580003%202.0540001%207.215%202.0540001%20C%207.176%202.0540001%206.981%201.937%206.981%201.781%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.709090909090909em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, so it could perform as slowly as &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2041.6299%2021.878999999999998%22%20width%3D%2241.6299pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD64B3975C9A5026604F20A029CCF2ADF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.984%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6E0B9941E7AAA4C87C0B118CB162942E%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.47%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6BD6B5079591C663D089FFB042C868C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2822.438000000000002%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCC2D6A7770FCF135D0D1A78A9F87C718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2830.238%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g86111C2D5C8682C53BDA9AD6152C9992%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2836.1439%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g67EFC6A56ECEEA6CD53D2A781C7091DE%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD64B3975C9A5026604F20A029CCF2ADF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.126%203.4190001%20C%209.451%204.16%209.62%204.901%209.62%205.655%20C%209.62%206.669%209.321%207.501%208.71%208.1640005%20C%208.099%208.827001%207.293%209.165%206.2920003%209.165%20C%205.603%209.165%204.914%208.996%204.225%208.658%20C%202.821%207.9690003%201.794%206.8770003%201.131%205.395%20C%200.806%204.6670003%200.637%203.9390001%200.637%203.198%20C%200.637%202.171%200.936%201.339%201.547%200.689%20C%202.158%200.039%202.964%20-0.286%203.9780002%20-0.286%20C%204.6540003%20-0.286%205.33%20-0.117%206.019%200.208%20C%207.4360003%200.897%208.463%201.9760001%209.126%203.4190001%20Z%20M%208.372%206.162%20C%208.372%204.433%207.592%202.704%206.76%201.677%20C%206.188%200.962%205.2000003%200.156%204.056%200.156%20C%202.665%200.156%201.937%201.365%201.937%202.834%20C%201.937%203.289%202.028%203.9%202.197%204.6410003%20C%202.548%206.175%203.4320002%207.527%204.589%208.229%20C%205.1480002%208.567%205.6940002%208.736%206.214%208.736%20C%207.618%208.736%208.372%207.618%208.372%206.162%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6E0B9941E7AAA4C87C0B118CB162942E%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.524%20-3.861%20C%204.6410003%20-3.861%204.7060003%20-3.796%204.7060003%20-3.6790001%20C%204.7060003%20-3.614%204.6800003%20-3.575%204.6410003%20-3.536%20C%203.913%20-2.977%203.328%20-2.0410001%202.8860002%20-0.72800004%20C%202.509%200.403%202.3140001%201.495%202.3140001%202.5740001%20L%202.3140001%203.926%20C%202.3140001%205.005%202.509%206.097%202.8860002%207.228%20C%203.328%208.541%203.913%209.477%204.6410003%2010.036%20C%204.6800003%2010.075%204.7060003%2010.114%204.7060003%2010.179%20C%204.7060003%2010.2960005%204.6410003%2010.361%204.524%2010.361%20C%204.472%2010.361%204.433%2010.348001%204.42%2010.3220005%20C%203.575%209.672%202.8730001%208.71%202.3140001%207.4230003%20C%201.781%206.201%201.508%205.031%201.508%203.926%20L%201.508%202.5740001%20C%201.508%201.469%201.781%200.299%202.3140001%20-0.92300004%20C%202.8730001%20-2.21%203.575%20-3.1720002%204.42%20-3.822%20C%204.433%20-3.848%204.472%20-3.861%204.524%20-3.861%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6BD6B5079591C663D089FFB042C868C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.317%204.589%20C%205.317%204.251%205.499%204.0820003%205.85%204.0820003%20C%206.3050003%204.0820003%206.604%204.485%206.604%204.927%20C%206.604%205.434%206.188%205.7850003%205.681%205.7850003%20C%205.096%205.7850003%204.472%205.395%203.783%204.6280003%20C%203.25%204.043%202.821%203.6660001%202.47%203.497%20L%203.783%208.827001%20C%203.757%208.944%203.7310002%209.022%203.562%209.022%20C%203.1460001%209.022%202.158%208.905%202.002%208.892%20C%201.807%208.866%201.7160001%208.775001%201.7160001%208.58%20C%201.7160001%208.45%201.8330001%208.385%202.0670002%208.385%20C%202.3140001%208.385%202.652%208.398%202.652%208.216001%20L%200.767%200.559%20C%200.72800004%200.416%200.71500003%200.32500002%200.71500003%200.273%20C%200.71500003%200%200.85800004%20-0.143%201.131%20-0.143%20C%201.352%20-0.143%201.521%20-0.039%201.612%200.156%20C%201.677%200.273%201.911%201.196%202.3270001%202.938%20C%203.003%202.8730001%203.7180002%202.548%203.7180002%201.898%20C%203.7180002%201.7030001%203.627%201.3130001%203.627%201.183%20C%203.627%200.442%204.1080003%20-0.143%204.849%20-0.143%20C%205.603%20-0.143%206.11%200.533%206.3700004%201.885%20C%206.3700004%202.002%206.3050003%202.0670002%206.175%202.0670002%20C%206.058%202.0670002%205.98%201.9760001%205.941%201.794%20C%205.655%200.767%205.304%200.24700001%204.875%200.24700001%20C%204.6410003%200.24700001%204.524%200.42900002%204.524%200.79300004%20C%204.524%201.001%204.6800003%201.7030001%204.6800003%201.911%20C%204.6800003%202.652%204.0820003%203.107%202.8730001%203.289%20C%203.1720002%203.497%203.51%203.796%203.874%204.186%20C%204.238%204.576%204.498%204.823%204.6670003%204.966%20C%205.018%205.2520003%205.356%205.395%205.655%205.395%20C%205.7850003%205.395%205.889%205.369%205.967%205.317%20C%205.616%205.2520003%205.317%204.927%205.317%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCC2D6A7770FCF135D0D1A78A9F87C718%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.981%201.781%20C%206.682%200.754%206.2530003%200.234%205.7200003%200.234%20C%205.551%200.234%205.46%200.36400002%205.46%200.611%20C%205.46%200.79300004%205.538%201.092%205.6940002%201.495%20C%206.214%202.9120002%206.474%203.848%206.474%204.329%20C%206.474%205.2390003%205.863%205.7460003%204.953%205.7460003%20C%204.186%205.7460003%203.523%205.408%202.99%204.719%20C%202.8860002%205.291%202.431%205.7460003%201.768%205.7460003%20C%201.04%205.7460003%200.754%205.07%200.572%204.485%20C%200.442%204.0690002%200.377%203.822%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.963%205.369%202.08%205.1870003%202.08%204.823%20C%202.08%204.6540003%202.015%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4430001%20-0.143%20C%201.69%20-0.143%201.872%20-0.013%201.963%200.24700001%20C%201.9890001%200.312%202.0670002%200.637%202.21%201.196%20L%202.483%202.3530002%20L%202.8730001%203.835%20C%203.016%204.1340003%203.237%204.433%203.51%204.745%20C%203.887%205.1610003%204.355%205.369%204.914%205.369%20C%205.343%205.369%205.551%205.083%205.551%204.524%20C%205.551%204.03%205.278%203.042%204.719%201.5600001%20C%204.6280003%201.326%204.589%201.131%204.589%200.962%20C%204.589%200.32500002%205.07%20-0.143%205.6940002%20-0.143%20C%206.2660003%20-0.143%206.721%200.18200001%207.046%200.832%20C%207.293%201.352%207.4230003%201.7030001%207.4230003%201.872%20C%207.4230003%201.9890001%207.3580003%202.0540001%207.215%202.0540001%20C%207.176%202.0540001%206.981%201.937%206.981%201.781%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g86111C2D5C8682C53BDA9AD6152C9992%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0829%203.8584%20C%201.3741001%203.8584%201.5925001%204.0768003%201.5925001%204.368%20C%201.5925001%204.6956%201.4196%204.8685%201.0829%204.8776%20C%201.2831%205.3053%201.7381%205.6511%202.3296%205.6511%20C%203.1304002%205.6511%203.6582003%205.0505004%203.6582003%204.2497%20C%203.6582003%203.8129%203.5035002%203.3943002%203.1850002%202.9848%20C%203.0303001%202.7755%202.9120002%202.6299002%202.8301%202.548%20L%200.67340004%200.4095%20C%200.5551%200.3003%200.5733%200.273%200.5733%200%20L%204.3225%200%20L%204.6046%201.7108%20L%204.2224%201.7108%20C%204.1587%201.2285%204.0859003%200.94640005%204.004%200.8827%20C%203.9585001%200.8554%203.6764002%200.83720005%203.1395001%200.83720005%20L%201.5925001%200.83720005%20C%202.2022002%201.3741001%202.7664%201.8564001%203.3033001%202.2841%20C%203.7128003%202.6026%204.004%202.8847%204.1860003%203.1304002%20C%204.459%203.4853%204.5955%203.8584%204.5955%204.2497%20C%204.5955%204.8139%204.3771%205.2598004%203.9312003%205.5874004%20C%203.5399%205.8877%203.0485%206.0424004%202.4661002%206.0424004%20C%201.9656001%206.0424004%201.5379001%205.8968%201.1648%205.6056004%20C%200.7735%205.2871003%200.5733%204.8867%200.5733%204.3953004%20C%200.5733%204.0859003%200.8008%203.8584%201.0829%203.8584%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g67EFC6A56ECEEA6CD53D2A781C7091DE%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.066%20-3.822%20C%201.911%20-3.1720002%202.6130002%20-2.21%203.1720002%20-0.92300004%20C%203.7050002%200.299%203.9780002%201.469%203.9780002%202.5740001%20L%203.9780002%203.926%20C%203.9780002%205.031%203.7050002%206.201%203.1720002%207.4230003%20C%202.6130002%208.71%201.911%209.672%201.066%2010.3220005%20C%201.053%2010.348001%201.014%2010.361%200.962%2010.361%20C%200.845%2010.361%200.78000003%2010.2960005%200.78000003%2010.179%20C%200.78000003%2010.114%200.806%2010.075%200.845%2010.036%20C%201.5730001%209.477%202.158%208.541%202.6000001%207.228%20C%202.977%206.097%203.1720002%205.005%203.1720002%203.926%20L%203.1720002%202.5740001%20C%203.1720002%201.495%202.977%200.403%202.6000001%20-0.72800004%20C%202.158%20-2.0410001%201.5730001%20-2.977%200.845%20-3.536%20C%200.806%20-3.575%200.78000003%20-3.614%200.78000003%20-3.6790001%20C%200.78000003%20-3.796%200.845%20-3.861%200.962%20-3.861%20C%201.014%20-3.861%201.053%20-3.848%201.066%20-3.822%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.7845363636363634em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; in some
clouds. For a cloud with a few hundred thousand points, that’s
completely untenable.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;filter-feeders&quot;&gt;Filter feeders&lt;&#x2F;h2&gt;
&lt;p&gt;The most natural solution to our construction time problem is to reduce
the size of our point clouds. There are many ways to do this, and the
simplest way is to just uniformly randomly sample points from the cloud
until we have the desired quantity. However, most methods provide few
guarantees about the quality of the sampled cloud. Ideally, we want to
downsample the cloud to reduce its density as much as possible; however,
we can’t downsample so much that we hallucinate a gap in the cloud and
produce an invalid plan. Accordingly, we’ll need a more intelligent
filtering scheme.&lt;&#x2F;p&gt;
&lt;p&gt;While we were thinking about filtering point clouds, we were also
thinking about efficient construction algorithms for the tree. One idea
we had played with was implicit representation for afforded sets. The
hope was that we could store less data while constructing the tree and
filter out affordance sets in &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2026.598000000000003%2021.878999999999998%22%20width%3D%2226.598000000000003pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD64B3975C9A5026604F20A029CCF2ADF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.984%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g71010E02B37BE1C0875AD8D94171F929%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.041%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g946CC60F6553DE6CBD049CD3C05E1499%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2821.541000000000004%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4D62189ABBC2948BAB13C269F5CB8E70%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD64B3975C9A5026604F20A029CCF2ADF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.126%203.4190001%20C%209.451%204.16%209.62%204.901%209.62%205.655%20C%209.62%206.669%209.321%207.501%208.71%208.1640005%20C%208.099%208.827001%207.293%209.165%206.2920003%209.165%20C%205.603%209.165%204.914%208.996%204.225%208.658%20C%202.821%207.9690003%201.794%206.8770003%201.131%205.395%20C%200.806%204.6670003%200.637%203.9390001%200.637%203.198%20C%200.637%202.171%200.936%201.339%201.547%200.689%20C%202.158%200.039%202.964%20-0.286%203.9780002%20-0.286%20C%204.6540003%20-0.286%205.33%20-0.117%206.019%200.208%20C%207.4360003%200.897%208.463%201.9760001%209.126%203.4190001%20Z%20M%208.372%206.162%20C%208.372%204.433%207.592%202.704%206.76%201.677%20C%206.188%200.962%205.2000003%200.156%204.056%200.156%20C%202.665%200.156%201.937%201.365%201.937%202.834%20C%201.937%203.289%202.028%203.9%202.197%204.6410003%20C%202.548%206.175%203.4320002%207.527%204.589%208.229%20C%205.1480002%208.567%205.6940002%208.736%206.214%208.736%20C%207.618%208.736%208.372%207.618%208.372%206.162%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g71010E02B37BE1C0875AD8D94171F929%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.1340003%20-3.224%20C%204.251%20-3.224%204.316%20-3.1590002%204.316%20-3.042%20C%204.316%20-3.003%204.29%20-2.951%204.251%20-2.8990002%20C%203.575%20-2.379%203.029%20-1.521%202.6260002%20-0.338%20C%202.275%200.689%202.093%201.7030001%202.093%202.704%20L%202.093%203.796%20C%202.093%204.797%202.275%205.8110003%202.6260002%206.8380003%20C%203.029%208.021%203.575%208.879%204.251%209.399%20C%204.29%209.438%204.316%209.49%204.316%209.542%20C%204.316%209.659%204.251%209.724%204.1340003%209.724%20C%204.1210003%209.724%204.0820003%209.711%204.043%209.685%20C%203.263%209.087%202.6130002%208.203%202.08%207.02%20C%201.5730001%205.889%201.3130001%204.823%201.3130001%203.796%20L%201.3130001%202.704%20C%201.3130001%201.677%201.5730001%200.611%202.08%20-0.52%20C%202.6130002%20-1.7030001%203.263%20-2.5870001%204.043%20-3.1850002%20C%204.0820003%20-3.211%204.1210003%20-3.224%204.1340003%20-3.224%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g946CC60F6553DE6CBD049CD3C05E1499%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.497%208.658%20C%202.964%208.112%202.184%207.839%201.1570001%207.839%20L%201.1570001%207.3320003%20C%201.8330001%207.3320003%202.392%207.4360003%202.821%207.644%20L%202.821%201.066%20C%202.821%200.832%202.769%200.676%202.652%200.611%20C%202.535%200.546%202.21%200.507%201.69%200.507%20L%201.235%200.507%20L%201.235%200%20C%201.5600001%200.026%202.262%200.039%203.341%200.039%20C%204.42%200.039%205.122%200.026%205.447%200%20L%205.447%200.507%20L%204.992%200.507%20C%204.459%200.507%204.1340003%200.546%204.03%200.611%20C%203.926%200.676%203.861%200.832%203.861%201.066%20L%203.861%208.268001%20C%203.861%208.58%203.835%208.658%203.497%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4D62189ABBC2948BAB13C269F5CB8E70%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.014%20-3.1850002%20C%201.794%20-2.5870001%202.444%20-1.7030001%202.977%20-0.52%20C%203.484%200.611%203.744%201.677%203.744%202.704%20L%203.744%203.796%20C%203.744%204.823%203.484%205.889%202.977%207.02%20C%202.444%208.203%201.794%209.087%201.014%209.685%20C%200.975%209.711%200.936%209.724%200.92300004%209.724%20C%200.806%209.724%200.741%209.659%200.741%209.542%20C%200.741%209.49%200.767%209.438%200.806%209.399%20C%201.482%208.879%202.028%208.021%202.431%206.8380003%20C%202.782%205.8110003%202.964%204.797%202.964%203.796%20L%202.964%202.704%20C%202.964%201.7030001%202.782%200.689%202.431%20-0.338%20C%202.028%20-1.521%201.482%20-2.379%200.806%20-2.8990002%20C%200.767%20-2.951%200.741%20-3.003%200.741%20-3.042%20C%200.741%20-3.1590002%200.806%20-3.224%200.92300004%20-3.224%20C%200.936%20-3.224%200.975%20-3.211%201.014%20-3.1850002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.418em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; time. One such approach used
segments of a space-filling curve to represent sets of points, which
would hopefully have allowed us to slice up affordance sets much more
efficiently.&lt;&#x2F;p&gt;
&lt;p&gt;Unfortunately for us, that approach never worked out, and so we were
stuck with our bad construction times. However, we still had the idea of
space-filling curves on our mind when we were thinking about filtering
the point cloud. How could we use a space filling curve to filter out
point clouds more efficiently?&lt;&#x2F;p&gt;
&lt;p&gt;I’ll start with a simple example. Suppose we have a list of points in
one-dimensional space; that is, a list of real numbers, and we want to
filter it to reduce its density, but still preserve the areas where
points are in collision. In particular, we might want to make sure that
if some point &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.734%2021.878999999999998%22%20width%3D%226.734pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g254AE47CC15CC81C004457B9506AF3F3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g254AE47CC15CC81C004457B9506AF3F3%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.6150002%205.7460003%20C%204.043%205.7460003%203.497%205.447%202.964%204.849%20C%202.821%205.447%202.418%205.7460003%201.781%205.7460003%20C%201.248%205.7460003%200.85800004%205.317%200.58500004%204.472%20C%200.455%204.043%200.39000002%203.796%200.39000002%203.7180002%20C%200.39000002%203.601%200.455%203.536%200.598%203.536%20C%200.663%203.536%200.702%203.549%200.741%203.575%20C%200.806%203.6920002%200.845%203.783%200.85800004%203.874%20C%201.092%204.862%201.391%205.356%201.742%205.356%20C%201.9760001%205.356%202.093%205.1740003%202.093%204.823%20C%202.093%204.6280003%202.0670002%204.407%202.002%204.173%20L%200.572%20-1.534%20C%200.455%20-1.963%200.442%20-2.015%20-0.065%20-2.015%20C%20-0.299%20-2.015%20-0.416%20-2.119%20-0.416%20-2.3140001%20C%20-0.416%20-2.457%20-0.338%20-2.522%20-0.19500001%20-2.522%20C%200%20-2.522%200.676%20-2.483%200.871%20-2.483%20C%201.118%20-2.483%201.898%20-2.522%202.145%20-2.522%20C%202.3400002%20-2.522%202.431%20-2.418%202.431%20-2.21%20C%202.431%20-2.08%202.3140001%20-2.015%202.0670002%20-2.015%20C%201.8330001%20-2.015%201.482%20-2.028%201.482%20-1.872%20C%201.482%20-1.7030001%202.015%200.338%202.0670002%200.559%20C%202.3270001%200.078%202.717%20-0.169%203.237%20-0.169%20C%204.0820003%20-0.169%204.823%200.26%205.473%201.131%20C%206.071%201.924%206.3700004%202.769%206.3700004%203.64%20C%206.3700004%204.771%205.6940002%205.7460003%204.6150002%205.7460003%20Z%20M%204.576%205.356%20C%205.083%205.356%205.343%204.966%205.343%204.199%20C%205.343%203.848%205.2650003%203.38%205.122%202.795%20C%204.823%201.664%204.446%200.92300004%203.9910002%200.546%20C%203.7180002%200.32500002%203.471%200.208%203.224%200.208%20C%202.8470001%200.208%202.5870001%200.377%202.444%200.72800004%20C%202.3270001%201.001%202.262%201.196%202.262%201.3000001%20L%202.925%204.017%20C%202.99%204.303%203.224%204.602%203.588%204.901%20C%203.9520001%205.2000003%204.277%205.356%204.576%205.356%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6121818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; is removed, there exists another point &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2012.011999999999999%2021.878999999999998%22%20width%3D%2212.011999999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g254AE47CC15CC81C004457B9506AF3F3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.734%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB088DC7F7297C1991F438D2FEFFE9718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g254AE47CC15CC81C004457B9506AF3F3%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.6150002%205.7460003%20C%204.043%205.7460003%203.497%205.447%202.964%204.849%20C%202.821%205.447%202.418%205.7460003%201.781%205.7460003%20C%201.248%205.7460003%200.85800004%205.317%200.58500004%204.472%20C%200.455%204.043%200.39000002%203.796%200.39000002%203.7180002%20C%200.39000002%203.601%200.455%203.536%200.598%203.536%20C%200.663%203.536%200.702%203.549%200.741%203.575%20C%200.806%203.6920002%200.845%203.783%200.85800004%203.874%20C%201.092%204.862%201.391%205.356%201.742%205.356%20C%201.9760001%205.356%202.093%205.1740003%202.093%204.823%20C%202.093%204.6280003%202.0670002%204.407%202.002%204.173%20L%200.572%20-1.534%20C%200.455%20-1.963%200.442%20-2.015%20-0.065%20-2.015%20C%20-0.299%20-2.015%20-0.416%20-2.119%20-0.416%20-2.3140001%20C%20-0.416%20-2.457%20-0.338%20-2.522%20-0.19500001%20-2.522%20C%200%20-2.522%200.676%20-2.483%200.871%20-2.483%20C%201.118%20-2.483%201.898%20-2.522%202.145%20-2.522%20C%202.3400002%20-2.522%202.431%20-2.418%202.431%20-2.21%20C%202.431%20-2.08%202.3140001%20-2.015%202.0670002%20-2.015%20C%201.8330001%20-2.015%201.482%20-2.028%201.482%20-1.872%20C%201.482%20-1.7030001%202.015%200.338%202.0670002%200.559%20C%202.3270001%200.078%202.717%20-0.169%203.237%20-0.169%20C%204.0820003%20-0.169%204.823%200.26%205.473%201.131%20C%206.071%201.924%206.3700004%202.769%206.3700004%203.64%20C%206.3700004%204.771%205.6940002%205.7460003%204.6150002%205.7460003%20Z%20M%204.576%205.356%20C%205.083%205.356%205.343%204.966%205.343%204.199%20C%205.343%203.848%205.2650003%203.38%205.122%202.795%20C%204.823%201.664%204.446%200.92300004%203.9910002%200.546%20C%203.7180002%200.32500002%203.471%200.208%203.224%200.208%20C%202.8470001%200.208%202.5870001%200.377%202.444%200.72800004%20C%202.3270001%201.001%202.262%201.196%202.262%201.3000001%20L%202.925%204.017%20C%202.99%204.303%203.224%204.602%203.588%204.901%20C%203.9520001%205.2000003%204.277%205.356%204.576%205.356%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB088DC7F7297C1991F438D2FEFFE9718%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.0930002%202.5935001%20L%201.0465001%203.3488002%20C%200.90090007%203.4671001%200.6916%203.4034002%200.6006%203.2487001%20C%200.50960004%203.094%200.56420004%202.8756%200.72800004%202.8028002%20L%201.9110001%202.275%20L%200.72800004%201.7563001%20C%200.56420004%201.6835%200.50960004%201.4651%200.6006%201.3104%20C%200.6916%201.1557001%200.90090007%201.092%201.0465001%201.2012%20L%202.0930002%201.9656001%20L%201.9565%200.6825%20C%201.9383001%200.49140003%202.1021001%200.3458%202.275%200.3458%20C%202.4479%200.3458%202.6117%200.49140003%202.5935001%200.6825%20L%202.457%201.9656001%20L%203.5035002%201.2012%20C%203.6582003%201.092%203.8584%201.1557001%203.9494002%201.3104%20C%204.0404%201.4651%203.9858003%201.6835%203.8220003%201.7563001%20L%202.6390002%202.275%20L%203.8220003%202.8028002%20C%203.9858003%202.8756%204.0404%203.094%203.9494002%203.2487001%20C%203.8584%203.4034002%203.6491%203.4671001%203.5035002%203.3488002%20L%202.457%202.5935001%20L%202.5935001%203.8766003%20C%202.6117%204.0586%202.4479%204.2133%202.275%204.2133%20C%202.1021001%204.2133%201.9383001%204.0586%201.9565%203.8766003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.0919999999999999em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; which
was &lt;em&gt;not&lt;&#x2F;em&gt; removed, such that &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2041.86577777777777%2021.878999999999998%22%20width%3D%2241.86577777777777pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g17AF90F25DACF254827E59F8A3A9E6D4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%283.6140000000000003%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g254AE47CC15CC81C004457B9506AF3F3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.347999999999999%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB088DC7F7297C1991F438D2FEFFE9718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2818.514888888888887%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9B4A74A66763B268E0058C1DD08B5046%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2831.517777777777773%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g254AE47CC15CC81C004457B9506AF3F3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2838.251777777777775%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g17AF90F25DACF254827E59F8A3A9E6D4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g17AF90F25DACF254827E59F8A3A9E6D4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.807%20-3.25%20C%201.9760001%20-3.25%202.0670002%20-3.1460001%202.0670002%20-2.938%20L%202.0670002%209.438%20C%202.0670002%209.646%201.9760001%209.75%201.807%209.75%20C%201.638%209.75%201.547%209.646%201.547%209.438%20L%201.547%20-2.938%20C%201.547%20-3.1460001%201.638%20-3.25%201.807%20-3.25%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g254AE47CC15CC81C004457B9506AF3F3%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.6150002%205.7460003%20C%204.043%205.7460003%203.497%205.447%202.964%204.849%20C%202.821%205.447%202.418%205.7460003%201.781%205.7460003%20C%201.248%205.7460003%200.85800004%205.317%200.58500004%204.472%20C%200.455%204.043%200.39000002%203.796%200.39000002%203.7180002%20C%200.39000002%203.601%200.455%203.536%200.598%203.536%20C%200.663%203.536%200.702%203.549%200.741%203.575%20C%200.806%203.6920002%200.845%203.783%200.85800004%203.874%20C%201.092%204.862%201.391%205.356%201.742%205.356%20C%201.9760001%205.356%202.093%205.1740003%202.093%204.823%20C%202.093%204.6280003%202.0670002%204.407%202.002%204.173%20L%200.572%20-1.534%20C%200.455%20-1.963%200.442%20-2.015%20-0.065%20-2.015%20C%20-0.299%20-2.015%20-0.416%20-2.119%20-0.416%20-2.3140001%20C%20-0.416%20-2.457%20-0.338%20-2.522%20-0.19500001%20-2.522%20C%200%20-2.522%200.676%20-2.483%200.871%20-2.483%20C%201.118%20-2.483%201.898%20-2.522%202.145%20-2.522%20C%202.3400002%20-2.522%202.431%20-2.418%202.431%20-2.21%20C%202.431%20-2.08%202.3140001%20-2.015%202.0670002%20-2.015%20C%201.8330001%20-2.015%201.482%20-2.028%201.482%20-1.872%20C%201.482%20-1.7030001%202.015%200.338%202.0670002%200.559%20C%202.3270001%200.078%202.717%20-0.169%203.237%20-0.169%20C%204.0820003%20-0.169%204.823%200.26%205.473%201.131%20C%206.071%201.924%206.3700004%202.769%206.3700004%203.64%20C%206.3700004%204.771%205.6940002%205.7460003%204.6150002%205.7460003%20Z%20M%204.576%205.356%20C%205.083%205.356%205.343%204.966%205.343%204.199%20C%205.343%203.848%205.2650003%203.38%205.122%202.795%20C%204.823%201.664%204.446%200.92300004%203.9910002%200.546%20C%203.7180002%200.32500002%203.471%200.208%203.224%200.208%20C%202.8470001%200.208%202.5870001%200.377%202.444%200.72800004%20C%202.3270001%201.001%202.262%201.196%202.262%201.3000001%20L%202.925%204.017%20C%202.99%204.303%203.224%204.602%203.588%204.901%20C%203.9520001%205.2000003%204.277%205.356%204.576%205.356%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB088DC7F7297C1991F438D2FEFFE9718%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.0930002%202.5935001%20L%201.0465001%203.3488002%20C%200.90090007%203.4671001%200.6916%203.4034002%200.6006%203.2487001%20C%200.50960004%203.094%200.56420004%202.8756%200.72800004%202.8028002%20L%201.9110001%202.275%20L%200.72800004%201.7563001%20C%200.56420004%201.6835%200.50960004%201.4651%200.6006%201.3104%20C%200.6916%201.1557001%200.90090007%201.092%201.0465001%201.2012%20L%202.0930002%201.9656001%20L%201.9565%200.6825%20C%201.9383001%200.49140003%202.1021001%200.3458%202.275%200.3458%20C%202.4479%200.3458%202.6117%200.49140003%202.5935001%200.6825%20L%202.457%201.9656001%20L%203.5035002%201.2012%20C%203.6582003%201.092%203.8584%201.1557001%203.9494002%201.3104%20C%204.0404%201.4651%203.9858003%201.6835%203.8220003%201.7563001%20L%202.6390002%202.275%20L%203.8220003%202.8028002%20C%203.9858003%202.8756%204.0404%203.094%203.9494002%203.2487001%20C%203.8584%203.4034002%203.6491%203.4671001%203.5035002%203.3488002%20L%202.457%202.5935001%20L%202.5935001%203.8766003%20C%202.6117%204.0586%202.4479%204.2133%202.275%204.2133%20C%202.1021001%204.2133%201.9383001%204.0586%201.9565%203.8766003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9B4A74A66763B268E0058C1DD08B5046%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%203.51%20L%201.04%203.51%20C%200.832%203.51%200.72800004%203.4190001%200.72800004%203.25%20C%200.72800004%203.081%200.832%202.99%201.04%202.99%20L%209.074%202.99%20C%209.282001%202.99%209.386001%203.081%209.386001%203.25%20C%209.386001%203.4060001%209.2300005%203.51%209.074%203.51%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.8059797979797976em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; is less than some radius
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2025.582699999999996%2021.878999999999998%22%20width%3D%2225.582699999999996pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.863%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD93F142C9BA9F4E93A6D76F7A2520C37%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3C402A3AAC495DD2DB174F02BB0D7DF0%22%20x%3D%222.7845999999999997%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFF6C4DA083ADFAFB7235B8E13CB560D4%22%20x%3D%225.314399999999999%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC5B71332A0E90E792E3FAAE3C83A1E5A%22%20x%3D%227.844199999999999%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC7B831D67B171949CBAF4695C0217943%22%20x%3D%2211.384099999999998%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3BD2AAC8F92468FB204CF6E7AF8DFF03%22%20x%3D%2215.424499999999998%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD93F142C9BA9F4E93A6D76F7A2520C37%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.4115002%206.4155%20C%201.6016%206.4155%201.001%205.7603%201.001%204.9504004%20L%201.001%203.9494002%20L%200.3003%203.9494002%20L%200.3003%203.6036003%20L%201.001%203.6036003%20L%201.001%200.7189%20C%201.001%200.546%200.97370005%200.4368%200.91%200.4004%20C%200.8463%200.36400002%200.64610004%200.3549%200.30940002%200.3549%20L%200.30940002%200%20L%201.3559%200.0273%20C%201.7381%200.0364%202.1294%200.0273%202.5207002%200%20L%202.5207002%200.3549%20L%202.3023%200.3549%20C%202.002%200.3549%201.8109001%200.3731%201.7472%200.41860002%20C%201.6835%200.46410003%201.6562%200.5733%201.6562%200.7371%20L%201.6562%203.6036003%20L%202.6754%203.6036003%20L%202.6754%203.9494002%20L%201.6289%203.9494002%20L%201.6289%204.9595003%20C%201.6289%205.5055003%201.9110001%206.1425004%202.4115002%206.1425004%20C%202.4843001%206.1425004%202.548%206.1334004%202.6117%206.1152%20C%202.4752002%206.0424004%202.4024%205.9150004%202.4024%205.7421002%20C%202.4024%205.46%202.5389001%205.3144%202.821%205.3144%20C%203.1031%205.3144%203.2487001%205.46%203.2487001%205.7512%20C%203.2487001%206.1607003%202.821%206.4155%202.4115002%206.4155%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3C402A3AAC495DD2DB174F02BB0D7DF0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.7654%205.4691%20C%201.7654%205.7421002%201.5379001%205.9787%201.2649001%205.9787%20C%200.9919%205.9787%200.75530005%205.7421002%200.75530005%205.4691%20C%200.75530005%205.1961%200.98280007%204.9504004%201.2558%204.9504004%20C%201.5379001%204.9504004%201.7654%205.1870003%201.7654%205.4691%20Z%20M%201.3013%200.0273%20L%202.2477%200%20L%202.2477%200.3549%20C%201.9474001%200.3549%201.7654%200.3731%201.7108%200.4095%20C%201.6562%200.44590002%201.638%200.546%201.638%200.7098%20L%201.638%204.0495%20L%200.33670002%203.9403002%20L%200.33670002%203.5945%20C%200.637%203.5945%200.8281%203.5672002%200.89180005%203.5217001%20C%200.95550007%203.4762%200.98280007%203.3488002%200.98280007%203.1395001%20L%200.98280007%200.7189%20C%200.98280007%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3549%200.3003%200.3549%20L%200.3003%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gFF6C4DA083ADFAFB7235B8E13CB560D4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.3104%200.0273%20L%202.3205001%200%20L%202.3205001%200.3549%20C%201.9929001%200.3549%201.7927%200.36400002%201.7290001%200.4004%20C%201.6653%200.4368%201.638%200.546%201.638%200.7189%20L%201.638%206.3154%20L%200.3003%206.2153%20L%200.3003%205.8695%20C%200.61880004%205.8695%200.819%205.8422003%200.8827%205.7876%20C%200.94640005%205.7330003%200.98280007%205.6056004%200.98280007%205.3963003%20L%200.98280007%200.7189%20C%200.98280007%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3549%200.3003%200.3549%20L%200.3003%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC5B71332A0E90E792E3FAAE3C83A1E5A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.0212002%201.1466%20L%203.0212002%201.6926%20L%202.73%201.6926%20L%202.73%201.1648%20C%202.73%200.7098%202.5662%200.2002%202.1658%200.2002%20C%201.7927%200.2002%201.6107%200.50960004%201.6107%201.1284001%20L%201.6107%203.5945%20L%202.8756%203.5945%20L%202.8756%203.9403002%20L%201.6107%203.9403002%20L%201.6107%205.5965004%20L%201.3195001%205.5965004%20C%201.3104%205.2962003%201.2831%205.0323%201.2194%204.7957%20C%201.0647%204.1951003%200.7098%203.8857002%200.1729%203.8584%20L%200.1729%203.5945%20L%200.92820007%203.5945%20L%200.92820007%201.1466%20C%200.92820007%200.6097%201.092%200.2639%201.4105%200.091000006%20C%201.6562%20-0.0364%201.8837001%20-0.1001%202.1112%20-0.1001%20C%202.7118%20-0.1001%203.0212002%200.5005%203.0212002%201.1466%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC7B831D67B171949CBAF4695C0217943%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.7765002%202.2841%20C%203.7765002%203.3306%203.1668%204.0768003%202.1476002%204.0768003%20C%201.6016%204.0768003%201.1466%203.8675%200.7735%203.4398%20C%200.4277%203.0394%200.25480002%202.5571%200.25480002%202.002%20C%200.25480002%201.4287001%200.44590002%200.94640005%200.8281%200.5278%20C%201.2103001%200.1092%201.6835%20-0.1001%202.2477%20-0.1001%20C%202.7664%20-0.1001%203.1668%200.0819%203.4398%200.4368%20C%203.6673002%200.7371%203.7765002%200.95550007%203.7765002%201.1011001%20C%203.7765002%201.1921%203.7219002%201.2376001%203.6218002%201.2376001%20C%203.5490003%201.2376001%203.5035002%201.1921%203.4762%201.092%20C%203.276%200.49140003%202.8847%200.1911%202.3023%200.1911%20C%201.8928001%200.1911%201.5743%200.3822%201.3286%200.7735%20C%201.1557001%201.0556%201.0738001%201.4833001%201.0647%202.0657%20L%203.5217001%202.0657%20C%203.7219002%202.0657%203.7765002%202.0839%203.7765002%202.2841%20Z%20M%202.9666002%203.1759002%20C%203.0667002%202.8756%203.1122%202.5844002%203.1122%202.3205001%20L%201.0738001%202.3205001%20C%201.1011001%202.9211001%201.2558%203.3306%201.5288%203.5399%20C%201.7563001%203.7219002%201.9565%203.8129%202.1476002%203.8129%20C%202.5571%203.8129%202.8301%203.6036003%202.9666002%203.1759002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3BD2AAC8F92468FB204CF6E7AF8DFF03%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.3124%203.4398%20C%203.3124%203.7947001%202.9757001%204.0222%202.6208%204.0222%20C%202.1567001%204.0222%201.8018001%203.7492%201.5652001%203.1941001%20L%201.5652001%204.0222%20L%200.25480002%203.9221%20L%200.25480002%203.5763001%20C%200.5733%203.5763001%200.7644%203.5490003%200.83720005%203.4944%20C%200.91%203.4398%200.94640005%203.3215%200.94640005%203.1122%20L%200.94640005%200.7189%20C%200.94640005%200.546%200.91910005%200.4368%200.8554%200.4004%20C%200.7917%200.36400002%200.59150004%200.3458%200.25480002%200.3458%20L%200.25480002%200%20L%201.3013%200.0273%20C%201.6835%200.0364%202.0748%200.0273%202.4661002%200%20L%202.4661002%200.3458%20L%202.2477%200.3458%20C%201.9474001%200.3458%201.7563001%200.3731%201.6926%200.41860002%20C%201.6289%200.46410003%201.6016%200.5733%201.6016%200.7371%20L%201.6016%202.1112%20C%201.6016%202.5025%201.6744001%202.8574002%201.8109001%203.1577%20C%201.9929001%203.5490003%202.2568002%203.7492%202.6117%203.7583%20C%202.5207002%203.6673002%202.4752002%203.5581002%202.4752002%203.4307%20C%202.4752002%203.1486%202.6117%203.0121002%202.8938%203.0121002%20C%203.1395001%203.0121002%203.3124%203.2032%203.3124%203.4398%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.3256999999999994em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;. In that case, filtering our list of points would be
easy: we sort the points in order, then remove one of every adjacent
pair &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2028.868666666666666%2021.878999999999998%22%20width%3D%2228.868666666666666pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g71010E02B37BE1C0875AD8D94171F929%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.057%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g254AE47CC15CC81C004457B9506AF3F3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2811.790999999999999%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA5EFA28F31DFDD7E2EC069AC1C132FF5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2817.571666666666665%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6A208F06AFBAFAF073B075C8F410C8CA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2823.811666666666664%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4D62189ABBC2948BAB13C269F5CB8E70%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g71010E02B37BE1C0875AD8D94171F929%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.1340003%20-3.224%20C%204.251%20-3.224%204.316%20-3.1590002%204.316%20-3.042%20C%204.316%20-3.003%204.29%20-2.951%204.251%20-2.8990002%20C%203.575%20-2.379%203.029%20-1.521%202.6260002%20-0.338%20C%202.275%200.689%202.093%201.7030001%202.093%202.704%20L%202.093%203.796%20C%202.093%204.797%202.275%205.8110003%202.6260002%206.8380003%20C%203.029%208.021%203.575%208.879%204.251%209.399%20C%204.29%209.438%204.316%209.49%204.316%209.542%20C%204.316%209.659%204.251%209.724%204.1340003%209.724%20C%204.1210003%209.724%204.0820003%209.711%204.043%209.685%20C%203.263%209.087%202.6130002%208.203%202.08%207.02%20C%201.5730001%205.889%201.3130001%204.823%201.3130001%203.796%20L%201.3130001%202.704%20C%201.3130001%201.677%201.5730001%200.611%202.08%20-0.52%20C%202.6130002%20-1.7030001%203.263%20-2.5870001%204.043%20-3.1850002%20C%204.0820003%20-3.211%204.1210003%20-3.224%204.1340003%20-3.224%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g254AE47CC15CC81C004457B9506AF3F3%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.6150002%205.7460003%20C%204.043%205.7460003%203.497%205.447%202.964%204.849%20C%202.821%205.447%202.418%205.7460003%201.781%205.7460003%20C%201.248%205.7460003%200.85800004%205.317%200.58500004%204.472%20C%200.455%204.043%200.39000002%203.796%200.39000002%203.7180002%20C%200.39000002%203.601%200.455%203.536%200.598%203.536%20C%200.663%203.536%200.702%203.549%200.741%203.575%20C%200.806%203.6920002%200.845%203.783%200.85800004%203.874%20C%201.092%204.862%201.391%205.356%201.742%205.356%20C%201.9760001%205.356%202.093%205.1740003%202.093%204.823%20C%202.093%204.6280003%202.0670002%204.407%202.002%204.173%20L%200.572%20-1.534%20C%200.455%20-1.963%200.442%20-2.015%20-0.065%20-2.015%20C%20-0.299%20-2.015%20-0.416%20-2.119%20-0.416%20-2.3140001%20C%20-0.416%20-2.457%20-0.338%20-2.522%20-0.19500001%20-2.522%20C%200%20-2.522%200.676%20-2.483%200.871%20-2.483%20C%201.118%20-2.483%201.898%20-2.522%202.145%20-2.522%20C%202.3400002%20-2.522%202.431%20-2.418%202.431%20-2.21%20C%202.431%20-2.08%202.3140001%20-2.015%202.0670002%20-2.015%20C%201.8330001%20-2.015%201.482%20-2.028%201.482%20-1.872%20C%201.482%20-1.7030001%202.015%200.338%202.0670002%200.559%20C%202.3270001%200.078%202.717%20-0.169%203.237%20-0.169%20C%204.0820003%20-0.169%204.823%200.26%205.473%201.131%20C%206.071%201.924%206.3700004%202.769%206.3700004%203.64%20C%206.3700004%204.771%205.6940002%205.7460003%204.6150002%205.7460003%20Z%20M%204.576%205.356%20C%205.083%205.356%205.343%204.966%205.343%204.199%20C%205.343%203.848%205.2650003%203.38%205.122%202.795%20C%204.823%201.664%204.446%200.92300004%203.9910002%200.546%20C%203.7180002%200.32500002%203.471%200.208%203.224%200.208%20C%202.8470001%200.208%202.5870001%200.377%202.444%200.72800004%20C%202.3270001%201.001%202.262%201.196%202.262%201.3000001%20L%202.925%204.017%20C%202.99%204.303%203.224%204.602%203.588%204.901%20C%203.9520001%205.2000003%204.277%205.356%204.576%205.356%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA5EFA28F31DFDD7E2EC069AC1C132FF5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.807%201.378%20C%201.391%201.378%201.118%201.066%201.118%200.65000004%20C%201.118%200.26%201.417%20-0.065%201.807%20-0.065%20C%201.9890001%20-0.065%202.145%20-0.013%202.262%200.104%20L%202.275%200%20C%202.275%20-0.819%202.002%20-1.521%201.4560001%20-2.08%20C%201.365%20-2.184%201.3130001%20-2.262%201.3130001%20-2.3140001%20C%201.3130001%20-2.444%201.365%20-2.509%201.482%20-2.509%20C%201.599%20-2.509%201.755%20-2.3530002%201.9760001%20-2.0540001%20C%202.418%20-1.4300001%202.639%20-0.741%202.639%200%20C%202.639%200.689%202.405%201.378%201.807%201.378%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6A208F06AFBAFAF073B075C8F410C8CA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.836%204.901%20C%204.576%205.46%204.173%205.7460003%203.64%205.7460003%20C%202.795%205.7460003%202.0540001%205.317%201.417%204.446%20C%200.819%203.64%200.52%202.808%200.52%201.937%20C%200.52%200.806%201.1700001%20-0.169%202.249%20-0.169%20C%202.717%20-0.169%203.1850002%200.052%203.6660001%200.49400002%20L%203.1330001%20-1.638%20C%203.094%20-1.8330001%202.977%20-1.95%202.795%20-1.9890001%20C%202.73%20-2.002%202.561%20-2.015%202.262%20-2.015%20C%202.184%20-2.028%202.132%20-2.028%202.106%20-2.028%20C%201.9890001%20-2.0410001%201.924%20-2.145%201.924%20-2.3270001%20L%201.924%20-2.379%20C%201.963%20-2.47%202.0410001%20-2.522%202.145%20-2.522%20C%202.392%20-2.522%203.1720002%20-2.483%203.4190001%20-2.483%20C%203.6660001%20-2.483%204.485%20-2.522%204.732%20-2.522%20C%204.914%20-2.522%205.005%20-2.418%205.005%20-2.21%20C%205.005%20-2.08%204.875%20-2.015%204.6280003%20-2.015%20C%204.394%20-2.015%204.0690002%20-2.028%204.0690002%20-1.872%20C%204.0690002%20-1.82%204.0820003%20-1.7290001%204.1210003%20-1.599%20L%205.876%205.551%20C%205.876%205.668%205.8110003%205.7330003%205.6940002%205.7330003%20C%205.46%205.7330003%204.966%205.083%204.836%204.901%20Z%20M%204.42%204.849%20C%204.537%204.576%204.602%204.394%204.602%204.277%20C%204.602%204.264%204.589%204.186%204.563%204.0690002%20L%204.251%202.808%20C%204.004%201.872%203.887%201.391%203.874%201.365%20C%203.627%200.91%202.9120002%200.208%202.288%200.208%20C%201.781%200.208%201.521%200.598%201.521%201.365%20C%201.521%201.963%201.924%203.4190001%202.106%203.9%20C%202.3530002%204.511%202.925%205.356%203.64%205.356%20C%203.9910002%205.356%204.251%205.1870003%204.42%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4D62189ABBC2948BAB13C269F5CB8E70%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.014%20-3.1850002%20C%201.794%20-2.5870001%202.444%20-1.7030001%202.977%20-0.52%20C%203.484%200.611%203.744%201.677%203.744%202.704%20L%203.744%203.796%20C%203.744%204.823%203.484%205.889%202.977%207.02%20C%202.444%208.203%201.794%209.087%201.014%209.685%20C%200.975%209.711%200.936%209.724%200.92300004%209.724%20C%200.806%209.724%200.741%209.659%200.741%209.542%20C%200.741%209.49%200.767%209.438%200.806%209.399%20C%201.482%208.879%202.028%208.021%202.431%206.8380003%20C%202.782%205.8110003%202.964%204.797%202.964%203.796%20L%202.964%202.704%20C%202.964%201.7030001%202.782%200.689%202.431%20-0.338%20C%202.028%20-1.521%201.482%20-2.379%200.806%20-2.8990002%20C%200.767%20-2.951%200.741%20-3.003%200.741%20-3.042%20C%200.741%20-3.1590002%200.806%20-3.224%200.92300004%20-3.224%20C%200.936%20-3.224%200.975%20-3.211%201.014%20-3.1850002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.6244242424242423em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; if &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2079.0127%2021.878999999999998%22%20width%3D%2279.0127pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g17AF90F25DACF254827E59F8A3A9E6D4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%283.6140000000000003%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g254AE47CC15CC81C004457B9506AF3F3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2813.236888888888888%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9B4A74A66763B268E0058C1DD08B5046%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2826.239777777777775%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6A208F06AFBAFAF073B075C8F410C8CA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2832.47977777777778%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g17AF90F25DACF254827E59F8A3A9E6D4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2839.70488888888888%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB96EBFBEC04ED47E748D0E97A693AB26%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2853.43%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2859.29299999999999%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD93F142C9BA9F4E93A6D76F7A2520C37%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3C402A3AAC495DD2DB174F02BB0D7DF0%22%20x%3D%222.7845999999999997%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFF6C4DA083ADFAFB7235B8E13CB560D4%22%20x%3D%225.314399999999999%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC5B71332A0E90E792E3FAAE3C83A1E5A%22%20x%3D%227.844199999999999%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC7B831D67B171949CBAF4695C0217943%22%20x%3D%2211.384099999999998%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3BD2AAC8F92468FB204CF6E7AF8DFF03%22%20x%3D%2215.424499999999998%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g17AF90F25DACF254827E59F8A3A9E6D4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.807%20-3.25%20C%201.9760001%20-3.25%202.0670002%20-3.1460001%202.0670002%20-2.938%20L%202.0670002%209.438%20C%202.0670002%209.646%201.9760001%209.75%201.807%209.75%20C%201.638%209.75%201.547%209.646%201.547%209.438%20L%201.547%20-2.938%20C%201.547%20-3.1460001%201.638%20-3.25%201.807%20-3.25%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g254AE47CC15CC81C004457B9506AF3F3%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.6150002%205.7460003%20C%204.043%205.7460003%203.497%205.447%202.964%204.849%20C%202.821%205.447%202.418%205.7460003%201.781%205.7460003%20C%201.248%205.7460003%200.85800004%205.317%200.58500004%204.472%20C%200.455%204.043%200.39000002%203.796%200.39000002%203.7180002%20C%200.39000002%203.601%200.455%203.536%200.598%203.536%20C%200.663%203.536%200.702%203.549%200.741%203.575%20C%200.806%203.6920002%200.845%203.783%200.85800004%203.874%20C%201.092%204.862%201.391%205.356%201.742%205.356%20C%201.9760001%205.356%202.093%205.1740003%202.093%204.823%20C%202.093%204.6280003%202.0670002%204.407%202.002%204.173%20L%200.572%20-1.534%20C%200.455%20-1.963%200.442%20-2.015%20-0.065%20-2.015%20C%20-0.299%20-2.015%20-0.416%20-2.119%20-0.416%20-2.3140001%20C%20-0.416%20-2.457%20-0.338%20-2.522%20-0.19500001%20-2.522%20C%200%20-2.522%200.676%20-2.483%200.871%20-2.483%20C%201.118%20-2.483%201.898%20-2.522%202.145%20-2.522%20C%202.3400002%20-2.522%202.431%20-2.418%202.431%20-2.21%20C%202.431%20-2.08%202.3140001%20-2.015%202.0670002%20-2.015%20C%201.8330001%20-2.015%201.482%20-2.028%201.482%20-1.872%20C%201.482%20-1.7030001%202.015%200.338%202.0670002%200.559%20C%202.3270001%200.078%202.717%20-0.169%203.237%20-0.169%20C%204.0820003%20-0.169%204.823%200.26%205.473%201.131%20C%206.071%201.924%206.3700004%202.769%206.3700004%203.64%20C%206.3700004%204.771%205.6940002%205.7460003%204.6150002%205.7460003%20Z%20M%204.576%205.356%20C%205.083%205.356%205.343%204.966%205.343%204.199%20C%205.343%203.848%205.2650003%203.38%205.122%202.795%20C%204.823%201.664%204.446%200.92300004%203.9910002%200.546%20C%203.7180002%200.32500002%203.471%200.208%203.224%200.208%20C%202.8470001%200.208%202.5870001%200.377%202.444%200.72800004%20C%202.3270001%201.001%202.262%201.196%202.262%201.3000001%20L%202.925%204.017%20C%202.99%204.303%203.224%204.602%203.588%204.901%20C%203.9520001%205.2000003%204.277%205.356%204.576%205.356%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9B4A74A66763B268E0058C1DD08B5046%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%203.51%20L%201.04%203.51%20C%200.832%203.51%200.72800004%203.4190001%200.72800004%203.25%20C%200.72800004%203.081%200.832%202.99%201.04%202.99%20L%209.074%202.99%20C%209.282001%202.99%209.386001%203.081%209.386001%203.25%20C%209.386001%203.4060001%209.2300005%203.51%209.074%203.51%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6A208F06AFBAFAF073B075C8F410C8CA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.836%204.901%20C%204.576%205.46%204.173%205.7460003%203.64%205.7460003%20C%202.795%205.7460003%202.0540001%205.317%201.417%204.446%20C%200.819%203.64%200.52%202.808%200.52%201.937%20C%200.52%200.806%201.1700001%20-0.169%202.249%20-0.169%20C%202.717%20-0.169%203.1850002%200.052%203.6660001%200.49400002%20L%203.1330001%20-1.638%20C%203.094%20-1.8330001%202.977%20-1.95%202.795%20-1.9890001%20C%202.73%20-2.002%202.561%20-2.015%202.262%20-2.015%20C%202.184%20-2.028%202.132%20-2.028%202.106%20-2.028%20C%201.9890001%20-2.0410001%201.924%20-2.145%201.924%20-2.3270001%20L%201.924%20-2.379%20C%201.963%20-2.47%202.0410001%20-2.522%202.145%20-2.522%20C%202.392%20-2.522%203.1720002%20-2.483%203.4190001%20-2.483%20C%203.6660001%20-2.483%204.485%20-2.522%204.732%20-2.522%20C%204.914%20-2.522%205.005%20-2.418%205.005%20-2.21%20C%205.005%20-2.08%204.875%20-2.015%204.6280003%20-2.015%20C%204.394%20-2.015%204.0690002%20-2.028%204.0690002%20-1.872%20C%204.0690002%20-1.82%204.0820003%20-1.7290001%204.1210003%20-1.599%20L%205.876%205.551%20C%205.876%205.668%205.8110003%205.7330003%205.6940002%205.7330003%20C%205.46%205.7330003%204.966%205.083%204.836%204.901%20Z%20M%204.42%204.849%20C%204.537%204.576%204.602%204.394%204.602%204.277%20C%204.602%204.264%204.589%204.186%204.563%204.0690002%20L%204.251%202.808%20C%204.004%201.872%203.887%201.391%203.874%201.365%20C%203.627%200.91%202.9120002%200.208%202.288%200.208%20C%201.781%200.208%201.521%200.598%201.521%201.365%20C%201.521%201.963%201.924%203.4190001%202.106%203.9%20C%202.3530002%204.511%202.925%205.356%203.64%205.356%20C%203.9910002%205.356%204.251%205.1870003%204.42%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB96EBFBEC04ED47E748D0E97A693AB26%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%208.684%200.49400002%20C%208.918%200.377%209.139%200.572%209.139%200.78000003%20C%209.139%200.897%209.074%200.98800004%208.957%201.04%20L%202.015%204.329%20L%208.957%207.618%20C%209.074%207.67%209.139%207.761%209.139%207.8780003%20C%209.139%208.099%209.035%208.203%208.827001%208.203%20C%208.775001%208.203%208.723001%208.190001%208.684%208.177%20L%201.222%204.6410003%20C%201.092%204.576%201.0270001%204.472%201.0270001%204.329%20C%201.0270001%204.186%201.092%204.0950003%201.222%204.03%20Z%20M%208.814%20-0.936%20L%201.3000001%20-0.936%20C%201.092%20-0.936%200.98800004%20-1.04%200.98800004%20-1.235%20C%200.98800004%20-1.4430001%201.092%20-1.547%201.3000001%20-1.547%20L%208.814%20-1.547%20C%209.022%20-1.547%209.126%20-1.4430001%209.126%20-1.235%20C%209.126%20-1.079%208.983%20-0.936%208.814%20-0.936%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD93F142C9BA9F4E93A6D76F7A2520C37%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.4115002%206.4155%20C%201.6016%206.4155%201.001%205.7603%201.001%204.9504004%20L%201.001%203.9494002%20L%200.3003%203.9494002%20L%200.3003%203.6036003%20L%201.001%203.6036003%20L%201.001%200.7189%20C%201.001%200.546%200.97370005%200.4368%200.91%200.4004%20C%200.8463%200.36400002%200.64610004%200.3549%200.30940002%200.3549%20L%200.30940002%200%20L%201.3559%200.0273%20C%201.7381%200.0364%202.1294%200.0273%202.5207002%200%20L%202.5207002%200.3549%20L%202.3023%200.3549%20C%202.002%200.3549%201.8109001%200.3731%201.7472%200.41860002%20C%201.6835%200.46410003%201.6562%200.5733%201.6562%200.7371%20L%201.6562%203.6036003%20L%202.6754%203.6036003%20L%202.6754%203.9494002%20L%201.6289%203.9494002%20L%201.6289%204.9595003%20C%201.6289%205.5055003%201.9110001%206.1425004%202.4115002%206.1425004%20C%202.4843001%206.1425004%202.548%206.1334004%202.6117%206.1152%20C%202.4752002%206.0424004%202.4024%205.9150004%202.4024%205.7421002%20C%202.4024%205.46%202.5389001%205.3144%202.821%205.3144%20C%203.1031%205.3144%203.2487001%205.46%203.2487001%205.7512%20C%203.2487001%206.1607003%202.821%206.4155%202.4115002%206.4155%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3C402A3AAC495DD2DB174F02BB0D7DF0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.7654%205.4691%20C%201.7654%205.7421002%201.5379001%205.9787%201.2649001%205.9787%20C%200.9919%205.9787%200.75530005%205.7421002%200.75530005%205.4691%20C%200.75530005%205.1961%200.98280007%204.9504004%201.2558%204.9504004%20C%201.5379001%204.9504004%201.7654%205.1870003%201.7654%205.4691%20Z%20M%201.3013%200.0273%20L%202.2477%200%20L%202.2477%200.3549%20C%201.9474001%200.3549%201.7654%200.3731%201.7108%200.4095%20C%201.6562%200.44590002%201.638%200.546%201.638%200.7098%20L%201.638%204.0495%20L%200.33670002%203.9403002%20L%200.33670002%203.5945%20C%200.637%203.5945%200.8281%203.5672002%200.89180005%203.5217001%20C%200.95550007%203.4762%200.98280007%203.3488002%200.98280007%203.1395001%20L%200.98280007%200.7189%20C%200.98280007%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3549%200.3003%200.3549%20L%200.3003%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gFF6C4DA083ADFAFB7235B8E13CB560D4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.3104%200.0273%20L%202.3205001%200%20L%202.3205001%200.3549%20C%201.9929001%200.3549%201.7927%200.36400002%201.7290001%200.4004%20C%201.6653%200.4368%201.638%200.546%201.638%200.7189%20L%201.638%206.3154%20L%200.3003%206.2153%20L%200.3003%205.8695%20C%200.61880004%205.8695%200.819%205.8422003%200.8827%205.7876%20C%200.94640005%205.7330003%200.98280007%205.6056004%200.98280007%205.3963003%20L%200.98280007%200.7189%20C%200.98280007%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3549%200.3003%200.3549%20L%200.3003%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC5B71332A0E90E792E3FAAE3C83A1E5A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.0212002%201.1466%20L%203.0212002%201.6926%20L%202.73%201.6926%20L%202.73%201.1648%20C%202.73%200.7098%202.5662%200.2002%202.1658%200.2002%20C%201.7927%200.2002%201.6107%200.50960004%201.6107%201.1284001%20L%201.6107%203.5945%20L%202.8756%203.5945%20L%202.8756%203.9403002%20L%201.6107%203.9403002%20L%201.6107%205.5965004%20L%201.3195001%205.5965004%20C%201.3104%205.2962003%201.2831%205.0323%201.2194%204.7957%20C%201.0647%204.1951003%200.7098%203.8857002%200.1729%203.8584%20L%200.1729%203.5945%20L%200.92820007%203.5945%20L%200.92820007%201.1466%20C%200.92820007%200.6097%201.092%200.2639%201.4105%200.091000006%20C%201.6562%20-0.0364%201.8837001%20-0.1001%202.1112%20-0.1001%20C%202.7118%20-0.1001%203.0212002%200.5005%203.0212002%201.1466%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC7B831D67B171949CBAF4695C0217943%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.7765002%202.2841%20C%203.7765002%203.3306%203.1668%204.0768003%202.1476002%204.0768003%20C%201.6016%204.0768003%201.1466%203.8675%200.7735%203.4398%20C%200.4277%203.0394%200.25480002%202.5571%200.25480002%202.002%20C%200.25480002%201.4287001%200.44590002%200.94640005%200.8281%200.5278%20C%201.2103001%200.1092%201.6835%20-0.1001%202.2477%20-0.1001%20C%202.7664%20-0.1001%203.1668%200.0819%203.4398%200.4368%20C%203.6673002%200.7371%203.7765002%200.95550007%203.7765002%201.1011001%20C%203.7765002%201.1921%203.7219002%201.2376001%203.6218002%201.2376001%20C%203.5490003%201.2376001%203.5035002%201.1921%203.4762%201.092%20C%203.276%200.49140003%202.8847%200.1911%202.3023%200.1911%20C%201.8928001%200.1911%201.5743%200.3822%201.3286%200.7735%20C%201.1557001%201.0556%201.0738001%201.4833001%201.0647%202.0657%20L%203.5217001%202.0657%20C%203.7219002%202.0657%203.7765002%202.0839%203.7765002%202.2841%20Z%20M%202.9666002%203.1759002%20C%203.0667002%202.8756%203.1122%202.5844002%203.1122%202.3205001%20L%201.0738001%202.3205001%20C%201.1011001%202.9211001%201.2558%203.3306%201.5288%203.5399%20C%201.7563001%203.7219002%201.9565%203.8129%202.1476002%203.8129%20C%202.5571%203.8129%202.8301%203.6036003%202.9666002%203.1759002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3BD2AAC8F92468FB204CF6E7AF8DFF03%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.3124%203.4398%20C%203.3124%203.7947001%202.9757001%204.0222%202.6208%204.0222%20C%202.1567001%204.0222%201.8018001%203.7492%201.5652001%203.1941001%20L%201.5652001%204.0222%20L%200.25480002%203.9221%20L%200.25480002%203.5763001%20C%200.5733%203.5763001%200.7644%203.5490003%200.83720005%203.4944%20C%200.91%203.4398%200.94640005%203.3215%200.94640005%203.1122%20L%200.94640005%200.7189%20C%200.94640005%200.546%200.91910005%200.4368%200.8554%200.4004%20C%200.7917%200.36400002%200.59150004%200.3458%200.25480002%200.3458%20L%200.25480002%200%20L%201.3013%200.0273%20C%201.6835%200.0364%202.0748%200.0273%202.4661002%200%20L%202.4661002%200.3458%20L%202.2477%200.3458%20C%201.9474001%200.3458%201.7563001%200.3731%201.6926%200.41860002%20C%201.6289%200.46410003%201.6016%200.5733%201.6016%200.7371%20L%201.6016%202.1112%20C%201.6016%202.5025%201.6744001%202.8574002%201.8109001%203.1577%20C%201.9929001%203.5490003%202.2568002%203.7492%202.6117%203.7583%20C%202.5207002%203.6673002%202.4752002%203.5581002%202.4752002%203.4307%20C%202.4752002%203.1486%202.6117%203.0121002%202.8938%203.0121002%20C%203.1395001%203.0121002%203.3124%203.2032%203.3124%203.4398%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 7.182972727272727em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;With a bit of cleverness, we can generalize this approach to arbitrarily
many dimensions. The trick is to instead sort the points along a
space-filling curve, which will place nearby points approximately near
each other when sorted.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;captree&#x2F;morton.svg&quot; alt=&quot;Points on a 2D plane, colored by their position along a Morton curve.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;figcaption&gt;Points on a 2D plane, colored by their position along a Morton
curve.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The best-known space-filling curve is the &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Hilbert_curve&quot;&gt;Hilbert
curve&lt;&#x2F;a&gt;, but it’s
relatively convoluted to compute. Instead, we used a &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Z-order_curve&quot;&gt;Morton
curve&lt;&#x2F;a&gt; (also known as a
Z-order curve), because it’s trivial to compute a point’s position
along a Morton curve using a parallel-bits deposit instruction.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;bitintr&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Pdep&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;std&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;ops&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;BitOr&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; Compute `p`&amp;#39;s position along the Morton curve filling `aabb`.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;morton_index&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;p&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;f32&lt;&#x2F;span&gt;; 3], &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;aabb&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;Aabb&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;MASK&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-binary z-rust&quot;&gt;0b001_001_001_001_001_001_001_001_001_001&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; the magic 1024 comes from the fact that MASK has 10 bits set,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; so we scale up the position of `p` along each axis to have 10 bits
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; per dimension.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    p&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;enumerate&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;map&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;k&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;x&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;x &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; aabb&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;lo&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-float z-rust&quot;&gt;1024.&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-float z-rust&quot;&gt;0&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;&#x2F;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;aabb&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;hi&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; aabb&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;lo&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;k&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;pdep&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;MASK&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; k&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;fold&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;BitOr&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;bitor&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The main downside to using the space-filling curve filter is that there
are “cliffs” - regions where moving a small amount in space
dramatically changes your position on the space-filling curve. To fix
this, we can just filter the point cloud multiple times. Each time,
we’ll use a different Morton curve (one for each permutation of
dimensions) in the hopes that using different filters will give us more
opportunities to filter points.&lt;&#x2F;p&gt;
&lt;figure class = &quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;captree&#x2F;filter_strength.svg&quot; alt=&quot;image&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;In practice, this yields some pretty great results! One filter pass can
dramatically reduce the size of a point cloud, even at a small radius.
In the plot above, I’ve run up to 6 different filters over a point
cloud of a bookshelf containing &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2016.328%2021.878999999999998%22%20width%3D%2216.328pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.5%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g926D2660840F60BD26CB1948E0E27444%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2811.049999999999999%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g83A6B6FF257ED71588483547005EE45F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g626C7FE0610F5A21B7FCC6F361F06C4A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.081%208.658%20C%202.418%208.658%201.8590001%208.424%201.378%207.9560003%20C%200.897%207.488%200.65000004%206.942%200.65000004%206.2790003%20C%200.65000004%205.837%200.975%205.512%201.378%205.512%20C%201.768%205.512%202.093%205.85%202.093%206.2400002%20C%202.093%206.669%201.781%206.968%201.365%206.968%20C%201.326%206.968%201.3000001%206.968%201.274%206.955%20C%201.521%207.592%202.093%208.151%202.9120002%208.151%20C%203.9780002%208.151%204.576%207.228%204.576%206.11%20C%204.576%205.2390003%204.1340003%204.303%203.25%203.315%20L%200.806%200.559%20C%200.637%200.36400002%200.65000004%200.377%200.65000004%200%20L%205.473%200%20L%205.85%202.3400002%20L%205.421%202.3400002%20C%205.317%201.677%205.2260003%201.3000001%205.1480002%201.183%20C%205.083%201.118%204.6930003%201.092%203.9780002%201.092%20L%201.807%201.092%20L%203.068%202.3270001%20C%203.9520001%203.1590002%205.07%204.056%205.447%204.745%20C%205.7070003%205.2000003%205.837%205.655%205.837%206.11%20C%205.837%207.644%204.6410003%208.658%203.081%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g926D2660840F60BD26CB1948E0E27444%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.4479%206.0606003%20C%202.0748%205.6784%201.5288%205.4873004%200.80990005%205.4873004%20L%200.80990005%205.1324%20C%201.2831%205.1324%201.6744001%205.2052%201.9747001%205.3508%20L%201.9747001%200.7462%20C%201.9747001%200.5824%201.9383001%200.47320002%201.8564001%200.4277%20C%201.7745001%200.3822%201.547%200.3549%201.1830001%200.3549%20L%200.86450005%200.3549%20L%200.86450005%200%20C%201.092%200.0182%201.5834%200.0273%202.3387%200.0273%20C%203.094%200.0273%203.5854%200.0182%203.8129%200%20L%203.8129%200.3549%20L%203.4944%200.3549%20C%203.1213002%200.3549%202.8938%200.3822%202.821%200.4277%20C%202.7482002%200.47320002%202.7027001%200.5824%202.7027001%200.7462%20L%202.7027001%205.7876%20C%202.7027001%206.006%202.6845002%206.0606003%202.4479%206.0606003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g83A6B6FF257ED71588483547005EE45F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.4853%204.5864%20C%203.7856002%204.5864%203.9312003%204.7411003%203.9312003%205.0505004%20C%203.9312003%205.7057004%203.4398%206.0606003%202.7664%206.0606003%20C%202.0111%206.0606003%201.4105%205.7057004%200.9646%204.9868%20C%200.5733%204.368%200.3822%203.6673002%200.3822%202.8756%20C%200.3822%201.7199%200.59150004%200.91%201.0192001%200.4277%20C%201.3832%200.0091%201.8018001%20-0.2002%202.2841%20-0.2002%20C%202.8392%20-0.2002%203.2942002%200.0091%203.6491%200.4277%20C%203.9858003%200.8281%204.1587%201.3104%204.1587%201.8655001%20C%204.1587%202.4206002%203.9949002%202.8938%203.6673002%203.2851002%20C%203.3215%203.7037%202.8756%203.9221%202.3387%203.9221%20C%201.8655001%203.9221%201.5015%203.6582003%201.2558%203.1486%20L%201.2558%203.2032%20C%201.2558%204.2315%201.5106001%205.1051%202.0566%205.5055003%20C%202.2932%205.6784%202.5389001%205.7603%202.7846%205.7603%20C%203.1122%205.7603%203.3488002%205.6693%203.5035002%205.4782004%20C%203.1941001%205.4782004%203.0394%205.3053%203.0394%205.0323%20C%203.0394%204.7775%203.2305002%204.5864%203.4853%204.5864%20Z%20M%203.1304002%203.094%20C%203.2305002%202.8847%203.2851002%202.4752002%203.2851002%201.8746%20C%203.2851002%201.2831%203.2396002%200.89180005%203.1395001%200.6916%20C%202.9575002%200.3185%202.6754%200.12740001%202.2841%200.12740001%20C%202.0202%200.12740001%201.82%200.2184%201.6744001%200.4004%20C%201.5561%200.546%201.4742%200.67340004%201.4378%200.7735%20C%201.3286%201.0556%201.274%201.4833001%201.274%202.0657%20C%201.274%202.3205001%201.3104%202.5662%201.3741001%202.8028002%20C%201.4924%203.2305002%201.8291001%203.6309001%202.3296%203.6309001%20C%202.6845002%203.6309001%202.9575002%203.4489002%203.1304002%203.094%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.4843636363636363em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; points. Looking at the plot
above, we get some diminishing returns from filtering with more
permutations. However, since the construction performance is so
superlinear, it’s still worthwhile to do some extra filtering in the
hopes of reducing point cloud size a little further.&lt;&#x2F;p&gt;
&lt;p&gt;We also played around a little bit with scaling dimensions of the Morton
filter. We started by stretching and transforming the space such that
the region &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2038.51466666666666%2021.878999999999998%22%20width%3D%2238.51466666666666pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4E25915259A8CFAF4849B3D226150DE7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%284.42%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g698CEE4C4A10701C318E944B9229759%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.920000000000002%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA5EFA28F31DFDD7E2EC069AC1C132FF5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2816.700666666666667%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2823.200666666666667%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g8281AF5184639F2042386F3390791180%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2827.750666666666667%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g34A5C14ED9FB7DDEF99FAC79056D90F7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2833.028666666666666%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g67EFC6A56ECEEA6CD53D2A781C7091DE%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4E25915259A8CFAF4849B3D226150DE7%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.757%20-3.25%20L%202.704%20-3.25%20L%202.704%209.75%20L%203.757%209.75%20C%203.9650002%209.75%204.0690002%209.854%204.0690002%2010.075%20C%204.0690002%2010.2960005%203.9650002%2010.400001%203.757%2010.400001%20L%202.093%2010.400001%20L%202.093%20-3.9%20L%203.757%20-3.9%20C%203.9650002%20-3.9%204.0690002%20-3.796%204.0690002%20-3.575%20C%204.0690002%20-3.4060001%203.926%20-3.25%203.757%20-3.25%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g698CEE4C4A10701C318E944B9229759%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.237%20-0.286%20C%205.07%20-0.286%205.98%201.196%205.98%204.16%20C%205.98%206.149%205.564%207.4750004%204.745%208.125%20C%204.29%208.476%203.783%208.658%203.25%208.658%20C%201.417%208.658%200.507%207.163%200.507%204.16%20C%200.507%201.768%201.144%20-0.286%203.237%20-0.286%20Z%20M%204.6930003%206.8120003%20C%204.784%206.3570004%204.823%205.525%204.823%204.316%20C%204.823%203.1200001%204.771%202.236%204.6800003%201.664%20C%204.511%200.624%204.03%200.104%203.237%200.104%20C%202.938%200.104%202.639%200.221%202.366%200.442%20C%202.015%200.741%201.807%201.352%201.7160001%202.288%20C%201.677%202.6130002%201.664%203.289%201.664%204.316%20C%201.664%205.447%201.7030001%206.2400002%201.768%206.669%20C%201.885%207.3840003%202.119%207.839%202.483%208.034%20C%202.769%208.190001%203.016%208.268001%203.237%208.268001%20C%204.0820003%208.268001%204.55%207.579%204.6930003%206.8120003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA5EFA28F31DFDD7E2EC069AC1C132FF5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.807%201.378%20C%201.391%201.378%201.118%201.066%201.118%200.65000004%20C%201.118%200.26%201.417%20-0.065%201.807%20-0.065%20C%201.9890001%20-0.065%202.145%20-0.013%202.262%200.104%20L%202.275%200%20C%202.275%20-0.819%202.002%20-1.521%201.4560001%20-2.08%20C%201.365%20-2.184%201.3130001%20-2.262%201.3130001%20-2.3140001%20C%201.3130001%20-2.444%201.365%20-2.509%201.482%20-2.509%20C%201.599%20-2.509%201.755%20-2.3530002%201.9760001%20-2.0540001%20C%202.418%20-1.4300001%202.639%20-0.741%202.639%200%20C%202.639%200.689%202.405%201.378%201.807%201.378%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g626C7FE0610F5A21B7FCC6F361F06C4A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.081%208.658%20C%202.418%208.658%201.8590001%208.424%201.378%207.9560003%20C%200.897%207.488%200.65000004%206.942%200.65000004%206.2790003%20C%200.65000004%205.837%200.975%205.512%201.378%205.512%20C%201.768%205.512%202.093%205.85%202.093%206.2400002%20C%202.093%206.669%201.781%206.968%201.365%206.968%20C%201.326%206.968%201.3000001%206.968%201.274%206.955%20C%201.521%207.592%202.093%208.151%202.9120002%208.151%20C%203.9780002%208.151%204.576%207.228%204.576%206.11%20C%204.576%205.2390003%204.1340003%204.303%203.25%203.315%20L%200.806%200.559%20C%200.637%200.36400002%200.65000004%200.377%200.65000004%200%20L%205.473%200%20L%205.85%202.3400002%20L%205.421%202.3400002%20C%205.317%201.677%205.2260003%201.3000001%205.1480002%201.183%20C%205.083%201.118%204.6930003%201.092%203.9780002%201.092%20L%201.807%201.092%20L%203.068%202.3270001%20C%203.9520001%203.1590002%205.07%204.056%205.447%204.745%20C%205.7070003%205.2000003%205.837%205.655%205.837%206.11%20C%205.837%207.644%204.6410003%208.658%203.081%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g8281AF5184639F2042386F3390791180%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.7573001%203.2123%20C%203.3579001%203.4398%203.9221%204.0131%203.9221%204.7866%20C%203.9221%205.1779003%203.7310002%205.4964004%203.3579001%205.7421002%20C%203.0303001%205.9514003%202.6572%206.0606003%202.2386%206.0606003%20C%201.8291001%206.0606003%201.4742%205.9514003%201.1557001%205.7421002%20C%200.8008%205.5055003%200.61880004%205.1961%200.61880004%204.8048%20C%200.61880004%204.5045004%200.819%204.2952003%201.1102%204.2952003%20C%201.4014001%204.2952003%201.6016%204.5045004%201.6016%204.7957%20C%201.6016%205.096%201.4287001%205.2598004%201.0829%205.2780004%20C%201.3195001%205.5965004%201.6926%205.7603%202.2022002%205.7603%20C%202.7482002%205.7603%203.0212002%205.4418%203.0212002%204.7957%20C%203.0212002%204.4135003%202.9484%204.0950003%202.8119001%203.8311002%20C%202.5662%203.3943002%202.2295%203.3124%201.6653%203.3124%20C%201.5561%203.2942002%201.5015%203.2487001%201.5015%203.1668%20C%201.5015%203.0303001%201.5652001%203.0303001%201.7472%203.0303001%20L%202.1385%203.0303001%20C%202.821%203.0303001%203.1668%202.548%203.1668%201.5743%20C%203.1668%200.8008%202.8847%200.12740001%202.1931%200.12740001%20C%201.6016%200.12740001%201.1648%200.3276%200.90090007%200.72800004%20C%201.2194%200.7189%201.4560001%200.95550007%201.4560001%201.2649001%20C%201.4560001%201.5743%201.2285%201.8018001%200.91910005%201.8018001%20C%200.56420004%201.8018001%200.3822%201.6198001%200.3822%201.2467%20C%200.3822%200.8008%200.5824%200.44590002%200.98280007%200.1638%20C%201.3377%20-0.0819%201.7563001%20-0.2002%202.2204%20-0.2002%20C%202.7391002%20-0.2002%203.1850002%20-0.0273%203.5763001%200.30940002%20C%203.9676%200.64610004%204.1587%201.0647%204.1587%201.5743%20C%204.1587%202.4297001%203.4853%203.0212002%202.7573001%203.2123%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g34A5C14ED9FB7DDEF99FAC79056D90F7%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.1567001%206.0606003%20C%201.6926%206.0606003%201.3013%205.8968%200.9646%205.5692%20C%200.6279%205.2416%200.455%204.8594003%200.455%204.3953004%20C%200.455%204.0859003%200.6825%203.8584%200.9646%203.8584%20C%201.2376001%203.8584%201.4651%204.0950003%201.4651%204.368%20C%201.4651%204.6683%201.2467%204.8776%200.95550007%204.8776%20C%200.92820007%204.8776%200.91%204.8776%200.89180005%204.8685%20C%201.0647%205.3144%201.4651%205.7057004%202.0384002%205.7057004%20C%202.7846%205.7057004%203.2032%205.0596004%203.2032%204.277%20C%203.2032%203.6673002%202.8938%203.0121002%202.275%202.3205001%20L%200.56420004%200.39130002%20C%200.44590002%200.25480002%200.455%200.2639%200.455%200%20L%203.8311002%200%20L%204.0950003%201.638%20L%203.7947001%201.638%20C%203.7219002%201.1739%203.6582003%200.91%203.6036003%200.8281%20C%203.5581002%200.78260005%203.2851002%200.7644%202.7846%200.7644%20L%201.2649001%200.7644%20L%202.1476002%201.6289%20C%202.7664%202.2113001%203.5490003%202.8392%203.8129%203.3215%20C%203.9949002%203.64%204.0859003%203.9585001%204.0859003%204.277%20C%204.0859003%205.3508%203.2487001%206.0606003%202.1567001%206.0606003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g67EFC6A56ECEEA6CD53D2A781C7091DE%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.066%20-3.822%20C%201.911%20-3.1720002%202.6130002%20-2.21%203.1720002%20-0.92300004%20C%203.7050002%200.299%203.9780002%201.469%203.9780002%202.5740001%20L%203.9780002%203.926%20C%203.9780002%205.031%203.7050002%206.201%203.1720002%207.4230003%20C%202.6130002%208.71%201.911%209.672%201.066%2010.3220005%20C%201.053%2010.348001%201.014%2010.361%200.962%2010.361%20C%200.845%2010.361%200.78000003%2010.2960005%200.78000003%2010.179%20C%200.78000003%2010.114%200.806%2010.075%200.845%2010.036%20C%201.5730001%209.477%202.158%208.541%202.6000001%207.228%20C%202.977%206.097%203.1720002%205.005%203.1720002%203.926%20L%203.1720002%202.5740001%20C%203.1720002%201.495%202.977%200.403%202.6000001%20-0.72800004%20C%202.158%20-2.0410001%201.5730001%20-2.977%200.845%20-3.536%20C%200.806%20-3.575%200.78000003%20-3.614%200.78000003%20-3.6790001%20C%200.78000003%20-3.796%200.845%20-3.861%200.962%20-3.861%20C%201.014%20-3.861%201.053%20-3.848%201.066%20-3.822%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.501333333333333em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; gets mapped to the AABB containing all
the points in the point cloud. Since the filter removes some points on
the edge of that AABB, we tried shrinking the AABB to fit the new
sparsified point cloud for the next iteration of the filter, and we also
tried leaving it as-is. For reasons I can neither explain nor
comprehend, the most effective way was to take an average of the two
AABBs to produce the best filtering results.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;into-the-c-mines&quot;&gt;Into the C++ mines&lt;&#x2F;h2&gt;
&lt;p&gt;I hate C++. This isn’t a place for unhinged ranting about programming
languages, but let it be known that I do not write C++ willingly or
lightly. However, the vector-accelerated motion planner that I was
developing for was written in C++, and there’s no shot of it getting
rewritten in the near future. We all have better things to do. Instead,
I got to reimplement all the Rust prototype code in C++.&lt;&#x2F;p&gt;
&lt;p&gt;On the whole, it wasn’t as bad as it could have been, but a small part
of me dies inside every time I have to read a template instantiation
error message. My Rust implementation (not the simplified version in
this blog post) was polymorphic over dimension, but I only had to
implement the C++ version for &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2030.804222222222222%2021.878999999999998%22%20width%3D%2230.804222222222222pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6BD6B5079591C663D089FFB042C868C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.579111111111112%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g537FBDF575D6B4DBC59EE2318104781F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2824.304222222222222%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC6F50C046BCA623FDEE933D413AC9522%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6BD6B5079591C663D089FFB042C868C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.317%204.589%20C%205.317%204.251%205.499%204.0820003%205.85%204.0820003%20C%206.3050003%204.0820003%206.604%204.485%206.604%204.927%20C%206.604%205.434%206.188%205.7850003%205.681%205.7850003%20C%205.096%205.7850003%204.472%205.395%203.783%204.6280003%20C%203.25%204.043%202.821%203.6660001%202.47%203.497%20L%203.783%208.827001%20C%203.757%208.944%203.7310002%209.022%203.562%209.022%20C%203.1460001%209.022%202.158%208.905%202.002%208.892%20C%201.807%208.866%201.7160001%208.775001%201.7160001%208.58%20C%201.7160001%208.45%201.8330001%208.385%202.0670002%208.385%20C%202.3140001%208.385%202.652%208.398%202.652%208.216001%20L%200.767%200.559%20C%200.72800004%200.416%200.71500003%200.32500002%200.71500003%200.273%20C%200.71500003%200%200.85800004%20-0.143%201.131%20-0.143%20C%201.352%20-0.143%201.521%20-0.039%201.612%200.156%20C%201.677%200.273%201.911%201.196%202.3270001%202.938%20C%203.003%202.8730001%203.7180002%202.548%203.7180002%201.898%20C%203.7180002%201.7030001%203.627%201.3130001%203.627%201.183%20C%203.627%200.442%204.1080003%20-0.143%204.849%20-0.143%20C%205.603%20-0.143%206.11%200.533%206.3700004%201.885%20C%206.3700004%202.002%206.3050003%202.0670002%206.175%202.0670002%20C%206.058%202.0670002%205.98%201.9760001%205.941%201.794%20C%205.655%200.767%205.304%200.24700001%204.875%200.24700001%20C%204.6410003%200.24700001%204.524%200.42900002%204.524%200.79300004%20C%204.524%201.001%204.6800003%201.7030001%204.6800003%201.911%20C%204.6800003%202.652%204.0820003%203.107%202.8730001%203.289%20C%203.1720002%203.497%203.51%203.796%203.874%204.186%20C%204.238%204.576%204.498%204.823%204.6670003%204.966%20C%205.018%205.2520003%205.356%205.395%205.655%205.395%20C%205.7850003%205.395%205.889%205.369%205.967%205.317%20C%205.616%205.2520003%205.317%204.927%205.317%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g537FBDF575D6B4DBC59EE2318104781F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%204.771%20L%201.04%204.771%20C%200.832%204.771%200.72800004%204.6670003%200.72800004%204.472%20C%200.72800004%204.277%200.832%204.173%201.04%204.173%20L%209.074%204.173%20C%209.282001%204.173%209.386001%204.277%209.386001%204.472%20C%209.386001%204.6280003%209.243%204.771%209.074%204.771%20Z%20M%209.074%202.3270001%20L%201.04%202.3270001%20C%200.832%202.3270001%200.72800004%202.223%200.72800004%202.028%20C%200.72800004%201.8330001%200.832%201.7290001%201.04%201.7290001%20L%209.074%201.7290001%20C%209.282001%201.7290001%209.386001%201.8330001%209.386001%202.028%20C%209.386001%202.197%209.243%202.3270001%209.074%202.3270001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC6F50C046BCA623FDEE933D413AC9522%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.9390001%204.589%20C%204.797%204.914%205.603%205.7330003%205.603%206.8380003%20C%205.603%207.3970003%205.33%207.852%204.797%208.203%20C%204.329%208.502%203.796%208.658%203.198%208.658%20C%202.6130002%208.658%202.106%208.502%201.651%208.203%20C%201.144%207.8650002%200.884%207.4230003%200.884%206.8640003%20C%200.884%206.435%201.1700001%206.136%201.5860001%206.136%20C%202.002%206.136%202.288%206.435%202.288%206.8510003%20C%202.288%207.28%202.0410001%207.514%201.547%207.54%20C%201.885%207.9950004%202.418%208.229%203.1460001%208.229%20C%203.926%208.229%204.316%207.774%204.316%206.8510003%20C%204.316%206.3050003%204.212%205.85%204.017%205.473%20C%203.6660001%204.849%203.1850002%204.732%202.379%204.732%20C%202.223%204.7060003%202.145%204.6410003%202.145%204.524%20C%202.145%204.329%202.236%204.329%202.496%204.329%20L%203.055%204.329%20C%204.03%204.329%204.524%203.64%204.524%202.249%20C%204.524%201.144%204.1210003%200.18200001%203.1330001%200.18200001%20C%202.288%200.18200001%201.664%200.468%201.2870001%201.04%20C%201.742%201.0270001%202.08%201.365%202.08%201.807%20C%202.08%202.249%201.755%202.5740001%201.3130001%202.5740001%20C%200.806%202.5740001%200.546%202.3140001%200.546%201.781%20C%200.546%201.144%200.832%200.637%201.404%200.234%20C%201.911%20-0.117%202.509%20-0.286%203.1720002%20-0.286%20C%203.913%20-0.286%204.55%20-0.039%205.109%200.442%20C%205.668%200.92300004%205.941%201.521%205.941%202.249%20C%205.941%203.471%204.979%204.316%203.9390001%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.8003838383838384em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, which made things easier.&lt;&#x2F;p&gt;
&lt;p&gt;We spent a little more engineering effort on construction and query
times for the C++ code, in part by taking advantage of some
domain-specific knowledge. This let us eke out a little more
performance, so the Rust code is marginally slower, but not due to any
differences in programming languages.&lt;&#x2F;p&gt;
&lt;p&gt;I spent a lot of time debugging quirky results. For reasons I still have
yet to understand, the SIMD queries performed &lt;em&gt;worse&lt;&#x2F;em&gt; on SIMD-parallel
queries than they did on sequential queries. However, this result
exclusively ocurred on the C++ implementation on my laptop - no other
machines. The solution? Simply run the benchmarks on a different
machine.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-final-scramble&quot;&gt;The final scramble&lt;&#x2F;h2&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;captree&#x2F;throughput_fig.png&quot; alt=&quot;Collision-checking throughput performance in the C++ implementation.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;figcaption&gt;Collision-checking throughput performance in the C++
implementation.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;What I’ve described so far was roughly the state of the project around
two weeks before the submission deadline. However, it takes more than a
good idea to produce a good paper. We needed serious benchmarks against
serious competitors. Since the state of C++ software packaging is
practically nonexistent, this typically entailed vendoring the source
code as a Git submodule, patching it into the CMake build system, and
praying that it would compile. Repeat for each competitor and we’ve got
a full set of benchmarks.&lt;&#x2F;p&gt;
&lt;p&gt;We really cared about a few main competitors:
&lt;a href=&quot;https:&#x2F;&#x2F;octomap.github.io&#x2F;&quot;&gt;OctoMaps&lt;&#x2F;a&gt; and &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.968%2021.878999999999998%22%20width%3D%226.968pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6BD6B5079591C663D089FFB042C868C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6BD6B5079591C663D089FFB042C868C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.317%204.589%20C%205.317%204.251%205.499%204.0820003%205.85%204.0820003%20C%206.3050003%204.0820003%206.604%204.485%206.604%204.927%20C%206.604%205.434%206.188%205.7850003%205.681%205.7850003%20C%205.096%205.7850003%204.472%205.395%203.783%204.6280003%20C%203.25%204.043%202.821%203.6660001%202.47%203.497%20L%203.783%208.827001%20C%203.757%208.944%203.7310002%209.022%203.562%209.022%20C%203.1460001%209.022%202.158%208.905%202.002%208.892%20C%201.807%208.866%201.7160001%208.775001%201.7160001%208.58%20C%201.7160001%208.45%201.8330001%208.385%202.0670002%208.385%20C%202.3140001%208.385%202.652%208.398%202.652%208.216001%20L%200.767%200.559%20C%200.72800004%200.416%200.71500003%200.32500002%200.71500003%200.273%20C%200.71500003%200%200.85800004%20-0.143%201.131%20-0.143%20C%201.352%20-0.143%201.521%20-0.039%201.612%200.156%20C%201.677%200.273%201.911%201.196%202.3270001%202.938%20C%203.003%202.8730001%203.7180002%202.548%203.7180002%201.898%20C%203.7180002%201.7030001%203.627%201.3130001%203.627%201.183%20C%203.627%200.442%204.1080003%20-0.143%204.849%20-0.143%20C%205.603%20-0.143%206.11%200.533%206.3700004%201.885%20C%206.3700004%202.002%206.3050003%202.0670002%206.175%202.0670002%20C%206.058%202.0670002%205.98%201.9760001%205.941%201.794%20C%205.655%200.767%205.304%200.24700001%204.875%200.24700001%20C%204.6410003%200.24700001%204.524%200.42900002%204.524%200.79300004%20C%204.524%201.001%204.6800003%201.7030001%204.6800003%201.911%20C%204.6800003%202.652%204.0820003%203.107%202.8730001%203.289%20C%203.1720002%203.497%203.51%203.796%203.874%204.186%20C%204.238%204.576%204.498%204.823%204.6670003%204.966%20C%205.018%205.2520003%205.356%205.395%205.655%205.395%20C%205.7850003%205.395%205.889%205.369%205.967%205.317%20C%205.616%205.2520003%205.317%204.927%205.317%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6334545454545455em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;-d trees (in the C++
implementation &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jlblancoc&#x2F;nanoflann&quot;&gt;nanoflann&lt;&#x2F;a&gt; and
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;UNC-Robotics&#x2F;nigh&quot;&gt;Nigh&lt;&#x2F;a&gt;). OctoMaps are a big deal
in the planning world, and tend to be the most common off-the-shelf
environment representation for point clouds, while comparing against
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.968%2021.878999999999998%22%20width%3D%226.968pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6BD6B5079591C663D089FFB042C868C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6BD6B5079591C663D089FFB042C868C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.317%204.589%20C%205.317%204.251%205.499%204.0820003%205.85%204.0820003%20C%206.3050003%204.0820003%206.604%204.485%206.604%204.927%20C%206.604%205.434%206.188%205.7850003%205.681%205.7850003%20C%205.096%205.7850003%204.472%205.395%203.783%204.6280003%20C%203.25%204.043%202.821%203.6660001%202.47%203.497%20L%203.783%208.827001%20C%203.757%208.944%203.7310002%209.022%203.562%209.022%20C%203.1460001%209.022%202.158%208.905%202.002%208.892%20C%201.807%208.866%201.7160001%208.775001%201.7160001%208.58%20C%201.7160001%208.45%201.8330001%208.385%202.0670002%208.385%20C%202.3140001%208.385%202.652%208.398%202.652%208.216001%20L%200.767%200.559%20C%200.72800004%200.416%200.71500003%200.32500002%200.71500003%200.273%20C%200.71500003%200%200.85800004%20-0.143%201.131%20-0.143%20C%201.352%20-0.143%201.521%20-0.039%201.612%200.156%20C%201.677%200.273%201.911%201.196%202.3270001%202.938%20C%203.003%202.8730001%203.7180002%202.548%203.7180002%201.898%20C%203.7180002%201.7030001%203.627%201.3130001%203.627%201.183%20C%203.627%200.442%204.1080003%20-0.143%204.849%20-0.143%20C%205.603%20-0.143%206.11%200.533%206.3700004%201.885%20C%206.3700004%202.002%206.3050003%202.0670002%206.175%202.0670002%20C%206.058%202.0670002%205.98%201.9760001%205.941%201.794%20C%205.655%200.767%205.304%200.24700001%204.875%200.24700001%20C%204.6410003%200.24700001%204.524%200.42900002%204.524%200.79300004%20C%204.524%201.001%204.6800003%201.7030001%204.6800003%201.911%20C%204.6800003%202.652%204.0820003%203.107%202.8730001%203.289%20C%203.1720002%203.497%203.51%203.796%203.874%204.186%20C%204.238%204.576%204.498%204.823%204.6670003%204.966%20C%205.018%205.2520003%205.356%205.395%205.655%205.395%20C%205.7850003%205.395%205.889%205.369%205.967%205.317%20C%205.616%205.2520003%205.317%204.927%205.317%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6334545454545455em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;-d trees would prove that our SIMD and cache-efficiency efforts
actually did something. We benchmarked against a handful of others, but
this blog post is far too long for me to go into detail about all of
them.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr class=&quot;header&quot;&gt;
&lt;th scope=&quot;col&quot;&gt;Collision-Checker&lt;&#x2F;th&gt;
&lt;th scope=&quot;col&quot;&gt;Filter&lt;&#x2F;th&gt;
&lt;th scope=&quot;col&quot;&gt;Build&lt;&#x2F;th&gt;
&lt;th scope=&quot;col&quot;&gt;Plan&lt;&#x2F;th&gt;
&lt;th scope=&quot;col&quot;&gt;Simplification&lt;&#x2F;th&gt;
&lt;th scope=&quot;col&quot;&gt;Total&lt;&#x2F;th&gt;
&lt;&#x2F;tr&gt;
&lt;&#x2F;thead&gt;
&lt;tbody&gt;
&lt;tr class=&quot;odd&quot;&gt;
&lt;td&gt;OctoMap&lt;&#x2F;td&gt;
&lt;td rowspan=&quot;3&quot;&gt;2.9&lt;&#x2F;td&gt;
&lt;td&gt;120.9&lt;&#x2F;td&gt;
&lt;td&gt;78.9&lt;&#x2F;td&gt;
&lt;td&gt;23.3&lt;&#x2F;td&gt;
&lt;td&gt;220.9&lt;&#x2F;td&gt;
&lt;&#x2F;tr&gt;
&lt;tr class=&quot;even&quot;&gt;
&lt;td&gt;nanoflann&lt;&#x2F;td&gt;
&lt;td&gt;0.3&lt;&#x2F;td&gt;
&lt;td&gt;15.5&lt;&#x2F;td&gt;
&lt;td&gt;7.8&lt;&#x2F;td&gt;
&lt;td&gt;26.7&lt;&#x2F;td&gt;
&lt;&#x2F;tr&gt;
&lt;tr class=&quot;odd&quot;&gt;
&lt;td&gt;CAPT&lt;&#x2F;td&gt;
&lt;td&gt;5.9&lt;&#x2F;td&gt;
&lt;td&gt;0.5&lt;&#x2F;td&gt;
&lt;td&gt;0.2&lt;&#x2F;td&gt;
&lt;td&gt;&lt;strong&gt;9.5&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;
&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;
&lt;&#x2F;table&gt;
&lt;figcaption&gt;Mean simulated planning times for the UR-5 robot in
milliseconds. For details, refer to the &lt;a
href=&quot;https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;2406.02807&quot;&gt;paper&lt;&#x2F;a&gt;,&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;When hooked up to a full motion planner, we found that we could get
speedups by multiple orders of magnitude. Planning times fell from the
order of tens to hundreds of milliseconds using an OctoMap down to
&lt;strong&gt;microseconds&lt;&#x2F;strong&gt; with our data structure. From end to end, we could go
from a raw point cloud all the way to a completed plan in &lt;strong&gt;under
sixteen milliseconds&lt;&#x2F;strong&gt;. That means that sixty-hertz online planning
times are possible!&lt;&#x2F;p&gt;
&lt;p&gt;For the final benchmarks, instead of using my laptop, we used a much
beefier computer with a Ryzen 9 7950X, which accounts for the biggest
difference in empirical performance compared to the earlier plots. We
were actually quite surprised by our results - we weren’t expecting to
be that far ahead.&lt;&#x2F;p&gt;
&lt;p&gt;Our target conference was &lt;a href=&quot;https:&#x2F;&#x2F;roboticsconference.org&quot;&gt;Robotics: Science and
Systems&lt;&#x2F;a&gt;, which is a relatively small
yet competitive venue. Typically, they have high standards for
submission quality, so we were worried about about making the cut,
especially on a tight deadline. We ended up divvying up the work for the
paper: I was mostly responsible for writing up the method, related work,
some analysis, and results, while my collaborators Wil and Zak wrote up
the intro and added their own parts to the stuff that I had drafted.
Lastly, my advisor, Lydia, reviewed and edited the paper.&lt;&#x2F;p&gt;
&lt;p&gt;We wanted to benchmark against
&lt;a href=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;captree&#x2F;git@github.com:nvidia-isaac&#x2F;nvblox.git&quot;&gt;nvblox&lt;&#x2F;a&gt;, but it was a nightmare
to get it to compile and run on anything. I managed to obliterate my
graphics drivers twice while setting up the requisite CUDA drivers, and
had to reinstall the OS from scratch. In the end, we just gave up.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;software-hell&quot;&gt;Software hell&lt;&#x2F;h3&gt;
&lt;figure&gt;
&lt;img src=&quot;realsense_filtered_pc.png&quot;
class=&quot;night-invert&quot; &#x2F;&gt;
&lt;figcaption&gt;
A point cloud of a table in our lab. It took painfully long to get this
image and one paragraph in our paper.
&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;We also tried to get the planning system running on a real robot. The
first hurdle was exfiltrating a point cloud from the RealSense camera,
which proved surprisingly difficult, mostly because I believe that
software was invented as some sort of cruel punishment for my sins. We
only managed to get the imaging stack working late around 3 A.M. on the
night the paper was due. In my experience, my productivity drops off
dramatically around 10 P.M., so perhaps that was only two hours of
“real” work, but it was still far more difficult than getting a list
of points in the correct coordinate frame should be. Armed with our
point cloud, we were able to get real-enough demo results for the paper.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;victory-laps&quot;&gt;Victory laps&lt;&#x2F;h2&gt;
&lt;p&gt;Like many other venues, RSS has two different submission deadlines: the
paper deadline and then the supplemental materials submission a week
later. This meant that we had enough time to try to get an online
planner running, hopefully to demonstrate camera-frequency planning.
However, we ran up against a new problem: we were planning &lt;em&gt;too fast&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The heart of the issue was ROS’s trajectory blender: by and large, it
assumes new trajectories are provided only once every few seconds.
However, our planner could produce hundreds of plans per second with
ease: at that frequency, the trajectory blender could not keep up and so
it yielded inconsistent, jerky motions.&lt;&#x2F;p&gt;
&lt;p&gt;We didn’t have time to fully fix the issue before the submission
deadline, but a few days later we managed to finally get things running.
Our solution was to instead manually implement a velocity controller for
the robot and dodge the ROS interface entirely.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;iframe src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;BzDKdrU1VpM?si=zLtS67SWgnHkLypt&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;encrypted-media; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Eventually, we got the whole thing running! In the demo video above, the
robot attempts to move to a sequence of preset positions. At every
single camera frame, we scan a point cloud, build an environment, and
then compute an entirely new plan from scratch - roughly sixty times per
second. This means that we can insert arbitrary obstacles in the scene
and it all “just works”: the robot magically dodges them all.&lt;&#x2F;p&gt;
&lt;p&gt;We had to do a few hacks to get this to all work, though. The big issues
weren’t actually from our planner performance but rather from
perception: occlusion from solids meant that we could only perceive the
surface of obstacles, so we had to pad the radii of all points by 4cm
just to make it so that the robot wouldn’t crash into the underside of
the pool noodles. Additionally, if we ever stuck a pool noodle under the
robot, the robot would occlude those points and then happily drive
itself through it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;reviewer-2-is-real&quot;&gt;Reviewer 2 is real&lt;&#x2F;h2&gt;
&lt;p&gt;About a month after we submitted the paper, we got reviews back. Most of
the remarks were things we already knew, but there was one major
hiccup - our proof of correctness. From our filtering method, we knew
that if any point &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.734%2021.878999999999998%22%20width%3D%226.734pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g254AE47CC15CC81C004457B9506AF3F3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g254AE47CC15CC81C004457B9506AF3F3%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.6150002%205.7460003%20C%204.043%205.7460003%203.497%205.447%202.964%204.849%20C%202.821%205.447%202.418%205.7460003%201.781%205.7460003%20C%201.248%205.7460003%200.85800004%205.317%200.58500004%204.472%20C%200.455%204.043%200.39000002%203.796%200.39000002%203.7180002%20C%200.39000002%203.601%200.455%203.536%200.598%203.536%20C%200.663%203.536%200.702%203.549%200.741%203.575%20C%200.806%203.6920002%200.845%203.783%200.85800004%203.874%20C%201.092%204.862%201.391%205.356%201.742%205.356%20C%201.9760001%205.356%202.093%205.1740003%202.093%204.823%20C%202.093%204.6280003%202.0670002%204.407%202.002%204.173%20L%200.572%20-1.534%20C%200.455%20-1.963%200.442%20-2.015%20-0.065%20-2.015%20C%20-0.299%20-2.015%20-0.416%20-2.119%20-0.416%20-2.3140001%20C%20-0.416%20-2.457%20-0.338%20-2.522%20-0.19500001%20-2.522%20C%200%20-2.522%200.676%20-2.483%200.871%20-2.483%20C%201.118%20-2.483%201.898%20-2.522%202.145%20-2.522%20C%202.3400002%20-2.522%202.431%20-2.418%202.431%20-2.21%20C%202.431%20-2.08%202.3140001%20-2.015%202.0670002%20-2.015%20C%201.8330001%20-2.015%201.482%20-2.028%201.482%20-1.872%20C%201.482%20-1.7030001%202.015%200.338%202.0670002%200.559%20C%202.3270001%200.078%202.717%20-0.169%203.237%20-0.169%20C%204.0820003%20-0.169%204.823%200.26%205.473%201.131%20C%206.071%201.924%206.3700004%202.769%206.3700004%203.64%20C%206.3700004%204.771%205.6940002%205.7460003%204.6150002%205.7460003%20Z%20M%204.576%205.356%20C%205.083%205.356%205.343%204.966%205.343%204.199%20C%205.343%203.848%205.2650003%203.38%205.122%202.795%20C%204.823%201.664%204.446%200.92300004%203.9910002%200.546%20C%203.7180002%200.32500002%203.471%200.208%203.224%200.208%20C%202.8470001%200.208%202.5870001%200.377%202.444%200.72800004%20C%202.3270001%201.001%202.262%201.196%202.262%201.3000001%20L%202.925%204.017%20C%202.99%204.303%203.224%204.602%203.588%204.901%20C%203.9520001%205.2000003%204.277%205.356%204.576%205.356%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6121818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; was removed from a point cloud, we would leave a
point &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2011.1657%2021.878999999999998%22%20width%3D%2211.1657pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g254AE47CC15CC81C004457B9506AF3F3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.734%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF9C7830800E71C75A67D819743D6D92F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g254AE47CC15CC81C004457B9506AF3F3%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.6150002%205.7460003%20C%204.043%205.7460003%203.497%205.447%202.964%204.849%20C%202.821%205.447%202.418%205.7460003%201.781%205.7460003%20C%201.248%205.7460003%200.85800004%205.317%200.58500004%204.472%20C%200.455%204.043%200.39000002%203.796%200.39000002%203.7180002%20C%200.39000002%203.601%200.455%203.536%200.598%203.536%20C%200.663%203.536%200.702%203.549%200.741%203.575%20C%200.806%203.6920002%200.845%203.783%200.85800004%203.874%20C%201.092%204.862%201.391%205.356%201.742%205.356%20C%201.9760001%205.356%202.093%205.1740003%202.093%204.823%20C%202.093%204.6280003%202.0670002%204.407%202.002%204.173%20L%200.572%20-1.534%20C%200.455%20-1.963%200.442%20-2.015%20-0.065%20-2.015%20C%20-0.299%20-2.015%20-0.416%20-2.119%20-0.416%20-2.3140001%20C%20-0.416%20-2.457%20-0.338%20-2.522%20-0.19500001%20-2.522%20C%200%20-2.522%200.676%20-2.483%200.871%20-2.483%20C%201.118%20-2.483%201.898%20-2.522%202.145%20-2.522%20C%202.3400002%20-2.522%202.431%20-2.418%202.431%20-2.21%20C%202.431%20-2.08%202.3140001%20-2.015%202.0670002%20-2.015%20C%201.8330001%20-2.015%201.482%20-2.028%201.482%20-1.872%20C%201.482%20-1.7030001%202.015%200.338%202.0670002%200.559%20C%202.3270001%200.078%202.717%20-0.169%203.237%20-0.169%20C%204.0820003%20-0.169%204.823%200.26%205.473%201.131%20C%206.071%201.924%206.3700004%202.769%206.3700004%203.64%20C%206.3700004%204.771%205.6940002%205.7460003%204.6150002%205.7460003%20Z%20M%204.576%205.356%20C%205.083%205.356%205.343%204.966%205.343%204.199%20C%205.343%203.848%205.2650003%203.38%205.122%202.795%20C%204.823%201.664%204.446%200.92300004%203.9910002%200.546%20C%203.7180002%200.32500002%203.471%200.208%203.224%200.208%20C%202.8470001%200.208%202.5870001%200.377%202.444%200.72800004%20C%202.3270001%201.001%202.262%201.196%202.262%201.3000001%20L%202.925%204.017%20C%202.99%204.303%203.224%204.602%203.588%204.901%20C%203.9520001%205.2000003%204.277%205.356%204.576%205.356%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF9C7830800E71C75A67D819743D6D92F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.5844002%204.9959%20C%202.3569002%204.9959%202.2022002%204.9049%202.1203%204.7138004%20L%200.59150004%200.8736%20L%201.001%200.8736%20L%203.0212002%204.2133%20C%203.0667002%204.2952003%203.094%204.3862%203.094%204.4863%20C%203.094%204.7593%202.8574002%204.9959%202.5844002%204.9959%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.0150636363636363em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; such that
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2088.25439999999999%2021.878999999999998%22%20width%3D%2288.25439999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g17AF90F25DACF254827E59F8A3A9E6D4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%287.930000000000001%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g254AE47CC15CC81C004457B9506AF3F3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2817.552888888888887%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9B4A74A66763B268E0058C1DD08B5046%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2830.555777777777774%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g254AE47CC15CC81C004457B9506AF3F3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2837.28977777777778%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF9C7830800E71C75A67D819743D6D92F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2841.72147777777778%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g17AF90F25DACF254827E59F8A3A9E6D4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2848.94658888888889%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB96EBFBEC04ED47E748D0E97A693AB26%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2862.671699999999994%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2868.5347%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD93F142C9BA9F4E93A6D76F7A2520C37%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3C402A3AAC495DD2DB174F02BB0D7DF0%22%20x%3D%222.7845999999999997%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFF6C4DA083ADFAFB7235B8E13CB560D4%22%20x%3D%225.314399999999999%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC5B71332A0E90E792E3FAAE3C83A1E5A%22%20x%3D%227.844199999999999%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC7B831D67B171949CBAF4695C0217943%22%20x%3D%2211.384099999999998%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3BD2AAC8F92468FB204CF6E7AF8DFF03%22%20x%3D%2215.424499999999998%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g17AF90F25DACF254827E59F8A3A9E6D4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.807%20-3.25%20C%201.9760001%20-3.25%202.0670002%20-3.1460001%202.0670002%20-2.938%20L%202.0670002%209.438%20C%202.0670002%209.646%201.9760001%209.75%201.807%209.75%20C%201.638%209.75%201.547%209.646%201.547%209.438%20L%201.547%20-2.938%20C%201.547%20-3.1460001%201.638%20-3.25%201.807%20-3.25%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g254AE47CC15CC81C004457B9506AF3F3%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.6150002%205.7460003%20C%204.043%205.7460003%203.497%205.447%202.964%204.849%20C%202.821%205.447%202.418%205.7460003%201.781%205.7460003%20C%201.248%205.7460003%200.85800004%205.317%200.58500004%204.472%20C%200.455%204.043%200.39000002%203.796%200.39000002%203.7180002%20C%200.39000002%203.601%200.455%203.536%200.598%203.536%20C%200.663%203.536%200.702%203.549%200.741%203.575%20C%200.806%203.6920002%200.845%203.783%200.85800004%203.874%20C%201.092%204.862%201.391%205.356%201.742%205.356%20C%201.9760001%205.356%202.093%205.1740003%202.093%204.823%20C%202.093%204.6280003%202.0670002%204.407%202.002%204.173%20L%200.572%20-1.534%20C%200.455%20-1.963%200.442%20-2.015%20-0.065%20-2.015%20C%20-0.299%20-2.015%20-0.416%20-2.119%20-0.416%20-2.3140001%20C%20-0.416%20-2.457%20-0.338%20-2.522%20-0.19500001%20-2.522%20C%200%20-2.522%200.676%20-2.483%200.871%20-2.483%20C%201.118%20-2.483%201.898%20-2.522%202.145%20-2.522%20C%202.3400002%20-2.522%202.431%20-2.418%202.431%20-2.21%20C%202.431%20-2.08%202.3140001%20-2.015%202.0670002%20-2.015%20C%201.8330001%20-2.015%201.482%20-2.028%201.482%20-1.872%20C%201.482%20-1.7030001%202.015%200.338%202.0670002%200.559%20C%202.3270001%200.078%202.717%20-0.169%203.237%20-0.169%20C%204.0820003%20-0.169%204.823%200.26%205.473%201.131%20C%206.071%201.924%206.3700004%202.769%206.3700004%203.64%20C%206.3700004%204.771%205.6940002%205.7460003%204.6150002%205.7460003%20Z%20M%204.576%205.356%20C%205.083%205.356%205.343%204.966%205.343%204.199%20C%205.343%203.848%205.2650003%203.38%205.122%202.795%20C%204.823%201.664%204.446%200.92300004%203.9910002%200.546%20C%203.7180002%200.32500002%203.471%200.208%203.224%200.208%20C%202.8470001%200.208%202.5870001%200.377%202.444%200.72800004%20C%202.3270001%201.001%202.262%201.196%202.262%201.3000001%20L%202.925%204.017%20C%202.99%204.303%203.224%204.602%203.588%204.901%20C%203.9520001%205.2000003%204.277%205.356%204.576%205.356%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9B4A74A66763B268E0058C1DD08B5046%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%203.51%20L%201.04%203.51%20C%200.832%203.51%200.72800004%203.4190001%200.72800004%203.25%20C%200.72800004%203.081%200.832%202.99%201.04%202.99%20L%209.074%202.99%20C%209.282001%202.99%209.386001%203.081%209.386001%203.25%20C%209.386001%203.4060001%209.2300005%203.51%209.074%203.51%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF9C7830800E71C75A67D819743D6D92F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.5844002%204.9959%20C%202.3569002%204.9959%202.2022002%204.9049%202.1203%204.7138004%20L%200.59150004%200.8736%20L%201.001%200.8736%20L%203.0212002%204.2133%20C%203.0667002%204.2952003%203.094%204.3862%203.094%204.4863%20C%203.094%204.7593%202.8574002%204.9959%202.5844002%204.9959%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB96EBFBEC04ED47E748D0E97A693AB26%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%208.684%200.49400002%20C%208.918%200.377%209.139%200.572%209.139%200.78000003%20C%209.139%200.897%209.074%200.98800004%208.957%201.04%20L%202.015%204.329%20L%208.957%207.618%20C%209.074%207.67%209.139%207.761%209.139%207.8780003%20C%209.139%208.099%209.035%208.203%208.827001%208.203%20C%208.775001%208.203%208.723001%208.190001%208.684%208.177%20L%201.222%204.6410003%20C%201.092%204.576%201.0270001%204.472%201.0270001%204.329%20C%201.0270001%204.186%201.092%204.0950003%201.222%204.03%20Z%20M%208.814%20-0.936%20L%201.3000001%20-0.936%20C%201.092%20-0.936%200.98800004%20-1.04%200.98800004%20-1.235%20C%200.98800004%20-1.4430001%201.092%20-1.547%201.3000001%20-1.547%20L%208.814%20-1.547%20C%209.022%20-1.547%209.126%20-1.4430001%209.126%20-1.235%20C%209.126%20-1.079%208.983%20-0.936%208.814%20-0.936%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD93F142C9BA9F4E93A6D76F7A2520C37%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.4115002%206.4155%20C%201.6016%206.4155%201.001%205.7603%201.001%204.9504004%20L%201.001%203.9494002%20L%200.3003%203.9494002%20L%200.3003%203.6036003%20L%201.001%203.6036003%20L%201.001%200.7189%20C%201.001%200.546%200.97370005%200.4368%200.91%200.4004%20C%200.8463%200.36400002%200.64610004%200.3549%200.30940002%200.3549%20L%200.30940002%200%20L%201.3559%200.0273%20C%201.7381%200.0364%202.1294%200.0273%202.5207002%200%20L%202.5207002%200.3549%20L%202.3023%200.3549%20C%202.002%200.3549%201.8109001%200.3731%201.7472%200.41860002%20C%201.6835%200.46410003%201.6562%200.5733%201.6562%200.7371%20L%201.6562%203.6036003%20L%202.6754%203.6036003%20L%202.6754%203.9494002%20L%201.6289%203.9494002%20L%201.6289%204.9595003%20C%201.6289%205.5055003%201.9110001%206.1425004%202.4115002%206.1425004%20C%202.4843001%206.1425004%202.548%206.1334004%202.6117%206.1152%20C%202.4752002%206.0424004%202.4024%205.9150004%202.4024%205.7421002%20C%202.4024%205.46%202.5389001%205.3144%202.821%205.3144%20C%203.1031%205.3144%203.2487001%205.46%203.2487001%205.7512%20C%203.2487001%206.1607003%202.821%206.4155%202.4115002%206.4155%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3C402A3AAC495DD2DB174F02BB0D7DF0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.7654%205.4691%20C%201.7654%205.7421002%201.5379001%205.9787%201.2649001%205.9787%20C%200.9919%205.9787%200.75530005%205.7421002%200.75530005%205.4691%20C%200.75530005%205.1961%200.98280007%204.9504004%201.2558%204.9504004%20C%201.5379001%204.9504004%201.7654%205.1870003%201.7654%205.4691%20Z%20M%201.3013%200.0273%20L%202.2477%200%20L%202.2477%200.3549%20C%201.9474001%200.3549%201.7654%200.3731%201.7108%200.4095%20C%201.6562%200.44590002%201.638%200.546%201.638%200.7098%20L%201.638%204.0495%20L%200.33670002%203.9403002%20L%200.33670002%203.5945%20C%200.637%203.5945%200.8281%203.5672002%200.89180005%203.5217001%20C%200.95550007%203.4762%200.98280007%203.3488002%200.98280007%203.1395001%20L%200.98280007%200.7189%20C%200.98280007%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3549%200.3003%200.3549%20L%200.3003%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gFF6C4DA083ADFAFB7235B8E13CB560D4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.3104%200.0273%20L%202.3205001%200%20L%202.3205001%200.3549%20C%201.9929001%200.3549%201.7927%200.36400002%201.7290001%200.4004%20C%201.6653%200.4368%201.638%200.546%201.638%200.7189%20L%201.638%206.3154%20L%200.3003%206.2153%20L%200.3003%205.8695%20C%200.61880004%205.8695%200.819%205.8422003%200.8827%205.7876%20C%200.94640005%205.7330003%200.98280007%205.6056004%200.98280007%205.3963003%20L%200.98280007%200.7189%20C%200.98280007%200.546%200.95550007%200.4368%200.89180005%200.4004%20C%200.8281%200.36400002%200.6279%200.3549%200.3003%200.3549%20L%200.3003%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC5B71332A0E90E792E3FAAE3C83A1E5A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.0212002%201.1466%20L%203.0212002%201.6926%20L%202.73%201.6926%20L%202.73%201.1648%20C%202.73%200.7098%202.5662%200.2002%202.1658%200.2002%20C%201.7927%200.2002%201.6107%200.50960004%201.6107%201.1284001%20L%201.6107%203.5945%20L%202.8756%203.5945%20L%202.8756%203.9403002%20L%201.6107%203.9403002%20L%201.6107%205.5965004%20L%201.3195001%205.5965004%20C%201.3104%205.2962003%201.2831%205.0323%201.2194%204.7957%20C%201.0647%204.1951003%200.7098%203.8857002%200.1729%203.8584%20L%200.1729%203.5945%20L%200.92820007%203.5945%20L%200.92820007%201.1466%20C%200.92820007%200.6097%201.092%200.2639%201.4105%200.091000006%20C%201.6562%20-0.0364%201.8837001%20-0.1001%202.1112%20-0.1001%20C%202.7118%20-0.1001%203.0212002%200.5005%203.0212002%201.1466%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC7B831D67B171949CBAF4695C0217943%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.7765002%202.2841%20C%203.7765002%203.3306%203.1668%204.0768003%202.1476002%204.0768003%20C%201.6016%204.0768003%201.1466%203.8675%200.7735%203.4398%20C%200.4277%203.0394%200.25480002%202.5571%200.25480002%202.002%20C%200.25480002%201.4287001%200.44590002%200.94640005%200.8281%200.5278%20C%201.2103001%200.1092%201.6835%20-0.1001%202.2477%20-0.1001%20C%202.7664%20-0.1001%203.1668%200.0819%203.4398%200.4368%20C%203.6673002%200.7371%203.7765002%200.95550007%203.7765002%201.1011001%20C%203.7765002%201.1921%203.7219002%201.2376001%203.6218002%201.2376001%20C%203.5490003%201.2376001%203.5035002%201.1921%203.4762%201.092%20C%203.276%200.49140003%202.8847%200.1911%202.3023%200.1911%20C%201.8928001%200.1911%201.5743%200.3822%201.3286%200.7735%20C%201.1557001%201.0556%201.0738001%201.4833001%201.0647%202.0657%20L%203.5217001%202.0657%20C%203.7219002%202.0657%203.7765002%202.0839%203.7765002%202.2841%20Z%20M%202.9666002%203.1759002%20C%203.0667002%202.8756%203.1122%202.5844002%203.1122%202.3205001%20L%201.0738001%202.3205001%20C%201.1011001%202.9211001%201.2558%203.3306%201.5288%203.5399%20C%201.7563001%203.7219002%201.9565%203.8129%202.1476002%203.8129%20C%202.5571%203.8129%202.8301%203.6036003%202.9666002%203.1759002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3BD2AAC8F92468FB204CF6E7AF8DFF03%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.3124%203.4398%20C%203.3124%203.7947001%202.9757001%204.0222%202.6208%204.0222%20C%202.1567001%204.0222%201.8018001%203.7492%201.5652001%203.1941001%20L%201.5652001%204.0222%20L%200.25480002%203.9221%20L%200.25480002%203.5763001%20C%200.5733%203.5763001%200.7644%203.5490003%200.83720005%203.4944%20C%200.91%203.4398%200.94640005%203.3215%200.94640005%203.1122%20L%200.94640005%200.7189%20C%200.94640005%200.546%200.91910005%200.4368%200.8554%200.4004%20C%200.7917%200.36400002%200.59150004%200.3458%200.25480002%200.3458%20L%200.25480002%200%20L%201.3013%200.0273%20C%201.6835%200.0364%202.0748%200.0273%202.4661002%200%20L%202.4661002%200.3458%20L%202.2477%200.3458%20C%201.9474001%200.3458%201.7563001%200.3731%201.6926%200.41860002%20C%201.6289%200.46410003%201.6016%200.5733%201.6016%200.7371%20L%201.6016%202.1112%20C%201.6016%202.5025%201.6744001%202.8574002%201.8109001%203.1577%20C%201.9929001%203.5490003%202.2568002%203.7492%202.6117%203.7583%20C%202.5207002%203.6673002%202.4752002%203.5581002%202.4752002%203.4307%20C%202.4752002%203.1486%202.6117%203.0121002%202.8938%203.0121002%20C%203.1395001%203.0121002%203.3124%203.2032%203.3124%203.4398%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 8.023127272727272em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;. From that, we derived a
proof that this filter wouldn’t produce gaps (based on the dispersion
of the point cloud), and from there on we proved that the whole pipeline
was correct. However, we didn’t explain which definition of dispersion
we were using, and so there were maybe ten people on the planet who
would have had a chance at understanding what we claimed at all.&lt;&#x2F;p&gt;
&lt;p&gt;The reviewers rightfully called us out on such nonsense, and thankfully,
there is a definition of dispersion which does make this proof work (see
LaValle, Planning Algorithms, sec. 5.2.3), so we got away with it in the
end.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;becoming-a-marketer&quot;&gt;Becoming a marketer&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;I think you shoulg go to Japan&lt;&#x2F;p&gt;
&lt;footer&gt;Email subject from my advisor, sent at 12:01 AM [sic]&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Very little of an academic’s time is spent doing worthy research;
instead, they mostly try to convince others that their research is worth
doing. For the entirety of April and May, my efforts have been mostly
directed that way: preparing materials and advertising my work.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;captree&#x2F;teros.png&quot; alt=&quot;Me, presenting my poster at TEROS.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;figcaption&gt;Me, presenting my poster at TEROS.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;I started out small with a poster presentation at
&lt;a href=&quot;https:&#x2F;&#x2F;teros-texas.github.io&#x2F;&quot;&gt;TEROS&lt;&#x2F;a&gt;, a small symposium at Texas A&amp;amp;M.
When I printed the poster, however, I picked the wrong version: I
printed a PDF with feedback attached as comments. I only found out that
my poster was covered in yellow highlights when I arrived. It was too
late to fix, so I just didn’t mention the highlighting to anyone else.
In spite of this, I had a pretty fun time there, and it seems like there
were a handful of people interested in the work.&lt;&#x2F;p&gt;
&lt;p&gt;At my university, first-year Ph.D. students are given a $2500 grant for
either conference travel or a laptop to be spent in their first year. By
March, I hadn’t spent any of that grant money, since my current laptop
was still working correctly. Accordingly, I got the above email header
from my advisor, Lydia - &lt;a href=&quot;https:&#x2F;&#x2F;2024.ieee-icra.org&#x2F;&quot;&gt;ICRA 2024&lt;&#x2F;a&gt; was in
Yokohama, Japan this year, and I showed up at a workshop with a
trimmed-down version of my paper.&lt;&#x2F;p&gt;
&lt;figure style=&quot;display: flex&quot;&gt;
&lt;div style=&quot;width: 47.5%&quot;&gt;
&lt;img src=&quot;icra.jpg&quot; &#x2F;&gt;
The conference venue at ICRA.
&lt;&#x2F;div&gt;
&lt;div style=&quot;width: 5%&quot;&gt;
&lt;&#x2F;div&gt;
&lt;div style=&quot;width: 47.5%&quot;&gt;
&lt;img src=&quot;icra_pres.jpg&quot; &#x2F;&gt;
I promise I own more than one shirt.
&lt;&#x2F;div&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;ICRA was my first conference, and I thought it was pretty cool! I got to
see a lot of really exciting work from across the field, and it seems
like a number of people were also excited about my work. To be
completely honest, I also found that the oral presentations were simply
not worth it - it’s too easy to zone out, and it’s never at the right
amount of detail. Instead, the best place to hang out is in the poster
presentation area, because you can talk directly to the authors and get
a much better sense of their work.&lt;&#x2F;p&gt;
&lt;p&gt;The last major bit of marketing was of course this blog post; though, to
be honest, it’s more for my personal pleasure than it is to try to drum
up interest.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;terminus&quot;&gt;Terminus&lt;&#x2F;h2&gt;
&lt;p&gt;The last few months of my degree has been a lot of work, but also a lot
of fun! I originally hadn’t believed that I could get all this done in
such a short time. I’ll admit, I’ve sort of impostor-syndromed myself:
my advisor, Lydia, was very impressed with my work, but it feels to me
that my collaborators, Wil and Zak, did a lot of the “real” work. Now
expectations are higher, and I have to figure out how to make something
this good &lt;em&gt;again&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;That being said, I’m still pretty excited for the future! I think this
is a good first step for my research, and it’s opened up a lot of
avenues for me. There are a lot of applications for fast planning out
there, and I’m thinking that I can explore a few to get a full thesis.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Things I learned from teaching</title>
          <pubDate>Tue, 05 Dec 2023 00:00:00 +0000</pubDate>
          <author>Clayton Ramsey</author>
          <link>https://claytonwramsey.com/blog/learned-from-teaching/</link>
          <guid>https://claytonwramsey.com/blog/learned-from-teaching/</guid>
          <description xml:base="https://claytonwramsey.com/blog/learned-from-teaching/">&lt;p&gt;This spring, I taught an undergraduate class on chess engines. I
probably learned more than any of my students.&lt;&#x2F;p&gt;
&lt;p&gt;As a senior in college, I was the instructor, lecturer, grader, master
of ceremonies, and grand poobah of COLL 110: Artificial Intelligence for
Chess, 6-7 P.M. every Tuesday for the whole semester. In theory, I had a
faculty advisor, but he was busy most of the time, so at the end of the
day, it was my rodeo and I got to figure it all out on my own. I thought
it was a great experience!&lt;&#x2F;p&gt;
&lt;p&gt;I’m writing this post for a few reasons: first, I want to write down
the things I wish that I had known before I started teaching, in the
hopes that other soon-to-be teachers might take this to heart. The other
reason is to compile my own thoughts on the matter, since I’ll possibly
revive this class in the future, and want to have some notes while it’s
fresh in my mind.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;you-re-not-even-their-second-priority&quot;&gt;You’re not even their second priority&lt;&#x2F;h2&gt;
&lt;p&gt;If you’re teaching a topic, you’re probably really passionate about it
(unless, of course, the department forced you to teach the class). At
the very least, I am. Chess engines are cool. Lucky for me, students
taking a COLL course get little in the way of credit for the class, so
most of my pupils were also pretty stoked about it. At the end of the
day, though, they’re not getting a Ph.D. in this stuff, and they’ve
got half a dozen other classes on top of work, family, friends, and this
weekend’s party to think about.&lt;&#x2F;p&gt;
&lt;p&gt;To an instructor, this tends to manifest as an air of boredom with the
whole topic. Often, the students aren’t actually bored! They just
don’t have the time or energy for the topic that I do.&lt;&#x2F;p&gt;
&lt;p&gt;The fix, I think, is to meet students where they are. The hard (and
rewarding) part of teaching a class is that I needed to digest reams of
material into brief, easily-comprehensible components. I have the
patience to trawl through uncommented C++ code and ancient forum posts
to figure out how to build a good chess engine, but the students
shouldn’t need it.&lt;&#x2F;p&gt;
&lt;p&gt;I’m not a hundred percent certain of the exact mechanisms of &lt;em&gt;how&lt;&#x2F;em&gt;,
yet. In my experience, I learn the most when I struggle; if a student
can shortcut through all the hard parts on, for example, an assignment,
they’re not going to learn very much. On the flip side, when most
students struggle, they just give up. Somehow I need to make assignments
which thread the needle between being too hard to solve and too easy to
learn anything.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;students-have-wildly-varying-backgrounds&quot;&gt;Students have wildly varying backgrounds&lt;&#x2F;h2&gt;
&lt;p&gt;Chess engines are a relatively niche topic in computer science, so I was
quite surprised to see that my class section was completely full at the
start of the semester. It seems as though most of the students had been
clickbaited by my mention of AI in the title, which is more a callout
for classical artificial intelligence than it is for the modern
machine-learning approaches.&lt;&#x2F;p&gt;
&lt;p&gt;Although a handful of students dropped the course, I was eventually left
with about a dozen students whose experience and programming skill
varied wildly. Some of my students had finished little more than an
introductory computer science course, while others were more qualified
than I was.&lt;&#x2F;p&gt;
&lt;p&gt;This presents a fundamental problem: how do I come up with a curriculum
which is complex enough to excite the experienced students without
completely losing the less experienced ones? The cynical answer is “you
can’t,” but I did give it a fair attempt, and I think it turned out
OK. Typically, I tried to integrate a mix of skill levels into my
lectures; for instance, when discussing the representation of squares
and directions, I spent a few minutes explaining how they could be
modeled with torsors, but not so long that I would lose the students who
neither knew nor cared about group theory.&lt;&#x2F;p&gt;
&lt;p&gt;Assignment design is harder. I tried to give interesting challenges by
leaving bonus tasks on every assignment, and for the final project, I
gave a choose-your-own-adventure assignment which allowed students to
pick a task that matched their skill level. However, I’m not convinced
that I perfected this approach, so I will need to think more deeply on
how do design “multi-level” projects for a mixed student body.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;engagement-falls-off-in-the-first-ten-minutes&quot;&gt;Engagement falls off in the first ten minutes&lt;&#x2F;h2&gt;
&lt;p&gt;COLL 110 was a standard lectures-and-assignments college class - I
lectured during our scheduled meeting time, then students did their
projects on their own. Having tried this, I think that this is just not
the future of education. This mode of teaching is designed mostly for
the lecturer’s convenience, but it’s a terrible way to foster student
understanding.&lt;&#x2F;p&gt;
&lt;p&gt;The fundamental reality is that it’s impossible to listen actively for
a long period of time. It was even worse in my case: I was teaching a
blow-off class at the end of the day, so students were already tired and
didn’t feel any pressure to keep up. The net result was that only about
half of my students were really paying attention at a time, which is
pretty bad if you want them to actually learn anything.&lt;&#x2F;p&gt;
&lt;p&gt;I’m certain that I will need to use a different format for lessons in
the future. Flipped classrooms are popular these days, so I might try
that, but I also feel that pre-recorded lectures are a little soulless.
I might try a hybrid approach, integrating lectures with assignments.&lt;&#x2F;p&gt;
&lt;p&gt;In terms of engagement, one of the best lectures I ever gave was the
introduction to Rust. This was because I got people to pull up the &lt;a href=&quot;https:&#x2F;&#x2F;play.rust-lang.org&#x2F;&quot;&gt;Rust
Playground&lt;&#x2F;a&gt; on their laptops, so they were
actively running and debugging code in class and I could work with them.
Moving forward, I want to try stuff like this some more:
fully-interactive in-class content which revolves around student
experimentation.&lt;&#x2F;p&gt;
&lt;p&gt;Easier said than done, though. Getting people to code in person is
actually quite difficult, and if there’s only one of me, I can’t keep
up with every student at once. COMP 140, the introductory CS class at
Rice, manages this with a small army of TAs who can keep up with all the
students, but I don’t have any TAs to do that for me.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;nobody-goes-to-office-hours&quot;&gt;Nobody goes to office hours&lt;&#x2F;h2&gt;
&lt;p&gt;On every assignment, one of my students would write something like this
in the comments of their submission.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; This doesn&amp;#39;t work and I don&amp;#39;t know why.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; I didn&amp;#39;t have enough time to figure it out.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And, invariably, every &lt;em&gt;single&lt;&#x2F;em&gt; time, the problem with their work was
something that I could have (and would have happily) explained to them
at office hours or even in an email. It saddens me greatly to see these
kinds of submissions, since it’s evidence of a completely solvable
problem.&lt;&#x2F;p&gt;
&lt;p&gt;I really love getting to work with students one-on-one. It often reveals
gaps in understanding that aren’t obvious in lecture or in assignments,
and also shows me where I’m failing to cover material. One of my best
experiences when holding office hours was when I got to explain how the
function call stack works to an underclassman, and it was really
fulfilling to see how it “clicked” for them. When students show up to
office hours, it’s extremely valuable for me and for them.&lt;&#x2F;p&gt;
&lt;p&gt;I think that there are a few reasons that students don’t like to show
up to office hours. The first, simplest reason, is simply availability.
I think a lot of students start their projects far later than they
really ought to, and so by the time that they get stuck, there aren’t
any office hours between then and the due date. The easiest fix is to
make office hours available on the same day that assignments are due, so
that I can be available when students are working on the assignment.&lt;&#x2F;p&gt;
&lt;p&gt;The second issue is comfort: sometimes, students feel like they’re
imposing on their instructors’ time by showing up to office hours. This
isn’t helped by the fact that some professors can be downright &lt;em&gt;mean&lt;&#x2F;em&gt;
to their students at office hours, which can leave a bad taste in
students’ mouths, even for other classes. When I spoke to one of my
instructional advisors about this, she recommended that I refer to
office hours as “student hours” instead, in order to set the
expectation that it’s there for the students’ benefit.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;takeaways&quot;&gt;Takeaways&lt;&#x2F;h2&gt;
&lt;p&gt;I didn’t come away from teaching this class feeling like I had mastered
the art of pedagogy, or even thinking that I was half decent. I suspect
that the core challenges that I faced were much the same as with any
other class, though perhaps exacerbated by COLL 110’s status as an
elective.&lt;&#x2F;p&gt;
&lt;p&gt;Even then, I think it was a great opportunity for me to learn and grow
as a person, and has helped me a lot, especially in writing, public
speaking, and professional communication. If you’re on the fence about
teaching, you should definitely give it a try, if only because
interacting with students is such a rewarding experience.&lt;&#x2F;p&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;shreyasminocha.me&#x2F;&quot;&gt;Shreyas&lt;&#x2F;a&gt; and Charlie for
reviewing this article.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Writing my own damn HTML</title>
          <pubDate>Sat, 07 Oct 2023 00:00:00 +0000</pubDate>
          <author>Clayton Ramsey</author>
          <link>https://claytonwramsey.com/blog/own-html/</link>
          <guid>https://claytonwramsey.com/blog/own-html/</guid>
          <description xml:base="https://claytonwramsey.com/blog/own-html/">&lt;p&gt;The future of the web doesn’t have to be webapp frameworks and cookie
prompts.&lt;&#x2F;p&gt;
&lt;p&gt;This week, I rewrote my website from scratch. Earlier, I had used
&lt;a href=&quot;https:&#x2F;&#x2F;jekyllrb.com&#x2F;&quot;&gt;Jekyll&lt;&#x2F;a&gt; to generate my website, but I had gotten
sick of it. In particular, I didn’t like having to add hack upon hack
to get things to render the way I wanted to, I didn’t like the hacky
build system, and I didn’t like having to debug the mishmash of
mismatched versions, outdated documentation, and broken Ruby
environments.&lt;&#x2F;p&gt;
&lt;p&gt;In all, I think it’s been a really fun experience! To be completely
honest, I think that building this site in vanilla HTML was &lt;em&gt;easier&lt;&#x2F;em&gt;
than doing it with Jekyll. The only thing I really miss is writing up my
blog posts in Markdown, because I can write a little faster in it.&lt;&#x2F;p&gt;
&lt;p&gt;More importantly, I think that everyone in the business of having a
personal website should consider writing their own HTML - maybe we
actually got it right in the nineties. I’ll explain in further detail
below.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;it-s-not-as-hard-as-you-think-it-is&quot;&gt;It’s not as hard as you think it is&lt;&#x2F;h2&gt;
&lt;p&gt;HTML, at heart, is a very simple format. It’s a little ugly, but being
ugly didn’t stop us from using C++ either. Shipping your website is as
simple as serving some webpages. If you’re like me, and just serving
some text and pictures, it’s not worth the effort of minifying your
HTML to save a whole kilobyte of data - you can just serve a page as you
wrote it.&lt;&#x2F;p&gt;
&lt;p&gt;I think the main monotonous part of working with raw HTML is the stuff
that’s common across pages - things like the header and footer on this
very website. For now, I’m perfectly comfortable using a mix of
copy-paste and find-and-replace on the 8 pages I have on this website.
Later on, I think I might use a hack with CSS’s &lt;code&gt;:before&lt;&#x2F;code&gt; and &lt;code&gt;:after&lt;&#x2F;code&gt;
in case I decide I don’t like it, but for now, I think this is OK.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;getting-fine-grained-control&quot;&gt;Getting fine-grained control&lt;&#x2F;h2&gt;
&lt;p&gt;I’m not a huge stickler for the way that my websites look, but I do
think that classic, simple HTML is gorgeous. You only need a tiny bit of
CSS to make a website that’s simple, clean, and good-looking.&lt;&#x2F;p&gt;
&lt;p&gt;However, I see my website as a sort of self-expression project - kind of
like a zen garden, but for people who don’t go outside. Building a
website should be &lt;em&gt;fun&lt;&#x2F;em&gt;, and we (as writers) should be able to
experiment with the ways that they look. Right now, I’m aiming for a
look that blends in with native interfaces, but I might change that
later. Maybe I could go for the 1999 GeoCities look with hot pink
backgrounds and abuse of &lt;code&gt;&amp;lt;marquee&amp;gt;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The thrust of my blog so far seems to have been towards a mix of math,
algorithms, and software engineering. Accordingly, I use a handful of
scripts (&lt;a href=&quot;https:&#x2F;&#x2F;www.mathjax.org&#x2F;&quot;&gt;MathJax&lt;&#x2F;a&gt; and
&lt;a href=&quot;https:&#x2F;&#x2F;highlightjs.org&#x2F;&quot;&gt;Highlight.js&lt;&#x2F;a&gt;) to do so. I suppose that
differentiates me from the HTML-only purists, but I think it’s a worthy
tradeoff. You probably have your own preferences on scripts - do it
however you like.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;need-for-speed&quot;&gt;Need for speed&lt;&#x2F;h2&gt;
&lt;p&gt;Most websites I visit regularly are just embarrassing. They take
multiple seconds to load on my 100 Mbps university network. Think about
that!&lt;&#x2F;p&gt;
&lt;p&gt;A handwritten letter is often no more than a thousand words, probably
only a few kilobytes. The HTML for this page is nine kilobytes. Modern
websites, somehow, manage to ship dozens of &lt;em&gt;megabytes&lt;&#x2F;em&gt; every time you
load a page. We often underestimate how wasteful - and, frankly, how
annoying - this is.&lt;&#x2F;p&gt;
&lt;p&gt;Browsers and web connections are actually extremely performant. The
human race as a whole has spent millions of engineer-hours just on
making web pages load faster. When we lean into it and start using
simple, clean HTML, it lets the browser’s performance really shine. Try
refreshing this page and seeing if you notice how long it takes!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;built-to-last&quot;&gt;Built to last&lt;&#x2F;h2&gt;
&lt;p&gt;I’m often bothered by the fact that software &lt;em&gt;rots.&lt;&#x2F;em&gt; It feels like it
shouldn’t happen - it’s just bits! They can be copied losslessly! In
actuality, I don’t think it’s the software that rots - it’s the
institutions and conventions surrounding it. Try getting someone’s C++
project from 15 years ago building from source today - if there’s any
third-party libraries involved, you might as well just give up and go
home. This is the rule, not the exception, when it comes to software.&lt;&#x2F;p&gt;
&lt;p&gt;But HTML is surprisingly evergreen! I can visit a website designed in
1995 and see it (almost) exactly as the original author intended, except
with a much higher DPI. We often don’t appreciate how incredible that
fact is.&lt;&#x2F;p&gt;
&lt;p&gt;There’s a bit of a tradeoff between control and resilience, though.
Pure HTML is relatively inflexible, but JavaScript libraries rot and
triply so for third-party scripts, fonts, and styles. We can mitigate
this, though. In my case, I self-host the extra JS libraries that I use
to reduce dependency on third parties. I haven’t gotten around to
self-hosting MathJax yet because I haven’t quite figured out what to do
with the fonts. I’ll do it eventually, though.&lt;&#x2F;p&gt;
&lt;p&gt;I’ll probably lose interest in this website someday, or perhaps I’ll
move it to another domain. When that happens, I want to make sure that
it’s something that I can easily maintain - something simple, that I
can run cross-platform, without pain. Pure HTML is about as close to
getting to zero dependencies as I can get without writing my own web
server.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;simplicity-counts&quot;&gt;Simplicity counts&lt;&#x2F;h2&gt;
&lt;p&gt;I really love Guy Steele’s 1998 talk, &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=lw6TaiXzHAE&quot;&gt;Growing a
Language&lt;&#x2F;a&gt;. It’s a delight,
and if you haven’t seen it, you should stop reading this essay and go
watch it. There are a number of great gems in there, but the one I’m
interested in is buried in his final remarks.&lt;&#x2F;p&gt;
&lt;p&gt;I’ll spoil the conceit of the talk here here: Steele restricts himself
to using only one-syllable words and the words he defines from them
during the talk. At the very end, he says the following.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have found that this mode of speech makes it hard to hedge. It takes
work and great care and some skill to find just the right way to say
what you want to say, but in the end, you seem to have no choice but
to talk straight. If you do not veer wide of the truth you are forced
to hit it dead on.&lt;&#x2F;p&gt;
&lt;footer&gt;Guy Steele, Growing A Language, 1998&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;I think the same reasoning applies to restricting ourselves to simple,
reliable tools. When we’re writing every tag, we get to ask ourselves
questions like “is adding this div really worth it?” and “can I find
an easier way to do this?”. Simple tools force us to reason about
what’s actually important and cut away everything else. That’s the
heart of the simple web - it’s a shortcut to the things that we truly
value.&lt;&#x2F;p&gt;
&lt;p&gt;Thank you for reading this.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>One line of code cost me 9.2% of my matches</title>
          <pubDate>Thu, 21 Sep 2023 00:00:00 +0000</pubDate>
          <author>Clayton Ramsey</author>
          <link>https://claytonwramsey.com/blog/sixty-four-elo/</link>
          <guid>https://claytonwramsey.com/blog/sixty-four-elo/</guid>
          <description xml:base="https://claytonwramsey.com/blog/sixty-four-elo/">&lt;p&gt;I can either write a hundred lines of code for one or two Elo or find
one or two wrong lines of code for a hundred Elo. Such is life.&lt;&#x2F;p&gt;
&lt;p&gt;My long-running slow-burn side project is &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;claytonwramsey&#x2F;fiddler&quot;&gt;Fiddler, a chess
engine&lt;&#x2F;a&gt;. The &lt;a href=&quot;&#x2F;blog&#x2F;fiddler-const-magic&quot;&gt;last
time&lt;&#x2F;a&gt; I wrote about it, I wrote about 300
lines of code to get a 6 Elo improvement, equivalent to a 1% improvement
to its match performance. This time, I’m writing about a more recent
development, when I edited one line of code to get a 64 Elo improvement,
for about a 9.2% improvement in match performance.&lt;&#x2F;p&gt;
&lt;p&gt;To avoid clickbaiting you, here’s the line in question.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; best_score &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt; beta &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;BoundType&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Upper &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;else&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;BoundType&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Lower &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;However you’ll have to read the rest of this post for a full
explanation..&lt;&#x2F;p&gt;
&lt;h2 id=&quot;learning-to-sing-the-alpha-beta&quot;&gt;Learning to sing the alpha-beta&lt;&#x2F;h2&gt;
&lt;p&gt;Our story begins with the foundational algorithm of all classical chess
engines: alpha-beta search. It’s a small, yet critical improvement to
the Minimax algorithm. By adding a set of bounds parameters, we can
reduce the runtime of searching a game tree with branch factor &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%205.759%2021.878999999999998%22%20width%3D%225.759pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB2B0D162BF0EF17F805166E1C67260EF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.653%205.7850003%20C%203.1850002%205.7850003%202.717%205.564%202.262%205.122%20L%203.1590002%208.827001%20C%203.1330001%208.944%203.094%209.022%202.938%209.022%20C%202.509%209.022%201.5600001%208.905%201.391%208.892%20C%201.196%208.866%201.092%208.775001%201.092%208.58%20C%201.092%208.45%201.209%208.385%201.4560001%208.385%20C%201.7030001%208.385%202.0410001%208.398%202.0410001%208.216001%20C%202.0410001%208.1640005%201.9760001%207.9040003%201.8590001%207.4230003%20L%200.819%203.237%20C%200.676%202.691%200.611%202.249%200.611%201.924%20C%200.611%200.806%201.209%20-0.143%202.275%20-0.143%20C%203.1200001%20-0.143%203.861%200.286%204.511%201.1570001%20C%205.096%201.963%205.395%202.808%205.395%203.6790001%20C%205.395%204.81%204.732%205.7850003%203.653%205.7850003%20Z%20M%203.627%205.395%20C%204.1340003%205.395%204.381%205.005%204.381%204.238%20C%204.381%203.887%204.303%203.4190001%204.1470003%202.834%20C%203.861%201.7290001%203.484%200.975%203.029%200.572%20C%202.769%200.351%202.522%200.24700001%202.275%200.24700001%20C%201.742%200.24700001%201.482%200.663%201.482%201.495%20C%201.482%201.781%201.547%202.21%201.677%202.782%20L%201.963%203.9520001%20C%202.002%204.1470003%202.0670002%204.29%202.145%204.394%20C%202.652%205.057%203.1460001%205.395%203.627%205.395%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5235454545454545em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; and
depth &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.072%2021.878999999999998%22%20width%3D%227.072pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCDDDDB813AECDB19325F79754C18CBB0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCDDDDB813AECDB19325F79754C18CBB0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.577%208.216001%20L%204.81%205.057%20C%204.537%205.538%204.16%205.7850003%203.653%205.7850003%20C%202.808%205.7850003%202.0670002%205.356%201.417%204.485%20C%200.819%203.6790001%200.52%202.834%200.52%201.963%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.767%20C%204.043%200.273%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2790003%200.92300004%206.474%201.885%20C%206.474%202.002%206.409%202.0670002%206.2790003%202.0670002%20C%206.162%202.0670002%206.084%201.9760001%206.045%201.794%20C%205.7850003%200.767%205.473%200.24700001%205.122%200.24700001%20C%204.901%200.24700001%204.784%200.42900002%204.784%200.78000003%20C%204.784%200.975%204.81%201.183%204.862%201.391%20L%206.708%208.827001%20L%206.708%208.879%20C%206.669%208.97%206.591%209.022%206.487%209.022%20C%206.188%209.022%205.642%208.97%204.862%208.879%20C%204.719%208.866%204.6410003%208.762%204.6410003%208.58%20C%204.6410003%208.45%204.758%208.385%204.992%208.385%20C%205.2390003%208.385%205.577%208.398%205.577%208.216001%20Z%20M%204.433%204.888%20C%204.563%204.6150002%204.6280003%204.433%204.6280003%204.316%20C%204.6150002%204.264%204.602%204.199%204.589%204.1080003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.546%202.756%200.24700001%202.301%200.24700001%20C%201.794%200.24700001%201.534%200.637%201.534%201.404%20C%201.534%201.7160001%201.612%202.184%201.768%202.808%20C%202.0410001%203.913%202.431%204.6670003%202.9120002%205.07%20C%203.1720002%205.291%203.4190001%205.395%203.6660001%205.395%20C%204.017%205.395%204.277%205.2260003%204.433%204.888%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6429090909090909em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; from &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2033.8663%2021.878999999999998%22%20width%3D%2233.8663pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD64B3975C9A5026604F20A029CCF2ADF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.984%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC7AD20454BEC732876152EDE59FA9AEB%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.938000000000002%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2821.697000000000003%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7A67872FDEAEDD509D57DA1657D4DBCB%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2827.912300000000002%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g31CFB297CEF58BE5D1DA002DF62F6E89%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD64B3975C9A5026604F20A029CCF2ADF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.126%203.4190001%20C%209.451%204.16%209.62%204.901%209.62%205.655%20C%209.62%206.669%209.321%207.501%208.71%208.1640005%20C%208.099%208.827001%207.293%209.165%206.2920003%209.165%20C%205.603%209.165%204.914%208.996%204.225%208.658%20C%202.821%207.9690003%201.794%206.8770003%201.131%205.395%20C%200.806%204.6670003%200.637%203.9390001%200.637%203.198%20C%200.637%202.171%200.936%201.339%201.547%200.689%20C%202.158%200.039%202.964%20-0.286%203.9780002%20-0.286%20C%204.6540003%20-0.286%205.33%20-0.117%206.019%200.208%20C%207.4360003%200.897%208.463%201.9760001%209.126%203.4190001%20Z%20M%208.372%206.162%20C%208.372%204.433%207.592%202.704%206.76%201.677%20C%206.188%200.962%205.2000003%200.156%204.056%200.156%20C%202.665%200.156%201.937%201.365%201.937%202.834%20C%201.937%203.289%202.028%203.9%202.197%204.6410003%20C%202.548%206.175%203.4320002%207.527%204.589%208.229%20C%205.1480002%208.567%205.6940002%208.736%206.214%208.736%20C%207.618%208.736%208.372%207.618%208.372%206.162%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC7AD20454BEC732876152EDE59FA9AEB%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.94%20-4.511%20C%205.07%20-4.511%205.135%20-4.446%205.135%20-4.316%20C%205.135%20-4.251%205.109%20-4.199%205.07%20-4.16%20C%204.277%20-3.549%203.64%20-2.548%203.1590002%20-1.144%20C%202.743%200.065%202.535%201.261%202.535%202.418%20L%202.535%204.0820003%20C%202.535%205.2390003%202.743%206.435%203.1590002%207.644%20C%203.64%209.048%204.277%2010.049%205.07%2010.66%20C%205.109%2010.699%205.135%2010.751%205.135%2010.816%20C%205.135%2010.946%205.07%2011.011001%204.94%2011.011001%20C%204.914%2011.011001%204.875%2010.998%204.836%2010.972%20C%203.926%2010.283%203.1720002%209.243%202.5740001%207.852%20C%201.9890001%206.539%201.7030001%205.278%201.7030001%204.0820003%20L%201.7030001%202.418%20C%201.7030001%201.222%201.9890001%20-0.039%202.5740001%20-1.352%20C%203.1720002%20-2.743%203.926%20-3.783%204.836%20-4.472%20C%204.875%20-4.498%204.914%20-4.511%204.94%20-4.511%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB2B0D162BF0EF17F805166E1C67260EF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.653%205.7850003%20C%203.1850002%205.7850003%202.717%205.564%202.262%205.122%20L%203.1590002%208.827001%20C%203.1330001%208.944%203.094%209.022%202.938%209.022%20C%202.509%209.022%201.5600001%208.905%201.391%208.892%20C%201.196%208.866%201.092%208.775001%201.092%208.58%20C%201.092%208.45%201.209%208.385%201.4560001%208.385%20C%201.7030001%208.385%202.0410001%208.398%202.0410001%208.216001%20C%202.0410001%208.1640005%201.9760001%207.9040003%201.8590001%207.4230003%20L%200.819%203.237%20C%200.676%202.691%200.611%202.249%200.611%201.924%20C%200.611%200.806%201.209%20-0.143%202.275%20-0.143%20C%203.1200001%20-0.143%203.861%200.286%204.511%201.1570001%20C%205.096%201.963%205.395%202.808%205.395%203.6790001%20C%205.395%204.81%204.732%205.7850003%203.653%205.7850003%20Z%20M%203.627%205.395%20C%204.1340003%205.395%204.381%205.005%204.381%204.238%20C%204.381%203.887%204.303%203.4190001%204.1470003%202.834%20C%203.861%201.7290001%203.484%200.975%203.029%200.572%20C%202.769%200.351%202.522%200.24700001%202.275%200.24700001%20C%201.742%200.24700001%201.482%200.663%201.482%201.495%20C%201.482%201.781%201.547%202.21%201.677%202.782%20L%201.963%203.9520001%20C%202.002%204.1470003%202.0670002%204.29%202.145%204.394%20C%202.652%205.057%203.1460001%205.395%203.627%205.395%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7A67872FDEAEDD509D57DA1657D4DBCB%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.3407%205.7239003%20C%204.3407%205.6875%204.3316%205.6238003%204.3043003%205.5328%20L%203.8129%203.5581002%20C%203.5854%203.8766003%203.276%204.0404%202.9029002%204.0404%20C%202.2841%204.0404%201.7290001%203.7583%201.2467%203.1941001%20C%200.78260005%202.6572%200.5551%202.0657%200.5551%201.4378%20C%200.5551%200.6006%201.1102%20-0.091000006%201.9474001%20-0.091000006%20C%202.3569002%20-0.091000006%202.7755%200.1092%203.2032%200.50960004%20C%203.3488002%200.1365%203.6764002%20-0.091000006%204.1405%20-0.091000006%20C%204.5409%20-0.091000006%204.8412004%200.2002%205.0505004%200.7917%20C%205.1506004%201.0738001%205.1961%201.2467%205.1961%201.3195001%20C%205.1961%201.4196%205.1324%201.4742%205.0141%201.4742%20C%204.9686003%201.4742%204.9322004%201.4651%204.9049%201.4469%20C%204.8412004%201.3377%204.8048%201.2467%204.7866%201.1648%20C%204.6319003%200.546%204.4226003%200.23660001%204.1678%200.23660001%20C%203.9949002%200.23660001%203.9039001%200.3731%203.9039001%200.637%20C%203.9039001%200.75530005%203.9221%200.8827%203.9494002%201.001%20L%205.1961%205.9969%20C%205.2052%206.0151005%205.2143%206.0697002%205.2325%206.1516004%20C%205.2325%206.2608004%205.1688004%206.3154%205.0505004%206.3154%20L%203.9039001%206.2244%20C%203.7492%206.2153%203.6764002%206.1334004%203.6764002%205.9787%20C%203.6764002%205.8786%203.7674003%205.8240004%203.9403002%205.8240004%20C%204.0950003%205.8240004%204.3407%205.8240004%204.3407%205.7239003%20Z%20M%203.5035002%203.3761%20C%203.6127002%203.1850002%203.6673002%203.0485%203.6673002%202.9666002%20C%203.6673002%202.9575002%203.6673002%202.9393%203.6582003%202.9211001%20L%203.2214%201.1648%20C%203.1668%200.95550007%203.003%200.7462%202.73%200.546%20C%202.457%200.3458%202.2022002%200.23660001%201.9747001%200.23660001%20C%201.5652001%200.23660001%201.3559%200.5187%201.3559%201.0738001%20C%201.3559%201.2922001%201.4105%201.6016%201.5106001%202.002%20C%201.6107%202.4024%201.7108%202.6936002%201.8109001%202.8756%20C%202.1294%203.4307%202.4934%203.7128003%202.9029002%203.7128003%20C%203.1850002%203.7128003%203.3852%203.6036003%203.5035002%203.3761%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g31CFB297CEF58BE5D1DA002DF62F6E89%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.118%20-4.472%20C%202.028%20-3.783%202.782%20-2.743%203.38%20-1.352%20C%203.9650002%20-0.039%204.251%201.222%204.251%202.418%20L%204.251%204.0820003%20C%204.251%205.278%203.9650002%206.539%203.38%207.852%20C%202.782%209.243%202.028%2010.283%201.118%2010.972%20C%201.079%2010.998%201.04%2011.011001%201.014%2011.011001%20C%200.884%2011.011001%200.819%2010.946%200.819%2010.816%20C%200.819%2010.751%200.845%2010.699%200.884%2010.66%20C%201.677%2010.049%202.3140001%209.048%202.795%207.644%20C%203.211%206.435%203.4190001%205.2390003%203.4190001%204.0820003%20L%203.4190001%202.418%20C%203.4190001%201.261%203.211%200.065%202.795%20-1.144%20C%202.3140001%20-2.548%201.677%20-3.549%200.884%20-4.16%20C%200.845%20-4.199%200.819%20-4.251%200.819%20-4.316%20C%200.819%20-4.446%200.884%20-4.511%201.014%20-4.511%20C%201.04%20-4.511%201.079%20-4.498%201.118%20-4.472%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.0787545454545455em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; in Minimax to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2036.699%2022.099999999999998%22%20width%3D%2236.699pt%22%20height%3D%2222.099999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD64B3975C9A5026604F20A029CCF2ADF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.984%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g8C78FC0B4864EE9AC4EAC6B5CD047284%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2816.783%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2823.452000000000005%207.074599999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA20B0F9566CDEE6285FFDC1DC188B5F8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2823.643750000000004%2013.7995%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1928CEC6E065D8496B1E1E47395F0ECF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2823.452000000000005%208.385%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22none%22%20stroke%3D%22%23000000%22%20stroke-width%3D%220.4367999999999999%22%20stroke-linecap%3D%22butt%22%20stroke-linejoin%3D%22miter%22%20stroke-miterlimit%3D%224%22%20d%3D%22M%200%200%20L%204.81%200%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2829.900000000000002%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g539C58F52CBC007E31A8851F18BA771C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD64B3975C9A5026604F20A029CCF2ADF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.126%203.4190001%20C%209.451%204.16%209.62%204.901%209.62%205.655%20C%209.62%206.669%209.321%207.501%208.71%208.1640005%20C%208.099%208.827001%207.293%209.165%206.2920003%209.165%20C%205.603%209.165%204.914%208.996%204.225%208.658%20C%202.821%207.9690003%201.794%206.8770003%201.131%205.395%20C%200.806%204.6670003%200.637%203.9390001%200.637%203.198%20C%200.637%202.171%200.936%201.339%201.547%200.689%20C%202.158%200.039%202.964%20-0.286%203.9780002%20-0.286%20C%204.6540003%20-0.286%205.33%20-0.117%206.019%200.208%20C%207.4360003%200.897%208.463%201.9760001%209.126%203.4190001%20Z%20M%208.372%206.162%20C%208.372%204.433%207.592%202.704%206.76%201.677%20C%206.188%200.962%205.2000003%200.156%204.056%200.156%20C%202.665%200.156%201.937%201.365%201.937%202.834%20C%201.937%203.289%202.028%203.9%202.197%204.6410003%20C%202.548%206.175%203.4320002%207.527%204.589%208.229%20C%205.1480002%208.567%205.6940002%208.736%206.214%208.736%20C%207.618%208.736%208.372%207.618%208.372%206.162%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g8C78FC0B4864EE9AC4EAC6B5CD047284%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.7720003%20-6.136%20C%205.915%20-6.136%205.993%20-6.058%205.993%20-5.915%20C%205.993%20-5.837%205.967%20-5.7850003%205.902%20-5.7460003%20C%204.966%20-5.031%204.225%20-3.822%203.6660001%20-2.132%20C%203.1850002%20-0.689%202.938%200.741%202.938%202.132%20L%202.938%204.368%20C%202.938%205.7590003%203.1850002%207.176%203.6660001%208.632%20C%204.225%2010.309%204.966%2011.518001%205.902%2012.246%20C%205.967%2012.285%205.993%2012.337%205.993%2012.415%20C%205.993%2012.558001%205.915%2012.636001%205.7720003%2012.636001%20C%205.7200003%2012.636001%205.681%2012.623%205.642%2012.584001%20C%204.589%2011.765%203.7050002%2010.517%203.016%208.853001%20C%202.3530002%207.28%202.028%205.7850003%202.028%204.368%20L%202.028%202.132%20C%202.028%200.71500003%202.3530002%20-0.78000003%203.016%20-2.3530002%20C%203.7050002%20-4.03%204.589%20-5.2650003%205.642%20-6.084%20C%205.681%20-6.123%205.7200003%20-6.136%205.7720003%20-6.136%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB2B0D162BF0EF17F805166E1C67260EF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.653%205.7850003%20C%203.1850002%205.7850003%202.717%205.564%202.262%205.122%20L%203.1590002%208.827001%20C%203.1330001%208.944%203.094%209.022%202.938%209.022%20C%202.509%209.022%201.5600001%208.905%201.391%208.892%20C%201.196%208.866%201.092%208.775001%201.092%208.58%20C%201.092%208.45%201.209%208.385%201.4560001%208.385%20C%201.7030001%208.385%202.0410001%208.398%202.0410001%208.216001%20C%202.0410001%208.1640005%201.9760001%207.9040003%201.8590001%207.4230003%20L%200.819%203.237%20C%200.676%202.691%200.611%202.249%200.611%201.924%20C%200.611%200.806%201.209%20-0.143%202.275%20-0.143%20C%203.1200001%20-0.143%203.861%200.286%204.511%201.1570001%20C%205.096%201.963%205.395%202.808%205.395%203.6790001%20C%205.395%204.81%204.732%205.7850003%203.653%205.7850003%20Z%20M%203.627%205.395%20C%204.1340003%205.395%204.381%205.005%204.381%204.238%20C%204.381%203.887%204.303%203.4190001%204.1470003%202.834%20C%203.861%201.7290001%203.484%200.975%203.029%200.572%20C%202.769%200.351%202.522%200.24700001%202.275%200.24700001%20C%201.742%200.24700001%201.482%200.663%201.482%201.495%20C%201.482%201.781%201.547%202.21%201.677%202.782%20L%201.963%203.9520001%20C%202.002%204.1470003%202.0670002%204.29%202.145%204.394%20C%202.652%205.057%203.1460001%205.395%203.627%205.395%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA20B0F9566CDEE6285FFDC1DC188B5F8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.8330001%20-0.0715%20C%202.223%20-0.0715%202.6325002%200.169%202.834%200.35750002%20C%202.964%200.0715%203.2175%20-0.0715%203.601%20-0.0715%20C%203.8285%20-0.0715%204.0235%200.052%204.186%200.299%20C%204.3615003%200.5655%204.446%200.78650004%204.446%200.949%20C%204.446%201.0270001%204.394%201.066%204.2835%201.066%20C%204.1925%201.066%204.1340003%201.014%204.1080003%200.9035%20C%203.9910002%200.4355%203.8285%200.2015%203.627%200.2015%20C%203.471%200.2015%203.3930001%200.3055%203.3930001%200.51350003%20C%203.3930001%200.57850003%203.3995001%200.64350003%203.4190001%200.71500003%20L%204.303%204.2315%20C%204.3225%204.303%204.329%204.355%204.329%204.3745003%20C%204.329%204.472%204.251%204.5175%204.1015%204.5045%20L%203.315%204.446%20C%203.1525002%204.4395%203.094%204.381%203.094%204.2315%20C%203.094%204.1535%203.1655002%204.1080003%203.3085%204.1015%20C%203.5035%204.0885%203.6335%204.1015%203.6335%204.03%20C%203.6335%204.03%203.5685%203.7505%203.5555%203.6920002%20L%203.2695%202.535%20C%203.081%202.7755%202.8275%202.8925002%202.509%202.8925002%20C%202.0475001%202.8925002%201.625%202.704%201.248%202.3270001%20C%200.871%201.95%200.6825%201.534%200.6825%201.0725%20C%200.6825%200.4095%201.1700001%20-0.0715%201.8330001%20-0.0715%20Z%20M%202.509%202.6195002%20C%202.8405%202.6195002%203.055%202.444%203.1525002%202.0865%20L%202.8535001%200.884%20C%202.8405%200.819%202.795%200.741%202.7235%200.65650004%20C%202.4505%200.351%202.158%200.2015%201.8525001%200.2015%20C%201.495%200.2015%201.3130001%200.4095%201.3130001%200.8255%20C%201.3130001%201.001%201.352%201.235%201.4300001%201.508%20C%201.508%201.781%201.5860001%201.9825001%201.6835%202.119%20C%201.9175%202.4505%202.1905%202.6195002%202.509%202.6195002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1928CEC6E065D8496B1E1E47395F0ECF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%200.98800004%202.756%20C%201.222%202.756%201.391%202.925%201.391%203.1590002%20C%201.391%203.3865001%201.274%203.523%201.0465%203.562%20C%201.248%203.8545%201.5600001%203.9975002%201.9825001%203.9975002%20C%202.6000001%203.9975002%203.094%203.614%203.094%203.016%20C%203.094%202.6065001%202.808%202.158%202.236%201.6705%20L%200.676%200.338%20C%200.624%200.29250002%200.598%200.2535%200.5915%200.221%20L%200.5915%200%20L%203.614%200%20L%203.835%201.2935001%20L%203.51%201.2935001%20C%203.4515002%200.9425%203.3930001%200.7475%203.3345%200.702%20C%203.302%200.6825%203.0745%200.6695%202.665%200.6695%20L%201.4885%200.6695%20C%202.3270001%201.2870001%202.509%201.4105%203.0485%201.794%20C%203.3085%201.9825001%203.4905%202.158%203.601%202.3205001%20C%203.7505%202.548%203.8285%202.782%203.8285%203.0225%20C%203.8285%203.4580002%203.64%203.7895%203.2695%204.0235%20C%202.951%204.225%202.5675%204.329%202.1125%204.329%20C%201.7290001%204.329%201.391%204.2315%201.0985%204.043%20C%200.7605%203.8285%200.5915%203.536%200.5915%203.1720002%20C%200.5915%202.925%200.78650004%202.756%200.98800004%202.756%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g539C58F52CBC007E31A8851F18BA771C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.1570001%20-6.084%20C%202.21%20-5.2650003%203.094%20-4.03%203.783%20-2.3530002%20C%204.446%20-0.78000003%204.771%200.71500003%204.771%202.132%20L%204.771%204.368%20C%204.771%205.7850003%204.446%207.28%203.783%208.853001%20C%203.094%2010.530001%202.21%2011.765%201.1570001%2012.584001%20C%201.105%2012.623%201.066%2012.636001%201.0270001%2012.636001%20C%200.884%2012.636001%200.806%2012.558001%200.806%2012.415%20C%200.806%2012.35%200.832%2012.285%200.884%2012.246%20C%201.82%2011.531%202.5740001%2010.335%203.1330001%208.632%20C%203.614%207.176%203.861%205.7590003%203.861%204.368%20L%203.861%202.132%20C%203.861%200.741%203.614%20-0.676%203.1330001%20-2.132%20C%202.5740001%20-3.835%201.82%20-5.031%200.884%20-5.7460003%20C%200.832%20-5.7850003%200.806%20-5.85%200.806%20-5.915%20C%200.806%20-6.058%200.884%20-6.136%201.0270001%20-6.136%20C%201.066%20-6.136%201.118%20-6.123%201.1570001%20-6.084%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.6109999999999999em; width: 3.336272727272727em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; in alpha-beta,
subject to some constraints.&lt;&#x2F;p&gt;
&lt;p&gt;The core idea behind alpha-beta is that we never need to search a line
that has already been refuted. If you try a move and find that it
trivially loses the game, there’s no point in finding out all the other
ways that playing the move can lose you the game. Under ideal search
heuristics, this means that we only need to check one move (the critical
move) at each depth, which yields a halving in the effective depth of
our search.&lt;&#x2F;p&gt;
&lt;p&gt;I’ll give a brief pseudocode description of alpha-beta below.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; class=&quot;language-python z-code&quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;&lt;span class=&quot;z-keyword z-declaration z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;alpha_beta&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;game&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-parameters z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;depth&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-parameters z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;alpha&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-parameters z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;beta&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-function z-begin z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-statement z-conditional z-if z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-conditional z-if z-python&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;depth&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-python&quot;&gt;==&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-python&quot;&gt;0&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt;or&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;game&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;is_over&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-block z-conditional z-if z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-flow z-return z-python&quot;&gt;return&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;leaf_evaluate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;game&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-number-sign z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-python&quot;&gt;#&lt;&#x2F;span&gt; heuristic evaluation of the game
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;score&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-python&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;infinity&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-loop z-for z-python&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;m&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-loop z-for z-in z-python&quot;&gt;in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;game&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;moves&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-loop z-for z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;game&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;make_move&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;m&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;score&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;max&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;score&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-python&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;alpha_beta&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;game&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-python&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;beta&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-python&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;alpha&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;game&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;undo_move&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;alpha&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;max&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;alpha&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;score&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-statement z-conditional z-if z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-conditional z-if z-python&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;score&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-python&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;beta&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-block z-conditional z-if z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;            &lt;span class=&quot;z-keyword z-control z-flow z-break z-python&quot;&gt;break&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-flow z-return z-python&quot;&gt;return&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;score&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In practice and in my code, most engines use an extension of alpha-beta
search called &lt;em&gt;principal variation search&lt;&#x2F;em&gt;; however, we do not need to
discuss it for the sake of this post.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;transposing-isn-t-just-for-matrices&quot;&gt;Transposing isn’t just for matrices&lt;&#x2F;h2&gt;
&lt;p&gt;Those familiar with chess (the kind played by humans) may know the term
&lt;em&gt;transposition&lt;&#x2F;em&gt;. Transposition is the process by which two different
sequences of moves can reach the same position. For instance,
&lt;code&gt;e4 e5 Nf3 Nc6&lt;&#x2F;code&gt; yields the same position as &lt;code&gt;Nf3 Nc6 e4 e5&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;To take advantage of this, chess engines use a &lt;em&gt;transposition table&lt;&#x2F;em&gt;: a
glorified hash-map from positions to useful evaluation data. If all you
care about is the high-level algorithms, you can treat it like a
hash-map and call that a day. However, since you’ve bothered to read
this far, I think you might like to hear about the internal details of
my transposition table’s implementation. In my engine, every entry in
the map stores the evaluation, search depth, best move, and some other
extra data.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;Clone&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; Copy&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; Debug&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; PartialEq&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; Eq&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; An entry in the transposition table.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;TTEntry&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; A packed tag, containing the entry type and the age.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; The high three bits contain the type of the entry (expressed as an [`EntryType`]).
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; The lower five bits contain the age of the entry.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;tag&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u8&lt;&#x2F;span&gt;, &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; 1 byte
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; The lower 16 bits of the hash key of the entry.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;key_low16&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u16&lt;&#x2F;span&gt;, &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; 2 bytes
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; The depth to which this entry was searched.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; If the depth is negative, this means that it was a special type of search.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;depth&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;i8&lt;&#x2F;span&gt;, &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; 1 byte
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; The best move in the position when this entry was searched.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;best_move&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Option&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;Move&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;, &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; 2 bytes
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; The value of the evaluation of this position.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;value&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; Eval, &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; 2 bytes
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;*&lt;&#x2F;span&gt; total size: 8 bytes &lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;However, just storing a raw evaluation in the transposition table is
insufficient. The core problem is that in an alpha-beta search, the
evaluations of a position are not exact: often, we don’t know the exact
evaluation of a position, only a lower or upper bound on its value. If
you wanted, you could store a pair containing the upper and lower bound
of the evaluation for each position, but that requires 32 bits - not
very efficient.&lt;&#x2F;p&gt;
&lt;p&gt;In my engine, each evaluation is a 16-bit integer. Meanwhile, there are
three possible cases for the type of an evaluation:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;exact evaluations&lt;&#x2F;strong&gt;, where the value stored in the table is the
exact value of the evaluation of the position,&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;lower bounds&lt;&#x2F;strong&gt;, where a beta cutoff has occurred, and&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;upper bounds&lt;&#x2F;strong&gt;, where an alpha cutoff has occurred.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;If we assume that all values of an &lt;code&gt;Eval&lt;&#x2F;code&gt; are used, that means we need
to express &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2068.02567777777777%2021.878999999999998%22%20width%3D%2268.02567777777777pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g946CC60F6553DE6CBD049CD3C05E1499%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.5%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB75D9C1DC26232CB27049808D2AE9BFE%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.88888888888889%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFCDE359C75472195CEC97DC4B537C342%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2828.891777777777776%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1E5377FCBB1A07E0E1F5441C1515230A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCF3CD6CDE4276477C56A604EC4E71E42%22%20x%3D%223.6140000000000003%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCF8898C9600A817392ACC3BA6AB6A96C%22%20x%3D%2210.114%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2845.50577777777777%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g86111C2D5C8682C53BDA9AD6152C9992%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2851.411677777777776%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g71010E02B37BE1C0875AD8D94171F929%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2856.46867777777778%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC6F50C046BCA623FDEE933D413AC9522%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2862.96867777777777%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4D62189ABBC2948BAB13C269F5CB8E70%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g946CC60F6553DE6CBD049CD3C05E1499%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.497%208.658%20C%202.964%208.112%202.184%207.839%201.1570001%207.839%20L%201.1570001%207.3320003%20C%201.8330001%207.3320003%202.392%207.4360003%202.821%207.644%20L%202.821%201.066%20C%202.821%200.832%202.769%200.676%202.652%200.611%20C%202.535%200.546%202.21%200.507%201.69%200.507%20L%201.235%200.507%20L%201.235%200%20C%201.5600001%200.026%202.262%200.039%203.341%200.039%20C%204.42%200.039%205.122%200.026%205.447%200%20L%205.447%200.507%20L%204.992%200.507%20C%204.459%200.507%204.1340003%200.546%204.03%200.611%20C%203.926%200.676%203.861%200.832%203.861%201.066%20L%203.861%208.268001%20C%203.861%208.58%203.835%208.658%203.497%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB75D9C1DC26232CB27049808D2AE9BFE%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.979%206.552%20C%205.408%206.552%205.616%206.7730002%205.616%207.215%20C%205.616%208.151%204.914%208.658%203.9520001%208.658%20C%202.8730001%208.658%202.015%208.151%201.378%207.124%20C%200.819%206.2400002%200.546%205.2390003%200.546%204.1080003%20C%200.546%202.457%200.845%201.3000001%201.4560001%200.611%20C%201.9760001%200.013%202.5740001%20-0.286%203.263%20-0.286%20C%204.056%20-0.286%204.7060003%200.013%205.2130003%200.611%20C%205.6940002%201.183%205.941%201.872%205.941%202.665%20C%205.941%203.4580002%205.7070003%204.1340003%205.2390003%204.6930003%20C%204.745%205.291%204.1080003%205.603%203.341%205.603%20C%202.665%205.603%202.145%205.2260003%201.794%204.498%20L%201.794%204.576%20C%201.794%206.045%202.158%207.293%202.938%207.8650002%20C%203.276%208.112%203.627%208.229%203.9780002%208.229%20C%204.446%208.229%204.784%208.099%205.005%207.826%20C%204.563%207.826%204.342%207.579%204.342%207.189%20C%204.342%206.8250003%204.6150002%206.552%204.979%206.552%20Z%20M%204.472%204.42%20C%204.6150002%204.1210003%204.6930003%203.536%204.6930003%202.678%20C%204.6930003%201.8330001%204.6280003%201.274%204.485%200.98800004%20C%204.225%200.455%203.822%200.18200001%203.263%200.18200001%20C%202.8860002%200.18200001%202.6000001%200.312%202.392%200.572%20C%202.223%200.78000003%202.106%200.962%202.0540001%201.105%20C%201.898%201.508%201.82%202.119%201.82%202.951%20C%201.82%203.315%201.872%203.6660001%201.963%204.004%20C%202.132%204.6150002%202.6130002%205.1870003%203.328%205.1870003%20C%203.835%205.1870003%204.225%204.927%204.472%204.42%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gFCDE359C75472195CEC97DC4B537C342%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%203.562%20L%205.369%203.562%20L%205.369%207.267%20C%205.369%207.4750004%205.2650003%207.579%205.057%207.579%20C%204.849%207.579%204.745%207.4750004%204.745%207.267%20L%204.745%203.562%20L%201.04%203.562%20C%200.832%203.562%200.72800004%203.4580002%200.72800004%203.25%20C%200.72800004%203.042%200.832%202.938%201.04%202.938%20L%204.745%202.938%20L%204.745%20-0.767%20C%204.745%20-0.975%204.849%20-1.079%205.057%20-1.079%20C%205.2650003%20-1.079%205.369%20-0.975%205.369%20-0.767%20L%205.369%202.938%20L%209.074%202.938%20C%209.282001%202.938%209.386001%203.042%209.386001%203.25%20C%209.386001%203.4190001%209.243%203.562%209.074%203.562%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1E5377FCBB1A07E0E1F5441C1515230A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.872%200.039%20L%203.315%200%20L%203.315%200.507%20C%202.8470001%200.507%202.561%200.52%202.47%200.572%20C%202.379%200.624%202.3400002%200.78000003%202.3400002%201.0270001%20L%202.3400002%209.022%20L%200.42900002%208.879%20L%200.42900002%208.385%20C%200.884%208.385%201.1700001%208.346%201.261%208.268001%20C%201.352%208.190001%201.404%208.008%201.404%207.709%20L%201.404%201.0270001%20C%201.404%200.78000003%201.365%200.624%201.274%200.572%20C%201.183%200.52%200.897%200.507%200.42900002%200.507%20L%200.42900002%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCF3CD6CDE4276477C56A604EC4E71E42%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.237%20-0.143%20C%204.043%20-0.143%204.719%200.143%205.278%200.71500003%20C%205.837%201.2870001%206.123%201.9760001%206.123%202.782%20C%206.123%203.601%205.85%204.316%205.304%204.914%20C%204.758%205.512%204.0690002%205.8240004%203.25%205.8240004%20C%202.431%205.8240004%201.755%205.512%201.196%204.914%20C%200.637%204.316%200.36400002%203.601%200.36400002%202.782%20C%200.36400002%201.9760001%200.637%201.2870001%201.196%200.71500003%20C%201.755%200.143%202.444%20-0.143%203.237%20-0.143%20Z%20M%203.25%200.273%20C%202.6260002%200.273%202.158%200.546%201.8330001%201.105%20C%201.625%201.469%201.521%202.0670002%201.521%202.8860002%20C%201.521%203.6790001%201.625%204.251%201.82%204.6150002%20C%202.132%205.1740003%202.6000001%205.447%203.237%205.447%20C%203.848%205.447%204.316%205.1740003%204.6410003%204.6410003%20C%204.862%204.277%204.966%203.6920002%204.966%202.8860002%20C%204.966%201.378%204.524%200.273%203.25%200.273%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCF8898C9600A817392ACC3BA6AB6A96C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.603%205.889%20C%205.109%205.889%204.6540003%205.6940002%204.238%205.304%20C%203.848%205.603%203.4060001%205.7460003%202.8990002%205.7460003%20C%201.781%205.7460003%200.767%204.914%200.767%203.822%20C%200.767%203.276%200.962%202.834%201.352%202.496%20C%201.105%202.184%200.975%201.8330001%200.975%201.4300001%20C%200.975%200.936%201.144%200.559%201.469%200.312%20C%200.92300004%200.13%200.36400002%20-0.338%200.36400002%20-1.001%20C%200.36400002%20-1.5600001%200.72800004%20-2.002%201.4430001%20-2.3140001%20C%201.9890001%20-2.561%202.5870001%20-2.678%203.237%20-2.678%20C%203.9%20-2.678%204.511%20-2.561%205.057%20-2.3140001%20C%205.7720003%20-2.002%206.123%20-1.5600001%206.123%20-0.975%20C%206.123%20-0.286%205.837%200.221%205.2650003%200.546%20C%204.6670003%200.871%204.004%200.91%203.042%200.91%20C%202.47%200.91%202.158%200.91%202.093%200.92300004%20C%201.7290001%200.975%201.469%201.326%201.469%201.7290001%20C%201.469%201.924%201.521%202.106%201.638%202.262%20C%202.002%202.015%202.418%201.885%202.8990002%201.885%20C%204.017%201.885%205.018%202.717%205.018%203.809%20C%205.018%204.316%204.849%204.732%204.511%205.057%20C%204.836%205.356%205.1870003%205.499%205.564%205.499%20C%205.499%205.434%205.46%205.33%205.46%205.2000003%20C%205.46%204.914%205.603%204.771%205.889%204.771%20C%206.162%204.771%206.3050003%204.914%206.3050003%205.2130003%20C%206.3050003%205.616%205.993%205.889%205.603%205.889%20Z%20M%202.8990002%205.343%20C%203.601%205.343%203.9520001%204.836%203.9520001%203.822%20C%203.9520001%202.795%203.601%202.275%202.8990002%202.275%20C%202.184%202.275%201.8330001%202.782%201.8330001%203.809%20C%201.8330001%204.836%202.184%205.343%202.8990002%205.343%20Z%20M%202.132%200.052%20L%202.8860002%200.052%20C%203.562%200.052%204.1080003%200.013%204.524%20-0.078%20C%205.083%20-0.19500001%205.356%20-0.507%205.356%20-1.001%20C%205.356%20-1.417%205.096%20-1.742%204.576%20-1.9890001%20C%204.173%20-2.184%203.7310002%20-2.275%203.25%20-2.275%20C%202.782%20-2.275%202.3400002%20-2.184%201.924%20-1.9890001%20C%201.391%20-1.742%201.131%20-1.417%201.131%20-1.001%20C%201.131%20-0.455%201.599%200.052%202.132%200.052%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g86111C2D5C8682C53BDA9AD6152C9992%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0829%203.8584%20C%201.3741001%203.8584%201.5925001%204.0768003%201.5925001%204.368%20C%201.5925001%204.6956%201.4196%204.8685%201.0829%204.8776%20C%201.2831%205.3053%201.7381%205.6511%202.3296%205.6511%20C%203.1304002%205.6511%203.6582003%205.0505004%203.6582003%204.2497%20C%203.6582003%203.8129%203.5035002%203.3943002%203.1850002%202.9848%20C%203.0303001%202.7755%202.9120002%202.6299002%202.8301%202.548%20L%200.67340004%200.4095%20C%200.5551%200.3003%200.5733%200.273%200.5733%200%20L%204.3225%200%20L%204.6046%201.7108%20L%204.2224%201.7108%20C%204.1587%201.2285%204.0859003%200.94640005%204.004%200.8827%20C%203.9585001%200.8554%203.6764002%200.83720005%203.1395001%200.83720005%20L%201.5925001%200.83720005%20C%202.2022002%201.3741001%202.7664%201.8564001%203.3033001%202.2841%20C%203.7128003%202.6026%204.004%202.8847%204.1860003%203.1304002%20C%204.459%203.4853%204.5955%203.8584%204.5955%204.2497%20C%204.5955%204.8139%204.3771%205.2598004%203.9312003%205.5874004%20C%203.5399%205.8877%203.0485%206.0424004%202.4661002%206.0424004%20C%201.9656001%206.0424004%201.5379001%205.8968%201.1648%205.6056004%20C%200.7735%205.2871003%200.5733%204.8867%200.5733%204.3953004%20C%200.5733%204.0859003%200.8008%203.8584%201.0829%203.8584%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g71010E02B37BE1C0875AD8D94171F929%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.1340003%20-3.224%20C%204.251%20-3.224%204.316%20-3.1590002%204.316%20-3.042%20C%204.316%20-3.003%204.29%20-2.951%204.251%20-2.8990002%20C%203.575%20-2.379%203.029%20-1.521%202.6260002%20-0.338%20C%202.275%200.689%202.093%201.7030001%202.093%202.704%20L%202.093%203.796%20C%202.093%204.797%202.275%205.8110003%202.6260002%206.8380003%20C%203.029%208.021%203.575%208.879%204.251%209.399%20C%204.29%209.438%204.316%209.49%204.316%209.542%20C%204.316%209.659%204.251%209.724%204.1340003%209.724%20C%204.1210003%209.724%204.0820003%209.711%204.043%209.685%20C%203.263%209.087%202.6130002%208.203%202.08%207.02%20C%201.5730001%205.889%201.3130001%204.823%201.3130001%203.796%20L%201.3130001%202.704%20C%201.3130001%201.677%201.5730001%200.611%202.08%20-0.52%20C%202.6130002%20-1.7030001%203.263%20-2.5870001%204.043%20-3.1850002%20C%204.0820003%20-3.211%204.1210003%20-3.224%204.1340003%20-3.224%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC6F50C046BCA623FDEE933D413AC9522%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.9390001%204.589%20C%204.797%204.914%205.603%205.7330003%205.603%206.8380003%20C%205.603%207.3970003%205.33%207.852%204.797%208.203%20C%204.329%208.502%203.796%208.658%203.198%208.658%20C%202.6130002%208.658%202.106%208.502%201.651%208.203%20C%201.144%207.8650002%200.884%207.4230003%200.884%206.8640003%20C%200.884%206.435%201.1700001%206.136%201.5860001%206.136%20C%202.002%206.136%202.288%206.435%202.288%206.8510003%20C%202.288%207.28%202.0410001%207.514%201.547%207.54%20C%201.885%207.9950004%202.418%208.229%203.1460001%208.229%20C%203.926%208.229%204.316%207.774%204.316%206.8510003%20C%204.316%206.3050003%204.212%205.85%204.017%205.473%20C%203.6660001%204.849%203.1850002%204.732%202.379%204.732%20C%202.223%204.7060003%202.145%204.6410003%202.145%204.524%20C%202.145%204.329%202.236%204.329%202.496%204.329%20L%203.055%204.329%20C%204.03%204.329%204.524%203.64%204.524%202.249%20C%204.524%201.144%204.1210003%200.18200001%203.1330001%200.18200001%20C%202.288%200.18200001%201.664%200.468%201.2870001%201.04%20C%201.742%201.0270001%202.08%201.365%202.08%201.807%20C%202.08%202.249%201.755%202.5740001%201.3130001%202.5740001%20C%200.806%202.5740001%200.546%202.3140001%200.546%201.781%20C%200.546%201.144%200.832%200.637%201.404%200.234%20C%201.911%20-0.117%202.509%20-0.286%203.1720002%20-0.286%20C%203.913%20-0.286%204.55%20-0.039%205.109%200.442%20C%205.668%200.92300004%205.941%201.521%205.941%202.249%20C%205.941%203.471%204.979%204.316%203.9390001%204.589%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4D62189ABBC2948BAB13C269F5CB8E70%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.014%20-3.1850002%20C%201.794%20-2.5870001%202.444%20-1.7030001%202.977%20-0.52%20C%203.484%200.611%203.744%201.677%203.744%202.704%20L%203.744%203.796%20C%203.744%204.823%203.484%205.889%202.977%207.02%20C%202.444%208.203%201.794%209.087%201.014%209.685%20C%200.975%209.711%200.936%209.724%200.92300004%209.724%20C%200.806%209.724%200.741%209.659%200.741%209.542%20C%200.741%209.49%200.767%209.438%200.806%209.399%20C%201.482%208.879%202.028%208.021%202.431%206.8380003%20C%202.782%205.8110003%202.964%204.797%202.964%203.796%20L%202.964%202.704%20C%202.964%201.7030001%202.782%200.689%202.431%20-0.338%20C%202.028%20-1.521%201.482%20-2.379%200.806%20-2.8990002%20C%200.767%20-2.951%200.741%20-3.003%200.741%20-3.042%20C%200.741%20-3.1590002%200.806%20-3.224%200.92300004%20-3.224%20C%200.936%20-3.224%200.975%20-3.211%201.014%20-3.1850002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 6.184152525252525em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; bits of information in each entry. To
avoid rounding up to 24 bits (for word-alignment), we can squeeze that
extra bound-type information in with the other entry-type information.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;Clone&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; Copy&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; PartialEq&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; Eq&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; Debug&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; The types of bounds that an entry can have.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; These are used to determine whether a bound is binding during a search.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-enum z-rust&quot;&gt;enum&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-enum z-rust&quot;&gt;BoundType&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; A lower bound on the evaluation of the position.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    Lower &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; An upper bound on the evaluation of the position.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    Upper &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; An exact bound on the evaluation of the position.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    Exact &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;repr&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;u8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;Clone&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; Copy&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; PartialEq&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; Eq&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; Debug&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; The liveness of a transposition table entry.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-enum z-rust&quot;&gt;enum&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-enum z-rust&quot;&gt;EntryType&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;allow&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;unused&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; An empty entry, with no occupied or deleted entries following it.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; this is never directly constructed but zeroed memory from `alloc_zeroed` causes it to
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; contain this, so we cannot remove this variant.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    Empty &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; An extant entry which is a lower bound on a position evaluation.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    _Lower &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;BoundType&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Lower &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; An extant entry which is an upper bound on a position evaluation.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    _Upper &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;BoundType&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Upper &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; An extant entry which is an exact bound on a position evaluation.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    _Exact &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;BoundType&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Exact &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; A deleted entry, which may have extra data inside it.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    Deleted &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;4&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-enum z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Those familiar with open-addressed hashing will understand the need for
both an “empty” and a “deleted” entry type. We convert back and forth
between &lt;code&gt;BoundType&lt;&#x2F;code&gt;s (a convenient public API for the transposition
table), &lt;code&gt;EntryType&lt;&#x2F;code&gt;s (used internally to discuss whether an entry is
full), and &lt;code&gt;u8&lt;&#x2F;code&gt; (packing an entry type with its age) via evil cursed
unsafe magic in the implementation. However, the details of my
transposition table implementation are a story for another time. The
takeaway is that entries can be marked with their bounding types.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;when-to-tag-with-what&quot;&gt;When to tag with what&lt;&#x2F;h2&gt;
&lt;p&gt;When retrieving from the transposition table, we can use this bounding
information to determine whether we can quickly cause a cutoff. I’ll
truncate out most of the pomp and circumstance surrounding retrieval
from a transposition table, but by and large it looks like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; entry &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;*&lt;&#x2F;span&gt; probe the transposition table, check if it&amp;#39;s there, blah blah blah &lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; entry&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;depth &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt; depth &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; cutoff &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;match&lt;&#x2F;span&gt; entry&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;bound_type&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;BoundType&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Exact &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-rust&quot;&gt;true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;BoundType&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Lower &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt; beta &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;=&lt;&#x2F;span&gt; value&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;BoundType&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Upper &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt; value &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;=&lt;&#x2F;span&gt; alpha&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; cutoff &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;return&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;value&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;An exact bound means that the search can quit early (huzzah!), while
looser bounds restrict the search to comparing against alpha and beta.&lt;&#x2F;p&gt;
&lt;p&gt;When inserting into the transposition table, we also need to decide how
to tag our evaluations. We can do this by a pretty simple rule, though:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;If there was a beta-cutoff, this is a lower bound.&lt;&#x2F;li&gt;
&lt;li&gt;If we never raised the value of &lt;code&gt;alpha&lt;&#x2F;code&gt;, this is an upper bound.&lt;&#x2F;li&gt;
&lt;li&gt;If neither occurred, this is an exact bound.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;quieting-down&quot;&gt;Quieting down&lt;&#x2F;h2&gt;
&lt;p&gt;Most chess engines also have a search function called &lt;em&gt;quiescent
search&lt;&#x2F;em&gt;. Engines only examine captures and promotions during a quiescent
search. The goal of a quiescent search is to reach a quiet position: we
want to ensure that our static evaluation function doesn’t assume that
sacrificing a queen for a pawn is the best way to finish a tactical
sequence.&lt;&#x2F;p&gt;
&lt;p&gt;Otherwise, a quiescent search is a lot like a regular alpha-beta search,
employing most of the same techniques, including the transposition
tables.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-mistake-in-itself&quot;&gt;The mistake in itself&lt;&#x2F;h2&gt;
&lt;p&gt;When I originally wrote my quiescent search, I had noticed that a
quiescent search doesn’t visit every move, much like in a beta-cutoff in
an alpha-beta search. Accordingly, I assumed that most of the time, the
quiescent search yielded a lower bound. However, I also knew that
something different should be happening when a beta-cutoff occurred, so
I created this monstrosity:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; end of the quiescent search procedure
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;tt_guard&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;save&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; search depth
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;TTEntry&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;DEPTH_CAPTURES&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; best move
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    best_move&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; evaluation
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    best_score&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;step_forward_by&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;state&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;depth_since_root&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; bound type
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; best_score &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt; beta &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;BoundType&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Upper
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;else&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;BoundType&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Lower
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I called the version of Fiddler using this approach
&lt;code&gt;fiddler_quiesce_lu&lt;&#x2F;code&gt;. You can safely ignore the rest of the ceremony,
but remember what we’ve passed in as a bound type: if the evaluation is
&lt;em&gt;bigger&lt;&#x2F;em&gt; than beta, it’s an upper bound. This criterion makes absolutely
no sense, and it really should not have gone undiscovered for this long.
However, all this bound does is make searches less efficient, rather
than incorrect, so none of my numerous tests failed due to it.&lt;&#x2F;p&gt;
&lt;p&gt;I eventually tried a few fixes. First, I tried marking every
quiescent-searched position as a lower bound.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;tt_guard&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;save&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;TTEntry&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;DEPTH_CAPTURES&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    best_move&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    best_score&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;step_forward_by&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;state&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;depth_since_root&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;BoundType&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Lower
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I called this version &lt;code&gt;fiddler_quiesce_lower&lt;&#x2F;code&gt;. This yielded a nice
improvement from “wrong” to “not quite correct.” In fact, our bounds are
much tighter, so I finally settled on getting some exact results,
correctly determining which type of bound we should use.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;tt_guard&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;save&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;TTEntry&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;DEPTH_CAPTURES&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    best_move&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    best_score&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;step_forward_by&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;state&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;depth_since_root&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; best_score &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt; beta &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;BoundType&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Lower
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;else&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;PV&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-rust&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt; overwrote_alpha &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;BoundType&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Exact
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;else&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;BoundType&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Upper
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I called this final version &lt;code&gt;fiddler_leu&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-results&quot;&gt;The results&lt;&#x2F;h2&gt;
&lt;p&gt;Naturally, I have to provide proof of my bombastic title claims.
Accordingly, I ran a lengthy tournament overnight on my poor little
laptop to see just how bad my original implementation was. After 3000
hyper-bullet games, here are the final results.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; class=&quot;language-text z-code&quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Rank Name                          Elo     +&#x2F;-   Games   Score    Draw
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   1 fiddler_leu                    26      13    2000   53.7%   25.7%
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   2 fiddler_quiesce_lower          13      13    2000   51.8%   25.1%
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   3 fiddler_quiesce_lu            -38      13    2000   44.5%   24.5%
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;SPRT: llr 0 (0.0%), lbound -inf, ubound inf
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;3000 of 3000 games finished
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The good news is that &lt;code&gt;fiddler_leu&lt;&#x2F;code&gt;, the most “theoretically correct” of
all the implementations, also performs the best. I would have liked to
run more matches to get a clear difference between &lt;code&gt;fiddler_leu&lt;&#x2F;code&gt; and
&lt;code&gt;fiddler_quiesce_lower&lt;&#x2F;code&gt;, but the AC at my apartment isn’t working, and
I’m not sure how much my poor little laptop can take.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;have-i-learned-anything&quot;&gt;Have I learned anything?&lt;&#x2F;h2&gt;
&lt;p&gt;I would like to believe that I write fewer bugs now than I ever did
before, but that’s likely just because I have yet to find the bugs that
I’m writing right now. However, I’m trying to get better at not
introducing easily-avoidable regressions into my chess engine. My
current workflow now looks like this:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Think of a cool new feature.&lt;&#x2F;li&gt;
&lt;li&gt;Create a new development branch and implement the feature.&lt;&#x2F;li&gt;
&lt;li&gt;Run a tournament between the development branch and master and see
if we’ve improved anything.&lt;&#x2F;li&gt;
&lt;li&gt;Only merge the development branch when there’s an improvement.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;I suspect that somewhere along the way, I’m committing statistical
crimes beyond imagination. However, this workflow has done a lot to help
me to make the engine better. I still think that my engine must have
some serious latent logic errors somewhere because it’s still punching
far below its weight class. Currently, it’s still not even beating out
some simple engines - the kind which haven’t even implemented late move
reduction.&lt;&#x2F;p&gt;
&lt;p&gt;This is the chess engine experience: I spend more time catching up with
my own mistakes than I do on making newer, more exciting mistakes.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>I built a garbage collector for a language that doesn&#x27;t need one</title>
          <pubDate>Mon, 14 Aug 2023 00:00:00 +0000</pubDate>
          <author>Clayton Ramsey</author>
          <link>https://claytonwramsey.com/blog/dumpster/</link>
          <guid>https://claytonwramsey.com/blog/dumpster/</guid>
          <description xml:base="https://claytonwramsey.com/blog/dumpster/">&lt;p&gt;If carcinization happens when languages evolve to be more like Rust,
then what do you call it when Rust evolves to be more like Java?
Caffeination?&lt;&#x2F;p&gt;
&lt;p&gt;Over this summer, I’ve had a decent amount of time to kill. What better
way to spend a beautiful hot summer than sitting inside, staring at core
dumps in a supposedly memory-safe language? I built a garbage
collector - in short, a piece of software that manages allocations for
another, more exciting piece of software. The cool part: I made it in
Rust, for Rust - a language designed to eliminate garbage collection and
which provides few facilities for making it work properly. Not only
that, I managed to make my garbage collector work with relatively few
compromises, which I’ll describe in further detail lower down.&lt;&#x2F;p&gt;
&lt;p&gt;If you don’t like reading, don’t care about the journey to implement it,
or just want to get a sales pitch for the final result, check out the
source code on GitHub
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;claytonwramsey&#x2F;dumpster&quot;&gt;here&lt;&#x2F;a&gt;. You can also
download it directly from
&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;dumpster&quot;&gt;crates.io&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;background&quot;&gt;Background&lt;&#x2F;h2&gt;
&lt;p&gt;If you’re familiar with the details of Rust and its standard library,
feel free to skip this section.&lt;&#x2F;p&gt;
&lt;p&gt;The core backing behind Rust’s memory model is &lt;em&gt;affine typing&lt;&#x2F;em&gt; and the
&lt;em&gt;borrow checker&lt;&#x2F;em&gt;. Values may only be bound to one identifier at a time,
and borrows (a.k.a. references) may not outlive the scope binding their
referent.&lt;&#x2F;p&gt;
&lt;p&gt;For example, the following code is invalid:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; x &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;vec!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; y &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; x&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-support z-macro z-rust&quot;&gt;println!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-placeholder z-rust&quot;&gt;{x:?}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; compile error - x has already been moved
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Normally, we work around this by borrowing against a binding, such as by
making &lt;code&gt;y = &amp;amp;x&lt;&#x2F;code&gt; in the example above. However, we often need to share
some heap-allocated value without knowing which binding will live the
longest. The solution to this problem is shared ownership via garbage
collection.&lt;&#x2F;p&gt;
&lt;p&gt;Rust’s standard library offers two simple reference-counted garbage
collectors: the single-threaded
&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;rc&#x2F;&quot;&gt;&lt;code&gt;Rc&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; and its atomically-indexed
counterpart &lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;sync&#x2F;struct.Arc.html&quot;&gt;&lt;code&gt;Arc&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. They
operate by maintaining a reference count in each heap allocation. Under
most circumstances, these work great, but they can’t handle cyclic
references. Combined with interior mutability, it’s trivial to refute
them.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;std&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;cell&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;OnceCell&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;rc&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Rc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;Foo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;OnceCell&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Rc&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;Foo&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; x &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Rc&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;Foo&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;OnceCell&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;x&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-float z-rust&quot;&gt;0.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;set&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Rc&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;clone&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;x&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; My foo has a reference to itself. It can never be freed!
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is why people actually get paid money to build garbage collectors.
If using a reference counter were all you needed, a number of people
working at Oracle would be out of a job.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;battle-plan&quot;&gt;Battle plan&lt;&#x2F;h2&gt;
&lt;p&gt;We’d like to create some &lt;code&gt;Gc&lt;&#x2F;code&gt; data structure with a similar API to &lt;code&gt;Rc&lt;&#x2F;code&gt;
and &lt;code&gt;Arc&lt;&#x2F;code&gt;, which can accept nearly any data type contained within, and
still manage to detect and collect cycles.&lt;&#x2F;p&gt;
&lt;p&gt;We have a few weapons at our disposal:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Drop&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt;: Every non-copiable data type in Rust can implement the
&lt;code&gt;Drop&lt;&#x2F;code&gt; trait to ensure some code is called every time it is dropped.
In our case, we can implement &lt;code&gt;Drop&lt;&#x2F;code&gt; for &lt;code&gt;Gc&lt;&#x2F;code&gt; to try to glean some
knowledge about when an allocation becomes inaccessible.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Traits&lt;&#x2F;strong&gt;: We can construct some trait (in our case, let’s call it
&lt;code&gt;Collectable&lt;&#x2F;code&gt;) as a mandatory requirement to be contained in a &lt;code&gt;Gc&lt;&#x2F;code&gt;.
Creating this trait has some major downsides (libraries upstream of
&lt;code&gt;dumpster&lt;&#x2F;code&gt; can’t implement it) but it’s a necessary evil.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;However, our formidable tools are matched by equally formidable
challenges:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Undetectable moves&lt;&#x2F;strong&gt;. When a value is moved in Rust, there is no
way to detect that fact from within that value. If we had some sort
of trait like &lt;code&gt;OnMove&lt;&#x2F;code&gt; which could allow for a function to be called
every time it had moved, we could use it to detect when a &lt;code&gt;Gc&lt;&#x2F;code&gt; moved
inside another &lt;code&gt;Gc&lt;&#x2F;code&gt;, making it unrooted, and allowing us to create a
simple mark-sweep collector. At this rate, though, we would just
reinvent C++’s copy constructors.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Variable-sized data&lt;&#x2F;strong&gt;. I foolishly decided to make it so that &lt;code&gt;Gc&lt;&#x2F;code&gt;
could store &lt;code&gt;?Sized&lt;&#x2F;code&gt; types, which is more flexible for library users
(enabling things like &lt;code&gt;Gc&amp;lt;[T]&amp;gt;&lt;&#x2F;code&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Type erasure&lt;&#x2F;strong&gt;. In a typical Rust program, generics are
implemented via monomorphization, and no type information is
retained at runtime. This makes it harder to clean up an allocation
without prior context.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;With these two, relatively simple tools, we have enough to build a
collector which can handle just about any data type inside.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;my-approach&quot;&gt;My approach&lt;&#x2F;h2&gt;
&lt;p&gt;We need to detect whether a &lt;code&gt;Gc&lt;&#x2F;code&gt; is reachable without actually scanning
the stack. I’ll start with a few definitions, using graph-theoretical
language.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;An allocation graph &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2075.91855555555557%2021.878999999999998%22%20width%3D%2275.91855555555557pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gE3860358A905CFB8A7E8F7EAB3DED84E%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2813.829111111111112%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g537FBDF575D6B4DBC59EE2318104781F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2827.554222222222222%206.5%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g71010E02B37BE1C0875AD8D94171F929%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.057%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gE89BA01FCDF5D4463D821614CE2F6DF3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.418%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA5EFA28F31DFDD7E2EC069AC1C132FF5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2821.198666666666668%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9308D3AA5B63656D688EAB82DBF8B4B8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2831.494666666666667%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA5EFA28F31DFDD7E2EC069AC1C132FF5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2837.275333333333336%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2843.30733333333334%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4D62189ABBC2948BAB13C269F5CB8E70%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gE3860358A905CFB8A7E8F7EAB3DED84E%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.212%20-0.286%20C%205.356%20-0.286%206.2530003%200.065%206.9160004%200.767%20C%206.994%200.598%207.3320003%200.013%207.514%200.013%20C%207.579%200.013%207.618%200.052%207.644%200.104%20C%207.67%200.156%207.761%200.416%207.8780003%200.884%20L%208.112%201.872%20C%208.190001%202.171%208.242001%202.392%208.281%202.535%20C%208.424%203.107%208.424%203.094%209.126%203.107%20C%209.295%203.107%209.373%203.211%209.373%203.4190001%20C%209.373%203.549%209.308001%203.614%209.165%203.614%20C%208.918%203.614%208.06%203.562%207.813%203.575%20L%206.006%203.614%20C%205.7980003%203.614%205.6940002%203.51%205.6940002%203.302%20C%205.6940002%203.1850002%205.7720003%203.1330001%205.928%203.1200001%20C%206.669%203.081%207.059%203.055%207.098%203.029%20C%207.137%203.003%207.15%202.951%207.15%202.8860002%20C%207.15%202.795%207.059%202.405%206.8900003%201.7290001%20C%206.63%200.79300004%205.668%200.221%204.459%200.221%20C%202.8730001%200.221%201.924%201.274%201.924%202.8600001%20C%201.924%203.107%201.95%203.4190001%201.9890001%203.77%20C%202.132%204.836%202.834%206.3310003%203.3930001%207.02%20C%204.043%207.839%205.2390003%208.658%206.565%208.658%20C%207.9170003%208.658%208.58%207.631%208.58%206.227%20C%208.58%206.11%208.541%205.6940002%208.541%205.577%20C%208.541%205.46%208.619%205.395%208.788%205.395%20C%208.853001%205.395%208.905%205.408%208.944%205.421%20C%209.009%205.512%209.048%205.603%209.074%205.6940002%20L%209.88%208.983%20C%209.88%209.1%209.815001%209.165%209.685%209.165%20C%209.633%209.165%209.555%209.113%209.451%208.996%20L%208.606%208.047%20C%208.099%208.788%207.3840003%209.165%206.461%209.165%20C%205.7460003%209.165%205.044%208.996%204.329%208.6710005%20C%202.8860002%207.9950004%201.8330001%206.9290004%201.1570001%205.473%20C%200.819%204.758%200.65000004%204.03%200.65000004%203.289%20C%200.65000004%201.209%202.132%20-0.286%204.212%20-0.286%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g537FBDF575D6B4DBC59EE2318104781F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%204.771%20L%201.04%204.771%20C%200.832%204.771%200.72800004%204.6670003%200.72800004%204.472%20C%200.72800004%204.277%200.832%204.173%201.04%204.173%20L%209.074%204.173%20C%209.282001%204.173%209.386001%204.277%209.386001%204.472%20C%209.386001%204.6280003%209.243%204.771%209.074%204.771%20Z%20M%209.074%202.3270001%20L%201.04%202.3270001%20C%200.832%202.3270001%200.72800004%202.223%200.72800004%202.028%20C%200.72800004%201.8330001%200.832%201.7290001%201.04%201.7290001%20L%209.074%201.7290001%20C%209.282001%201.7290001%209.386001%201.8330001%209.386001%202.028%20C%209.386001%202.197%209.243%202.3270001%209.074%202.3270001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g71010E02B37BE1C0875AD8D94171F929%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.1340003%20-3.224%20C%204.251%20-3.224%204.316%20-3.1590002%204.316%20-3.042%20C%204.316%20-3.003%204.29%20-2.951%204.251%20-2.8990002%20C%203.575%20-2.379%203.029%20-1.521%202.6260002%20-0.338%20C%202.275%200.689%202.093%201.7030001%202.093%202.704%20L%202.093%203.796%20C%202.093%204.797%202.275%205.8110003%202.6260002%206.8380003%20C%203.029%208.021%203.575%208.879%204.251%209.399%20C%204.29%209.438%204.316%209.49%204.316%209.542%20C%204.316%209.659%204.251%209.724%204.1340003%209.724%20C%204.1210003%209.724%204.0820003%209.711%204.043%209.685%20C%203.263%209.087%202.6130002%208.203%202.08%207.02%20C%201.5730001%205.889%201.3130001%204.823%201.3130001%203.796%20L%201.3130001%202.704%20C%201.3130001%201.677%201.5730001%200.611%202.08%20-0.52%20C%202.6130002%20-1.7030001%203.263%20-2.5870001%204.043%20-3.1850002%20C%204.0820003%20-3.211%204.1210003%20-3.224%204.1340003%20-3.224%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gE89BA01FCDF5D4463D821614CE2F6DF3%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%208.723001%208.84%20C%208.476%208.84%207.696%208.879%207.4490004%208.879%20C%207.254%208.879%207.15%208.775001%207.15%208.58%20C%207.15%208.45%207.241%208.385%207.4100003%208.372%20C%207.774%208.359%207.9560003%208.229%207.9560003%208.008%20C%207.9560003%207.8910003%207.8910003%207.735%207.774%207.54%20L%203.9%201.391%20L%203.042%208.047%20C%203.042%208.268001%203.315%208.372%203.874%208.372%20C%204.1340003%208.372%204.251%208.463%204.251%208.684%20C%204.251%208.814%204.173%208.879%204.017%208.879%20C%203.7310002%208.879%202.717%208.84%202.431%208.84%20C%202.171%208.84%201.2870001%208.879%201.0270001%208.879%20C%200.832%208.879%200.72800004%208.775001%200.72800004%208.58%20C%200.72800004%208.437%200.85800004%208.372%201.105%208.372%20C%201.326%208.372%201.482%208.346%201.5860001%208.32%20C%201.794%208.255%201.781%208.229%201.82%207.9820004%20L%202.834%200.052%20C%202.8730001%20-0.169%202.977%20-0.286%203.1460001%20-0.286%20C%203.315%20-0.286%203.4450002%20-0.19500001%203.549%20-0.026%20L%208.177%207.3320003%20C%208.476%207.8%208.762%208.099%209.048%208.216001%20C%209.243%208.307%209.49%208.359%209.776%208.372%20C%209.919001%208.385%209.984%208.476%209.997%208.6710005%20C%2010.01%208.814%209.932%208.879%209.776%208.879%20C%209.581%208.879%208.918%208.84%208.723001%208.84%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA5EFA28F31DFDD7E2EC069AC1C132FF5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.807%201.378%20C%201.391%201.378%201.118%201.066%201.118%200.65000004%20C%201.118%200.26%201.417%20-0.065%201.807%20-0.065%20C%201.9890001%20-0.065%202.145%20-0.013%202.262%200.104%20L%202.275%200%20C%202.275%20-0.819%202.002%20-1.521%201.4560001%20-2.08%20C%201.365%20-2.184%201.3130001%20-2.262%201.3130001%20-2.3140001%20C%201.3130001%20-2.444%201.365%20-2.509%201.482%20-2.509%20C%201.599%20-2.509%201.755%20-2.3530002%201.9760001%20-2.0540001%20C%202.418%20-1.4300001%202.639%20-0.741%202.639%200%20C%202.639%200.689%202.405%201.378%201.807%201.378%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9308D3AA5B63656D688EAB82DBF8B4B8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.5870001%208.528%20C%202.5870001%208.398%202.73%208.333%203.003%208.333%20C%203.523%208.333%203.783%208.281%203.783%208.1640005%20C%203.783%208.125%203.757%208.034%203.7180002%207.8650002%20L%202.028%201.066%20C%201.963%200.78000003%201.8330001%200.611%201.638%200.546%20C%201.547%200.52%201.3130001%200.507%200.91%200.507%20C%200.624%200.507%200.49400002%200.481%200.49400002%200.208%20C%200.49400002%200.065%200.637%200%200.91%200%20L%207.579%200%20C%207.8910003%200%207.9170003%200.026%208.021%200.24700001%20L%208.541%201.417%20C%208.892%202.223%209.139%202.821%209.282001%203.224%20C%209.2560005%203.341%209.217%203.4190001%209.074%203.4190001%20C%208.983%203.4190001%208.905%203.354%208.853001%203.237%20C%208.528%202.47%208.216001%201.885%207.9040003%201.469%20C%207.3840003%200.767%206.617%200.507%205.395%200.507%20L%203.51%200.507%20C%203.38%200.507%203.289%200.507%203.237%200.52%20C%203.1590002%200.52%203.1200001%200.546%203.1200001%200.58500004%20C%203.1200001%200.611%203.1460001%200.702%203.1850002%200.871%20L%204.043%204.342%20L%205.278%204.342%20C%205.889%204.342%206.214%204.264%206.2790003%204.0950003%20C%206.3050003%204.03%206.3180003%203.9390001%206.3180003%203.809%20C%206.3180003%203.64%206.2920003%203.4320002%206.227%203.1850002%20C%206.201%203.1200001%206.188%203.068%206.188%203.029%20C%206.188%202.8990002%206.2660003%202.834%206.409%202.834%20C%206.526%202.834%206.604%202.938%206.656%203.1330001%20L%207.3840003%206.149%20C%207.3840003%206.2790003%207.3190002%206.3440003%207.176%206.3440003%20C%207.072%206.3440003%206.994%206.2530003%206.955%206.071%20C%206.8250003%205.564%206.656%205.2390003%206.435%205.083%20C%206.214%204.927%205.85%204.849%205.317%204.849%20L%204.173%204.849%20L%204.927%207.8780003%20C%205.031%208.32%205.031%208.333%205.577%208.333%20L%207.3840003%208.333%20C%208.047%208.333%208.502%208.268001%208.749001%208.1380005%20C%209.113%207.9430003%209.295%207.553%209.295%206.968%20C%209.295%206.747%209.282001%206.513%209.243%206.2920003%20C%209.243%206.2660003%209.243%206.227%209.2300005%206.175%20L%209.2300005%206.058%20C%209.2300005%205.915%209.295%205.85%209.425%205.85%20C%209.555%205.85%209.633%205.967%209.659%206.214%20L%209.919001%208.437%20C%209.958%208.801001%209.867001%208.84%209.516%208.84%20L%203.029%208.84%20C%202.73%208.84%202.5870001%208.827001%202.5870001%208.528%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4D62189ABBC2948BAB13C269F5CB8E70%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.014%20-3.1850002%20C%201.794%20-2.5870001%202.444%20-1.7030001%202.977%20-0.52%20C%203.484%200.611%203.744%201.677%203.744%202.704%20L%203.744%203.796%20C%203.744%204.823%203.484%205.889%202.977%207.02%20C%202.444%208.203%201.794%209.087%201.014%209.685%20C%200.975%209.711%200.936%209.724%200.92300004%209.724%20C%200.806%209.724%200.741%209.659%200.741%209.542%20C%200.741%209.49%200.767%209.438%200.806%209.399%20C%201.482%208.879%202.028%208.021%202.431%206.8380003%20C%202.782%205.8110003%202.964%204.797%202.964%203.796%20L%202.964%202.704%20C%202.964%201.7030001%202.782%200.689%202.431%20-0.338%20C%202.028%20-1.521%201.482%20-2.379%200.806%20-2.8990002%20C%200.767%20-2.951%200.741%20-3.003%200.741%20-3.042%20C%200.741%20-3.1590002%200.806%20-3.224%200.92300004%20-3.224%20C%200.936%20-3.224%200.975%20-3.211%201.014%20-3.1850002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 6.90168686868687em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; is a directed graph with a root
node &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2032.28622222222222%2021.878999999999998%22%20width%3D%2232.28622222222222pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.64311111111111%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g64CA8EBFD302DE0CE83A3B8E6DC4BE01%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2821.925222222222224%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gE89BA01FCDF5D4463D821614CE2F6DF3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g64CA8EBFD302DE0CE83A3B8E6DC4BE01%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.3190002%200.052%20L%204.849%200.052%20C%204.03%200.052%203.302%200.32500002%202.704%200.884%20C%202.106%201.4430001%201.768%202.119%201.69%202.938%20L%207.3190002%202.938%20C%207.527%202.938%207.631%203.042%207.631%203.25%20C%207.631%203.4580002%207.527%203.562%207.3190002%203.562%20L%201.69%203.562%20C%201.768%204.381%202.106%205.057%202.704%205.616%20C%203.302%206.175%204.03%206.448%204.849%206.448%20L%207.3190002%206.448%20C%207.527%206.448%207.631%206.552%207.631%206.747%20C%207.631%206.955%207.527%207.059%207.3190002%207.059%20L%204.849%207.059%20C%203.796%207.059%202.8990002%206.695%202.158%205.954%20C%201.417%205.2130003%201.053%204.316%201.053%203.25%20C%201.053%202.184%201.417%201.2870001%202.158%200.546%20C%202.8990002%20-0.19500001%203.796%20-0.559%204.849%20-0.559%20L%207.3190002%20-0.559%20C%207.527%20-0.559%207.631%20-0.455%207.631%20-0.24700001%20C%207.631%20-0.091000006%207.488%200.052%207.3190002%200.052%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gE89BA01FCDF5D4463D821614CE2F6DF3%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%208.723001%208.84%20C%208.476%208.84%207.696%208.879%207.4490004%208.879%20C%207.254%208.879%207.15%208.775001%207.15%208.58%20C%207.15%208.45%207.241%208.385%207.4100003%208.372%20C%207.774%208.359%207.9560003%208.229%207.9560003%208.008%20C%207.9560003%207.8910003%207.8910003%207.735%207.774%207.54%20L%203.9%201.391%20L%203.042%208.047%20C%203.042%208.268001%203.315%208.372%203.874%208.372%20C%204.1340003%208.372%204.251%208.463%204.251%208.684%20C%204.251%208.814%204.173%208.879%204.017%208.879%20C%203.7310002%208.879%202.717%208.84%202.431%208.84%20C%202.171%208.84%201.2870001%208.879%201.0270001%208.879%20C%200.832%208.879%200.72800004%208.775001%200.72800004%208.58%20C%200.72800004%208.437%200.85800004%208.372%201.105%208.372%20C%201.326%208.372%201.482%208.346%201.5860001%208.32%20C%201.794%208.255%201.781%208.229%201.82%207.9820004%20L%202.834%200.052%20C%202.8730001%20-0.169%202.977%20-0.286%203.1460001%20-0.286%20C%203.315%20-0.286%203.4450002%20-0.19500001%203.549%20-0.026%20L%208.177%207.3320003%20C%208.476%207.8%208.762%208.099%209.048%208.216001%20C%209.243%208.307%209.49%208.359%209.776%208.372%20C%209.919001%208.385%209.984%208.476%209.997%208.6710005%20C%2010.01%208.814%209.932%208.879%209.776%208.879%20C%209.581%208.879%208.918%208.84%208.723001%208.84%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.935111111111111em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; whose indegree is zero.&lt;&#x2F;li&gt;
&lt;li&gt;A node &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.4479999999999995%2021.878999999999998%22%20width%3D%226.4479999999999995pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFB1C409509CE5023E55588E00F408FA8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gFB1C409509CE5023E55588E00F408FA8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.797%205.083%20C%204.797%204.979%204.914%204.81%205.122%204.55%20C%205.33%204.29%205.434%203.9910002%205.434%203.653%20C%205.434%203.276%205.2520003%202.639%204.875%201.742%20C%204.602%201.118%203.9780002%200.234%203.211%200.234%20C%202.6130002%200.234%202.3140001%200.58500004%202.3140001%201.3000001%20C%202.3140001%201.807%202.561%202.704%203.055%203.9910002%20C%203.1590002%204.264%203.211%204.485%203.211%204.6410003%20C%203.211%205.291%202.769%205.7460003%202.119%205.7460003%20C%201.547%205.7460003%201.092%205.421%200.767%204.771%20C%200.507%204.238%200.377%203.9%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.754%203.549%200.78000003%203.627%200.832%203.809%20C%201.131%204.849%201.547%205.369%202.08%205.369%20C%202.249%205.369%202.3400002%205.2520003%202.3400002%205.005%20C%202.3400002%204.797%202.275%204.511%202.132%204.1340003%20C%201.651%202.8470001%201.404%201.9760001%201.404%201.495%20C%201.404%200.832%201.625%200.377%202.0670002%200.13%20C%202.418%20-0.052%202.782%20-0.143%203.1590002%20-0.143%20C%204.316%20-0.143%205.122%201.105%205.46%202.106%20C%205.876%203.328%206.084%204.225%206.084%204.797%20C%206.084%205.434%205.876%205.7460003%205.473%205.7460003%20C%205.1480002%205.7460003%204.797%205.408%204.797%205.083%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5861818181818181em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; in an allocation graph is said to be &lt;em&gt;accessible&lt;&#x2F;em&gt; if and
only if there exists a path from &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.032%2021.878999999999998%22%20width%3D%226.032pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5483636363636364em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.4479999999999995%2021.878999999999998%22%20width%3D%226.4479999999999995pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFB1C409509CE5023E55588E00F408FA8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gFB1C409509CE5023E55588E00F408FA8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.797%205.083%20C%204.797%204.979%204.914%204.81%205.122%204.55%20C%205.33%204.29%205.434%203.9910002%205.434%203.653%20C%205.434%203.276%205.2520003%202.639%204.875%201.742%20C%204.602%201.118%203.9780002%200.234%203.211%200.234%20C%202.6130002%200.234%202.3140001%200.58500004%202.3140001%201.3000001%20C%202.3140001%201.807%202.561%202.704%203.055%203.9910002%20C%203.1590002%204.264%203.211%204.485%203.211%204.6410003%20C%203.211%205.291%202.769%205.7460003%202.119%205.7460003%20C%201.547%205.7460003%201.092%205.421%200.767%204.771%20C%200.507%204.238%200.377%203.9%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.754%203.549%200.78000003%203.627%200.832%203.809%20C%201.131%204.849%201.547%205.369%202.08%205.369%20C%202.249%205.369%202.3400002%205.2520003%202.3400002%205.005%20C%202.3400002%204.797%202.275%204.511%202.132%204.1340003%20C%201.651%202.8470001%201.404%201.9760001%201.404%201.495%20C%201.404%200.832%201.625%200.377%202.0670002%200.13%20C%202.418%20-0.052%202.782%20-0.143%203.1590002%20-0.143%20C%204.316%20-0.143%205.122%201.105%205.46%202.106%20C%205.876%203.328%206.084%204.225%206.084%204.797%20C%206.084%205.434%205.876%205.7460003%205.473%205.7460003%20C%205.1480002%205.7460003%204.797%205.408%204.797%205.083%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5861818181818181em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; in the graph.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;It should be clear to see why these definitions are useful to us. We can
imagine each node being one allocation, pretending that all data not
indirected through a &lt;code&gt;Gc&lt;&#x2F;code&gt; is part of an imaginary allocation for the
root. Additionally, each &lt;code&gt;Gc&lt;&#x2F;code&gt; acts as an edge connecting two
allocations. If an allocation is accessible in the graph-theoretical
sense, it’s still possible for a program to reach it, and if not, it’s
safe to free that allocation. Note that the indegree of a node is
precisely equal to the reference count of its corresponding allocation.&lt;&#x2F;p&gt;
&lt;p&gt;I’ll roughly outline our approach to determining whether some node
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2034.782222222222224%2021.878999999999998%22%20width%3D%2234.782222222222224pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCC2D6A7770FCF135D0D1A78A9F87C718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2811.41111111111111%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g12FD43B0A1F123FBBFABB5F3B51DF45E%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.02511111111111%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gBAF84F82FF13BF094AE85583C2FAC9AF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2828.750222222222224%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCC2D6A7770FCF135D0D1A78A9F87C718%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.981%201.781%20C%206.682%200.754%206.2530003%200.234%205.7200003%200.234%20C%205.551%200.234%205.46%200.36400002%205.46%200.611%20C%205.46%200.79300004%205.538%201.092%205.6940002%201.495%20C%206.214%202.9120002%206.474%203.848%206.474%204.329%20C%206.474%205.2390003%205.863%205.7460003%204.953%205.7460003%20C%204.186%205.7460003%203.523%205.408%202.99%204.719%20C%202.8860002%205.291%202.431%205.7460003%201.768%205.7460003%20C%201.04%205.7460003%200.754%205.07%200.572%204.485%20C%200.442%204.0690002%200.377%203.822%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.963%205.369%202.08%205.1870003%202.08%204.823%20C%202.08%204.6540003%202.015%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4430001%20-0.143%20C%201.69%20-0.143%201.872%20-0.013%201.963%200.24700001%20C%201.9890001%200.312%202.0670002%200.637%202.21%201.196%20L%202.483%202.3530002%20L%202.8730001%203.835%20C%203.016%204.1340003%203.237%204.433%203.51%204.745%20C%203.887%205.1610003%204.355%205.369%204.914%205.369%20C%205.343%205.369%205.551%205.083%205.551%204.524%20C%205.551%204.03%205.278%203.042%204.719%201.5600001%20C%204.6280003%201.326%204.589%201.131%204.589%200.962%20C%204.589%200.32500002%205.07%20-0.143%205.6940002%20-0.143%20C%206.2660003%20-0.143%206.721%200.18200001%207.046%200.832%20C%207.293%201.352%207.4230003%201.7030001%207.4230003%201.872%20C%207.4230003%201.9890001%207.3580003%202.0540001%207.215%202.0540001%20C%207.176%202.0540001%206.981%201.937%206.981%201.781%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g12FD43B0A1F123FBBFABB5F3B51DF45E%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.496%204.875%20C%202.496%205.2650003%202.197%205.603%201.807%205.603%20C%201.417%205.603%201.118%205.2650003%201.118%204.875%20C%201.118%204.485%201.417%204.1470003%201.807%204.1470003%20C%202.197%204.1470003%202.496%204.485%202.496%204.875%20Z%20M%202.496%200.72800004%20C%202.496%201.118%202.197%201.4560001%201.807%201.4560001%20C%201.417%201.4560001%201.118%201.118%201.118%200.72800004%20C%201.118%200.338%201.417%200%201.807%200%20C%202.197%200%202.496%200.338%202.496%200.72800004%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gBAF84F82FF13BF094AE85583C2FAC9AF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%202.3140001%20L%205.044%202.3140001%20L%205.7200003%204.186%20L%209.074%204.186%20C%209.282001%204.186%209.386001%204.29%209.386001%204.498%20C%209.386001%204.7060003%209.282001%204.81%209.074%204.81%20L%205.954%204.81%20L%207.488%209.074%20C%207.514%209.113%207.527%209.139%207.527%209.178%20C%207.527%209.386001%207.4230003%209.49%207.215%209.49%20C%207.046%209.49%206.955%209.425%206.9160004%209.282001%20L%205.291%204.81%20L%201.04%204.81%20C%200.832%204.81%200.72800004%204.7060003%200.72800004%204.498%20C%200.72800004%204.29%200.832%204.186%201.04%204.186%20L%205.07%204.186%20L%204.394%202.3140001%20L%201.04%202.3140001%20C%200.832%202.3140001%200.72800004%202.21%200.72800004%202.002%20C%200.72800004%201.794%200.832%201.69%201.04%201.69%20L%204.16%201.69%20L%202.6130002%20-2.5740001%20C%202.6000001%20-2.6000001%202.6000001%20-2.639%202.6000001%20-2.678%20C%202.6000001%20-2.8860002%202.704%20-2.99%202.9120002%20-2.99%20C%203.068%20-2.99%203.1590002%20-2.925%203.198%20-2.782%20L%204.823%201.69%20L%209.074%201.69%20C%209.282001%201.69%209.386001%201.794%209.386001%202.002%20C%209.386001%202.158%209.243%202.3140001%209.074%202.3140001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.162020202020202em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; is accessible.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Find &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2013.988%2021.878999999999998%22%20width%3D%2213.988pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g39839232D9B855C6E487282AC713D032%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g39839232D9B855C6E487282AC713D032%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2012.428%208.84%20C%2012.181001%208.84%2011.336%208.879%2011.089001%208.879%20C%2010.894%208.879%2010.79%208.775001%2010.79%208.58%20C%2010.79%208.45%2010.868%208.385%2011.024%208.372%20C%2011.505%208.359%2011.739%208.216001%2011.739%207.9300003%20C%2011.739%207.852%2011.687%207.722%2011.583%207.527%20L%208.177%201.625%20L%207.722%207.826%20C%207.67%208.294001%207.9820004%208.372%208.567%208.372%20C%208.84%208.372%208.97%208.476%208.97%208.684%20C%208.97%208.814%208.892%208.879%208.723001%208.879%20C%208.437%208.879%207.4360003%208.84%207.15%208.84%20C%206.9030004%208.84%206.045%208.879%205.7980003%208.879%20C%205.603%208.879%205.499%208.775001%205.499%208.567%20C%205.499%208.437%205.616%208.372%205.863%208.372%20C%206.2660003%208.372%206.474%208.281%206.487%208.099%20L%206.565%207.124%20L%203.3930001%201.625%20L%202.925%207.9690003%20C%202.8860002%208.294001%203.4320002%208.372%203.848%208.372%20C%204.0690002%208.372%204.173%208.476%204.173%208.684%20C%204.173%208.814%204.0950003%208.879%203.9390001%208.879%20C%203.653%208.879%202.639%208.84%202.3530002%208.84%20C%202.106%208.84%201.248%208.879%201.001%208.879%20C%200.806%208.879%200.71500003%208.775001%200.71500003%208.58%20C%200.71500003%208.437%200.845%208.372%201.092%208.372%20C%201.638%208.372%201.69%208.346%201.7160001%207.9560003%20L%202.301%200.091000006%20C%202.3140001%20-0.156%202.405%20-0.286%202.561%20-0.286%20C%202.73%20-0.26%202.795%20-0.221%202.8990002%20-0.026%20C%202.9120002%20-0.013%202.9120002%200%202.9120002%200.013%20L%206.617%206.422%20L%207.085%200.091000006%20C%207.098%20-0.156%207.189%20-0.286%207.3450003%20-0.286%20C%207.4750004%20-0.286%207.592%20-0.19500001%207.696%20-0.013%20L%2011.934%207.306%20C%2012.285%207.9430003%2012.532001%208.307%2013.325%208.372%20C%2013.559%208.398%2013.624001%208.463%2013.624001%208.684%20C%2013.624001%208.814%2013.559%208.879%2013.416%208.879%20C%2013.234%208.879%2012.610001%208.84%2012.428%208.84%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.2716363636363637em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, the set of all descendants of &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.799999999999999%2021.878999999999998%22%20width%3D%227.799999999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCC2D6A7770FCF135D0D1A78A9F87C718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCC2D6A7770FCF135D0D1A78A9F87C718%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.981%201.781%20C%206.682%200.754%206.2530003%200.234%205.7200003%200.234%20C%205.551%200.234%205.46%200.36400002%205.46%200.611%20C%205.46%200.79300004%205.538%201.092%205.6940002%201.495%20C%206.214%202.9120002%206.474%203.848%206.474%204.329%20C%206.474%205.2390003%205.863%205.7460003%204.953%205.7460003%20C%204.186%205.7460003%203.523%205.408%202.99%204.719%20C%202.8860002%205.291%202.431%205.7460003%201.768%205.7460003%20C%201.04%205.7460003%200.754%205.07%200.572%204.485%20C%200.442%204.0690002%200.377%203.822%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.963%205.369%202.08%205.1870003%202.08%204.823%20C%202.08%204.6540003%202.015%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4430001%20-0.143%20C%201.69%20-0.143%201.872%20-0.013%201.963%200.24700001%20C%201.9890001%200.312%202.0670002%200.637%202.21%201.196%20L%202.483%202.3530002%20L%202.8730001%203.835%20C%203.016%204.1340003%203.237%204.433%203.51%204.745%20C%203.887%205.1610003%204.355%205.369%204.914%205.369%20C%205.343%205.369%205.551%205.083%205.551%204.524%20C%205.551%204.03%205.278%203.042%204.719%201.5600001%20C%204.6280003%201.326%204.589%201.131%204.589%200.962%20C%204.589%200.32500002%205.07%20-0.143%205.6940002%20-0.143%20C%206.2660003%20-0.143%206.721%200.18200001%207.046%200.832%20C%207.293%201.352%207.4230003%201.7030001%207.4230003%201.872%20C%207.4230003%201.9890001%207.3580003%202.0540001%207.215%202.0540001%20C%207.176%202.0540001%206.981%201.937%206.981%201.781%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.709090909090909em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;. Construct the subgraph
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2011.817%2021.878999999999998%22%20width%3D%2211.817pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g42445E1EBAF5307FB8C297D0478333B9%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g42445E1EBAF5307FB8C297D0478333B9%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2011.453%208.684%20C%2011.453%208.814%2011.375%208.879%2011.219%208.879%20L%209.568%208.84%20L%207.9170003%208.879%20C%207.709%208.879%207.618%208.762%207.618%208.567%20C%207.618%208.476%207.657%208.411%207.722%208.398%20C%207.852%208.385%207.9560003%208.372%208.021%208.372%20C%208.424%208.359%208.645%208.333%208.71%208.32%20C%208.775001%208.307%208.814%208.268001%208.814%208.203%20C%208.801001%208.1640005%208.788%208.086%208.762%207.9690003%20L%207.9950004%204.875%20L%204.173%204.875%20L%204.927%207.826%20C%204.992%208.099%205.109%208.268001%205.278%208.333%20C%205.369%208.359%205.59%208.372%205.954%208.372%20C%206.3050003%208.372%206.448%208.372%206.448%208.684%20C%206.448%208.814%206.3700004%208.879%206.214%208.879%20L%204.563%208.84%20L%202.8990002%208.879%20C%202.691%208.879%202.6000001%208.762%202.6000001%208.567%20C%202.6000001%208.476%202.639%208.411%202.717%208.398%20C%202.8470001%208.385%202.951%208.372%203.016%208.372%20C%203.4190001%208.359%203.653%208.333%203.7180002%208.32%20C%203.783%208.307%203.809%208.268001%203.809%208.203%20C%203.809%208.177%203.796%208.099%203.757%207.9690003%20L%202.028%201.066%20C%201.963%200.78000003%201.8330001%200.611%201.638%200.546%20C%201.547%200.52%201.3130001%200.507%200.91%200.507%20C%200.624%200.507%200.507%200.481%200.507%200.19500001%20C%200.507%200.065%200.58500004%200%200.741%200%20L%202.379%200.039%20L%203.198%200.026%20C%203.341%200.026%203.887%200%204.03%200%20C%204.238%200%204.342%200.104%204.342%200.312%20C%204.342%200.442%204.199%200.507%203.926%200.507%20C%203.4060001%200.507%203.1460001%200.559%203.1460001%200.676%20C%203.1460001%200.676%203.1590002%200.71500003%203.1850002%200.884%20L%204.056%204.368%20L%207.8650002%204.368%20L%206.994%200.884%20C%206.955%200.689%206.7990003%200.559%206.539%200.52%20C%206.474%200.507%206.2530003%200.507%205.876%200.507%20C%205.629%200.507%205.512%200.403%205.512%200.19500001%20C%205.512%200.065%205.59%200%205.7460003%200%20L%207.3840003%200.039%20L%208.203%200.026%20C%208.346%200.026%208.879%200%209.048%200%20C%209.2560005%200%209.360001%200.104%209.360001%200.312%20C%209.360001%200.442%209.217%200.507%208.944%200.507%20C%208.411%200.507%208.151%200.559%208.151%200.676%20C%208.151%200.676%208.1640005%200.71500003%208.190001%200.884%20L%209.932%207.826%20C%209.997%208.099%2010.114%208.268001%2010.283%208.333%20C%2010.361%208.359%2010.582%208.372%2010.959001%208.372%20C%2011.297%208.372%2011.453%208.372%2011.453%208.684%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.0742727272727273em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; of &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2010.218000000000002%2021.878999999999998%22%20width%3D%2210.218000000000002pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gE3860358A905CFB8A7E8F7EAB3DED84E%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gE3860358A905CFB8A7E8F7EAB3DED84E%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.212%20-0.286%20C%205.356%20-0.286%206.2530003%200.065%206.9160004%200.767%20C%206.994%200.598%207.3320003%200.013%207.514%200.013%20C%207.579%200.013%207.618%200.052%207.644%200.104%20C%207.67%200.156%207.761%200.416%207.8780003%200.884%20L%208.112%201.872%20C%208.190001%202.171%208.242001%202.392%208.281%202.535%20C%208.424%203.107%208.424%203.094%209.126%203.107%20C%209.295%203.107%209.373%203.211%209.373%203.4190001%20C%209.373%203.549%209.308001%203.614%209.165%203.614%20C%208.918%203.614%208.06%203.562%207.813%203.575%20L%206.006%203.614%20C%205.7980003%203.614%205.6940002%203.51%205.6940002%203.302%20C%205.6940002%203.1850002%205.7720003%203.1330001%205.928%203.1200001%20C%206.669%203.081%207.059%203.055%207.098%203.029%20C%207.137%203.003%207.15%202.951%207.15%202.8860002%20C%207.15%202.795%207.059%202.405%206.8900003%201.7290001%20C%206.63%200.79300004%205.668%200.221%204.459%200.221%20C%202.8730001%200.221%201.924%201.274%201.924%202.8600001%20C%201.924%203.107%201.95%203.4190001%201.9890001%203.77%20C%202.132%204.836%202.834%206.3310003%203.3930001%207.02%20C%204.043%207.839%205.2390003%208.658%206.565%208.658%20C%207.9170003%208.658%208.58%207.631%208.58%206.227%20C%208.58%206.11%208.541%205.6940002%208.541%205.577%20C%208.541%205.46%208.619%205.395%208.788%205.395%20C%208.853001%205.395%208.905%205.408%208.944%205.421%20C%209.009%205.512%209.048%205.603%209.074%205.6940002%20L%209.88%208.983%20C%209.88%209.1%209.815001%209.165%209.685%209.165%20C%209.633%209.165%209.555%209.113%209.451%208.996%20L%208.606%208.047%20C%208.099%208.788%207.3840003%209.165%206.461%209.165%20C%205.7460003%209.165%205.044%208.996%204.329%208.6710005%20C%202.8860002%207.9950004%201.8330001%206.9290004%201.1570001%205.473%20C%200.819%204.758%200.65000004%204.03%200.65000004%203.289%20C%200.65000004%201.209%202.132%20-0.286%204.212%20-0.286%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.928909090909091em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; whose vertex set is &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2013.988%2021.878999999999998%22%20width%3D%2213.988pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g39839232D9B855C6E487282AC713D032%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g39839232D9B855C6E487282AC713D032%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2012.428%208.84%20C%2012.181001%208.84%2011.336%208.879%2011.089001%208.879%20C%2010.894%208.879%2010.79%208.775001%2010.79%208.58%20C%2010.79%208.45%2010.868%208.385%2011.024%208.372%20C%2011.505%208.359%2011.739%208.216001%2011.739%207.9300003%20C%2011.739%207.852%2011.687%207.722%2011.583%207.527%20L%208.177%201.625%20L%207.722%207.826%20C%207.67%208.294001%207.9820004%208.372%208.567%208.372%20C%208.84%208.372%208.97%208.476%208.97%208.684%20C%208.97%208.814%208.892%208.879%208.723001%208.879%20C%208.437%208.879%207.4360003%208.84%207.15%208.84%20C%206.9030004%208.84%206.045%208.879%205.7980003%208.879%20C%205.603%208.879%205.499%208.775001%205.499%208.567%20C%205.499%208.437%205.616%208.372%205.863%208.372%20C%206.2660003%208.372%206.474%208.281%206.487%208.099%20L%206.565%207.124%20L%203.3930001%201.625%20L%202.925%207.9690003%20C%202.8860002%208.294001%203.4320002%208.372%203.848%208.372%20C%204.0690002%208.372%204.173%208.476%204.173%208.684%20C%204.173%208.814%204.0950003%208.879%203.9390001%208.879%20C%203.653%208.879%202.639%208.84%202.3530002%208.84%20C%202.106%208.84%201.248%208.879%201.001%208.879%20C%200.806%208.879%200.71500003%208.775001%200.71500003%208.58%20C%200.71500003%208.437%200.845%208.372%201.092%208.372%20C%201.638%208.372%201.69%208.346%201.7160001%207.9560003%20L%202.301%200.091000006%20C%202.3140001%20-0.156%202.405%20-0.286%202.561%20-0.286%20C%202.73%20-0.26%202.795%20-0.221%202.8990002%20-0.026%20C%202.9120002%20-0.013%202.9120002%200%202.9120002%200.013%20L%206.617%206.422%20L%207.085%200.091000006%20C%207.098%20-0.156%207.189%20-0.286%207.3450003%20-0.286%20C%207.4750004%20-0.286%207.592%20-0.19500001%207.696%20-0.013%20L%2011.934%207.306%20C%2012.285%207.9430003%2012.532001%208.307%2013.325%208.372%20C%2013.559%208.398%2013.624001%208.463%2013.624001%208.684%20C%2013.624001%208.814%2013.559%208.879%2013.416%208.879%20C%2013.234%208.879%2012.610001%208.84%2012.428%208.84%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.2716363636363637em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, preserving all edges connecting
nodes in &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2013.988%2021.878999999999998%22%20width%3D%2213.988pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g39839232D9B855C6E487282AC713D032%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g39839232D9B855C6E487282AC713D032%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2012.428%208.84%20C%2012.181001%208.84%2011.336%208.879%2011.089001%208.879%20C%2010.894%208.879%2010.79%208.775001%2010.79%208.58%20C%2010.79%208.45%2010.868%208.385%2011.024%208.372%20C%2011.505%208.359%2011.739%208.216001%2011.739%207.9300003%20C%2011.739%207.852%2011.687%207.722%2011.583%207.527%20L%208.177%201.625%20L%207.722%207.826%20C%207.67%208.294001%207.9820004%208.372%208.567%208.372%20C%208.84%208.372%208.97%208.476%208.97%208.684%20C%208.97%208.814%208.892%208.879%208.723001%208.879%20C%208.437%208.879%207.4360003%208.84%207.15%208.84%20C%206.9030004%208.84%206.045%208.879%205.7980003%208.879%20C%205.603%208.879%205.499%208.775001%205.499%208.567%20C%205.499%208.437%205.616%208.372%205.863%208.372%20C%206.2660003%208.372%206.474%208.281%206.487%208.099%20L%206.565%207.124%20L%203.3930001%201.625%20L%202.925%207.9690003%20C%202.8860002%208.294001%203.4320002%208.372%203.848%208.372%20C%204.0690002%208.372%204.173%208.476%204.173%208.684%20C%204.173%208.814%204.0950003%208.879%203.9390001%208.879%20C%203.653%208.879%202.639%208.84%202.3530002%208.84%20C%202.106%208.84%201.248%208.879%201.001%208.879%20C%200.806%208.879%200.71500003%208.775001%200.71500003%208.58%20C%200.71500003%208.437%200.845%208.372%201.092%208.372%20C%201.638%208.372%201.69%208.346%201.7160001%207.9560003%20L%202.301%200.091000006%20C%202.3140001%20-0.156%202.405%20-0.286%202.561%20-0.286%20C%202.73%20-0.26%202.795%20-0.221%202.8990002%20-0.026%20C%202.9120002%20-0.013%202.9120002%200%202.9120002%200.013%20L%206.617%206.422%20L%207.085%200.091000006%20C%207.098%20-0.156%207.189%20-0.286%207.3450003%20-0.286%20C%207.4750004%20-0.286%207.592%20-0.19500001%207.696%20-0.013%20L%2011.934%207.306%20C%2012.285%207.9430003%2012.532001%208.307%2013.325%208.372%20C%2013.559%208.398%2013.624001%208.463%2013.624001%208.684%20C%2013.624001%208.814%2013.559%208.879%2013.416%208.879%20C%2013.234%208.879%2012.610001%208.84%2012.428%208.84%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.2716363636363637em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Find the set of nodes &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2041.074222222222225%2021.878999999999998%22%20width%3D%2241.074222222222225pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g8849D2DE368A2CDC46B1744159AC1EF7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2813.36111111111111%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA92B4421839DEBCD116E3337D38137D1%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2827.086222222222226%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g39839232D9B855C6E487282AC713D032%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g8849D2DE368A2CDC46B1744159AC1EF7%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.781%200.039%20C%202.015%200.039%202.821%200%203.068%200%20C%203.263%200%203.354%200.104%203.354%200.299%20C%203.354%200.416%203.276%200.49400002%203.107%200.507%20C%202.73%200.52%202.548%200.65000004%202.548%200.897%20C%202.548%201.014%202.665%201.274%202.9120002%201.664%20C%203.263%202.249%203.51%202.678%203.6790001%202.964%20L%206.8380003%202.964%20C%206.8380003%202.8730001%206.8510003%202.691%206.8900003%202.405%20C%206.981%201.4560001%207.033%200.936%207.033%200.871%20C%207.033%200.624%206.747%200.507%206.162%200.507%20C%205.915%200.507%205.7980003%200.403%205.7980003%200.19500001%20C%205.7980003%200.065%205.876%200%206.032%200%20C%206.3440003%200%207.3320003%200.039%207.644%200.039%20C%207.9040003%200.039%208.827001%200%209.087%200%20C%209.282001%200%209.373%200.104%209.373%200.312%20C%209.373%200.442%209.2560005%200.507%209.022%200.507%20C%208.658%200.507%208.437%200.533%208.372%200.572%20C%208.307%200.611%208.255%200.72800004%208.242001%200.92300004%20L%207.4620004%208.957%20C%207.4230003%209.204%207.4360003%209.308001%207.163%209.308001%20C%207.007%209.308001%206.8770003%209.2300005%206.7860003%209.061%20L%202.3140001%201.5600001%20C%201.924%200.91%201.404%200.559%200.767%200.507%20C%200.559%200.49400002%200.455%200.39000002%200.455%200.19500001%20C%200.455%200.065%200.533%200%200.676%200%20C%200.884%200%201.5730001%200.039%201.781%200.039%20Z%20M%206.396%207.501%20L%206.7860003%203.471%20L%203.9910002%203.471%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA92B4421839DEBCD116E3337D38137D1%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%208.6970005%201.131%20L%204.914%201.131%20C%204.017%201.131%203.276%201.4300001%202.652%202.0540001%20C%202.028%202.678%201.7160001%203.4320002%201.7160001%204.329%20C%201.7160001%205.2260003%202.028%205.98%202.652%206.604%20C%203.276%207.228%204.017%207.527%204.914%207.527%20L%208.6970005%207.527%20C%208.905%207.527%209.009%207.631%209.009%207.839%20C%209.009%208.047%208.905%208.151%208.6970005%208.151%20L%204.914%208.151%20C%203.848%208.151%202.951%207.787%202.21%207.046%20C%201.469%206.3050003%201.105%205.395%201.105%204.329%20C%201.105%203.263%201.469%202.3530002%202.21%201.612%20C%202.951%200.871%203.848%200.507%204.914%200.507%20L%208.6970005%200.507%20C%208.905%200.507%209.009%200.611%209.009%200.819%20C%209.009%200.98800004%208.866%201.131%208.6970005%201.131%20Z%20M%208.6970005%20-1.04%20L%201.69%20-1.04%20C%201.495%20-1.04%201.391%20-1.144%201.391%20-1.339%20C%201.391%20-1.547%201.495%20-1.651%201.69%20-1.651%20L%208.6970005%20-1.651%20C%208.905%20-1.651%209.009%20-1.547%209.009%20-1.339%20C%209.009%20-1.183%208.866%20-1.04%208.6970005%20-1.04%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g39839232D9B855C6E487282AC713D032%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2012.428%208.84%20C%2012.181001%208.84%2011.336%208.879%2011.089001%208.879%20C%2010.894%208.879%2010.79%208.775001%2010.79%208.58%20C%2010.79%208.45%2010.868%208.385%2011.024%208.372%20C%2011.505%208.359%2011.739%208.216001%2011.739%207.9300003%20C%2011.739%207.852%2011.687%207.722%2011.583%207.527%20L%208.177%201.625%20L%207.722%207.826%20C%207.67%208.294001%207.9820004%208.372%208.567%208.372%20C%208.84%208.372%208.97%208.476%208.97%208.684%20C%208.97%208.814%208.892%208.879%208.723001%208.879%20C%208.437%208.879%207.4360003%208.84%207.15%208.84%20C%206.9030004%208.84%206.045%208.879%205.7980003%208.879%20C%205.603%208.879%205.499%208.775001%205.499%208.567%20C%205.499%208.437%205.616%208.372%205.863%208.372%20C%206.2660003%208.372%206.474%208.281%206.487%208.099%20L%206.565%207.124%20L%203.3930001%201.625%20L%202.925%207.9690003%20C%202.8860002%208.294001%203.4320002%208.372%203.848%208.372%20C%204.0690002%208.372%204.173%208.476%204.173%208.684%20C%204.173%208.814%204.0950003%208.879%203.9390001%208.879%20C%203.653%208.879%202.639%208.84%202.3530002%208.84%20C%202.106%208.84%201.248%208.879%201.001%208.879%20C%200.806%208.879%200.71500003%208.775001%200.71500003%208.58%20C%200.71500003%208.437%200.845%208.372%201.092%208.372%20C%201.638%208.372%201.69%208.346%201.7160001%207.9560003%20L%202.301%200.091000006%20C%202.3140001%20-0.156%202.405%20-0.286%202.561%20-0.286%20C%202.73%20-0.26%202.795%20-0.221%202.8990002%20-0.026%20C%202.9120002%20-0.013%202.9120002%200%202.9120002%200.013%20L%206.617%206.422%20L%207.085%200.091000006%20C%207.098%20-0.156%207.189%20-0.286%207.3450003%20-0.286%20C%207.4750004%20-0.286%207.592%20-0.19500001%207.696%20-0.013%20L%2011.934%207.306%20C%2012.285%207.9430003%2012.532001%208.307%2013.325%208.372%20C%2013.559%208.398%2013.624001%208.463%2013.624001%208.684%20C%2013.624001%208.814%2013.559%208.879%2013.416%208.879%20C%2013.234%208.879%2012.610001%208.84%2012.428%208.84%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.7340202020202025em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; for which the indegree of each
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2032.52022222222222%2021.878999999999998%22%20width%3D%2232.52022222222222pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.488111111111111%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g64CA8EBFD302DE0CE83A3B8E6DC4BE01%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2822.770222222222227%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g8849D2DE368A2CDC46B1744159AC1EF7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g64CA8EBFD302DE0CE83A3B8E6DC4BE01%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.3190002%200.052%20L%204.849%200.052%20C%204.03%200.052%203.302%200.32500002%202.704%200.884%20C%202.106%201.4430001%201.768%202.119%201.69%202.938%20L%207.3190002%202.938%20C%207.527%202.938%207.631%203.042%207.631%203.25%20C%207.631%203.4580002%207.527%203.562%207.3190002%203.562%20L%201.69%203.562%20C%201.768%204.381%202.106%205.057%202.704%205.616%20C%203.302%206.175%204.03%206.448%204.849%206.448%20L%207.3190002%206.448%20C%207.527%206.448%207.631%206.552%207.631%206.747%20C%207.631%206.955%207.527%207.059%207.3190002%207.059%20L%204.849%207.059%20C%203.796%207.059%202.8990002%206.695%202.158%205.954%20C%201.417%205.2130003%201.053%204.316%201.053%203.25%20C%201.053%202.184%201.417%201.2870001%202.158%200.546%20C%202.8990002%20-0.19500001%203.796%20-0.559%204.849%20-0.559%20L%207.3190002%20-0.559%20C%207.527%20-0.559%207.631%20-0.455%207.631%20-0.24700001%20C%207.631%20-0.091000006%207.488%200.052%207.3190002%200.052%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g8849D2DE368A2CDC46B1744159AC1EF7%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.781%200.039%20C%202.015%200.039%202.821%200%203.068%200%20C%203.263%200%203.354%200.104%203.354%200.299%20C%203.354%200.416%203.276%200.49400002%203.107%200.507%20C%202.73%200.52%202.548%200.65000004%202.548%200.897%20C%202.548%201.014%202.665%201.274%202.9120002%201.664%20C%203.263%202.249%203.51%202.678%203.6790001%202.964%20L%206.8380003%202.964%20C%206.8380003%202.8730001%206.8510003%202.691%206.8900003%202.405%20C%206.981%201.4560001%207.033%200.936%207.033%200.871%20C%207.033%200.624%206.747%200.507%206.162%200.507%20C%205.915%200.507%205.7980003%200.403%205.7980003%200.19500001%20C%205.7980003%200.065%205.876%200%206.032%200%20C%206.3440003%200%207.3320003%200.039%207.644%200.039%20C%207.9040003%200.039%208.827001%200%209.087%200%20C%209.282001%200%209.373%200.104%209.373%200.312%20C%209.373%200.442%209.2560005%200.507%209.022%200.507%20C%208.658%200.507%208.437%200.533%208.372%200.572%20C%208.307%200.611%208.255%200.72800004%208.242001%200.92300004%20L%207.4620004%208.957%20C%207.4230003%209.204%207.4360003%209.308001%207.163%209.308001%20C%207.007%209.308001%206.8770003%209.2300005%206.7860003%209.061%20L%202.3140001%201.5600001%20C%201.924%200.91%201.404%200.559%200.767%200.507%20C%200.559%200.49400002%200.455%200.39000002%200.455%200.19500001%20C%200.455%200.065%200.533%200%200.676%200%20C%200.884%200%201.5730001%200.039%201.781%200.039%20Z%20M%206.396%207.501%20L%206.7860003%203.471%20L%203.9910002%203.471%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.9563838383838386em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; in &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2011.817%2021.878999999999998%22%20width%3D%2211.817pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g42445E1EBAF5307FB8C297D0478333B9%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g42445E1EBAF5307FB8C297D0478333B9%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2011.453%208.684%20C%2011.453%208.814%2011.375%208.879%2011.219%208.879%20L%209.568%208.84%20L%207.9170003%208.879%20C%207.709%208.879%207.618%208.762%207.618%208.567%20C%207.618%208.476%207.657%208.411%207.722%208.398%20C%207.852%208.385%207.9560003%208.372%208.021%208.372%20C%208.424%208.359%208.645%208.333%208.71%208.32%20C%208.775001%208.307%208.814%208.268001%208.814%208.203%20C%208.801001%208.1640005%208.788%208.086%208.762%207.9690003%20L%207.9950004%204.875%20L%204.173%204.875%20L%204.927%207.826%20C%204.992%208.099%205.109%208.268001%205.278%208.333%20C%205.369%208.359%205.59%208.372%205.954%208.372%20C%206.3050003%208.372%206.448%208.372%206.448%208.684%20C%206.448%208.814%206.3700004%208.879%206.214%208.879%20L%204.563%208.84%20L%202.8990002%208.879%20C%202.691%208.879%202.6000001%208.762%202.6000001%208.567%20C%202.6000001%208.476%202.639%208.411%202.717%208.398%20C%202.8470001%208.385%202.951%208.372%203.016%208.372%20C%203.4190001%208.359%203.653%208.333%203.7180002%208.32%20C%203.783%208.307%203.809%208.268001%203.809%208.203%20C%203.809%208.177%203.796%208.099%203.757%207.9690003%20L%202.028%201.066%20C%201.963%200.78000003%201.8330001%200.611%201.638%200.546%20C%201.547%200.52%201.3130001%200.507%200.91%200.507%20C%200.624%200.507%200.507%200.481%200.507%200.19500001%20C%200.507%200.065%200.58500004%200%200.741%200%20L%202.379%200.039%20L%203.198%200.026%20C%203.341%200.026%203.887%200%204.03%200%20C%204.238%200%204.342%200.104%204.342%200.312%20C%204.342%200.442%204.199%200.507%203.926%200.507%20C%203.4060001%200.507%203.1460001%200.559%203.1460001%200.676%20C%203.1460001%200.676%203.1590002%200.71500003%203.1850002%200.884%20L%204.056%204.368%20L%207.8650002%204.368%20L%206.994%200.884%20C%206.955%200.689%206.7990003%200.559%206.539%200.52%20C%206.474%200.507%206.2530003%200.507%205.876%200.507%20C%205.629%200.507%205.512%200.403%205.512%200.19500001%20C%205.512%200.065%205.59%200%205.7460003%200%20L%207.3840003%200.039%20L%208.203%200.026%20C%208.346%200.026%208.879%200%209.048%200%20C%209.2560005%200%209.360001%200.104%209.360001%200.312%20C%209.360001%200.442%209.217%200.507%208.944%200.507%20C%208.411%200.507%208.151%200.559%208.151%200.676%20C%208.151%200.676%208.1640005%200.71500003%208.190001%200.884%20L%209.932%207.826%20C%209.997%208.099%2010.114%208.268001%2010.283%208.333%20C%2010.361%208.359%2010.582%208.372%2010.959001%208.372%20C%2011.297%208.372%2011.453%208.372%2011.453%208.684%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.0742727272727273em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; is &lt;em&gt;not&lt;&#x2F;em&gt; equal to its indegree in &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2010.218000000000002%2021.878999999999998%22%20width%3D%2210.218000000000002pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gE3860358A905CFB8A7E8F7EAB3DED84E%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gE3860358A905CFB8A7E8F7EAB3DED84E%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.212%20-0.286%20C%205.356%20-0.286%206.2530003%200.065%206.9160004%200.767%20C%206.994%200.598%207.3320003%200.013%207.514%200.013%20C%207.579%200.013%207.618%200.052%207.644%200.104%20C%207.67%200.156%207.761%200.416%207.8780003%200.884%20L%208.112%201.872%20C%208.190001%202.171%208.242001%202.392%208.281%202.535%20C%208.424%203.107%208.424%203.094%209.126%203.107%20C%209.295%203.107%209.373%203.211%209.373%203.4190001%20C%209.373%203.549%209.308001%203.614%209.165%203.614%20C%208.918%203.614%208.06%203.562%207.813%203.575%20L%206.006%203.614%20C%205.7980003%203.614%205.6940002%203.51%205.6940002%203.302%20C%205.6940002%203.1850002%205.7720003%203.1330001%205.928%203.1200001%20C%206.669%203.081%207.059%203.055%207.098%203.029%20C%207.137%203.003%207.15%202.951%207.15%202.8860002%20C%207.15%202.795%207.059%202.405%206.8900003%201.7290001%20C%206.63%200.79300004%205.668%200.221%204.459%200.221%20C%202.8730001%200.221%201.924%201.274%201.924%202.8600001%20C%201.924%203.107%201.95%203.4190001%201.9890001%203.77%20C%202.132%204.836%202.834%206.3310003%203.3930001%207.02%20C%204.043%207.839%205.2390003%208.658%206.565%208.658%20C%207.9170003%208.658%208.58%207.631%208.58%206.227%20C%208.58%206.11%208.541%205.6940002%208.541%205.577%20C%208.541%205.46%208.619%205.395%208.788%205.395%20C%208.853001%205.395%208.905%205.408%208.944%205.421%20C%209.009%205.512%209.048%205.603%209.074%205.6940002%20L%209.88%208.983%20C%209.88%209.1%209.815001%209.165%209.685%209.165%20C%209.633%209.165%209.555%209.113%209.451%208.996%20L%208.606%208.047%20C%208.099%208.788%207.3840003%209.165%206.461%209.165%20C%205.7460003%209.165%205.044%208.996%204.329%208.6710005%20C%202.8860002%207.9950004%201.8330001%206.9290004%201.1570001%205.473%20C%200.819%204.758%200.65000004%204.03%200.65000004%203.289%20C%200.65000004%201.209%202.132%20-0.286%204.212%20-0.286%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.928909090909091em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;For each &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2032.52022222222222%2021.878999999999998%22%20width%3D%2232.52022222222222pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2810.488111111111111%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g64CA8EBFD302DE0CE83A3B8E6DC4BE01%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2822.770222222222227%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g8849D2DE368A2CDC46B1744159AC1EF7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g64CA8EBFD302DE0CE83A3B8E6DC4BE01%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.3190002%200.052%20L%204.849%200.052%20C%204.03%200.052%203.302%200.32500002%202.704%200.884%20C%202.106%201.4430001%201.768%202.119%201.69%202.938%20L%207.3190002%202.938%20C%207.527%202.938%207.631%203.042%207.631%203.25%20C%207.631%203.4580002%207.527%203.562%207.3190002%203.562%20L%201.69%203.562%20C%201.768%204.381%202.106%205.057%202.704%205.616%20C%203.302%206.175%204.03%206.448%204.849%206.448%20L%207.3190002%206.448%20C%207.527%206.448%207.631%206.552%207.631%206.747%20C%207.631%206.955%207.527%207.059%207.3190002%207.059%20L%204.849%207.059%20C%203.796%207.059%202.8990002%206.695%202.158%205.954%20C%201.417%205.2130003%201.053%204.316%201.053%203.25%20C%201.053%202.184%201.417%201.2870001%202.158%200.546%20C%202.8990002%20-0.19500001%203.796%20-0.559%204.849%20-0.559%20L%207.3190002%20-0.559%20C%207.527%20-0.559%207.631%20-0.455%207.631%20-0.24700001%20C%207.631%20-0.091000006%207.488%200.052%207.3190002%200.052%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g8849D2DE368A2CDC46B1744159AC1EF7%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.781%200.039%20C%202.015%200.039%202.821%200%203.068%200%20C%203.263%200%203.354%200.104%203.354%200.299%20C%203.354%200.416%203.276%200.49400002%203.107%200.507%20C%202.73%200.52%202.548%200.65000004%202.548%200.897%20C%202.548%201.014%202.665%201.274%202.9120002%201.664%20C%203.263%202.249%203.51%202.678%203.6790001%202.964%20L%206.8380003%202.964%20C%206.8380003%202.8730001%206.8510003%202.691%206.8900003%202.405%20C%206.981%201.4560001%207.033%200.936%207.033%200.871%20C%207.033%200.624%206.747%200.507%206.162%200.507%20C%205.915%200.507%205.7980003%200.403%205.7980003%200.19500001%20C%205.7980003%200.065%205.876%200%206.032%200%20C%206.3440003%200%207.3320003%200.039%207.644%200.039%20C%207.9040003%200.039%208.827001%200%209.087%200%20C%209.282001%200%209.373%200.104%209.373%200.312%20C%209.373%200.442%209.2560005%200.507%209.022%200.507%20C%208.658%200.507%208.437%200.533%208.372%200.572%20C%208.307%200.611%208.255%200.72800004%208.242001%200.92300004%20L%207.4620004%208.957%20C%207.4230003%209.204%207.4360003%209.308001%207.163%209.308001%20C%207.007%209.308001%206.8770003%209.2300005%206.7860003%209.061%20L%202.3140001%201.5600001%20C%201.924%200.91%201.404%200.559%200.767%200.507%20C%200.559%200.49400002%200.455%200.39000002%200.455%200.19500001%20C%200.455%200.065%200.533%200%200.676%200%20C%200.884%200%201.5730001%200.039%201.781%200.039%20Z%20M%206.396%207.501%20L%206.7860003%203.471%20L%203.9910002%203.471%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.9563838383838386em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, mark it and its descendants as accessible.&lt;&#x2F;li&gt;
&lt;li&gt;If and only if &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.799999999999999%2021.878999999999998%22%20width%3D%227.799999999999999pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCC2D6A7770FCF135D0D1A78A9F87C718%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCC2D6A7770FCF135D0D1A78A9F87C718%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.981%201.781%20C%206.682%200.754%206.2530003%200.234%205.7200003%200.234%20C%205.551%200.234%205.46%200.36400002%205.46%200.611%20C%205.46%200.79300004%205.538%201.092%205.6940002%201.495%20C%206.214%202.9120002%206.474%203.848%206.474%204.329%20C%206.474%205.2390003%205.863%205.7460003%204.953%205.7460003%20C%204.186%205.7460003%203.523%205.408%202.99%204.719%20C%202.8860002%205.291%202.431%205.7460003%201.768%205.7460003%20C%201.04%205.7460003%200.754%205.07%200.572%204.485%20C%200.442%204.0690002%200.377%203.822%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.963%205.369%202.08%205.1870003%202.08%204.823%20C%202.08%204.6540003%202.015%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4430001%20-0.143%20C%201.69%20-0.143%201.872%20-0.013%201.963%200.24700001%20C%201.9890001%200.312%202.0670002%200.637%202.21%201.196%20L%202.483%202.3530002%20L%202.8730001%203.835%20C%203.016%204.1340003%203.237%204.433%203.51%204.745%20C%203.887%205.1610003%204.355%205.369%204.914%205.369%20C%205.343%205.369%205.551%205.083%205.551%204.524%20C%205.551%204.03%205.278%203.042%204.719%201.5600001%20C%204.6280003%201.326%204.589%201.131%204.589%200.962%20C%204.589%200.32500002%205.07%20-0.143%205.6940002%20-0.143%20C%206.2660003%20-0.143%206.721%200.18200001%207.046%200.832%20C%207.293%201.352%207.4230003%201.7030001%207.4230003%201.872%20C%207.4230003%201.9890001%207.3580003%202.0540001%207.215%202.0540001%20C%207.176%202.0540001%206.981%201.937%206.981%201.781%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.709090909090909em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; was marked as accessible, it is accessible.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Here’s a serpentine implementation in pseudocode, if that’s what you
prefer.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;py&quot; class=&quot;language-py z-code&quot;&gt;&lt;code class=&quot;language-py&quot; data-lang=&quot;py&quot;&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;&lt;span class=&quot;z-keyword z-declaration z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;is_accessible&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;n&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-function z-begin z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;counts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-mapping z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-begin z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;n&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-python&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-python&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;n&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;indegree&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-end z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-loop z-for z-python&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-section z-target-list z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-python&quot;&gt;_&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-target-list z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;m&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-target-list z-end z-python&quot;&gt;)&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-loop z-for z-in z-python&quot;&gt;in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;n&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;edges&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-loop z-for z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;dfs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;m&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;counts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;reachable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-support z-type z-python&quot;&gt;set&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-loop z-for z-python&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-section z-target-list z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-target-list z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;count&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-target-list z-end z-python&quot;&gt;)&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-loop z-for z-in z-python&quot;&gt;in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;counts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-loop z-for z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-statement z-conditional z-if z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-conditional z-if z-python&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;count&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-python&quot;&gt;!=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-python&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-block z-conditional z-if z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;            &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;mark&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;reachable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-flow z-return z-python&quot;&gt;return&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;n&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt;in&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;reachable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;&lt;span class=&quot;z-keyword z-declaration z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;dfs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;n&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-parameters z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;counts&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-function z-begin z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-statement z-conditional z-if z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-conditional z-if z-python&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;n&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt;not&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt;in&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;counts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;keys&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-block z-conditional z-if z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;counts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-brackets z-begin z-python&quot;&gt;[&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-arguments z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;n&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-brackets z-end z-python&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;n&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;indegree&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-loop z-for z-python&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-section z-target-list z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-python&quot;&gt;_&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-target-list z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;m&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-target-list z-end z-python&quot;&gt;)&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-loop z-for z-in z-python&quot;&gt;in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;n&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;edges&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-loop z-for z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;            &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;dfs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;m&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;counts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;counts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-brackets z-begin z-python&quot;&gt;[&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-arguments z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;n&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-brackets z-end z-python&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-augmented z-python&quot;&gt;-=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-python&quot;&gt;1&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;&lt;span class=&quot;z-keyword z-declaration z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;mark&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-parameters z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;reachable&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-function z-begin z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-statement z-conditional z-if z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-conditional z-if z-python&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt;not&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt;in&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;reachable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-block z-conditional z-if z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;reachable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;add&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-loop z-for z-python&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-section z-target-list z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-python&quot;&gt;_&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-target-list z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;b&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-target-list z-end z-python&quot;&gt;)&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-loop z-for z-in z-python&quot;&gt;in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;edges&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-loop z-for z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;            &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;mark&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;b&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;reachable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It should be pretty clear to see that &lt;code&gt;is_accessible&lt;&#x2F;code&gt; runs in
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2071.10277777777777%2021.878999999999998%22%20width%3D%2271.10277777777777pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD64B3975C9A5026604F20A029CCF2ADF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.984%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g71010E02B37BE1C0875AD8D94171F929%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.041%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g17AF90F25DACF254827E59F8A3A9E6D4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2818.655000000000005%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gE89BA01FCDF5D4463D821614CE2F6DF3%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2829.016000000000002%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g17AF90F25DACF254827E59F8A3A9E6D4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2835.51888888888889%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFCDE359C75472195CEC97DC4B537C342%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2848.52177777777778%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g17AF90F25DACF254827E59F8A3A9E6D4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2852.135777777777776%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9308D3AA5B63656D688EAB82DBF8B4B8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2862.431777777777775%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g17AF90F25DACF254827E59F8A3A9E6D4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2866.04577777777777%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4D62189ABBC2948BAB13C269F5CB8E70%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD64B3975C9A5026604F20A029CCF2ADF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.126%203.4190001%20C%209.451%204.16%209.62%204.901%209.62%205.655%20C%209.62%206.669%209.321%207.501%208.71%208.1640005%20C%208.099%208.827001%207.293%209.165%206.2920003%209.165%20C%205.603%209.165%204.914%208.996%204.225%208.658%20C%202.821%207.9690003%201.794%206.8770003%201.131%205.395%20C%200.806%204.6670003%200.637%203.9390001%200.637%203.198%20C%200.637%202.171%200.936%201.339%201.547%200.689%20C%202.158%200.039%202.964%20-0.286%203.9780002%20-0.286%20C%204.6540003%20-0.286%205.33%20-0.117%206.019%200.208%20C%207.4360003%200.897%208.463%201.9760001%209.126%203.4190001%20Z%20M%208.372%206.162%20C%208.372%204.433%207.592%202.704%206.76%201.677%20C%206.188%200.962%205.2000003%200.156%204.056%200.156%20C%202.665%200.156%201.937%201.365%201.937%202.834%20C%201.937%203.289%202.028%203.9%202.197%204.6410003%20C%202.548%206.175%203.4320002%207.527%204.589%208.229%20C%205.1480002%208.567%205.6940002%208.736%206.214%208.736%20C%207.618%208.736%208.372%207.618%208.372%206.162%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g71010E02B37BE1C0875AD8D94171F929%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.1340003%20-3.224%20C%204.251%20-3.224%204.316%20-3.1590002%204.316%20-3.042%20C%204.316%20-3.003%204.29%20-2.951%204.251%20-2.8990002%20C%203.575%20-2.379%203.029%20-1.521%202.6260002%20-0.338%20C%202.275%200.689%202.093%201.7030001%202.093%202.704%20L%202.093%203.796%20C%202.093%204.797%202.275%205.8110003%202.6260002%206.8380003%20C%203.029%208.021%203.575%208.879%204.251%209.399%20C%204.29%209.438%204.316%209.49%204.316%209.542%20C%204.316%209.659%204.251%209.724%204.1340003%209.724%20C%204.1210003%209.724%204.0820003%209.711%204.043%209.685%20C%203.263%209.087%202.6130002%208.203%202.08%207.02%20C%201.5730001%205.889%201.3130001%204.823%201.3130001%203.796%20L%201.3130001%202.704%20C%201.3130001%201.677%201.5730001%200.611%202.08%20-0.52%20C%202.6130002%20-1.7030001%203.263%20-2.5870001%204.043%20-3.1850002%20C%204.0820003%20-3.211%204.1210003%20-3.224%204.1340003%20-3.224%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g17AF90F25DACF254827E59F8A3A9E6D4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.807%20-3.25%20C%201.9760001%20-3.25%202.0670002%20-3.1460001%202.0670002%20-2.938%20L%202.0670002%209.438%20C%202.0670002%209.646%201.9760001%209.75%201.807%209.75%20C%201.638%209.75%201.547%209.646%201.547%209.438%20L%201.547%20-2.938%20C%201.547%20-3.1460001%201.638%20-3.25%201.807%20-3.25%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gE89BA01FCDF5D4463D821614CE2F6DF3%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%208.723001%208.84%20C%208.476%208.84%207.696%208.879%207.4490004%208.879%20C%207.254%208.879%207.15%208.775001%207.15%208.58%20C%207.15%208.45%207.241%208.385%207.4100003%208.372%20C%207.774%208.359%207.9560003%208.229%207.9560003%208.008%20C%207.9560003%207.8910003%207.8910003%207.735%207.774%207.54%20L%203.9%201.391%20L%203.042%208.047%20C%203.042%208.268001%203.315%208.372%203.874%208.372%20C%204.1340003%208.372%204.251%208.463%204.251%208.684%20C%204.251%208.814%204.173%208.879%204.017%208.879%20C%203.7310002%208.879%202.717%208.84%202.431%208.84%20C%202.171%208.84%201.2870001%208.879%201.0270001%208.879%20C%200.832%208.879%200.72800004%208.775001%200.72800004%208.58%20C%200.72800004%208.437%200.85800004%208.372%201.105%208.372%20C%201.326%208.372%201.482%208.346%201.5860001%208.32%20C%201.794%208.255%201.781%208.229%201.82%207.9820004%20L%202.834%200.052%20C%202.8730001%20-0.169%202.977%20-0.286%203.1460001%20-0.286%20C%203.315%20-0.286%203.4450002%20-0.19500001%203.549%20-0.026%20L%208.177%207.3320003%20C%208.476%207.8%208.762%208.099%209.048%208.216001%20C%209.243%208.307%209.49%208.359%209.776%208.372%20C%209.919001%208.385%209.984%208.476%209.997%208.6710005%20C%2010.01%208.814%209.932%208.879%209.776%208.879%20C%209.581%208.879%208.918%208.84%208.723001%208.84%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gFCDE359C75472195CEC97DC4B537C342%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%203.562%20L%205.369%203.562%20L%205.369%207.267%20C%205.369%207.4750004%205.2650003%207.579%205.057%207.579%20C%204.849%207.579%204.745%207.4750004%204.745%207.267%20L%204.745%203.562%20L%201.04%203.562%20C%200.832%203.562%200.72800004%203.4580002%200.72800004%203.25%20C%200.72800004%203.042%200.832%202.938%201.04%202.938%20L%204.745%202.938%20L%204.745%20-0.767%20C%204.745%20-0.975%204.849%20-1.079%205.057%20-1.079%20C%205.2650003%20-1.079%205.369%20-0.975%205.369%20-0.767%20L%205.369%202.938%20L%209.074%202.938%20C%209.282001%202.938%209.386001%203.042%209.386001%203.25%20C%209.386001%203.4190001%209.243%203.562%209.074%203.562%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9308D3AA5B63656D688EAB82DBF8B4B8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.5870001%208.528%20C%202.5870001%208.398%202.73%208.333%203.003%208.333%20C%203.523%208.333%203.783%208.281%203.783%208.1640005%20C%203.783%208.125%203.757%208.034%203.7180002%207.8650002%20L%202.028%201.066%20C%201.963%200.78000003%201.8330001%200.611%201.638%200.546%20C%201.547%200.52%201.3130001%200.507%200.91%200.507%20C%200.624%200.507%200.49400002%200.481%200.49400002%200.208%20C%200.49400002%200.065%200.637%200%200.91%200%20L%207.579%200%20C%207.8910003%200%207.9170003%200.026%208.021%200.24700001%20L%208.541%201.417%20C%208.892%202.223%209.139%202.821%209.282001%203.224%20C%209.2560005%203.341%209.217%203.4190001%209.074%203.4190001%20C%208.983%203.4190001%208.905%203.354%208.853001%203.237%20C%208.528%202.47%208.216001%201.885%207.9040003%201.469%20C%207.3840003%200.767%206.617%200.507%205.395%200.507%20L%203.51%200.507%20C%203.38%200.507%203.289%200.507%203.237%200.52%20C%203.1590002%200.52%203.1200001%200.546%203.1200001%200.58500004%20C%203.1200001%200.611%203.1460001%200.702%203.1850002%200.871%20L%204.043%204.342%20L%205.278%204.342%20C%205.889%204.342%206.214%204.264%206.2790003%204.0950003%20C%206.3050003%204.03%206.3180003%203.9390001%206.3180003%203.809%20C%206.3180003%203.64%206.2920003%203.4320002%206.227%203.1850002%20C%206.201%203.1200001%206.188%203.068%206.188%203.029%20C%206.188%202.8990002%206.2660003%202.834%206.409%202.834%20C%206.526%202.834%206.604%202.938%206.656%203.1330001%20L%207.3840003%206.149%20C%207.3840003%206.2790003%207.3190002%206.3440003%207.176%206.3440003%20C%207.072%206.3440003%206.994%206.2530003%206.955%206.071%20C%206.8250003%205.564%206.656%205.2390003%206.435%205.083%20C%206.214%204.927%205.85%204.849%205.317%204.849%20L%204.173%204.849%20L%204.927%207.8780003%20C%205.031%208.32%205.031%208.333%205.577%208.333%20L%207.3840003%208.333%20C%208.047%208.333%208.502%208.268001%208.749001%208.1380005%20C%209.113%207.9430003%209.295%207.553%209.295%206.968%20C%209.295%206.747%209.282001%206.513%209.243%206.2920003%20C%209.243%206.2660003%209.243%206.227%209.2300005%206.175%20L%209.2300005%206.058%20C%209.2300005%205.915%209.295%205.85%209.425%205.85%20C%209.555%205.85%209.633%205.967%209.659%206.214%20L%209.919001%208.437%20C%209.958%208.801001%209.867001%208.84%209.516%208.84%20L%203.029%208.84%20C%202.73%208.84%202.5870001%208.827001%202.5870001%208.528%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4D62189ABBC2948BAB13C269F5CB8E70%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.014%20-3.1850002%20C%201.794%20-2.5870001%202.444%20-1.7030001%202.977%20-0.52%20C%203.484%200.611%203.744%201.677%203.744%202.704%20L%203.744%203.796%20C%203.744%204.823%203.484%205.889%202.977%207.02%20C%202.444%208.203%201.794%209.087%201.014%209.685%20C%200.975%209.711%200.936%209.724%200.92300004%209.724%20C%200.806%209.724%200.741%209.659%200.741%209.542%20C%200.741%209.49%200.767%209.438%200.806%209.399%20C%201.482%208.879%202.028%208.021%202.431%206.8380003%20C%202.782%205.8110003%202.964%204.797%202.964%203.796%20L%202.964%202.704%20C%202.964%201.7030001%202.782%200.689%202.431%20-0.338%20C%202.028%20-1.521%201.482%20-2.379%200.806%20-2.8990002%20C%200.767%20-2.951%200.741%20-3.003%200.741%20-3.042%20C%200.741%20-3.1590002%200.806%20-3.224%200.92300004%20-3.224%20C%200.936%20-3.224%200.975%20-3.211%201.014%20-3.1850002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 6.463888888888889em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; time.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;reference-counting-with-extra-steps&quot;&gt;Reference counting with extra steps&lt;&#x2F;h3&gt;
&lt;p&gt;Our single-threaded &lt;code&gt;Gc&lt;&#x2F;code&gt; will behave much like an &lt;code&gt;Rc&lt;&#x2F;code&gt;, but with some
minor details changed.&lt;&#x2F;p&gt;
&lt;p&gt;First, we define a &lt;code&gt;Gc&lt;&#x2F;code&gt; and the allocation it points to, a &lt;code&gt;GcBox&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;Gc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-invalid z-illegal z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;Sized&amp;gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;ptr&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;NonNull&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;GcBox&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;repr&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;C&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;GcBox&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-invalid z-illegal z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;Sized&amp;gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;ref_count&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Cell&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;value&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; T
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We can then hook into the &lt;code&gt;Drop&lt;&#x2F;code&gt; behavior for our &lt;code&gt;Gc&lt;&#x2F;code&gt; to make it all
work.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-impl z-rust&quot;&gt;impl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-invalid z-illegal z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;Sized&lt;&#x2F;span&gt;&amp;gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;Drop&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;Gc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;drop&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; box_ref &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;unsafe&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-language z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;ptr&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;as_ref&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;match&lt;&#x2F;span&gt; box_ref&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;ref_count&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;get&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            n &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                box_ref&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;ref_count&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;set&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;n &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; n &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;==&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-rust&quot;&gt;||&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-rust&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;is_accessible&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;box_ref&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                    box_ref&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;ref_count&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;set&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                    &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;unsafe&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                        &lt;span class=&quot;z-support z-function z-rust&quot;&gt;drop_in_place&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-macro z-rust&quot;&gt;addr_of_mut!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;ptr&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;as_mut&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;value&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                        &lt;span class=&quot;z-support z-function z-rust&quot;&gt;dealloc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;ptr&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;as_ptr&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;cast&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Layout&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;for_value&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;ptr&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;as_ref&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I, being very clever, decided to use a sentinel value of 0 for the
reference count when an allocation is being cleaned up (to prevent
spurious double-frees).&lt;&#x2F;p&gt;
&lt;p&gt;However, this code has a problem - how the hell are we supposed to
implement &lt;code&gt;is_accessible&lt;&#x2F;code&gt;?&lt;&#x2F;p&gt;
&lt;h3 id=&quot;trait-hackery&quot;&gt;Trait hackery&lt;&#x2F;h3&gt;
&lt;p&gt;Our pseudocode for &lt;code&gt;is_accessible&lt;&#x2F;code&gt; required us to be able to access the
set of edges going out from a node. Doing so is kind of hard. If we were
writing this in C, we would scan the allocation on the heap, looking for
data that looked like they could be pointers into other allocations. In
Rust, though, we can be a lot more precise by adding a small constraint
to every garbage-collected type.&lt;&#x2F;p&gt;
&lt;p&gt;If the garbage collector wasn’t enough, we’re bringing the visitor
pattern over from Java. We force every garbage-collected value to
implement the &lt;code&gt;Collectable&lt;&#x2F;code&gt; trait, which will delegate some &lt;code&gt;Visitor&lt;&#x2F;code&gt; to
each of its garbage-collected fields.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;Gc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Collectable &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-invalid z-illegal z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;Sized&amp;gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;   &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; same as before ...
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;Collectable&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;accept&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;V&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Visitor&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;self&lt;&#x2F;span&gt;, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;visitor&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; V&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;Visitor&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;visit_gc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Collectable &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-invalid z-illegal z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Sized&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-language z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; gc&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Gc&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For example, an array might implement it by delegating to &lt;code&gt;accept&lt;&#x2F;code&gt; on
each of its elements.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-impl z-rust&quot;&gt;impl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Collectable&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt; Collectable &lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;for&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt; [&lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;T&lt;&#x2F;span&gt;] &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;accept&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;V&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Visitor&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;self&lt;&#x2F;span&gt;, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;visitor&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; V&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-variable z-language z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;for_each&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;elem&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;elem&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;accept&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;visitor&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We can now write code that finds the outgoing edges from each allocation
by simply applying a visitor to the allocation. I ended up writing two
visitors - one for the &lt;code&gt;dfs&lt;&#x2F;code&gt; step and one for the &lt;code&gt;mark&lt;&#x2F;code&gt; step.&lt;&#x2F;p&gt;
&lt;p&gt;I would have liked to make &lt;code&gt;Collectable&lt;&#x2F;code&gt; object-safe, but that would
also require &lt;code&gt;Visitor&lt;&#x2F;code&gt; to be object safe. That, in turn, would cause
every garbage collector to be coercible to &lt;code&gt;Gc&amp;lt;dyn Collectable&amp;gt;&lt;&#x2F;code&gt;, which
would only be possible on nightly, making it impossible to write a
stable crate.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;bulk-dropping&quot;&gt;Bulk dropping&lt;&#x2F;h3&gt;
&lt;p&gt;A cursory analysis of the implementation of &lt;code&gt;Drop&lt;&#x2F;code&gt; above shows that the
call to &lt;code&gt;is_accessible&lt;&#x2F;code&gt; runs in linear time with respect to the total
number of &lt;code&gt;Gc&lt;&#x2F;code&gt;s existing. You would be excused for thinking that &lt;code&gt;drop&lt;&#x2F;code&gt;,
as written, runs in linear time. However, the call to &lt;code&gt;drop_in_place&lt;&#x2F;code&gt;
could also result in another &lt;code&gt;Gc&lt;&#x2F;code&gt; being dropped, yielding a
quadratic-time cleanup. This is unacceptable, especially since our first
call to &lt;code&gt;is_accessible&lt;&#x2F;code&gt; actually did all the work of determining whether
the allocations are reachable from the original one - if the original
allocation being freed was inaccessible, any allocation referred to by
it should also be inaccessible.&lt;&#x2F;p&gt;
&lt;p&gt;We can save our time on marking by a pretty simple method: we’ll do one
more pass through the reference graph, recording a pointer to each
allocation to be destroyed and its implementation of &lt;code&gt;drop&lt;&#x2F;code&gt;. Then, once
we’ve found every inaccessible allocation, we’ll drop them all in one
quick go.&lt;&#x2F;p&gt;
&lt;p&gt;There’s one final problem, though: each &lt;code&gt;Gc&lt;&#x2F;code&gt; owned by a dropped value
could itself try to manipulate the reference counts of its pointees,
resulting in undefined behavior, or worse, slow code. However, all
problems in computer science can be solved by adding more state or more
indirection. We opt to solve it with extra state this time, creating a
thread-local value called &lt;code&gt;COLLECTING&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;When we do a bulk-drop, we set &lt;code&gt;COLLECTING&lt;&#x2F;code&gt; to &lt;code&gt;true&lt;&#x2F;code&gt;. Then, when we
call &lt;code&gt;drop&lt;&#x2F;code&gt; on a &lt;code&gt;Gc&lt;&#x2F;code&gt;, it checks the state of &lt;code&gt;COLLECTING&lt;&#x2F;code&gt;. If
&lt;code&gt;COLLECTING&lt;&#x2F;code&gt; is true, the &lt;code&gt;Gc&lt;&#x2F;code&gt; does nothing when dropped (not even
affecting its reference count). To handle outbound edges to
still-accessible allocations, we add one more traversal before the final
cleanup to handle outbound edges.&lt;&#x2F;p&gt;
&lt;p&gt;Let’s take a look at what the code for that roughly looks like now.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-support z-macro z-rust&quot;&gt;thread_local!&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;static&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;COLLECTING&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Cell&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;bool&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Cell&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-rust&quot;&gt;false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-impl z-rust&quot;&gt;impl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Collectable &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-invalid z-illegal z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;Sized&lt;&#x2F;span&gt;&amp;gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;Drop&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;Gc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;drop&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;COLLECTING&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;with&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Cell&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;get&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;return&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; box_ref &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;unsafe&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-language z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;ptr&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;as_ref&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;match&lt;&#x2F;span&gt; box_ref&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;ref_count&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;get&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                box_ref&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;ref_count&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;set&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;unsafe&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                    &lt;span class=&quot;z-support z-function z-rust&quot;&gt;drop_in_place&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-macro z-rust&quot;&gt;addr_of_mut!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;ptr&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;as_mut&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;value&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                    &lt;span class=&quot;z-support z-function z-rust&quot;&gt;dealloc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;ptr&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;as_ptr&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;cast&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Layout&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;for_value&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;ptr&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;as_ref&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            n &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                box_ref&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;ref_count&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;set&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;n &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;unsafe&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;ptr&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;collect&lt;&#x2F;code&gt; is the function we’ll write to check if the allocation is
accessible and perform a bulk cleanup if needed. There’s one more
problem before we can implement &lt;code&gt;collect&lt;&#x2F;code&gt;, though: our psuedocode
required us to be able to store each allocation as a key in &lt;code&gt;counts&lt;&#x2F;code&gt; and
also to access the allocation’s neighbors. This means we have to use a
little bit of type erasure to achieve our ends. I won’t go into too much
detail, but we need to be able to do two things:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Store pointers to allocations as keys in a hash-map.&lt;&#x2F;li&gt;
&lt;li&gt;Reconstruct a stored pointer using type information to make it
possible to do work.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Due to the limitations of Rust, these are actually mutually exclusive.
Because it’s undefined behavior (due to provenance issues) to compare
the raw data in pointers, we can’t erase a pointer and then use it as a
key in a hash-map. However, we can’t just get a pointer to the first
byte of the allocation, because our allocation could be &lt;code&gt;?Sized&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;As a result, my implementation actually has two different kinds of
erased pointers: a thin pointer which can be used for comparisons and a
fat pointer which can be used to reconstruct a pointer to any type.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;AllocationId&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;NonNull&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Cell&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; used as a key in hash-maps
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;ErasedPtr&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;; 2]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;              &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; used as a reconstructible pointer to the allocation
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then, all the functions which need to know the type information of the
allocation (such as &lt;code&gt;dfs&lt;&#x2F;code&gt; and &lt;code&gt;mark&lt;&#x2F;code&gt;) can be stored opaquely as function
pointers, and when called, they can “rehydrate” the &lt;code&gt;ErasedPtr&lt;&#x2F;code&gt; passed
in with type information.&lt;&#x2F;p&gt;
&lt;p&gt;Below, I’ve included an example of how it can be used to implement
&lt;code&gt;dfs&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;unsafe&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;dfs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Collectable &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-invalid z-illegal z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Sized&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    ptr&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; ErasedPtr&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    counts&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;HashMap&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;AllocationId, &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;DfsVisitor&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-lifetime z-rust&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;       &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;counts&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-lifetime z-rust&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;HashMap&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;AllocationId, &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-impl z-rust&quot;&gt;impl&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;Visitor &lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;for&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;DfsVisitor&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&amp;#39;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;_&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;visit_gc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;U&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;self&lt;&#x2F;span&gt;, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;gc&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Gc&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;U&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; id &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;AllocationId&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;gc&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;ptr&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; counts&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;insert&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;id&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;unsafe&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; gc&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;ptr&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;as_ref&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;ref_count&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;get&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;gc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;accept&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;counts&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;get_mut&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;id&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;-=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; pretend that `specify` converts the pointer back into NonNull&amp;lt;T&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; specified &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; ptr&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;specify&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    specified&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;as_ref&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;accept&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; DfsVisitor &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; counts &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I won’t include the implementation of &lt;code&gt;collect&lt;&#x2F;code&gt; here because it’s
lengthy and not even the final revision of the cleanup algorithm, but
you can trust me that it works. After much gnashing of teeth and tearing
of hair, this is finally enough to achieve bulk dropping, making calling
&lt;code&gt;drop()&lt;&#x2F;code&gt; on a &lt;code&gt;Gc&lt;&#x2F;code&gt; a linear-time operation.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;amortizing&quot;&gt;Amortizing&lt;&#x2F;h3&gt;
&lt;p&gt;What’s that, you say? You need your reference operations to work in
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2026.598000000000003%2021.878999999999998%22%20width%3D%2226.598000000000003pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD64B3975C9A5026604F20A029CCF2ADF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.984%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g71010E02B37BE1C0875AD8D94171F929%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.041%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g946CC60F6553DE6CBD049CD3C05E1499%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2821.541000000000004%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4D62189ABBC2948BAB13C269F5CB8E70%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD64B3975C9A5026604F20A029CCF2ADF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.126%203.4190001%20C%209.451%204.16%209.62%204.901%209.62%205.655%20C%209.62%206.669%209.321%207.501%208.71%208.1640005%20C%208.099%208.827001%207.293%209.165%206.2920003%209.165%20C%205.603%209.165%204.914%208.996%204.225%208.658%20C%202.821%207.9690003%201.794%206.8770003%201.131%205.395%20C%200.806%204.6670003%200.637%203.9390001%200.637%203.198%20C%200.637%202.171%200.936%201.339%201.547%200.689%20C%202.158%200.039%202.964%20-0.286%203.9780002%20-0.286%20C%204.6540003%20-0.286%205.33%20-0.117%206.019%200.208%20C%207.4360003%200.897%208.463%201.9760001%209.126%203.4190001%20Z%20M%208.372%206.162%20C%208.372%204.433%207.592%202.704%206.76%201.677%20C%206.188%200.962%205.2000003%200.156%204.056%200.156%20C%202.665%200.156%201.937%201.365%201.937%202.834%20C%201.937%203.289%202.028%203.9%202.197%204.6410003%20C%202.548%206.175%203.4320002%207.527%204.589%208.229%20C%205.1480002%208.567%205.6940002%208.736%206.214%208.736%20C%207.618%208.736%208.372%207.618%208.372%206.162%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g71010E02B37BE1C0875AD8D94171F929%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.1340003%20-3.224%20C%204.251%20-3.224%204.316%20-3.1590002%204.316%20-3.042%20C%204.316%20-3.003%204.29%20-2.951%204.251%20-2.8990002%20C%203.575%20-2.379%203.029%20-1.521%202.6260002%20-0.338%20C%202.275%200.689%202.093%201.7030001%202.093%202.704%20L%202.093%203.796%20C%202.093%204.797%202.275%205.8110003%202.6260002%206.8380003%20C%203.029%208.021%203.575%208.879%204.251%209.399%20C%204.29%209.438%204.316%209.49%204.316%209.542%20C%204.316%209.659%204.251%209.724%204.1340003%209.724%20C%204.1210003%209.724%204.0820003%209.711%204.043%209.685%20C%203.263%209.087%202.6130002%208.203%202.08%207.02%20C%201.5730001%205.889%201.3130001%204.823%201.3130001%203.796%20L%201.3130001%202.704%20C%201.3130001%201.677%201.5730001%200.611%202.08%20-0.52%20C%202.6130002%20-1.7030001%203.263%20-2.5870001%204.043%20-3.1850002%20C%204.0820003%20-3.211%204.1210003%20-3.224%204.1340003%20-3.224%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g946CC60F6553DE6CBD049CD3C05E1499%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.497%208.658%20C%202.964%208.112%202.184%207.839%201.1570001%207.839%20L%201.1570001%207.3320003%20C%201.8330001%207.3320003%202.392%207.4360003%202.821%207.644%20L%202.821%201.066%20C%202.821%200.832%202.769%200.676%202.652%200.611%20C%202.535%200.546%202.21%200.507%201.69%200.507%20L%201.235%200.507%20L%201.235%200%20C%201.5600001%200.026%202.262%200.039%203.341%200.039%20C%204.42%200.039%205.122%200.026%205.447%200%20L%205.447%200.507%20L%204.992%200.507%20C%204.459%200.507%204.1340003%200.546%204.03%200.611%20C%203.926%200.676%203.861%200.832%203.861%201.066%20L%203.861%208.268001%20C%203.861%208.58%203.835%208.658%203.497%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4D62189ABBC2948BAB13C269F5CB8E70%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.014%20-3.1850002%20C%201.794%20-2.5870001%202.444%20-1.7030001%202.977%20-0.52%20C%203.484%200.611%203.744%201.677%203.744%202.704%20L%203.744%203.796%20C%203.744%204.823%203.484%205.889%202.977%207.02%20C%202.444%208.203%201.794%209.087%201.014%209.685%20C%200.975%209.711%200.936%209.724%200.92300004%209.724%20C%200.806%209.724%200.741%209.659%200.741%209.542%20C%200.741%209.49%200.767%209.438%200.806%209.399%20C%201.482%208.879%202.028%208.021%202.431%206.8380003%20C%202.782%205.8110003%202.964%204.797%202.964%203.796%20L%202.964%202.704%20C%202.964%201.7030001%202.782%200.689%202.431%20-0.338%20C%202.028%20-1.521%201.482%20-2.379%200.806%20-2.8990002%20C%200.767%20-2.951%200.741%20-3.003%200.741%20-3.042%20C%200.741%20-3.1590002%200.806%20-3.224%200.92300004%20-3.224%20C%200.936%20-3.224%200.975%20-3.211%201.014%20-3.1850002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.418em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; time? Why are programmers these days so picky?&lt;&#x2F;p&gt;
&lt;p&gt;Luckily, it isn’t too hard to make our garbage-collection efforts
terminate in average-case &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2026.598000000000003%2021.878999999999998%22%20width%3D%2226.598000000000003pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD64B3975C9A5026604F20A029CCF2ADF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.984%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g71010E02B37BE1C0875AD8D94171F929%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.041%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g946CC60F6553DE6CBD049CD3C05E1499%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2821.541000000000004%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4D62189ABBC2948BAB13C269F5CB8E70%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD64B3975C9A5026604F20A029CCF2ADF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.126%203.4190001%20C%209.451%204.16%209.62%204.901%209.62%205.655%20C%209.62%206.669%209.321%207.501%208.71%208.1640005%20C%208.099%208.827001%207.293%209.165%206.2920003%209.165%20C%205.603%209.165%204.914%208.996%204.225%208.658%20C%202.821%207.9690003%201.794%206.8770003%201.131%205.395%20C%200.806%204.6670003%200.637%203.9390001%200.637%203.198%20C%200.637%202.171%200.936%201.339%201.547%200.689%20C%202.158%200.039%202.964%20-0.286%203.9780002%20-0.286%20C%204.6540003%20-0.286%205.33%20-0.117%206.019%200.208%20C%207.4360003%200.897%208.463%201.9760001%209.126%203.4190001%20Z%20M%208.372%206.162%20C%208.372%204.433%207.592%202.704%206.76%201.677%20C%206.188%200.962%205.2000003%200.156%204.056%200.156%20C%202.665%200.156%201.937%201.365%201.937%202.834%20C%201.937%203.289%202.028%203.9%202.197%204.6410003%20C%202.548%206.175%203.4320002%207.527%204.589%208.229%20C%205.1480002%208.567%205.6940002%208.736%206.214%208.736%20C%207.618%208.736%208.372%207.618%208.372%206.162%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g71010E02B37BE1C0875AD8D94171F929%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.1340003%20-3.224%20C%204.251%20-3.224%204.316%20-3.1590002%204.316%20-3.042%20C%204.316%20-3.003%204.29%20-2.951%204.251%20-2.8990002%20C%203.575%20-2.379%203.029%20-1.521%202.6260002%20-0.338%20C%202.275%200.689%202.093%201.7030001%202.093%202.704%20L%202.093%203.796%20C%202.093%204.797%202.275%205.8110003%202.6260002%206.8380003%20C%203.029%208.021%203.575%208.879%204.251%209.399%20C%204.29%209.438%204.316%209.49%204.316%209.542%20C%204.316%209.659%204.251%209.724%204.1340003%209.724%20C%204.1210003%209.724%204.0820003%209.711%204.043%209.685%20C%203.263%209.087%202.6130002%208.203%202.08%207.02%20C%201.5730001%205.889%201.3130001%204.823%201.3130001%203.796%20L%201.3130001%202.704%20C%201.3130001%201.677%201.5730001%200.611%202.08%20-0.52%20C%202.6130002%20-1.7030001%203.263%20-2.5870001%204.043%20-3.1850002%20C%204.0820003%20-3.211%204.1210003%20-3.224%204.1340003%20-3.224%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g946CC60F6553DE6CBD049CD3C05E1499%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.497%208.658%20C%202.964%208.112%202.184%207.839%201.1570001%207.839%20L%201.1570001%207.3320003%20C%201.8330001%207.3320003%202.392%207.4360003%202.821%207.644%20L%202.821%201.066%20C%202.821%200.832%202.769%200.676%202.652%200.611%20C%202.535%200.546%202.21%200.507%201.69%200.507%20L%201.235%200.507%20L%201.235%200%20C%201.5600001%200.026%202.262%200.039%203.341%200.039%20C%204.42%200.039%205.122%200.026%205.447%200%20L%205.447%200.507%20L%204.992%200.507%20C%204.459%200.507%204.1340003%200.546%204.03%200.611%20C%203.926%200.676%203.861%200.832%203.861%201.066%20L%203.861%208.268001%20C%203.861%208.58%203.835%208.658%203.497%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4D62189ABBC2948BAB13C269F5CB8E70%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.014%20-3.1850002%20C%201.794%20-2.5870001%202.444%20-1.7030001%202.977%20-0.52%20C%203.484%200.611%203.744%201.677%203.744%202.704%20L%203.744%203.796%20C%203.744%204.823%203.484%205.889%202.977%207.02%20C%202.444%208.203%201.794%209.087%201.014%209.685%20C%200.975%209.711%200.936%209.724%200.92300004%209.724%20C%200.806%209.724%200.741%209.659%200.741%209.542%20C%200.741%209.49%200.767%209.438%200.806%209.399%20C%201.482%208.879%202.028%208.021%202.431%206.8380003%20C%202.782%205.8110003%202.964%204.797%202.964%203.796%20L%202.964%202.704%20C%202.964%201.7030001%202.782%200.689%202.431%20-0.338%20C%202.028%20-1.521%201.482%20-2.379%200.806%20-2.8990002%20C%200.767%20-2.951%200.741%20-3.003%200.741%20-3.042%20C%200.741%20-3.1590002%200.806%20-3.224%200.92300004%20-3.224%20C%200.936%20-3.224%200.975%20-3.211%201.014%20-3.1850002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.418em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; time. Instead of calling &lt;code&gt;collect&lt;&#x2F;code&gt;
directly, we’ll just punt the allocation, which may be inaccessible,
into a set of “dirty” allocations. In my code, I call that set a
dumpster. Then, once every &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2017.523999999999997%2021.878999999999998%22%20width%3D%2217.523999999999997pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g17AF90F25DACF254827E59F8A3A9E6D4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%283.6140000000000003%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9308D3AA5B63656D688EAB82DBF8B4B8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2813.91%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g17AF90F25DACF254827E59F8A3A9E6D4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g17AF90F25DACF254827E59F8A3A9E6D4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.807%20-3.25%20C%201.9760001%20-3.25%202.0670002%20-3.1460001%202.0670002%20-2.938%20L%202.0670002%209.438%20C%202.0670002%209.646%201.9760001%209.75%201.807%209.75%20C%201.638%209.75%201.547%209.646%201.547%209.438%20L%201.547%20-2.938%20C%201.547%20-3.1460001%201.638%20-3.25%201.807%20-3.25%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9308D3AA5B63656D688EAB82DBF8B4B8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.5870001%208.528%20C%202.5870001%208.398%202.73%208.333%203.003%208.333%20C%203.523%208.333%203.783%208.281%203.783%208.1640005%20C%203.783%208.125%203.757%208.034%203.7180002%207.8650002%20L%202.028%201.066%20C%201.963%200.78000003%201.8330001%200.611%201.638%200.546%20C%201.547%200.52%201.3130001%200.507%200.91%200.507%20C%200.624%200.507%200.49400002%200.481%200.49400002%200.208%20C%200.49400002%200.065%200.637%200%200.91%200%20L%207.579%200%20C%207.8910003%200%207.9170003%200.026%208.021%200.24700001%20L%208.541%201.417%20C%208.892%202.223%209.139%202.821%209.282001%203.224%20C%209.2560005%203.341%209.217%203.4190001%209.074%203.4190001%20C%208.983%203.4190001%208.905%203.354%208.853001%203.237%20C%208.528%202.47%208.216001%201.885%207.9040003%201.469%20C%207.3840003%200.767%206.617%200.507%205.395%200.507%20L%203.51%200.507%20C%203.38%200.507%203.289%200.507%203.237%200.52%20C%203.1590002%200.52%203.1200001%200.546%203.1200001%200.58500004%20C%203.1200001%200.611%203.1460001%200.702%203.1850002%200.871%20L%204.043%204.342%20L%205.278%204.342%20C%205.889%204.342%206.214%204.264%206.2790003%204.0950003%20C%206.3050003%204.03%206.3180003%203.9390001%206.3180003%203.809%20C%206.3180003%203.64%206.2920003%203.4320002%206.227%203.1850002%20C%206.201%203.1200001%206.188%203.068%206.188%203.029%20C%206.188%202.8990002%206.2660003%202.834%206.409%202.834%20C%206.526%202.834%206.604%202.938%206.656%203.1330001%20L%207.3840003%206.149%20C%207.3840003%206.2790003%207.3190002%206.3440003%207.176%206.3440003%20C%207.072%206.3440003%206.994%206.2530003%206.955%206.071%20C%206.8250003%205.564%206.656%205.2390003%206.435%205.083%20C%206.214%204.927%205.85%204.849%205.317%204.849%20L%204.173%204.849%20L%204.927%207.8780003%20C%205.031%208.32%205.031%208.333%205.577%208.333%20L%207.3840003%208.333%20C%208.047%208.333%208.502%208.268001%208.749001%208.1380005%20C%209.113%207.9430003%209.295%207.553%209.295%206.968%20C%209.295%206.747%209.282001%206.513%209.243%206.2920003%20C%209.243%206.2660003%209.243%206.227%209.2300005%206.175%20L%209.2300005%206.058%20C%209.2300005%205.915%209.295%205.85%209.425%205.85%20C%209.555%205.85%209.633%205.967%209.659%206.214%20L%209.919001%208.437%20C%209.958%208.801001%209.867001%208.84%209.516%208.84%20L%203.029%208.84%20C%202.73%208.84%202.5870001%208.827001%202.5870001%208.528%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.593090909090909em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; times an allocation is dropped, we’ll
go through the whole dumpster and collect them all in &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2037.62200000000001%2021.878999999999998%22%20width%3D%2237.62200000000001pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD64B3975C9A5026604F20A029CCF2ADF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.984%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g71010E02B37BE1C0875AD8D94171F929%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.041%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g17AF90F25DACF254827E59F8A3A9E6D4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2818.655000000000005%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9308D3AA5B63656D688EAB82DBF8B4B8%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2828.951%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g17AF90F25DACF254827E59F8A3A9E6D4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2832.565%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4D62189ABBC2948BAB13C269F5CB8E70%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD64B3975C9A5026604F20A029CCF2ADF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.126%203.4190001%20C%209.451%204.16%209.62%204.901%209.62%205.655%20C%209.62%206.669%209.321%207.501%208.71%208.1640005%20C%208.099%208.827001%207.293%209.165%206.2920003%209.165%20C%205.603%209.165%204.914%208.996%204.225%208.658%20C%202.821%207.9690003%201.794%206.8770003%201.131%205.395%20C%200.806%204.6670003%200.637%203.9390001%200.637%203.198%20C%200.637%202.171%200.936%201.339%201.547%200.689%20C%202.158%200.039%202.964%20-0.286%203.9780002%20-0.286%20C%204.6540003%20-0.286%205.33%20-0.117%206.019%200.208%20C%207.4360003%200.897%208.463%201.9760001%209.126%203.4190001%20Z%20M%208.372%206.162%20C%208.372%204.433%207.592%202.704%206.76%201.677%20C%206.188%200.962%205.2000003%200.156%204.056%200.156%20C%202.665%200.156%201.937%201.365%201.937%202.834%20C%201.937%203.289%202.028%203.9%202.197%204.6410003%20C%202.548%206.175%203.4320002%207.527%204.589%208.229%20C%205.1480002%208.567%205.6940002%208.736%206.214%208.736%20C%207.618%208.736%208.372%207.618%208.372%206.162%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g71010E02B37BE1C0875AD8D94171F929%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.1340003%20-3.224%20C%204.251%20-3.224%204.316%20-3.1590002%204.316%20-3.042%20C%204.316%20-3.003%204.29%20-2.951%204.251%20-2.8990002%20C%203.575%20-2.379%203.029%20-1.521%202.6260002%20-0.338%20C%202.275%200.689%202.093%201.7030001%202.093%202.704%20L%202.093%203.796%20C%202.093%204.797%202.275%205.8110003%202.6260002%206.8380003%20C%203.029%208.021%203.575%208.879%204.251%209.399%20C%204.29%209.438%204.316%209.49%204.316%209.542%20C%204.316%209.659%204.251%209.724%204.1340003%209.724%20C%204.1210003%209.724%204.0820003%209.711%204.043%209.685%20C%203.263%209.087%202.6130002%208.203%202.08%207.02%20C%201.5730001%205.889%201.3130001%204.823%201.3130001%203.796%20L%201.3130001%202.704%20C%201.3130001%201.677%201.5730001%200.611%202.08%20-0.52%20C%202.6130002%20-1.7030001%203.263%20-2.5870001%204.043%20-3.1850002%20C%204.0820003%20-3.211%204.1210003%20-3.224%204.1340003%20-3.224%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g17AF90F25DACF254827E59F8A3A9E6D4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.807%20-3.25%20C%201.9760001%20-3.25%202.0670002%20-3.1460001%202.0670002%20-2.938%20L%202.0670002%209.438%20C%202.0670002%209.646%201.9760001%209.75%201.807%209.75%20C%201.638%209.75%201.547%209.646%201.547%209.438%20L%201.547%20-2.938%20C%201.547%20-3.1460001%201.638%20-3.25%201.807%20-3.25%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9308D3AA5B63656D688EAB82DBF8B4B8%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.5870001%208.528%20C%202.5870001%208.398%202.73%208.333%203.003%208.333%20C%203.523%208.333%203.783%208.281%203.783%208.1640005%20C%203.783%208.125%203.757%208.034%203.7180002%207.8650002%20L%202.028%201.066%20C%201.963%200.78000003%201.8330001%200.611%201.638%200.546%20C%201.547%200.52%201.3130001%200.507%200.91%200.507%20C%200.624%200.507%200.49400002%200.481%200.49400002%200.208%20C%200.49400002%200.065%200.637%200%200.91%200%20L%207.579%200%20C%207.8910003%200%207.9170003%200.026%208.021%200.24700001%20L%208.541%201.417%20C%208.892%202.223%209.139%202.821%209.282001%203.224%20C%209.2560005%203.341%209.217%203.4190001%209.074%203.4190001%20C%208.983%203.4190001%208.905%203.354%208.853001%203.237%20C%208.528%202.47%208.216001%201.885%207.9040003%201.469%20C%207.3840003%200.767%206.617%200.507%205.395%200.507%20L%203.51%200.507%20C%203.38%200.507%203.289%200.507%203.237%200.52%20C%203.1590002%200.52%203.1200001%200.546%203.1200001%200.58500004%20C%203.1200001%200.611%203.1460001%200.702%203.1850002%200.871%20L%204.043%204.342%20L%205.278%204.342%20C%205.889%204.342%206.214%204.264%206.2790003%204.0950003%20C%206.3050003%204.03%206.3180003%203.9390001%206.3180003%203.809%20C%206.3180003%203.64%206.2920003%203.4320002%206.227%203.1850002%20C%206.201%203.1200001%206.188%203.068%206.188%203.029%20C%206.188%202.8990002%206.2660003%202.834%206.409%202.834%20C%206.526%202.834%206.604%202.938%206.656%203.1330001%20L%207.3840003%206.149%20C%207.3840003%206.2790003%207.3190002%206.3440003%207.176%206.3440003%20C%207.072%206.3440003%206.994%206.2530003%206.955%206.071%20C%206.8250003%205.564%206.656%205.2390003%206.435%205.083%20C%206.214%204.927%205.85%204.849%205.317%204.849%20L%204.173%204.849%20L%204.927%207.8780003%20C%205.031%208.32%205.031%208.333%205.577%208.333%20L%207.3840003%208.333%20C%208.047%208.333%208.502%208.268001%208.749001%208.1380005%20C%209.113%207.9430003%209.295%207.553%209.295%206.968%20C%209.295%206.747%209.282001%206.513%209.243%206.2920003%20C%209.243%206.2660003%209.243%206.227%209.2300005%206.175%20L%209.2300005%206.058%20C%209.2300005%205.915%209.295%205.85%209.425%205.85%20C%209.555%205.85%209.633%205.967%209.659%206.214%20L%209.919001%208.437%20C%209.958%208.801001%209.867001%208.84%209.516%208.84%20L%203.029%208.84%20C%202.73%208.84%202.5870001%208.827001%202.5870001%208.528%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4D62189ABBC2948BAB13C269F5CB8E70%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.014%20-3.1850002%20C%201.794%20-2.5870001%202.444%20-1.7030001%202.977%20-0.52%20C%203.484%200.611%203.744%201.677%203.744%202.704%20L%203.744%203.796%20C%203.744%204.823%203.484%205.889%202.977%207.02%20C%202.444%208.203%201.794%209.087%201.014%209.685%20C%200.975%209.711%200.936%209.724%200.92300004%209.724%20C%200.806%209.724%200.741%209.659%200.741%209.542%20C%200.741%209.49%200.767%209.438%200.806%209.399%20C%201.482%208.879%202.028%208.021%202.431%206.8380003%20C%202.782%205.8110003%202.964%204.797%202.964%203.796%20L%202.964%202.704%20C%202.964%201.7030001%202.782%200.689%202.431%20-0.338%20C%202.028%20-1.521%201.482%20-2.379%200.806%20-2.8990002%20C%200.767%20-2.951%200.741%20-3.003%200.741%20-3.042%20C%200.741%20-3.1590002%200.806%20-3.224%200.92300004%20-3.224%20C%200.936%20-3.224%200.975%20-3.211%201.014%20-3.1850002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.4201818181818187em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; time.
Amortized across all allocations, that’s technically &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2026.598000000000003%2021.878999999999998%22%20width%3D%2226.598000000000003pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD64B3975C9A5026604F20A029CCF2ADF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.984%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g71010E02B37BE1C0875AD8D94171F929%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.041%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g946CC60F6553DE6CBD049CD3C05E1499%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2821.541000000000004%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4D62189ABBC2948BAB13C269F5CB8E70%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD64B3975C9A5026604F20A029CCF2ADF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.126%203.4190001%20C%209.451%204.16%209.62%204.901%209.62%205.655%20C%209.62%206.669%209.321%207.501%208.71%208.1640005%20C%208.099%208.827001%207.293%209.165%206.2920003%209.165%20C%205.603%209.165%204.914%208.996%204.225%208.658%20C%202.821%207.9690003%201.794%206.8770003%201.131%205.395%20C%200.806%204.6670003%200.637%203.9390001%200.637%203.198%20C%200.637%202.171%200.936%201.339%201.547%200.689%20C%202.158%200.039%202.964%20-0.286%203.9780002%20-0.286%20C%204.6540003%20-0.286%205.33%20-0.117%206.019%200.208%20C%207.4360003%200.897%208.463%201.9760001%209.126%203.4190001%20Z%20M%208.372%206.162%20C%208.372%204.433%207.592%202.704%206.76%201.677%20C%206.188%200.962%205.2000003%200.156%204.056%200.156%20C%202.665%200.156%201.937%201.365%201.937%202.834%20C%201.937%203.289%202.028%203.9%202.197%204.6410003%20C%202.548%206.175%203.4320002%207.527%204.589%208.229%20C%205.1480002%208.567%205.6940002%208.736%206.214%208.736%20C%207.618%208.736%208.372%207.618%208.372%206.162%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g71010E02B37BE1C0875AD8D94171F929%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.1340003%20-3.224%20C%204.251%20-3.224%204.316%20-3.1590002%204.316%20-3.042%20C%204.316%20-3.003%204.29%20-2.951%204.251%20-2.8990002%20C%203.575%20-2.379%203.029%20-1.521%202.6260002%20-0.338%20C%202.275%200.689%202.093%201.7030001%202.093%202.704%20L%202.093%203.796%20C%202.093%204.797%202.275%205.8110003%202.6260002%206.8380003%20C%203.029%208.021%203.575%208.879%204.251%209.399%20C%204.29%209.438%204.316%209.49%204.316%209.542%20C%204.316%209.659%204.251%209.724%204.1340003%209.724%20C%204.1210003%209.724%204.0820003%209.711%204.043%209.685%20C%203.263%209.087%202.6130002%208.203%202.08%207.02%20C%201.5730001%205.889%201.3130001%204.823%201.3130001%203.796%20L%201.3130001%202.704%20C%201.3130001%201.677%201.5730001%200.611%202.08%20-0.52%20C%202.6130002%20-1.7030001%203.263%20-2.5870001%204.043%20-3.1850002%20C%204.0820003%20-3.211%204.1210003%20-3.224%204.1340003%20-3.224%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g946CC60F6553DE6CBD049CD3C05E1499%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.497%208.658%20C%202.964%208.112%202.184%207.839%201.1570001%207.839%20L%201.1570001%207.3320003%20C%201.8330001%207.3320003%202.392%207.4360003%202.821%207.644%20L%202.821%201.066%20C%202.821%200.832%202.769%200.676%202.652%200.611%20C%202.535%200.546%202.21%200.507%201.69%200.507%20L%201.235%200.507%20L%201.235%200%20C%201.5600001%200.026%202.262%200.039%203.341%200.039%20C%204.42%200.039%205.122%200.026%205.447%200%20L%205.447%200.507%20L%204.992%200.507%20C%204.459%200.507%204.1340003%200.546%204.03%200.611%20C%203.926%200.676%203.861%200.832%203.861%201.066%20L%203.861%208.268001%20C%203.861%208.58%203.835%208.658%203.497%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4D62189ABBC2948BAB13C269F5CB8E70%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.014%20-3.1850002%20C%201.794%20-2.5870001%202.444%20-1.7030001%202.977%20-0.52%20C%203.484%200.611%203.744%201.677%203.744%202.704%20L%203.744%203.796%20C%203.744%204.823%203.484%205.889%202.977%207.02%20C%202.444%208.203%201.794%209.087%201.014%209.685%20C%200.975%209.711%200.936%209.724%200.92300004%209.724%20C%200.806%209.724%200.741%209.659%200.741%209.542%20C%200.741%209.49%200.767%209.438%200.806%209.399%20C%201.482%208.879%202.028%208.021%202.431%206.8380003%20C%202.782%205.8110003%202.964%204.797%202.964%203.796%20L%202.964%202.704%20C%202.964%201.7030001%202.782%200.689%202.431%20-0.338%20C%202.028%20-1.521%201.482%20-2.379%200.806%20-2.8990002%20C%200.767%20-2.951%200.741%20-3.003%200.741%20-3.042%20C%200.741%20-3.1590002%200.806%20-3.224%200.92300004%20-3.224%20C%200.936%20-3.224%200.975%20-3.211%201.014%20-3.1850002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.418em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, enabled by
the same accounting wizardry that makes array-backed lists useful and
that caused the 2008 financial crisis.&lt;&#x2F;p&gt;
&lt;p&gt;To save ourselves a little bit of work, whenever an allocation is
accessed (such as by dereferencing or cloning), we can yank the
allocation away from that same dirty set since it was just proven to be
accessible.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;are-we-concurrent-yet&quot;&gt;Are we concurrent yet?&lt;&#x2F;h2&gt;
&lt;p&gt;So far, the garbage collector I’ve been outlining to you has been a
single-threaded collector, which can only store thread-local
garbage-collected values. I’m told that all code worth writing ends up
being concurrent, so we have to do better than that. Lucky for us, this
algorithm can be made to operate concurrently with little effort,
assuming that only one thread collects at a time.&lt;&#x2F;p&gt;
&lt;p&gt;However, even if only one thread is collecting, we can still run into
some nasty concurrency issues. Let’s imagine that we have 2 allocations,
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; and &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%205.759%2021.878999999999998%22%20width%3D%225.759pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB2B0D162BF0EF17F805166E1C67260EF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.653%205.7850003%20C%203.1850002%205.7850003%202.717%205.564%202.262%205.122%20L%203.1590002%208.827001%20C%203.1330001%208.944%203.094%209.022%202.938%209.022%20C%202.509%209.022%201.5600001%208.905%201.391%208.892%20C%201.196%208.866%201.092%208.775001%201.092%208.58%20C%201.092%208.45%201.209%208.385%201.4560001%208.385%20C%201.7030001%208.385%202.0410001%208.398%202.0410001%208.216001%20C%202.0410001%208.1640005%201.9760001%207.9040003%201.8590001%207.4230003%20L%200.819%203.237%20C%200.676%202.691%200.611%202.249%200.611%201.924%20C%200.611%200.806%201.209%20-0.143%202.275%20-0.143%20C%203.1200001%20-0.143%203.861%200.286%204.511%201.1570001%20C%205.096%201.963%205.395%202.808%205.395%203.6790001%20C%205.395%204.81%204.732%205.7850003%203.653%205.7850003%20Z%20M%203.627%205.395%20C%204.1340003%205.395%204.381%205.005%204.381%204.238%20C%204.381%203.887%204.303%203.4190001%204.1470003%202.834%20C%203.861%201.7290001%203.484%200.975%203.029%200.572%20C%202.769%200.351%202.522%200.24700001%202.275%200.24700001%20C%201.742%200.24700001%201.482%200.663%201.482%201.495%20C%201.482%201.781%201.547%202.21%201.677%202.782%20L%201.963%203.9520001%20C%202.002%204.1470003%202.0670002%204.29%202.145%204.394%20C%202.652%205.057%203.1460001%205.395%203.627%205.395%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5235454545454545em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, plus the imaginary “root” allocation &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.032%2021.878999999999998%22%20width%3D%226.032pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5483636363636364em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, where &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; can
only be accessed from &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.032%2021.878999999999998%22%20width%3D%226.032pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5483636363636364em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; and &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%205.759%2021.878999999999998%22%20width%3D%225.759pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB2B0D162BF0EF17F805166E1C67260EF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.653%205.7850003%20C%203.1850002%205.7850003%202.717%205.564%202.262%205.122%20L%203.1590002%208.827001%20C%203.1330001%208.944%203.094%209.022%202.938%209.022%20C%202.509%209.022%201.5600001%208.905%201.391%208.892%20C%201.196%208.866%201.092%208.775001%201.092%208.58%20C%201.092%208.45%201.209%208.385%201.4560001%208.385%20C%201.7030001%208.385%202.0410001%208.398%202.0410001%208.216001%20C%202.0410001%208.1640005%201.9760001%207.9040003%201.8590001%207.4230003%20L%200.819%203.237%20C%200.676%202.691%200.611%202.249%200.611%201.924%20C%200.611%200.806%201.209%20-0.143%202.275%20-0.143%20C%203.1200001%20-0.143%203.861%200.286%204.511%201.1570001%20C%205.096%201.963%205.395%202.808%205.395%203.6790001%20C%205.395%204.81%204.732%205.7850003%203.653%205.7850003%20Z%20M%203.627%205.395%20C%204.1340003%205.395%204.381%205.005%204.381%204.238%20C%204.381%203.887%204.303%203.4190001%204.1470003%202.834%20C%203.861%201.7290001%203.484%200.975%203.029%200.572%20C%202.769%200.351%202.522%200.24700001%202.275%200.24700001%20C%201.742%200.24700001%201.482%200.663%201.482%201.495%20C%201.482%201.781%201.547%202.21%201.677%202.782%20L%201.963%203.9520001%20C%202.002%204.1470003%202.0670002%204.29%202.145%204.394%20C%202.652%205.057%203.1460001%205.395%203.627%205.395%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5235454545454545em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; can only be accessed from &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;dumpster&#x2F;chain2.dot.svg&quot; alt=&quot;image&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Now, consider performing a depth-first search starting from &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;. First,
we record that &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; has 1 unaccounted-for-reference in &lt;code&gt;counts&lt;&#x2F;code&gt;. Then, we
move on to looking at &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%205.759%2021.878999999999998%22%20width%3D%225.759pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB2B0D162BF0EF17F805166E1C67260EF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.653%205.7850003%20C%203.1850002%205.7850003%202.717%205.564%202.262%205.122%20L%203.1590002%208.827001%20C%203.1330001%208.944%203.094%209.022%202.938%209.022%20C%202.509%209.022%201.5600001%208.905%201.391%208.892%20C%201.196%208.866%201.092%208.775001%201.092%208.58%20C%201.092%208.45%201.209%208.385%201.4560001%208.385%20C%201.7030001%208.385%202.0410001%208.398%202.0410001%208.216001%20C%202.0410001%208.1640005%201.9760001%207.9040003%201.8590001%207.4230003%20L%200.819%203.237%20C%200.676%202.691%200.611%202.249%200.611%201.924%20C%200.611%200.806%201.209%20-0.143%202.275%20-0.143%20C%203.1200001%20-0.143%203.861%200.286%204.511%201.1570001%20C%205.096%201.963%205.395%202.808%205.395%203.6790001%20C%205.395%204.81%204.732%205.7850003%203.653%205.7850003%20Z%20M%203.627%205.395%20C%204.1340003%205.395%204.381%205.005%204.381%204.238%20C%204.381%203.887%204.303%203.4190001%204.1470003%202.834%20C%203.861%201.7290001%203.484%200.975%203.029%200.572%20C%202.769%200.351%202.522%200.24700001%202.275%200.24700001%20C%201.742%200.24700001%201.482%200.663%201.482%201.495%20C%201.482%201.781%201.547%202.21%201.677%202.782%20L%201.963%203.9520001%20C%202.002%204.1470003%202.0670002%204.29%202.145%204.394%20C%202.652%205.057%203.1460001%205.395%203.627%205.395%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5235454545454545em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; because it’s one of &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;’s children.&lt;&#x2F;p&gt;
&lt;p&gt;However, between when we record &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;’s reference count and examine &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%205.759%2021.878999999999998%22%20width%3D%225.759pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB2B0D162BF0EF17F805166E1C67260EF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.653%205.7850003%20C%203.1850002%205.7850003%202.717%205.564%202.262%205.122%20L%203.1590002%208.827001%20C%203.1330001%208.944%203.094%209.022%202.938%209.022%20C%202.509%209.022%201.5600001%208.905%201.391%208.892%20C%201.196%208.866%201.092%208.775001%201.092%208.58%20C%201.092%208.45%201.209%208.385%201.4560001%208.385%20C%201.7030001%208.385%202.0410001%208.398%202.0410001%208.216001%20C%202.0410001%208.1640005%201.9760001%207.9040003%201.8590001%207.4230003%20L%200.819%203.237%20C%200.676%202.691%200.611%202.249%200.611%201.924%20C%200.611%200.806%201.209%20-0.143%202.275%20-0.143%20C%203.1200001%20-0.143%203.861%200.286%204.511%201.1570001%20C%205.096%201.963%205.395%202.808%205.395%203.6790001%20C%205.395%204.81%204.732%205.7850003%203.653%205.7850003%20Z%20M%203.627%205.395%20C%204.1340003%205.395%204.381%205.005%204.381%204.238%20C%204.381%203.887%204.303%203.4190001%204.1470003%202.834%20C%203.861%201.7290001%203.484%200.975%203.029%200.572%20C%202.769%200.351%202.522%200.24700001%202.275%200.24700001%20C%201.742%200.24700001%201.482%200.663%201.482%201.495%20C%201.482%201.781%201.547%202.21%201.677%202.782%20L%201.963%203.9520001%20C%202.002%204.1470003%202.0670002%204.29%202.145%204.394%20C%202.652%205.057%203.1460001%205.395%203.627%205.395%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5235454545454545em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;,
another malicious thread mutates &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%205.759%2021.878999999999998%22%20width%3D%225.759pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB2B0D162BF0EF17F805166E1C67260EF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.653%205.7850003%20C%203.1850002%205.7850003%202.717%205.564%202.262%205.122%20L%203.1590002%208.827001%20C%203.1330001%208.944%203.094%209.022%202.938%209.022%20C%202.509%209.022%201.5600001%208.905%201.391%208.892%20C%201.196%208.866%201.092%208.775001%201.092%208.58%20C%201.092%208.45%201.209%208.385%201.4560001%208.385%20C%201.7030001%208.385%202.0410001%208.398%202.0410001%208.216001%20C%202.0410001%208.1640005%201.9760001%207.9040003%201.8590001%207.4230003%20L%200.819%203.237%20C%200.676%202.691%200.611%202.249%200.611%201.924%20C%200.611%200.806%201.209%20-0.143%202.275%20-0.143%20C%203.1200001%20-0.143%203.861%200.286%204.511%201.1570001%20C%205.096%201.963%205.395%202.808%205.395%203.6790001%20C%205.395%204.81%204.732%205.7850003%203.653%205.7850003%20Z%20M%203.627%205.395%20C%204.1340003%205.395%204.381%205.005%204.381%204.238%20C%204.381%203.887%204.303%203.4190001%204.1470003%202.834%20C%203.861%201.7290001%203.484%200.975%203.029%200.572%20C%202.769%200.351%202.522%200.24700001%202.275%200.24700001%20C%201.742%200.24700001%201.482%200.663%201.482%201.495%20C%201.482%201.781%201.547%202.21%201.677%202.782%20L%201.963%203.9520001%20C%202.002%204.1470003%202.0670002%204.29%202.145%204.394%20C%202.652%205.057%203.1460001%205.395%203.627%205.395%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5235454545454545em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, adding a back-reference from &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%205.759%2021.878999999999998%22%20width%3D%225.759pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB2B0D162BF0EF17F805166E1C67260EF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.653%205.7850003%20C%203.1850002%205.7850003%202.717%205.564%202.262%205.122%20L%203.1590002%208.827001%20C%203.1330001%208.944%203.094%209.022%202.938%209.022%20C%202.509%209.022%201.5600001%208.905%201.391%208.892%20C%201.196%208.866%201.092%208.775001%201.092%208.58%20C%201.092%208.45%201.209%208.385%201.4560001%208.385%20C%201.7030001%208.385%202.0410001%208.398%202.0410001%208.216001%20C%202.0410001%208.1640005%201.9760001%207.9040003%201.8590001%207.4230003%20L%200.819%203.237%20C%200.676%202.691%200.611%202.249%200.611%201.924%20C%200.611%200.806%201.209%20-0.143%202.275%20-0.143%20C%203.1200001%20-0.143%203.861%200.286%204.511%201.1570001%20C%205.096%201.963%205.395%202.808%205.395%203.6790001%20C%205.395%204.81%204.732%205.7850003%203.653%205.7850003%20Z%20M%203.627%205.395%20C%204.1340003%205.395%204.381%205.005%204.381%204.238%20C%204.381%203.887%204.303%203.4190001%204.1470003%202.834%20C%203.861%201.7290001%203.484%200.975%203.029%200.572%20C%202.769%200.351%202.522%200.24700001%202.275%200.24700001%20C%201.742%200.24700001%201.482%200.663%201.482%201.495%20C%201.482%201.781%201.547%202.21%201.677%202.782%20L%201.963%203.9520001%20C%202.002%204.1470003%202.0670002%204.29%202.145%204.394%20C%202.652%205.057%203.1460001%205.395%203.627%205.395%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5235454545454545em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;
to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;dumpster&#x2F;onecycle.dot.svg&quot; alt=&quot;image&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Then, the depth-first search will return to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, decrement the number of
unaccounted references, and assume that all incoming references to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;
and &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%205.759%2021.878999999999998%22%20width%3D%225.759pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB2B0D162BF0EF17F805166E1C67260EF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.653%205.7850003%20C%203.1850002%205.7850003%202.717%205.564%202.262%205.122%20L%203.1590002%208.827001%20C%203.1330001%208.944%203.094%209.022%202.938%209.022%20C%202.509%209.022%201.5600001%208.905%201.391%208.892%20C%201.196%208.866%201.092%208.775001%201.092%208.58%20C%201.092%208.45%201.209%208.385%201.4560001%208.385%20C%201.7030001%208.385%202.0410001%208.398%202.0410001%208.216001%20C%202.0410001%208.1640005%201.9760001%207.9040003%201.8590001%207.4230003%20L%200.819%203.237%20C%200.676%202.691%200.611%202.249%200.611%201.924%20C%200.611%200.806%201.209%20-0.143%202.275%20-0.143%20C%203.1200001%20-0.143%203.861%200.286%204.511%201.1570001%20C%205.096%201.963%205.395%202.808%205.395%203.6790001%20C%205.395%204.81%204.732%205.7850003%203.653%205.7850003%20Z%20M%203.627%205.395%20C%204.1340003%205.395%204.381%205.005%204.381%204.238%20C%204.381%203.887%204.303%203.4190001%204.1470003%202.834%20C%203.861%201.7290001%203.484%200.975%203.029%200.572%20C%202.769%200.351%202.522%200.24700001%202.275%200.24700001%20C%201.742%200.24700001%201.482%200.663%201.482%201.495%20C%201.482%201.781%201.547%202.21%201.677%202.782%20L%201.963%203.9520001%20C%202.002%204.1470003%202.0670002%204.29%202.145%204.394%20C%202.652%205.057%203.1460001%205.395%203.627%205.395%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5235454545454545em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; were totally accounted for (and therefore inaccessible). Then
the garbage collector would happily destroy &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; and &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%205.759%2021.878999999999998%22%20width%3D%225.759pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB2B0D162BF0EF17F805166E1C67260EF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.653%205.7850003%20C%203.1850002%205.7850003%202.717%205.564%202.262%205.122%20L%203.1590002%208.827001%20C%203.1330001%208.944%203.094%209.022%202.938%209.022%20C%202.509%209.022%201.5600001%208.905%201.391%208.892%20C%201.196%208.866%201.092%208.775001%201.092%208.58%20C%201.092%208.45%201.209%208.385%201.4560001%208.385%20C%201.7030001%208.385%202.0410001%208.398%202.0410001%208.216001%20C%202.0410001%208.1640005%201.9760001%207.9040003%201.8590001%207.4230003%20L%200.819%203.237%20C%200.676%202.691%200.611%202.249%200.611%201.924%20C%200.611%200.806%201.209%20-0.143%202.275%20-0.143%20C%203.1200001%20-0.143%203.861%200.286%204.511%201.1570001%20C%205.096%201.963%205.395%202.808%205.395%203.6790001%20C%205.395%204.81%204.732%205.7850003%203.653%205.7850003%20Z%20M%203.627%205.395%20C%204.1340003%205.395%204.381%205.005%204.381%204.238%20C%204.381%203.887%204.303%203.4190001%204.1470003%202.834%20C%203.861%201.7290001%203.484%200.975%203.029%200.572%20C%202.769%200.351%202.522%200.24700001%202.275%200.24700001%20C%201.742%200.24700001%201.482%200.663%201.482%201.495%20C%201.482%201.781%201.547%202.21%201.677%202.782%20L%201.963%203.9520001%20C%202.002%204.1470003%202.0670002%204.29%202.145%204.394%20C%202.652%205.057%203.1460001%205.395%203.627%205.395%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5235454545454545em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;’s allocations,
leaving a dangling reference to the heap, potentially causing a
use-after-free or other gnarly memory errors.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;resolving-concurrency&quot;&gt;Resolving concurrency&lt;&#x2F;h3&gt;
&lt;p&gt;The simplest solution to this concurrency issue is to just wrap
everything in a big fat lock by forcing every single operation involving
a &lt;code&gt;Gc&lt;&#x2F;code&gt; to acquire a single global mutex, preventing any sort of
concurrency bugs at all. However, that’s ridiculously slow.&lt;&#x2F;p&gt;
&lt;p&gt;We’d like to have an approach that only needs to achieve mutual
exclusion over a small subset of all allocations if at all possible. To
do so, let’s take a closer look at our concurrency problem: we can see
that we only really get erroneous results when another thread mutates
the subgraph &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2011.817%2021.878999999999998%22%20width%3D%2211.817pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g42445E1EBAF5307FB8C297D0478333B9%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g42445E1EBAF5307FB8C297D0478333B9%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%2011.453%208.684%20C%2011.453%208.814%2011.375%208.879%2011.219%208.879%20L%209.568%208.84%20L%207.9170003%208.879%20C%207.709%208.879%207.618%208.762%207.618%208.567%20C%207.618%208.476%207.657%208.411%207.722%208.398%20C%207.852%208.385%207.9560003%208.372%208.021%208.372%20C%208.424%208.359%208.645%208.333%208.71%208.32%20C%208.775001%208.307%208.814%208.268001%208.814%208.203%20C%208.801001%208.1640005%208.788%208.086%208.762%207.9690003%20L%207.9950004%204.875%20L%204.173%204.875%20L%204.927%207.826%20C%204.992%208.099%205.109%208.268001%205.278%208.333%20C%205.369%208.359%205.59%208.372%205.954%208.372%20C%206.3050003%208.372%206.448%208.372%206.448%208.684%20C%206.448%208.814%206.3700004%208.879%206.214%208.879%20L%204.563%208.84%20L%202.8990002%208.879%20C%202.691%208.879%202.6000001%208.762%202.6000001%208.567%20C%202.6000001%208.476%202.639%208.411%202.717%208.398%20C%202.8470001%208.385%202.951%208.372%203.016%208.372%20C%203.4190001%208.359%203.653%208.333%203.7180002%208.32%20C%203.783%208.307%203.809%208.268001%203.809%208.203%20C%203.809%208.177%203.796%208.099%203.757%207.9690003%20L%202.028%201.066%20C%201.963%200.78000003%201.8330001%200.611%201.638%200.546%20C%201.547%200.52%201.3130001%200.507%200.91%200.507%20C%200.624%200.507%200.507%200.481%200.507%200.19500001%20C%200.507%200.065%200.58500004%200%200.741%200%20L%202.379%200.039%20L%203.198%200.026%20C%203.341%200.026%203.887%200%204.03%200%20C%204.238%200%204.342%200.104%204.342%200.312%20C%204.342%200.442%204.199%200.507%203.926%200.507%20C%203.4060001%200.507%203.1460001%200.559%203.1460001%200.676%20C%203.1460001%200.676%203.1590002%200.71500003%203.1850002%200.884%20L%204.056%204.368%20L%207.8650002%204.368%20L%206.994%200.884%20C%206.955%200.689%206.7990003%200.559%206.539%200.52%20C%206.474%200.507%206.2530003%200.507%205.876%200.507%20C%205.629%200.507%205.512%200.403%205.512%200.19500001%20C%205.512%200.065%205.59%200%205.7460003%200%20L%207.3840003%200.039%20L%208.203%200.026%20C%208.346%200.026%208.879%200%209.048%200%20C%209.2560005%200%209.360001%200.104%209.360001%200.312%20C%209.360001%200.442%209.217%200.507%208.944%200.507%20C%208.411%200.507%208.151%200.559%208.151%200.676%20C%208.151%200.676%208.1640005%200.71500003%208.190001%200.884%20L%209.932%207.826%20C%209.997%208.099%2010.114%208.268001%2010.283%208.333%20C%2010.361%208.359%2010.582%208.372%2010.959001%208.372%20C%2011.297%208.372%2011.453%208.372%2011.453%208.684%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 1.0742727272727273em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; as we interact with it. The solution is quite clever -
we tag every &lt;code&gt;Gc&lt;&#x2F;code&gt; with a special number, which I’ll call a collecting
tag.&lt;&#x2F;p&gt;
&lt;p&gt;First, we’ll add a global atomic integer called the &lt;code&gt;COLLECTING_TAG&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;static&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;COLLECTING_TAG&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; AtomicUsize &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;AtomicUsize&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Whenever we create or clone a new &lt;code&gt;Gc&lt;&#x2F;code&gt;, we’ll annotate it with the
current value of &lt;code&gt;COLLECTING_TAG&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; this new `Gc` type is intended to be `Sync`.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;Gc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Collectable &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Send&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Sync&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-invalid z-illegal z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;Sized&amp;gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;ptr&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;NonNull&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;GcBox&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;tag&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; AtomicUsize,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-impl z-rust&quot;&gt;impl&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Collectable &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Send&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Sync&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-invalid z-illegal z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;Sized&lt;&#x2F;span&gt;&amp;gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;Gc&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;new&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; T&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Gc&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; (other bookkeeping hidden)
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        Gc &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            ptr&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;*&lt;&#x2F;span&gt; initialization of GcBox&amp;lt;T&amp;gt; &lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            tag&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;COLLECTING_TAG&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;load&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Ordering&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Relaxed&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Next, at the start of the collection process, we’ll increment the value
of &lt;code&gt;COLLECTING_TAG&lt;&#x2F;code&gt; just before we call &lt;code&gt;dfs&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;collect&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;COLLECTING_TAG&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;fetch_add&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Ordering&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Relaxed&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; carry on with DFS and such
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Lastly, whenever we encounter a &lt;code&gt;Gc&lt;&#x2F;code&gt; during the &lt;code&gt;dfs&lt;&#x2F;code&gt; process, we’ll
check its tag. If the tag is equal to the current value of
&lt;code&gt;COLLECTING_TAG&lt;&#x2F;code&gt;, that means the &lt;code&gt;Gc&lt;&#x2F;code&gt; was created after &lt;code&gt;dfs&lt;&#x2F;code&gt; started.
If so, then whatever spot we found the &lt;code&gt;Gc&lt;&#x2F;code&gt; in must have been
accessible, and we can mark it as so. To prevent us from visiting the
same edge twice (due to shenanigans), we’ll also update the tag on every
edge we visit to the value of &lt;code&gt;COLLECTING_TAG&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Let’s return to our broken example to show how this modification fixes
it. We return to our reference graph with &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; pointing to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%205.759%2021.878999999999998%22%20width%3D%225.759pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB2B0D162BF0EF17F805166E1C67260EF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.653%205.7850003%20C%203.1850002%205.7850003%202.717%205.564%202.262%205.122%20L%203.1590002%208.827001%20C%203.1330001%208.944%203.094%209.022%202.938%209.022%20C%202.509%209.022%201.5600001%208.905%201.391%208.892%20C%201.196%208.866%201.092%208.775001%201.092%208.58%20C%201.092%208.45%201.209%208.385%201.4560001%208.385%20C%201.7030001%208.385%202.0410001%208.398%202.0410001%208.216001%20C%202.0410001%208.1640005%201.9760001%207.9040003%201.8590001%207.4230003%20L%200.819%203.237%20C%200.676%202.691%200.611%202.249%200.611%201.924%20C%200.611%200.806%201.209%20-0.143%202.275%20-0.143%20C%203.1200001%20-0.143%203.861%200.286%204.511%201.1570001%20C%205.096%201.963%205.395%202.808%205.395%203.6790001%20C%205.395%204.81%204.732%205.7850003%203.653%205.7850003%20Z%20M%203.627%205.395%20C%204.1340003%205.395%204.381%205.005%204.381%204.238%20C%204.381%203.887%204.303%203.4190001%204.1470003%202.834%20C%203.861%201.7290001%203.484%200.975%203.029%200.572%20C%202.769%200.351%202.522%200.24700001%202.275%200.24700001%20C%201.742%200.24700001%201.482%200.663%201.482%201.495%20C%201.482%201.781%201.547%202.21%201.677%202.782%20L%201.963%203.9520001%20C%202.002%204.1470003%202.0670002%204.29%202.145%204.394%20C%202.652%205.057%203.1460001%205.395%203.627%205.395%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5235454545454545em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; and &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.032%2021.878999999999998%22%20width%3D%226.032pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5483636363636364em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;
pointing to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;. Since every &lt;code&gt;Gc&lt;&#x2F;code&gt; must be annotated with a tag, let’s
say they’re all tagged with 0.&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;dumpster&#x2F;chain2labeled.dot.svg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Next, when &lt;code&gt;dfs&lt;&#x2F;code&gt; begins, &lt;code&gt;COLLECTING_TAG&lt;&#x2F;code&gt; is incremented to 1. As a
result, the new reference created by a malicious thread must be tagged
with 1.&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;dumpster&#x2F;onecyclelabeled.dot.svg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Now, when &lt;code&gt;dfs&lt;&#x2F;code&gt; visits the edge pointing from &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%205.759%2021.878999999999998%22%20width%3D%225.759pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB2B0D162BF0EF17F805166E1C67260EF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.653%205.7850003%20C%203.1850002%205.7850003%202.717%205.564%202.262%205.122%20L%203.1590002%208.827001%20C%203.1330001%208.944%203.094%209.022%202.938%209.022%20C%202.509%209.022%201.5600001%208.905%201.391%208.892%20C%201.196%208.866%201.092%208.775001%201.092%208.58%20C%201.092%208.45%201.209%208.385%201.4560001%208.385%20C%201.7030001%208.385%202.0410001%208.398%202.0410001%208.216001%20C%202.0410001%208.1640005%201.9760001%207.9040003%201.8590001%207.4230003%20L%200.819%203.237%20C%200.676%202.691%200.611%202.249%200.611%201.924%20C%200.611%200.806%201.209%20-0.143%202.275%20-0.143%20C%203.1200001%20-0.143%203.861%200.286%204.511%201.1570001%20C%205.096%201.963%205.395%202.808%205.395%203.6790001%20C%205.395%204.81%204.732%205.7850003%203.653%205.7850003%20Z%20M%203.627%205.395%20C%204.1340003%205.395%204.381%205.005%204.381%204.238%20C%204.381%203.887%204.303%203.4190001%204.1470003%202.834%20C%203.861%201.7290001%203.484%200.975%203.029%200.572%20C%202.769%200.351%202.522%200.24700001%202.275%200.24700001%20C%201.742%200.24700001%201.482%200.663%201.482%201.495%20C%201.482%201.781%201.547%202.21%201.677%202.782%20L%201.963%203.9520001%20C%202.002%204.1470003%202.0670002%204.29%202.145%204.394%20C%202.652%205.057%203.1460001%205.395%203.627%205.395%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5235454545454545em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, it sees that
the reference is labeled with a tag of 1, and therefore both &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%205.759%2021.878999999999998%22%20width%3D%225.759pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB2B0D162BF0EF17F805166E1C67260EF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.653%205.7850003%20C%203.1850002%205.7850003%202.717%205.564%202.262%205.122%20L%203.1590002%208.827001%20C%203.1330001%208.944%203.094%209.022%202.938%209.022%20C%202.509%209.022%201.5600001%208.905%201.391%208.892%20C%201.196%208.866%201.092%208.775001%201.092%208.58%20C%201.092%208.45%201.209%208.385%201.4560001%208.385%20C%201.7030001%208.385%202.0410001%208.398%202.0410001%208.216001%20C%202.0410001%208.1640005%201.9760001%207.9040003%201.8590001%207.4230003%20L%200.819%203.237%20C%200.676%202.691%200.611%202.249%200.611%201.924%20C%200.611%200.806%201.209%20-0.143%202.275%20-0.143%20C%203.1200001%20-0.143%203.861%200.286%204.511%201.1570001%20C%205.096%201.963%205.395%202.808%205.395%203.6790001%20C%205.395%204.81%204.732%205.7850003%203.653%205.7850003%20Z%20M%203.627%205.395%20C%204.1340003%205.395%204.381%205.005%204.381%204.238%20C%204.381%203.887%204.303%203.4190001%204.1470003%202.834%20C%203.861%201.7290001%203.484%200.975%203.029%200.572%20C%202.769%200.351%202.522%200.24700001%202.275%200.24700001%20C%201.742%200.24700001%201.482%200.663%201.482%201.495%20C%201.482%201.781%201.547%202.21%201.677%202.782%20L%201.963%203.9520001%20C%202.002%204.1470003%202.0670002%204.29%202.145%204.394%20C%202.652%205.057%203.1460001%205.395%203.627%205.395%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5235454545454545em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; and &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;
must be accessible - no accidental early deallocations here.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;moving-in-and-out&quot;&gt;Moving in and out&lt;&#x2F;h3&gt;
&lt;p&gt;We might hope that tagging the pointers is sufficient to prevent all
concurrency bugs. However, this is sadly not enough. To show why, we’ll
begin with an example.&lt;&#x2F;p&gt;
&lt;p&gt;First, let’s imagine an allocation called &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, which contains two
optional references to itself.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;X&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;x1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Mutex&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Option&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Gc&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;X&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;x2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Mutex&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Option&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Gc&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;X&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;At the start of our example, there will be only one &lt;code&gt;Gc&lt;&#x2F;code&gt; pointing from
inside &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; to itself, and the other slot that can hold a &lt;code&gt;Gc&lt;&#x2F;code&gt; will be
empty. &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; is accessible directly from the root allocation &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.032%2021.878999999999998%22%20width%3D%226.032pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5483636363636364em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, and all
existing references are tagged with 0. For the sake of clarity, I’ll
draw the arrow representing the first slot in &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; with a solid line and
the second slot with a dashed line.&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;dumpster&#x2F;dash0.dot.svg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Now, let’s have &lt;code&gt;dfs&lt;&#x2F;code&gt; begin, starting at &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;We increment &lt;code&gt;COLLECTING_TAG&lt;&#x2F;code&gt; to 1.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;dfs&lt;&#x2F;code&gt; records that &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; has 2 unaccounted-for references at the
start.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;dfs&lt;&#x2F;code&gt; visits the &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;’s first slot and tags the currently-existing
self reference in that slot. &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; now has 1 unaccounted-for
reference.&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;dumpster&#x2F;dash1.dot.svg&quot; alt=&quot;image&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;A malicious thread intervenes, first moving the &lt;code&gt;Gc&lt;&#x2F;code&gt; from &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;’s
first slot to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.032%2021.878999999999998%22%20width%3D%226.032pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5483636363636364em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, then moving the original &lt;code&gt;Gc&lt;&#x2F;code&gt; which connected &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.032%2021.878999999999998%22%20width%3D%226.032pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5483636363636364em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;
to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; into &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;’s second slot.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;do_evil&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;r_to_x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Gc&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;X&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; z &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;std&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;mem&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;take&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;r_to_x&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;x1&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;lock&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;z&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;x2&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;lock&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; r_to_x&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;dumpster&#x2F;dash2.dot.svg&quot; alt=&quot;image&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;dfs&lt;&#x2F;code&gt; continues, now visiting the second slot in &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;. Seeing another
reference to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, we decrement the number of unaccounted-for
references to 0.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;dfs&lt;&#x2F;code&gt; found no ancestors of &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; with unaccounted-for ancestors, so
we free &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;. However, &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%207.436%2021.878999999999998%22%20width%3D%227.436pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gAA5B40CBFC04919BE9EA3F03BB5A8C28%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.8510003%204.849%20C%206.8510003%205.447%206.2660003%205.7460003%205.616%205.7460003%20C%205.057%205.7460003%204.6150002%205.447%204.277%204.849%20C%204.004%205.447%203.549%205.7460003%202.8860002%205.7460003%20C%202.249%205.7460003%201.7290001%205.447%201.3130001%204.862%20C%200.962%204.355%200.78000003%203.9780002%200.78000003%203.7310002%20C%200.78000003%203.614%200.845%203.549%200.975%203.549%20C%201.092%203.549%201.1700001%203.614%201.196%203.7310002%20C%201.4430001%204.485%201.9890001%205.369%202.8600001%205.369%20C%203.289%205.369%203.497%205.096%203.497%204.563%20C%203.497%204.29%203.263%203.276%202.808%201.534%20C%202.5870001%200.663%202.197%200.234%201.638%200.234%20C%201.4560001%200.234%201.2870001%200.273%201.144%200.338%20C%201.482%200.468%201.651%200.702%201.651%201.04%20C%201.651%201.378%201.482%201.547%201.131%201.547%20C%200.702%201.547%200.377%201.183%200.377%200.754%20C%200.377%200.156%200.98800004%20-0.143%201.625%20-0.143%20C%202.171%20-0.143%202.6130002%200.156%202.964%200.754%20C%203.211%200.156%203.6790001%20-0.143%204.355%20-0.143%20C%204.979%20-0.143%205.499%200.156%205.915%200.741%20C%206.2660003%201.248%206.448%201.625%206.448%201.872%20C%206.448%201.9890001%206.383%202.0540001%206.2530003%202.0540001%20C%206.136%202.0540001%206.071%201.9890001%206.032%201.872%20C%205.8110003%201.131%205.2260003%200.234%204.381%200.234%20C%203.9520001%200.234%203.7310002%200.49400002%203.7310002%201.0270001%20C%203.7310002%201.196%203.796%201.5600001%203.9390001%202.145%20L%204.381%203.9%20C%204.6280003%204.875%205.031%205.369%205.603%205.369%20C%205.7850003%205.369%205.954%205.33%206.097%205.2650003%20C%205.7460003%205.1480002%205.577%204.914%205.577%204.563%20C%205.577%204.225%205.7590003%204.056%206.11%204.056%20C%206.526%204.056%206.8510003%204.433%206.8510003%204.849%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.676em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; is still accessible!&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;This problem stumped me for a decent while. It seems impossible to
prevent other threads from do-si-do-ing every &lt;code&gt;Gc&lt;&#x2F;code&gt; pointing to an
allocation in order to fool our search. Luckily, there is a way through.
Since tagging every &lt;code&gt;Gc&lt;&#x2F;code&gt; worked out for us before, we’ll try tagging
every allocation.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;repr&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;C&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;GcBox&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Collectable &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Send&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Sync&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-invalid z-illegal z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;Sized&amp;gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;ref_count&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; AtomicUsize,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;tag&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; AtomicUsize,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;value&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; T
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Next, every time a &lt;code&gt;Gc&lt;&#x2F;code&gt; is dereferenced, we’ll update the tag in the
allocation to the current value of &lt;code&gt;COLLECTING_TAG&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-impl z-rust&quot;&gt;impl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Collectable &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Send&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Sync&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-invalid z-illegal z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;Sized&lt;&#x2F;span&gt;&amp;gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;std&lt;&#x2F;span&gt;::&lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;ops&lt;&#x2F;span&gt;::&lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;Deref&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;GcBox&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-type z-rust&quot;&gt;type&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-type z-rust&quot;&gt;Target&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; T&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;deref&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Target&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; box_ref&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;GcBox&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;unsafe&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-language z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;ptr&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;as_ref&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        box_ref&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;tag&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;store&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;COLLECTING_TAG&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;load&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Ordering&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Acquire&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Ordering&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Release&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;box_ref&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;value
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Whenever &lt;code&gt;dfs&lt;&#x2F;code&gt; observes that the tag on an allocation is equal to
&lt;code&gt;COLLECTING_TAG&lt;&#x2F;code&gt;, that means that the allocation was accessed, and
therefore accessible. In order to shuffle references around in our above
example, the malicious thread would have to dereference a &lt;code&gt;Gc&lt;&#x2F;code&gt;,
notifying the search and preventing an early deallocation.&lt;&#x2F;p&gt;
&lt;p&gt;In fact, this is enough to prove that &lt;code&gt;dfs&lt;&#x2F;code&gt; will &lt;em&gt;never&lt;&#x2F;em&gt; incorrectly
mark an allocation as inaccessible, even under concurrent execution.
This blog post is already rather long, so I’ll only provide a rough
sketch of the proof.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Theorem: &lt;code&gt;dfs&lt;&#x2F;code&gt; will never erroneously mark an allocation as
inaccessible.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Proof:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;If &lt;code&gt;dfs&lt;&#x2F;code&gt; encounters a &lt;code&gt;Gc&lt;&#x2F;code&gt; created after &lt;code&gt;dfs&lt;&#x2F;code&gt; begins, it will know
that the referent is accessible.&lt;&#x2F;li&gt;
&lt;li&gt;Due to (1), if &lt;code&gt;dfs&lt;&#x2F;code&gt; marked some allocation &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; as inaccessible, it
must have only visited &lt;code&gt;Gc&lt;&#x2F;code&gt;s pointing to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; which existed before
&lt;code&gt;dfs&lt;&#x2F;code&gt; began.&lt;&#x2F;li&gt;
&lt;li&gt;Weakening the statement from (2), if &lt;code&gt;dfs&lt;&#x2F;code&gt; marked some allocation
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; as inaccessible, it must have only visited &lt;code&gt;Gc&lt;&#x2F;code&gt;s pointing to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;
which existed when &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;’s reference count was recorded.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;dfs&lt;&#x2F;code&gt; never visits a &lt;code&gt;Gc&lt;&#x2F;code&gt; while it points from the root allocation
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.032%2021.878999999999998%22%20width%3D%226.032pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5483636363636364em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; to any other allocation.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;dfs&lt;&#x2F;code&gt; must visit every &lt;code&gt;Gc&lt;&#x2F;code&gt; which pointed to an allocation at the
point when its reference count was recorded in order to mark it as
inaccessible.&lt;&#x2F;li&gt;
&lt;li&gt;Due to (4) and (5), if &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; is marked as inaccesssible, any &lt;code&gt;Gc&lt;&#x2F;code&gt;
which at any point connected &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.032%2021.878999999999998%22%20width%3D%226.032pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5483636363636364em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; must have been moved to
connect another node (not &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.032%2021.878999999999998%22%20width%3D%226.032pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5483636363636364em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;) to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Due to (6), there is no lifetime &lt;code&gt;&#x27;x&lt;&#x2F;code&gt; which can borrow against a
&lt;code&gt;Gc&lt;&#x2F;code&gt; pointing from &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.032%2021.878999999999998%22%20width%3D%226.032pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5483636363636364em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; and last between when &lt;code&gt;dfs&lt;&#x2F;code&gt; first
visits &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; and when it last visits &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;The final &lt;code&gt;Gc&lt;&#x2F;code&gt; to move into &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; before &lt;code&gt;dfs&lt;&#x2F;code&gt; must have been moved
while another borrow against a &lt;code&gt;Gc&lt;&#x2F;code&gt; pointing from &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.032%2021.878999999999998%22%20width%3D%226.032pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g48FAE926132203D61D43DB6E2CC9D8A5%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g48FAE926132203D61D43DB6E2CC9D8A5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.668%204.862%20C%205.668%205.408%205.135%205.7460003%204.563%205.7460003%20C%203.926%205.7460003%203.3930001%205.447%202.951%204.836%20C%202.821%205.343%202.379%205.7460003%201.768%205.7460003%20C%201.235%205.7460003%200.845%205.33%200.572%204.485%20C%200.442%204.056%200.377%203.809%200.377%203.7310002%20C%200.377%203.614%200.442%203.549%200.58500004%203.549%20C%200.65000004%203.549%200.689%203.562%200.72800004%203.588%20C%200.79300004%203.7050002%200.832%203.796%200.845%203.887%20C%201.079%204.875%201.378%205.369%201.7290001%205.369%20C%201.95%205.369%202.0670002%205.1870003%202.0670002%204.823%20C%202.0670002%204.6540003%202.002%204.303%201.872%203.77%20L%201.131%200.819%20C%201.092%200.65000004%201.014%200.312%201.014%200.24700001%20C%201.014%20-0.013%201.1570001%20-0.143%201.4300001%20-0.143%20C%201.69%20-0.143%201.8590001%20-0.013%201.95%200.24700001%20L%202.197%201.183%20C%202.3400002%201.742%202.431%202.106%202.47%202.275%20L%202.8730001%203.9390001%20C%202.8990002%204.043%203.003%204.212%203.1720002%204.459%20C%203.523%204.953%203.926%205.369%204.563%205.369%20C%204.719%205.369%204.849%205.343%204.966%205.278%20C%204.576%205.1610003%204.381%204.914%204.381%204.563%20C%204.381%204.225%204.563%204.056%204.914%204.056%20C%205.343%204.056%205.668%204.433%205.668%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.5483636363636364em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;
existed. Let the lifetime of that borrow be &lt;code&gt;&#x27;y&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Because &lt;code&gt;&#x27;y&lt;&#x2F;code&gt; lasts longer than the final move, &lt;code&gt;&#x27;y&lt;&#x2F;code&gt; can be extended
to last arbitrarily long, even until after &lt;code&gt;dfs&lt;&#x2F;code&gt; has finished
visiting every &lt;code&gt;Gc&lt;&#x2F;code&gt; pointing to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Due to (7), &lt;code&gt;&#x27;y&lt;&#x2F;code&gt; must not have existed before &lt;code&gt;dfs&lt;&#x2F;code&gt; first visited
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;. Therefore, if &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; is erroneously marked as inaccessible, a &lt;code&gt;Gc&lt;&#x2F;code&gt;
pointing to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; must have been dereferenced to generate a borrow
with lifetime &lt;code&gt;&#x27;y&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;If a &lt;code&gt;Gc&lt;&#x2F;code&gt; pointing to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; was dereferenced before the last time
&lt;code&gt;dfs&lt;&#x2F;code&gt; visited a &lt;code&gt;Gc&lt;&#x2F;code&gt; pointing to &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, then &lt;code&gt;dfs&lt;&#x2F;code&gt; would have observed
that &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%206.877%2021.878999999999998%22%20width%3D%226.877pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g1067AF3C7D4B21E8BD8099E2619FB19C%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g1067AF3C7D4B21E8BD8099E2619FB19C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.474%201.872%20C%206.474%201.9890001%206.409%202.0540001%206.2660003%202.0540001%20C%206.162%202.0540001%206.084%201.963%206.045%201.781%20C%205.7850003%200.754%205.473%200.234%205.122%200.234%20C%204.901%200.234%204.784%200.416%204.784%200.78000003%20C%204.784%200.949%204.836%201.261%204.953%201.7160001%20L%205.6940002%204.6410003%20C%205.7590003%204.888%205.7850003%205.031%205.7850003%205.096%20C%205.7850003%205.356%205.642%205.486%205.356%205.486%20C%205.083%205.486%204.901%205.33%204.81%205.031%20C%204.537%205.512%204.1470003%205.7460003%203.653%205.7460003%20C%202.808%205.7460003%202.0670002%205.317%201.417%204.459%20C%200.819%203.653%200.52%202.821%200.52%201.95%20C%200.52%200.819%201.183%20-0.143%202.275%20-0.143%20C%202.834%20-0.143%203.38%200.156%203.9%200.754%20C%204.043%200.26%204.485%20-0.143%205.096%20-0.143%20C%205.993%20-0.143%206.2660003%200.91%206.474%201.872%20Z%20M%204.433%204.862%20C%204.55%204.589%204.6150002%204.407%204.6150002%204.29%20C%204.6150002%204.238%204.602%204.173%204.589%204.0820003%20L%203.9520001%201.5860001%20C%203.913%201.4430001%203.822%201.2870001%203.7050002%201.131%20C%203.224%200.533%202.756%200.234%202.301%200.234%20C%201.794%200.234%201.534%200.624%201.534%201.391%20C%201.534%201.7030001%201.612%202.171%201.768%202.795%20C%202.0410001%203.9%202.431%204.6410003%202.9120002%205.044%20C%203.1720002%205.2650003%203.4190001%205.369%203.6660001%205.369%20C%204.017%205.369%204.277%205.2000003%204.433%204.862%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.6251818181818182em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;’s tag had changed. Therefore, if an allocation was
erroneously marked as inaccessible, it must have been marked as
accessible. Therefore no allocations were ever erroneously marked as
inacessible by &lt;code&gt;dfs&lt;&#x2F;code&gt;. QED.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;This proof is relatively handwavy, but it should be possible for an
astute reader to fill in the details. I will leave it to such astute
readers to prove the complementary proof to this; namely, that &lt;code&gt;dfs&lt;&#x2F;code&gt;
will never erroneously mark an allocation as accessible.&lt;&#x2F;p&gt;
&lt;p&gt;I also think that it’s really cool that the entire mechanism of the
correctness of this approach is totally supported by Rust’s borrow
checking semantics. It makes the whole thing feel like it fits right in.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;it-s-the-weak-ones-that-count&quot;&gt;It’s the weak ones that count&lt;&#x2F;h3&gt;
&lt;p&gt;There’s one more cause for memory safety issues from concurrency. If an
allocation is freed because its reference count reached zero, it could
still be accessible by another thread because it was stored in the
global dumpster. We can’t guarantee that we’ve obliterated all
references to that allocation from every other thread’s memory, so it
seems like we’re hosed.&lt;&#x2F;p&gt;
&lt;p&gt;However, there’s no problem in computer science that can’t be solved by
adding more state. Taking a leaf from &lt;code&gt;Rc&lt;&#x2F;code&gt;’s book and adapting it
liberally, we annotate each allocation with a “weak” reference count,
which is the number of times it’s referenced by a dumpster or cleanup
thread. We’ll rename our original reference count to be the strong count
instead.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;repr&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;C&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;GcBox&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Collectable &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Send&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Sync&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-invalid z-illegal z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;Sized&amp;gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;strong&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; AtomicUsize,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;weak&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; AtomicUsize,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;tag&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; AtomicUsize,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;value&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; T,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then, when dropping the last strong reference to a &lt;code&gt;Gc&lt;&#x2F;code&gt;, we first check
that its weak reference count is nonzero before we can deallocate it. If
not, it’s the cleanup threads’ problem to take care of it.&lt;&#x2F;p&gt;
&lt;p&gt;Whenever an allocation is removed from a dumpster and about to be thrown
away by a thread running a cleanup procedure, the thread decrements the
weak count of the allocation and checks if both the weak and strong
count have reached zero. If so, that thread can then safely destroy the
allocation.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;deadlocked&quot;&gt;Deadlocked!&lt;&#x2F;h3&gt;
&lt;p&gt;Imagine that we want to create a &lt;code&gt;Gc&amp;lt;Mutex&amp;lt;()&amp;gt;&amp;gt;&lt;&#x2F;code&gt;, and then drop a &lt;code&gt;Gc&lt;&#x2F;code&gt;
pointing to it while the &lt;code&gt;Mutex&lt;&#x2F;code&gt; is locked.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; gc1 &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Gc&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Mutex&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; gc2 &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; gc1&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; guard &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; gc1&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;lock&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;drop&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;gc2&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; suppose this triggers a cleanup
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;drop&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;guard&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;While traversing the reference graph, the &lt;code&gt;dfs&lt;&#x2F;code&gt; visitor would attempt to
visit the mutex, lock it, and try to carry on. However, since the same
thread that triggered the allocation still holds a guard to that mutex,
the thread would deadlock disastrously. Lucky for us, we know that any
allocation with a held mutex guard must still be accessible (due to
&lt;code&gt;Mutex&lt;&#x2F;code&gt;’s excellent API), so we can be certain that if we fail to
acquire a mutex, we have immediate proof that an allocation is
accessible.&lt;&#x2F;p&gt;
&lt;p&gt;To take advantage of that, we’ll make visiting a collectable type a
fallible operation, and make it so that failing to acquire a lock also
fails the visit.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;Collectable&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;accept&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;V&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Visitor&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;self&lt;&#x2F;span&gt;, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;visitor&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; V&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Result&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;, &lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;Visitor&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;visit_gc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Collectable &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-invalid z-illegal z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Sized&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-language z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; gc&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;Gc&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Result&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;, &lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-impl z-rust&quot;&gt;impl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Collectable &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-invalid z-illegal z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;Sized&lt;&#x2F;span&gt;&amp;gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;Collectable&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;Mutex&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;T&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;accept&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;V&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Visitor&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;self&lt;&#x2F;span&gt;, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;visitor&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; V&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Result&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;, &lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; pretend poison errors don&amp;#39;t exist
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-variable z-language z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;try_lock&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;map_err&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;_&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;accept&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;visitor&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;sharing-your-dumpsters&quot;&gt;Sharing your dumpsters&lt;&#x2F;h3&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;dumpster&#x2F;garbagetruck.jpg&quot; alt=&quot;A hand-drawn garbage truck in ink on a white background. It’s crudely done, as if drawn by the sort of person who knows what perspective is but doesn’t quite understand how it works.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;You’ve made it this far into this (admittedly rather lengthy) post.
Enjoy this hand-drawn picture by yours truly.&lt;&#x2F;p&gt;
&lt;p&gt;When implementing this garbage collector, one of the biggest bottlenecks
with concurrent performance is accessing the one, global dumpster every
single time a &lt;code&gt;Gc&lt;&#x2F;code&gt; is dropped. If using a &lt;code&gt;Mutex&amp;lt;HashMap&amp;gt;&lt;&#x2F;code&gt;, this will
remove nearly all parallelism from the whole system and make you wonder
why you paid all that money for a 16-core computer.&lt;&#x2F;p&gt;
&lt;p&gt;As a result, any sane person might lean for a concurrent hashmap. There
are many Rust implementations - I tried
&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.redox-os.org&#x2F;redox-os&#x2F;chashmap&quot;&gt;&lt;code&gt;chashmap&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; but gave up
on it due to a &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.redox-os.org&#x2F;redox-os&#x2F;chashmap&#x2F;-&#x2F;issues&#x2F;3&quot;&gt;rare panic
bug&lt;&#x2F;a&gt;, and then
I tried &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;xacrimon&#x2F;dashmap&quot;&gt;&lt;code&gt;dashmap&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, which worked
fine but was too slow as thread counts increased.&lt;&#x2F;p&gt;
&lt;p&gt;The heart of the issue is that concurrently updating any data structure
is going to be slow. Even so-called “concurrent” data structures which
use clever sharded locks have this issue - there’s always some
contention overhead. The best workaround to concurrency slowdowns is to
just not do things concurrently. We can fix this by making every thread
have its own dumpster, and then having a global collection of
to-be-cleaned allocations which I’ll call the &lt;em&gt;garbage truck&lt;&#x2F;em&gt;. Whenever
another allocation is marked dirty, we can check if this thread’s
dumpster is full according to some heuristic, and if so, transfer all
the allocations from this thread’s dumpster to the garbage truck. I’ve
included some pseudocode for the whole process below.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;py&quot; class=&quot;language-py z-code&quot;&gt;&lt;code class=&quot;language-py&quot; data-lang=&quot;py&quot;&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;dumpster&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-support z-type z-python&quot;&gt;set&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-number-sign z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-python&quot;&gt;#&lt;&#x2F;span&gt; local to this thread
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;garbage_truck&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;mutex&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-support z-type z-python&quot;&gt;set&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-number-sign z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-python&quot;&gt;#&lt;&#x2F;span&gt; global to all threads
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;&lt;span class=&quot;z-keyword z-declaration z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;mark_dirty&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;allocation&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-function z-begin z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;dumpster&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;add&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;allocation&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-statement z-conditional z-if z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-conditional z-if z-python&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;is_full&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;dumpster&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-block z-conditional z-if z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;garbage_truck&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;lock&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-loop z-for z-python&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;trash_bag&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-loop z-for z-in z-python&quot;&gt;in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;dumpster&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-loop z-for z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;            &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;garbage_truck&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;add&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;trash_bag&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;garbage_truck&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;unlock&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;dumpster&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-support z-type z-python&quot;&gt;set&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If &lt;code&gt;is_full&lt;&#x2F;code&gt; returns &lt;code&gt;true&lt;&#x2F;code&gt; rarely enough, there will be almost no
contention over the garbage truck. This means that the concurrency
overhead is vastly reduced and we get to pocket some great performance
returns.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;okay-but-how-fast-is-it&quot;&gt;Okay, but how fast is it?&lt;&#x2F;h2&gt;
&lt;p&gt;In short, this garbage collector runs pretty fast!&lt;&#x2F;p&gt;
&lt;p&gt;In the end, I made two different garbage collector implementations - one
which is thread-local, saving us from all the concurrency headaches, and
another thread-safe one that has all the bells and whistles at the cost
of some performance. Borrowing from
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;matklad&#x2F;once_cell&quot;&gt;&lt;code&gt;once_cell&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;’s API, the former
lives in the &lt;code&gt;unsync&lt;&#x2F;code&gt; module of the crate and the latter in &lt;code&gt;sync&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Next, I collected all the garbage collectors I could find in order to
compare them. I selected all the ones which had a similar API to
&lt;code&gt;dumpster&lt;&#x2F;code&gt;, were published on &lt;a href=&quot;https:&#x2F;&#x2F;crates.io&quot;&gt;crates.io&lt;&#x2F;a&gt;, and
actually worked.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;Name&lt;&#x2F;th&gt;&lt;th&gt;Concurrent?&lt;&#x2F;th&gt;&lt;th&gt;Like &lt;code&gt;dumpster&lt;&#x2F;code&gt;?&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;dumpster&lt;&#x2F;code&gt; (unsync)&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;td&gt;✅&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;dumpster&lt;&#x2F;code&gt; (sync)&lt;&#x2F;td&gt;&lt;td&gt;✅&lt;&#x2F;td&gt;&lt;td&gt;✅&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;rc&#x2F;struct.Rc.html&quot;&gt;&lt;code&gt;Rc&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;td&gt;✅&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;sync&#x2F;struct.Arc.html&quot;&gt;&lt;code&gt;Arc&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;✅&lt;&#x2F;td&gt;&lt;td&gt;✅&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;fitzgen&#x2F;bacon-rajan-cc&quot;&gt;&lt;code&gt;bacon-rajan-cc&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;td&gt;✅&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;artichoke&#x2F;cactusref&quot;&gt;&lt;code&gt;cactusref&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;wusyong&#x2F;elise&quot;&gt;&lt;code&gt;elise&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;✅&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Manishearth&#x2F;rust-gc&quot;&gt;&lt;code&gt;gc&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;td&gt;✅&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;quark-zju&#x2F;gcmodule&quot;&gt;&lt;code&gt;gcmodule&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;yes, but with a different API&lt;&#x2F;td&gt;&lt;td&gt;✅&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;rcgc&quot;&gt;&lt;code&gt;rcgc&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Others&#x2F;shredder&quot;&gt;&lt;code&gt;shredder&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;✅&lt;&#x2F;td&gt;&lt;td&gt;✅&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;I excluded the ones that didn’t have a &lt;code&gt;dumpster&lt;&#x2F;code&gt;-like API because it
would have been a pain to set up a benchmarking harness to handle them.
If you feel this is poor diligence, you can go benchmark them yourself.
I also included &lt;code&gt;Rc&lt;&#x2F;code&gt; and &lt;code&gt;Arc&lt;&#x2F;code&gt;, even though they don’t collect cycles,
because they’re a decent baseline for the minimum performance of a
garbage collector. During my research, I also found that
&lt;code&gt;bacon-rajan-cc&lt;&#x2F;code&gt; doesn’t initiate collections of its own accord, so I
added a version of each of &lt;code&gt;dumpster&lt;&#x2F;code&gt;’s garbage collectors which doesn’t
automatically trigger collections in the spirit of competitive fairness.
Those versions are labeled as “manual.” Lastly, I found that &lt;code&gt;gcmodule&lt;&#x2F;code&gt;
simply stack-overflows and sometimes segfaults when facing extremely
large collection loads, so I removed it from the benchmark set.&lt;&#x2F;p&gt;
&lt;p&gt;As my benchmark, I decided to do the very simplest thing I could think
of: have a bunch of allocations randomly add and remove references to
each other in a loop, dropping and creating new allocations as well. To
account for random noise, I ran 100 trials of each garbage collector
doing 1 million operations. Each operation is either the creation of a
reference or a deletion.&lt;&#x2F;p&gt;
&lt;p&gt;First, I ran a benchmark of all the garbage collectors, measuring pure
single-threaded performance. I’ve shown my benchmark results as a set of
violin plots below, relating runtime to frequency.&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;dumpster&#x2F;single_threaded.png&quot; alt=&quot;A violin plot, titled “Single-threaded GC comparison.” The x-axis is labeled “Runtime for 1M ops (ms),” and the y-axis is labeled “Garbage collector,” with various collectors labeled on the ticks. In order, the garbage collectors on the y-axis are Arc, Rc, shredder, bacon-rajan-cc, gc, dumpster (sync&#x2F;manual), dumpster (sync), dumpster (unsync&#x2F;manual), and dumpster (unsync). The x-axis ranges from 0 ms to 4000 ms. All of the violins, except for shredder’s, are very near to the left side. The violin labeled “shredder” is far off to the right side, with a mean of roughly 3700ms.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;This plot doesn’t tell us much other than that &lt;code&gt;shredder&lt;&#x2F;code&gt; is slow. To
take a closer look, let’s remove &lt;code&gt;shredder&lt;&#x2F;code&gt; from the list and see what
we find.&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;dumpster&#x2F;single_threaded_sans_shredder.png&quot; alt=&quot;The same violin plot as before, but now shredder’s violin and y-axis label have been removed. The x-axis now varies from 40 to 160 ms. The violin labeled Rc is furthest to the left, followed by Arc, bacon-rajan-cc, dumpster (unsync), dumpster (unsync&#x2F;manual), dumpster (sync&#x2F;manual), gc, and finally dumpster (sync).&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;&lt;code&gt;dumpster&lt;&#x2F;code&gt;’s unsync implementation is in a decent position, beat out
only by the non-cycle-detecting allocators and &lt;code&gt;bacon-rajan-cc&lt;&#x2F;code&gt;.
&lt;code&gt;bacon-rajan-cc&lt;&#x2F;code&gt; has very little overhead and is quite performant.&lt;&#x2F;p&gt;
&lt;p&gt;I think there are two main reasons why the concurrent version of the
garbage collector is much slower than the single-threaded one. First,
moving allocations from a thread-local dumpster to the global garbage
truck takes some time. Second, the &lt;code&gt;dfs&lt;&#x2F;code&gt; operation in a concurrent
environment must record the current set of children of an allocation,
typically in a separate heap-allocated structure, to prevent some
concurrency bugs. It’s certainly possible to mitigate the losses from
the first issue, but the second is harder to handle.&lt;&#x2F;p&gt;
&lt;p&gt;My guess as to why the concurrent version is significantly slower when
using automatic collection triggering is that it’s a consequence of my
testing harness. Currently, it runs all the tests in a loop, so the
single-threaded benchmark could run directly after the multi-threaded
one and be forced to clean up some of its garbage.&lt;&#x2F;p&gt;
&lt;p&gt;In any event, let’s move on to the results from the multi-threaded
benchmark.&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;dumpster&#x2F;scaling.png&quot; alt=&quot;A scatter plot, titled “Parallel garbage collector scaling.” The x-axis is labeled “Number of threads” and varies from 1 to 16. The y-axis is labeled “Time for 1M ops (ms)” and varies from 0 to 3500. On the legend, there are four series: dumpster (sync), dumpster (sync&#x2F;manual), shredder, and Arc. The points associated with shredder’s series start out at 3500ms for 1 thread, scaling asymptotically down to roughly 1800ms at 6 threads. All other points are very close to zero.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The only other concurrent garbage collector available for me to test
against was &lt;code&gt;shredder&lt;&#x2F;code&gt;, and it looks like it wasn’t much of a
competition.&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;dumpster&#x2F;scaling_sans_shredder.png&quot; alt=&quot;A scatter plot, titled “Parallel garbage collector scaling (sans shredder).” The x-axis remains the same as before, but now the y-axis only goes up to 200ms. “shredder” has been removed from the legend, but otherwise it is the same as the previous image. The points associated with dumpster (sync) and dumpster (sync&#x2F;manual) start out at roughly 80 ms for 1 thread, jump up to about 110 ms for 2 threads, then decrease asymptotically to around 70 ms for 16 threads. Meanwhile, the points associated with Arc start out at roughly 70 ms for 1 thread and decrease asymptotically with the thread count to around 25 ms for 15 threads.&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;&lt;code&gt;dumpster&lt;&#x2F;code&gt; doesn’t scale as smoothly as I’d like with thread count, but
it’s a relief that performance does actually improve with thread count,
except for the jump from one thread to two. I think being only 3x slower
than Arc is a decent victory, especially for a project that I wasn’t
paid any money to do. I’m not much of an expert at high-performance
computing in concurrent situations, so trying to optimize this further
would likely just be an adventure in trying random things and seeing if
they yield an improvement. If anyone out there has clever ideas on how
to optimize this approach, let me know! My email is on the “About” page.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;coda&quot;&gt;Coda&lt;&#x2F;h2&gt;
&lt;p&gt;Over the last few months, I built a garbage collector for Rust from
scratch. I implemented a novel (ish) algorithm of my own design, got it
to work in both single-threaded and multi-threaded contexts, and showed
that it was actually pretty performant.&lt;&#x2F;p&gt;
&lt;p&gt;The implementation of this crate is now &lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;dumpster&quot;&gt;up on
crates.io&lt;&#x2F;a&gt; and available for anyone
to download. It’s licensed under the GNU GPLv3.&lt;&#x2F;p&gt;
&lt;p&gt;Special thanks to &lt;a href=&quot;https:&#x2F;&#x2F;wisha.page&#x2F;&quot;&gt;Wisha&lt;&#x2F;a&gt;,
&lt;a href=&quot;https:&#x2F;&#x2F;seniormars.com&#x2F;&quot;&gt;Charlie&lt;&#x2F;a&gt;, and
&lt;a href=&quot;https:&#x2F;&#x2F;shreyasminocha.me&#x2F;&quot;&gt;Shreyas&lt;&#x2F;a&gt; for reviewing this post, fielding
my bad questions, and putting up with me rambling about this for nearly
two months straight.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;postscript&quot;&gt;Postscript&lt;&#x2F;h2&gt;
&lt;p&gt;I have a few things that I thought were interesting along the way but
didn’t quite have a good spot to include in the story above, so they’ll
all be mish-mashed in here.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ode-to-bad-good-ideas&quot;&gt;Ode to bad good ideas&lt;&#x2F;h3&gt;
&lt;p&gt;The final, polished solution you see in this blog post is actually quite
far from my original idea. In particular, almost all of my first ideas
for handling concurrency didn’t work. Here’s a quick roll of them all:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Wrap a &lt;code&gt;Mutex&lt;&#x2F;code&gt; around every single allocation’s reference count and
hold them while doing &lt;code&gt;dfs&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Save on space in &lt;code&gt;Gc&lt;&#x2F;code&gt;s by tagging only the lowest bit instead of
adding an entire &lt;code&gt;usize&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Make everything enable dynamic dispatch so we can have real
Java-like objects&lt;&#x2F;li&gt;
&lt;li&gt;Clean up allocations locally on every thread&lt;&#x2F;li&gt;
&lt;li&gt;Avoid directly dropping allocations and instead cleverly decrement
their reference count&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;cool-nightly-tricks&quot;&gt;Cool nightly tricks&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;Rc&lt;&#x2F;code&gt; and the other pointer types are somewhat “blessed” in that they can
access nightly features from the Rust compiler and still be consumed by
stable projects. &lt;code&gt;dumpster&lt;&#x2F;code&gt; has no such blessings.&lt;&#x2F;p&gt;
&lt;p&gt;I would like to implement &lt;code&gt;CoerceUnsized&lt;&#x2F;code&gt; unconditionally for all my
garbage collectors, but that’s simply not possible on stable yet.&lt;&#x2F;p&gt;
&lt;p&gt;Likewise, pending the implementation of strict provenance, there’s
actually no way for a stable crate to manipulate the address portion of
a fat pointer. This means that even if I found some space optimization
using lower bit tagging, I wouldn’t be able to use it because it’s gated
behind a nightly feature.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;another-path-to-gc-dyn-t&quot;&gt;Another path to &lt;code&gt;Gc&amp;lt;dyn T&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Without the ability to coerce &lt;code&gt;Gc&lt;&#x2F;code&gt; as an unsized type, I can’t make
&lt;code&gt;Collectable&lt;&#x2F;code&gt; object safe due to the function signature of &lt;code&gt;accept&lt;&#x2F;code&gt;,
which forces &lt;code&gt;Visitor&lt;&#x2F;code&gt; to also be object-safe, forcing &lt;code&gt;visit&lt;&#x2F;code&gt;
operations to also be object-safe.&lt;&#x2F;p&gt;
&lt;p&gt;I’ve thought of a slightly different approach, though. We can make
&lt;code&gt;Visitor&lt;&#x2F;code&gt; a single concrete type, and that makes &lt;code&gt;Collectable&lt;&#x2F;code&gt; trivially
object-safe. The downside here is that I would then have to store all 5
of my current visitor implementations in the same structure, and that
loses a lot of my nice type safety features and adds a large runtime
penalty. I’m not very happy with that idea, though.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;miri-rules&quot;&gt;Miri rules&lt;&#x2F;h3&gt;
&lt;p&gt;I would probably not have been able to finish this project without
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;miri&quot;&gt;&lt;code&gt;cargo miri&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. If you haven’t heard
of it, you should download it right now and run all of your Rust
projects with it. It’s such a fantastic tool for debugging unsafe code
that I wish I could have it in other languages, too - valgrind is a poor
substitute for it when using C.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;testing-and-debugging&quot;&gt;Testing and debugging&lt;&#x2F;h3&gt;
&lt;p&gt;Early on, I had just a few handwritten tests. The first reference graph
that I found that gave me trouble looked like this:&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;dumpster&#x2F;test4.dot.svg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;However, once I had simple graphs with multiple cycles down, it was hard
to come up with new tests. As a result, I resorted to fuzzing, using the
same approach as my benchmark - randomly generating references and then
seeing if they got cleaned up properly.&lt;&#x2F;p&gt;
&lt;p&gt;Debugging the results of those fuzzed tests absolutely sucked, though.
The experience of trying to find the source of an issue was awful, so I
ended up having to make some (crude) tools to make the process easier.
Eventually, I had settled on printing out the reference graph at choice
times during the run of my tests and then visualizing them to get a good
guess of what was wrong. However, when making the concurrent
implementation, printing something can change the execution behavior of
the program. Not only that, it’s not always obvious what the issue is. I
had one bug which only occurred after several thousand operations had
completed, resulting in reference graphs that looked like this:&lt;&#x2F;p&gt;
&lt;figure class=&quot;night-invert&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;claytonwramsey.com&#x2F;blog&#x2F;dumpster&#x2F;evil.dot.svg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;The graph above was made by fuzzing my garbage collector, using the same
approach as my benchmarks.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Blowing up my compile times for dubious benefits</title>
          <pubDate>Mon, 19 Jun 2023 00:00:00 +0000</pubDate>
          <author>Clayton Ramsey</author>
          <link>https://claytonwramsey.com/blog/fiddler-const-magic/</link>
          <guid>https://claytonwramsey.com/blog/fiddler-const-magic/</guid>
          <description xml:base="https://claytonwramsey.com/blog/fiddler-const-magic/">&lt;p&gt;The tree of useless optimization yields questionable fruit.&lt;&#x2F;p&gt;
&lt;p&gt;For the last two years, I’ve been building a &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;claytonwramsey&#x2F;fiddler&quot;&gt;chess engine called
Fiddler&lt;&#x2F;a&gt;. It’s not very good
by chess engine standards, but that’s not the point - I mostly work on
it for funsies.&lt;&#x2F;p&gt;
&lt;p&gt;Right now, I’m reworking my move generator to more heavily use static,
precomputed data rather than runtime generation. Most recently, I’m
moving from dynamically generating and heap-allocating the magic move
generation table to making it a statically allocated constant. Along the
way, I’ll take this opportunity to explain how magic move generation
works, and hopefully have a little fun.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Update 2023-06-22:&lt;&#x2F;strong&gt; I’ve added a few updates to handle questions that
people in the comments on the &lt;a href=&quot;https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=36399832&quot;&gt;Orange
Website&lt;&#x2F;a&gt; found confusing.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-crash-course-in-magic-moves&quot;&gt;A crash course in magic moves&lt;&#x2F;h2&gt;
&lt;p&gt;Chess engines are usually extremely high-performance pieces of software,
and their move generators are some of the most high-performance parts of
them. Most move generators can generate hundreds of millions of moves,
per core, per second. Mine included!&lt;&#x2F;p&gt;
&lt;p&gt;The majority of moves are made by sliding pieces - the bishop, rook, and
queen - so we’ll dedicate most of our effort toward making that fast.
The most naive approach would be to represent a board as an array of
pieces, and then, for each piece, iterate outward along a ray, adding
moves until we encounter a blocker. The problem with that approach is
simply that it’s far too slow. In the worst case, finding the set of
legal moves for a queen on E4 would require 27 different array
accesses - and that’s just the moves for one piece! We’re going to need
a different approach.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;bitboards&quot;&gt;Bitboards&lt;&#x2F;h3&gt;
&lt;p&gt;We can start by representing the occupancy of a board using a
&lt;em&gt;bitboard&lt;&#x2F;em&gt;: a set of squares represented by a unique 64-bit integer.
Convention dictates that the least-significant bit should be set if the
square A1 is occupied, the second-least-significant to represent B1, and
so on until the most significant bit which represents H8.&lt;&#x2F;p&gt;
&lt;p&gt;Here’s a quick map displaying which bit in a bitboards corresponds to a
square, indexed from the LSB:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; class=&quot;language-text z-code&quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;8 | 56 57 58 59 60 61 62 63
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;7 | 48 49 50 51 52 53 54 55
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;6 | 40 41 42 43 44 45 46 47
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;5 | 32 33 34 35 36 37 38 39
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;4 | 24 25 26 27 28 29 30 31
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;3 | 16 17 18 19 20 21 22 23
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;2 |  8  9 10 11 12 13 14 15
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;1 |  0  1  2  3  4  5  6  7
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;--+------------------------
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  |  A  B  C  D  E  F  G  H
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For example, consider a board with a piece on B1, G3, and C7. B1 has
index 1, G3 has index 22, and C7 has index 50, so the bitboard uniquely
representing {B1, G3, C7} is &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2076.84545555555555%2021.878999999999998%22%20width%3D%2276.84545555555555pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%286.5%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7A5F85FE66C6FD3E604C68F5A7949524%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.294788888888888%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFCDE359C75472195CEC97DC4B537C342%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2828.297677777777775%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2834.79767777777777%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g34A5C14ED9FB7DDEF99FAC79056D90F7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2839.347677777777776%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g34A5C14ED9FB7DDEF99FAC79056D90F7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2847.51456666666667%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFCDE359C75472195CEC97DC4B537C342%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2860.51745555555555%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2867.01745555555554%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g80826852236079CD3B1F7688218E848%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2871.56745555555555%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA32D4166D371C1B58CD8A6F8D0EF3DBF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g626C7FE0610F5A21B7FCC6F361F06C4A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.081%208.658%20C%202.418%208.658%201.8590001%208.424%201.378%207.9560003%20C%200.897%207.488%200.65000004%206.942%200.65000004%206.2790003%20C%200.65000004%205.837%200.975%205.512%201.378%205.512%20C%201.768%205.512%202.093%205.85%202.093%206.2400002%20C%202.093%206.669%201.781%206.968%201.365%206.968%20C%201.326%206.968%201.3000001%206.968%201.274%206.955%20C%201.521%207.592%202.093%208.151%202.9120002%208.151%20C%203.9780002%208.151%204.576%207.228%204.576%206.11%20C%204.576%205.2390003%204.1340003%204.303%203.25%203.315%20L%200.806%200.559%20C%200.637%200.36400002%200.65000004%200.377%200.65000004%200%20L%205.473%200%20L%205.85%202.3400002%20L%205.421%202.3400002%20C%205.317%201.677%205.2260003%201.3000001%205.1480002%201.183%20C%205.083%201.118%204.6930003%201.092%203.9780002%201.092%20L%201.807%201.092%20L%203.068%202.3270001%20C%203.9520001%203.1590002%205.07%204.056%205.447%204.745%20C%205.7070003%205.2000003%205.837%205.655%205.837%206.11%20C%205.837%207.644%204.6410003%208.658%203.081%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7A5F85FE66C6FD3E604C68F5A7949524%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.7573001%206.0424004%20C%202.3660002%205.6602%201.7836001%205.4691%200.9919%205.4691%20L%200.9919%205.0687003%20C%201.5288%205.0687003%201.9565%205.1506004%202.2841%205.3053%20L%202.2841%200.7735%20C%202.2841%200.6552%202.275%200.5824%202.2477%200.546%20C%202.2022002%200.44590002%201.9292%200.39130002%201.4287001%200.39130002%20L%201.0556%200.39130002%20L%201.0556%200%20L%202.6754%200.0364%20L%204.3043003%200%20L%204.3043003%200.39130002%20L%203.9312003%200.39130002%20C%203.4307%200.39130002%203.1577%200.44590002%203.1031%200.546%20C%203.0849001%200.5824%203.0758002%200.6552%203.0758002%200.7735%20L%203.0758002%205.7512%20C%203.0758002%205.9969%203.0394%206.0424004%202.7573001%206.0424004%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gFCDE359C75472195CEC97DC4B537C342%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%203.562%20L%205.369%203.562%20L%205.369%207.267%20C%205.369%207.4750004%205.2650003%207.579%205.057%207.579%20C%204.849%207.579%204.745%207.4750004%204.745%207.267%20L%204.745%203.562%20L%201.04%203.562%20C%200.832%203.562%200.72800004%203.4580002%200.72800004%203.25%20C%200.72800004%203.042%200.832%202.938%201.04%202.938%20L%204.745%202.938%20L%204.745%20-0.767%20C%204.745%20-0.975%204.849%20-1.079%205.057%20-1.079%20C%205.2650003%20-1.079%205.369%20-0.975%205.369%20-0.767%20L%205.369%202.938%20L%209.074%202.938%20C%209.282001%202.938%209.386001%203.042%209.386001%203.25%20C%209.386001%203.4190001%209.243%203.562%209.074%203.562%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g34A5C14ED9FB7DDEF99FAC79056D90F7%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.1567001%206.0606003%20C%201.6926%206.0606003%201.3013%205.8968%200.9646%205.5692%20C%200.6279%205.2416%200.455%204.8594003%200.455%204.3953004%20C%200.455%204.0859003%200.6825%203.8584%200.9646%203.8584%20C%201.2376001%203.8584%201.4651%204.0950003%201.4651%204.368%20C%201.4651%204.6683%201.2467%204.8776%200.95550007%204.8776%20C%200.92820007%204.8776%200.91%204.8776%200.89180005%204.8685%20C%201.0647%205.3144%201.4651%205.7057004%202.0384002%205.7057004%20C%202.7846%205.7057004%203.2032%205.0596004%203.2032%204.277%20C%203.2032%203.6673002%202.8938%203.0121002%202.275%202.3205001%20L%200.56420004%200.39130002%20C%200.44590002%200.25480002%200.455%200.2639%200.455%200%20L%203.8311002%200%20L%204.0950003%201.638%20L%203.7947001%201.638%20C%203.7219002%201.1739%203.6582003%200.91%203.6036003%200.8281%20C%203.5581002%200.78260005%203.2851002%200.7644%202.7846%200.7644%20L%201.2649001%200.7644%20L%202.1476002%201.6289%20C%202.7664%202.2113001%203.5490003%202.8392%203.8129%203.3215%20C%203.9949002%203.64%204.0859003%203.9585001%204.0859003%204.277%20C%204.0859003%205.3508%203.2487001%206.0606003%202.1567001%206.0606003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g80826852236079CD3B1F7688218E848%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0738001%202.8665001%20C%201.1193%202.8665001%201.1739%202.9029002%201.2194%202.9666002%20C%201.4924%203.3761%201.8655001%203.5763001%202.3387%203.5763001%20C%202.6572%203.5763001%202.9029002%203.3943002%203.0667002%203.0212002%20C%203.1668%202.7755%203.2214%202.4024%203.2214%201.9019%20C%203.2214%201.3286%203.1486%200.92820007%203.0121002%200.6916%20C%202.7846%200.3185%202.4752002%200.12740001%202.0839%200.12740001%20C%201.4742%200.12740001%200.9919%200.56420004%200.8281%201.0374%20C%200.8554%201.0283%200.8736%201.0374%200.91%201.0374%20C%201.1830001%201.0374%201.4105%201.2467%201.4105%201.5197%20C%201.4105%201.8018001%201.1830001%201.9929001%200.91%201.9929001%20C%200.59150004%201.9929001%200.455%201.82%200.455%201.4833001%20C%200.455%200.5733%201.1921%20-0.2002%202.1021001%20-0.2002%20C%202.6572%20-0.2002%203.1304002%200%203.5126002%200.4004%20C%203.8948002%200.8008%204.0859003%201.2831%204.0859003%201.8382001%20C%204.0859003%202.3660002%203.9312003%202.821%203.6218002%203.2123%20C%203.2851002%203.64%202.8665001%203.8493001%202.3569002%203.8493001%20C%201.9292%203.8493001%201.5561%203.7128003%201.2558%203.4398%20L%201.2558%205.0596004%20C%201.5015%204.9868%201.7381%204.9504004%201.9838%204.9504004%20C%202.4024%204.9504004%202.7664%205.0505004%203.0758002%205.2598004%20C%203.3579001%205.4327%203.5490003%205.6056004%203.6582003%205.7694%20C%203.7128003%205.8422003%203.7401001%205.8968%203.7401001%205.9241004%20C%203.7401001%206.0151005%203.6946%206.0606003%203.6036003%206.0606003%20C%203.1031%205.8695%202.6754%205.7694%202.3296%205.7694%20C%201.9201001%205.7694%201.5288%205.8513002%201.1557001%206.0242004%20C%201.1102%206.0424004%201.0738001%206.0515003%201.0374%206.0515003%20C%200.95550007%206.0515003%200.91%205.9696%200.91%205.7967%20L%200.91%203.1395001%20C%200.91%202.9484%200.91%202.8665001%201.0738001%202.8665001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA32D4166D371C1B58CD8A6F8D0EF3DBF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.2659001%20-0.2002%20C%203.5490003%20-0.2002%204.1860003%200.83720005%204.1860003%202.9120002%20C%204.1860003%204.3043003%203.8948002%205.2325%203.3215%205.6875%20C%203.003%205.9332004%202.6481001%206.0606003%202.275%206.0606003%20C%200.9919%206.0606003%200.3549%205.0141%200.3549%202.9120002%20C%200.3549%201.2376001%200.8008%20-0.2002%202.2659001%20-0.2002%20Z%20M%203.2851002%204.7684%20C%203.3488002%204.4499%203.3761%203.8675%203.3761%203.0212002%20C%203.3761%202.184%203.3397002%201.5652001%203.276%201.1648%20C%203.1577%200.4368%202.821%200.0728%202.2659001%200.0728%20C%202.0566%200.0728%201.8473%200.15470001%201.6562%200.30940002%20C%201.4105%200.5187%201.2649001%200.94640005%201.2012%201.6016%20C%201.1739%201.8291001%201.1648%202.3023%201.1648%203.0212002%20C%201.1648%203.8129%201.1921%204.368%201.2376001%204.6683%20C%201.3195001%205.1688004%201.4833001%205.4873004%201.7381%205.6238003%20C%201.9383001%205.7330003%202.1112%205.7876%202.2659001%205.7876%20C%202.8574002%205.7876%203.1850002%205.3053%203.2851002%204.7684%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 6.985950505050504em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;, which is equal
to 1125899911036930.&lt;&#x2F;p&gt;
&lt;p&gt;We can use our bitboards to compute setwise operations in &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2026.598000000000003%2021.878999999999998%22%20width%3D%2226.598000000000003pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD64B3975C9A5026604F20A029CCF2ADF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.984%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g71010E02B37BE1C0875AD8D94171F929%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.041%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g946CC60F6553DE6CBD049CD3C05E1499%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2821.541000000000004%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4D62189ABBC2948BAB13C269F5CB8E70%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD64B3975C9A5026604F20A029CCF2ADF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.126%203.4190001%20C%209.451%204.16%209.62%204.901%209.62%205.655%20C%209.62%206.669%209.321%207.501%208.71%208.1640005%20C%208.099%208.827001%207.293%209.165%206.2920003%209.165%20C%205.603%209.165%204.914%208.996%204.225%208.658%20C%202.821%207.9690003%201.794%206.8770003%201.131%205.395%20C%200.806%204.6670003%200.637%203.9390001%200.637%203.198%20C%200.637%202.171%200.936%201.339%201.547%200.689%20C%202.158%200.039%202.964%20-0.286%203.9780002%20-0.286%20C%204.6540003%20-0.286%205.33%20-0.117%206.019%200.208%20C%207.4360003%200.897%208.463%201.9760001%209.126%203.4190001%20Z%20M%208.372%206.162%20C%208.372%204.433%207.592%202.704%206.76%201.677%20C%206.188%200.962%205.2000003%200.156%204.056%200.156%20C%202.665%200.156%201.937%201.365%201.937%202.834%20C%201.937%203.289%202.028%203.9%202.197%204.6410003%20C%202.548%206.175%203.4320002%207.527%204.589%208.229%20C%205.1480002%208.567%205.6940002%208.736%206.214%208.736%20C%207.618%208.736%208.372%207.618%208.372%206.162%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g71010E02B37BE1C0875AD8D94171F929%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.1340003%20-3.224%20C%204.251%20-3.224%204.316%20-3.1590002%204.316%20-3.042%20C%204.316%20-3.003%204.29%20-2.951%204.251%20-2.8990002%20C%203.575%20-2.379%203.029%20-1.521%202.6260002%20-0.338%20C%202.275%200.689%202.093%201.7030001%202.093%202.704%20L%202.093%203.796%20C%202.093%204.797%202.275%205.8110003%202.6260002%206.8380003%20C%203.029%208.021%203.575%208.879%204.251%209.399%20C%204.29%209.438%204.316%209.49%204.316%209.542%20C%204.316%209.659%204.251%209.724%204.1340003%209.724%20C%204.1210003%209.724%204.0820003%209.711%204.043%209.685%20C%203.263%209.087%202.6130002%208.203%202.08%207.02%20C%201.5730001%205.889%201.3130001%204.823%201.3130001%203.796%20L%201.3130001%202.704%20C%201.3130001%201.677%201.5730001%200.611%202.08%20-0.52%20C%202.6130002%20-1.7030001%203.263%20-2.5870001%204.043%20-3.1850002%20C%204.0820003%20-3.211%204.1210003%20-3.224%204.1340003%20-3.224%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g946CC60F6553DE6CBD049CD3C05E1499%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.497%208.658%20C%202.964%208.112%202.184%207.839%201.1570001%207.839%20L%201.1570001%207.3320003%20C%201.8330001%207.3320003%202.392%207.4360003%202.821%207.644%20L%202.821%201.066%20C%202.821%200.832%202.769%200.676%202.652%200.611%20C%202.535%200.546%202.21%200.507%201.69%200.507%20L%201.235%200.507%20L%201.235%200%20C%201.5600001%200.026%202.262%200.039%203.341%200.039%20C%204.42%200.039%205.122%200.026%205.447%200%20L%205.447%200.507%20L%204.992%200.507%20C%204.459%200.507%204.1340003%200.546%204.03%200.611%20C%203.926%200.676%203.861%200.832%203.861%201.066%20L%203.861%208.268001%20C%203.861%208.58%203.835%208.658%203.497%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4D62189ABBC2948BAB13C269F5CB8E70%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.014%20-3.1850002%20C%201.794%20-2.5870001%202.444%20-1.7030001%202.977%20-0.52%20C%203.484%200.611%203.744%201.677%203.744%202.704%20L%203.744%203.796%20C%203.744%204.823%203.484%205.889%202.977%207.02%20C%202.444%208.203%201.794%209.087%201.014%209.685%20C%200.975%209.711%200.936%209.724%200.92300004%209.724%20C%200.806%209.724%200.741%209.659%200.741%209.542%20C%200.741%209.49%200.767%209.438%200.806%209.399%20C%201.482%208.879%202.028%208.021%202.431%206.8380003%20C%202.782%205.8110003%202.964%204.797%202.964%203.796%20L%202.964%202.704%20C%202.964%201.7030001%202.782%200.689%202.431%20-0.338%20C%202.028%20-1.521%201.482%20-2.379%200.806%20-2.8990002%20C%200.767%20-2.951%200.741%20-3.003%200.741%20-3.042%20C%200.741%20-3.1590002%200.806%20-3.224%200.92300004%20-3.224%20C%200.936%20-3.224%200.975%20-3.211%201.014%20-3.1850002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.418em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; time.
Here’s a short (but not exhaustive) list of operations we can do:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Mathematical representation&lt;&#x2F;th&gt;&lt;th&gt;Bitboard operation&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2034.39077777777778%2021.878999999999998%22%20width%3D%2234.39077777777778pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g8849D2DE368A2CDC46B1744159AC1EF7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2812.63888888888889%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB790B32E2ED273DD2C51049F16F6407B%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2824.198777777777778%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gDBA5A7858EF6D3D02E60480F1F5535EA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g8849D2DE368A2CDC46B1744159AC1EF7%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.781%200.039%20C%202.015%200.039%202.821%200%203.068%200%20C%203.263%200%203.354%200.104%203.354%200.299%20C%203.354%200.416%203.276%200.49400002%203.107%200.507%20C%202.73%200.52%202.548%200.65000004%202.548%200.897%20C%202.548%201.014%202.665%201.274%202.9120002%201.664%20C%203.263%202.249%203.51%202.678%203.6790001%202.964%20L%206.8380003%202.964%20C%206.8380003%202.8730001%206.8510003%202.691%206.8900003%202.405%20C%206.981%201.4560001%207.033%200.936%207.033%200.871%20C%207.033%200.624%206.747%200.507%206.162%200.507%20C%205.915%200.507%205.7980003%200.403%205.7980003%200.19500001%20C%205.7980003%200.065%205.876%200%206.032%200%20C%206.3440003%200%207.3320003%200.039%207.644%200.039%20C%207.9040003%200.039%208.827001%200%209.087%200%20C%209.282001%200%209.373%200.104%209.373%200.312%20C%209.373%200.442%209.2560005%200.507%209.022%200.507%20C%208.658%200.507%208.437%200.533%208.372%200.572%20C%208.307%200.611%208.255%200.72800004%208.242001%200.92300004%20L%207.4620004%208.957%20C%207.4230003%209.204%207.4360003%209.308001%207.163%209.308001%20C%207.007%209.308001%206.8770003%209.2300005%206.7860003%209.061%20L%202.3140001%201.5600001%20C%201.924%200.91%201.404%200.559%200.767%200.507%20C%200.559%200.49400002%200.455%200.39000002%200.455%200.19500001%20C%200.455%200.065%200.533%200%200.676%200%20C%200.884%200%201.5730001%200.039%201.781%200.039%20Z%20M%206.396%207.501%20L%206.7860003%203.471%20L%203.9910002%203.471%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB790B32E2ED273DD2C51049F16F6407B%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.342%20-0.26%20C%205.2390003%20-0.26%206.045%20-0.013%206.734%200.49400002%20C%207.501%201.053%207.8910003%201.768%207.8910003%202.639%20L%207.8910003%207.54%20C%207.8910003%207.748%207.787%207.852%207.579%207.852%20C%207.3840003%207.852%207.28%207.748%207.28%207.54%20L%207.28%202.639%20C%207.28%201.937%206.955%201.365%206.3050003%200.936%20C%205.7200003%200.546%205.07%200.351%204.342%200.351%20C%203.614%200.351%202.964%200.546%202.379%200.936%20C%201.7290001%201.365%201.404%201.937%201.404%202.639%20L%201.404%207.54%20C%201.404%207.748%201.3000001%207.852%201.105%207.852%20C%200.897%207.852%200.79300004%207.748%200.79300004%207.54%20L%200.79300004%202.639%20C%200.79300004%201.768%201.183%201.053%201.95%200.49400002%20C%202.639%20-0.013%203.4450002%20-0.26%204.342%20-0.26%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gDBA5A7858EF6D3D02E60480F1F5535EA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.828%207.059%20C%209.828%208.242001%208.658%208.879%207.3840003%208.879%20L%203.068%208.879%20C%202.769%208.879%202.639%208.866%202.639%208.567%20C%202.639%208.359%202.8990002%208.372%203.055%208.372%20C%203.4450002%208.359%203.6790001%208.333%203.744%208.32%20C%203.809%208.307%203.835%208.268001%203.835%208.203%20C%203.835%208.177%203.822%208.099%203.783%207.9690003%20L%202.0670002%201.066%20C%202.002%200.78000003%201.872%200.611%201.677%200.546%20C%201.5860001%200.52%201.352%200.507%200.949%200.507%20C%200.676%200.507%200.546%200.403%200.546%200.19500001%20C%200.546%200.065%200.676%200%200.949%200%20L%205.538%200%20C%206.383%200%207.163%200.26%207.9040003%200.767%20C%208.723001%201.326%209.139%202.015%209.139%202.821%20C%209.139%203.848%208.294001%204.472%207.3710003%204.6540003%20C%208.515%204.927%209.828%205.7980003%209.828%207.059%20Z%20M%207.202%208.372%20C%208.099%208.372%208.554%207.9560003%208.554%207.111%20C%208.554%206.448%208.294001%205.902%207.748%205.46%20C%207.202%205.018%206.591%204.81%205.928%204.81%20L%204.1210003%204.81%20L%204.901%207.9300003%20C%205.005%208.372%205.005%208.372%205.551%208.372%20Z%20M%207.566%203.887%20C%207.748%203.588%207.839%203.289%207.839%202.964%20C%207.839%202.288%207.579%201.7030001%207.046%201.222%20C%206.513%200.741%205.915%200.507%205.2260003%200.507%20L%203.471%200.507%20C%203.341%200.507%203.25%200.507%203.198%200.52%20C%203.1200001%200.52%203.081%200.546%203.081%200.58500004%20C%203.081%200.598%203.081%200.637%203.094%200.689%20C%203.497%202.3400002%203.809%203.588%204.017%204.42%20L%206.409%204.42%20C%206.968%204.42%207.3450003%204.238%207.566%203.887%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.1264343434343433em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;a | b&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2034.39077777777778%2021.878999999999998%22%20width%3D%2234.39077777777778pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g8849D2DE368A2CDC46B1744159AC1EF7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2812.63888888888889%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB790B32E2ED273DD2C51049F16F6407B%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2824.198777777777778%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gDBA5A7858EF6D3D02E60480F1F5535EA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g8849D2DE368A2CDC46B1744159AC1EF7%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.781%200.039%20C%202.015%200.039%202.821%200%203.068%200%20C%203.263%200%203.354%200.104%203.354%200.299%20C%203.354%200.416%203.276%200.49400002%203.107%200.507%20C%202.73%200.52%202.548%200.65000004%202.548%200.897%20C%202.548%201.014%202.665%201.274%202.9120002%201.664%20C%203.263%202.249%203.51%202.678%203.6790001%202.964%20L%206.8380003%202.964%20C%206.8380003%202.8730001%206.8510003%202.691%206.8900003%202.405%20C%206.981%201.4560001%207.033%200.936%207.033%200.871%20C%207.033%200.624%206.747%200.507%206.162%200.507%20C%205.915%200.507%205.7980003%200.403%205.7980003%200.19500001%20C%205.7980003%200.065%205.876%200%206.032%200%20C%206.3440003%200%207.3320003%200.039%207.644%200.039%20C%207.9040003%200.039%208.827001%200%209.087%200%20C%209.282001%200%209.373%200.104%209.373%200.312%20C%209.373%200.442%209.2560005%200.507%209.022%200.507%20C%208.658%200.507%208.437%200.533%208.372%200.572%20C%208.307%200.611%208.255%200.72800004%208.242001%200.92300004%20L%207.4620004%208.957%20C%207.4230003%209.204%207.4360003%209.308001%207.163%209.308001%20C%207.007%209.308001%206.8770003%209.2300005%206.7860003%209.061%20L%202.3140001%201.5600001%20C%201.924%200.91%201.404%200.559%200.767%200.507%20C%200.559%200.49400002%200.455%200.39000002%200.455%200.19500001%20C%200.455%200.065%200.533%200%200.676%200%20C%200.884%200%201.5730001%200.039%201.781%200.039%20Z%20M%206.396%207.501%20L%206.7860003%203.471%20L%203.9910002%203.471%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB790B32E2ED273DD2C51049F16F6407B%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.342%20-0.26%20C%205.2390003%20-0.26%206.045%20-0.013%206.734%200.49400002%20C%207.501%201.053%207.8910003%201.768%207.8910003%202.639%20L%207.8910003%207.54%20C%207.8910003%207.748%207.787%207.852%207.579%207.852%20C%207.3840003%207.852%207.28%207.748%207.28%207.54%20L%207.28%202.639%20C%207.28%201.937%206.955%201.365%206.3050003%200.936%20C%205.7200003%200.546%205.07%200.351%204.342%200.351%20C%203.614%200.351%202.964%200.546%202.379%200.936%20C%201.7290001%201.365%201.404%201.937%201.404%202.639%20L%201.404%207.54%20C%201.404%207.748%201.3000001%207.852%201.105%207.852%20C%200.897%207.852%200.79300004%207.748%200.79300004%207.54%20L%200.79300004%202.639%20C%200.79300004%201.768%201.183%201.053%201.95%200.49400002%20C%202.639%20-0.013%203.4450002%20-0.26%204.342%20-0.26%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gDBA5A7858EF6D3D02E60480F1F5535EA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.828%207.059%20C%209.828%208.242001%208.658%208.879%207.3840003%208.879%20L%203.068%208.879%20C%202.769%208.879%202.639%208.866%202.639%208.567%20C%202.639%208.359%202.8990002%208.372%203.055%208.372%20C%203.4450002%208.359%203.6790001%208.333%203.744%208.32%20C%203.809%208.307%203.835%208.268001%203.835%208.203%20C%203.835%208.177%203.822%208.099%203.783%207.9690003%20L%202.0670002%201.066%20C%202.002%200.78000003%201.872%200.611%201.677%200.546%20C%201.5860001%200.52%201.352%200.507%200.949%200.507%20C%200.676%200.507%200.546%200.403%200.546%200.19500001%20C%200.546%200.065%200.676%200%200.949%200%20L%205.538%200%20C%206.383%200%207.163%200.26%207.9040003%200.767%20C%208.723001%201.326%209.139%202.015%209.139%202.821%20C%209.139%203.848%208.294001%204.472%207.3710003%204.6540003%20C%208.515%204.927%209.828%205.7980003%209.828%207.059%20Z%20M%207.202%208.372%20C%208.099%208.372%208.554%207.9560003%208.554%207.111%20C%208.554%206.448%208.294001%205.902%207.748%205.46%20C%207.202%205.018%206.591%204.81%205.928%204.81%20L%204.1210003%204.81%20L%204.901%207.9300003%20C%205.005%208.372%205.005%208.372%205.551%208.372%20Z%20M%207.566%203.887%20C%207.748%203.588%207.839%203.289%207.839%202.964%20C%207.839%202.288%207.579%201.7030001%207.046%201.222%20C%206.513%200.741%205.915%200.507%205.2260003%200.507%20L%203.471%200.507%20C%203.341%200.507%203.25%200.507%203.198%200.52%20C%203.1200001%200.52%203.081%200.546%203.081%200.58500004%20C%203.081%200.598%203.081%200.637%203.094%200.689%20C%203.497%202.3400002%203.809%203.588%204.017%204.42%20L%206.409%204.42%20C%206.968%204.42%207.3450003%204.238%207.566%203.887%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 3.1264343434343433em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;a &amp;amp; b&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2030.771%2021.878999999999998%22%20width%3D%2230.771pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g8849D2DE368A2CDC46B1744159AC1EF7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.75%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7EAD5EE8A4A739285DF1779349137E0E%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2820.579%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gDBA5A7858EF6D3D02E60480F1F5535EA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g8849D2DE368A2CDC46B1744159AC1EF7%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.781%200.039%20C%202.015%200.039%202.821%200%203.068%200%20C%203.263%200%203.354%200.104%203.354%200.299%20C%203.354%200.416%203.276%200.49400002%203.107%200.507%20C%202.73%200.52%202.548%200.65000004%202.548%200.897%20C%202.548%201.014%202.665%201.274%202.9120002%201.664%20C%203.263%202.249%203.51%202.678%203.6790001%202.964%20L%206.8380003%202.964%20C%206.8380003%202.8730001%206.8510003%202.691%206.8900003%202.405%20C%206.981%201.4560001%207.033%200.936%207.033%200.871%20C%207.033%200.624%206.747%200.507%206.162%200.507%20C%205.915%200.507%205.7980003%200.403%205.7980003%200.19500001%20C%205.7980003%200.065%205.876%200%206.032%200%20C%206.3440003%200%207.3320003%200.039%207.644%200.039%20C%207.9040003%200.039%208.827001%200%209.087%200%20C%209.282001%200%209.373%200.104%209.373%200.312%20C%209.373%200.442%209.2560005%200.507%209.022%200.507%20C%208.658%200.507%208.437%200.533%208.372%200.572%20C%208.307%200.611%208.255%200.72800004%208.242001%200.92300004%20L%207.4620004%208.957%20C%207.4230003%209.204%207.4360003%209.308001%207.163%209.308001%20C%207.007%209.308001%206.8770003%209.2300005%206.7860003%209.061%20L%202.3140001%201.5600001%20C%201.924%200.91%201.404%200.559%200.767%200.507%20C%200.559%200.49400002%200.455%200.39000002%200.455%200.19500001%20C%200.455%200.065%200.533%200%200.676%200%20C%200.884%200%201.5730001%200.039%201.781%200.039%20Z%20M%206.396%207.501%20L%206.7860003%203.471%20L%203.9910002%203.471%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7EAD5EE8A4A739285DF1779349137E0E%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.867001%200%20C%2010.088%200%2010.205%200.052%2010.205%200.169%20L%205.7850003%209.048%20C%205.6940002%209.217%205.577%209.308001%205.408%209.308001%20C%205.2390003%209.308001%205.122%209.217%205.031%209.048%20L%200.676%200.32500002%20C%200.637%200.234%200.611%200.18200001%200.611%200.156%20C%200.611%200.052%200.72800004%200%200.949%200%20Z%20M%204.992%207.852%20L%208.372%201.079%20L%201.612%201.079%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gDBA5A7858EF6D3D02E60480F1F5535EA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.828%207.059%20C%209.828%208.242001%208.658%208.879%207.3840003%208.879%20L%203.068%208.879%20C%202.769%208.879%202.639%208.866%202.639%208.567%20C%202.639%208.359%202.8990002%208.372%203.055%208.372%20C%203.4450002%208.359%203.6790001%208.333%203.744%208.32%20C%203.809%208.307%203.835%208.268001%203.835%208.203%20C%203.835%208.177%203.822%208.099%203.783%207.9690003%20L%202.0670002%201.066%20C%202.002%200.78000003%201.872%200.611%201.677%200.546%20C%201.5860001%200.52%201.352%200.507%200.949%200.507%20C%200.676%200.507%200.546%200.403%200.546%200.19500001%20C%200.546%200.065%200.676%200%200.949%200%20L%205.538%200%20C%206.383%200%207.163%200.26%207.9040003%200.767%20C%208.723001%201.326%209.139%202.015%209.139%202.821%20C%209.139%203.848%208.294001%204.472%207.3710003%204.6540003%20C%208.515%204.927%209.828%205.7980003%209.828%207.059%20Z%20M%207.202%208.372%20C%208.099%208.372%208.554%207.9560003%208.554%207.111%20C%208.554%206.448%208.294001%205.902%207.748%205.46%20C%207.202%205.018%206.591%204.81%205.928%204.81%20L%204.1210003%204.81%20L%204.901%207.9300003%20C%205.005%208.372%205.005%208.372%205.551%208.372%20Z%20M%207.566%203.887%20C%207.748%203.588%207.839%203.289%207.839%202.964%20C%207.839%202.288%207.579%201.7030001%207.046%201.222%20C%206.513%200.741%205.915%200.507%205.2260003%200.507%20L%203.471%200.507%20C%203.341%200.507%203.25%200.507%203.198%200.52%20C%203.1200001%200.52%203.081%200.546%203.081%200.58500004%20C%203.081%200.598%203.081%200.637%203.094%200.689%20C%203.497%202.3400002%203.809%203.588%204.017%204.42%20L%206.409%204.42%20C%206.968%204.42%207.3450003%204.238%207.566%203.887%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.7973636363636363em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;a ^ b&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%209.75%2021.878999999999998%22%20width%3D%229.75pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g8849D2DE368A2CDC46B1744159AC1EF7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%204.199000000000001%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20class%3D%22typst-shape%22%20fill%3D%22none%22%20stroke%3D%22%23000000%22%20stroke-width%3D%220.624%22%20stroke-linecap%3D%22butt%22%20stroke-linejoin%3D%22miter%22%20stroke-miterlimit%3D%224%22%20d%3D%22M%200%200%20L%209.75%200%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g8849D2DE368A2CDC46B1744159AC1EF7%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.781%200.039%20C%202.015%200.039%202.821%200%203.068%200%20C%203.263%200%203.354%200.104%203.354%200.299%20C%203.354%200.416%203.276%200.49400002%203.107%200.507%20C%202.73%200.52%202.548%200.65000004%202.548%200.897%20C%202.548%201.014%202.665%201.274%202.9120002%201.664%20C%203.263%202.249%203.51%202.678%203.6790001%202.964%20L%206.8380003%202.964%20C%206.8380003%202.8730001%206.8510003%202.691%206.8900003%202.405%20C%206.981%201.4560001%207.033%200.936%207.033%200.871%20C%207.033%200.624%206.747%200.507%206.162%200.507%20C%205.915%200.507%205.7980003%200.403%205.7980003%200.19500001%20C%205.7980003%200.065%205.876%200%206.032%200%20C%206.3440003%200%207.3320003%200.039%207.644%200.039%20C%207.9040003%200.039%208.827001%200%209.087%200%20C%209.282001%200%209.373%200.104%209.373%200.312%20C%209.373%200.442%209.2560005%200.507%209.022%200.507%20C%208.658%200.507%208.437%200.533%208.372%200.572%20C%208.307%200.611%208.255%200.72800004%208.242001%200.92300004%20L%207.4620004%208.957%20C%207.4230003%209.204%207.4360003%209.308001%207.163%209.308001%20C%207.007%209.308001%206.8770003%209.2300005%206.7860003%209.061%20L%202.3140001%201.5600001%20C%201.924%200.91%201.404%200.559%200.767%200.507%20C%200.559%200.49400002%200.455%200.39000002%200.455%200.19500001%20C%200.455%200.065%200.533%200%200.676%200%20C%200.884%200%201.5730001%200.039%201.781%200.039%20Z%20M%206.396%207.501%20L%206.7860003%203.471%20L%203.9910002%203.471%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.8863636363636364em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;!a&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;&lt;strong&gt;Update 2023-06-22:&lt;&#x2F;strong&gt; I use Rust’s notation for &lt;code&gt;!a&lt;&#x2F;code&gt;. In C and C++, one
would use &lt;code&gt;~a&lt;&#x2F;code&gt; for the bitwise not operation.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;building-a-lookup-table&quot;&gt;Building a lookup table&lt;&#x2F;h3&gt;
&lt;p&gt;In order to get an &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2026.598000000000003%2021.878999999999998%22%20width%3D%2226.598000000000003pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD64B3975C9A5026604F20A029CCF2ADF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%289.984%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g71010E02B37BE1C0875AD8D94171F929%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2815.041%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g946CC60F6553DE6CBD049CD3C05E1499%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2821.541000000000004%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4D62189ABBC2948BAB13C269F5CB8E70%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD64B3975C9A5026604F20A029CCF2ADF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.126%203.4190001%20C%209.451%204.16%209.62%204.901%209.62%205.655%20C%209.62%206.669%209.321%207.501%208.71%208.1640005%20C%208.099%208.827001%207.293%209.165%206.2920003%209.165%20C%205.603%209.165%204.914%208.996%204.225%208.658%20C%202.821%207.9690003%201.794%206.8770003%201.131%205.395%20C%200.806%204.6670003%200.637%203.9390001%200.637%203.198%20C%200.637%202.171%200.936%201.339%201.547%200.689%20C%202.158%200.039%202.964%20-0.286%203.9780002%20-0.286%20C%204.6540003%20-0.286%205.33%20-0.117%206.019%200.208%20C%207.4360003%200.897%208.463%201.9760001%209.126%203.4190001%20Z%20M%208.372%206.162%20C%208.372%204.433%207.592%202.704%206.76%201.677%20C%206.188%200.962%205.2000003%200.156%204.056%200.156%20C%202.665%200.156%201.937%201.365%201.937%202.834%20C%201.937%203.289%202.028%203.9%202.197%204.6410003%20C%202.548%206.175%203.4320002%207.527%204.589%208.229%20C%205.1480002%208.567%205.6940002%208.736%206.214%208.736%20C%207.618%208.736%208.372%207.618%208.372%206.162%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g71010E02B37BE1C0875AD8D94171F929%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.1340003%20-3.224%20C%204.251%20-3.224%204.316%20-3.1590002%204.316%20-3.042%20C%204.316%20-3.003%204.29%20-2.951%204.251%20-2.8990002%20C%203.575%20-2.379%203.029%20-1.521%202.6260002%20-0.338%20C%202.275%200.689%202.093%201.7030001%202.093%202.704%20L%202.093%203.796%20C%202.093%204.797%202.275%205.8110003%202.6260002%206.8380003%20C%203.029%208.021%203.575%208.879%204.251%209.399%20C%204.29%209.438%204.316%209.49%204.316%209.542%20C%204.316%209.659%204.251%209.724%204.1340003%209.724%20C%204.1210003%209.724%204.0820003%209.711%204.043%209.685%20C%203.263%209.087%202.6130002%208.203%202.08%207.02%20C%201.5730001%205.889%201.3130001%204.823%201.3130001%203.796%20L%201.3130001%202.704%20C%201.3130001%201.677%201.5730001%200.611%202.08%20-0.52%20C%202.6130002%20-1.7030001%203.263%20-2.5870001%204.043%20-3.1850002%20C%204.0820003%20-3.211%204.1210003%20-3.224%204.1340003%20-3.224%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g946CC60F6553DE6CBD049CD3C05E1499%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.497%208.658%20C%202.964%208.112%202.184%207.839%201.1570001%207.839%20L%201.1570001%207.3320003%20C%201.8330001%207.3320003%202.392%207.4360003%202.821%207.644%20L%202.821%201.066%20C%202.821%200.832%202.769%200.676%202.652%200.611%20C%202.535%200.546%202.21%200.507%201.69%200.507%20L%201.235%200.507%20L%201.235%200%20C%201.5600001%200.026%202.262%200.039%203.341%200.039%20C%204.42%200.039%205.122%200.026%205.447%200%20L%205.447%200.507%20L%204.992%200.507%20C%204.459%200.507%204.1340003%200.546%204.03%200.611%20C%203.926%200.676%203.861%200.832%203.861%201.066%20L%203.861%208.268001%20C%203.861%208.58%203.835%208.658%203.497%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4D62189ABBC2948BAB13C269F5CB8E70%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.014%20-3.1850002%20C%201.794%20-2.5870001%202.444%20-1.7030001%202.977%20-0.52%20C%203.484%200.611%203.744%201.677%203.744%202.704%20L%203.744%203.796%20C%203.744%204.823%203.484%205.889%202.977%207.02%20C%202.444%208.203%201.794%209.087%201.014%209.685%20C%200.975%209.711%200.936%209.724%200.92300004%209.724%20C%200.806%209.724%200.741%209.659%200.741%209.542%20C%200.741%209.49%200.767%209.438%200.806%209.399%20C%201.482%208.879%202.028%208.021%202.431%206.8380003%20C%202.782%205.8110003%202.964%204.797%202.964%203.796%20L%202.964%202.704%20C%202.964%201.7030001%202.782%200.689%202.431%20-0.338%20C%202.028%20-1.521%201.482%20-2.379%200.806%20-2.8990002%20C%200.767%20-2.951%200.741%20-3.003%200.741%20-3.042%20C%200.741%20-3.1590002%200.806%20-3.224%200.92300004%20-3.224%20C%200.936%20-3.224%200.975%20-3.211%201.014%20-3.1850002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 2.418em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; computation of sliding moves, we can use a
lookup table to find precomputed values of the set of legal moves given
the starting square and occupancy bitboard of a board. There’s just one
problem: There are an enormous amount of possible occupancy maps,
roughly &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%2056.7463%2021.996%22%20width%3D%2256.7463pt%22%20height%3D%2221.996pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%202.8184000000000013%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2012.560599999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g102FFE04F5EC716B9045771162E4DFD9%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2813.728000000000002%206.060599999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g926D2660840F60BD26CB1948E0E27444%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2818.278%206.060599999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g83A6B6FF257ED71588483547005EE45F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2813.728000000000002%2018.410600000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC6909A185FA3625676D693EED70DCC0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2820.1526%2018.410600000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gCA92E2D93E33D1C6400CC9ADEA1BC327%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2827.2324%2018.410600000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g691260D45B674C5129C354630D9E7DE4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2833.138299999999994%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC7AD20454BEC732876152EDE59FA9AEB%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2840.392300000000006%2010.257%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g83A6B6FF257ED71588483547005EE45F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2844.942299999999996%2010.257%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4693E3A3EB6D2365B1DA5DB621129A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2841.73%2019.864%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC6909A185FA3625676D693EED70DCC0%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2850.7923%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g31CFB297CEF58BE5D1DA002DF62F6E89%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g102FFE04F5EC716B9045771162E4DFD9%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%200.72800004%209.269%20L%205.421%202.808%20L%200.871%20-2.821%20C%200.78000003%20-2.925%200.741%20-3.003%200.741%20-3.055%20C%200.741%20-3.1850002%200.871%20-3.25%201.144%20-3.25%20L%2011.869%20-3.25%20L%2013.0130005%200.065%20L%2012.571%200.065%20C%2012.402%20-0.42900002%2012.129001%20-0.85800004%2011.726%20-1.235%20C%2010.725%20-2.158%209.347%20-2.444%207.3450003%20-2.444%20L%201.9760001%20-2.444%20L%206.3700004%203.016%20C%206.461%203.1200001%206.5%203.198%206.5%203.25%20C%206.5%203.302%206.474%203.367%206.409%203.4580002%20L%202.275%209.126%20L%207.28%209.126%20C%208.866%209.126%209.932%208.983%2011.102%208.372%20C%2011.791%208.008%2012.272%207.4230003%2012.571%206.63%20L%2013.0130005%206.63%20L%2011.869%209.75%20L%201.144%209.75%20C%200.741%209.75%200.72800004%209.698%200.72800004%209.269%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g926D2660840F60BD26CB1948E0E27444%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.4479%206.0606003%20C%202.0748%205.6784%201.5288%205.4873004%200.80990005%205.4873004%20L%200.80990005%205.1324%20C%201.2831%205.1324%201.6744001%205.2052%201.9747001%205.3508%20L%201.9747001%200.7462%20C%201.9747001%200.5824%201.9383001%200.47320002%201.8564001%200.4277%20C%201.7745001%200.3822%201.547%200.3549%201.1830001%200.3549%20L%200.86450005%200.3549%20L%200.86450005%200%20C%201.092%200.0182%201.5834%200.0273%202.3387%200.0273%20C%203.094%200.0273%203.5854%200.0182%203.8129%200%20L%203.8129%200.3549%20L%203.4944%200.3549%20C%203.1213002%200.3549%202.8938%200.3822%202.821%200.4277%20C%202.7482002%200.47320002%202.7027001%200.5824%202.7027001%200.7462%20L%202.7027001%205.7876%20C%202.7027001%206.006%202.6845002%206.0606003%202.4479%206.0606003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g83A6B6FF257ED71588483547005EE45F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.4853%204.5864%20C%203.7856002%204.5864%203.9312003%204.7411003%203.9312003%205.0505004%20C%203.9312003%205.7057004%203.4398%206.0606003%202.7664%206.0606003%20C%202.0111%206.0606003%201.4105%205.7057004%200.9646%204.9868%20C%200.5733%204.368%200.3822%203.6673002%200.3822%202.8756%20C%200.3822%201.7199%200.59150004%200.91%201.0192001%200.4277%20C%201.3832%200.0091%201.8018001%20-0.2002%202.2841%20-0.2002%20C%202.8392%20-0.2002%203.2942002%200.0091%203.6491%200.4277%20C%203.9858003%200.8281%204.1587%201.3104%204.1587%201.8655001%20C%204.1587%202.4206002%203.9949002%202.8938%203.6673002%203.2851002%20C%203.3215%203.7037%202.8756%203.9221%202.3387%203.9221%20C%201.8655001%203.9221%201.5015%203.6582003%201.2558%203.1486%20L%201.2558%203.2032%20C%201.2558%204.2315%201.5106001%205.1051%202.0566%205.5055003%20C%202.2932%205.6784%202.5389001%205.7603%202.7846%205.7603%20C%203.1122%205.7603%203.3488002%205.6693%203.5035002%205.4782004%20C%203.1941001%205.4782004%203.0394%205.3053%203.0394%205.0323%20C%203.0394%204.7775%203.2305002%204.5864%203.4853%204.5864%20Z%20M%203.1304002%203.094%20C%203.2305002%202.8847%203.2851002%202.4752002%203.2851002%201.8746%20C%203.2851002%201.2831%203.2396002%200.89180005%203.1395001%200.6916%20C%202.9575002%200.3185%202.6754%200.12740001%202.2841%200.12740001%20C%202.0202%200.12740001%201.82%200.2184%201.6744001%200.4004%20C%201.5561%200.546%201.4742%200.67340004%201.4378%200.7735%20C%201.3286%201.0556%201.274%201.4833001%201.274%202.0657%20C%201.274%202.3205001%201.3104%202.5662%201.3741001%202.8028002%20C%201.4924%203.2305002%201.8291001%203.6309001%202.3296%203.6309001%20C%202.6845002%203.6309001%202.9575002%203.4489002%203.1304002%203.094%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC6909A185FA3625676D693EED70DCC0%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.4924%204.0131%20C%201.1921%204.0131%200.94640005%203.8493001%200.75530005%203.5126002%20C%200.6279%203.2851002%200.5278%203.0485%200.46410003%202.7846%20C%200.4368%202.6845002%200.4277%202.6299002%200.4277%202.6117%20C%200.4277%202.5116%200.49140003%202.457%200.61880004%202.457%20C%200.7917%202.457%200.8008%202.5571%200.8463%202.7482002%20C%201.001%203.3761%201.2103001%203.6946%201.4742%203.6946%20C%201.6471001%203.6946%201.7290001%203.5581002%201.7290001%203.2851002%20C%201.7290001%203.1850002%201.6835%202.9484%201.5834%202.5571%20L%201.1011001%200.6097%20C%201.0374%200.36400002%201.0101%200.23660001%201.0101%200.2275%20C%201.0101%200.0182%201.1284001%20-0.091000006%201.3559%20-0.091000006%20C%201.5288%20-0.091000006%201.6562%20-0.0182%201.7381%200.12740001%20C%201.7654%200.18200001%201.82%200.3731%201.9019%200.6916%20L%202.0930002%201.4924%20C%202.2022002%201.9201001%202.2659001%202.1567001%202.2841%202.2113001%20C%202.3569002%202.4479%202.4661002%202.6754%202.6208%202.8847%20C%203.003%203.4216%203.4398%203.6946%203.9403002%203.6946%20C%204.2679%203.6946%204.4317%203.4944%204.4317%203.1031%20C%204.4317%202.7482002%204.2588%202.1203%203.9039001%201.2103001%20C%203.8129%200.97370005%203.7674003%200.80990005%203.7674003%200.7098%20C%203.7674003%200.2184%204.1678%20-0.091000006%204.6592%20-0.091000006%20C%205.0869%20-0.091000006%205.4327%200.12740001%205.6784%200.56420004%20C%205.8877%200.9373%205.9878%201.1830001%205.9878%201.3104%20C%205.9878%201.4105%205.9241004%201.4651%205.8058004%201.4651%20C%205.7421002%201.4560001%205.6784%201.4105%205.6147003%201.3195001%20C%205.6056004%201.3104%205.6056004%201.2922001%205.6056004%201.2831%20C%205.3963003%200.5824%205.0869%200.2275%204.6865%200.2275%20C%204.5591%200.2275%204.4954%200.3185%204.4954%200.50960004%20C%204.4954%200.637%204.5682%200.8736%204.7047%201.2194%20C%205.0232%202.0293%205.1779003%202.6117%205.1779003%202.9575002%20C%205.1779003%203.3761%205.0323%203.6673002%204.7502003%203.8220003%20C%204.5227003%203.9494002%204.2588%204.0131%203.9767%204.0131%20C%203.3852%204.0131%202.8847%203.7583%202.4843001%203.2487001%20C%202.4024%203.6946%202.0111%204.0131%201.4924%204.0131%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gCA92E2D93E33D1C6400CC9ADEA1BC327%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.3518004%203.3397002%20L%200.72800004%203.3397002%20C%200.5824%203.3397002%200.50960004%203.2669%200.50960004%203.1304002%20C%200.50960004%202.9939%200.5824%202.9211001%200.72800004%202.9211001%20L%206.3518004%202.9211001%20C%206.4974003%202.9211001%206.5702004%202.9939%206.5702004%203.1304002%20C%206.5702004%203.2396002%206.4701004%203.3397002%206.3518004%203.3397002%20Z%20M%206.3518004%201.6289%20L%200.72800004%201.6289%20C%200.5824%201.6289%200.50960004%201.5561%200.50960004%201.4196%20C%200.50960004%201.2831%200.5824%201.2103001%200.72800004%201.2103001%20L%206.3518004%201.2103001%20C%206.4974003%201.2103001%206.5702004%201.2831%206.5702004%201.4196%20C%206.5702004%201.5379001%206.4701004%201.6289%206.3518004%201.6289%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g691260D45B674C5129C354630D9E7DE4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.2123%203.2123%20C%203.8220003%203.4580002%204.4044003%203.9949002%204.4044003%204.7684%20C%204.4044003%205.1779003%204.1860003%205.5055003%203.7583%205.7421002%20C%203.4034002%205.9423003%203.003%206.0424004%202.5571%206.0424004%20C%202.1112%206.0424004%201.7199%205.9514003%201.3832%205.7603%20C%200.97370005%205.5328%200.7644%205.2143%200.7644%204.8048%20C%200.7644%204.459%200.9373%204.2861004%201.274%204.2861004%20C%201.5561%204.2861004%201.7654%204.5045004%201.7654%204.7866%20C%201.7654%205.0687003%201.6198001%205.2325%201.3377%205.2780004%20C%201.6016%205.5601%201.9929001%205.7057004%202.5298002%205.7057004%20C%203.1213002%205.7057004%203.4580002%205.3508%203.4580002%204.7684%20C%203.4580002%204.3407%203.3397002%203.9949002%203.1122%203.7219002%20C%202.8574002%203.4216%202.6754%203.3761%202.1476002%203.3397002%20C%201.9019%203.3215%201.7381%203.3488002%201.7381%203.1668%20C%201.7381%203.0576%201.8291001%203.003%202.002%203.003%20L%202.4843001%203.003%20C%203.2669%203.003%203.6491%202.4115002%203.6491%201.5925001%20C%203.6491%200.7917%203.2851002%200.18200001%202.5207002%200.18200001%20C%201.8564001%200.18200001%201.3741001%200.36400002%201.0738001%200.7371%20C%201.3923%200.7735%201.5561%200.95550007%201.5561%201.274%20C%201.5561%201.5743%201.3286%201.8018001%201.0283%201.8018001%20C%200.67340004%201.8018001%200.49140003%201.6198001%200.49140003%201.2467%20C%200.49140003%200.78260005%200.72800004%200.4095%201.1921%200.1456%20C%201.5834%20-0.0728%202.0293%20-0.18200001%202.5389001%20-0.18200001%20C%203.094%20-0.18200001%203.5763001%20-0.0273%203.9949002%200.28210002%20C%204.4499%200.61880004%204.6774%201.0556%204.6774%201.5925001%20C%204.6774%202.4388%203.9403002%203.0212002%203.2123%203.2123%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC7AD20454BEC732876152EDE59FA9AEB%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.94%20-4.511%20C%205.07%20-4.511%205.135%20-4.446%205.135%20-4.316%20C%205.135%20-4.251%205.109%20-4.199%205.07%20-4.16%20C%204.277%20-3.549%203.64%20-2.548%203.1590002%20-1.144%20C%202.743%200.065%202.535%201.261%202.535%202.418%20L%202.535%204.0820003%20C%202.535%205.2390003%202.743%206.435%203.1590002%207.644%20C%203.64%209.048%204.277%2010.049%205.07%2010.66%20C%205.109%2010.699%205.135%2010.751%205.135%2010.816%20C%205.135%2010.946%205.07%2011.011001%204.94%2011.011001%20C%204.914%2011.011001%204.875%2010.998%204.836%2010.972%20C%203.926%2010.283%203.1720002%209.243%202.5740001%207.852%20C%201.9890001%206.539%201.7030001%205.278%201.7030001%204.0820003%20L%201.7030001%202.418%20C%201.7030001%201.222%201.9890001%20-0.039%202.5740001%20-1.352%20C%203.1720002%20-2.743%203.926%20-3.783%204.836%20-4.472%20C%204.875%20-4.498%204.914%20-4.511%204.94%20-4.511%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4693E3A3EB6D2365B1DA5DB621129A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.2123%206.1607003%20C%203.1304002%206.1607003%203.0576%206.1152%203.003%206.0333004%20L%200.25480002%201.8109001%20L%200.25480002%201.4833001%20L%202.6299002%201.4833001%20L%202.6299002%200.7371%20C%202.6299002%200.5733%202.5935001%200.46410003%202.5298002%200.41860002%20C%202.4661002%200.3731%202.2932%200.3549%201.9929001%200.3549%20L%201.7654%200.3549%20L%201.7654%200%20C%202.0293%200.0182%202.4479%200.0273%203.0121002%200.0273%20C%203.5763001%200.0273%203.9949002%200.0182%204.2588%200%20L%204.2588%200.3549%20L%204.0313%200.3549%20C%203.7310002%200.3549%203.5581002%200.3731%203.4944%200.41860002%20C%203.4307%200.46410003%203.3943002%200.5733%203.3943002%200.7371%20L%203.3943002%201.4833001%20L%204.2861004%201.4833001%20L%204.2861004%201.8382001%20L%203.3943002%201.8382001%20L%203.3943002%206.006%20C%203.3943002%206.097%203.3306%206.1607003%203.2123%206.1607003%20Z%20M%202.6845002%205.0323%20L%202.6845002%201.8382001%20L%200.6097%201.8382001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g31CFB297CEF58BE5D1DA002DF62F6E89%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.118%20-4.472%20C%202.028%20-3.783%202.782%20-2.743%203.38%20-1.352%20C%203.9650002%20-0.039%204.251%201.222%204.251%202.418%20L%204.251%204.0820003%20C%204.251%205.278%203.9650002%206.539%203.38%207.852%20C%202.782%209.243%202.028%2010.283%201.118%2010.972%20C%201.079%2010.998%201.04%2011.011001%201.014%2011.011001%20C%200.884%2011.011001%200.819%2010.946%200.819%2010.816%20C%200.819%2010.751%200.845%2010.699%200.884%2010.66%20C%201.677%2010.049%202.3140001%209.048%202.795%207.644%20C%203.211%206.435%203.4190001%205.2390003%203.4190001%204.0820003%20L%203.4190001%202.418%20C%203.4190001%201.261%203.211%200.065%202.795%20-1.144%20C%202.3140001%20-2.548%201.677%20-3.549%200.884%20-4.16%20C%200.845%20-4.199%200.819%20-4.251%200.819%20-4.316%20C%200.819%20-4.446%200.884%20-4.511%201.014%20-4.511%20C%201.04%20-4.511%201.079%20-4.498%201.118%20-4.472%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.6015454545454545em; width: 5.158754545454546em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; possible
occupancies containing at least two kings and a sliding piece, or about
700 trillion total boards. To store an 8-byte bitboard for every square
and occupancy would require roughly 365 PB of data!&lt;&#x2F;p&gt;
&lt;p&gt;We can use a nice trick to reduce our data consumption, though. In our
naive algorithm for sliding move generation, we only needed to examine
whether the squares that we wanted our piece to move to were occupied -
other squares not on the same ray were irrelevant. We can do the same:
we can somehow extract out the relevant occupancies for any square’s
move generation.&lt;&#x2F;p&gt;
&lt;p&gt;For example, these are the only relevant squares for the set of legal
moves for a rook on E4:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; class=&quot;language-text z-code&quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;8 |  .  .  .  .  .  .  .  .
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;7 |  .  .  .  .  x  .  .  .
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;6 |  .  .  .  .  x  .  .  .
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;5 |  .  .  .  .  x  .  .  .
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;4 |  .  x  x  x  .  x  x  .
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;3 |  .  .  .  .  x  .  .  .
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;2 |  .  .  .  .  x  .  .  .
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;1 |  .  .  .  .  .  .  .  .
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;--+------------------------
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  |  A  B  C  D  E  F  G  H
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Update 2023-06-22&lt;&#x2F;strong&gt;: We can safely ignore those squares on the edge of
the board because they actually don’t affect what our rook can “see.”
For instance, the rook will be able to to see H4 if F4 and G4 are empty,
but whether H4 is empty does not affect whether the rook can see H4.
Once we have the set of squares the rook can see, we can convert that to
the set of squares the rook can move to by masking out all pieces of the
same color as the rook.&lt;&#x2F;p&gt;
&lt;p&gt;For each square, then, we only need to consider a small handful of
occupied spots. All we need to do is store a lookup for every
&lt;code&gt;(square, relevant_occupancy)&lt;&#x2F;code&gt; pair, which is far smaller than the
previous requirement.&lt;&#x2F;p&gt;
&lt;p&gt;There are at most 9 relevant occupancy bits for a bishop and 12 bits for
a rook, so the total memory requirement for this lookup table is less
than 2.4 MB. If we break out the single master lookup table into a
unique lookup table for each attacker type and starter square, we can
get a smaller total memory consumption at only 861 kB.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;where-the-magic-happens&quot;&gt;Where the magic happens&lt;&#x2F;h3&gt;
&lt;p&gt;However, we still have to be able to convert an occupancy bitboard into
an index. What we really want to do is to take our masked out bits and
extract them into an index. On x86 architectures, the &lt;code&gt;pext&lt;&#x2F;code&gt; instruction
is exactly designed to do this, but if we want it to work on any
architecture, we’ll have to be a little more clever than that.&lt;&#x2F;p&gt;
&lt;p&gt;I’ll start with a magic example, and we’ll see if that can enlighten us.
Suppose we want to extract the relevant occupancy for a bishop on B2.&lt;&#x2F;p&gt;
&lt;p&gt;Take the original masked occupancy bitboard, &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%209.984%2021.878999999999998%22%20width%3D%229.984pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD64B3975C9A5026604F20A029CCF2ADF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD64B3975C9A5026604F20A029CCF2ADF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.126%203.4190001%20C%209.451%204.16%209.62%204.901%209.62%205.655%20C%209.62%206.669%209.321%207.501%208.71%208.1640005%20C%208.099%208.827001%207.293%209.165%206.2920003%209.165%20C%205.603%209.165%204.914%208.996%204.225%208.658%20C%202.821%207.9690003%201.794%206.8770003%201.131%205.395%20C%200.806%204.6670003%200.637%203.9390001%200.637%203.198%20C%200.637%202.171%200.936%201.339%201.547%200.689%20C%202.158%200.039%202.964%20-0.286%203.9780002%20-0.286%20C%204.6540003%20-0.286%205.33%20-0.117%206.019%200.208%20C%207.4360003%200.897%208.463%201.9760001%209.126%203.4190001%20Z%20M%208.372%206.162%20C%208.372%204.433%207.592%202.704%206.76%201.677%20C%206.188%200.962%205.2000003%200.156%204.056%200.156%20C%202.665%200.156%201.937%201.365%201.937%202.834%20C%201.937%203.289%202.028%203.9%202.197%204.6410003%20C%202.548%206.175%203.4320002%207.527%204.589%208.229%20C%205.1480002%208.567%205.6940002%208.736%206.214%208.736%20C%207.618%208.736%208.372%207.618%208.372%206.162%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.9076363636363637em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;text&quot; class=&quot;language-text z-code&quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;8 |  .  .  .  .  .  .  .  .
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;7 |  .  .  .  .  .  .  .  .
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;6 |  .  .  .  .  .  .  b5 .
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;5 |  .  .  .  .  .  b4 .  .
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;4 |  .  .  .  .  b3 .  .  .
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;3 |  .  .  .  b2 .  .  .  .
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;2 |  .  .  b1 .  .  .  .  .
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;1 |  .  .  .  .  .  .  .  .
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;--+------------------------
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  |  A  B  C  D  E  F  G  H
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Observe that
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%20230.06013333333334%2021.878999999999998%22%20width%3D%22230.06013333333334pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD64B3975C9A5026604F20A029CCF2ADF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2813.59511111111111%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g537FBDF575D6B4DBC59EE2318104781F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2827.320222222222224%206.5%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.577%2012.09%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g7A5F85FE66C6FD3E604C68F5A7949524%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2811.482899999999999%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2817.9829%204.16%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g926D2660840F60BD26CB1948E0E27444%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2822.532899999999998%204.16%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA32D4166D371C1B58CD8A6F8D0EF3DBF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2830.69978888888889%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFCDE359C75472195CEC97DC4B537C342%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2871.0229%206.5%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.577%2012.09%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g86111C2D5C8682C53BDA9AD6152C9992%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2811.482899999999999%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2817.9829%204.16%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g926D2660840F60BD26CB1948E0E27444%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2822.532899999999998%204.16%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g622CA137E75F1C7B312DB93983F80BDA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2830.69978888888889%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFCDE359C75472195CEC97DC4B537C342%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28114.72557777777777%206.5%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.577%2012.09%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g691260D45B674C5129C354630D9E7DE4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2811.482899999999999%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2817.9829%204.16%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g34A5C14ED9FB7DDEF99FAC79056D90F7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2822.532899999999998%204.16%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g73DDEFD92CAF7F9CE53BD9659E569F6F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2830.69978888888889%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFCDE359C75472195CEC97DC4B537C342%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28158.42825555555555%206.5%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%285.577%2012.09%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g39B2656344CBB5F9460DA2DEEFEF16D9%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2811.482899999999999%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2817.9829%204.16%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g8281AF5184639F2042386F3390791180%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2822.532899999999998%204.16%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9E20F0F1E2099437CD7306AC659F3A2F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2830.818088888888884%208.879%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFCDE359C75472195CEC97DC4B537C342%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28202.24923333333334%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gB2B0D162BF0EF17F805166E1C67260EF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28207.82623333333333%2018.590000000000003%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g70E4B5E4F67BC2556F05873B39EAD917%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28213.73213333333337%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28220.23213333333337%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4693E3A3EB6D2365B1DA5DB621129A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28224.78213333333335%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g83A6B6FF257ED71588483547005EE45F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD64B3975C9A5026604F20A029CCF2ADF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.126%203.4190001%20C%209.451%204.16%209.62%204.901%209.62%205.655%20C%209.62%206.669%209.321%207.501%208.71%208.1640005%20C%208.099%208.827001%207.293%209.165%206.2920003%209.165%20C%205.603%209.165%204.914%208.996%204.225%208.658%20C%202.821%207.9690003%201.794%206.8770003%201.131%205.395%20C%200.806%204.6670003%200.637%203.9390001%200.637%203.198%20C%200.637%202.171%200.936%201.339%201.547%200.689%20C%202.158%200.039%202.964%20-0.286%203.9780002%20-0.286%20C%204.6540003%20-0.286%205.33%20-0.117%206.019%200.208%20C%207.4360003%200.897%208.463%201.9760001%209.126%203.4190001%20Z%20M%208.372%206.162%20C%208.372%204.433%207.592%202.704%206.76%201.677%20C%206.188%200.962%205.2000003%200.156%204.056%200.156%20C%202.665%200.156%201.937%201.365%201.937%202.834%20C%201.937%203.289%202.028%203.9%202.197%204.6410003%20C%202.548%206.175%203.4320002%207.527%204.589%208.229%20C%205.1480002%208.567%205.6940002%208.736%206.214%208.736%20C%207.618%208.736%208.372%207.618%208.372%206.162%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g537FBDF575D6B4DBC59EE2318104781F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%204.771%20L%201.04%204.771%20C%200.832%204.771%200.72800004%204.6670003%200.72800004%204.472%20C%200.72800004%204.277%200.832%204.173%201.04%204.173%20L%209.074%204.173%20C%209.282001%204.173%209.386001%204.277%209.386001%204.472%20C%209.386001%204.6280003%209.243%204.771%209.074%204.771%20Z%20M%209.074%202.3270001%20L%201.04%202.3270001%20C%200.832%202.3270001%200.72800004%202.223%200.72800004%202.028%20C%200.72800004%201.8330001%200.832%201.7290001%201.04%201.7290001%20L%209.074%201.7290001%20C%209.282001%201.7290001%209.386001%201.8330001%209.386001%202.028%20C%209.386001%202.197%209.243%202.3270001%209.074%202.3270001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gB2B0D162BF0EF17F805166E1C67260EF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.653%205.7850003%20C%203.1850002%205.7850003%202.717%205.564%202.262%205.122%20L%203.1590002%208.827001%20C%203.1330001%208.944%203.094%209.022%202.938%209.022%20C%202.509%209.022%201.5600001%208.905%201.391%208.892%20C%201.196%208.866%201.092%208.775001%201.092%208.58%20C%201.092%208.45%201.209%208.385%201.4560001%208.385%20C%201.7030001%208.385%202.0410001%208.398%202.0410001%208.216001%20C%202.0410001%208.1640005%201.9760001%207.9040003%201.8590001%207.4230003%20L%200.819%203.237%20C%200.676%202.691%200.611%202.249%200.611%201.924%20C%200.611%200.806%201.209%20-0.143%202.275%20-0.143%20C%203.1200001%20-0.143%203.861%200.286%204.511%201.1570001%20C%205.096%201.963%205.395%202.808%205.395%203.6790001%20C%205.395%204.81%204.732%205.7850003%203.653%205.7850003%20Z%20M%203.627%205.395%20C%204.1340003%205.395%204.381%205.005%204.381%204.238%20C%204.381%203.887%204.303%203.4190001%204.1470003%202.834%20C%203.861%201.7290001%203.484%200.975%203.029%200.572%20C%202.769%200.351%202.522%200.24700001%202.275%200.24700001%20C%201.742%200.24700001%201.482%200.663%201.482%201.495%20C%201.482%201.781%201.547%202.21%201.677%202.782%20L%201.963%203.9520001%20C%202.002%204.1470003%202.0670002%204.29%202.145%204.394%20C%202.652%205.057%203.1460001%205.395%203.627%205.395%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g7A5F85FE66C6FD3E604C68F5A7949524%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.7573001%206.0424004%20C%202.3660002%205.6602%201.7836001%205.4691%200.9919%205.4691%20L%200.9919%205.0687003%20C%201.5288%205.0687003%201.9565%205.1506004%202.2841%205.3053%20L%202.2841%200.7735%20C%202.2841%200.6552%202.275%200.5824%202.2477%200.546%20C%202.2022002%200.44590002%201.9292%200.39130002%201.4287001%200.39130002%20L%201.0556%200.39130002%20L%201.0556%200%20L%202.6754%200.0364%20L%204.3043003%200%20L%204.3043003%200.39130002%20L%203.9312003%200.39130002%20C%203.4307%200.39130002%203.1577%200.44590002%203.1031%200.546%20C%203.0849001%200.5824%203.0758002%200.6552%203.0758002%200.7735%20L%203.0758002%205.7512%20C%203.0758002%205.9969%203.0394%206.0424004%202.7573001%206.0424004%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g626C7FE0610F5A21B7FCC6F361F06C4A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.081%208.658%20C%202.418%208.658%201.8590001%208.424%201.378%207.9560003%20C%200.897%207.488%200.65000004%206.942%200.65000004%206.2790003%20C%200.65000004%205.837%200.975%205.512%201.378%205.512%20C%201.768%205.512%202.093%205.85%202.093%206.2400002%20C%202.093%206.669%201.781%206.968%201.365%206.968%20C%201.326%206.968%201.3000001%206.968%201.274%206.955%20C%201.521%207.592%202.093%208.151%202.9120002%208.151%20C%203.9780002%208.151%204.576%207.228%204.576%206.11%20C%204.576%205.2390003%204.1340003%204.303%203.25%203.315%20L%200.806%200.559%20C%200.637%200.36400002%200.65000004%200.377%200.65000004%200%20L%205.473%200%20L%205.85%202.3400002%20L%205.421%202.3400002%20C%205.317%201.677%205.2260003%201.3000001%205.1480002%201.183%20C%205.083%201.118%204.6930003%201.092%203.9780002%201.092%20L%201.807%201.092%20L%203.068%202.3270001%20C%203.9520001%203.1590002%205.07%204.056%205.447%204.745%20C%205.7070003%205.2000003%205.837%205.655%205.837%206.11%20C%205.837%207.644%204.6410003%208.658%203.081%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g926D2660840F60BD26CB1948E0E27444%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.4479%206.0606003%20C%202.0748%205.6784%201.5288%205.4873004%200.80990005%205.4873004%20L%200.80990005%205.1324%20C%201.2831%205.1324%201.6744001%205.2052%201.9747001%205.3508%20L%201.9747001%200.7462%20C%201.9747001%200.5824%201.9383001%200.47320002%201.8564001%200.4277%20C%201.7745001%200.3822%201.547%200.3549%201.1830001%200.3549%20L%200.86450005%200.3549%20L%200.86450005%200%20C%201.092%200.0182%201.5834%200.0273%202.3387%200.0273%20C%203.094%200.0273%203.5854%200.0182%203.8129%200%20L%203.8129%200.3549%20L%203.4944%200.3549%20C%203.1213002%200.3549%202.8938%200.3822%202.821%200.4277%20C%202.7482002%200.47320002%202.7027001%200.5824%202.7027001%200.7462%20L%202.7027001%205.7876%20C%202.7027001%206.006%202.6845002%206.0606003%202.4479%206.0606003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA32D4166D371C1B58CD8A6F8D0EF3DBF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.2659001%20-0.2002%20C%203.5490003%20-0.2002%204.1860003%200.83720005%204.1860003%202.9120002%20C%204.1860003%204.3043003%203.8948002%205.2325%203.3215%205.6875%20C%203.003%205.9332004%202.6481001%206.0606003%202.275%206.0606003%20C%200.9919%206.0606003%200.3549%205.0141%200.3549%202.9120002%20C%200.3549%201.2376001%200.8008%20-0.2002%202.2659001%20-0.2002%20Z%20M%203.2851002%204.7684%20C%203.3488002%204.4499%203.3761%203.8675%203.3761%203.0212002%20C%203.3761%202.184%203.3397002%201.5652001%203.276%201.1648%20C%203.1577%200.4368%202.821%200.0728%202.2659001%200.0728%20C%202.0566%200.0728%201.8473%200.15470001%201.6562%200.30940002%20C%201.4105%200.5187%201.2649001%200.94640005%201.2012%201.6016%20C%201.1739%201.8291001%201.1648%202.3023%201.1648%203.0212002%20C%201.1648%203.8129%201.1921%204.368%201.2376001%204.6683%20C%201.3195001%205.1688004%201.4833001%205.4873004%201.7381%205.6238003%20C%201.9383001%205.7330003%202.1112%205.7876%202.2659001%205.7876%20C%202.8574002%205.7876%203.1850002%205.3053%203.2851002%204.7684%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gFCDE359C75472195CEC97DC4B537C342%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%203.562%20L%205.369%203.562%20L%205.369%207.267%20C%205.369%207.4750004%205.2650003%207.579%205.057%207.579%20C%204.849%207.579%204.745%207.4750004%204.745%207.267%20L%204.745%203.562%20L%201.04%203.562%20C%200.832%203.562%200.72800004%203.4580002%200.72800004%203.25%20C%200.72800004%203.042%200.832%202.938%201.04%202.938%20L%204.745%202.938%20L%204.745%20-0.767%20C%204.745%20-0.975%204.849%20-1.079%205.057%20-1.079%20C%205.2650003%20-1.079%205.369%20-0.975%205.369%20-0.767%20L%205.369%202.938%20L%209.074%202.938%20C%209.282001%202.938%209.386001%203.042%209.386001%203.25%20C%209.386001%203.4190001%209.243%203.562%209.074%203.562%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g86111C2D5C8682C53BDA9AD6152C9992%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0829%203.8584%20C%201.3741001%203.8584%201.5925001%204.0768003%201.5925001%204.368%20C%201.5925001%204.6956%201.4196%204.8685%201.0829%204.8776%20C%201.2831%205.3053%201.7381%205.6511%202.3296%205.6511%20C%203.1304002%205.6511%203.6582003%205.0505004%203.6582003%204.2497%20C%203.6582003%203.8129%203.5035002%203.3943002%203.1850002%202.9848%20C%203.0303001%202.7755%202.9120002%202.6299002%202.8301%202.548%20L%200.67340004%200.4095%20C%200.5551%200.3003%200.5733%200.273%200.5733%200%20L%204.3225%200%20L%204.6046%201.7108%20L%204.2224%201.7108%20C%204.1587%201.2285%204.0859003%200.94640005%204.004%200.8827%20C%203.9585001%200.8554%203.6764002%200.83720005%203.1395001%200.83720005%20L%201.5925001%200.83720005%20C%202.2022002%201.3741001%202.7664%201.8564001%203.3033001%202.2841%20C%203.7128003%202.6026%204.004%202.8847%204.1860003%203.1304002%20C%204.459%203.4853%204.5955%203.8584%204.5955%204.2497%20C%204.5955%204.8139%204.3771%205.2598004%203.9312003%205.5874004%20C%203.5399%205.8877%203.0485%206.0424004%202.4661002%206.0424004%20C%201.9656001%206.0424004%201.5379001%205.8968%201.1648%205.6056004%20C%200.7735%205.2871003%200.5733%204.8867%200.5733%204.3953004%20C%200.5733%204.0859003%200.8008%203.8584%201.0829%203.8584%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g622CA137E75F1C7B312DB93983F80BDA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0556%201.274%20C%200.75530005%201.274%200.6097%201.1193%200.6097%200.80990005%20C%200.6097%200.12740001%201.1648%20-0.2002%201.8837001%20-0.2002%20C%202.6117%20-0.2002%203.1941001%200.1638%203.6218002%200.90090007%20C%203.9767%201.5106001%204.1587%202.2113001%204.1587%202.9939%20C%204.1587%204.1496%203.9494002%204.9686003%203.5308%205.4509%20C%203.1759002%205.8604%202.7664%206.0606003%202.3023%206.0606003%20C%201.7654%206.0606003%201.3195001%205.8695%200.9646%205.4782004%20C%200.5733%205.0687003%200.3822%204.5773%200.3822%204.004%20C%200.3822%203.4489002%200.546%202.9757001%200.8736%202.5844002%20C%201.2194%202.1658%201.6653%201.9565%202.2022002%201.9565%20C%202.6754%201.9565%203.0394%202.2113001%203.2851002%202.7209%20L%203.2851002%202.6026%20C%203.2851002%201.6107%203.1122%200.9373%202.7573001%200.5733%20C%202.4752002%200.273%202.1749%200.12740001%201.8746%200.12740001%20C%201.5106001%200.12740001%201.2467%200.20930001%201.0738001%200.3822%20C%201.3559%200.3822%201.5015%200.546%201.5015%200.8281%20C%201.5015%201.0829%201.3104%201.274%201.0556%201.274%20Z%20M%202.2113001%202.2386%20C%201.8564001%202.2386%201.5925001%202.4206002%201.4105%202.7846%20C%201.3104%202.9939%201.2558%203.4034002%201.2558%203.9949002%20C%201.2558%204.5864%201.3195001%204.9868%201.4378%205.2143%20C%201.638%205.5783%201.9292%205.7603%202.3023%205.7603%20C%202.6754%205.7603%202.9484%205.5328%203.1213002%205.0778003%20C%203.2214%204.8321004%203.2851002%204.4135003%203.2851002%203.8220003%20C%203.2851002%203.0303001%202.9302%202.2386%202.2113001%202.2386%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g691260D45B674C5129C354630D9E7DE4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.2123%203.2123%20C%203.8220003%203.4580002%204.4044003%203.9949002%204.4044003%204.7684%20C%204.4044003%205.1779003%204.1860003%205.5055003%203.7583%205.7421002%20C%203.4034002%205.9423003%203.003%206.0424004%202.5571%206.0424004%20C%202.1112%206.0424004%201.7199%205.9514003%201.3832%205.7603%20C%200.97370005%205.5328%200.7644%205.2143%200.7644%204.8048%20C%200.7644%204.459%200.9373%204.2861004%201.274%204.2861004%20C%201.5561%204.2861004%201.7654%204.5045004%201.7654%204.7866%20C%201.7654%205.0687003%201.6198001%205.2325%201.3377%205.2780004%20C%201.6016%205.5601%201.9929001%205.7057004%202.5298002%205.7057004%20C%203.1213002%205.7057004%203.4580002%205.3508%203.4580002%204.7684%20C%203.4580002%204.3407%203.3397002%203.9949002%203.1122%203.7219002%20C%202.8574002%203.4216%202.6754%203.3761%202.1476002%203.3397002%20C%201.9019%203.3215%201.7381%203.3488002%201.7381%203.1668%20C%201.7381%203.0576%201.8291001%203.003%202.002%203.003%20L%202.4843001%203.003%20C%203.2669%203.003%203.6491%202.4115002%203.6491%201.5925001%20C%203.6491%200.7917%203.2851002%200.18200001%202.5207002%200.18200001%20C%201.8564001%200.18200001%201.3741001%200.36400002%201.0738001%200.7371%20C%201.3923%200.7735%201.5561%200.95550007%201.5561%201.274%20C%201.5561%201.5743%201.3286%201.8018001%201.0283%201.8018001%20C%200.67340004%201.8018001%200.49140003%201.6198001%200.49140003%201.2467%20C%200.49140003%200.78260005%200.72800004%200.4095%201.1921%200.1456%20C%201.5834%20-0.0728%202.0293%20-0.18200001%202.5389001%20-0.18200001%20C%203.094%20-0.18200001%203.5763001%20-0.0273%203.9949002%200.28210002%20C%204.4499%200.61880004%204.6774%201.0556%204.6774%201.5925001%20C%204.6774%202.4388%203.9403002%203.0212002%203.2123%203.2123%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g34A5C14ED9FB7DDEF99FAC79056D90F7%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.1567001%206.0606003%20C%201.6926%206.0606003%201.3013%205.8968%200.9646%205.5692%20C%200.6279%205.2416%200.455%204.8594003%200.455%204.3953004%20C%200.455%204.0859003%200.6825%203.8584%200.9646%203.8584%20C%201.2376001%203.8584%201.4651%204.0950003%201.4651%204.368%20C%201.4651%204.6683%201.2467%204.8776%200.95550007%204.8776%20C%200.92820007%204.8776%200.91%204.8776%200.89180005%204.8685%20C%201.0647%205.3144%201.4651%205.7057004%202.0384002%205.7057004%20C%202.7846%205.7057004%203.2032%205.0596004%203.2032%204.277%20C%203.2032%203.6673002%202.8938%203.0121002%202.275%202.3205001%20L%200.56420004%200.39130002%20C%200.44590002%200.25480002%200.455%200.2639%200.455%200%20L%203.8311002%200%20L%204.0950003%201.638%20L%203.7947001%201.638%20C%203.7219002%201.1739%203.6582003%200.91%203.6036003%200.8281%20C%203.5581002%200.78260005%203.2851002%200.7644%202.7846%200.7644%20L%201.2649001%200.7644%20L%202.1476002%201.6289%20C%202.7664%202.2113001%203.5490003%202.8392%203.8129%203.3215%20C%203.9949002%203.64%204.0859003%203.9585001%204.0859003%204.277%20C%204.0859003%205.3508%203.2487001%206.0606003%202.1567001%206.0606003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g73DDEFD92CAF7F9CE53BD9659E569F6F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.275%206.0606003%20C%201.8291001%206.0606003%201.4378%205.9150004%201.1102%205.6238003%20C%200.78260005%205.3326%200.61880004%204.9686003%200.61880004%204.5227003%20C%200.61880004%204.1496%200.75530005%203.8129%201.0283%203.5126002%20C%201.092%203.4398%201.2922001%203.2851002%201.6289%203.0485%20C%200.8008%202.6208%200.3822%202.0657%200.3822%201.3923%20C%200.3822%200.91%200.5824%200.5187%200.97370005%200.2184%20C%201.3377%20-0.063700005%201.7654%20-0.2002%202.2659001%20-0.2002%20C%202.7755%20-0.2002%203.2214%20-0.0364%203.5945%200.2912%20C%203.9676%200.61880004%204.1587%201.0465001%204.1587%201.547%20C%204.1587%201.9656001%204.0131%202.3387%203.7128003%202.6754%20C%203.6036003%202.7937002%203.3215%203.003%202.8756%203.2851002%20C%203.5763001%203.6582003%203.9221%204.1314%203.9221%204.6865%20C%203.9221%205.5146003%203.1304002%206.0606003%202.275%206.0606003%20Z%20M%203.4489002%204.6865%20C%203.4489002%204.2133%203.1668%203.8038%202.6026%203.4671001%20L%201.5197%204.1769004%20C%201.2376001%204.3589%201.092%204.5955%201.092%204.8776%20C%201.092%205.4236%201.6835%205.7603%202.2659001%205.7603%20C%202.8938%205.7603%203.4489002%205.3144%203.4489002%204.6865%20Z%20M%202.275%200.12740001%20C%201.5288%200.12740001%200.90090007%200.6643%200.90090007%201.3923%20C%200.90090007%202.002%201.2376001%202.4934%201.9110001%202.8665001%20L%202.9848%202.184%20C%203.4216%201.9019%203.64%201.5834%203.64%201.2194%20C%203.64%200.56420004%202.9575002%200.12740001%202.275%200.12740001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g39B2656344CBB5F9460DA2DEEFEF16D9%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.5854%206.1334004%20C%203.4853%206.1334004%203.3943002%206.0879%203.3215%205.9969%20L%200.3549%201.8473%20L%200.3549%201.4742%20L%202.9848%201.4742%20L%202.9848%200.7735%20C%202.9848%200.61880004%202.9575002%200.50960004%202.8938%200.46410003%20C%202.8301%200.41860002%202.6299002%200.39130002%202.3023%200.39130002%20L%202.0202%200.39130002%20L%202.0202%200%20L%203.3943002%200.0364%20L%204.7866%200%20L%204.7866%200.39130002%20L%204.5136003%200.39130002%20C%204.1769004%200.39130002%203.9767%200.41860002%203.913%200.46410003%20C%203.8493001%200.50960004%203.8220003%200.61880004%203.8220003%200.7735%20L%203.8220003%201.4742%20L%204.8139%201.4742%20L%204.8139%201.8746%20L%203.8220003%201.8746%20L%203.8220003%205.8422003%20C%203.8220003%206.0606003%203.7947001%206.1334004%203.5854%206.1334004%20Z%20M%203.0485%205.0141%20L%203.0485%201.8746%20L%200.7917%201.8746%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g8281AF5184639F2042386F3390791180%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.7573001%203.2123%20C%203.3579001%203.4398%203.9221%204.0131%203.9221%204.7866%20C%203.9221%205.1779003%203.7310002%205.4964004%203.3579001%205.7421002%20C%203.0303001%205.9514003%202.6572%206.0606003%202.2386%206.0606003%20C%201.8291001%206.0606003%201.4742%205.9514003%201.1557001%205.7421002%20C%200.8008%205.5055003%200.61880004%205.1961%200.61880004%204.8048%20C%200.61880004%204.5045004%200.819%204.2952003%201.1102%204.2952003%20C%201.4014001%204.2952003%201.6016%204.5045004%201.6016%204.7957%20C%201.6016%205.096%201.4287001%205.2598004%201.0829%205.2780004%20C%201.3195001%205.5965004%201.6926%205.7603%202.2022002%205.7603%20C%202.7482002%205.7603%203.0212002%205.4418%203.0212002%204.7957%20C%203.0212002%204.4135003%202.9484%204.0950003%202.8119001%203.8311002%20C%202.5662%203.3943002%202.2295%203.3124%201.6653%203.3124%20C%201.5561%203.2942002%201.5015%203.2487001%201.5015%203.1668%20C%201.5015%203.0303001%201.5652001%203.0303001%201.7472%203.0303001%20L%202.1385%203.0303001%20C%202.821%203.0303001%203.1668%202.548%203.1668%201.5743%20C%203.1668%200.8008%202.8847%200.12740001%202.1931%200.12740001%20C%201.6016%200.12740001%201.1648%200.3276%200.90090007%200.72800004%20C%201.2194%200.7189%201.4560001%200.95550007%201.4560001%201.2649001%20C%201.4560001%201.5743%201.2285%201.8018001%200.91910005%201.8018001%20C%200.56420004%201.8018001%200.3822%201.6198001%200.3822%201.2467%20C%200.3822%200.8008%200.5824%200.44590002%200.98280007%200.1638%20C%201.3377%20-0.0819%201.7563001%20-0.2002%202.2204%20-0.2002%20C%202.7391002%20-0.2002%203.1850002%20-0.0273%203.5763001%200.30940002%20C%203.9676%200.64610004%204.1587%201.0647%204.1587%201.5743%20C%204.1587%202.4297001%203.4853%203.0212002%202.7573001%203.2123%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9E20F0F1E2099437CD7306AC659F3A2F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.3225%205.4964004%20C%204.3862%205.5783%204.4135003%205.6966004%204.4135003%205.8604%20L%202.2113001%205.8604%20C%201.5834%205.8604%201.2285%205.8968%201.1648%205.9787%20C%201.1375%206.006%201.1102%206.0697002%201.092%206.1516004%20L%200.80990005%206.1516004%20L%200.5005%204.2224%20L%200.8008%204.2224%20C%200.89180005%204.7320004%200.9646%205.005%201.0192001%205.0505004%20C%201.0465001%205.0778003%201.3286%205.096%201.8655001%205.096%20L%203.6491%205.096%20L%202.6845002%203.7310002%20C%201.9474001%202.6845002%201.5834%201.5561%201.5834%200.3276%20C%201.5834%20-0.0273%201.7290001%20-0.2002%202.0293%20-0.2002%20C%202.3296%20-0.2002%202.4752002%20-0.0273%202.4752002%200.3276%20L%202.4752002%200.7917%20C%202.4752002%202.1749%202.6936002%203.1759002%203.1213002%203.7856002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g70E4B5E4F67BC2556F05873B39EAD917%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.2558%202.8119001%20C%201.3195001%202.8119001%201.3832%202.8574002%201.4560001%202.9484%20C%201.7472%203.3215%202.1567001%203.5035002%202.6754%203.5035002%20C%203.3397002%203.5035002%203.6764002%202.9575002%203.6764002%201.8746%20C%203.6764002%201.3468001%203.5854%200.95550007%203.4125001%200.70070004%20C%203.1668%200.3549%202.8301%200.18200001%202.3933%200.18200001%20C%201.7563001%200.18200001%201.2467%200.546%201.0465001%201.0192001%20C%201.3377%201.0192001%201.5379001%201.2103001%201.5379001%201.5015%20C%201.5379001%201.7927%201.3468001%201.9929001%201.0556%201.9929001%20C%200.75530005%201.9474001%200.5733%201.8018001%200.5733%201.4742%20C%200.5733%200.9919%200.7644%200.59150004%201.1466%200.273%20C%201.5015%20-0.0273%201.9292%20-0.18200001%202.4115002%20-0.18200001%20C%203.003%20-0.18200001%203.5126002%200.0182%203.9494002%200.4004%20C%204.3862%200.78260005%204.5955%201.2649001%204.5955%201.8382001%20C%204.5955%202.3933%204.4044003%202.8574002%204.0404%203.2487001%20C%203.6764002%203.64%203.2214%203.8311002%202.6845002%203.8311002%20C%202.2022002%203.8311002%201.8018001%203.6946%201.4651%203.4307%20L%201.4651%205.005%20C%201.7563001%204.9322004%202.0384002%204.8958%202.3023%204.8958%20C%202.6572%204.8958%202.9939%204.9686003%203.3124%205.1233%20C%203.5672002%205.2416%204.2133%205.6147003%204.2133%205.8786%20C%204.2133%205.9878%204.1587%206.0424004%204.0586%206.0424004%20C%203.5581002%205.8513002%203.0849001%205.7512%202.6481001%205.7512%20C%202.2022002%205.7512%201.7654%205.8331003%201.3559%205.9969%20C%201.2922001%206.0242004%201.2558%206.0424004%201.2285%206.0424004%20C%201.1284001%206.0424004%201.0738001%205.9514003%201.0738001%205.7603%20L%201.0738001%203.1122%20C%201.0738001%202.9302%201.0829%202.8119001%201.2558%202.8119001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4693E3A3EB6D2365B1DA5DB621129A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.2123%206.1607003%20C%203.1304002%206.1607003%203.0576%206.1152%203.003%206.0333004%20L%200.25480002%201.8109001%20L%200.25480002%201.4833001%20L%202.6299002%201.4833001%20L%202.6299002%200.7371%20C%202.6299002%200.5733%202.5935001%200.46410003%202.5298002%200.41860002%20C%202.4661002%200.3731%202.2932%200.3549%201.9929001%200.3549%20L%201.7654%200.3549%20L%201.7654%200%20C%202.0293%200.0182%202.4479%200.0273%203.0121002%200.0273%20C%203.5763001%200.0273%203.9949002%200.0182%204.2588%200%20L%204.2588%200.3549%20L%204.0313%200.3549%20C%203.7310002%200.3549%203.5581002%200.3731%203.4944%200.41860002%20C%203.4307%200.46410003%203.3943002%200.5733%203.3943002%200.7371%20L%203.3943002%201.4833001%20L%204.2861004%201.4833001%20L%204.2861004%201.8382001%20L%203.3943002%201.8382001%20L%203.3943002%206.006%20C%203.3943002%206.097%203.3306%206.1607003%203.2123%206.1607003%20Z%20M%202.6845002%205.0323%20L%202.6845002%201.8382001%20L%200.6097%201.8382001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g83A6B6FF257ED71588483547005EE45F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.4853%204.5864%20C%203.7856002%204.5864%203.9312003%204.7411003%203.9312003%205.0505004%20C%203.9312003%205.7057004%203.4398%206.0606003%202.7664%206.0606003%20C%202.0111%206.0606003%201.4105%205.7057004%200.9646%204.9868%20C%200.5733%204.368%200.3822%203.6673002%200.3822%202.8756%20C%200.3822%201.7199%200.59150004%200.91%201.0192001%200.4277%20C%201.3832%200.0091%201.8018001%20-0.2002%202.2841%20-0.2002%20C%202.8392%20-0.2002%203.2942002%200.0091%203.6491%200.4277%20C%203.9858003%200.8281%204.1587%201.3104%204.1587%201.8655001%20C%204.1587%202.4206002%203.9949002%202.8938%203.6673002%203.2851002%20C%203.3215%203.7037%202.8756%203.9221%202.3387%203.9221%20C%201.8655001%203.9221%201.5015%203.6582003%201.2558%203.1486%20L%201.2558%203.2032%20C%201.2558%204.2315%201.5106001%205.1051%202.0566%205.5055003%20C%202.2932%205.6784%202.5389001%205.7603%202.7846%205.7603%20C%203.1122%205.7603%203.3488002%205.6693%203.5035002%205.4782004%20C%203.1941001%205.4782004%203.0394%205.3053%203.0394%205.0323%20C%203.0394%204.7775%203.2305002%204.5864%203.4853%204.5864%20Z%20M%203.1304002%203.094%20C%203.2305002%202.8847%203.2851002%202.4752002%203.2851002%201.8746%20C%203.2851002%201.2831%203.2396002%200.89180005%203.1395001%200.6916%20C%202.9575002%200.3185%202.6754%200.12740001%202.2841%200.12740001%20C%202.0202%200.12740001%201.82%200.2184%201.6744001%200.4004%20C%201.5561%200.546%201.4742%200.67340004%201.4378%200.7735%20C%201.3286%201.0556%201.274%201.4833001%201.274%202.0657%20C%201.274%202.3205001%201.3104%202.5662%201.3741001%202.8028002%20C%201.4924%203.2305002%201.8291001%203.6309001%202.3296%203.6309001%20C%202.6845002%203.6309001%202.9575002%203.4489002%203.1304002%203.094%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 20.914557575757577em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Now, multiply &lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%209.984%2021.878999999999998%22%20width%3D%229.984pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gD64B3975C9A5026604F20A029CCF2ADF%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gD64B3975C9A5026604F20A029CCF2ADF%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.126%203.4190001%20C%209.451%204.16%209.62%204.901%209.62%205.655%20C%209.62%206.669%209.321%207.501%208.71%208.1640005%20C%208.099%208.827001%207.293%209.165%206.2920003%209.165%20C%205.603%209.165%204.914%208.996%204.225%208.658%20C%202.821%207.9690003%201.794%206.8770003%201.131%205.395%20C%200.806%204.6670003%200.637%203.9390001%200.637%203.198%20C%200.637%202.171%200.936%201.339%201.547%200.689%20C%202.158%200.039%202.964%20-0.286%203.9780002%20-0.286%20C%204.6540003%20-0.286%205.33%20-0.117%206.019%200.208%20C%207.4360003%200.897%208.463%201.9760001%209.126%203.4190001%20Z%20M%208.372%206.162%20C%208.372%204.433%207.592%202.704%206.76%201.677%20C%206.188%200.962%205.2000003%200.156%204.056%200.156%20C%202.665%200.156%201.937%201.365%201.937%202.834%20C%201.937%203.289%202.028%203.9%202.197%204.6410003%20C%202.548%206.175%203.4320002%207.527%204.589%208.229%20C%205.1480002%208.567%205.6940002%208.736%206.214%208.736%20C%207.618%208.736%208.372%207.618%208.372%206.162%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 0.9076363636363637em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt; by the magic number
&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%20176.59763333333333%2021.878999999999998%22%20width%3D%22176.59763333333333pt%22%20height%3D%2221.878999999999998pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9730C1235F97E1D18D0762A14B4B8D5D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2817.54711111111111%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g537FBDF575D6B4DBC59EE2318104781F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2831.272222222222226%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2837.772222222222226%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g926D2660840F60BD26CB1948E0E27444%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2842.32222222222222%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9E20F0F1E2099437CD7306AC659F3A2F%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2850.60741111111111%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFCDE359C75472195CEC97DC4B537C342%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2863.610299999999995%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2870.1103%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g34A5C14ED9FB7DDEF99FAC79056D90F7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2874.66029999999999%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g80826852236079CD3B1F7688218E848%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2882.82718888888888%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFCDE359C75472195CEC97DC4B537C342%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2895.83007777777777%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28102.33007777777777%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g8281AF5184639F2042386F3390791180%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28106.88007777777777%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g8281AF5184639F2042386F3390791180%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28115.04696666666665%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFCDE359C75472195CEC97DC4B537C342%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28128.04985555555555%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28134.54985555555555%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4693E3A3EB6D2365B1DA5DB621129A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28139.09985555555554%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g926D2660840F60BD26CB1948E0E27444%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28147.26674444444444%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFCDE359C75472195CEC97DC4B537C342%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28160.26963333333333%2015.379%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g626C7FE0610F5A21B7FCC6F361F06C4A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28166.76963333333333%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g4693E3A3EB6D2365B1DA5DB621129A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28171.31963333333331%2010.660000000000002%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g622CA137E75F1C7B312DB93983F80BDA%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9730C1235F97E1D18D0762A14B4B8D5D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%207.722%200.208%20C%207.722%200.065%207.8%200%207.9690003%200%20L%209.568%200.039%20C%209.867001%200.052%2010.92%200%2011.167%200%20C%2011.362%200%2011.466001%200.104%2011.466001%200.312%20C%2011.466001%200.442%2011.336%200.507%2011.063001%200.507%20C%2010.530001%200.507%2010.27%200.559%2010.27%200.676%20C%2010.27%200.71500003%2010.2960005%200.806%2010.335%200.975%20L%2012.051001%207.826%20C%2012.116%208.099%2012.246%208.268001%2012.415%208.333%20C%2012.493%208.359%2012.727%208.372%2013.104%208.372%20C%2013.429%208.372%2013.5720005%208.385%2013.5720005%208.684%20C%2013.5720005%208.814%2013.442%208.879%2013.169001%208.879%20L%2011.466001%208.879%20C%2011.089001%208.879%2011.089001%208.853001%2010.92%208.606%20L%206.2920003%201.404%20L%205.304%208.541%20C%205.2520003%208.866%205.2260003%208.879%204.849%208.879%20L%203.081%208.879%20C%202.795%208.879%202.652%208.866%202.652%208.58%20C%202.652%208.437%202.795%208.372%203.068%208.372%20C%203.328%208.372%203.861%208.411%203.861%208.203%20C%203.861%208.177%203.848%208.099%203.809%207.9690003%20L%202.171%201.4300001%20C%202.0540001%200.936%201.755%200.637%201.3000001%200.546%20C%200.975%200.507%200.546%200.559%200.546%200.208%20C%200.546%200.065%200.624%200%200.78000003%200%20C%201.014%200%201.8330001%200.039%202.0670002%200.039%20C%202.3140001%200.039%203.1460001%200%203.3930001%200%20C%203.588%200%203.6790001%200.104%203.6790001%200.312%20C%203.6790001%200.42900002%203.588%200.49400002%203.3930001%200.507%20C%202.8470001%200.507%202.5740001%200.676%202.5740001%201.014%20C%202.5740001%201.066%202.5870001%201.1570001%202.6260002%201.3000001%20L%204.316%208.073%20L%205.395%200.338%20C%205.434%200.117%205.512%200%205.642%200%20C%205.7460003%200%205.85%200.091000006%205.967%200.26%20L%2011.024%208.151%20L%209.2560005%201.066%20C%209.178%200.78000003%209.048%200.611%208.853001%200.546%20C%208.775001%200.52%208.528%200.507%208.125%200.507%20C%207.852%200.507%207.722%200.481%207.722%200.208%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g537FBDF575D6B4DBC59EE2318104781F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%204.771%20L%201.04%204.771%20C%200.832%204.771%200.72800004%204.6670003%200.72800004%204.472%20C%200.72800004%204.277%200.832%204.173%201.04%204.173%20L%209.074%204.173%20C%209.282001%204.173%209.386001%204.277%209.386001%204.472%20C%209.386001%204.6280003%209.243%204.771%209.074%204.771%20Z%20M%209.074%202.3270001%20L%201.04%202.3270001%20C%200.832%202.3270001%200.72800004%202.223%200.72800004%202.028%20C%200.72800004%201.8330001%200.832%201.7290001%201.04%201.7290001%20L%209.074%201.7290001%20C%209.282001%201.7290001%209.386001%201.8330001%209.386001%202.028%20C%209.386001%202.197%209.243%202.3270001%209.074%202.3270001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g626C7FE0610F5A21B7FCC6F361F06C4A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.081%208.658%20C%202.418%208.658%201.8590001%208.424%201.378%207.9560003%20C%200.897%207.488%200.65000004%206.942%200.65000004%206.2790003%20C%200.65000004%205.837%200.975%205.512%201.378%205.512%20C%201.768%205.512%202.093%205.85%202.093%206.2400002%20C%202.093%206.669%201.781%206.968%201.365%206.968%20C%201.326%206.968%201.3000001%206.968%201.274%206.955%20C%201.521%207.592%202.093%208.151%202.9120002%208.151%20C%203.9780002%208.151%204.576%207.228%204.576%206.11%20C%204.576%205.2390003%204.1340003%204.303%203.25%203.315%20L%200.806%200.559%20C%200.637%200.36400002%200.65000004%200.377%200.65000004%200%20L%205.473%200%20L%205.85%202.3400002%20L%205.421%202.3400002%20C%205.317%201.677%205.2260003%201.3000001%205.1480002%201.183%20C%205.083%201.118%204.6930003%201.092%203.9780002%201.092%20L%201.807%201.092%20L%203.068%202.3270001%20C%203.9520001%203.1590002%205.07%204.056%205.447%204.745%20C%205.7070003%205.2000003%205.837%205.655%205.837%206.11%20C%205.837%207.644%204.6410003%208.658%203.081%208.658%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g926D2660840F60BD26CB1948E0E27444%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.4479%206.0606003%20C%202.0748%205.6784%201.5288%205.4873004%200.80990005%205.4873004%20L%200.80990005%205.1324%20C%201.2831%205.1324%201.6744001%205.2052%201.9747001%205.3508%20L%201.9747001%200.7462%20C%201.9747001%200.5824%201.9383001%200.47320002%201.8564001%200.4277%20C%201.7745001%200.3822%201.547%200.3549%201.1830001%200.3549%20L%200.86450005%200.3549%20L%200.86450005%200%20C%201.092%200.0182%201.5834%200.0273%202.3387%200.0273%20C%203.094%200.0273%203.5854%200.0182%203.8129%200%20L%203.8129%200.3549%20L%203.4944%200.3549%20C%203.1213002%200.3549%202.8938%200.3822%202.821%200.4277%20C%202.7482002%200.47320002%202.7027001%200.5824%202.7027001%200.7462%20L%202.7027001%205.7876%20C%202.7027001%206.006%202.6845002%206.0606003%202.4479%206.0606003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9E20F0F1E2099437CD7306AC659F3A2F%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.3225%205.4964004%20C%204.3862%205.5783%204.4135003%205.6966004%204.4135003%205.8604%20L%202.2113001%205.8604%20C%201.5834%205.8604%201.2285%205.8968%201.1648%205.9787%20C%201.1375%206.006%201.1102%206.0697002%201.092%206.1516004%20L%200.80990005%206.1516004%20L%200.5005%204.2224%20L%200.8008%204.2224%20C%200.89180005%204.7320004%200.9646%205.005%201.0192001%205.0505004%20C%201.0465001%205.0778003%201.3286%205.096%201.8655001%205.096%20L%203.6491%205.096%20L%202.6845002%203.7310002%20C%201.9474001%202.6845002%201.5834%201.5561%201.5834%200.3276%20C%201.5834%20-0.0273%201.7290001%20-0.2002%202.0293%20-0.2002%20C%202.3296%20-0.2002%202.4752002%20-0.0273%202.4752002%200.3276%20L%202.4752002%200.7917%20C%202.4752002%202.1749%202.6936002%203.1759002%203.1213002%203.7856002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gFCDE359C75472195CEC97DC4B537C342%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.074%203.562%20L%205.369%203.562%20L%205.369%207.267%20C%205.369%207.4750004%205.2650003%207.579%205.057%207.579%20C%204.849%207.579%204.745%207.4750004%204.745%207.267%20L%204.745%203.562%20L%201.04%203.562%20C%200.832%203.562%200.72800004%203.4580002%200.72800004%203.25%20C%200.72800004%203.042%200.832%202.938%201.04%202.938%20L%204.745%202.938%20L%204.745%20-0.767%20C%204.745%20-0.975%204.849%20-1.079%205.057%20-1.079%20C%205.2650003%20-1.079%205.369%20-0.975%205.369%20-0.767%20L%205.369%202.938%20L%209.074%202.938%20C%209.282001%202.938%209.386001%203.042%209.386001%203.25%20C%209.386001%203.4190001%209.243%203.562%209.074%203.562%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g34A5C14ED9FB7DDEF99FAC79056D90F7%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.1567001%206.0606003%20C%201.6926%206.0606003%201.3013%205.8968%200.9646%205.5692%20C%200.6279%205.2416%200.455%204.8594003%200.455%204.3953004%20C%200.455%204.0859003%200.6825%203.8584%200.9646%203.8584%20C%201.2376001%203.8584%201.4651%204.0950003%201.4651%204.368%20C%201.4651%204.6683%201.2467%204.8776%200.95550007%204.8776%20C%200.92820007%204.8776%200.91%204.8776%200.89180005%204.8685%20C%201.0647%205.3144%201.4651%205.7057004%202.0384002%205.7057004%20C%202.7846%205.7057004%203.2032%205.0596004%203.2032%204.277%20C%203.2032%203.6673002%202.8938%203.0121002%202.275%202.3205001%20L%200.56420004%200.39130002%20C%200.44590002%200.25480002%200.455%200.2639%200.455%200%20L%203.8311002%200%20L%204.0950003%201.638%20L%203.7947001%201.638%20C%203.7219002%201.1739%203.6582003%200.91%203.6036003%200.8281%20C%203.5581002%200.78260005%203.2851002%200.7644%202.7846%200.7644%20L%201.2649001%200.7644%20L%202.1476002%201.6289%20C%202.7664%202.2113001%203.5490003%202.8392%203.8129%203.3215%20C%203.9949002%203.64%204.0859003%203.9585001%204.0859003%204.277%20C%204.0859003%205.3508%203.2487001%206.0606003%202.1567001%206.0606003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g80826852236079CD3B1F7688218E848%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0738001%202.8665001%20C%201.1193%202.8665001%201.1739%202.9029002%201.2194%202.9666002%20C%201.4924%203.3761%201.8655001%203.5763001%202.3387%203.5763001%20C%202.6572%203.5763001%202.9029002%203.3943002%203.0667002%203.0212002%20C%203.1668%202.7755%203.2214%202.4024%203.2214%201.9019%20C%203.2214%201.3286%203.1486%200.92820007%203.0121002%200.6916%20C%202.7846%200.3185%202.4752002%200.12740001%202.0839%200.12740001%20C%201.4742%200.12740001%200.9919%200.56420004%200.8281%201.0374%20C%200.8554%201.0283%200.8736%201.0374%200.91%201.0374%20C%201.1830001%201.0374%201.4105%201.2467%201.4105%201.5197%20C%201.4105%201.8018001%201.1830001%201.9929001%200.91%201.9929001%20C%200.59150004%201.9929001%200.455%201.82%200.455%201.4833001%20C%200.455%200.5733%201.1921%20-0.2002%202.1021001%20-0.2002%20C%202.6572%20-0.2002%203.1304002%200%203.5126002%200.4004%20C%203.8948002%200.8008%204.0859003%201.2831%204.0859003%201.8382001%20C%204.0859003%202.3660002%203.9312003%202.821%203.6218002%203.2123%20C%203.2851002%203.64%202.8665001%203.8493001%202.3569002%203.8493001%20C%201.9292%203.8493001%201.5561%203.7128003%201.2558%203.4398%20L%201.2558%205.0596004%20C%201.5015%204.9868%201.7381%204.9504004%201.9838%204.9504004%20C%202.4024%204.9504004%202.7664%205.0505004%203.0758002%205.2598004%20C%203.3579001%205.4327%203.5490003%205.6056004%203.6582003%205.7694%20C%203.7128003%205.8422003%203.7401001%205.8968%203.7401001%205.9241004%20C%203.7401001%206.0151005%203.6946%206.0606003%203.6036003%206.0606003%20C%203.1031%205.8695%202.6754%205.7694%202.3296%205.7694%20C%201.9201001%205.7694%201.5288%205.8513002%201.1557001%206.0242004%20C%201.1102%206.0424004%201.0738001%206.0515003%201.0374%206.0515003%20C%200.95550007%206.0515003%200.91%205.9696%200.91%205.7967%20L%200.91%203.1395001%20C%200.91%202.9484%200.91%202.8665001%201.0738001%202.8665001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g8281AF5184639F2042386F3390791180%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.7573001%203.2123%20C%203.3579001%203.4398%203.9221%204.0131%203.9221%204.7866%20C%203.9221%205.1779003%203.7310002%205.4964004%203.3579001%205.7421002%20C%203.0303001%205.9514003%202.6572%206.0606003%202.2386%206.0606003%20C%201.8291001%206.0606003%201.4742%205.9514003%201.1557001%205.7421002%20C%200.8008%205.5055003%200.61880004%205.1961%200.61880004%204.8048%20C%200.61880004%204.5045004%200.819%204.2952003%201.1102%204.2952003%20C%201.4014001%204.2952003%201.6016%204.5045004%201.6016%204.7957%20C%201.6016%205.096%201.4287001%205.2598004%201.0829%205.2780004%20C%201.3195001%205.5965004%201.6926%205.7603%202.2022002%205.7603%20C%202.7482002%205.7603%203.0212002%205.4418%203.0212002%204.7957%20C%203.0212002%204.4135003%202.9484%204.0950003%202.8119001%203.8311002%20C%202.5662%203.3943002%202.2295%203.3124%201.6653%203.3124%20C%201.5561%203.2942002%201.5015%203.2487001%201.5015%203.1668%20C%201.5015%203.0303001%201.5652001%203.0303001%201.7472%203.0303001%20L%202.1385%203.0303001%20C%202.821%203.0303001%203.1668%202.548%203.1668%201.5743%20C%203.1668%200.8008%202.8847%200.12740001%202.1931%200.12740001%20C%201.6016%200.12740001%201.1648%200.3276%200.90090007%200.72800004%20C%201.2194%200.7189%201.4560001%200.95550007%201.4560001%201.2649001%20C%201.4560001%201.5743%201.2285%201.8018001%200.91910005%201.8018001%20C%200.56420004%201.8018001%200.3822%201.6198001%200.3822%201.2467%20C%200.3822%200.8008%200.5824%200.44590002%200.98280007%200.1638%20C%201.3377%20-0.0819%201.7563001%20-0.2002%202.2204%20-0.2002%20C%202.7391002%20-0.2002%203.1850002%20-0.0273%203.5763001%200.30940002%20C%203.9676%200.64610004%204.1587%201.0647%204.1587%201.5743%20C%204.1587%202.4297001%203.4853%203.0212002%202.7573001%203.2123%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g4693E3A3EB6D2365B1DA5DB621129A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.2123%206.1607003%20C%203.1304002%206.1607003%203.0576%206.1152%203.003%206.0333004%20L%200.25480002%201.8109001%20L%200.25480002%201.4833001%20L%202.6299002%201.4833001%20L%202.6299002%200.7371%20C%202.6299002%200.5733%202.5935001%200.46410003%202.5298002%200.41860002%20C%202.4661002%200.3731%202.2932%200.3549%201.9929001%200.3549%20L%201.7654%200.3549%20L%201.7654%200%20C%202.0293%200.0182%202.4479%200.0273%203.0121002%200.0273%20C%203.5763001%200.0273%203.9949002%200.0182%204.2588%200%20L%204.2588%200.3549%20L%204.0313%200.3549%20C%203.7310002%200.3549%203.5581002%200.3731%203.4944%200.41860002%20C%203.4307%200.46410003%203.3943002%200.5733%203.3943002%200.7371%20L%203.3943002%201.4833001%20L%204.2861004%201.4833001%20L%204.2861004%201.8382001%20L%203.3943002%201.8382001%20L%203.3943002%206.006%20C%203.3943002%206.097%203.3306%206.1607003%203.2123%206.1607003%20Z%20M%202.6845002%205.0323%20L%202.6845002%201.8382001%20L%200.6097%201.8382001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g622CA137E75F1C7B312DB93983F80BDA%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.0556%201.274%20C%200.75530005%201.274%200.6097%201.1193%200.6097%200.80990005%20C%200.6097%200.12740001%201.1648%20-0.2002%201.8837001%20-0.2002%20C%202.6117%20-0.2002%203.1941001%200.1638%203.6218002%200.90090007%20C%203.9767%201.5106001%204.1587%202.2113001%204.1587%202.9939%20C%204.1587%204.1496%203.9494002%204.9686003%203.5308%205.4509%20C%203.1759002%205.8604%202.7664%206.0606003%202.3023%206.0606003%20C%201.7654%206.0606003%201.3195001%205.8695%200.9646%205.4782004%20C%200.5733%205.0687003%200.3822%204.5773%200.3822%204.004%20C%200.3822%203.4489002%200.546%202.9757001%200.8736%202.5844002%20C%201.2194%202.1658%201.6653%201.9565%202.2022002%201.9565%20C%202.6754%201.9565%203.0394%202.2113001%203.2851002%202.7209%20L%203.2851002%202.6026%20C%203.2851002%201.6107%203.1122%200.9373%202.7573001%200.5733%20C%202.4752002%200.273%202.1749%200.12740001%201.8746%200.12740001%20C%201.5106001%200.12740001%201.2467%200.20930001%201.0738001%200.3822%20C%201.3559%200.3822%201.5015%200.546%201.5015%200.8281%20C%201.5015%201.0829%201.3104%201.274%201.0556%201.274%20Z%20M%202.2113001%202.2386%20C%201.8564001%202.2386%201.5925001%202.4206002%201.4105%202.7846%20C%201.3104%202.9939%201.2558%203.4034002%201.2558%203.9949002%20C%201.2558%204.5864%201.3195001%204.9868%201.4378%205.2143%20C%201.638%205.5783%201.9292%205.7603%202.3023%205.7603%20C%202.6754%205.7603%202.9484%205.5328%203.1213002%205.0778003%20C%203.2214%204.8321004%203.2851002%204.4135003%203.2851002%203.8220003%20C%203.2851002%203.0303001%202.9302%202.2386%202.2113001%202.2386%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-inline typst-doc&quot; style=&quot;vertical-align: -0.5909090909090907em; width: 16.0543303030303em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;data:image&#x2F;svg+xml,%3Csvg%20class%3D%22typst-doc%22%20viewBox%3D%220%200%20462.262111111111%2015.262799999999999%22%20width%3D%22462.262111111111pt%22%20height%3D%2215.262799999999999pt%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20xmlns%3Ah5%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%200%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-group%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%280%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF20E7AEB3B103C0EE97F9B67070BEA0B%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2813.863111111111111%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC29815037FEBE1DB3851C97DD6554796%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2823.974222222222224%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gC5F555A495D0EE6DFEAE35D381A2DF39%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2842.87111111111111%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA20D99DEB48F63DF51432D4DAC149B8B%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2857.652%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9FD281F757E421BF29CC0CC2C6A0A0DD%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2863.658%2015.066799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gE906720DD5EAA7F79EE1865E5225DBCD%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2870.01820000000001%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g511D4CBFEEF3F0A6817E70620AFFABD9%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2877.01820000000001%206.526799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFEADC51D6C0C6F3761C64B26F4C7CFB7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2881.9182%206.526799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g20CE9CDC27F6EE0077F897D966F1EC7B%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%2890.71331111111111%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gBD39A57F8DEFCE1502602BA203F5EBC7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28104.71642222222222%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9FD281F757E421BF29CC0CC2C6A0A0DD%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28110.72242222222224%2015.066799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gE06EA0171DCD9AE02098C9667B52A646%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28117.08262222222223%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g511D4CBFEEF3F0A6817E70620AFFABD9%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28124.08262222222223%206.526799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gEC19D4167A26C3B8598DB94D5F47C9FB%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28128.98262222222223%206.526799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g6C5A33022FC87BE2AB77504FB55433E4%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28137.77773333333332%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gBD39A57F8DEFCE1502602BA203F5EBC7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28151.78084444444443%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9FD281F757E421BF29CC0CC2C6A0A0DD%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28157.7868444444444%2015.066799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g75F6FDD9F0B20D366E0FC7DE03DC23C9%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28164.14704444444442%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g511D4CBFEEF3F0A6817E70620AFFABD9%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28171.14704444444442%206.526799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gEC19D4167A26C3B8598DB94D5F47C9FB%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28176.0470444444444%206.526799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g46F65EB1E2AABF20CDCE392309712DE6%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28184.8421555555555%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gBD39A57F8DEFCE1502602BA203F5EBC7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28198.84526666666662%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9FD281F757E421BF29CC0CC2C6A0A0DD%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28204.85126666666662%2015.066799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g3C327C935E470A38F2BE1D8AC3E3518D%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28211.2114666666666%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g511D4CBFEEF3F0A6817E70620AFFABD9%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28218.2114666666666%206.526799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gEC19D4167A26C3B8598DB94D5F47C9FB%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28223.1114666666666%206.526799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g2CA440A06928E9150572C4388842E58A%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28231.9065777777777%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gBD39A57F8DEFCE1502602BA203F5EBC7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28245.9096888888888%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9FD281F757E421BF29CC0CC2C6A0A0DD%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28251.9156888888888%2015.066799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF998BB2F32C36A5EAA1463AADF736C68%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28258.2758888888888%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g511D4CBFEEF3F0A6817E70620AFFABD9%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28265.2758888888888%206.526799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gEC19D4167A26C3B8598DB94D5F47C9FB%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28270.17588888888884%206.526799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gECAA2FA0C5D9D207927DF13680E23E66%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28278.9709999999999%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gBD39A57F8DEFCE1502602BA203F5EBC7%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20transform%3D%22translate%28292.97411111111103%2011.608799999999999%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cg%20class%3D%22typst-text%22%20transform%3D%22scale%281%2C%20-1%29%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g991B0963DB1C3747A448E938A485B680%22%20x%3D%220%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g70167D9F78947E3E6F095C01BD26FE69%22%20x%3D%227%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g635164249C8906C958C278A56C2A2A5A%22%20x%3D%2214%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g36FAC13BE36CC9908761C7B7A28ED76D%22%20x%3D%2219.488%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g70167D9F78947E3E6F095C01BD26FE69%22%20x%3D%2227.272%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g991B0963DB1C3747A448E938A485B680%22%20x%3D%2234.272%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFE7230AB8941C0094649472F0F0E3D3B%22%20x%3D%2241.272%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF5CBC308C90E424FD0E2C4E823179B58%22%20x%3D%2252.136%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gBAFDCEF15BAA8D9B8139B94A493874D9%22%20x%3D%2259.136%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF5CBC308C90E424FD0E2C4E823179B58%22%20x%3D%2271.568%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g82A3C93819339CDE4B9DB030F705A7F5%22%20x%3D%2278.568%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g9CDF6677C6904BF21588679C6E1D863%22%20x%3D%2284.014%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFE7230AB8941C0094649472F0F0E3D3B%22%20x%3D%2291.798%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g635164249C8906C958C278A56C2A2A5A%22%20x%3D%2298.014%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFE7230AB8941C0094649472F0F0E3D3B%22%20x%3D%22108.14999999999999%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gA873E1FBA54AB3FA08CE5633C811E17C%22%20x%3D%22114.36599999999999%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g617799674A768A30994904FEE623C0E6%22%20x%3D%22121.75799999999998%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gF5CBC308C90E424FD0E2C4E823179B58%22%20x%3D%22129.54199999999997%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gBAFDCEF15BAA8D9B8139B94A493874D9%22%20x%3D%22136.54199999999997%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gFE7230AB8941C0094649472F0F0E3D3B%22%20x%3D%22144.32599999999996%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23gBAFDCEF15BAA8D9B8139B94A493874D9%22%20x%3D%22150.54199999999997%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g82A3C93819339CDE4B9DB030F705A7F5%22%20x%3D%22158.32599999999996%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cuse%20xlink%3Ahref%3D%22%23g74C05CB85E043836B4974B6059EDC60B%22%20x%3D%22163.77199999999996%22%20fill%3D%22%23000000%22%20fill-rule%3D%22nonzero%22%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cdefs%20id%3D%22glyph%22%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF20E7AEB3B103C0EE97F9B67070BEA0B%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.828%203.6820002%20C%2010.178%204.48%2010.360001%205.2780004%2010.360001%206.09%20C%2010.360001%207.182%2010.038%208.078%209.38%208.792%20C%208.722%209.5060005%207.854%209.87%206.776%209.87%20C%206.0340004%209.87%205.2920003%209.688001%204.55%209.324%20C%203.038%208.582001%201.932%207.406%201.218%205.81%20C%200.86800003%205.026%200.68600005%204.242%200.68600005%203.444%20C%200.68600005%202.338%201.008%201.442%201.666%200.74200004%20C%202.3240001%200.042000003%203.1920002%20-0.308%204.284%20-0.308%20C%205.012%20-0.308%205.7400002%20-0.126%206.4820004%200.224%20C%208.008%200.966%209.114%202.128%209.828%203.6820002%20Z%20M%209.016001%206.636%20C%209.016001%204.774%208.176001%202.9120002%207.28%201.8060001%20C%206.664%201.036%205.6000004%200.16800001%204.368%200.16800001%20C%202.8700001%200.16800001%202.086%201.47%202.086%203.052%20C%202.086%203.542%202.184%204.2000003%202.3660002%204.998%20C%202.7440002%206.65%203.696%208.106%204.9420004%208.862%20C%205.544%209.226%206.132%209.408%206.6920004%209.408%20C%208.204%209.408%209.016001%208.204%209.016001%206.636%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC29815037FEBE1DB3851C97DD6554796%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.656%205.208%20C%205.558%205.208%205.46%205.1800003%205.3900003%205.124%20L%203.7380002%203.9060001%20L%203.9480002%205.9500003%20C%203.99%206.23%203.766%206.4680004%203.5%206.4680004%20C%203.2340002%206.4680004%203.01%206.23%203.052%205.9500003%20L%203.262%203.9060001%20L%201.61%205.124%20C%201.5400001%205.1800003%201.442%205.208%201.3440001%205.208%20C%201.092%205.208%200.882%204.998%200.882%204.7460003%20C%200.882%204.55%200.98%204.4100003%201.1620001%204.326%20L%203.038%203.5%20L%201.1620001%202.674%20C%200.98%202.5900002%200.882%202.45%200.882%202.2540002%20C%200.882%202.002%201.092%201.792%201.3440001%201.792%20C%201.442%201.792%201.5400001%201.82%201.61%201.876%20L%203.262%203.094%20L%203.052%201.0500001%20C%203.01%200.77000004%203.2340002%200.546%203.5%200.546%20C%203.766%200.546%203.99%200.77000004%203.9480002%201.0500001%20L%203.7380002%203.094%20L%205.3900003%201.876%20C%205.46%201.82%205.558%201.792%205.656%201.792%20C%205.81%201.792%205.9360003%201.8620001%206.0340004%201.988%20C%206.244%202.2680001%206.09%202.562%205.8380003%202.674%20L%203.9620001%203.5%20L%205.8380003%204.326%20C%206.02%204.4100003%206.118%204.55%206.118%204.7460003%20C%206.118%204.998%205.908%205.208%205.656%205.208%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gC5F555A495D0EE6DFEAE35D381A2DF39%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%208.316%200.224%20C%208.316%200.07%208.400001%200%208.582001%200%20L%2010.304%200.042000003%20C%2010.626%200.056%2011.76%200%2012.026%200%20C%2012.236%200%2012.348001%200.112%2012.348001%200.33600003%20C%2012.348001%200.476%2012.208%200.546%2011.9140005%200.546%20C%2011.34%200.546%2011.06%200.602%2011.06%200.72800004%20C%2011.06%200.77000004%2011.088%200.86800003%2011.13%201.0500001%20L%2012.978001%208.428%20C%2013.048%208.722%2013.188001%208.904%2013.370001%208.974%20C%2013.454%209.002%2013.706%209.016001%2014.112%209.016001%20C%2014.462001%209.016001%2014.616%209.030001%2014.616%209.352%20C%2014.616%209.492001%2014.476001%209.562%2014.182%209.562%20L%2012.348001%209.562%20C%2011.942%209.562%2011.942%209.534%2011.76%209.268001%20L%206.776%201.5120001%20L%205.7120004%209.198%20C%205.656%209.548%205.6280003%209.562%205.222%209.562%20L%203.318%209.562%20C%203.01%209.562%202.8560002%209.548%202.8560002%209.240001%20C%202.8560002%209.086%203.01%209.016001%203.3040001%209.016001%20C%203.584%209.016001%204.158%209.058001%204.158%208.834001%20C%204.158%208.806001%204.144%208.722%204.102%208.582001%20L%202.338%201.5400001%20C%202.2120001%201.008%201.8900001%200.68600005%201.4000001%200.588%20C%201.0500001%200.546%200.588%200.602%200.588%200.224%20C%200.588%200.07%200.67200005%200%200.84000003%200%20C%201.092%200%201.9740001%200.042000003%202.226%200.042000003%20C%202.492%200.042000003%203.388%200%203.654%200%20C%203.864%200%203.9620001%200.112%203.9620001%200.33600003%20C%203.9620001%200.462%203.864%200.532%203.654%200.546%20C%203.066%200.546%202.772%200.72800004%202.772%201.092%20C%202.772%201.148%202.786%201.246%202.828%201.4000001%20L%204.6480002%208.694%20L%205.81%200.36400002%20C%205.852%200.126%205.9360003%200%206.076%200%20C%206.188%200%206.3%200.098000005%206.426%200.28%20L%2011.872001%208.778%20L%209.968%201.148%20C%209.884001%200.84000003%209.744%200.658%209.534%200.588%20C%209.450001%200.56%209.184%200.546%208.75%200.546%20C%208.456%200.546%208.316%200.518%208.316%200.224%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA20D99DEB48F63DF51432D4DAC149B8B%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.772%205.138%20L%201.12%205.138%20C%200.896%205.138%200.78400004%205.026%200.78400004%204.816%20C%200.78400004%204.606%200.896%204.494%201.12%204.494%20L%209.772%204.494%20C%209.996%204.494%2010.108001%204.606%2010.108001%204.816%20C%2010.108001%204.984%209.954%205.138%209.772%205.138%20Z%20M%209.772%202.506%20L%201.12%202.506%20C%200.896%202.506%200.78400004%202.394%200.78400004%202.184%20C%200.78400004%201.9740001%200.896%201.8620001%201.12%201.8620001%20L%209.772%201.8620001%20C%209.996%201.8620001%2010.108001%201.9740001%2010.108001%202.184%20C%2010.108001%202.3660002%209.954%202.506%209.772%202.506%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9FD281F757E421BF29CC0CC2C6A0A0DD%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.934%206.23%20C%203.43%206.23%202.926%205.992%202.436%205.5160003%20L%203.4020002%209.5060005%20C%203.374%209.632%203.332%209.716001%203.164%209.716001%20C%202.7020001%209.716001%201.6800001%209.59%201.498%209.576%20C%201.288%209.548%201.176%209.450001%201.176%209.240001%20C%201.176%209.1%201.302%209.030001%201.5680001%209.030001%20C%201.8340001%209.030001%202.198%209.044001%202.198%208.848001%20C%202.198%208.792%202.128%208.512%202.002%207.9940004%20L%200.882%203.486%20C%200.72800004%202.898%200.658%202.4220002%200.658%202.072%20C%200.658%200.86800003%201.302%20-0.154%202.45%20-0.154%20C%203.3600001%20-0.154%204.158%200.308%204.8580003%201.246%20C%205.4880004%202.114%205.81%203.0240002%205.81%203.9620001%20C%205.81%205.1800003%205.096%206.23%203.934%206.23%20Z%20M%203.9060001%205.81%20C%204.452%205.81%204.718%205.3900003%204.718%204.564%20C%204.718%204.1860003%204.6340003%203.6820002%204.466%203.052%20C%204.158%201.8620001%203.752%201.0500001%203.262%200.616%20C%202.982%200.37800002%202.716%200.266%202.45%200.266%20C%201.876%200.266%201.5960001%200.71400005%201.5960001%201.61%20C%201.5960001%201.9180001%201.666%202.38%201.8060001%202.996%20L%202.114%204.256%20C%202.1560001%204.466%202.226%204.6200004%202.3100002%204.7320004%20C%202.8560002%205.446%203.388%205.81%203.9060001%205.81%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gE906720DD5EAA7F79EE1865E5225DBCD%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.9694%206.5072002%20C%202.548%206.0956%201.9208%205.8898%201.0682%205.8898%20L%201.0682%205.4586%20C%201.6464%205.4586%202.107%205.5468%202.4598%205.7134%20L%202.4598%200.833%20C%202.4598%200.7056%202.45%200.6272%202.4206%200.588%20C%202.3716%200.4802%202.0776%200.4214%201.5386%200.4214%20L%201.1368%200.4214%20L%201.1368%200%20L%202.8812%200.0392%20L%204.6354%200%20L%204.6354%200.4214%20L%204.2336%200.4214%20C%203.6946%200.4214%203.4006%200.4802%203.3418%200.588%20C%203.3222%200.6272%203.3124%200.7056%203.3124%200.833%20L%203.3124%206.1936%20C%203.3124%206.4582%203.2732%206.5072002%202.9694%206.5072002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g511D4CBFEEF3F0A6817E70620AFFABD9%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.318%209.324%20C%202.604%209.324%202.002%209.0720005%201.4840001%208.568%20C%200.966%208.064%200.70000005%207.4760003%200.70000005%206.762%20C%200.70000005%206.2860003%201.0500001%205.9360003%201.4840001%205.9360003%20C%201.904%205.9360003%202.2540002%206.3%202.2540002%206.7200003%20C%202.2540002%207.182%201.9180001%207.504%201.47%207.504%20C%201.4280001%207.504%201.4000001%207.504%201.3720001%207.4900002%20C%201.638%208.176001%202.2540002%208.778%203.1360002%208.778%20C%204.284%208.778%204.928%207.7840004%204.928%206.5800004%20C%204.928%205.642%204.452%204.6340003%203.5%203.5700002%20L%200.86800003%200.602%20C%200.68600005%200.39200002%200.70000005%200.40600002%200.70000005%200%20L%205.894%200%20L%206.3%202.52%20L%205.8380003%202.52%20C%205.7260003%201.8060001%205.6280003%201.4000001%205.544%201.274%20C%205.474%201.204%205.0540004%201.176%204.284%201.176%20L%201.9460001%201.176%20L%203.3040001%202.506%20C%204.256%203.4020002%205.46%204.368%205.866%205.11%20C%206.1460004%205.6000004%206.2860003%206.09%206.2860003%206.5800004%20C%206.2860003%208.232%204.998%209.324%203.318%209.324%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gFEADC51D6C0C6F3761C64B26F4C7CFB7%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.1564%203.0870001%20C%201.2054%203.0870001%201.2642%203.1262%201.3132%203.1948001%20C%201.6072%203.6358001%202.009%203.8514001%202.5186%203.8514001%20C%202.8616%203.8514001%203.1262%203.6554%203.3026001%203.2536001%20C%203.4104002%202.989%203.4692001%202.5872%203.4692001%202.0482001%20C%203.4692001%201.4308%203.3908%200.9996%203.2438%200.74480003%20C%202.9988%200.343%202.6656%200.1372%202.2442%200.1372%20C%201.5876%200.1372%201.0682%200.60760003%200.8918%201.1172%20C%200.92120004%201.1074001%200.9408%201.1172%200.98%201.1172%20C%201.274%201.1172%201.519%201.3426%201.519%201.6366%20C%201.519%201.9404%201.274%202.1462%200.98%202.1462%20C%200.637%202.1462%200.49%201.96%200.49%201.5974001%20C%200.49%200.6174%201.2838%20-0.2156%202.2638001%20-0.2156%20C%202.8616%20-0.2156%203.3712%200%203.7828%200.4312%20C%204.1944%200.8624%204.4002%201.3818%204.4002%201.9796001%20C%204.4002%202.548%204.2336%203.038%203.9004002%203.4594%20C%203.5378%203.92%203.0870001%204.1454%202.5382001%204.1454%20C%202.0776%204.1454%201.6758%203.9984%201.3524001%203.7044%20L%201.3524001%205.4488%20C%201.617%205.3704%201.8718001%205.3312%202.1364%205.3312%20C%202.5872%205.3312%202.9792001%205.439%203.3124%205.6644%20C%203.6162%205.8506002%203.822%206.0368%203.9396%206.2132%20C%203.9984%206.2916%204.0278%206.3504%204.0278%206.3798%20C%204.0278%206.4778%203.9788%206.5268%203.8808%206.5268%20C%203.3418%206.321%202.8812%206.2132%202.5088%206.2132%20C%202.0678%206.2132%201.6464%206.3014%201.2446%206.4876%20C%201.1956%206.5072002%201.1564%206.517%201.1172%206.517%20C%201.029%206.517%200.98%206.4288%200.98%206.2426%20L%200.98%203.381%20C%200.98%203.1752%200.98%203.0870001%201.1564%203.0870001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g20CE9CDC27F6EE0077F897D966F1EC7B%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.1368%201.372%20C%200.81340003%201.372%200.6566%201.2054%200.6566%200.8722%20C%200.6566%200.1372%201.2544%20-0.2156%202.0286%20-0.2156%20C%202.8126001%20-0.2156%203.4398%200.1764%203.9004002%200.9702%20C%204.2826%201.6268001%204.4786%202.3814%204.4786%203.2242%20C%204.4786%204.4688%204.2532%205.3508%203.8024%205.8702%20C%203.4202%206.3112%202.9792001%206.5268%202.4794%206.5268%20C%201.9012%206.5268%201.421%206.321%201.0388%205.8996%20C%200.6174%205.4586%200.4116%204.9294%200.4116%204.3120003%20C%200.4116%203.7142%200.588%203.2046%200.9408%202.7832%20C%201.3132%202.3324%201.7934%202.107%202.3716%202.107%20C%202.8812%202.107%203.2732%202.3814%203.5378%202.9302%20L%203.5378%202.8028%20C%203.5378%201.7346001%203.3516%201.0094%202.9694%200.6174%20C%202.6656%200.294%202.3422%200.1372%202.0188%200.1372%20C%201.6268001%200.1372%201.3426%200.2254%201.1564%200.4116%20C%201.4602001%200.4116%201.617%200.588%201.617%200.8918%20C%201.617%201.1662%201.4112%201.372%201.1368%201.372%20Z%20M%202.3814%202.4108%20C%201.9992%202.4108%201.715%202.6068%201.519%202.9988%20C%201.4112%203.2242%201.3524001%203.6652%201.3524001%204.3022%20C%201.3524001%204.9392%201.421%205.3704%201.5484%205.6154%20C%201.764%206.0074%202.0776%206.2034%202.4794%206.2034%20C%202.8812%206.2034%203.1752%205.9584002%203.3614001%205.4684%20C%203.4692001%205.2038%203.5378%204.7530003%203.5378%204.116%20C%203.5378%203.2634%203.1556%202.4108%202.3814%202.4108%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gBD39A57F8DEFCE1502602BA203F5EBC7%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%209.772%203.8360002%20L%205.782%203.8360002%20L%205.782%207.826%20C%205.782%208.05%205.67%208.162001%205.446%208.162001%20C%205.222%208.162001%205.11%208.05%205.11%207.826%20L%205.11%203.8360002%20L%201.12%203.8360002%20C%200.896%203.8360002%200.78400004%203.7240002%200.78400004%203.5%20C%200.78400004%203.276%200.896%203.164%201.12%203.164%20L%205.11%203.164%20L%205.11%20-0.82600003%20C%205.11%20-1.0500001%205.222%20-1.1620001%205.446%20-1.1620001%20C%205.67%20-1.1620001%205.782%20-1.0500001%205.782%20-0.82600003%20L%205.782%203.164%20L%209.772%203.164%20C%209.996%203.164%2010.108001%203.276%2010.108001%203.5%20C%2010.108001%203.6820002%209.954%203.8360002%209.772%203.8360002%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gE06EA0171DCD9AE02098C9667B52A646%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.1662%204.1552%20C%201.4798%204.1552%201.715%204.3904%201.715%204.704%20C%201.715%205.0568%201.5288%205.243%201.1662%205.2528%20C%201.3818%205.7134%201.8718001%206.0858%202.5088%206.0858%20C%203.3712%206.0858%203.9396%205.439%203.9396%204.5766%20C%203.9396%204.1062%203.773%203.6554%203.43%203.2144%20C%203.2634%202.989%203.1360002%202.8322%203.0478%202.744%20L%200.7252%200.441%20C%200.5978%200.3234%200.6174%200.294%200.6174%200%20L%204.655%200%20L%204.9588%201.8424001%20L%204.5472%201.8424001%20C%204.4786%201.3230001%204.4002%201.0192%204.3120003%200.9506%20C%204.263%200.92120004%203.9592001%200.9016%203.381%200.9016%20L%201.715%200.9016%20C%202.3716%201.4798%202.9792001%201.9992%203.5574%202.4598%20C%203.9984%202.8028%204.3120003%203.1066%204.508%203.3712%20C%204.802%203.7534%204.949%204.1552%204.949%204.5766%20C%204.949%205.1842003%204.7138%205.6644%204.2336%206.0172%20C%203.8122%206.3406%203.283%206.5072002%202.6558%206.5072002%20C%202.1168%206.5072002%201.6562%206.3504%201.2544%206.0368%20C%200.833%205.6938%200.6174%205.2626%200.6174%204.7334%20C%200.6174%204.4002%200.8624%204.1552%201.1662%204.1552%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gEC19D4167A26C3B8598DB94D5F47C9FB%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.7534%204.9392%20C%204.0768%204.9392%204.2336%205.1058%204.2336%205.439%20C%204.2336%206.1446%203.7044%206.5268%202.9792001%206.5268%20C%202.1658%206.5268%201.519%206.1446%201.0388%205.3704%20C%200.6174%204.704%200.4116%203.9494%200.4116%203.0968%20C%200.4116%201.8522%200.637%200.98%201.0976%200.46060002%20C%201.4896001%200.0098%201.9404%20-0.2156%202.4598%20-0.2156%20C%203.0576%20-0.2156%203.5476%200.0098%203.9298%200.46060002%20C%204.2924%200.8918%204.4786%201.4112%204.4786%202.009%20C%204.4786%202.6068%204.3022%203.1164%203.9494%203.5378%20C%203.5770001%203.9886%203.0968%204.2238%202.5186%204.2238%20C%202.009%204.2238%201.617%203.9396%201.3524001%203.3908%20L%201.3524001%203.4496%20C%201.3524001%204.557%201.6268001%205.4978%202.2148001%205.929%20C%202.4696%206.1152%202.7342%206.2034%202.9988%206.2034%20C%203.3516%206.2034%203.6064%206.1054%203.773%205.8996%20C%203.4398%205.8996%203.2732%205.7134%203.2732%205.4194%20C%203.2732%205.145%203.479%204.9392%203.7534%204.9392%20Z%20M%203.3712%203.332%20C%203.479%203.1066%203.5378%202.6656%203.5378%202.0188%20C%203.5378%201.3818%203.4888%200.9604%203.381%200.74480003%20C%203.185%200.343%202.8812%200.1372%202.4598%200.1372%20C%202.1756%200.1372%201.96%200.2352%201.8032%200.4312%20C%201.6758%200.588%201.5876%200.7252%201.5484%200.833%20C%201.4308%201.1368%201.372%201.5974001%201.372%202.2246%20C%201.372%202.499%201.4112%202.7636%201.4798%203.0184%20C%201.6072%203.479%201.9698%203.9102%202.5088%203.9102%20C%202.891%203.9102%203.185%203.7142%203.3712%203.332%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g6C5A33022FC87BE2AB77504FB55433E4%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.4402%20-0.2156%20C%203.822%20-0.2156%204.508%200.9016%204.508%203.1360002%20C%204.508%204.6354%204.1944%205.635%203.5770001%206.125%20C%203.234%206.3896003%202.8518%206.5268%202.45%206.5268%20C%201.0682%206.5268%200.3822%205.3998003%200.3822%203.1360002%20C%200.3822%201.3328%200.8624%20-0.2156%202.4402%20-0.2156%20Z%20M%203.5378%205.1352%20C%203.6064%204.7922%203.6358001%204.165%203.6358001%203.2536001%20C%203.6358001%202.352%203.5966%201.6856%203.528%201.2544%20C%203.4006%200.4704%203.038%200.0784%202.4402%200.0784%20C%202.2148001%200.0784%201.9894%200.1666%201.7836%200.3332%20C%201.519%200.5586%201.3622%201.0192%201.2936%201.7248%20C%201.2642%201.9698%201.2544%202.4794%201.2544%203.2536001%20C%201.2544%204.1062%201.2838%204.704%201.3328%205.0274%20C%201.421%205.5664%201.5974001%205.9094%201.8718001%206.0564003%20C%202.0874%206.1740003%202.2736%206.2328%202.4402%206.2328%20C%203.0772%206.2328%203.43%205.7134%203.5378%205.1352%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g75F6FDD9F0B20D366E0FC7DE03DC23C9%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.4594%203.4594%20C%204.116%203.724%204.7432%204.3022%204.7432%205.1352%20C%204.7432%205.5762%204.508%205.929%204.0474%206.1838%20C%203.6652%206.3994%203.234%206.5072002%202.7538%206.5072002%20C%202.2736%206.5072002%201.8522%206.4092%201.4896001%206.2034%20C%201.0486%205.9584002%200.8232%205.6154%200.8232%205.1744%20C%200.8232%204.802%201.0094%204.6158%201.372%204.6158%20C%201.6758%204.6158%201.9012%204.851%201.9012%205.1548%20C%201.9012%205.4586%201.7444%205.635%201.4406%205.684%20C%201.7248%205.9878%202.1462%206.1446%202.7244%206.1446%20C%203.3614001%206.1446%203.724%205.7624%203.724%205.1352%20C%203.724%204.6746%203.5966%204.3022%203.3516%204.0082%20C%203.0772%203.6848001%202.8812%203.6358001%202.3128%203.5966%20C%202.0482001%203.5770001%201.8718001%203.6064%201.8718001%203.4104002%20C%201.8718001%203.2928%201.9698%203.234%202.1560001%203.234%20L%202.6754%203.234%20C%203.5182002%203.234%203.9298%202.5970001%203.9298%201.715%20C%203.9298%200.85260004%203.5378%200.19600001%202.7146%200.19600001%20C%201.9992%200.19600001%201.4798%200.39200002%201.1564%200.7938%20C%201.4994%200.833%201.6758%201.029%201.6758%201.372%20C%201.6758%201.6954%201.4308%201.9404%201.1074001%201.9404%20C%200.7252%201.9404%200.5292%201.7444%200.5292%201.3426%20C%200.5292%200.8428%200.78400004%200.441%201.2838%200.1568%20C%201.7052001%20-0.0784%202.1854%20-0.19600001%202.7342%20-0.19600001%20C%203.332%20-0.19600001%203.8514001%20-0.0294%204.3022%200.30380002%20C%204.7922%200.6664%205.0372%201.1368%205.0372%201.715%20C%205.0372%202.6264%204.2434%203.2536001%203.4594%203.4594%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g46F65EB1E2AABF20CDCE392309712DE6%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.6362%206.5268%20C%202.2344%206.1152%201.6464%205.9094%200.8722%205.9094%20L%200.8722%205.5272%20C%201.3818%205.5272%201.8032%205.6056%202.1266%205.7624%20L%202.1266%200.8036%20C%202.1266%200.6272%202.0874%200.5096%201.9992%200.46060002%20C%201.911%200.4116%201.666%200.3822%201.274%200.3822%20L%200.931%200.3822%20L%200.931%200%20C%201.176%200.0196%201.7052001%200.0294%202.5186%200.0294%20C%203.332%200.0294%203.8612%200.0196%204.1062%200%20L%204.1062%200.3822%20L%203.7632%200.3822%20C%203.3614001%200.3822%203.1164%200.4116%203.038%200.46060002%20C%202.9596%200.5096%202.9106%200.6272%202.9106%200.8036%20L%202.9106%206.2328%20C%202.9106%206.468%202.891%206.5268%202.6362%206.5268%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g3C327C935E470A38F2BE1D8AC3E3518D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.8612%206.6052003%20C%203.7534%206.6052003%203.6554%206.5562%203.5770001%206.4582%20L%200.3822%201.9894%20L%200.3822%201.5876%20L%203.2144%201.5876%20L%203.2144%200.833%20C%203.2144%200.6664%203.185%200.5488%203.1164%200.4998%20C%203.0478%200.4508%202.8322%200.4214%202.4794%200.4214%20L%202.1756%200.4214%20L%202.1756%200%20L%203.6554%200.0392%20L%205.1548%200%20L%205.1548%200.4214%20L%204.8608003%200.4214%20C%204.4982%200.4214%204.2826%200.4508%204.214%200.4998%20C%204.1454%200.5488%204.116%200.6664%204.116%200.833%20L%204.116%201.5876%20L%205.1842003%201.5876%20L%205.1842003%202.0188%20L%204.116%202.0188%20L%204.116%206.2916%20C%204.116%206.5268%204.0866%206.6052003%203.8612%206.6052003%20Z%20M%203.283%205.3998003%20L%203.283%202.0188%20L%200.85260004%202.0188%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g2CA440A06928E9150572C4388842E58A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.3226001%206.5268%20C%201.8228%206.5268%201.4014%206.3504%201.0388%205.9976%20C%200.67620003%205.6448%200.49%205.2332%200.49%204.7334%20C%200.49%204.4002%200.735%204.1552%201.0388%204.1552%20C%201.3328%204.1552%201.5778%204.41%201.5778%204.704%20C%201.5778%205.0274%201.3426%205.2528%201.029%205.2528%20C%200.9996%205.2528%200.98%205.2528%200.9604%205.243%20C%201.1466%205.7232%201.5778%206.1446%202.1952%206.1446%20C%202.9988%206.1446%203.4496%205.4488%203.4496%204.606%20C%203.4496%203.9494%203.1164%203.2438%202.45%202.499%20L%200.60760003%200.4214%20C%200.4802%200.2744%200.49%200.2842%200.49%200%20L%204.1258%200%20L%204.41%201.764%20L%204.0866%201.764%20C%204.0082%201.2642%203.9396%200.98%203.8808%200.8918%20C%203.8318%200.8428%203.5378%200.8232%202.9988%200.8232%20L%201.3622%200.8232%20L%202.3128%201.7542%20C%202.9792001%202.3814%203.822%203.0576%204.1062%203.5770001%20C%204.3022%203.92%204.4002%204.263%204.4002%204.606%20C%204.4002%205.7624%203.4986%206.5268%202.3226001%206.5268%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF998BB2F32C36A5EAA1463AADF736C68%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%201.3524001%203.0282001%20C%201.421%203.0282001%201.4896001%203.0772%201.5680001%203.1752%20C%201.8816%203.5770001%202.3226001%203.773%202.8812%203.773%20C%203.5966%203.773%203.9592001%203.185%203.9592001%202.0188%20C%203.9592001%201.4504%203.8612%201.029%203.675%200.7546%20C%203.4104002%200.3822%203.0478%200.19600001%202.5774%200.19600001%20C%201.8914%200.19600001%201.3426%200.588%201.127%201.0976%20C%201.4406%201.0976%201.6562%201.3034%201.6562%201.617%20C%201.6562%201.9306%201.4504%202.1462%201.1368%202.1462%20C%200.81340003%202.0972%200.6174%201.9404%200.6174%201.5876%20C%200.6174%201.0682%200.8232%200.637%201.2348%200.294%20C%201.617%20-0.0294%202.0776%20-0.19600001%202.5970001%20-0.19600001%20C%203.234%20-0.19600001%203.7828%200.0196%204.2532%200.4312%20C%204.7236%200.8428%204.949%201.3622%204.949%201.9796001%20C%204.949%202.5774%204.7432%203.0772%204.3512%203.4986%20C%203.9592001%203.92%203.4692001%204.1258%202.891%204.1258%20C%202.3716%204.1258%201.9404%203.9788%201.5778%203.6946%20L%201.5778%205.39%20C%201.8914%205.3116%202.1952%205.2724%202.4794%205.2724%20C%202.8616%205.2724%203.2242%205.3508%203.5672%205.5174003%20C%203.8416%205.6448%204.5374002%206.0466%204.5374002%206.3308%20C%204.5374002%206.4484%204.4786%206.5072002%204.3708%206.5072002%20C%203.8318%206.3014%203.3222%206.1936%202.8518%206.1936%20C%202.3716%206.1936%201.9012%206.2818003%201.4602001%206.4582%20C%201.3916%206.4876%201.3524001%206.5072002%201.3230001%206.5072002%20C%201.2152001%206.5072002%201.1564%206.4092%201.1564%206.2034%20L%201.1564%203.3516%20C%201.1564%203.1556%201.1662%203.0282001%201.3524001%203.0282001%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gECAA2FA0C5D9D207927DF13680E23E66%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%202.9694%203.4594%20C%203.6162%203.7044%204.2238%204.3218%204.2238%205.1548%20C%204.2238%205.5762%204.018%205.9192%203.6162%206.1838%20C%203.2634%206.4092%202.8616%206.5268%202.4108%206.5268%20C%201.9698%206.5268%201.5876%206.4092%201.2446%206.1838%20C%200.8624%205.929%200.6664%205.5958%200.6664%205.1744%20C%200.6664%204.851%200.882%204.6256%201.1956%204.6256%20C%201.5092%204.6256%201.7248%204.851%201.7248%205.1646%20C%201.7248%205.488%201.5386%205.6644%201.1662%205.684%20C%201.421%206.027%201.8228%206.2034%202.3716%206.2034%20C%202.9596%206.2034%203.2536001%205.8604%203.2536001%205.1646%20C%203.2536001%204.7530003%203.1752%204.41%203.0282001%204.1258%20C%202.7636%203.6554%202.401%203.5672%201.7934%203.5672%20C%201.6758%203.5476%201.617%203.4986%201.617%203.4104002%20C%201.617%203.2634%201.6856%203.2634%201.8816%203.2634%20L%202.303%203.2634%20C%203.038%203.2634%203.4104002%202.744%203.4104002%201.6954%20C%203.4104002%200.8624%203.1066%200.1372%202.3618%200.1372%20C%201.7248%200.1372%201.2544%200.3528%200.9702%200.78400004%20C%201.3132%200.7742%201.5680001%201.029%201.5680001%201.3622%20C%201.5680001%201.6954%201.3230001%201.9404%200.98980004%201.9404%20C%200.60760003%201.9404%200.4116%201.7444%200.4116%201.3426%20C%200.4116%200.8624%200.6272%200.4802%201.0584%200.1764%20C%201.4406%20-0.0882%201.8914%20-0.2156%202.3912%20-0.2156%20C%202.9498%20-0.2156%203.43%20-0.0294%203.8514001%200.3332%20C%204.2728%200.6958%204.4786%201.1466%204.4786%201.6954%20C%204.4786%202.6166%203.7534%203.2536001%202.9694%203.4594%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g991B0963DB1C3747A448E938A485B680%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.0340004%206.342%20C%205.5020003%206.342%205.012%206.132%204.564%205.7120004%20C%204.144%206.0340004%203.6680002%206.188%203.122%206.188%20C%201.9180001%206.188%200.82600003%205.2920003%200.82600003%204.116%20C%200.82600003%203.528%201.036%203.052%201.4560001%202.6880002%20C%201.19%202.352%201.0500001%201.9740001%201.0500001%201.5400001%20C%201.0500001%201.008%201.232%200.602%201.582%200.33600003%20C%200.994%200.14%200.39200002%20-0.36400002%200.39200002%20-1.0780001%20C%200.39200002%20-1.6800001%200.78400004%20-2.1560001%201.554%20-2.492%20C%202.142%20-2.7580001%202.786%20-2.884%203.486%20-2.884%20C%204.2000003%20-2.884%204.8580003%20-2.7580001%205.446%20-2.492%20C%206.216%20-2.1560001%206.5940003%20-1.6800001%206.5940003%20-1.0500001%20C%206.5940003%20-0.308%206.2860003%200.238%205.67%200.588%20C%205.026%200.938%204.3120003%200.98%203.276%200.98%20C%202.66%200.98%202.3240001%200.98%202.2540002%200.994%20C%201.8620001%201.0500001%201.582%201.4280001%201.582%201.8620001%20C%201.582%202.072%201.638%202.2680001%201.764%202.436%20C%202.1560001%202.17%202.604%202.03%203.122%202.03%20C%204.326%202.03%205.4040003%202.926%205.4040003%204.102%20C%205.4040003%204.6480002%205.222%205.096%204.8580003%205.446%20C%205.208%205.768%205.586%205.9220004%205.992%205.9220004%20C%205.9220004%205.852%205.88%205.7400002%205.88%205.6000004%20C%205.88%205.2920003%206.0340004%205.138%206.342%205.138%20C%206.636%205.138%206.7900004%205.2920003%206.7900004%205.6140003%20C%206.7900004%206.0480003%206.454%206.342%206.0340004%206.342%20Z%20M%203.122%205.754%20C%203.878%205.754%204.256%205.208%204.256%204.116%20C%204.256%203.01%203.878%202.45%203.122%202.45%20C%202.352%202.45%201.9740001%202.996%201.9740001%204.102%20C%201.9740001%205.208%202.352%205.754%203.122%205.754%20Z%20M%202.296%200.056%20L%203.108%200.056%20C%203.8360002%200.056%204.4240003%200.014%204.872%20-0.08400001%20C%205.474%20-0.21000001%205.768%20-0.546%205.768%20-1.0780001%20C%205.768%20-1.526%205.4880004%20-1.876%204.928%20-2.142%20C%204.494%20-2.352%204.018%20-2.45%203.5%20-2.45%20C%202.996%20-2.45%202.52%20-2.352%202.072%20-2.142%20C%201.498%20-1.876%201.218%20-1.526%201.218%20-1.0780001%20C%201.218%20-0.49%201.722%200.056%202.296%200.056%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g70167D9F78947E3E6F095C01BD26FE69%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%206.762%201.274%20L%206.762%202.1000001%20L%206.314%202.1000001%20L%206.314%201.274%20C%206.314%200.72800004%206.1600003%200.448%205.866%200.448%20C%205.586%200.448%205.418%200.79800004%205.418%201.0780001%20L%205.418%203.8360002%20C%205.418%204.326%205.362%204.69%205.264%204.9420004%20C%204.928%205.768%203.9620001%206.2720003%202.982%206.2720003%20C%201.904%206.2720003%200.84000003%205.67%200.84000003%204.662%20C%200.84000003%204.2000003%201.0780001%203.9620001%201.5400001%203.9620001%20C%202.002%203.9620001%202.226%204.1860003%202.226%204.6480002%20C%202.226%205.0540004%202.016%205.2920003%201.582%205.334%20C%201.8900001%205.684%202.352%205.866%202.954%205.866%20C%203.822%205.866%204.354%205.0680003%204.354%204.158%20L%204.354%203.696%20C%203.262%203.6260002%202.436%203.4580002%201.8620001%203.1920002%20C%200.924%202.7580001%200.448%202.1560001%200.448%201.358%20C%200.448%200.994%200.588%200.68600005%200.85400003%200.448%20C%201.302%200.042000003%201.9180001%20-0.154%202.7020001%20-0.154%20C%203.528%20-0.154%204.116%200.19600001%204.48%200.91%20C%204.578%200.37800002%204.9700003%20-0.08400001%205.572%20-0.08400001%20C%206.314%20-0.08400001%206.762%200.504%206.762%201.274%20Z%20M%202.8000002%200.252%20C%202.1560001%200.252%201.6240001%200.72800004%201.6240001%201.3720001%20C%201.6240001%202.674%202.982%203.2340002%204.354%203.3040001%20L%204.354%201.9740001%20C%204.354%201.036%203.7380002%200.252%202.8000002%200.252%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g635164249C8906C958C278A56C2A2A5A%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.096%205.2920003%20C%205.096%205.8380003%204.578%206.188%204.032%206.188%20C%203.318%206.188%202.772%205.768%202.408%204.914%20L%202.408%206.188%20L%200.39200002%206.0340004%20L%200.39200002%205.5020003%20C%200.882%205.5020003%201.176%205.46%201.288%205.3760004%20C%201.4000001%205.2920003%201.4560001%205.11%201.4560001%204.788%20L%201.4560001%201.1060001%20C%201.4560001%200.84000003%201.414%200.67200005%201.316%200.616%20C%201.218%200.56%200.91%200.532%200.39200002%200.532%20L%200.39200002%200%20L%202.002%200.042000003%20C%202.5900002%200.056%203.1920002%200.042000003%203.7940001%200%20L%203.7940001%200.532%20L%203.4580002%200.532%20C%202.996%200.532%202.7020001%200.574%202.604%200.644%20C%202.506%200.71400005%202.464%200.882%202.464%201.1340001%20L%202.464%203.2480001%20C%202.464%203.8500001%202.576%204.396%202.786%204.8580003%20C%203.066%205.46%203.4720001%205.768%204.018%205.782%20C%203.878%205.642%203.808%205.474%203.808%205.2780004%20C%203.808%204.8440003%204.018%204.6340003%204.452%204.6340003%20C%204.83%204.6340003%205.096%204.928%205.096%205.2920003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g36FAC13BE36CC9908761C7B7A28ED76D%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.172%20-0.154%20C%205.04%20-0.154%205.782%200.154%206.3840003%200.78400004%20C%206.986%201.414%207.294%202.1560001%207.294%203.038%20C%207.294%203.8920002%207.0140004%204.6480002%206.44%205.2780004%20C%205.866%205.908%205.1660004%206.23%204.3120003%206.23%20C%203.6260002%206.23%203.01%205.964%202.492%205.418%20L%202.492%209.716001%20L%200.39200002%209.562%20L%200.39200002%209.030001%20C%200.896%209.030001%201.204%208.988%201.316%208.904%20C%201.4280001%208.820001%201.47%208.624001%201.47%208.302%20L%201.47%200%20L%201.904%200%20L%202.3660002%200.81200004%20C%202.8140001%200.16800001%203.4160001%20-0.154%204.172%20-0.154%20Z%20M%204.116%200.266%20C%203.542%200.266%203.066%200.532%202.716%201.0780001%20C%202.5900002%201.26%202.5340002%201.4560001%202.5340002%201.638%20L%202.5340002%204.48%20C%202.5340002%204.662%202.576%204.816%202.674%204.9560003%20C%203.0800002%205.53%203.598%205.81%204.256%205.81%20C%204.83%205.81%205.2920003%205.53%205.656%204.9560003%20C%205.908%204.5360003%206.0340004%203.9060001%206.0340004%203.052%20C%206.0340004%201.5400001%205.5020003%200.266%204.116%200.266%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gFE7230AB8941C0094649472F0F0E3D3B%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.81%203.5140002%20C%205.81%205.124%204.872%206.2720003%203.3040001%206.2720003%20C%202.464%206.2720003%201.764%205.9500003%201.19%205.2920003%20C%200.658%204.676%200.39200002%203.934%200.39200002%203.0800002%20C%200.39200002%202.198%200.68600005%201.4560001%201.274%200.81200004%20C%201.8620001%200.16800001%202.5900002%20-0.154%203.4580002%20-0.154%20C%204.256%20-0.154%204.872%200.126%205.2920003%200.67200005%20C%205.642%201.1340001%205.81%201.47%205.81%201.694%20C%205.81%201.8340001%205.7260003%201.904%205.572%201.904%20C%205.46%201.904%205.3900003%201.8340001%205.348%201.6800001%20C%205.04%200.75600004%204.438%200.294%203.542%200.294%20C%202.9120002%200.294%202.4220002%200.588%202.0440001%201.19%20C%201.778%201.6240001%201.6520001%202.282%201.638%203.1780002%20L%205.418%203.1780002%20C%205.7260003%203.1780002%205.81%203.206%205.81%203.5140002%20Z%20M%204.564%204.886%20C%204.718%204.4240003%204.788%203.976%204.788%203.5700002%20L%201.6520001%203.5700002%20C%201.694%204.494%201.932%205.124%202.352%205.446%20C%202.7020001%205.7260003%203.01%205.866%203.3040001%205.866%20C%203.934%205.866%204.354%205.544%204.564%204.886%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gF5CBC308C90E424FD0E2C4E823179B58%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%203.486%20-0.154%20C%204.354%20-0.154%205.0820003%200.154%205.684%200.77000004%20C%206.2860003%201.386%206.5940003%202.128%206.5940003%202.996%20C%206.5940003%203.878%206.3%204.6480002%205.7120004%205.2920003%20C%205.124%205.9360003%204.382%206.2720003%203.5%206.2720003%20C%202.618%206.2720003%201.8900001%205.9360003%201.288%205.2920003%20C%200.68600005%204.6480002%200.39200002%203.878%200.39200002%202.996%20C%200.39200002%202.128%200.68600005%201.386%201.288%200.77000004%20C%201.8900001%200.154%202.632%20-0.154%203.486%20-0.154%20Z%20M%203.5%200.294%20C%202.828%200.294%202.3240001%200.588%201.9740001%201.19%20C%201.75%201.582%201.638%202.226%201.638%203.108%20C%201.638%203.9620001%201.75%204.578%201.96%204.9700003%20C%202.296%205.572%202.8000002%205.866%203.486%205.866%20C%204.144%205.866%204.6480002%205.572%204.998%204.998%20C%205.236%204.606%205.348%203.976%205.348%203.108%20C%205.348%201.4840001%204.872%200.294%203.5%200.294%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gBAFDCEF15BAA8D9B8139B94A493874D9%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.396%205.782%20C%205.026%205.782%205.348%205.2920003%205.348%204.2980003%20L%205.348%201.1060001%20C%205.348%200.84000003%205.306%200.67200005%205.208%200.616%20C%205.11%200.56%204.802%200.532%204.284%200.532%20L%204.284%200%20L%205.894%200.042000003%20L%207.4900002%200%20L%207.4900002%200.532%20C%207.0420003%200.532%206.748%200.546%206.6080003%200.588%20C%206.4680004%200.63%206.412%200.72800004%206.412%200.896%20L%206.412%203.5140002%20C%206.412%204.172%206.3980002%204.6340003%206.3560004%204.9%20C%206.216%205.754%205.586%206.188%204.48%206.188%20C%203.598%206.188%202.94%205.768%202.506%204.928%20L%202.506%206.188%20L%200.448%206.0340004%20L%200.448%205.5020003%20C%200.952%205.5020003%201.26%205.46%201.3720001%205.3760004%20C%201.4840001%205.2920003%201.526%205.11%201.526%204.788%20L%201.526%201.1060001%20C%201.526%200.84000003%201.47%200.67200005%201.3720001%200.616%20C%201.274%200.56%200.966%200.532%200.448%200.532%20L%200.448%200%20L%202.058%200.042000003%20L%203.654%200%20L%203.654%200.532%20C%203.1360002%200.532%202.842%200.56%202.7440002%200.616%20C%202.6460001%200.67200005%202.5900002%200.84000003%202.5900002%201.1060001%20L%202.5900002%203.6260002%20C%202.5900002%204.76%203.3040001%205.782%204.396%205.782%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g82A3C93819339CDE4B9DB030F705A7F5%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.6480002%201.764%20L%204.6480002%202.604%20L%204.2000003%202.604%20L%204.2000003%201.792%20C%204.2000003%201.092%203.9480002%200.308%203.332%200.308%20C%202.7580001%200.308%202.4780002%200.78400004%202.4780002%201.7360001%20L%202.4780002%205.53%20L%204.4240003%205.53%20L%204.4240003%206.0620003%20L%202.4780002%206.0620003%20L%202.4780002%208.610001%20L%202.03%208.610001%20C%202.016%208.148001%201.9740001%207.742%201.876%207.3780003%20C%201.638%206.454%201.092%205.978%200.266%205.9360003%20L%200.266%205.53%20L%201.4280001%205.53%20L%201.4280001%201.764%20C%201.4280001%200.938%201.6800001%200.40600002%202.17%200.14%20C%202.548%20-0.056%202.898%20-0.154%203.2480001%20-0.154%20C%204.172%20-0.154%204.6480002%200.77000004%204.6480002%201.764%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g9CDF6677C6904BF21588679C6E1D863%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.396%205.81%20C%205.026%205.81%205.348%205.32%205.348%204.326%20L%205.348%201.1060001%20C%205.348%200.84000003%205.306%200.67200005%205.208%200.616%20C%205.11%200.56%204.802%200.546%204.284%200.546%20L%204.284%200%20L%205.894%200.042000003%20L%207.4900002%200%20L%207.4900002%200.546%20C%207.0420003%200.546%206.748%200.56%206.6080003%200.602%20C%206.4680004%200.644%206.412%200.74200004%206.412%200.896%20L%206.412%203.542%20C%206.412%204.214%206.3980002%204.676%206.3560004%204.9420004%20C%206.216%205.796%205.586%206.23%204.48%206.23%20C%203.6260002%206.23%202.982%205.8380003%202.548%205.0540004%20L%202.548%209.716001%20L%200.448%209.562%20L%200.448%209.030001%20C%200.952%209.030001%201.26%208.988%201.3720001%208.904%20C%201.4840001%208.820001%201.526%208.624001%201.526%208.302%20L%201.526%201.1060001%20C%201.526%200.84000003%201.47%200.67200005%201.3720001%200.616%20C%201.274%200.56%200.966%200.546%200.448%200.546%20L%200.448%200%20L%202.058%200.042000003%20L%203.654%200%20L%203.654%200.546%20C%203.1360002%200.546%202.842%200.56%202.7440002%200.616%20C%202.6460001%200.67200005%202.5900002%200.84000003%202.5900002%201.1060001%20L%202.5900002%203.654%20C%202.5900002%204.788%203.3040001%205.81%204.396%205.81%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22gA873E1FBA54AB3FA08CE5633C811E17C%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.852%200.042000003%20C%206.1740003%200.056%206.636%200.042000003%207.2240005%200%20L%207.2240005%200.532%20C%206.4820004%200.532%206.202%200.546%205.908%200.938%20L%204.0880003%203.2900002%20C%204.69%204.032%205.096%204.5360003%205.32%204.802%20C%205.7120004%205.25%206.2580004%205.4880004%206.972%205.5020003%20L%206.972%206.0340004%20C%206.5800004%206.006%206.188%205.992%205.796%205.992%20C%205.2780004%205.992%204.816%206.006%204.4100003%206.0340004%20L%204.4100003%205.5020003%20C%204.676%205.474%204.816%205.348%204.816%205.124%20C%204.816%204.998%204.7460003%204.8440003%204.6200004%204.676%20L%203.808%203.6680002%20L%202.772%204.998%20C%202.7020001%205.096%202.66%205.1660004%202.66%205.208%20C%202.66%205.3900003%202.828%205.4880004%203.15%205.5020003%20L%203.15%206.0340004%20L%201.5960001%205.992%20C%201.232%205.978%200.78400004%205.992%200.238%206.0340004%20L%200.238%205.5020003%20C%200.74200004%205.5020003%201.064%205.46%201.204%205.3900003%20C%201.3440001%205.32%201.5680001%205.0820003%201.876%204.676%20L%203.206%202.94%20C%202.52%202.058%202.1000001%201.526%201.9460001%201.3440001%20C%201.498%200.79800004%200.91%200.532%200.16800001%200.532%20L%200.16800001%200%20C%200.68600005%200.042000003%201.0780001%200.056%201.3720001%200.042000003%20L%202.73%200%20L%202.73%200.532%20C%202.464%200.574%202.338%200.70000005%202.338%200.91%20C%202.338%200.966%202.352%201.036%202.38%201.1060001%20C%202.464%201.288%202.842%201.764%203.5140002%202.562%20L%204.5220003%201.246%20C%204.676%201.0500001%204.76%200.91%204.802%200.82600003%20C%204.802%200.644%204.6340003%200.546%204.2980003%200.532%20L%204.2980003%200%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g617799674A768A30994904FEE623C0E6%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%204.172%20-0.18200001%20C%205.04%20-0.18200001%205.782%200.126%206.3840003%200.75600004%20C%206.986%201.386%207.294%202.128%207.294%203.01%20C%207.294%203.864%207.0140004%204.592%206.4680004%205.208%20C%205.894%205.866%205.1940002%206.188%204.354%206.188%20C%203.64%206.188%203.0240002%205.908%202.492%205.362%20L%202.492%206.188%20L%200.39200002%206.0340004%20L%200.39200002%205.5020003%20C%200.91%205.5020003%201.218%205.474%201.316%205.4040003%20C%201.414%205.334%201.47%205.152%201.47%204.8580003%20L%201.47%20-1.61%20C%201.47%20-1.876%201.414%20-2.0440001%201.316%20-2.1000001%20C%201.218%20-2.1560001%200.91%20-2.17%200.39200002%20-2.17%20L%200.39200002%20-2.716%20L%201.988%20-2.674%20L%203.598%20-2.716%20L%203.598%20-2.17%20C%203.0800002%20-2.17%202.786%20-2.1560001%202.6880002%20-2.1000001%20C%202.5900002%20-2.0440001%202.5340002%20-1.876%202.5340002%20-1.61%20L%202.5340002%200.616%20C%202.842%200.18200001%203.444%20-0.18200001%204.172%20-0.18200001%20Z%20M%204.256%205.7260003%20C%204.83%205.7260003%205.2780004%205.4040003%205.6280003%204.76%20C%205.894%204.214%206.0340004%203.64%206.0340004%203.01%20C%206.0340004%202.352%205.88%201.75%205.572%201.204%20C%205.208%200.546%204.718%200.224%204.116%200.224%20C%203.528%200.224%203.066%200.504%202.716%201.0500001%20C%202.5900002%201.232%202.5340002%201.414%202.5340002%201.5960001%20L%202.5340002%204.662%20C%202.94%205.3760004%203.5140002%205.7260003%204.256%205.7260003%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%20%20%20%20%3Csymbol%20id%3D%22g74C05CB85E043836B4974B6059EDC60B%22%20overflow%3D%22visible%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cpath%20d%3D%22M%205.04%201.82%20C%205.04%202.884%204.3120003%203.556%202.8700001%203.8360002%20C%202.2120001%203.9620001%201.792%204.116%201.5680001%204.27%20C%201.3440001%204.4240003%201.232%204.6480002%201.232%204.914%20C%201.232%205.572%201.722%205.894%202.7020001%205.894%20C%203.654%205.894%204.172%205.362%204.242%204.284%20C%204.256%204.172%204.326%204.116%204.466%204.116%20C%204.6200004%204.116%204.704%204.242%204.704%204.494%20L%204.704%205.88%20C%204.704%206.1460004%204.6340003%206.2720003%204.494%206.2720003%20C%204.34%206.2720003%204.13%206.02%203.99%205.908%20C%203.64%206.1460004%203.206%206.2720003%202.7020001%206.2720003%20C%201.4560001%206.2720003%200.462%205.7120004%200.462%204.5220003%20C%200.462%204.046%200.658%203.64%201.064%203.318%20C%201.554%202.9120002%202.016%202.828%202.898%202.674%20C%203.808%202.492%204.27%202.086%204.27%201.4560001%20C%204.27%200.658%203.7800002%200.252%202.786%200.252%20C%201.82%200.252%201.204%200.896%200.938%202.17%20C%200.896%202.352%200.82600003%202.45%200.70000005%202.45%20C%200.546%202.45%200.462%202.3100002%200.462%202.0440001%20L%200.462%200.238%20C%200.462%20-0.028%200.532%20-0.154%200.67200005%20-0.154%20C%200.71400005%20-0.154%200.78400004%20-0.112%200.896%20-0.014%20C%201.148%200.21000001%201.036%200.16800001%201.288%200.42000002%20C%201.694%200.042000003%202.198%20-0.154%202.786%20-0.154%20C%204.116%20-0.154%205.04%200.532%205.04%201.82%20Z%20%22%2F%3E%0A%20%20%20%20%20%20%20%20%3C%2Fsymbol%3E%0A%20%20%20%20%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A&quot; class=&quot;typst-display typst-doc&quot; style=&quot; width: 42.02382828282827em&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Using simple bitwise masking, we can then manually retrieve those packed
bits near the MSB to use as our index. We can generate a set of 128
magic numbers (64 for bishops, 64 for rooks) which individually can be
used to map each square and occupancy to extract its bits, and then use
that operation to retrieve a pre-computed set of moves in constant time.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Side note&lt;&#x2F;em&gt;: Most of the time, there are actually collisions when using
magic numbers. Collisions occur when our magic multiply doesn’t
perfectly extract the relevant bits, but instead returns some other,
bizarre combination of our relevant bits as the index. However, so long
as the collisions map the same final moveset, that’s OK, so finding
magics is actually pretty easy - brute force search works quite well.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;getting-down-to-business&quot;&gt;Getting down to business&lt;&#x2F;h2&gt;
&lt;p&gt;Most engines both compute all their magic numbers as part of their
startup routines. Before this week, I included the magic numbers as
static constants and computed the entire table of movesets at startup.
However, due to the limitations of Rust, I ended up using
&lt;a href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;once_cell&#x2F;latest&#x2F;once_cell&#x2F;&quot;&gt;&lt;code&gt;once_cell&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;’s &lt;code&gt;Lazy&lt;&#x2F;code&gt; for
initializing the move lookup table. This had the benefit of being really
easy to implement, but it also meant that every time move generation was
required (i.e. millions of times per second) the engine had to check
whether the moves lookup table had already been loaded.&lt;&#x2F;p&gt;
&lt;p&gt;Now, I have to rewrite it from scratch, but in “hard” mode - to make all
the constants known at compile time, everything has to be written in a
&lt;code&gt;const&lt;&#x2F;code&gt; function. This means:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;No allocations&lt;&#x2F;li&gt;
&lt;li&gt;No printing&lt;&#x2F;li&gt;
&lt;li&gt;No panicking&lt;&#x2F;li&gt;
&lt;li&gt;No for loops&lt;&#x2F;li&gt;
&lt;li&gt;No trait methods&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Let’s get right to it by describing our data layout. We begin by
implementing a &lt;code&gt;Bitboard&lt;&#x2F;code&gt; by wrapping &lt;code&gt;u64&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;derive&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;Copy&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; Clone&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; Debug&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; PartialEq&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; Eq&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;repr&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;transparent&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;Bitboard&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u64&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For every square and sliding piece type, we’ll create a structure called
an &lt;code&gt;AttacksLookup&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; A lookup table for generating attacks via magic bitboard for one piece type and square.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;AttacksLookup&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; A reference to this lookup&amp;#39;s section of the magic attacks.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;table&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-lifetime z-rust&quot;&gt;&amp;#39;static&lt;&#x2F;span&gt; [Bitboard],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; The mask for extracting out the relevant occupancy map on a board.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;mask&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; Bitboard,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; The magic multiply constant for converting occupancies to indices.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;magic&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u64&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; The shift to extract an index from a multiplied constant.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;shift&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u8&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In order for us to have a “ragged” moves-lookup table, we don’t have
each &lt;code&gt;AttacksLookup&lt;&#x2F;code&gt; own its attack set, since that would result in
extremely inefficient space usage and an enormous increase in what will
already be a very large binary. Instead, we store &lt;em&gt;all&lt;&#x2F;em&gt; of the
moves-lookup tables in one giant array, and have each &lt;code&gt;AttacksLookup&lt;&#x2F;code&gt;
have a reference to its section of that array.&lt;&#x2F;p&gt;
&lt;p&gt;Let’s try to populate that array, staying mindful of our lack of
for-loops. First, we’ll store our magic numbers:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; A saved list of magic multiply numbers for rooks, indexed by the square they&amp;#39;re used for.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;SAVED_ROOK_MAGICS&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u64&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;64&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;*&lt;&#x2F;span&gt; 64 lines removed &lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;These magic numbers can be found offline via trial and error, but there
are also public records of magic numbers. For example, the Chess
Programming wiki &lt;a href=&quot;https:&#x2F;&#x2F;www.chessprogramming.org&#x2F;Best_Magics_so_far&quot;&gt;keeps a record of magic
numbers&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Next, we need to know how much storage to allocate for all the rook
moves. We do this by first storing a table of how many entries are
needed for each square to calculate our moves.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; Log-base-2 of the number of entries required in the moves-lookup table for each square.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;ROOK_BITS&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;64&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;12&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;12&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; rank 1
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; 2
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; 3
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; 4
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; 5
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; 6
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;9&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;9&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;9&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;9&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;9&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;9&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; 7
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; 8
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You may notice something odd happening on ranks 7 and 8: the number of
bits required for some of the squares is 1 lower than their mask. This
is intentional! As it turns out, certain magic numbers will yield just
the right set of hash collisions so that you can use half as many
entries are there are occupancies. This saves about 18 kB of data.&lt;&#x2F;p&gt;
&lt;p&gt;The size of our table is just the sum of 2 to the power of the number of
bits required for each square:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; Compute the number of entries in a magic-movegen table required to store every element, given
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; the number of bits required for each square.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;table_size&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;bits_table&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u8&lt;&#x2F;span&gt;; 64]&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; total &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;while&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;64&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; POV you don&amp;#39;t have iterators
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        total &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; bits_table&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;i&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        i &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    total
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We also need to construct the masks for each square. &lt;code&gt;get_rook_masks&lt;&#x2F;code&gt;
takes in a &lt;code&gt;Square&lt;&#x2F;code&gt; (hence the call to &lt;code&gt;transmute&lt;&#x2F;code&gt;) and builds the
relevant occupancy mask for the square.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; The bitwise masks for extracting the relevant pieces for a rook&amp;#39;s attacks in a board, indexed
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; by the square occupied by the rook.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;ROOK_MASKS&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;Bitboard&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;64&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; masks &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Bitboard&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;EMPTY&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;64&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-numeric z-rust&quot;&gt;u8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;while&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;64&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        masks&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;i &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;get_rook_mask&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;unsafe&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;transmute&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u8&lt;&#x2F;span&gt;, Square&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        i &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    masks
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; Create the mask for the relevant bits in magic of a rook.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; `sq` is the identifying the square that we want to generate the mask for.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;get_rook_mask&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;sq&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Square&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; Bitboard&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; sequence of 1s down the same row as the piece to move, except on the ends
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; row_mask &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-rust&quot;&gt;0x7E&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;sq &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u8&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-rust&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-rust&quot;&gt;0x7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; sequence of 1s down the same col as the piece to move, except on the ends
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; col_mask &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-rust&quot;&gt;0x0001_0101_0101_0100&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;sq &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u8&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-hexadecimal z-rust&quot;&gt;0x7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; note: pieces at the end of the travel don&amp;#39;t matter, which is why the masks aren&amp;#39;t uniform
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; in the col mask or row mask, but not the piece to move
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Bitboard&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;row_mask &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;|&lt;&#x2F;span&gt; col_mask&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-rust&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; sq &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u64&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We now have enough to actually build the full set of attacks. We do this
via brute force: for every possible occupancy, we calculate the set of
legal moves, and then save the legal moves at the correct index.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; The master table containing every attack that the rook can perform from every square under
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; every occupancy.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; Borrowed by the individual [`AttacksLookup`]s in [`ROOK_LOOKUPS`].
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;ROOK_ATTACKS_TABLE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;Bitboard&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;table_size&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;ROOK_BITS&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;construct_magic_table&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;ROOK_BITS&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;SAVED_ROOK_MAGICS&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;ROOK_MASKS&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Direction&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;ROOK_DIRECTIONS&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; Construct the master magic table for a rook or bishop based on all the requisite information.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; # Inputs
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; - `bits`: For each square, the number of other squares which are involved in the calculation of
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt;   attacks from that square.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; - `magics`: The magic numbers for each square.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; - `masks`: The masks used for extracting the relevant squares for an attack on each starting
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt;   square.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; - `dirs`: The directions in which the piece can move
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;construct_magic_table&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;const&lt;&#x2F;span&gt; N&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;bits&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u8&lt;&#x2F;span&gt;; 64],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;magics&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u64&lt;&#x2F;span&gt;; 64],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;masks&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[Bitboard; 64],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;dirs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[Direction],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;Bitboard&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; N&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; table &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Bitboard&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;EMPTY&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; N&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; table_offset &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;while&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;64&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; sq&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Square &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;unsafe&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;transmute&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;i &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; mask &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; masks&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;i&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; magic &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; magics&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;i&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; n_attacks_to_generate &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; mask&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;len&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; j &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;while&lt;&#x2F;span&gt; j &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; n_attacks_to_generate &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; occupancy &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;index_to_occupancy&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;j&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; mask&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; attack &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;directional_attacks&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;sq&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; dirs&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; occupancy&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; key &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;compute_magic_key&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;occupancy&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; magic&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;64&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; bits&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;i&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            table&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;key &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; table_offset&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; attack&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            j &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        table_offset &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; bits&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;i&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        i &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    table
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;compute_magic_key&lt;&#x2F;code&gt; and the other helper functions called above can be
implemented with some basic drudgery.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; Given some mask, create the occupancy [`Bitboard`] according to this index.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; `index` must be less than or equal to 2 ^ (number of ones in `mask`).
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; This is equivalent to the parallel-bits-deposit (PDEP) instruction on x86 architectures.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;index_to_occupancy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;index&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;mask&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Bitboard&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; Bitboard&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; result &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-numeric z-rust&quot;&gt;u64&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; num_points &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; mask&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;len&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; editable_mask &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; mask&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;as_u64&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; go from right to left in the bits of num_points,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; and add an occupancy if something is there
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;while&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; num_points &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; make a bitboard which only occupies the rightmost square
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; occupier &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; editable_mask&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;trailing_zeros&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; remove the occupier from the mask
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        editable_mask &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;&amp;amp;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-rust&quot;&gt;!&lt;&#x2F;span&gt;occupier&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;index &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;!=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; the bit corresponding to the occupier is nonzero
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            result &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;|=&lt;&#x2F;span&gt; occupier&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        i &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Bitboard&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;result&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; Construct the squares attacked by the pieces at `sq` if it could move along the directions in
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; `dirs` when the board is occupied by the pieces in `occupancy`.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; This is slow and should only be used for generatic magic bitboards (instead of for move
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; generation.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;directional_attacks&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;sq&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Square,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;dirs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[Direction],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;occupancy&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Bitboard,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; Bitboard&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; behold: much hackery for making this work as a const fn
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; result &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Bitboard&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;EMPTY&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; dir_idx &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;while&lt;&#x2F;span&gt; dir_idx &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; dirs&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;len&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; dir &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; dirs&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;dir_idx&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; current_square &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; sq&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; loop_idx &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;while&lt;&#x2F;span&gt; loop_idx &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;7&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; next_square_int&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;i16&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; current_square &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;i16&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;unsafe&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                    &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;transmute&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;Direction, &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;i8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;dir&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;i16&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; next_square_int &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-rust&quot;&gt;||&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;64&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;=&lt;&#x2F;span&gt; next_square_int &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;break&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; next_square&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Square &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;unsafe&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;transmute&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;next_square_int &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; next_square&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;chebyshev_to&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;current_square&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;break&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            result &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; result&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;with_square&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;next_square&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; occupancy&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;contains&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;next_square&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;break&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            current_square &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; next_square&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            loop_idx &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        dir_idx &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    result
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; Use magic hashing to get the index to look up attacks in a bitboard.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;compute_magic_key&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;occupancy&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Bitboard, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;magic&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u64&lt;&#x2F;span&gt;, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;shift&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;occupancy&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;as_u64&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;wrapping_mul&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;magic&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; shift&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Lastly, we build each individual &lt;code&gt;AttacksLookup&lt;&#x2F;code&gt; with its references to
&lt;code&gt;ROOK_ATTACKS_TABLE&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; The necessary information for generatng attacks for rook, indexed b the square occupied by
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; said rook.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;ROOK_LOOKUPS&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;AttacksLookup&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;64&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;construct_lookups&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;ROOK_BITS&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;SAVED_ROOK_MAGICS&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;ROOK_MASKS&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other z-rust&quot;&gt;ROOK_ATTACKS_TABLE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; Construct the lookup tables for magic move generation by referencing an already-generated
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; attacks table.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;const&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;construct_lookups&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;bits&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u8&lt;&#x2F;span&gt;; 64],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;magics&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u64&lt;&#x2F;span&gt;; 64],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;masks&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[Bitboard; 64],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;attacks_table&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-lifetime z-rust&quot;&gt;&amp;#39;static&lt;&#x2F;span&gt; [Bitboard],
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;AttacksLookup&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;64&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;unsafe&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; table&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;MaybeUninit&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;AttacksLookup&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;64&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;MaybeUninit&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;uninit&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;assume_init&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; remaining_attacks &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; attacks_table&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;while&lt;&#x2F;span&gt; i &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;64&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; these_attacks&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;these_attacks&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; remaining_attacks&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; remaining_attacks&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;split_at&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-comparison z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; bits&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;i&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            table&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;i&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;MaybeUninit&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;AttacksLookup &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                table&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; these_attacks&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                mask&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; masks&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;i&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                magic&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; magics&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;i&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                shift&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;64&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;-&lt;&#x2F;span&gt; bits&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;i&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            i &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;+=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-support z-function z-rust&quot;&gt;transmute&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;table&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In order to compute the moves for the rook, we work backwards, going
from the &lt;code&gt;AttacksLookup&lt;&#x2F;code&gt; into the table. For performance, we perform
unchecked array accesses. We can prove they’re always safe because
&lt;code&gt;Square&lt;&#x2F;code&gt;s can only have values from 0 through 63, and we know our key
generation code is producing a low enough index to not go out of bounds.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;pub&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;rook_moves&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;occupancy&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Bitboard, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;sq&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Square&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; Bitboard&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; magic_data &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;unsafe&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-other z-rust&quot;&gt;ROOK_LOOKUPS&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;get_unchecked&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;sq &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; key &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;compute_magic_key&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;occupancy &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt; magic_data&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;mask&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; magic_data&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;magic&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; magic_data&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;shift&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;unsafe&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;*&lt;&#x2F;span&gt;magic_data&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;table&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;get_unchecked&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;While you weren’t looking, I wrote some very similar code for writing
the bishop moves-lookup table. In all, it’s about 300 lines of code.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;insert-rust-compiler-speed-joke-here&quot;&gt;&amp;lt;insert Rust compiler speed joke here&amp;gt;&lt;&#x2F;h2&gt;
&lt;p&gt;It’s now time to compile our code. Running &lt;code&gt;cargo build&lt;&#x2F;code&gt;, we get to wait
about 30 seconds until we encounter this beauty of an output:&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;one billion lines of compiler output&lt;&#x2F;summary&gt;
&lt;pre data-lang=&quot;text&quot; class=&quot;language-text z-code&quot;&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;~&#x2F;C&#x2F;fiddler (static_magic|✚2) $ cargo build
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   Compiling fiddler v0.1.0 (&#x2F;home&#x2F;clayton&#x2F;Chess&#x2F;fiddler)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;note: erroneous constant used
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   --&amp;gt; src&#x2F;base&#x2F;movegen&#x2F;magic.rs:328:6
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;328 |     &amp;amp;ROOK_ATTACKS_TABLE,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    |      ^^^^^^^^^^^^^^^^^^
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;note: erroneous constant used
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  --&amp;gt; src&#x2F;base&#x2F;movegen&#x2F;magic.rs:87:33
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;87 |     get_attacks(occupancy, sq, &amp;amp;ROOK_LOOKUPS)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |                                 ^^^^^^^^^^^^
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;note: erroneous constant used
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  --&amp;gt; src&#x2F;base&#x2F;movegen&#x2F;magic.rs:87:32
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;87 |     get_attacks(occupancy, sq, &amp;amp;ROOK_LOOKUPS)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |                                ^^^^^^^^^^^^^
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;error: internal compiler error: no errors encountered even though `delay_span_bug` issued
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;error: internal compiler error: The deny lint should have already errored
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   --&amp;gt; &#x2F;home&#x2F;clayton&#x2F;.rustup&#x2F;toolchains&#x2F;nightly-x86_64-unknown-linux-gnu&#x2F;lib&#x2F;rustlib&#x2F;src&#x2F;rust&#x2F;library&#x2F;core&#x2F;src&#x2F;num&#x2F;mod.rs:297:5
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;297 | &#x2F;     int_impl! {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;298 | |         Self = i8,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;299 | |         ActualT = i8,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;300 | |         UnsignedT = u8,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;...   |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;315 | |         bound_condition = &amp;quot;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;316 | |     }
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    | |_____^
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    = note: delayed at compiler&#x2F;rustc_const_eval&#x2F;src&#x2F;const_eval&#x2F;machine.rs:634:26
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;               0: &amp;lt;rustc_errors::HandlerInner&amp;gt;::emit_diagnostic
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;               1: &amp;lt;rustc_errors::Handler&amp;gt;::delay_span_bug::&amp;lt;rustc_span::span_encoding::Span, &amp;amp;str&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;               2: &amp;lt;rustc_const_eval::interpret::eval_context::InterpCx&amp;lt;rustc_const_eval::const_eval::machine::CompileTimeInterpreter&amp;gt;&amp;gt;::statement
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;               3: rustc_const_eval::const_eval::eval_queries::eval_to_allocation_raw_provider
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;               4: rustc_query_impl::plumbing::__rust_begin_short_backtrace::&amp;lt;rustc_query_impl::query_impl::eval_to_allocation_raw::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased&amp;lt;[u8; 16]&amp;gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;               5: &amp;lt;rustc_query_impl::query_impl::eval_to_allocation_raw::dynamic_query::{closure#2} as core::ops::function::FnOnce&amp;lt;(rustc_middle::ty::context::TyCtxt, rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;)&amp;gt;&amp;gt;::call_once
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;               6: &amp;lt;rustc_query_system::query::plumbing::execute_job_incr&amp;lt;rustc_query_impl::DynamicConfig&amp;lt;rustc_query_system::query::caches::DefaultCache&amp;lt;rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;, rustc_middle::query::erase::Erased&amp;lt;[u8; 32]&amp;gt;&amp;gt;, false, false, false&amp;gt;, rustc_query_impl::plumbing::QueryCtxt&amp;gt;::{closure#2}::{closure#2} as core::ops::function::FnOnce&amp;lt;((rustc_query_impl::plumbing::QueryCtxt, rustc_query_impl::DynamicConfig&amp;lt;rustc_query_system::query::caches::DefaultCache&amp;lt;rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;, rustc_middle::query::erase::Erased&amp;lt;[u8; 32]&amp;gt;&amp;gt;, false, false, false&amp;gt;), rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;)&amp;gt;&amp;gt;::call_once
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;               7: rustc_query_system::query::plumbing::try_execute_query::&amp;lt;rustc_query_impl::DynamicConfig&amp;lt;rustc_query_system::query::caches::DefaultCache&amp;lt;rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;, rustc_middle::query::erase::Erased&amp;lt;[u8; 16]&amp;gt;&amp;gt;, false, false, false&amp;gt;, rustc_query_impl::plumbing::QueryCtxt, true&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;               8: rustc_query_impl::query_impl::eval_to_allocation_raw::get_query_incr::__rust_end_short_backtrace
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;               9: &amp;lt;rustc_const_eval::interpret::eval_context::InterpCx&amp;lt;rustc_const_eval::const_eval::machine::CompileTimeInterpreter&amp;gt;&amp;gt;::eval_mir_constant
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              10: &amp;lt;rustc_const_eval::interpret::eval_context::InterpCx&amp;lt;rustc_const_eval::const_eval::machine::CompileTimeInterpreter&amp;gt;&amp;gt;::push_stack_frame
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              11: rustc_const_eval::const_eval::eval_queries::eval_to_allocation_raw_provider
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              12: rustc_query_impl::plumbing::__rust_begin_short_backtrace::&amp;lt;rustc_query_impl::query_impl::eval_to_allocation_raw::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased&amp;lt;[u8; 16]&amp;gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              13: &amp;lt;rustc_query_impl::query_impl::eval_to_allocation_raw::dynamic_query::{closure#2} as core::ops::function::FnOnce&amp;lt;(rustc_middle::ty::context::TyCtxt, rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;)&amp;gt;&amp;gt;::call_once
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              14: &amp;lt;rustc_query_system::query::plumbing::execute_job_incr&amp;lt;rustc_query_impl::DynamicConfig&amp;lt;rustc_query_system::query::caches::DefaultCache&amp;lt;rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;, rustc_middle::query::erase::Erased&amp;lt;[u8; 32]&amp;gt;&amp;gt;, false, false, false&amp;gt;, rustc_query_impl::plumbing::QueryCtxt&amp;gt;::{closure#2}::{closure#2} as core::ops::function::FnOnce&amp;lt;((rustc_query_impl::plumbing::QueryCtxt, rustc_query_impl::DynamicConfig&amp;lt;rustc_query_system::query::caches::DefaultCache&amp;lt;rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;, rustc_middle::query::erase::Erased&amp;lt;[u8; 32]&amp;gt;&amp;gt;, false, false, false&amp;gt;), rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;)&amp;gt;&amp;gt;::call_once
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              15: rustc_query_system::query::plumbing::try_execute_query::&amp;lt;rustc_query_impl::DynamicConfig&amp;lt;rustc_query_system::query::caches::DefaultCache&amp;lt;rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;, rustc_middle::query::erase::Erased&amp;lt;[u8; 16]&amp;gt;&amp;gt;, false, false, false&amp;gt;, rustc_query_impl::plumbing::QueryCtxt, true&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              16: rustc_query_impl::query_impl::eval_to_allocation_raw::get_query_incr::__rust_end_short_backtrace
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              17: &amp;lt;rustc_const_eval::interpret::eval_context::InterpCx&amp;lt;rustc_const_eval::const_eval::machine::CompileTimeInterpreter&amp;gt;&amp;gt;::statement
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              18: rustc_const_eval::const_eval::eval_queries::eval_to_allocation_raw_provider
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              19: rustc_query_impl::plumbing::__rust_begin_short_backtrace::&amp;lt;rustc_query_impl::query_impl::eval_to_allocation_raw::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased&amp;lt;[u8; 16]&amp;gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              20: &amp;lt;rustc_query_impl::query_impl::eval_to_allocation_raw::dynamic_query::{closure#2} as core::ops::function::FnOnce&amp;lt;(rustc_middle::ty::context::TyCtxt, rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;)&amp;gt;&amp;gt;::call_once
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              21: &amp;lt;rustc_query_system::query::plumbing::execute_job_incr&amp;lt;rustc_query_impl::DynamicConfig&amp;lt;rustc_query_system::query::caches::DefaultCache&amp;lt;rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;, rustc_middle::query::erase::Erased&amp;lt;[u8; 32]&amp;gt;&amp;gt;, false, false, false&amp;gt;, rustc_query_impl::plumbing::QueryCtxt&amp;gt;::{closure#2}::{closure#2} as core::ops::function::FnOnce&amp;lt;((rustc_query_impl::plumbing::QueryCtxt, rustc_query_impl::DynamicConfig&amp;lt;rustc_query_system::query::caches::DefaultCache&amp;lt;rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;, rustc_middle::query::erase::Erased&amp;lt;[u8; 32]&amp;gt;&amp;gt;, false, false, false&amp;gt;), rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;)&amp;gt;&amp;gt;::call_once
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              22: rustc_query_system::query::plumbing::try_execute_query::&amp;lt;rustc_query_impl::DynamicConfig&amp;lt;rustc_query_system::query::caches::DefaultCache&amp;lt;rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;, rustc_middle::query::erase::Erased&amp;lt;[u8; 16]&amp;gt;&amp;gt;, false, false, false&amp;gt;, rustc_query_impl::plumbing::QueryCtxt, true&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              23: rustc_query_impl::query_impl::eval_to_allocation_raw::get_query_incr::__rust_end_short_backtrace
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              24: rustc_const_eval::const_eval::eval_queries::eval_to_allocation_raw_provider
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              25: rustc_query_impl::plumbing::__rust_begin_short_backtrace::&amp;lt;rustc_query_impl::query_impl::eval_to_allocation_raw::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased&amp;lt;[u8; 16]&amp;gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              26: &amp;lt;rustc_query_impl::query_impl::eval_to_allocation_raw::dynamic_query::{closure#2} as core::ops::function::FnOnce&amp;lt;(rustc_middle::ty::context::TyCtxt, rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;)&amp;gt;&amp;gt;::call_once
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              27: &amp;lt;rustc_query_system::query::plumbing::execute_job_incr&amp;lt;rustc_query_impl::DynamicConfig&amp;lt;rustc_query_system::query::caches::DefaultCache&amp;lt;rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;, rustc_middle::query::erase::Erased&amp;lt;[u8; 32]&amp;gt;&amp;gt;, false, false, false&amp;gt;, rustc_query_impl::plumbing::QueryCtxt&amp;gt;::{closure#2}::{closure#2} as core::ops::function::FnOnce&amp;lt;((rustc_query_impl::plumbing::QueryCtxt, rustc_query_impl::DynamicConfig&amp;lt;rustc_query_system::query::caches::DefaultCache&amp;lt;rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;, rustc_middle::query::erase::Erased&amp;lt;[u8; 32]&amp;gt;&amp;gt;, false, false, false&amp;gt;), rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;)&amp;gt;&amp;gt;::call_once
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              28: rustc_query_system::query::plumbing::try_execute_query::&amp;lt;rustc_query_impl::DynamicConfig&amp;lt;rustc_query_system::query::caches::DefaultCache&amp;lt;rustc_middle::ty::ParamEnvAnd&amp;lt;rustc_middle::mir::interpret::GlobalId&amp;gt;, rustc_middle::query::erase::Erased&amp;lt;[u8; 16]&amp;gt;&amp;gt;, false, false, false&amp;gt;, rustc_query_impl::plumbing::QueryCtxt, true&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              29: rustc_query_impl::query_impl::eval_to_allocation_raw::get_query_incr::__rust_end_short_backtrace
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              30: &amp;lt;rustc_const_eval::interpret::eval_context::InterpCx&amp;lt;rustc_mir_transform::const_prop::ConstPropMachine&amp;gt;&amp;gt;::eval_mir_constant
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              31: &amp;lt;rustc_mir_transform::const_prop_lint::ConstPropagator as rustc_middle::mir::visit::Visitor&amp;gt;::visit_basic_block_data
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              32: &amp;lt;rustc_mir_transform::const_prop_lint::ConstProp as rustc_mir_transform::pass_manager::MirLint&amp;gt;::run_lint
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              33: rustc_mir_transform::mir_drops_elaborated_and_const_checked
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              34: rustc_query_impl::plumbing::__rust_begin_short_backtrace::&amp;lt;rustc_query_impl::query_impl::mir_drops_elaborated_and_const_checked::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased&amp;lt;[u8; 8]&amp;gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              35: &amp;lt;rustc_query_impl::query_impl::mir_drops_elaborated_and_const_checked::dynamic_query::{closure#2} as core::ops::function::FnOnce&amp;lt;(rustc_middle::ty::context::TyCtxt, rustc_span::def_id::LocalDefId)&amp;gt;&amp;gt;::call_once
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              36: rustc_query_system::query::plumbing::try_execute_query::&amp;lt;rustc_query_impl::DynamicConfig&amp;lt;rustc_query_system::query::caches::VecCache&amp;lt;rustc_span::def_id::LocalDefId, rustc_middle::query::erase::Erased&amp;lt;[u8; 8]&amp;gt;&amp;gt;, false, false, false&amp;gt;, rustc_query_impl::plumbing::QueryCtxt, true&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              37: rustc_query_impl::query_impl::mir_drops_elaborated_and_const_checked::get_query_incr::__rust_end_short_backtrace
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              38: &amp;lt;rustc_session::session::Session&amp;gt;::time::&amp;lt;(), rustc_interface::passes::analysis::{closure#2}&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              39: rustc_interface::passes::analysis
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              40: rustc_query_impl::plumbing::__rust_begin_short_backtrace::&amp;lt;rustc_query_impl::query_impl::analysis::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased&amp;lt;[u8; 1]&amp;gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              41: &amp;lt;rustc_query_impl::query_impl::analysis::dynamic_query::{closure#2} as core::ops::function::FnOnce&amp;lt;(rustc_middle::ty::context::TyCtxt, ())&amp;gt;&amp;gt;::call_once
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              42: rustc_query_system::query::plumbing::try_execute_query::&amp;lt;rustc_query_impl::DynamicConfig&amp;lt;rustc_query_system::query::caches::SingleCache&amp;lt;rustc_middle::query::erase::Erased&amp;lt;[u8; 1]&amp;gt;&amp;gt;, false, false, false&amp;gt;, rustc_query_impl::plumbing::QueryCtxt, true&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              43: rustc_query_impl::query_impl::analysis::get_query_incr::__rust_end_short_backtrace
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              44: &amp;lt;rustc_middle::ty::context::GlobalCtxt&amp;gt;::enter::&amp;lt;rustc_driver_impl::run_compiler::{closure#1}::{closure#2}::{closure#4}, core::result::Result&amp;lt;(), rustc_span::ErrorGuaranteed&amp;gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              45: &amp;lt;rustc_interface::interface::Compiler&amp;gt;::enter::&amp;lt;rustc_driver_impl::run_compiler::{closure#1}::{closure#2}, core::result::Result&amp;lt;core::option::Option&amp;lt;rustc_interface::queries::Linker&amp;gt;, rustc_span::ErrorGuaranteed&amp;gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              46: std::sys_common::backtrace::__rust_begin_short_backtrace::&amp;lt;rustc_interface::util::run_in_thread_pool_with_globals&amp;lt;rustc_interface::interface::run_compiler&amp;lt;core::result::Result&amp;lt;(), rustc_span::ErrorGuaranteed&amp;gt;, rustc_driver_impl::run_compiler::{closure#1}&amp;gt;::{closure#0}, core::result::Result&amp;lt;(), rustc_span::ErrorGuaranteed&amp;gt;&amp;gt;::{closure#0}::{closure#0}, core::result::Result&amp;lt;(), rustc_span::ErrorGuaranteed&amp;gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              47: &amp;lt;&amp;lt;std::thread::Builder&amp;gt;::spawn_unchecked_&amp;lt;rustc_interface::util::run_in_thread_pool_with_globals&amp;lt;rustc_interface::interface::run_compiler&amp;lt;core::result::Result&amp;lt;(), rustc_span::ErrorGuaranteed&amp;gt;, rustc_driver_impl::run_compiler::{closure#1}&amp;gt;::{closure#0}, core::result::Result&amp;lt;(), rustc_span::ErrorGuaranteed&amp;gt;&amp;gt;::{closure#0}::{closure#0}, core::result::Result&amp;lt;(), rustc_span::ErrorGuaranteed&amp;gt;&amp;gt;::{closure#1} as core::ops::function::FnOnce&amp;lt;()&amp;gt;&amp;gt;::call_once::{shim:vtable#0}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              48: call_once&amp;lt;(), dyn core::ops::function::FnOnce&amp;lt;(), Output=()&amp;gt;, alloc::alloc::Global&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;                         at &#x2F;rustc&#x2F;b2b34bd83192c3d16c88655158f7d8d612513e88&#x2F;library&#x2F;alloc&#x2F;src&#x2F;boxed.rs:1985:9
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              49: call_once&amp;lt;(), alloc::boxed::Box&amp;lt;dyn core::ops::function::FnOnce&amp;lt;(), Output=()&amp;gt;, alloc::alloc::Global&amp;gt;, alloc::alloc::Global&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;                         at &#x2F;rustc&#x2F;b2b34bd83192c3d16c88655158f7d8d612513e88&#x2F;library&#x2F;alloc&#x2F;src&#x2F;boxed.rs:1985:9
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              50: thread_start
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;                         at &#x2F;rustc&#x2F;b2b34bd83192c3d16c88655158f7d8d612513e88&#x2F;library&#x2F;std&#x2F;src&#x2F;sys&#x2F;unix&#x2F;thread.rs:108:17
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              51: start_thread
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;                         at .&#x2F;nptl&#x2F;pthread_create.c:444:8
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;              52: __GI___clone3
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;                         at .&#x2F;misc&#x2F;..&#x2F;sysdeps&#x2F;unix&#x2F;sysv&#x2F;linux&#x2F;x86_64&#x2F;clone3.S:81
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    = note: this error: internal compiler error originates in the macro `int_impl` (in Nightly builds, run with -Z macro-backtrace for more info)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;note: we would appreciate a bug report: https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rust&#x2F;issues&#x2F;new?labels=C-bug%2C+I-ICE%2C+T-compiler&amp;amp;template=ice.md
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;note: rustc 1.72.0-nightly (b2b34bd83 2023-06-06) running on x86_64-unknown-linux-gnu
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;note: compiler flags: --crate-type lib -C embed-bitcode=no -C debuginfo=2 -C incremental=[REDACTED] -C target_cpu=native
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;note: some of the compiler flags provided by cargo are hidden
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;query stack during panic:
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;end of query stack
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;error: could not compile `fiddler` (lib)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;details&gt;
&lt;p&gt;I accidentally found a compiler bug! I opened the issue for it
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rust&#x2F;issues&#x2F;112748&quot;&gt;here&lt;&#x2F;a&gt;. I don’t know
the exact cause for it yet, but I think it’s somehow related to constant
evaluation. In any event, annotating &lt;code&gt;ROOK_ATTACKS_TABLE&lt;&#x2F;code&gt; with
&lt;code&gt;#[allow(long_running_const_eval)]&lt;&#x2F;code&gt; seems to fix it.&lt;&#x2F;p&gt;
&lt;p&gt;Running the compiler again, we find that our compile time has ballooned
from about 3 seconds to 48 seconds. Almost all of that time is spent on
generating &lt;code&gt;ROOK_ATTACKS_TABLE&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Interestingly enough, I wrote an exhaustive test of the magic table
generation code, which does essentially the same thing as generating the
table, except at runtime, and I found that it ran in 0.00 seconds. I
suspect that the constant evaluator in Rust is just plain slow.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;denouement&quot;&gt;Denouement&lt;&#x2F;h2&gt;
&lt;p&gt;Now that we’ve gotten the whole thing to compile, we can actually run a
benchmark. In chess engines, the main measure of engine quality is Elo,
a relative measure of engine performance.&lt;&#x2F;p&gt;
&lt;p&gt;I threw the new version of Fiddler, with its compile-time generated
lookup tables, against the older dynamically-generated ones, and here
are my results:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;txt&quot; class=&quot;language-txt z-code&quot;&gt;&lt;code class=&quot;language-txt&quot; data-lang=&quot;txt&quot;&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Score of fiddler_const_magic vs fiddler_dynamic_magic: 5278 - 5003 - 4271 [0.509]
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;...      fiddler_const_magic playing White: 2766 - 2374 - 2136  [0.527] 7276
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;...      fiddler_const_magic playing Black: 2512 - 2629 - 2135  [0.492] 7276
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;...      White vs Black: 5395 - 4886 - 4271  [0.517] 14552
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Elo difference: 6.6 +&#x2F;- 4.7, LOS: 99.7 %, DrawRatio: 29.3 %
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;14566 of 30000 games finished.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We get a whole 6 Elo points - equivalent to a 1% improvement in the
engine. At least it’s not a regression!&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
