<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <div class="markdown-here-wrapper" data-md-url="" style="">
      <p style="margin: 0px 0px 1.2em !important;">Hi Duncan,<br>
        we took a better look at this, and noticed that, in reality,
        there’s not much we can do at the moment about this, for two
        reasons.</p>
      <p style="margin: 0px 0px 1.2em !important;">First, the idea
        behind your approach was to move some of this shared
        functionality (such as the “allocate” method) to the Upcall
        class. But this changes the client code in ways that IMHO are
        not optimal — e.g.</p>
      <pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;">compar.allocate(...)
</code></pre>
      <p style="margin: 0px 0px 1.2em !important;">becomes</p>
      <pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;">compar$func.UPCALL.allocate(...)
</code></pre>
      <p style="margin: 0px 0px 1.2em !important;">So I think that, to
        make this work, we would have to replicate the <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">allocate</code>
        method (and possibly other accessors) in the toplevel class —
        which reduces the gain.</p>
      <p style="margin: 0px 0px 1.2em !important;">A better strategy
        would be one where the toplevel class “extends” from Upcall —
        then all the various methods would be inherited — and clients
        would be good again. But if we do that, we lose “constant-ness”
        of the various method handles involved, which will make methods
        like “invoke” slower.</p>
      <p style="margin: 0px 0px 1.2em !important;">Another difference
        between the two approaches is that you have merged the
        functional pointer wrapper with the functional interface. This
        is a move we have considered when we transitioned to this new
        code generation strategy, but we ended up rejecting because
        there’s no way to make interface fields non-public. Which is why
        we opted for an enclosing <em>class</em> with a nested
        interface.</p>
      <p style="margin: 0px 0px 1.2em !important;">For these reasons, I
        believe that, for the time being, it’s better to keep the
        generated code as is. It is possible that the StableValue API
        [1] will allow us to change this — at some point we considered
        making fields of type StableValue implicitly trusted finals.
        While we have removed that trick in the current PR, something
        like that might allow for the code generation strategy I was
        alluding to earlier — where the function pointer class extends
        from some Upcall class that has a pair of stable value fields,
        one for the upcall MH, the other for the downcall MH. (In
        general, we’re confident that StableValue should result in
        jextract bindings become much more compact, as SV will
        essentially remove the need for all the holder classes that are
        spread throughout the generated code).</p>
      <p style="margin: 0px 0px 1.2em !important;">Thanks for the
        exploration!<br>
        Maurizio</p>
      <p style="margin: 0px 0px 1.2em !important;">[1] - <a href="https://github.com/openjdk/jdk/pull/23972" class="moz-txt-link-freetext">https://github.com/openjdk/jdk/pull/23972</a></p>
      <p style="margin: 0px 0px 1.2em !important;">On 07/04/2025 16:09,
        Maurizio Cimadamore wrote:</p>
      <p style="margin: 0px 0px 1.2em !important;"></p>
      <div class="markdown-here-exclude">
        <p></p>
        <blockquote type="cite" cite="mid:140344b9-5401-42be-b647-164fa3e2f7a4@oracle.com">
          
          <p>I like this. The use of record components should probably
            preserve the fact that the upcall method handle is treated
            as a constant.</p>
          <p>This seems related to this PR under review:</p>
          <p><a class="moz-txt-link-freetext" href="https://git.openjdk.org/jextract/pull/279" moz-do-not-send="true">https://git.openjdk.org/jextract/pull/279</a></p>
          <p>So we should make sure to decide what code we want to
            generate (as that PR will make function pointer support even
            more verbose).</p>
          <p>Cheers<br>
            Maurizio<br>
          </p>
          <div class="moz-cite-prefix">On 07/04/2025 13:42, Duncan
            Gittins wrote:<br>
          </div>
          <blockquote type="cite" cite="mid:CABOqcFs0fbhtVR9-+U5pN6E2Gwo3WyA81q=T=XPFGpp2GaLJJA@mail.gmail.com">
            <div dir="ltr">
              <div>I've been using jextract successfully for some time
                now and it has made it very easy to call into various
                Windows. Great work.</div>
              <div><br>
              </div>
              <div>One area which seems a bit verbose is the handling of
                the functional interface callbacks for upcalls. For
                example, the qsort compare callback is as follows (I've
                shortened the jextract version here):</div>
              <div><br>
              </div>
              <div>
                <div style="background-color:rgb(255,255,255);padding:0px 0px 0px 2px">
                  <div style="color:rgb(0,0,0);background-color:rgb(255,255,255);font-family:"Consolas";font-size:10pt;white-space:pre"><p style="margin:0px"><span style="color:rgb(127,0,85);font-weight:bold">public</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">class</span><span style="color:rgb(0,0,0)"> QsortCompareFunc {</span></p><p style="margin:0px">
</p><p style="margin:0px"><span style="color:rgb(0,0,0)">    QsortCompareFunc() { }</span></p><p style="margin:0px">
</p><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(63,95,191)">/** The function pointer signature, expressed as a functional interface */</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(127,0,85);font-weight:bold">public</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">interface</span><span style="color:rgb(0,0,0)"> Function {</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        </span><span style="color:rgb(127,0,85);font-weight:bold">int</span><span style="color:rgb(0,0,0)"> apply(MemorySegment </span><span style="color:rgb(106,62,62)">_x0</span><span style="color:rgb(0,0,0)">, MemorySegment </span><span style="color:rgb(106,62,62)">_x1</span><span style="color:rgb(0,0,0)">);</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">    }</span></p><p style="margin:0px">
</p><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(127,0,85);font-weight:bold">private</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">static</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">final</span><span style="color:rgb(0,0,0)"> FunctionDescriptor </span><span style="color:rgb(0,0,192);font-style:italic;font-weight:bold">$DESC</span><span style="color:rgb(0,0,0)"> = FunctionDescriptor.</span><span style="color:rgb(0,0,0);font-style:italic">of</span><span style="color:rgb(0,0,0)">(</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        C_h.C_INT,</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        C_h.C_POINTER,</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        C_h.C_POINTER</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">    );</span></p><p style="margin:0px">
</p><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(63,95,191)">/** The descriptor of this function pointer */</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(127,0,85);font-weight:bold">public</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">static</span><span style="color:rgb(0,0,0)"> FunctionDescriptor descriptor() {</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        </span><span style="color:rgb(127,0,85);font-weight:bold">return</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,0,192);font-style:italic;font-weight:bold">$DESC</span><span style="color:rgb(0,0,0)">;</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">    }</span></p><p style="margin:0px">
</p><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(127,0,85);font-weight:bold">private</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">static</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">final</span><span style="color:rgb(0,0,0)"> MethodHandle </span><span style="color:rgb(0,0,192);font-style:italic;font-weight:bold">UP$MH</span><span style="color:rgb(0,0,0)"> = C_h.upcallHandle(QsortCompareFunc.Function.</span><span style="color:rgb(127,0,85);font-weight:bold">class</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(42,0,255)">"apply"</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,0,192);font-style:italic;font-weight:bold">$DESC</span><span style="color:rgb(0,0,0)">);</span></p><p style="margin:0px">
</p><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(63,95,191)">/**</span></p><p style="margin:0px"><span style="color:rgb(63,95,191)">     * Allocates a new upcall stub, whose implementation is defined by {@code fi}.</span></p><p style="margin:0px"><span style="color:rgb(63,95,191)">     * The lifetime of the returned segment is managed by {@code arena}</span></p><p style="margin:0px"><span style="color:rgb(63,95,191)">     */</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(127,0,85);font-weight:bold">public</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">static</span><span style="color:rgb(0,0,0)"> MemorySegment allocate(QsortCompareFunc.Function </span><span style="color:rgb(106,62,62)">fi</span><span style="color:rgb(0,0,0)">, Arena </span><span style="color:rgb(106,62,62)">arena</span><span style="color:rgb(0,0,0)">) {</span></p><p style="margin
 :0px"><span style="color:rgb(0,0,0)">        </span><span style="color:rgb(127,0,85);font-weight:bold">return</span><span style="color:rgb(0,0,0)"> Linker.</span><span style="color:rgb(0,0,0);font-style:italic">nativeLinker</span><span style="color:rgb(0,0,0)">().upcallStub(</span><span style="color:rgb(0,0,192);font-style:italic;font-weight:bold">UP$MH</span><span style="color:rgb(0,0,0)">.bindTo(</span><span style="color:rgb(106,62,62)">fi</span><span style="color:rgb(0,0,0)">), </span><span style="color:rgb(0,0,192);font-style:italic;font-weight:bold">$DESC</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(106,62,62)">arena</span><span style="color:rgb(0,0,0)">);</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">    }</span></p><p style="margin:0px">
</p><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(127,0,85);font-weight:bold">private</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">static</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">final</span><span style="color:rgb(0,0,0)"> MethodHandle </span><span style="color:rgb(0,0,192);font-style:italic;font-weight:bold">DOWN$MH</span><span style="color:rgb(0,0,0)"> = Linker.</span><span style="color:rgb(0,0,0);font-style:italic">nativeLinker</span><span style="color:rgb(0,0,0)">().downcallHandle(</span><span style="color:rgb(0,0,192);font-style:italic;font-weight:bold">$DESC</span><span style="color:rgb(0,0,0)">);</span></p><p style="margin:0px">
</p><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(63,95,191)">/**</span></p><p style="margin:0px"><span style="color:rgb(63,95,191)">     * Invoke the upcall stub {@code funcPtr}, with given parameters</span></p><p style="margin:0px"><span style="color:rgb(63,95,191)">     */</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(127,0,85);font-weight:bold">public</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">static</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">int</span><span style="color:rgb(0,0,0)"> invoke(MemorySegment </span><span style="color:rgb(106,62,62)">funcPtr</span><span style="color:rgb(0,0,0)">,MemorySegment </span><span style="color:rgb(106,62,62)">_x0</span><span style="color:rgb(0,0,0)">, MemorySegment </span><span style="color:rgb(106,62,62)">_x1</span><span style="color:rgb(0,0,0)">) 
 {</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        </span><span style="color:rgb(127,0,85);font-weight:bold">try</span><span style="color:rgb(0,0,0)"> {</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">            </span><span style="color:rgb(127,0,85);font-weight:bold">return</span><span style="color:rgb(0,0,0)"> (</span><span style="color:rgb(127,0,85);font-weight:bold">int</span><span style="color:rgb(0,0,0)">) </span><span style="color:rgb(0,0,192);font-style:italic;font-weight:bold">DOWN$MH</span><span style="color:rgb(0,0,0)">.invokeExact(</span><span style="color:rgb(106,62,62)">funcPtr</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(106,62,62)">_x0</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(106,62,62)">_x1</span><span style="color:rgb(0,0,0)">);</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        } </span><span style="color:rgb(127,0,85);font-weight:bold">catch</span><span style="color:rgb(0,0,0)"> (Throwable </span><span style="color:rgb(106,62,62)">ex$</span><span style="color:rgb(0,0,0)">) {</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">            </span><span style="color:rgb(127,0,85);font-weight:bold">throw</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">new</span><span style="color:rgb(0,0,0)"> AssertionError(</span><span style="color:rgb(42,0,255)">"should not reach here"</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(106,62,62)">ex$</span><span style="color:rgb(0,0,0)">);</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        }</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">    }</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">}</span></p></div>
                </div>
              </div>
              <div><br>
              </div>
              <div>I made a few changes in jextract to make the
                callbacks generate interface rather than a class, adding
                a helper record Upcall to do most of the actions:</div>
              <div><br>
              </div>
              <div>
                <div style="background-color:rgb(255,255,255);padding:0px 0px 0px 2px">
                  <div style="color:rgb(0,0,0);background-color:rgb(255,255,255);font-family:"Consolas";font-size:10pt;white-space:pre"><p style="margin:0px"><span style="color:rgb(127,0,85);font-weight:bold">public</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">interface</span><span style="color:rgb(0,0,0)"> QsortCompareFunc {</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(63,95,191)">/** The function pointer signature, expressed as a functional interface */</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(127,0,85);font-weight:bold">int</span><span style="color:rgb(0,0,0)"> apply(MemorySegment </span><span style="color:rgb(106,62,62)">_x0</span><span style="color:rgb(0,0,0)">, MemorySegment </span><span style="color:rgb(106,62,62)">_x1</span><span style="color:rgb(0,0,0)">);</span></p><p style="margin:0px">
</p><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(127,0,85);font-weight:bold">static</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">final</span><span style="color:rgb(0,0,0)"> C_h.Upcall<QsortCompareFunc> </span><span style="color:rgb(0,0,192);font-style:italic;font-weight:bold">UPCALL</span><span style="color:rgb(0,0,0)"> = </span><span style="color:rgb(127,0,85);font-weight:bold">new</span><span style="color:rgb(0,0,0)"> C_h.Upcall<>(QsortCompareFunc.</span><span style="color:rgb(127,0,85);font-weight:bold">class</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(42,0,255)">"apply"</span><span style="color:rgb(0,0,0)">, FunctionDescriptor.</span><span style="color:rgb(0,0,0);font-style:italic">of</span><span style="color:rgb(0,0,0)">(</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        C_h.</span><span style="color:rgb(0,0,192);font-st
 yle:italic;font-weight:bold">C_INT</span><span style="color:rgb(0,0,0)">,</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        C_h.</span><span style="color:rgb(0,0,192);font-style:italic;font-weight:bold">C_POINTER</span><span style="color:rgb(0,0,0)">,</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        C_h.</span><span style="color:rgb(0,0,192);font-style:italic;font-weight:bold">C_POINTER</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">    ));</span></p><p style="margin:0px">
</p><div style="background-color:rgb(255,255,255);padding:0px 0px 0px 2px"><div style="color:rgb(0,0,0);background-color:rgb(255,255,255);font-family:"Consolas";font-size:10pt;white-space:pre"><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(63,127,95)">// </span><span style="color:rgb(63,127,95)">A </span><span style="color:rgb(63,127,95)">new upcall stub </span><span style="color:rgb(63,127,95)">is </span><span style="background-color:rgb(255,255,255);padding:0px 0px 0px 2px"><span style="color:rgb(0,0,0);background-color:rgb(255,255,255);font-family:"Consolas";font-size:10pt;white-space:pre"><span style="color:rgb(63,127,95)">allocated </span></span></span><span style="color:rgb(63,127,95)">by</span>:</p><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(63,127,95)">//    MemorySegment funcPtr = QsortCompareFunc.UPCALL.allocate(fi,arena)</span></p><p style="margin:0px">
</p></div></div><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(63,95,191)">/**</span></p><p style="margin:0px"><span style="color:rgb(63,95,191)">     * Invoke the upcall stub {@code funcPtr}, with given parameters</span></p><p style="margin:0px"><span style="color:rgb(63,95,191)">     */</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(127,0,85);font-weight:bold">public</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">static</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">int</span><span style="color:rgb(0,0,0)"> invoke(MemorySegment </span><span style="color:rgb(106,62,62)">funcPtr</span><span style="color:rgb(0,0,0)">,MemorySegment </span><span style="color:rgb(106,62,62)">_x0</span><span style="color:rgb(0,0,0)">, MemorySegment </span><span style="color:rgb(106,62,62)">_x1</span><span style="color:rg
 b(0,0,0)">) {</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        </span><span style="color:rgb(127,0,85);font-weight:bold">try</span><span style="color:rgb(0,0,0)"> {</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">            </span><span style="color:rgb(127,0,85);font-weight:bold">return</span><span style="color:rgb(0,0,0)"> (</span><span style="color:rgb(127,0,85);font-weight:bold">int</span><span style="color:rgb(0,0,0)">) </span><span style="color:rgb(0,0,192);font-style:italic;font-weight:bold">UPCALL</span><span style="color:rgb(0,0,0)">.downcall().invokeExact(</span><span style="color:rgb(106,62,62)">funcPtr</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(106,62,62)">_x0</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(106,62,62)">_x1</span><span style="color:rgb(0,0,0)">);</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        } </span><span style="color:rgb(127,0,85);font-weight:bo
 ld">catch</span><span style="color:rgb(0,0,0)"> (Throwable </span><span style="color:rgb(106,62,62)">ex$</span><span style="color:rgb(0,0,0)">) {</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">            </span><span style="color:rgb(127,0,85);font-weight:bold">throw</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">new</span><span style="color:rgb(0,0,0)"> AssertionError(</span><span style="color:rgb(42,0,255)">"should not reach here"</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(106,62,62)">ex$</span><span style="color:rgb(0,0,0)">);</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        }</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">    }</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">}</span></p></div>
                </div>
                <br>
              </div>
              <div>This reduces the definition somewhat, as long as the
                top level header has a record to handle all callback
                interfaces:</div>
              <div><br>
              </div>
              <div>
                <div style="background-color:rgb(255,255,255);padding:0px 0px 0px 2px">
                  <div style="color:rgb(0,0,0);background-color:rgb(255,255,255);font-family:"Consolas";font-size:10pt;white-space:pre"><p style="margin:0px"><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(127,0,85);font-weight:bold">public</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">record</span><span style="color:rgb(0,0,0)"> Upcall<FunctionInterface>(FunctionDescriptor </span><span style="color:rgb(106,62,62)">descriptor</span><span style="color:rgb(0,0,0)">, MethodHandle </span><span style="color:rgb(106,62,62)">upcall</span><span style="color:rgb(0,0,0)">, MethodHandle </span><span style="color:rgb(106,62,62)">downcall</span><span style="color:rgb(0,0,0)">) {</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        </span><span style="color:rgb(127,0,85);font-weight:bold">public</span><span style="color:rgb(0,0,0)"> Upcall(Class<FunctionInterface> </span><span style="color:rgb(106,
 62,62)">fi</span><span style="color:rgb(0,0,0)">, String </span><span style="color:rgb(106,62,62)">name</span><span style="color:rgb(0,0,0)">, FunctionDescriptor </span><span style="color:rgb(106,62,62)">descriptor</span><span style="color:rgb(0,0,0)">) {</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">            </span><span style="color:rgb(127,0,85);font-weight:bold">this</span><span style="color:rgb(0,0,0)">(</span><span style="color:rgb(106,62,62)">descriptor</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,0,0);font-style:italic">upcallHandle</span><span style="color:rgb(0,0,0)">(</span><span style="color:rgb(106,62,62)">fi</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(106,62,62)">name</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(106,62,62)">descriptor</span><span style="color:rgb(0,0,0)">), Linker.</span><span style="color:rgb(0,0,0);font-style:italic">nativeLinker</span><span style="color:rg
 b(0,0,0)">().downcallHandle(</span><span style="color:rgb(106,62,62)">descriptor</span><span style="color:rgb(0,0,0)">));</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        }</span></p><p style="margin:0px">
</p><p style="margin:0px"><span style="color:rgb(0,0,0)">        </span><span style="color:rgb(63,95,191)">/** Find Java method handle of interface for upcall from native </span><span style="color:rgb(127,127,159)">-></span><span style="color:rgb(63,95,191)"> Java */</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        </span><span style="color:rgb(127,0,85);font-weight:bold">public</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">static</span><span style="color:rgb(0,0,0)"> MethodHandle upcallHandle(Class<?> </span><span style="color:rgb(106,62,62)">fi</span><span style="color:rgb(0,0,0)">, String </span><span style="color:rgb(106,62,62)">name</span><span style="color:rgb(0,0,0)">, FunctionDescriptor </span><span style="color:rgb(106,62,62)">fdesc</span><span style="color:rgb(0,0,0)">) {</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">            </span><span style="color:rgb(127,0,85);font-weig
 ht:bold">try</span><span style="color:rgb(0,0,0)"> {</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">                </span><span style="color:rgb(127,0,85);font-weight:bold">return</span><span style="color:rgb(0,0,0)"> MethodHandles.</span><span style="color:rgb(0,0,0);font-style:italic">lookup</span><span style="color:rgb(0,0,0)">().findVirtual(</span><span style="color:rgb(106,62,62)">fi</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(106,62,62)">name</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(106,62,62)">fdesc</span><span style="color:rgb(0,0,0)">.toMethodType());</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">            } </span><span style="color:rgb(127,0,85);font-weight:bold">catch</span><span style="color:rgb(0,0,0)"> (ReflectiveOperationException </span><span style="color:rgb(106,62,62)">ex</span><span style="color:rgb(0,0,0)">) {</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">  
               </span><span style="color:rgb(127,0,85);font-weight:bold">throw</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(127,0,85);font-weight:bold">new</span><span style="color:rgb(0,0,0)"> AssertionError(</span><span style="color:rgb(106,62,62)">ex</span><span style="color:rgb(0,0,0)">);</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">            }</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        }</span></p><p style="margin:0px">
</p><p style="margin:0px"><span style="color:rgb(0,0,0)">        </span><span style="color:rgb(63,95,191)">/// Allocate java stub for upcall</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        </span><span style="color:rgb(127,0,85);font-weight:bold">public</span><span style="color:rgb(0,0,0)"> MemorySegment allocate(FunctionInterface </span><span style="color:rgb(106,62,62)">javaImpl</span><span style="color:rgb(0,0,0)">, Arena </span><span style="color:rgb(106,62,62)">scope</span><span style="color:rgb(0,0,0)">) {</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">            </span><span style="color:rgb(127,0,85);font-weight:bold">return</span><span style="color:rgb(0,0,0)"> Linker.</span><span style="color:rgb(0,0,0);font-style:italic">nativeLinker</span><span style="color:rgb(0,0,0)">().upcallStub(</span><span style="color:rgb(0,0,192)">upcall</span><span style="color:rgb(0,0,0)">.bindTo(</span><span style="color:rgb(106,62,62)">javaImpl</span><sp an="" style="color:rgb(0,0,0)">), <span style="color:rgb(0,0,192)">descriptor</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(106,62,62)">scope</span><span style="color:rgb(0,0,0)">);</span></sp></p><p style="margin:0px"><span style="color:rgb(0,0,0)">        }</span></p><p style="margin:0px"><span style="color:rgb(0,0,0)">    }</span></p><p style="margin:0px">
</p><p style="margin:0px">Worth considering?</p><p style="margin:0px">
</p><p style="margin:0px">Duncan</p></div>
                </div>
                <br>
              </div>
              <div><br>
              </div>
              <div><br>
              </div>
              <div><br>
              </div>
            </div>
          </blockquote>
        </blockquote>
        <p></p>
      </div>
      <p style="margin: 0px 0px 1.2em !important;"></p>
      <div title="MDH:PHA+SGkgRHVuY2FuLDxicj53ZSB0b29rIGEgYmV0dGVyIGxvb2sgYXQgdGhpcywgYW5kIG5vdGlj
ZWQgdGhhdCwgaW4gCnJlYWxpdHksIHRoZXJlJ3Mgbm90IG11Y2ggd2UgY2FuIGRvIGF0IHRoZSBt
b21lbnQgYWJvdXQgdGhpcywgZm9yIHR3byByZWFzb25zLjwvcD48cD5GaXJzdCwgdGhlIGlkZWEg
YmVoaW5kIHlvdXIgYXBwcm9hY2ggd2FzIHRvIG1vdmUgc29tZSBvZiB0aGlzIHNoYXJlZCBmdW5j
dGlvbmFsaXR5IChzdWNoIGFzIHRoZSAiYWxsb2NhdGUiIG1ldGhvZCkgdG8gdGhlIFVwY2FsbCBj
bGFzcy4gQnV0IHRoaXMgY2hhbmdlcyB0aGUgY2xpZW50IGNvZGUgaW4gd2F5cyB0aGF0IElNSE8g
YXJlIG5vdCBvcHRpbWFsIC0tIGUuZy48L3A+PHA+YGBgPGJyPmNvbXBhci5hbGxvY2F0ZSguLi4p
PGJyPmBgYDxicj48YnI+YmVjb21lczwvcD48cD5gYGA8YnI+Y29tcGFyJGZ1bmMuVVBDQUxMLmFs
bG9jYXRlKC4uLik8YnI+YGBgPC9wPjxwPlNvIEkgdGhpbmsgdGhhdCwgdG8gbWFrZSB0aGlzIHdv
cmssIHdlIHdvdWxkIGhhdmUgdG8gcmVwbGljYXRlIHRoZSBgYWxsb2NhdGVgIG1ldGhvZCAoYW5k
IHBvc3NpYmx5IG90aGVyIGFjY2Vzc29ycykgaW4gdGhlIHRvcGxldmVsIGNsYXNzIC0tIHdoaWNo
IHJlZHVjZXMgdGhlIGdhaW4uPC9wPjxwPkEgYmV0dGVyIHN0cmF0ZWd5IHdvdWxkIGJlIG9uZSB3
aGVyZSB0aGUgdG9wbGV2ZWwgY2xhc3MgImV4dGVuZHMiIGZyb20gVXBjYWxsIC0tIHRoZW4gYWxs
IHRoZSB2YXJpb3VzIG1ldGhvZHMgd291bGQgYmUgaW5oZXJpdGVkIC0tIGFuZCBjbGllbnRzIHdv
dWxkIGJlIGdvb2QgYWdhaW4uIEJ1dCBpZiB3ZSBkbyB0aGF0LCB3ZSBsb3NlICJjb25zdGFudC1u
ZXNzIiBvZiB0aGUgdmFyaW91cyBtZXRob2QgaGFuZGxlcyBpbnZvbHZlZCwgd2hpY2ggd2lsbCBt
YWtlIG1ldGhvZHMgbGlrZSAiaW52b2tlIiBzbG93ZXIuPGJyPjwvcD48cD5Bbm90aGVyCiBkaWZm
ZXJlbmNlIGJldHdlZW4gdGhlIHR3byBhcHByb2FjaGVzIGlzIHRoYXQgeW91IGhhdmUgbWVyZ2Vk
IHRoZSAKZnVuY3Rpb25hbCBwb2ludGVyIHdyYXBwZXIgd2l0aCB0aGUgZnVuY3Rpb25hbCBpbnRl
cmZhY2UuIFRoaXMgaXMgYSBtb3ZlCiB3ZSBoYXZlIGNvbnNpZGVyZWQgd2hlbiB3ZSB0cmFuc2l0
aW9uZWQgdG8gdGhpcyBuZXcgY29kZSBnZW5lcmF0aW9uIApzdHJhdGVneSwgYnV0IHdlIGVuZGVk
IHVwIHJlamVjdGluZyBiZWNhdXNlIHRoZXJlJ3Mgbm8gd2F5IHRvIG1ha2UgCmludGVyZmFjZSBm
aWVsZHMgbm9uLXB1YmxpYy4gV2hpY2ggaXMgd2h5IHdlIG9wdGVkIGZvciBhbiBlbmNsb3Npbmcg
Cl9jbGFzc18gd2l0aCBhIG5lc3RlZCBpbnRlcmZhY2UuPC9wPjxwPkZvciB0aGVzZSByZWFzb25z
LCBJIGJlbGlldmUgdGhhdCwgZm9yIHRoZSB0aW1lIGJlaW5nLCBpdCdzIGJldHRlciB0byBrZWVw
IHRoZSBnZW5lcmF0ZWQgY29kZSBhcyBpcy4gSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgU3RhYmxl
VmFsdWUgQVBJIFsxXSB3aWxsIGFsbG93IHVzIHRvIGNoYW5nZSB0aGlzIC0tIGF0IHNvbWUgcG9p
bnQgd2UgY29uc2lkZXJlZCBtYWtpbmcgZmllbGRzIG9mIHR5cGUgU3RhYmxlVmFsdWUgaW1wbGlj
aXRseSB0cnVzdGVkIGZpbmFscy4gV2hpbGUgd2UgaGF2ZSByZW1vdmVkIHRoYXQgdHJpY2sgaW4g
dGhlIGN1cnJlbnQgUFIsIHNvbWV0aGluZyBsaWtlIHRoYXQgbWlnaHQgYWxsb3cgZm9yIHRoZSBj
b2RlIGdlbmVyYXRpb24gc3RyYXRlZ3kgSSB3YXMgYWxsdWRpbmcgdG8gZWFybGllciAtLSB3aGVy
ZSB0aGUgZnVuY3Rpb24gcG9pbnRlciBjbGFzcyBleHRlbmRzIGZyb20gc29tZSBVcGNhbGwgY2xh
c3MgdGhhdCBoYXMgYSBwYWlyIG9mIHN0YWJsZSB2YWx1ZSBmaWVsZHMsIG9uZSBmb3IgdGhlIHVw
Y2FsbCBNSCwgdGhlIG90aGVyIGZvciB0aGUgZG93bmNhbGwgTUguIChJbiBnZW5lcmFsLCB3ZSdy
ZSBjb25maWRlbnQgdGhhdCBTdGFibGVWYWx1ZSBzaG91bGQgcmVzdWx0IGluIGpleHRyYWN0IGJp
bmRpbmdzIGJlY29tZSBtdWNoIG1vcmUgY29tcGFjdCwgYXMgU1Ygd2lsbCBlc3NlbnRpYWxseSBy
ZW1vdmUgdGhlIG5lZWQgZm9yIGFsbCB0aGUgaG9sZGVyIGNsYXNzZXMgdGhhdCBhcmUgc3ByZWFk
IHRocm91Z2hvdXQgdGhlIGdlbmVyYXRlZCBjb2RlKS48YnI+PC9wPjxwPlRoYW5rcyBmb3IgdGhl
IGV4cGxvcmF0aW9uITxicj5NYXVyaXppbzwvcD48cD5bMV0gLSBodHRwczovL2dpdGh1Yi5jb20v
b3Blbmpkay9qZGsvcHVsbC8yMzk3Mjxicj48L3A+PHA+PC9wPjxkaXYgY2xhc3M9Im1vei1jaXRl
LXByZWZpeCI+T24gMDcvMDQvMjAyNSAxNjowOSwgTWF1cml6aW8gQ2ltYWRhbW9yZSB3cm90ZTo8
YnI+PC9kaXY+PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSIgY2l0ZT0ibWlkOjE0MDM0NGI5LTU0MDEt
NDJiZS1iNjQ3LTE2NGZhM2UyZjdhNEBvcmFjbGUuY29tIj4KCjxtZXRhIGh0dHAtZXF1aXY9IkNv
bnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyAiPgogIAogIAogICAgPHA+SSBsaWtlIHRo
aXMuIFRoZSB1c2Ugb2YgcmVjb3JkIGNvbXBvbmVudHMgc2hvdWxkIHByb2JhYmx5CiAgICAgIHBy
ZXNlcnZlIHRoZSBmYWN0IHRoYXQgdGhlIHVwY2FsbCBtZXRob2QgaGFuZGxlIGlzIHRyZWF0ZWQg
YXMgYQogICAgICBjb25zdGFudC48L3A+CiAgICA8cD5UaGlzIHNlZW1zIHJlbGF0ZWQgdG8gdGhp
cyBQUiB1bmRlciByZXZpZXc6PC9wPgogICAgPHA+PGEgY2xhc3M9Im1vei10eHQtbGluay1mcmVl
dGV4dCIgaHJlZj0iaHR0cHM6Ly9naXQub3Blbmpkay5vcmcvamV4dHJhY3QvcHVsbC8yNzkiIG1v
ei1kby1ub3Qtc2VuZD0idHJ1ZSI+aHR0cHM6Ly9naXQub3Blbmpkay5vcmcvamV4dHJhY3QvcHVs
bC8yNzk8L2E+PC9wPgogICAgPHA+U28gd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0byBkZWNpZGUgd2hh
dCBjb2RlIHdlIHdhbnQgdG8gZ2VuZXJhdGUKICAgICAgKGFzIHRoYXQgUFIgd2lsbCBtYWtlIGZ1
bmN0aW9uIHBvaW50ZXIgc3VwcG9ydCBldmVuIG1vcmUgdmVyYm9zZSkuPC9wPgogICAgPHA+Q2hl
ZXJzPGJyPgogICAgICBNYXVyaXppbzxicj4KICAgIDwvcD4KICAgIDxkaXYgY2xhc3M9Im1vei1j
aXRlLXByZWZpeCI+T24gMDcvMDQvMjAyNSAxMzo0MiwgRHVuY2FuIEdpdHRpbnMKICAgICAgd3Jv
dGU6PGJyPgogICAgPC9kaXY+CiAgICA8YmxvY2txdW90ZSB0eXBlPSJjaXRlIiBjaXRlPSJtaWQ6
Q0FCT3FjRnMwZmJodFZSOS0rVTVwTjZFMkd3bzNXeUE4MXE9VD1YUEZHcHAyR2FMSkpBQG1haWwu
Z21haWwuY29tIj4KICAgICAgCiAgICAgIDxkaXYgZGlyPSJsdHIiPgogICAgICAgIDxkaXY+SSd2
ZSBiZWVuIHVzaW5nIGpleHRyYWN0IHN1Y2Nlc3NmdWxseSBmb3Igc29tZSB0aW1lIG5vdyBhbmQK
ICAgICAgICAgIGl0IGhhcyBtYWRlIGl0IHZlcnkgZWFzeSB0byBjYWxsIGludG8gdmFyaW91cyBX
aW5kb3dzLiBHcmVhdAogICAgICAgICAgd29yay48L2Rpdj4KICAgICAgICA8ZGl2Pjxicj4KICAg
ICAgICA8L2Rpdj4KICAgICAgICA8ZGl2Pk9uZSBhcmVhIHdoaWNoIHNlZW1zIGEgYml0IHZlcmJv
c2UgaXMgdGhlIGhhbmRsaW5nIG9mIHRoZQogICAgICAgICAgZnVuY3Rpb25hbCBpbnRlcmZhY2Ug
Y2FsbGJhY2tzIGZvciB1cGNhbGxzLiBGb3IgZXhhbXBsZSwgdGhlCiAgICAgICAgICBxc29ydCBj
b21wYXJlIGNhbGxiYWNrIGlzIGFzIGZvbGxvd3MgKEkndmUgc2hvcnRlbmVkIHRoZQogICAgICAg
ICAgamV4dHJhY3QgdmVyc2lvbiBoZXJlKTo8L2Rpdj4KICAgICAgICA8ZGl2Pjxicj4KICAgICAg
ICA8L2Rpdj4KICAgICAgICA8ZGl2PgogICAgICAgICAgPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1j
b2xvcjpyZ2IoMjU1LDI1NSwyNTUpO3BhZGRpbmc6MHB4IDBweCAwcHggMnB4Ij4KICAgICAgICAg
ICAgPGRpdiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigyNTUs
MjU1LDI1NSk7Zm9udC1mYW1pbHk6JnF1b3Q7Q29uc29sYXMmcXVvdDs7Zm9udC1zaXplOjEwcHQ7
d2hpdGUtc3BhY2U6cHJlIj48cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNwYW4gc3R5bGU9ImNvbG9y
OnJnYigxMjcsMCw4NSk7Zm9udC13ZWlnaHQ6Ym9sZCI+cHVibGljPC9zcGFuPjxzcGFuIHN0eWxl
PSJjb2xvcjpyZ2IoMCwwLDApIj4gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTI3LDAs
ODUpO2ZvbnQtd2VpZ2h0OmJvbGQiPmNsYXNzPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2Io
MCwwLDApIj4gUXNvcnRDb21wYXJlRnVuYyB7PC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2luOjBw
eCI+CjwvcD48cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAs
MCkiPiAgICBRc29ydENvbXBhcmVGdW5jKCkgeyB9PC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2lu
OjBweCI+CjwvcD48cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigw
LDAsMCkiPiAgICA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYig2Myw5NSwxOTEpIj4vKiog
VGhlIGZ1bmN0aW9uIHBvaW50ZXIgc2lnbmF0dXJlLCBleHByZXNzZWQgYXMgYSBmdW5jdGlvbmFs
IGludGVyZmFjZSAqLzwvc3Bhbj48L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxl
PSJjb2xvcjpyZ2IoMCwwLDApIj4gICAgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTI3
LDAsODUpO2ZvbnQtd2VpZ2h0OmJvbGQiPnB1YmxpYzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6
cmdiKDAsMCwwKSI+IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEyNywwLDg1KTtmb250
LXdlaWdodDpib2xkIj5pbnRlcmZhY2U8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAs
MCkiPiBGdW5jdGlvbiB7PC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNwYW4gc3R5
bGU9ImNvbG9yOnJnYigwLDAsMCkiPiAgICAgICAgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpy
Z2IoMTI3LDAsODUpO2ZvbnQtd2VpZ2h0OmJvbGQiPmludDwvc3Bhbj48c3BhbiBzdHlsZT0iY29s
b3I6cmdiKDAsMCwwKSI+IGFwcGx5KE1lbW9yeVNlZ21lbnQgPC9zcGFuPjxzcGFuIHN0eWxlPSJj
b2xvcjpyZ2IoMTA2LDYyLDYyKSI+X3gwPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCww
LDApIj4sIE1lbW9yeVNlZ21lbnQgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTA2LDYy
LDYyKSI+X3gxPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4pOzwvc3Bhbj48
L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4g
ICAgfTwvc3Bhbj48L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPgo8L3A+PHAgc3R5bGU9Im1hcmdp
bjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gICAgPC9zcGFuPjxzcGFuIHN0
eWxlPSJjb2xvcjpyZ2IoMTI3LDAsODUpO2ZvbnQtd2VpZ2h0OmJvbGQiPnByaXZhdGU8L3NwYW4+
PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9y
OnJnYigxMjcsMCw4NSk7Zm9udC13ZWlnaHQ6Ym9sZCI+c3RhdGljPC9zcGFuPjxzcGFuIHN0eWxl
PSJjb2xvcjpyZ2IoMCwwLDApIj4gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTI3LDAs
ODUpO2ZvbnQtd2VpZ2h0OmJvbGQiPmZpbmFsPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2Io
MCwwLDApIj4gRnVuY3Rpb25EZXNjcmlwdG9yIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdi
KDAsMCwxOTIpO2ZvbnQtc3R5bGU6aXRhbGljO2ZvbnQtd2VpZ2h0OmJvbGQiPiRERVNDPC9zcGFu
PjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gPSBGdW5jdGlvbkRlc2NyaXB0b3IuPC9z
cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApO2ZvbnQtc3R5bGU6aXRhbGljIj5vZjwv
c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+KDwvc3Bhbj48L3A+PHAgc3R5bGU9
Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gICAgICAgIENfaC5D
X0lOVCw8L3NwYW4+PC9wPjxwIHN0eWxlPSJtYXJnaW46MHB4Ij48c3BhbiBzdHlsZT0iY29sb3I6
cmdiKDAsMCwwKSI+ICAgICAgICBDX2guQ19QT0lOVEVSLDwvc3Bhbj48L3A+PHAgc3R5bGU9Im1h
cmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gICAgICAgIENfaC5DX1BP
SU5URVI8L3NwYW4+PC9wPjxwIHN0eWxlPSJtYXJnaW46MHB4Ij48c3BhbiBzdHlsZT0iY29sb3I6
cmdiKDAsMCwwKSI+ICAgICk7PC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2luOjBweCI+CjwvcD48
cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiAgICA8
L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYig2Myw5NSwxOTEpIj4vKiogVGhlIGRlc2NyaXB0
b3Igb2YgdGhpcyBmdW5jdGlvbiBwb2ludGVyICovPC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2lu
OjBweCI+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiAgICA8L3NwYW4+PHNwYW4gc3R5
bGU9ImNvbG9yOnJnYigxMjcsMCw4NSk7Zm9udC13ZWlnaHQ6Ym9sZCI+cHVibGljPC9zcGFuPjxz
cGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpy
Z2IoMTI3LDAsODUpO2ZvbnQtd2VpZ2h0OmJvbGQiPnN0YXRpYzwvc3Bhbj48c3BhbiBzdHlsZT0i
Y29sb3I6cmdiKDAsMCwwKSI+IEZ1bmN0aW9uRGVzY3JpcHRvciBkZXNjcmlwdG9yKCkgezwvc3Bh
bj48L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDAp
Ij4gICAgICAgIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEyNywwLDg1KTtmb250LXdl
aWdodDpib2xkIj5yZXR1cm48L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiA8
L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMTkyKTtmb250LXN0eWxlOml0YWxpYztm
b250LXdlaWdodDpib2xkIj4kREVTQzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCww
KSI+Ozwvc3Bhbj48L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpy
Z2IoMCwwLDApIj4gICAgfTwvc3Bhbj48L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPgo8L3A+PHAg
c3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gICAgPC9z
cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTI3LDAsODUpO2ZvbnQtd2VpZ2h0OmJvbGQiPnBy
aXZhdGU8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiA8L3NwYW4+PHNwYW4g
c3R5bGU9ImNvbG9yOnJnYigxMjcsMCw4NSk7Zm9udC13ZWlnaHQ6Ym9sZCI+c3RhdGljPC9zcGFu
PjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv
cjpyZ2IoMTI3LDAsODUpO2ZvbnQtd2VpZ2h0OmJvbGQiPmZpbmFsPC9zcGFuPjxzcGFuIHN0eWxl
PSJjb2xvcjpyZ2IoMCwwLDApIj4gTWV0aG9kSGFuZGxlIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29s
b3I6cmdiKDAsMCwxOTIpO2ZvbnQtc3R5bGU6aXRhbGljO2ZvbnQtd2VpZ2h0OmJvbGQiPlVQJE1I
PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gPSBDX2gudXBjYWxsSGFuZGxl
KFFzb3J0Q29tcGFyZUZ1bmMuRnVuY3Rpb24uPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2Io
MTI3LDAsODUpO2ZvbnQtd2VpZ2h0OmJvbGQiPmNsYXNzPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv
cjpyZ2IoMCwwLDApIj4sIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDQyLDAsMjU1KSI+
ImFwcGx5Ijwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+LCA8L3NwYW4+PHNw
YW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMTkyKTtmb250LXN0eWxlOml0YWxpYztmb250LXdlaWdo
dDpib2xkIj4kREVTQzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+KTs8L3Nw
YW4+PC9wPjxwIHN0eWxlPSJtYXJnaW46MHB4Ij4KPC9wPjxwIHN0eWxlPSJtYXJnaW46MHB4Ij48
c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+ICAgIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29s
b3I6cmdiKDYzLDk1LDE5MSkiPi8qKjwvc3Bhbj48L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPjxz
cGFuIHN0eWxlPSJjb2xvcjpyZ2IoNjMsOTUsMTkxKSI+ICAgICAqIEFsbG9jYXRlcyBhIG5ldyB1
cGNhbGwgc3R1Yiwgd2hvc2UgaW1wbGVtZW50YXRpb24gaXMgZGVmaW5lZCBieSB7QGNvZGUgZml9
Ljwvc3Bhbj48L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2Io
NjMsOTUsMTkxKSI+ICAgICAqIFRoZSBsaWZldGltZSBvZiB0aGUgcmV0dXJuZWQgc2VnbWVudCBp
cyBtYW5hZ2VkIGJ5IHtAY29kZSBhcmVuYX08L3NwYW4+PC9wPjxwIHN0eWxlPSJtYXJnaW46MHB4
Ij48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDYzLDk1LDE5MSkiPiAgICAgKi88L3NwYW4+PC9wPjxw
IHN0eWxlPSJtYXJnaW46MHB4Ij48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+ICAgIDwv
c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEyNywwLDg1KTtmb250LXdlaWdodDpib2xkIj5w
dWJsaWM8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiA8L3NwYW4+PHNwYW4g
c3R5bGU9ImNvbG9yOnJnYigxMjcsMCw4NSk7Zm9udC13ZWlnaHQ6Ym9sZCI+c3RhdGljPC9zcGFu
PjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gTWVtb3J5U2VnbWVudCBhbGxvY2F0ZShR
c29ydENvbXBhcmVGdW5jLkZ1bmN0aW9uIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEw
Niw2Miw2MikiPmZpPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4sIEFyZW5h
IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEwNiw2Miw2MikiPmFyZW5hPC9zcGFuPjxz
cGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4pIHs8L3NwYW4+PC9wPjxwIHN0eWxlPSJtYXJn
aW4KIDowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gICAgICAgIDwvc3Bhbj48
c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEyNywwLDg1KTtmb250LXdlaWdodDpib2xkIj5yZXR1cm48
L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiBMaW5rZXIuPC9zcGFuPjxzcGFu
IHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApO2ZvbnQtc3R5bGU6aXRhbGljIj5uYXRpdmVMaW5rZXI8
L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPigpLnVwY2FsbFN0dWIoPC9zcGFu
PjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDE5Mik7Zm9udC1zdHlsZTppdGFsaWM7Zm9udC13
ZWlnaHQ6Ym9sZCI+VVAkTUg8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPi5i
aW5kVG8oPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTA2LDYyLDYyKSI+Zmk8L3NwYW4+
PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiksIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29s
b3I6cmdiKDAsMCwxOTIpO2ZvbnQtc3R5bGU6aXRhbGljO2ZvbnQtd2VpZ2h0OmJvbGQiPiRERVND
PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4sIDwvc3Bhbj48c3BhbiBzdHls
ZT0iY29sb3I6cmdiKDEwNiw2Miw2MikiPmFyZW5hPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpy
Z2IoMCwwLDApIj4pOzwvc3Bhbj48L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxl
PSJjb2xvcjpyZ2IoMCwwLDApIj4gICAgfTwvc3Bhbj48L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgi
Pgo8L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDAp
Ij4gICAgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTI3LDAsODUpO2ZvbnQtd2VpZ2h0
OmJvbGQiPnByaXZhdGU8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiA8L3Nw
YW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigxMjcsMCw4NSk7Zm9udC13ZWlnaHQ6Ym9sZCI+c3Rh
dGljPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gPC9zcGFuPjxzcGFuIHN0
eWxlPSJjb2xvcjpyZ2IoMTI3LDAsODUpO2ZvbnQtd2VpZ2h0OmJvbGQiPmZpbmFsPC9zcGFuPjxz
cGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gTWV0aG9kSGFuZGxlIDwvc3Bhbj48c3BhbiBz
dHlsZT0iY29sb3I6cmdiKDAsMCwxOTIpO2ZvbnQtc3R5bGU6aXRhbGljO2ZvbnQtd2VpZ2h0OmJv
bGQiPkRPV04kTUg8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiA9IExpbmtl
ci48L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCk7Zm9udC1zdHlsZTppdGFsaWMi
Pm5hdGl2ZUxpbmtlcjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+KCkuZG93
bmNhbGxIYW5kbGUoPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDE5Mik7Zm9udC1z
dHlsZTppdGFsaWM7Zm9udC13ZWlnaHQ6Ym9sZCI+JERFU0M8L3NwYW4+PHNwYW4gc3R5bGU9ImNv
bG9yOnJnYigwLDAsMCkiPik7PC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2luOjBweCI+CjwvcD48
cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiAgICA8
L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYig2Myw5NSwxOTEpIj4vKio8L3NwYW4+PC9wPjxw
IHN0eWxlPSJtYXJnaW46MHB4Ij48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDYzLDk1LDE5MSkiPiAg
ICAgKiBJbnZva2UgdGhlIHVwY2FsbCBzdHViIHtAY29kZSBmdW5jUHRyfSwgd2l0aCBnaXZlbiBw
YXJhbWV0ZXJzPC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNwYW4gc3R5bGU9ImNv
bG9yOnJnYig2Myw5NSwxOTEpIj4gICAgICovPC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2luOjBw
eCI+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiAgICA8L3NwYW4+PHNwYW4gc3R5bGU9
ImNvbG9yOnJnYigxMjcsMCw4NSk7Zm9udC13ZWlnaHQ6Ym9sZCI+cHVibGljPC9zcGFuPjxzcGFu
IHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2Io
MTI3LDAsODUpO2ZvbnQtd2VpZ2h0OmJvbGQiPnN0YXRpYzwvc3Bhbj48c3BhbiBzdHlsZT0iY29s
b3I6cmdiKDAsMCwwKSI+IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEyNywwLDg1KTtm
b250LXdlaWdodDpib2xkIj5pbnQ8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCki
PiBpbnZva2UoTWVtb3J5U2VnbWVudCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigxMDYs
NjIsNjIpIj5mdW5jUHRyPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4sTWVt
b3J5U2VnbWVudCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigxMDYsNjIsNjIpIj5feDA8
L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiwgTWVtb3J5U2VnbWVudCA8L3Nw
YW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigxMDYsNjIsNjIpIj5feDE8L3NwYW4+PHNwYW4gc3R5
bGU9ImNvbG9yOnJnYigwLDAsMCkiPikgCiB7PC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2luOjBw
eCI+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiAgICAgICAgPC9zcGFuPjxzcGFuIHN0
eWxlPSJjb2xvcjpyZ2IoMTI3LDAsODUpO2ZvbnQtd2VpZ2h0OmJvbGQiPnRyeTwvc3Bhbj48c3Bh
biBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+IHs8L3NwYW4+PC9wPjxwIHN0eWxlPSJtYXJnaW46
MHB4Ij48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+ICAgICAgICAgICAgPC9zcGFuPjxz
cGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTI3LDAsODUpO2ZvbnQtd2VpZ2h0OmJvbGQiPnJldHVybjwv
c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+ICg8L3NwYW4+PHNwYW4gc3R5bGU9
ImNvbG9yOnJnYigxMjcsMCw4NSk7Zm9udC13ZWlnaHQ6Ym9sZCI+aW50PC9zcGFuPjxzcGFuIHN0
eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4pIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAs
MCwxOTIpO2ZvbnQtc3R5bGU6aXRhbGljO2ZvbnQtd2VpZ2h0OmJvbGQiPkRPV04kTUg8L3NwYW4+
PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPi5pbnZva2VFeGFjdCg8L3NwYW4+PHNwYW4g
c3R5bGU9ImNvbG9yOnJnYigxMDYsNjIsNjIpIj5mdW5jUHRyPC9zcGFuPjxzcGFuIHN0eWxlPSJj
b2xvcjpyZ2IoMCwwLDApIj4sIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEwNiw2Miw2
MikiPl94MDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+LCA8L3NwYW4+PHNw
YW4gc3R5bGU9ImNvbG9yOnJnYigxMDYsNjIsNjIpIj5feDE8L3NwYW4+PHNwYW4gc3R5bGU9ImNv
bG9yOnJnYigwLDAsMCkiPik7PC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNwYW4g
c3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiAgICAgICAgfSA8L3NwYW4+PHNwYW4gc3R5bGU9ImNv
bG9yOnJnYigxMjcsMCw4NSk7Zm9udC13ZWlnaHQ6Ym9sZCI+Y2F0Y2g8L3NwYW4+PHNwYW4gc3R5
bGU9ImNvbG9yOnJnYigwLDAsMCkiPiAoVGhyb3dhYmxlIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29s
b3I6cmdiKDEwNiw2Miw2MikiPmV4JDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCww
KSI+KSB7PC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNwYW4gc3R5bGU9ImNvbG9y
OnJnYigwLDAsMCkiPiAgICAgICAgICAgIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEy
NywwLDg1KTtmb250LXdlaWdodDpib2xkIj50aHJvdzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6
cmdiKDAsMCwwKSI+IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEyNywwLDg1KTtmb250
LXdlaWdodDpib2xkIj5uZXc8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiBB
c3NlcnRpb25FcnJvcig8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYig0MiwwLDI1NSkiPiJz
aG91bGQgbm90IHJlYWNoIGhlcmUiPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDAp
Ij4sIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEwNiw2Miw2MikiPmV4JDwvc3Bhbj48
c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+KTs8L3NwYW4+PC9wPjxwIHN0eWxlPSJtYXJn
aW46MHB4Ij48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+ICAgICAgICB9PC9zcGFuPjwv
cD48cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiAg
ICB9PC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNwYW4gc3R5bGU9ImNvbG9yOnJn
YigwLDAsMCkiPn08L3NwYW4+PC9wPjwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9k
aXY+CiAgICAgICAgPGRpdj48YnI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdj5JIG1hZGUg
YSBmZXcgY2hhbmdlcyBpbiBqZXh0cmFjdCB0byBtYWtlIHRoZSBjYWxsYmFja3MKICAgICAgICAg
IGdlbmVyYXRlIGludGVyZmFjZSByYXRoZXIgdGhhbiBhIGNsYXNzLCBhZGRpbmcgYSBoZWxwZXIg
cmVjb3JkCiAgICAgICAgICBVcGNhbGwgdG8gZG8gbW9zdCBvZiB0aGUgYWN0aW9uczo8L2Rpdj4K
ICAgICAgICA8ZGl2Pjxicj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2PgogICAgICAgICAg
PGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpyZ2IoMjU1LDI1NSwyNTUpO3BhZGRpbmc6MHB4
IDBweCAwcHggMnB4Ij4KICAgICAgICAgICAgPGRpdiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKTti
YWNrZ3JvdW5kLWNvbG9yOnJnYigyNTUsMjU1LDI1NSk7Zm9udC1mYW1pbHk6JnF1b3Q7Q29uc29s
YXMmcXVvdDs7Zm9udC1zaXplOjEwcHQ7d2hpdGUtc3BhY2U6cHJlIj48cCBzdHlsZT0ibWFyZ2lu
OjBweCI+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigxMjcsMCw4NSk7Zm9udC13ZWlnaHQ6Ym9sZCI+
cHVibGljPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gPC9zcGFuPjxzcGFu
IHN0eWxlPSJjb2xvcjpyZ2IoMTI3LDAsODUpO2ZvbnQtd2VpZ2h0OmJvbGQiPmludGVyZmFjZTwv
c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+IFFzb3J0Q29tcGFyZUZ1bmMgezwv
c3Bhbj48L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCww
LDApIj4gICAgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoNjMsOTUsMTkxKSI+LyoqIFRo
ZSBmdW5jdGlvbiBwb2ludGVyIHNpZ25hdHVyZSwgZXhwcmVzc2VkIGFzIGEgZnVuY3Rpb25hbCBp
bnRlcmZhY2UgKi88L3NwYW4+PC9wPjxwIHN0eWxlPSJtYXJnaW46MHB4Ij48c3BhbiBzdHlsZT0i
Y29sb3I6cmdiKDAsMCwwKSI+ICAgIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEyNyww
LDg1KTtmb250LXdlaWdodDpib2xkIj5pbnQ8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigw
LDAsMCkiPiBhcHBseShNZW1vcnlTZWdtZW50IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdi
KDEwNiw2Miw2MikiPl94MDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+LCBN
ZW1vcnlTZWdtZW50IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEwNiw2Miw2MikiPl94
MTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+KTs8L3NwYW4+PC9wPjxwIHN0
eWxlPSJtYXJnaW46MHB4Ij4KPC9wPjxwIHN0eWxlPSJtYXJnaW46MHB4Ij48c3BhbiBzdHlsZT0i
Y29sb3I6cmdiKDAsMCwwKSI+ICAgIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEyNyww
LDg1KTtmb250LXdlaWdodDpib2xkIj5zdGF0aWM8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJn
YigwLDAsMCkiPiA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigxMjcsMCw4NSk7Zm9udC13
ZWlnaHQ6Ym9sZCI+ZmluYWw8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiBD
X2guVXBjYWxsJmx0O1Fzb3J0Q29tcGFyZUZ1bmMmZ3Q7IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29s
b3I6cmdiKDAsMCwxOTIpO2ZvbnQtc3R5bGU6aXRhbGljO2ZvbnQtd2VpZ2h0OmJvbGQiPlVQQ0FM
TDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+ID0gPC9zcGFuPjxzcGFuIHN0
eWxlPSJjb2xvcjpyZ2IoMTI3LDAsODUpO2ZvbnQtd2VpZ2h0OmJvbGQiPm5ldzwvc3Bhbj48c3Bh
biBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+IENfaC5VcGNhbGwmbHQ7Jmd0OyhRc29ydENvbXBh
cmVGdW5jLjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEyNywwLDg1KTtmb250LXdlaWdo
dDpib2xkIj5jbGFzczwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+LCA8L3Nw
YW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYig0MiwwLDI1NSkiPiJhcHBseSI8L3NwYW4+PHNwYW4g
c3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiwgRnVuY3Rpb25EZXNjcmlwdG9yLjwvc3Bhbj48c3Bh
biBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKTtmb250LXN0eWxlOml0YWxpYyI+b2Y8L3NwYW4+PHNw
YW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPig8L3NwYW4+PC9wPjxwIHN0eWxlPSJtYXJnaW46
MHB4Ij48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+ICAgICAgICBDX2guPC9zcGFuPjxz
cGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDE5Mik7Zm9udC1zdAogeWxlOml0YWxpYztmb250LXdl
aWdodDpib2xkIj5DX0lOVDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+LDwv
c3Bhbj48L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCww
LDApIj4gICAgICAgIENfaC48L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMTkyKTtm
b250LXN0eWxlOml0YWxpYztmb250LXdlaWdodDpib2xkIj5DX1BPSU5URVI8L3NwYW4+PHNwYW4g
c3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiw8L3NwYW4+PC9wPjxwIHN0eWxlPSJtYXJnaW46MHB4
Ij48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+ICAgICAgICBDX2guPC9zcGFuPjxzcGFu
IHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDE5Mik7Zm9udC1zdHlsZTppdGFsaWM7Zm9udC13ZWlnaHQ6
Ym9sZCI+Q19QT0lOVEVSPC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNwYW4gc3R5
bGU9ImNvbG9yOnJnYigwLDAsMCkiPiAgICApKTs8L3NwYW4+PC9wPjxwIHN0eWxlPSJtYXJnaW46
MHB4Ij4KPC9wPjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6cmdiKDI1NSwyNTUsMjU1KTtw
YWRkaW5nOjBweCAwcHggMHB4IDJweCI+PGRpdiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKTtiYWNr
Z3JvdW5kLWNvbG9yOnJnYigyNTUsMjU1LDI1NSk7Zm9udC1mYW1pbHk6JnF1b3Q7Q29uc29sYXMm
cXVvdDs7Zm9udC1zaXplOjEwcHQ7d2hpdGUtc3BhY2U6cHJlIj48cCBzdHlsZT0ibWFyZ2luOjBw
eCI+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiAgICA8L3NwYW4+PHNwYW4gc3R5bGU9
ImNvbG9yOnJnYig2MywxMjcsOTUpIj4vLyA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYig2
MywxMjcsOTUpIj5BIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDYzLDEyNyw5NSkiPm5l
dyB1cGNhbGwgc3R1YiA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYig2MywxMjcsOTUpIj5p
cyA8L3NwYW4+PHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6cmdiKDI1NSwyNTUsMjU1KTtw
YWRkaW5nOjBweCAwcHggMHB4IDJweCI+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCk7YmFj
a2dyb3VuZC1jb2xvcjpyZ2IoMjU1LDI1NSwyNTUpO2ZvbnQtZmFtaWx5OiZxdW90O0NvbnNvbGFz
JnF1b3Q7O2ZvbnQtc2l6ZToxMHB0O3doaXRlLXNwYWNlOnByZSI+PHNwYW4gc3R5bGU9ImNvbG9y
OnJnYig2MywxMjcsOTUpIj5hbGxvY2F0ZWQgPC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5
bGU9ImNvbG9yOnJnYig2MywxMjcsOTUpIj5ieTwvc3Bhbj46PC9wPjxwIHN0eWxlPSJtYXJnaW46
MHB4Ij48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+ICAgIDwvc3Bhbj48c3BhbiBzdHls
ZT0iY29sb3I6cmdiKDYzLDEyNyw5NSkiPi8vICAgIE1lbW9yeVNlZ21lbnQgZnVuY1B0ciA9IFFz
b3J0Q29tcGFyZUZ1bmMuVVBDQUxMLmFsbG9jYXRlKGZpLGFyZW5hKTwvc3Bhbj48L3A+PHAgc3R5
bGU9Im1hcmdpbjowcHgiPgo8L3A+PC9kaXY+PC9kaXY+PHAgc3R5bGU9Im1hcmdpbjowcHgiPjxz
cGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gICAgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv
cjpyZ2IoNjMsOTUsMTkxKSI+LyoqPC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNw
YW4gc3R5bGU9ImNvbG9yOnJnYig2Myw5NSwxOTEpIj4gICAgICogSW52b2tlIHRoZSB1cGNhbGwg
c3R1YiB7QGNvZGUgZnVuY1B0cn0sIHdpdGggZ2l2ZW4gcGFyYW1ldGVyczwvc3Bhbj48L3A+PHAg
c3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoNjMsOTUsMTkxKSI+ICAg
ICAqLzwvc3Bhbj48L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpy
Z2IoMCwwLDApIj4gICAgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTI3LDAsODUpO2Zv
bnQtd2VpZ2h0OmJvbGQiPnB1YmxpYzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCww
KSI+IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEyNywwLDg1KTtmb250LXdlaWdodDpi
b2xkIj5zdGF0aWM8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiA8L3NwYW4+
PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigxMjcsMCw4NSk7Zm9udC13ZWlnaHQ6Ym9sZCI+aW50PC9z
cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gaW52b2tlKE1lbW9yeVNlZ21lbnQg
PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTA2LDYyLDYyKSI+ZnVuY1B0cjwvc3Bhbj48
c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+LE1lbW9yeVNlZ21lbnQgPC9zcGFuPjxzcGFu
IHN0eWxlPSJjb2xvcjpyZ2IoMTA2LDYyLDYyKSI+X3gwPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv
cjpyZ2IoMCwwLDApIj4sIE1lbW9yeVNlZ21lbnQgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpy
Z2IoMTA2LDYyLDYyKSI+X3gxPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZwogYigwLDAsMCki
Pikgezwvc3Bhbj48L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpy
Z2IoMCwwLDApIj4gICAgICAgIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEyNywwLDg1
KTtmb250LXdlaWdodDpib2xkIj50cnk8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAs
MCkiPiB7PC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNwYW4gc3R5bGU9ImNvbG9y
OnJnYigwLDAsMCkiPiAgICAgICAgICAgIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEy
NywwLDg1KTtmb250LXdlaWdodDpib2xkIj5yZXR1cm48L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9y
OnJnYigwLDAsMCkiPiAoPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTI3LDAsODUpO2Zv
bnQtd2VpZ2h0OmJvbGQiPmludDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+
KSA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMTkyKTtmb250LXN0eWxlOml0YWxp
Yztmb250LXdlaWdodDpib2xkIj5VUENBTEw8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigw
LDAsMCkiPi5kb3duY2FsbCgpLmludm9rZUV4YWN0KDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6
cmdiKDEwNiw2Miw2MikiPmZ1bmNQdHI8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAs
MCkiPiwgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTA2LDYyLDYyKSI+X3gwPC9zcGFu
PjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4sIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29s
b3I6cmdiKDEwNiw2Miw2MikiPl94MTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCww
KSI+KTs8L3NwYW4+PC9wPjxwIHN0eWxlPSJtYXJnaW46MHB4Ij48c3BhbiBzdHlsZT0iY29sb3I6
cmdiKDAsMCwwKSI+ICAgICAgICB9IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEyNyww
LDg1KTtmb250LXdlaWdodDpibwogbGQiPmNhdGNoPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpy
Z2IoMCwwLDApIj4gKFRocm93YWJsZSA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigxMDYs
NjIsNjIpIj5leCQ8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPikgezwvc3Bh
bj48L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDAp
Ij4gICAgICAgICAgICA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigxMjcsMCw4NSk7Zm9u
dC13ZWlnaHQ6Ym9sZCI+dGhyb3c8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCki
PiA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigxMjcsMCw4NSk7Zm9udC13ZWlnaHQ6Ym9s
ZCI+bmV3PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gQXNzZXJ0aW9uRXJy
b3IoPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoNDIsMCwyNTUpIj4ic2hvdWxkIG5vdCBy
ZWFjaCBoZXJlIjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+LCA8L3NwYW4+
PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigxMDYsNjIsNjIpIj5leCQ8L3NwYW4+PHNwYW4gc3R5bGU9
ImNvbG9yOnJnYigwLDAsMCkiPik7PC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNw
YW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiAgICAgICAgfTwvc3Bhbj48L3A+PHAgc3R5bGU9
Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gICAgfTwvc3Bhbj48
L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj59
PC9zcGFuPjwvcD48L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGJyPgogICAgICAg
IDwvZGl2PgogICAgICAgIDxkaXY+VGhpcyByZWR1Y2VzIHRoZSBkZWZpbml0aW9uIHNvbWV3aGF0
LCBhcyBsb25nIGFzIHRoZSB0b3AKICAgICAgICAgIGxldmVsIGhlYWRlciBoYXMgYSByZWNvcmQg
dG8gaGFuZGxlIGFsbCBjYWxsYmFjayBpbnRlcmZhY2VzOjwvZGl2PgogICAgICAgIDxkaXY+PGJy
PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXY+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJiYWNr
Z3JvdW5kLWNvbG9yOnJnYigyNTUsMjU1LDI1NSk7cGFkZGluZzowcHggMHB4IDBweCAycHgiPgog
ICAgICAgICAgICA8ZGl2IHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApO2JhY2tncm91bmQtY29sb3I6
cmdiKDI1NSwyNTUsMjU1KTtmb250LWZhbWlseTomcXVvdDtDb25zb2xhcyZxdW90Oztmb250LXNp
emU6MTBwdDt3aGl0ZS1zcGFjZTpwcmUiPjxwIHN0eWxlPSJtYXJnaW46MHB4Ij48c3BhbiBzdHls
ZT0iY29sb3I6cmdiKDAsMCwwKSI+ICAgIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEy
NywwLDg1KTtmb250LXdlaWdodDpib2xkIj5wdWJsaWM8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9y
OnJnYigwLDAsMCkiPiA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigxMjcsMCw4NSk7Zm9u
dC13ZWlnaHQ6Ym9sZCI+cmVjb3JkPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDAp
Ij4gVXBjYWxsJmx0O0Z1bmN0aW9uSW50ZXJmYWNlJmd0OyhGdW5jdGlvbkRlc2NyaXB0b3IgPC9z
cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTA2LDYyLDYyKSI+ZGVzY3JpcHRvcjwvc3Bhbj48
c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+LCBNZXRob2RIYW5kbGUgPC9zcGFuPjxzcGFu
IHN0eWxlPSJjb2xvcjpyZ2IoMTA2LDYyLDYyKSI+dXBjYWxsPC9zcGFuPjxzcGFuIHN0eWxlPSJj
b2xvcjpyZ2IoMCwwLDApIj4sIE1ldGhvZEhhbmRsZSA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9y
OnJnYigxMDYsNjIsNjIpIj5kb3duY2FsbDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAs
MCwwKSI+KSB7PC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNwYW4gc3R5bGU9ImNv
bG9yOnJnYigwLDAsMCkiPiAgICAgICAgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTI3
LDAsODUpO2ZvbnQtd2VpZ2h0OmJvbGQiPnB1YmxpYzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6
cmdiKDAsMCwwKSI+IFVwY2FsbChDbGFzcyZsdDtGdW5jdGlvbkludGVyZmFjZSZndDsgPC9zcGFu
PjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTA2LAogNjIsNjIpIj5maTwvc3Bhbj48c3BhbiBzdHls
ZT0iY29sb3I6cmdiKDAsMCwwKSI+LCBTdHJpbmcgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpy
Z2IoMTA2LDYyLDYyKSI+bmFtZTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+
LCBGdW5jdGlvbkRlc2NyaXB0b3IgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTA2LDYy
LDYyKSI+ZGVzY3JpcHRvcjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+KSB7
PC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigw
LDAsMCkiPiAgICAgICAgICAgIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEyNywwLDg1
KTtmb250LXdlaWdodDpib2xkIj50aGlzPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCww
LDApIj4oPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTA2LDYyLDYyKSI+ZGVzY3JpcHRv
cjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+LCA8L3NwYW4+PHNwYW4gc3R5
bGU9ImNvbG9yOnJnYigwLDAsMCk7Zm9udC1zdHlsZTppdGFsaWMiPnVwY2FsbEhhbmRsZTwvc3Bh
bj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+KDwvc3Bhbj48c3BhbiBzdHlsZT0iY29s
b3I6cmdiKDEwNiw2Miw2MikiPmZpPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDAp
Ij4sIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEwNiw2Miw2MikiPm5hbWU8L3NwYW4+
PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiwgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv
cjpyZ2IoMTA2LDYyLDYyKSI+ZGVzY3JpcHRvcjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdi
KDAsMCwwKSI+KSwgTGlua2VyLjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKTtm
b250LXN0eWxlOml0YWxpYyI+bmF0aXZlTGlua2VyPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpy
ZwogYigwLDAsMCkiPigpLmRvd25jYWxsSGFuZGxlKDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6
cmdiKDEwNiw2Miw2MikiPmRlc2NyaXB0b3I8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigw
LDAsMCkiPikpOzwvc3Bhbj48L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJj
b2xvcjpyZ2IoMCwwLDApIj4gICAgICAgIH08L3NwYW4+PC9wPjxwIHN0eWxlPSJtYXJnaW46MHB4
Ij4KPC9wPjxwIHN0eWxlPSJtYXJnaW46MHB4Ij48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCww
KSI+ICAgICAgICA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYig2Myw5NSwxOTEpIj4vKiog
RmluZCBKYXZhIG1ldGhvZCBoYW5kbGUgb2YgaW50ZXJmYWNlIGZvciB1cGNhbGwgZnJvbSBuYXRp
dmUgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTI3LDEyNywxNTkpIj4tJmd0Ozwvc3Bh
bj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDYzLDk1LDE5MSkiPiBKYXZhICovPC9zcGFuPjwvcD48
cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiAgICAg
ICAgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTI3LDAsODUpO2ZvbnQtd2VpZ2h0OmJv
bGQiPnB1YmxpYzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+IDwvc3Bhbj48
c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEyNywwLDg1KTtmb250LXdlaWdodDpib2xkIj5zdGF0aWM8
L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiBNZXRob2RIYW5kbGUgdXBjYWxs
SGFuZGxlKENsYXNzJmx0Oz8mZ3Q7IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEwNiw2
Miw2MikiPmZpPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4sIFN0cmluZyA8
L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigxMDYsNjIsNjIpIj5uYW1lPC9zcGFuPjxzcGFu
IHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4sIEZ1bmN0aW9uRGVzY3JpcHRvciA8L3NwYW4+PHNw
YW4gc3R5bGU9ImNvbG9yOnJnYigxMDYsNjIsNjIpIj5mZGVzYzwvc3Bhbj48c3BhbiBzdHlsZT0i
Y29sb3I6cmdiKDAsMCwwKSI+KSB7PC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNw
YW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiAgICAgICAgICAgIDwvc3Bhbj48c3BhbiBzdHls
ZT0iY29sb3I6cmdiKDEyNywwLDg1KTtmb250LXdlaWcKIGh0OmJvbGQiPnRyeTwvc3Bhbj48c3Bh
biBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+IHs8L3NwYW4+PC9wPjxwIHN0eWxlPSJtYXJnaW46
MHB4Ij48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+ICAgICAgICAgICAgICAgIDwvc3Bh
bj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEyNywwLDg1KTtmb250LXdlaWdodDpib2xkIj5yZXR1
cm48L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMCkiPiBNZXRob2RIYW5kbGVzLjwv
c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKTtmb250LXN0eWxlOml0YWxpYyI+bG9v
a3VwPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4oKS5maW5kVmlydHVhbCg8
L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigxMDYsNjIsNjIpIj5maTwvc3Bhbj48c3BhbiBz
dHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+LCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigx
MDYsNjIsNjIpIj5uYW1lPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4sIDwv
c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEwNiw2Miw2MikiPmZkZXNjPC9zcGFuPjxzcGFu
IHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4udG9NZXRob2RUeXBlKCkpOzwvc3Bhbj48L3A+PHAg
c3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gICAgICAg
ICAgICB9IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEyNywwLDg1KTtmb250LXdlaWdo
dDpib2xkIj5jYXRjaDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+IChSZWZs
ZWN0aXZlT3BlcmF0aW9uRXhjZXB0aW9uIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEw
Niw2Miw2MikiPmV4PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4pIHs8L3Nw
YW4+PC9wPjxwIHN0eWxlPSJtYXJnaW46MHB4Ij48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCww
KSI+ICAKICAgICAgICAgICAgICAgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTI3LDAs
ODUpO2ZvbnQtd2VpZ2h0OmJvbGQiPnRocm93PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2Io
MCwwLDApIj4gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTI3LDAsODUpO2ZvbnQtd2Vp
Z2h0OmJvbGQiPm5ldzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+IEFzc2Vy
dGlvbkVycm9yKDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEwNiw2Miw2MikiPmV4PC9z
cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4pOzwvc3Bhbj48L3A+PHAgc3R5bGU9
Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gICAgICAgICAgICB9
PC9zcGFuPjwvcD48cCBzdHlsZT0ibWFyZ2luOjBweCI+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigw
LDAsMCkiPiAgICAgICAgfTwvc3Bhbj48L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPgo8L3A+PHAg
c3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gICAgICAg
IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDYzLDk1LDE5MSkiPi8vLyBBbGxvY2F0ZSBq
YXZhIHN0dWIgZm9yIHVwY2FsbDwvc3Bhbj48L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPjxzcGFu
IHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4gICAgICAgIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29s
b3I6cmdiKDEyNywwLDg1KTtmb250LXdlaWdodDpib2xkIj5wdWJsaWM8L3NwYW4+PHNwYW4gc3R5
bGU9ImNvbG9yOnJnYigwLDAsMCkiPiBNZW1vcnlTZWdtZW50IGFsbG9jYXRlKEZ1bmN0aW9uSW50
ZXJmYWNlIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEwNiw2Miw2MikiPmphdmFJbXBs
PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMCwwLDApIj4sIEFyZW5hIDwvc3Bhbj48c3Bh
biBzdHlsZT0iY29sb3I6cmdiKDEwNiw2Miw2MikiPnNjb3BlPC9zcGFuPjxzcGFuIHN0eWxlPSJj
b2xvcjpyZ2IoMCwwLDApIj4pIHs8L3NwYW4+PC9wPjxwIHN0eWxlPSJtYXJnaW46MHB4Ij48c3Bh
biBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+ICAgICAgICAgICAgPC9zcGFuPjxzcGFuIHN0eWxl
PSJjb2xvcjpyZ2IoMTI3LDAsODUpO2ZvbnQtd2VpZ2h0OmJvbGQiPnJldHVybjwvc3Bhbj48c3Bh
biBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+IExpbmtlci48L3NwYW4+PHNwYW4gc3R5bGU9ImNv
bG9yOnJnYigwLDAsMCk7Zm9udC1zdHlsZTppdGFsaWMiPm5hdGl2ZUxpbmtlcjwvc3Bhbj48c3Bh
biBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+KCkudXBjYWxsU3R1Yig8L3NwYW4+PHNwYW4gc3R5
bGU9ImNvbG9yOnJnYigwLDAsMTkyKSI+dXBjYWxsPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpy
Z2IoMCwwLDApIj4uYmluZFRvKDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDEwNiw2Miw2
MikiPmphdmFJbXBsPC9zcGFuPjxzcCBhbj0iIiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+KSwg
PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigwLDAsMTkyKSI+ZGVzY3JpcHRvcjwvc3Bhbj48c3BhbiBz
dHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+LCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigx
MDYsNjIsNjIpIj5zY29wZTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+KTs8
L3NwYW4+PC9zcD48L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPjxzcGFuIHN0eWxlPSJjb2xvcjpy
Z2IoMCwwLDApIj4gICAgICAgIH08L3NwYW4+PC9wPjxwIHN0eWxlPSJtYXJnaW46MHB4Ij48c3Bh
biBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+ICAgIH08L3NwYW4+PC9wPjxwIHN0eWxlPSJtYXJn
aW46MHB4Ij4KPC9wPjxwIHN0eWxlPSJtYXJnaW46MHB4Ij5Xb3J0aCBjb25zaWRlcmluZz88L3A+
PHAgc3R5bGU9Im1hcmdpbjowcHgiPgo8L3A+PHAgc3R5bGU9Im1hcmdpbjowcHgiPkR1bmNhbjwv
cD48L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGJyPgogICAgICAgIDwvZGl2Pgog
ICAgICAgIDxkaXY+PGJyPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXY+PGJyPgogICAgICAg
IDwvZGl2PgogICAgICAgIDxkaXY+PGJyPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAg
IDwvYmxvY2txdW90ZT4KICAKCgo8L2Jsb2NrcXVvdGU+" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;">​</div>
    </div>
  </body>
</html>