<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title></title>
    
  </head>
  <body>
    <div class="markdown-here-wrapper">
      <p style="margin-bottom: 19.2px; margin-top: 0px;">Yes, please!</p>
      <p style="margin-bottom: 19.2px; margin-top: 0px;">Thanks<br>
        Maurizio</p>
      <p style="margin-bottom: 19.2px; margin-top: 0px;">On 09/10/2025
        10:18, Tagir Valeev wrote:</p>
      <blockquote type="cite" style="border-block-color: rgb(119, 119, 119); border-bottom-color: rgb(119, 119, 119); border-inline-color: rgb(114, 159, 207) rgb(119, 119, 119); border-inline-start: 2px solid rgb(114, 159, 207); border-left: 2px solid rgb(114, 159, 207); border-right-color: rgb(119, 119, 119); border-top-color: rgb(119, 119, 119); color: rgb(119, 119, 119); column-rule-color: rgb(119, 119, 119); margin: 19.2px 0px; outline-color: rgb(119, 119, 119); padding-inline: 16px; padding-left: 16px; padding-right: 16px; quotes: none; text-decoration-color: rgb(119, 119, 119); text-emphasis-color: rgb(119, 119, 119);">
        <div class="external-content" id="extcontent-0" style="border-block-color: rgb(119, 119, 119); border-bottom-color: rgb(119, 119, 119); border-inline-color: rgb(119, 119, 119); border-left-color: rgb(119, 119, 119); border-right-color: rgb(119, 119, 119); border-top-color: rgb(119, 119, 119); color: rgb(119, 119, 119); column-rule-color: rgb(119, 119, 119); outline-color: rgb(119, 119, 119); quotes: none; text-decoration-color: rgb(119, 119, 119); text-emphasis-color: rgb(119, 119, 119);">
          <div dir="ltr">Hello, Maurizio!
            <div><br>
            </div>
            <div>Thank you for clarifying this. Should I file an issue?</div>
            <div><br>
            </div>
            <div>With best regards,</div>
            <div>Tagir Valeev</div>
          </div>
          <br>
          <div class="gmail_quote gmail_quote_container">
            <div dir="ltr" class="gmail_attr">On Thu, Oct 9, 2025 at
              11:00 AM Maurizio Cimadamore <<a href="mailto:maurizio.cimadamore@oracle.com" class="moz-txt-link-freetext">maurizio.cimadamore@oracle.com</a>>
              wrote:<br>
            </div>
            <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
              <div>
                <p>Hi Tagir!</p>
                <p>Nice cacth.</p>
                <p>Here's a slightly different example which reveals a
                  bit more of what's happening:</p>
                <p>```<br>
                  interface Main {<br>
                      interface X<T> {<br>
                          X<T> self();<br>
                      }<br>
                  <br>
                      static X<?> makeX() {return null;}<br>
                  <br>
                      static <R> X<R> create(Supplier<?
                  extends R> supplier) {return null;}<br>
                  <br>
                      static X<X<?>> methodRef() {<br>
                          var s = (String)create(Main::makeX);<br>
                      }<br>
                  <br>
                      static X<X<?>> lambda() {<br>
                          var s = (String)create(() -> makeX());<br>
                      }<br>
                  }<br>
                  ```</p>
                <p>This prints:</p>
                <p>```<br>
                  error: incompatible types: X<X<?>> cannot
                  be converted to String<br>
                          var s = (String)create(Main::makeX);<br>
                                                ^<br>
                  error: incompatible types: X<X<CAP#1>>
                  cannot be converted to String<br>
                          var s = (String)create(() -> makeX());<br>
                                                ^<br>
                    where CAP#1 is a fresh type-variable:<br>
                      CAP#1 extends Object from capture of ?<br>
                  ```</p>
                <p>So, the main difference between the two examples is
                  that in the lambda case, the return type of the makeX
                  call is captured. But in the method refreene case no
                  capture occurs.</p>
                <p>I believe the lambda case works as expected, but the
                  method reference case does not.</p>
                <p>The JLS mandates a capture of the resolved method
                  return type (JLS 15.13.2, emphasis mine):</p>
                <p> </p>
                <blockquote type="cite">A method reference expression is
                  <span><em>congruent</em></span> with a function type
                  if both of the following are true:
                  <div>
                    <ul style="list-style-type:disc">
                      <li>
                        <p>The function type identifies a single
                          compile-time declaration corresponding to the
                          reference. </p>
                      </li>
                      <li>
                        <p> One of the following is true: </p>
                        <div>
                          <ul style="list-style-type:circle">
                            <li>
                              <p>The result of the function type is <code>void</code>.
                              </p>
                            </li>
                            <li>
                              <p> The result of the function type is <span>R</span>,
                                <b>and the result of applying capture
                                  conversion (<a href="https://docs.oracle.com/javase/specs/jls/se25/html/jls-5.html#jls-5.1.10" title="5.1.10. Capture Conversion">§5.1.10</a>)
                                  to the return type of the invocation
                                  type (<a href="https://docs.oracle.com/javase/specs/jls/se25/html/jls-15.html#jls-15.12.2.6" title="15.12.2.6. Method Invocation Type">§15.12.2.6</a>) of the chosen
                                  compile-time declaration is <span>R</span>'</b>
                                (where <span>R</span> is the target
                                type that may be used to infer <span>R</span>'),
                                and neither <span>R</span> nor <span>R</span>'
                                is <code>void</code>, and <span>R</span>'
                                is compatible with <span>R</span> in an
                                assignment context. </p>
                            </li>
                          </ul>
                        </div>
                      </li>
                    </ul>
                  </div>
                </blockquote>
                <p>It seems like javac is missing this capture
                  conversion and, because of that, the behavior of the
                  two examples diverge.</p>
                <p>Cheers<br>
                  Maurizio<br>
                </p>
                <p><br>
                </p>
                <p><br>
                </p>
                <p><br>
                </p>
                <p><br>
                </p>
                <div>On 07/10/2025 17:12, Tagir Valeev wrote:<br>
                </div>
                <blockquote type="cite">
                  <div dir="ltr">Hello!
                    <div><br>
                    </div>
                    <div>I'm investigating a seemingly weird compilation
                      case. Consider the following Java interface:</div>
                    <div><br>
                    </div>
                    <div>import java.util.function.Supplier;<br>
                      <br>
                      interface Main {<br>
                          interface X<T> {<br>
                              X<T> self();<br>
                          }<br>
                      <br>
                          static X<?> makeX() {return null;}<br>
                      <br>
                          static <R> X<R>
                      create(Supplier<? extends R> supplier)
                      {return null;}<br>
                       <br>
                          static X<X<?>> methodRef() {<br>
                              return create(Main::makeX).self();<br>
                          }<br>
                      <br>
                          static X<X<?>> lambda() {<br>
                              return create(() -> makeX()).self();<br>
                          }<br>
                      }</div>
                    <div><br>
                    </div>
                    <div>I expect that either both methods 'methodRef'
                      and 'lambda' should be compilable or both should
                      be non-compilable. However, while 'methodRef'
                      compiles, 'lambda' is rejected by compiler (using
                      javac build 25+36-3489):</div>
                    <div><br>
                      Main.java:17: error: incompatible types:
                      X<X<CAP#1>> cannot be converted to
                      X<X<?>><br>
                              return create(() -> makeX()).self();<br>
                                                               ^<br>
                        where CAP#1 is a fresh type-variable:<br>
                          CAP#1 extends Object from capture of ?<br>
                      1 error<br>
                      error: compilation failed</div>
                    <div><br>
                    </div>
                    <div>Could you please help me and clarify whether
                      this is an expected behavior or not?</div>
                    <div><br>
                    </div>
                    <div>With best regards,</div>
                    <div>Tagir Valeev</div>
                  </div>
                </blockquote>
              </div>
            </blockquote>
          </div>
        </div>
      </blockquote>
    </div>
    <div class="mdhr-raw" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0;padding:0;margin:0;" aria-hidden="true" title="MDH:PHA+WWVzLCBwbGVhc2UhPC9wPjxwPlRoYW5rczxicj5NYXVyaXppbzxicj48L3A+PGRpdiBjbGFzcz0ibW96LWNpdGUtcHJlZml4Ij5PbiAwOS8xMC8yMDI1IDEwOjE4LCBUYWdpciBWYWxlZXYgd3JvdGU6PGJyPjwvZGl2PjxibG9ja3F1b3RlIHR5cGU9ImNpdGUiIGNpdGU9Im1pZDpDQUUrM2ZqWmd5dy1odHdFcnQ5Q3B6c1U0YkRMMzdfY3BFN25XNUF1XzIwMUtxOTJpN1FAbWFpbC5nbWFpbC5jb20iPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyAiPjxkaXYgZGlyPSJsdHIiPkhlbGxvLCZuYnNwO01hdXJpemlvITxkaXY+PGJyPjwvZGl2PjxkaXY+VGhhbmsgeW91IGZvciBjbGFyaWZ5aW5nIHRoaXMuIFNob3VsZCBJIGZpbGUgYW4gaXNzdWU/PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5XaXRoIGJlc3QgcmVnYXJkcyw8L2Rpdj48ZGl2PlRhZ2lyIFZhbGVldjwvZGl2PjwvZGl2Pjxicj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSBnbWFpbF9xdW90ZV9jb250YWluZXIiPjxkaXYgZGlyPSJsdHIiIGNsYXNzPSJnbWFpbF9hdHRyIj5PbiBUaHUsIE9jdCA5LCAyMDI1IGF0IDExOjAw4oCvQU0gTWF1cml6aW8gQ2ltYWRhbW9yZSAmbHQ7PGEgaHJlZj0ibWFpbHRvOm1hdXJpemlvLmNpbWFkYW1vcmVAb3JhY2xlLmNvbSIgbW96LWRvLW5vdC1zZW5kPSJ0cnVlIj5tYXVyaXppby5jaW1hZGFtb3JlQG9yYWNsZS5jb208L2E+Jmd0OyB3cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjBweCAwcHggMHB4IDAuOGV4O2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2IoMjA0LDIwNCwyMDQpO3BhZGRpbmctbGVmdDoxZXgiPgoKICAKICA8ZGl2PgogICAgPHA+SGkgVGFnaXIhPC9wPgogICAgPHA+TmljZSBjYWN0aC48L3A+CiAgICA8cD5IZXJlJ3MgYSBzbGlnaHRseSBkaWZmZXJlbnQgZXhhbXBsZSB3aGljaCByZXZlYWxzIGEgYml0IG1vcmUgb2YKICAgICAgd2hhdCdzIGhhcHBlbmluZzo8L3A+CiAgICA8cD5gYGA8YnI+CiAgICAgIGludGVyZmFjZSBNYWluIHs8YnI+CiAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyBpbnRlcmZhY2UgWCZsdDtUJmd0OyB7PGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgWCZsdDtUJmd0OyBzZWxmKCk7PGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgfTxicj4KICAgICAgPGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgc3RhdGljIFgmbHQ7PyZndDsgbWFrZVgoKSB7cmV0dXJuIG51bGw7fTxicj4KICAgICAgPGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgc3RhdGljICZsdDtSJmd0OyBYJmx0O1ImZ3Q7IGNyZWF0ZShTdXBwbGllciZsdDs/IGV4dGVuZHMgUiZndDsKICAgICAgc3VwcGxpZXIpIHtyZXR1cm4gbnVsbDt9PGJyPgogICAgICA8YnI+CiAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyBzdGF0aWMgWCZsdDtYJmx0Oz8mZ3Q7Jmd0OyBtZXRob2RSZWYoKSB7PGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgdmFyIHMgPSAoU3RyaW5nKWNyZWF0ZShNYWluOjptYWtlWCk7PGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgfTxicj4KICAgICAgPGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgc3RhdGljIFgmbHQ7WCZsdDs/Jmd0OyZndDsgbGFtYmRhKCkgezxicj4KICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHZhciBzID0gKFN0cmluZyljcmVhdGUoKCkgLSZndDsgbWFrZVgoKSk7PGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgfTxicj4KICAgICAgfTxicj4KICAgICAgYGBgPC9wPgogICAgPHA+VGhpcyBwcmludHM6PC9wPgogICAgPHA+YGBgPGJyPgogICAgICBlcnJvcjogaW5jb21wYXRpYmxlIHR5cGVzOiBYJmx0O1gmbHQ7PyZndDsmZ3Q7IGNhbm5vdCBiZSBjb252ZXJ0ZWQKICAgICAgdG8gU3RyaW5nPGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgdmFyIHMgPSAoU3RyaW5nKWNyZWF0ZShNYWluOjptYWtlWCk7PGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgXjxicj4KICAgICAgZXJyb3I6IGluY29tcGF0aWJsZSB0eXBlczogWCZsdDtYJmx0O0NBUCMxJmd0OyZndDsgY2Fubm90IGJlCiAgICAgIGNvbnZlcnRlZCB0byBTdHJpbmc8YnI+CiAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB2YXIgcyA9IChTdHJpbmcpY3JlYXRlKCgpIC0mZ3Q7IG1ha2VYKCkpOzxicj4KICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IF48YnI+CiAgICAgICZuYnNwOyB3aGVyZSBDQVAjMSBpcyBhIGZyZXNoIHR5cGUtdmFyaWFibGU6PGJyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgQ0FQIzEgZXh0ZW5kcyBPYmplY3QgZnJvbSBjYXB0dXJlIG9mID88YnI+CiAgICAgIGBgYDwvcD4KICAgIDxwPlNvLCB0aGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBleGFtcGxlcyBpcyB0aGF0IGluIHRoZQogICAgICBsYW1iZGEgY2FzZSwgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtYWtlWCBjYWxsIGlzIGNhcHR1cmVkLiBCdXQgaW4KICAgICAgdGhlIG1ldGhvZCByZWZyZWVuZSBjYXNlIG5vIGNhcHR1cmUgb2NjdXJzLjwvcD4KICAgIDxwPkkgYmVsaWV2ZSB0aGUgbGFtYmRhIGNhc2Ugd29ya3MgYXMgZXhwZWN0ZWQsIGJ1dCB0aGUgbWV0aG9kCiAgICAgIHJlZmVyZW5jZSBjYXNlIGRvZXMgbm90LjwvcD4KICAgIDxwPlRoZSBKTFMgbWFuZGF0ZXMgYSBjYXB0dXJlIG9mIHRoZSByZXNvbHZlZCBtZXRob2QgcmV0dXJuIHR5cGUKICAgICAgKEpMUyAxNS4xMy4yLCBlbXBoYXNpcyBtaW5lKTo8L3A+CiAgICA8cD4KICAgICAgPC9wPjxibG9ja3F1b3RlIHR5cGU9ImNpdGUiPkEgbWV0aG9kIHJlZmVyZW5jZSBleHByZXNzaW9uIGlzIDxzcGFuPjxlbT5jb25ncnVlbnQ8L2VtPjwvc3Bhbj4gd2l0aCBhIGZ1bmN0aW9uCiAgICAgICAgdHlwZSBpZiBib3RoIG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWU6CiAgICAgICAgPGRpdj4KICAgICAgICAgIDx1bCBzdHlsZT0ibGlzdC1zdHlsZS10eXBlOmRpc2MiPgogICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgPHA+VGhlIGZ1bmN0aW9uIHR5cGUgaWRlbnRpZmllcyBhCiAgICAgICAgICAgICAgICBzaW5nbGUgY29tcGlsZS10aW1lIGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlCiAgICAgICAgICAgICAgICByZWZlcmVuY2UuIDwvcD4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgIDxwPiZuYnNwO09uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IDwvcD4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPHVsIHN0eWxlPSJsaXN0LXN0eWxlLXR5cGU6Y2lyY2xlIj4KICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgIDxwPlRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgICAgICB0eXBlIGlzIDxjb2RlPnZvaWQ8L2NvZGU+LiA8L3A+CiAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICA8cD4mbmJzcDtUaGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgICAgdHlwZSBpcyA8c3Bhbj5SPC9zcGFuPiwgPGI+YW5kIHRoZQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgb2YgYXBwbHlpbmcgY2FwdHVyZSBjb252ZXJzaW9uICg8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2Uvc3BlY3MvamxzL3NlMjUvaHRtbC9qbHMtNS5odG1sI2pscy01LjEuMTAiIHRpdGxlPSI1LjEuMTAuJm5ic3A7Q2FwdHVyZSBDb252ZXJzaW9uIiB0YXJnZXQ9Il9ibGFuayIgbW96LWRvLW5vdC1zZW5kPSJ0cnVlIj7CpzUuMS4xMDwvYT4pCiAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgaW52b2NhdGlvbiB0eXBlICg8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2Uvc3BlY3MvamxzL3NlMjUvaHRtbC9qbHMtMTUuaHRtbCNqbHMtMTUuMTIuMi42IiB0aXRsZT0iMTUuMTIuMi42LiZuYnNwO01ldGhvZCBJbnZvY2F0aW9uIFR5cGUiIHRhcmdldD0iX2JsYW5rIiBtb3otZG8tbm90LXNlbmQ9InRydWUiPsKnMTUuMTIuMi42PC9hPikKICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGNob3NlbiBjb21waWxlLXRpbWUgZGVjbGFyYXRpb24gaXMgPHNwYW4+Ujwvc3Bhbj4nPC9iPiAod2hlcmUgPHNwYW4+Ujwvc3Bhbj4gaXMgdGhlIHRhcmdldCB0eXBlIHRoYXQKICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSB1c2VkIHRvIGluZmVyIDxzcGFuPlI8L3NwYW4+JyksCiAgICAgICAgICAgICAgICAgICAgICBhbmQgbmVpdGhlciA8c3Bhbj5SPC9zcGFuPiBub3IgPHNwYW4+Ujwvc3Bhbj4nIGlzIDxjb2RlPnZvaWQ8L2NvZGU+LAogICAgICAgICAgICAgICAgICAgICAgYW5kIDxzcGFuPlI8L3NwYW4+JyBpcyBjb21wYXRpYmxlCiAgICAgICAgICAgICAgICAgICAgICB3aXRoIDxzcGFuPlI8L3NwYW4+IGluIGFuIGFzc2lnbm1lbnQKICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuIDwvcD4KICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICA8L3VsPgogICAgICAgIDwvZGl2PgogICAgICA8L2Jsb2NrcXVvdGU+CiAgICAKICAgIDxwPkl0IHNlZW1zIGxpa2UgamF2YWMgaXMgbWlzc2luZyB0aGlzIGNhcHR1cmUgY29udmVyc2lvbiBhbmQsCiAgICAgIGJlY2F1c2Ugb2YgdGhhdCwgdGhlIGJlaGF2aW9yIG9mIHRoZSB0d28gZXhhbXBsZXMgZGl2ZXJnZS48L3A+CiAgICA8cD5DaGVlcnM8YnI+CiAgICAgIE1hdXJpemlvPGJyPgogICAgPC9wPgogICAgPHA+PGJyPgogICAgPC9wPgogICAgPHA+PGJyPgogICAgPC9wPgogICAgPHA+PGJyPgogICAgPC9wPgogICAgPHA+PGJyPgogICAgPC9wPgogICAgPGRpdj5PbiAwNy8xMC8yMDI1IDE3OjEyLCBUYWdpciBWYWxlZXYKICAgICAgd3JvdGU6PGJyPgogICAgPC9kaXY+CiAgICA8YmxvY2txdW90ZSB0eXBlPSJjaXRlIj4KICAgICAgCiAgICAgIDxkaXYgZGlyPSJsdHIiPkhlbGxvIQogICAgICAgIDxkaXY+PGJyPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXY+SSdtIGludmVzdGlnYXRpbmcgYSBzZWVtaW5nbHkgd2VpcmQgY29tcGlsYXRpb24gY2FzZS4KICAgICAgICAgIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgSmF2YSBpbnRlcmZhY2U6PC9kaXY+CiAgICAgICAgPGRpdj48YnI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdj5pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOzxicj4KICAgICAgICAgIDxicj4KICAgICAgICAgIGludGVyZmFjZSBNYWluIHs8YnI+CiAgICAgICAgICAmbmJzcDsgJm5ic3A7IGludGVyZmFjZSBYJmx0O1QmZ3Q7IHs8YnI+CiAgICAgICAgICAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgWCZsdDtUJmd0OyBzZWxmKCk7PGJyPgogICAgICAgICAgJm5ic3A7ICZuYnNwOyB9PGJyPgogICAgICAgICAgPGJyPgogICAgICAgICAgJm5ic3A7ICZuYnNwOyBzdGF0aWMgWCZsdDs/Jmd0OyBtYWtlWCgpIHtyZXR1cm4gbnVsbDt9PGJyPgogICAgICAgICAgPGJyPgogICAgICAgICAgJm5ic3A7ICZuYnNwOyBzdGF0aWMgJmx0O1ImZ3Q7IFgmbHQ7UiZndDsgY3JlYXRlKFN1cHBsaWVyJmx0Oz8gZXh0ZW5kcwogICAgICAgICAgUiZndDsgc3VwcGxpZXIpIHtyZXR1cm4gbnVsbDt9PGJyPgogICAgICAgICAgJm5ic3A7PGJyPgogICAgICAgICAgJm5ic3A7ICZuYnNwOyBzdGF0aWMgWCZsdDtYJmx0Oz8mZ3Q7Jmd0OyBtZXRob2RSZWYoKSB7PGJyPgogICAgICAgICAgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IHJldHVybiBjcmVhdGUoTWFpbjo6bWFrZVgpLnNlbGYoKTs8YnI+CiAgICAgICAgICAmbmJzcDsgJm5ic3A7IH08YnI+CiAgICAgICAgICA8YnI+CiAgICAgICAgICAmbmJzcDsgJm5ic3A7IHN0YXRpYyBYJmx0O1gmbHQ7PyZndDsmZ3Q7IGxhbWJkYSgpIHs8YnI+CiAgICAgICAgICAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgcmV0dXJuIGNyZWF0ZSgoKSAtJmd0OyBtYWtlWCgpKS5zZWxmKCk7PGJyPgogICAgICAgICAgJm5ic3A7ICZuYnNwOyB9PGJyPgogICAgICAgICAgfTwvZGl2PgogICAgICAgIDxkaXY+PGJyPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXY+SSBleHBlY3QgdGhhdCBlaXRoZXIgYm90aCBtZXRob2RzICdtZXRob2RSZWYnIGFuZCAnbGFtYmRhJwogICAgICAgICAgc2hvdWxkIGJlIGNvbXBpbGFibGUgb3IgYm90aCBzaG91bGQgYmUgbm9uLWNvbXBpbGFibGUuCiAgICAgICAgICBIb3dldmVyLCB3aGlsZSAnbWV0aG9kUmVmJyBjb21waWxlcywgJ2xhbWJkYScgaXMgcmVqZWN0ZWQgYnkKICAgICAgICAgIGNvbXBpbGVyICh1c2luZyBqYXZhYyZuYnNwO2J1aWxkIDI1KzM2LTM0ODkpOjwvZGl2PgogICAgICAgIDxkaXY+PGJyPgogICAgICAgICAgTWFpbi5qYXZhOjE3OiBlcnJvcjogaW5jb21wYXRpYmxlIHR5cGVzOgogICAgICAgICAgWCZsdDtYJmx0O0NBUCMxJmd0OyZndDsgY2Fubm90IGJlIGNvbnZlcnRlZCB0bwogICAgICAgICAgWCZsdDtYJmx0Oz8mZ3Q7Jmd0Ozxicj4KICAgICAgICAgICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyByZXR1cm4gY3JlYXRlKCgpIC0mZ3Q7IG1ha2VYKCkpLnNlbGYoKTs8YnI+CiAgICAgICAgICAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO148YnI+CiAgICAgICAgICAmbmJzcDsgd2hlcmUgQ0FQIzEgaXMgYSBmcmVzaCB0eXBlLXZhcmlhYmxlOjxicj4KICAgICAgICAgICZuYnNwOyAmbmJzcDsgQ0FQIzEgZXh0ZW5kcyBPYmplY3QgZnJvbSBjYXB0dXJlIG9mID88YnI+CiAgICAgICAgICAxIGVycm9yPGJyPgogICAgICAgICAgZXJyb3I6IGNvbXBpbGF0aW9uIGZhaWxlZDwvZGl2PgogICAgICAgIDxkaXY+PGJyPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXY+Q291bGQgeW91IHBsZWFzZSBoZWxwIG1lIGFuZCBjbGFyaWZ5IHdoZXRoZXIgdGhpcyBpcyBhbgogICAgICAgICAgZXhwZWN0ZWQgYmVoYXZpb3Igb3Igbm90PzwvZGl2PgogICAgICAgIDxkaXY+PGJyPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXY+V2l0aCBiZXN0IHJlZ2FyZHMsPC9kaXY+CiAgICAgICAgPGRpdj5UYWdpciBWYWxlZXY8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Jsb2NrcXVvdGU+CiAgPC9kaXY+Cgo8L2Jsb2NrcXVvdGU+PC9kaXY+Cgo8L2Jsb2NrcXVvdGU+PHVsIGNsYXNzPSJkcm9wZG93bi1tZW51IHRleHRjb21wbGV0ZS1kcm9wZG93biIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgei1pbmRleDogMTAwMDsiIGNvbnRlbnRlZGl0YWJsZT0iZmFsc2UiIHBvcG92ZXI9ImF1dG8iPjwvdWw+">&#8203;</div>
  </body>
</html>