<!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="" markdown-here-wrapper-content-modified="true">
      <p style="margin: 0px 0px 1.2em !important;">Hi,<br>
        I have put together a patch that overhauls the attribution
        checks for local and member inner class creation:</p>
      <p style="margin: 0px 0px 1.2em !important;"><a href="https://github.com/openjdk/jdk/compare/master...mcimadamore:jdk:refactor_encl_checks?expand=1" class="moz-txt-link-freetext">https://github.com/openjdk/jdk/compare/master...mcimadamore:jdk:refactor_encl_checks?expand=1</a></p>
      <p style="margin: 0px 0px 1.2em !important;">This was far more
        complex than I expected, as I faced issues not only in the
        implementation, but also in the JLS (see below). Let me attempt
        to summarize the rationale behind this fix.</p>
      <p style="margin: 0px 0px 1.2em !important;">Let’s start with
        member inner classes. Whenever we see <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;">new M()</code>
        where <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;">M</code>
        is a member inner class, we need to <em>infer</em> an
        expression for <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;">M</code>‘s
        enclosing instance, given none is provided. This inference
        problem is also present when checking a <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;">super(...)</code>
        constructor call: if the superclass is a member inner class <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;">M</code>,
        then validating the constructor call implies <em>inferring</em>
        a suitable enclosing instance for <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;">M</code>,
        as if we were checking <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;">new M()</code>.</p>
      <p style="margin: 0px 0px 1.2em !important;">How should this
        inference process work? Well, it should look at <em>all</em>
        the enclosing instances available to us, and pick the innermost
        enclosing instance of type <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;">C</code>
        such that:</p>
      <ul style="margin: 1.2em 0px;padding-left: 2em;">
        <li style="margin: 0.5em 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;">C.this</code>
          is accessible (e.g. not in <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;">C</code>‘s
          early construction context) and;</li>
        <li style="margin: 0.5em 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;">C</code>
          is a subclass of <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;">M</code>‘s
          enclosing class.</li>
      </ul>
      <p style="margin: 0px 0px 1.2em !important;">The crucial
        observation here is that there can be <em>multiple</em> valid
        enclosing instances, and the innermost one might not be
        available due to early construction context, so we need to be
        able to skip that, and jump to the next. Consider this example:</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 class="hljs language-java" 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;display: block; overflow-x: auto; padding: 0.5em; color: rgb(51, 51, 51); background: rgb(248, 248, 248); -moz-text-size-adjust: none;"><span class="hljs-class"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Outer</span> </span>{

    <span class="hljs-class"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">InnerSuperclass</span> </span>{ }

    <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">static</span> <span class="hljs-class"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">InnerOuter</span> <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">extends</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Outer</span> </span>{
        <span class="hljs-class"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">InnerInnerOuter</span> <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">extends</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Outer</span> </span>{
            InnerInnerOuter() {
                <span class="hljs-class"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">InnerSubclass</span> <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">extends</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">InnerSuperclass</span> </span>{
                    InnerSubclass() {
                        <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">super</span>(); <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// (1)</span>
                    }
                }
                <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">super</span>();
            }
        }
    }
}
</code></pre>
      <p style="margin: 0px 0px 1.2em !important;">This program doesn’t
        compile today. But should it? Yes: while it’s true that <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;">InnerInnerOuter.this</code>
        cannot be accessed in (1), <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;">InnerOuter.this</code>
        can, and that’s also a suitable enclosing instance (as <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;">InnerOuter extends Outer</code>).</p>
      <p style="margin: 0px 0px 1.2em !important;">What about local
        classes? Should they undergo a similar check? The answer is no,
        as 15.9.2 is silent about this. What matters, for local classes,
        is that the local class creation expression occurs in a context
        where we can access local variables defined in the method in
        which the local class is defined.</p>
      <p style="margin: 0px 0px 1.2em !important;">With the new checks
        in place we can finally solve both:</p>
      <ul style="margin: 1.2em 0px;padding-left: 2em;">
        <li style="margin: 0.5em 0px;"><a href="https://bugs.openjdk.org/browse/JDK-8334248" class="moz-txt-link-freetext">https://bugs.openjdk.org/browse/JDK-8334248</a>
          and</li>
        <li style="margin: 0.5em 0px;"><a href="https://bugs.openjdk.org/browse/JDK-8322882" class="moz-txt-link-freetext">https://bugs.openjdk.org/browse/JDK-8322882</a></li>
      </ul>
      <p style="margin: 0px 0px 1.2em !important;">Few notes:</p>
      <ul style="margin: 1.2em 0px;padding-left: 2em;">
        <li style="margin: 0.5em 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;">Lower</code>
          needs some updates to support programs like the the one above.
          That is, we have to teach <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;">Lower</code>
          that the current class’ <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;">this</code>
          cannot be touched if the class is in early construction
          context;</li>
        <li style="margin: 0.5em 0px;">the JLS text for member inner
          class creation seems lacking (in both 15.9.2 and in 8.8.7.1).
          First, the JLS fails to recognize that a <em>subclass</em> of
          the enclosing instance is still a suitable value for
          constructing the member class. Secondly, the JLS doesn’t seem
          to take early construction contexts into account (so might end
          up picking the wrong thing, or reporting an unnecessary
          error);</li>
        <li style="margin: 0.5em 0px;">the JLS text for local inner
          class creation in 15.9.2 seems also lacking. The check for
          local classes seems too weak, which leaves out intersting
          cases such as JDK-8322882.</li>
      </ul>
      <p style="margin: 0px 0px 1.2em !important;">I think that this
        fix, coupled with the translation fixes I shared last week
        should implement JEP 482 “as intended” (of course, for some of
        the fixes described here, some JLS udpate is also required, as
        these are not “just” compiler bugs).</p>
      <p style="margin: 0px 0px 1.2em !important;">Cheers<br>
        Maurizio</p>
      <p style="margin: 0px 0px 1.2em !important;">On 14/06/2024 20:49,
        Archie Cobbs wrote:</p>
      <blockquote style="margin: 1.2em 0px;border-left: 4px solid rgb(221, 221, 221); padding: 0px 1em; color: rgb(119, 119, 119); quotes: none;">
        <p style="margin: 0px 0px 1.2em !important;">Thanks. Let’s
          transition this particular discussion to that PR. I<br>
          added a rebuttal for you :)</p>
        <p style="margin: 0px 0px 1.2em !important;"><a href="https://github.com/openjdk/jdk/pull/19705" class="moz-txt-link-freetext">https://github.com/openjdk/jdk/pull/19705</a><br>
          <a href="https://urldefense.com/v3/__https://github.com/openjdk/jdk/pull/19705__;!!ACWV5N9M2RV99hQ!IPTJtMcgd06MLFxVOwPycDr63fpHIABTrno8GoNywuev7W-GybSntWK-JnxR6AxfqkAm2yp8w79BYUoeki12fBoD2It17g$" class="moz-txt-link-freetext">https://urldefense.com/v3/__https://github.com/openjdk/jdk/pull/19705__;!!ACWV5N9M2RV99hQ!IPTJtMcgd06MLFxVOwPycDr63fpHIABTrno8GoNywuev7W-GybSntWK-JnxR6AxfqkAm2yp8w79BYUoeki12fBoD2It17g$</a></p>
        <p style="margin: 0px 0px 1.2em !important;">-Archie</p>
        <p style="margin: 0px 0px 1.2em !important;">On Fri, Jun 14,
          2024 at 12:56 PM Maurizio Cimadamore</p>
        <p style="margin: 0px 0px 1.2em !important;"><a href="http://mailto:maurizio.cimadamore@oracle.com">maurizio.cimadamore@oracle.com</a>
          wrote:</p>
        <p style="margin: 0px 0px 1.2em !important;">On 14/06/2024
          18:51, Archie Cobbs wrote:</p>
        <blockquote style="margin: 1.2em 0px;border-left: 4px solid rgb(221, 221, 221); padding: 0px 1em; color: rgb(119, 119, 119); quotes: none;">
          <p style="margin: 0px 0px 1.2em !important;">So yes I also see
            the compiler crashing on that example but I<br>
            think that may be separate from the issue above…? I don’t
            fully<br>
            understand this one yet.</p>
        </blockquote>
        <p style="margin: 0px 0px 1.2em !important;">I left an example
          of code that might defeat your fix in the PR.</p>
        <p style="margin: 0px 0px 1.2em !important;"><a href="https://github.com/openjdk/jdk/pull/19705#issuecomment-2168497505" class="moz-txt-link-freetext">https://github.com/openjdk/jdk/pull/19705#issuecomment-2168497505</a><br>
          <a href="https://urldefense.com/v3/__https://github.com/openjdk/jdk/pull/19705*issuecomment-2168497505__;Iw!!ACWV5N9M2RV99hQ!IPTJtMcgd06MLFxVOwPycDr63fpHIABTrno8GoNywuev7W-GybSntWK-JnxR6AxfqkAm2yp8w79BYUoeki12fBpkHh3GXQ$" class="moz-txt-link-freetext">https://urldefense.com/v3/__https://github.com/openjdk/jdk/pull/19705*issuecomment-2168497505__;Iw!!ACWV5N9M2RV99hQ!IPTJtMcgd06MLFxVOwPycDr63fpHIABTrno8GoNywuev7W-GybSntWK-JnxR6AxfqkAm2yp8w79BYUoeki12fBpkHh3GXQ$</a></p>
        <p style="margin: 0px 0px 1.2em !important;">Maurizio</p>
        <p style="margin: 0px 0px 1.2em !important;">— Archie L. Cobbs</p>
      </blockquote>
      <div title="MDH:SGksPGJyPkkgaGF2ZSBwdXQgdG9nZXRoZXIgYSBwYXRjaCB0aGF0IG92ZXJoYXVscyB0aGUgYXR0
cmlidXRpb24gY2hlY2tzIGZvciBsb2NhbCBhbmQgbWVtYmVyIGlubmVyIGNsYXNzIGNyZWF0aW9u
Ojxicj48YnI+aHR0cHM6Ly9naXRodWIuY29tL29wZW5qZGsvamRrL2NvbXBhcmUvbWFzdGVyLi4u
bWNpbWFkYW1vcmU6amRrOnJlZmFjdG9yX2VuY2xfY2hlY2tzP2V4cGFuZD0xPGJyPjxicj5UaGlz
IHdhcyBmYXIgbW9yZSBjb21wbGV4IHRoYW4gSSBleHBlY3RlZCwgYXMgSSBmYWNlZCBpc3N1ZXMg
bm90IG9ubHkgaW4gdGhlIGltcGxlbWVudGF0aW9uLCBidXQgYWxzbyBpbiB0aGUgSkxTIChzZWUg
YmVsb3cpLiBMZXQgbWUgYXR0ZW1wdCB0byBzdW1tYXJpemUgdGhlIHJhdGlvbmFsZSBiZWhpbmQg
dGhpcyBmaXguPGJyPjxicj5MZXQncyBzdGFydCB3aXRoIG1lbWJlciBpbm5lciBjbGFzc2VzLiBX
aGVuZXZlciB3ZSBzZWUgYG5ldyBNKClgIHdoZXJlIGBNYCBpcyBhIG1lbWJlciBpbm5lciBjbGFz
cywgd2UgbmVlZCB0byAqaW5mZXIqIGFuIGV4cHJlc3Npb24gZm9yIGBNYCdzIGVuY2xvc2luZyBp
bnN0YW5jZSwgZ2l2ZW4gbm9uZSBpcyBwcm92aWRlZC4gVGhpcyBpbmZlcmVuY2UgcHJvYmxlbSBp
cyBhbHNvIHByZXNlbnQgd2hlbiBjaGVja2luZyBhIGBzdXBlciguLi4pYCBjb25zdHJ1Y3RvciBj
YWxsOiBpZiB0aGUgc3VwZXJjbGFzcyBpcyBhIG1lbWJlciBpbm5lciBjbGFzcyBgTWAsIHRoZW4g
dmFsaWRhdGluZyB0aGUgY29uc3RydWN0b3IgY2FsbCBpbXBsaWVzwqAgKmluZmVycmluZyogYSBz
dWl0YWJsZSBlbmNsb3NpbmcgaW5zdGFuY2UgZm9yIGBNYCwgYXMgaWYgd2Ugd2VyZSBjaGVja2lu
ZyBgbmV3IE0oKWAuPGJyPjxicj5Ib3cgc2hvdWxkIHRoaXMgaW5mZXJlbmNlIHByb2Nlc3Mgd29y
az8gV2VsbCwgaXQgc2hvdWxkIGxvb2sgYXQgKmFsbCogdGhlIGVuY2xvc2luZyBpbnN0YW5jZXMg
YXZhaWxhYmxlIHRvIHVzLCBhbmQgcGljayB0aGUgaW5uZXJtb3N0IGVuY2xvc2luZyBpbnN0YW5j
ZSBvZiB0eXBlIGBDYCBzdWNoIHRoYXQ6PGJyPiogYEMudGhpc2AgaXMgYWNjZXNzaWJsZSAoZS5n
LiBub3QgaW4gYENgJ3MgZWFybHkgY29uc3RydWN0aW9uIGNvbnRleHQpIGFuZDs8YnI+KiBgQ2Ag
aXMgYSBzdWJjbGFzcyBvZiBgTWAncyBlbmNsb3NpbmcgY2xhc3MuPGJyPjxicj5UaGUgY3J1Y2lh
bCBvYnNlcnZhdGlvbiBoZXJlIGlzIHRoYXQgdGhlcmUgY2FuIGJlIF9tdWx0aXBsZV8gdmFsaWQg
ZW5jbG9zaW5nIGluc3RhbmNlcywgYW5kIHRoZSBpbm5lcm1vc3Qgb25lIG1pZ2h0IG5vdCBiZSBh
dmFpbGFibGUgZHVlIHRvIGVhcmx5IGNvbnN0cnVjdGlvbiBjb250ZXh0LCBzbyB3ZSBuZWVkIHRv
IGJlIGFibGUgdG8gc2tpcCB0aGF0LCBhbmQganVtcCB0byB0aGUgbmV4dC4gQ29uc2lkZXIgdGhp
cyBleGFtcGxlOjxicj48YnI+YGBgamF2YTxicj5jbGFzcyBPdXRlciB7PGJyPjxicj7CoMKgwqAg
Y2xhc3MgSW5uZXJTdXBlcmNsYXNzIHsgfTxicj48YnI+wqDCoMKgIHN0YXRpYyBjbGFzcyBJbm5l
ck91dGVyIGV4dGVuZHMgT3V0ZXIgezxicj7CoMKgwqDCoMKgwqDCoCBjbGFzcyBJbm5lcklubmVy
T3V0ZXIgZXh0ZW5kcyBPdXRlciB7PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgSW5uZXJJbm5l
ck91dGVyKCkgezxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2xhc3MgSW5uZXJT
dWJjbGFzcyBleHRlbmRzIElubmVyU3VwZXJjbGFzcyB7PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKg
wqDCoMKgwqDCoMKgwqDCoMKgIElubmVyU3ViY2xhc3MoKSB7PGJyPsKgwqDCoMKgwqDCoMKgwqDC
oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3VwZXIoKTsgLy8gKDEpPGJyPsKgwqDCoMKg
wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH08YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDC
oMKgwqDCoMKgIH08YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN1cGVyKCk7PGJy
PsKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfTxicj7CoMKgwqDCoMKgwqDCoCB9PGJyPsKgwqDCoCB9
PGJyPn08YnI+YGBgPGJyPjxicj5UaGlzIHByb2dyYW0gZG9lc24ndCBjb21waWxlIHRvZGF5LiBC
dXQgc2hvdWxkIGl0PyBZZXM6IHdoaWxlIGl0J3MgdHJ1ZSB0aGF0IGBJbm5lcklubmVyT3V0ZXIu
dGhpc2AgY2Fubm90IGJlIGFjY2Vzc2VkIGluICgxKSwgYElubmVyT3V0ZXIudGhpc2AgY2FuLCBh
bmQgdGhhdCdzIGFsc28gYSBzdWl0YWJsZSBlbmNsb3NpbmcgaW5zdGFuY2UgKGFzIGBJbm5lck91
dGVyIGV4dGVuZHMgT3V0ZXJgKS48YnI+PGJyPldoYXQgYWJvdXQgbG9jYWwgY2xhc3Nlcz8gU2hv
dWxkIHRoZXkgdW5kZXJnbyBhIHNpbWlsYXIgY2hlY2s/IFRoZSBhbnN3ZXIgaXMgbm8sIGFzIDE1
LjkuMiBpcyBzaWxlbnQgYWJvdXQgdGhpcy4gVGhlIG9ubHkgdGhpbmcgdGhhdCBtYXR0ZXJzLCBm
b3IgbG9jYWwgY2xhc3NlcywgaXMgdGhhdCB3aGVuIHdlIGZpbmQ6PGJyPjxicj5gbmV3IExvY2Fs
Q2xhc3MoKWA8YnI+PGJyPndlIGFyZSBpbiBhIGNvbnRleHQgd2hlcmUgd2UgY2FuIGFjY2VzcyBs
b2NhbCB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgbWV0aG9kIGluIHdoaWNoIHRoZSB0YXJnZXQg
Y2xhc3MgaXMgZGVmaW5lZC48YnI+PGJyPldpdGggdGhlIG5ldyBjaGVjayBpbiBwbGFjZSB3ZSBj
YW4gZmluYWxseSBzb2x2ZSBib3RoOjxicj4qIGh0dHBzOi8vYnVncy5vcGVuamRrLm9yZy9icm93
c2UvSkRLLTgzMzQyNDggYW5kPGJyPiogaHR0cHM6Ly9idWdzLm9wZW5qZGsub3JnL2Jyb3dzZS9K
REstODMyMjg4Mjxicj48YnI+RmV3IG5vdGVzOjxicj48YnI+KiBgTG93ZXJgIG5lZWRlZCBzb21l
IHVwZGF0ZXMgdG9vIHRvIHN1cHBvcnQgcHJvZ3JhbXMgbGlrZSB0aGUgdGhlIG9uZSBhYm92ZTsg
dGhhdCBpcywgd2UgaGF2ZSB0byB0ZWFjaCBgTG93ZXJgIHRoYXQgdGhlIGN1cnJlbnQgY2xhc3Mn
IGB0aGlzYCBjYW5ub3QgYmUgdG91Y2hlZCBpZiB0aGUgY2xhc3MgaXMgaW4gZWFybHkgY29uc3Ry
dWN0aW9uIGNvbnRleHQ7PGJyPiogdGhlIEpMUyB0ZXh0IGZvciBtZW1iZXIgaW5uZXIgY2xhc3Mg
Y3JlYXRpb24gc2VlbXMgbGFja2luZyAoaW4gYm90aCAxNS45LjIgYW5kIGluIDguOC43LjEpLiBG
aXJzdCwgdGhlIEpMUyBmYWlscyB0byByZWNvZ25pemUgdGhhdCBhIF9zdWJjbGFzc18gb2YgdGhl
IGVuY2xvc2luZyBpbnN0YW5jZSBpcyBzdGlsbCBhIHN1aXRhYmxlIHZhbHVlIGZvciBjb25zdHJ1
Y3RpbmcgdGhlIG1lbWJlciBjbGFzcy4gU2Vjb25kbHksIHRoZSBKTFMgZG9lc24ndCBzZWVtIHRv
IHRha2UgZWFybHkgY29uc3RydWN0aW9uIGNvbnRleHRzIGludG8gYWNjb3VudCAoc28gbWlnaHQg
ZW5kIHVwIHBpY2tpbmcgdGhlIHdyb25nIHRoaW5nLCBvciByZXBvcnRpbmcgYW4gdW5uZWNlc3Nh
cnkgZXJyb3IpOzxicj4qIHRoZSBKTFMgdGV4dCBmb3IgbG9jYWwgaW5uZXIgY2xhc3MgY3JlYXRp
b24gaW4gMTUuOS4yIHNlZW1zIGFsc28gbGFja2luZy4gVGhlIGNoZWNrIGZvciBsb2NhbCBjbGFz
c2VzIHNlZW1zIHRvbyB3ZWFrLCB3aGljaCBsZWF2ZXMgb3V0IGludGVyc3RpbmcgY2FzZXMgc3Vj
aCBhcyBKREstODMyMjg4Mi48YnI+PGJyPkkgdGhpbmsgdGhhdCB0aGlzIGZpeCwgY291cGxlZCB3
aXRoIHRoZSB0cmFuc2xhdGlvbiBmaXhlcyBJIHNoYXJlZCBsYXN0IHdlZWsgc2hvdWxkIGltcGxl
bWVudCBKRVAgNDgyICJhcyBpbnRlbmRlZCIgKG9mIGNvdXJzZSwgZm9yIHNvbWUgb2YgdGhlIGZp
eGVzIGRlc2NyaWJlZCBoZXJlLCBzb21lIEpMUyB1ZHBhdGUgaXMgYWxzbyByZXF1aXJlZCwgYXMg
dGhlc2UgYXJlIG5vdCAianVzdCIgY29tcGlsZXIgYnVncykuPGJyPjxicj5DaGVlcnM8YnI+TWF1
cml6aW88YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+T24gMTQvMDYvMjAyNCAyMDo0OSwgQXJj
aGllIENvYmJzIHdyb3RlOjxicj48c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IHByZS13cmFwOyBk
aXNwbGF5OiBibG9jazsgd2lkdGg6IDk4dnc7Ij4mZ3Q7IFRoYW5rcy4gTGV0J3MgdHJhbnNpdGlv
biB0aGlzIHBhcnRpY3VsYXIgZGlzY3Vzc2lvbiB0byB0aGF0IFBSLiBJPGJyPiZndDsgYWRkZWQg
YSByZWJ1dHRhbCBmb3IgeW91IDopPGJyPiZndDsgPGJyPiZndDsgaHR0cHM6Ly9naXRodWIuY29t
L29wZW5qZGsvamRrL3B1bGwvMTk3MDU8YnI+Jmd0OyAmbHQ7aHR0cHM6Ly91cmxkZWZlbnNlLmNv
bS92My9fX2h0dHBzOi8vZ2l0aHViLmNvbS9vcGVuamRrL2pkay9wdWxsLzE5NzA1X187ISFBQ1dW
NU45TTJSVjk5aFEhSVBUSnRNY2dkMDZNTEZ4Vk93UHljRHI2M2ZwSElBQlRybm84R29OeXd1ZXY3
Vy1HeWJTbnRXSy1KbnhSNkF4ZnFrQW0yeXA4dzc5QllVb2VraTEyZkJvRDJJdDE3ZyQmZ3Q7PGJy
PiZndDs8YnI+Jmd0Ozxicj4mZ3Q7IDxicj48L3NwYW4+LUFyY2hpZTxicj48c3BhbiBzdHlsZT0i
d2hpdGUtc3BhY2U6IHByZS13cmFwOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDk4dnc7Ij4mZ3Q7
IDxicj4mZ3Q7IE9uIEZyaSwgSnVuIDE0LCAyMDI0IGF0IDEyOjU24oCvUE0gTWF1cml6aW8gQ2lt
YWRhbW9yZTxicj4mZ3Q7ICZsdDttYXVyaXppby5jaW1hZGFtb3JlQG9yYWNsZS5jb20mZ3Q7IHdy
b3RlOjxicj4mZ3Q7IDxicj4mZ3Q7IDxicj4mZ3Q7IE9uIDE0LzA2LzIwMjQgMTg6NTEsIEFyY2hp
ZSBDb2JicyB3cm90ZTo8YnI+Jmd0OyZndDsgU28geWVzIEkgYWxzbyBzZWUgdGhlIGNvbXBpbGVy
IGNyYXNoaW5nIG9uIHRoYXQgZXhhbXBsZSBidXQgSTxicj4mZ3Q7Jmd0OyB0aGluayB0aGF0IG1h
eSBiZSBzZXBhcmF0ZSBmcm9tIHRoZSBpc3N1ZSBhYm92ZS4uLj8gSSBkb24ndCBmdWxseTxicj4m
Z3Q7Jmd0OyB1bmRlcnN0YW5kIHRoaXMgb25lIHlldC48YnI+Jmd0OyA8YnI+Jmd0OyBJIGxlZnQg
YW4gZXhhbXBsZSBvZiBjb2RlIHRoYXQgbWlnaHQgZGVmZWF0IHlvdXIgZml4IGluIHRoZSBQUi48
YnI+Jmd0OyA8YnI+Jmd0OyBodHRwczovL2dpdGh1Yi5jb20vb3Blbmpkay9qZGsvcHVsbC8xOTcw
NSNpc3N1ZWNvbW1lbnQtMjE2ODQ5NzUwNTxicj4mZ3Q7ICZsdDtodHRwczovL3VybGRlZmVuc2Uu
Y29tL3YzL19faHR0cHM6Ly9naXRodWIuY29tL29wZW5qZGsvamRrL3B1bGwvMTk3MDUqaXNzdWVj
b21tZW50LTIxNjg0OTc1MDVfXztJdyEhQUNXVjVOOU0yUlY5OWhRIUlQVEp0TWNnZDA2TUxGeFZP
d1B5Y0RyNjNmcEhJQUJUcm5vOEdvTnl3dWV2N1ctR3liU250V0stSm54UjZBeGZxa0FtMnlwOHc3
OUJZVW9la2kxMmZCcGtIaDNHWFEkJmd0Ozxicj4mZ3Q7PGJyPiZndDs8YnI+Jmd0OyA8YnI+PC9z
cGFuPk1hdXJpemlvPGJyPjxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IGRpc3Bs
YXk6IGJsb2NrOyB3aWR0aDogOTh2dzsiPiZndDsgPGJyPiZndDsgPGJyPiZndDsgPGJyPiZndDsg
LS0gQXJjaGllIEwuIENvYmJzPC9zcGFuPjxicj4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;">​</div>
    </div>
  </body>
</html>