<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
very interesting issue, I agree that the compiler could do better
here, this needs more research, I have been taking a look at the
compiler internals, it could be that a structural type comparison
could be needed here. In the mean time I have filed [1]<br>
<br>
Thanks,<br>
Vicente<br>
<br>
[1] <a class="moz-txt-link-freetext" href="https://bugs.openjdk.org/browse/JDK-8315134">https://bugs.openjdk.org/browse/JDK-8315134</a><br>
<br>
<div class="moz-cite-prefix">On 8/28/23 06:59, Maurizio Cimadamore
wrote:<br>
</div>
<blockquote type="cite" cite="mid:0a9ab434-4874-a13f-bd49-715930b87155@oracle.com">
<div class="markdown-here-wrapper" data-md-url="" style="">
<p style="margin: 0px 0px 1.2em !important;">This does seem like
an issue.</p>
<p style="margin: 0px 0px 1.2em !important;">Note that similar
code, w/o a method call works:</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;">List<List<? super T1>> res = Arrays.asList(args);
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">I did some manual
calculation of the bounds involved and I got to:</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;">List<? super T1> <: #A = List<? super #T2>
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">Which seems
solvable for:</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;">A = List<? super T2>
T2 = T1
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">But the javac error
message reveals a capture conversion is being applied
somewhere:</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;">error: method listMethod in class Test cannot be applied to given types;
List<List<? super T2>> res = listMethod(Arrays.asList(args));
^
required: List<List<? super T2>>
found: List<List<? super T1>>
reason: inference variable T has incompatible bounds
equality constraints: List<? super CAP#1> // <--------------------------
lower bounds: List<? super T1>
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">Which seems odd - I
would have understod if javac tried to capture “args” before
passing to Arrays::asList - but that’s not what is happening
here.</p>
<p style="margin: 0px 0px 1.2em !important;">My feeling
(confirmed by looking at the internals of the compiler) is
that javac is applying incorporation to the above set of
bounds - and running the following check:</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;">List<? super T1> <: List<? super #T2>
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">The JLS here says
that when running the this incorporation step, since both
types are <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 X</code>
wildcards we should just derive:</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;">#T2 <: T1
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">(e.g. no capture
conversion applied).</p>
<p style="margin: 0px 0px 1.2em !important;">But that’s not what
happens in the compiler implementation (which does a straight
subtyping check with capture conversion), hence the issue.</p>
<p style="margin: 0px 0px 1.2em !important;">Maurizio</p>
<p style="margin: 0px 0px 1.2em !important;">On 27/08/2023
15:06, Attila Kelemen wrote:</p>
<div class="markdown-here-exclude">
<blockquote type="cite" cite="mid:CAKDaPBeQY=EWaCE2Cr_4+jEtOaGUmjW5cHG58x9qUzAq68QPDg@mail.gmail.com">
<div dir="ltr">
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px
0px 0.8ex;border-left:1px solid
rgb(204,204,204);padding-left:1ex">
<div style="font-family:arial,helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)">
<div><br>
</div>
<div>In case of a capture, the inference does not
try to replace the capture by its bound. It's a
limitation of the inference which tend to choose
the most speciifc type where here, it has to use a
less specific type.</div>
<div><br>
</div>
</div>
</blockquote>
<div><br>
</div>
<div>
<div>I don't quite understand the step by step
"reasoning" of the type inferer here, because
naively this is what I would do if I was employed as
a full time type inferer :). (I'm copying here my
code again with some variable renaming for easier
reference) Suppose I'm a compiler, and I see this:</div>
<div><br>
</div>
<div>```</div>
<div><T1> void arrayMethod(List<? super
T1>[] args) {<br>
listMethod(Arrays.asList(args));<br>
}<br>
<T2> void listMethod(List<List<? super
T2>> list) { }<br>
</div>
<div>```</div>
<div><br>
</div>
<div>1. I look at `arrayMethod` and see 2 type
variables to infer. One for `listMethod` (let's call
it #L), and one for `Arrays.asList` (let's call it
#A).</div>
<div>2. The first thing I see is that `Arrays.asList`
returns `List<#A>`, and it is assigned to
`List<List<? super #L>>`. This is easy
to satisfy with #A = List<? super #L> (and
this is actually the only possibility).</div>
<div>3. Then I go the next part, and see that args is
of course `List<? super T1>[]` which must be
assigned to `#A[]`, which is again easy to satisfy
with #A = List<? super T1> (which is the only
possibility again).</div>
<div>4. So, now I have to satisfy all equalities `#A =
List<? super #L>` and `#A = List<? super
T1>`, which implies that `List<? super #L>
= List<? super T1>`, which is easy to satisfy
by the choice #L = T1 (again, this is the only
choice).</div>
<div>5. So, now I have resolved both variables:` #L =
T1`, and `#A = List<? super T1>`, and indeed I
can validate that this choice will satisfy every
constraint.</div>
<div><br>
</div>
<div>I'm just puzzled here, because sometimes the type
inferer can solve much more difficult problems, and
this seems trivial compared to those.</div>
</div>
<div><br>
</div>
<div> </div>
<blockquote class="gmail_quote" style="margin:0px 0px
0px 0.8ex;border-left:1px solid
rgb(204,204,204);padding-left:1ex">
<div style="font-family:arial,helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)">
<div>My bad, I should have written List<? super
List<? super T>>.<br>
</div>
<div><br>
</div>
</div>
</blockquote>
<div><br>
</div>
<div>Surprisingly (to me), that would compile without
explicitly specifying the type arguments (though of
course that is not a type declaration that is
acceptable for me). What surprises me here is that I
would think that this would make the job of the type
inferer harder, since now it is more difficult to find
the correct types, since there are more options.
Without the outer "? super" the inferer would be
forced to make the correct type assignment (since
there is always only one possibility). That is, when
you write `List<? super List<? super T>`, now
you get another fresh type variable to satisfy.
Namely, you have to pick a type of `? super List<?
super T>`. While in the other case your only option
for this was `List<? super T>` (which is the
only correct choice even in the `? super` variant.</div>
</div>
</div>
</blockquote>
</div>
<div title="MDH:PHA+VGhpcyBkb2VzIHNlZW0gbGlrZSBhbiBpc3N1ZS48L3A+PHA+Tm90ZSB0aGF0IHNpbWlsYXIgY29kZSwgdy9vIGEgbWV0aG9kIGNhbGwgd29ya3M6PC9wPjxwPmBgYDxicj5MaXN0Jmx0O0xpc3QmbHQ7PyBzdXBlciBUMSZndDsmZ3Q7IHJlcyA9IEFycmF5cy5hc0xpc3QoYXJncyk7PGJyPmBgYDxi
cj48L3A+PHA+SSBkaWQgc29tZSBtYW51YWwgY2FsY3VsYXRpb24gb2YgdGhlIGJvdW5kcyBpbnZv
bHZlZCBhbmQgSSBnb3QgdG86PC9wPjxwPmBgYDxicj5MaXN0Jmx0Oz8gc3VwZXIgVDEmZ3Q7ICZs
dDs6ICNBID0gTGlzdCZsdDs/IHN1cGVyICNUMiZndDs8YnI+YGBgPGJyPjwvcD48cD5XaGljaCBz
ZWVtcyBzb2x2YWJsZSBmb3I6PGJyPjxicj5gYGA8YnI+QSA9IExpc3QmbHQ7PyBzdXBlciBUMiZn
dDs8YnI+VDIgPSBUMTxicj5gYGA8YnI+PC9wPjxwPkJ1dCB0aGUgamF2YWMgZXJyb3IgbWVzc2Fn
ZSByZXZlYWxzIGEgY2FwdHVyZSBjb252ZXJzaW9uIGlzIGJlaW5nIGFwcGxpZWQgc29tZXdoZXJl
OjwvcD48cD5gYGA8YnI+ZXJyb3I6IG1ldGhvZCBsaXN0TWV0aG9kIGluIGNsYXNzIFRlc3QgY2Fu
bm90IGJlIGFwcGxpZWQgdG8gZ2l2ZW4gdHlwZXM7PGJyPkxpc3QmbHQ7TGlzdCZsdDs/IHN1cGVy
IFQyJmd0OyZndDsgcmVzID0gbGlzdE1ldGhvZChBcnJheXMuYXNMaXN0KGFyZ3MpKTs8YnI+Jm5i
c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IF48YnI+
Jm5ic3A7IHJlcXVpcmVkOiBMaXN0Jmx0O0xpc3QmbHQ7PyBzdXBlciBUMiZndDsmZ3Q7PGJyPiZu
YnNwOyBmb3VuZDogTGlzdCZsdDtMaXN0Jmx0Oz8gc3VwZXIgVDEmZ3Q7Jmd0Ozxicj4mbmJzcDsg
cmVhc29uOiBpbmZlcmVuY2UgdmFyaWFibGUgVCBoYXMgaW5jb21wYXRpYmxlIGJvdW5kczxicj4m
bmJzcDsmbmJzcDsmbmJzcDsgZXF1YWxpdHkgY29uc3RyYWludHM6IExpc3QmbHQ7PyBzdXBlciBD
QVAjMSZndDsgLy8gJmx0Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJyPiZuYnNwOyZuYnNw
OyZuYnNwOyBsb3dlciBib3VuZHM6IExpc3QmbHQ7PyBzdXBlciBUMSZndDs8YnI+YGBgPGJyPjwv
cD48cD5XaGljaCBzZWVtcyBvZGQgLSBJIHdvdWxkIGhhdmUgdW5kZXJzdG9kIGlmIGphdmFjIHRy
aWVkIHRvIGNhcHR1cmUgImFyZ3MiIGJlZm9yZSBwYXNzaW5nIHRvIEFycmF5czo6YXNMaXN0IC0g
YnV0IHRoYXQncyBub3Qgd2hhdCBpcyBoYXBwZW5pbmcgaGVyZS48L3A+PHA+TXkgZmVlbGluZyAo
Y29uZmlybWVkIGJ5IGxvb2tpbmcgYXQgdGhlIGludGVybmFscyBvZiB0aGUgY29tcGlsZXIpIGlz
IHRoYXQgamF2YWMgaXMgYXBwbHlpbmcgaW5jb3Jwb3JhdGlvbiB0byB0aGUgYWJvdmUgc2V0IG9m
IGJvdW5kcyAtIGFuZCBydW5uaW5nIHRoZSBmb2xsb3dpbmcgY2hlY2s6PC9wPjxwPmBgYDxicj5M
aXN0Jmx0Oz8gc3VwZXIgVDEmZ3Q7ICZsdDs6IExpc3QmbHQ7PyBzdXBlciAjVDImZ3Q7PGJyPmBg
YDxicj48L3A+PHA+VGhlIEpMUyBoZXJlIHNheXMgdGhhdCB3aGVuIHJ1bm5pbmcgdGhlIHRoaXMg
aW5jb3Jwb3JhdGlvbiBzdGVwLCBzaW5jZSBib3RoIHR5cGVzIGFyZSBgPyBzdXBlciBYYCB3aWxk
Y2FyZHMgd2Ugc2hvdWxkIGp1c3QgZGVyaXZlOjwvcD48cD5gYGA8YnI+I1QyICZsdDs6IFQxPGJy
PmBgYDxicj48L3A+PHA+KGUuZy4gbm8gY2FwdHVyZSBjb252ZXJzaW9uIGFwcGxpZWQpLjwvcD48
cD5CdXQgdGhhdCdzIG5vdCB3aGF0IGhhcHBlbnMgaW4gdGhlIGNvbXBpbGVyIGltcGxlbWVudGF0
aW9uICh3aGljaCBkb2VzIGEgc3RyYWlnaHQgc3VidHlwaW5nIGNoZWNrIHdpdGggY2FwdHVyZSBj
b252ZXJzaW9uKSwgaGVuY2UgdGhlIGlzc3VlLjwvcD48cD5NYXVyaXppbzxicj48L3A+PHA+PGJy
PjwvcD48cD5PbiAyNy8wOC8yMDIzIDE1OjA2LCBBdHRpbGEgS2VsZW1lbiB3cm90ZTo8L3A+PGJs
b2NrcXVvdGUgdHlwZT0iY2l0ZSIgY2l0ZT0ibWlkOkNBS0RhUEJlUVk9RVdhQ0UyQ3JfNCtqRXRP
YUdVbWpXNWNIRzU4eDlxVXpBcTY4UVBEZ0BtYWlsLmdtYWlsLmNvbSI+PG1ldGEgaHR0cC1lcXVp
dj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7ICI+PGRpdiBkaXI9Imx0ciI+PGRp
diBjbGFzcz0iZ21haWxfcXVvdGUiPjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5
bGU9Im1hcmdpbjowcHggMHB4IDBweCAwLjhleDtib3JkZXItbGVmdDoxcHggc29saWQgcmdiKDIw
NCwyMDQsMjA0KTtwYWRkaW5nLWxlZnQ6MWV4Ij48ZGl2IHN0eWxlPSJmb250LWZhbWlseTphcmlh
bCxoZWx2ZXRpY2Esc2Fucy1zZXJpZjtmb250LXNpemU6MTJwdDtjb2xvcjpyZ2IoMCwwLDApIj48
ZGl2Pjxicj48L2Rpdj48ZGl2PkluIGNhc2Ugb2YgYSBjYXB0dXJlLCB0aGUgaW5mZXJlbmNlIGRv
ZXMgbm90IHRyeSB0byByZXBsYWNlIHRoZSBjYXB0dXJlIGJ5IGl0cyBib3VuZC4gSXQncyBhIGxp
bWl0YXRpb24gb2YgdGhlIGluZmVyZW5jZSB3aGljaCB0ZW5kIHRvIGNob29zZSB0aGUgbW9zdCBz
cGVjaWlmYyB0eXBlIHdoZXJlIGhlcmUsIGl0IGhhcyB0byB1c2UgYSBsZXNzIHNwZWNpZmljIHR5
cGUuPC9kaXY+PGRpdj48YnI+PC9kaXY+PC9kaXY+PC9ibG9ja3F1b3RlPjxkaXY+PGJyPjwvZGl2
PjxkaXY+PGRpdj5JIGRvbid0IHF1aXRlIHVuZGVyc3RhbmQgdGhlIHN0ZXAgYnkgc3RlcCAicmVh
c29uaW5nIiZuYnNwOyBvZiB0aGUgdHlwZSBpbmZlcmVyIGhlcmUsIGJlY2F1c2UgbmFpdmVseSZu
YnNwO3RoaXMgaXMgd2hhdCBJIHdvdWxkIGRvIGlmIEkgd2FzIGVtcGxveWVkIGFzIGEgZnVsbCB0
aW1lIHR5cGUgaW5mZXJlciA6KS4gKEknbSBjb3B5aW5nIGhlcmUgbXkgY29kZSBhZ2FpbiB3aXRo
IHNvbWUgdmFyaWFibGUgcmVuYW1pbmcgZm9yIGVhc2llciByZWZlcmVuY2UpIFN1cHBvc2UgSSdt
IGEgY29tcGlsZXIsIGFuZCBJIHNlZSB0aGlzOjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+YGBg
PC9kaXY+PGRpdj4mbHQ7VDEmZ3Q7IHZvaWQgYXJyYXlNZXRob2QoTGlzdCZsdDs/IHN1cGVyIFQx
Jmd0O1tdIGFyZ3MpIHs8YnI+Jm5ic3A7ICZuYnNwOyBsaXN0TWV0aG9kKEFycmF5cy5hc0xpc3Qo
YXJncykpOzxicj59PGJyPiZsdDtUMiZndDsgdm9pZCBsaXN0TWV0aG9kKExpc3QmbHQ7TGlzdCZs
dDs/IHN1cGVyIFQyJmd0OyZndDsgbGlzdCkgeyB9PGJyPjwvZGl2PjxkaXY+YGBgPC9kaXY+PGRp
dj48YnI+PC9kaXY+PGRpdj4xLiBJIGxvb2sgYXQgYGFycmF5TWV0aG9kYCBhbmQgc2VlIDIgdHlw
ZSB2YXJpYWJsZXMgdG8gaW5mZXIuIE9uZSBmb3IgYGxpc3RNZXRob2RgIChsZXQncyBjYWxsIGl0
ICNMKSwgYW5kIG9uZSBmb3IgYEFycmF5cy5hc0xpc3RgIChsZXQncyBjYWxsIGl0ICNBKS48L2Rp
dj48ZGl2PjIuIFRoZSBmaXJzdCB0aGluZyBJIHNlZSBpcyB0aGF0IGBBcnJheXMuYXNMaXN0YCBy
ZXR1cm5zIGBMaXN0Jmx0OyNBJmd0O2AsIGFuZCBpdCBpcyBhc3NpZ25lZCB0byBgTGlzdCZsdDtM
aXN0Jmx0Oz8gc3VwZXIgI0wmZ3Q7Jmd0O2AuIFRoaXMgaXMgZWFzeSB0byBzYXRpc2Z5IHdpdGgg
I0EgPSBMaXN0Jmx0Oz8gc3VwZXIgI0wmZ3Q7IChhbmQgdGhpcyBpcyBhY3R1YWxseSB0aGUgb25s
eSBwb3NzaWJpbGl0eSkuPC9kaXY+PGRpdj4zLiBUaGVuIEkgZ28gdGhlIG5leHQgcGFydCwgYW5k
IHNlZSB0aGF0IGFyZ3MgaXMgb2YgY291cnNlIGBMaXN0Jmx0Oz8gc3VwZXIgVDEmZ3Q7W11gIHdo
aWNoIG11c3QgYmUgYXNzaWduZWQgdG8gYCNBW11gLCB3aGljaCBpcyBhZ2FpbiBlYXN5IHRvIHNh
dGlzZnkgd2l0aCAjQSA9IExpc3QmbHQ7PyBzdXBlciBUMSZndDsgKHdoaWNoIGlzIHRoZSBvbmx5
IHBvc3NpYmlsaXR5IGFnYWluKS48L2Rpdj48ZGl2PjQuIFNvLCBub3cgSSBoYXZlIHRvIHNhdGlz
ZnkgYWxsIGVxdWFsaXRpZXMgYCNBID0gTGlzdCZsdDs/IHN1cGVyICNMJmd0O2AgYW5kIGAjQSA9
IExpc3QmbHQ7PyBzdXBlciBUMSZndDtgLCB3aGljaCBpbXBsaWVzIHRoYXQgYExpc3QmbHQ7PyBz
dXBlciAjTCZndDsgPSBMaXN0Jmx0Oz8gc3VwZXIgVDEmZ3Q7YCwgd2hpY2ggaXMgZWFzeSB0byBz
YXRpc2Z5IGJ5IHRoZSBjaG9pY2UgI0wgPSBUMSAoYWdhaW4sIHRoaXMgaXMgdGhlIG9ubHkgY2hv
aWNlKS48L2Rpdj48ZGl2PjUuIFNvLCBub3cgSSBoYXZlIHJlc29sdmVkIGJvdGggdmFyaWFibGVz
OmAgI0wgPSBUMWAsIGFuZCBgI0EgPSBMaXN0Jmx0Oz8gc3VwZXIgVDEmZ3Q7YCwgYW5kIGluZGVl
ZCBJIGNhbiB2YWxpZGF0ZSB0aGF0IHRoaXMgY2hvaWNlIHdpbGwgc2F0aXNmeSBldmVyeSBjb25z
dHJhaW50LjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SSdtIGp1c3QgcHV6emxlZCBoZXJlLCBi
ZWNhdXNlIHNvbWV0aW1lcyB0aGUgdHlwZSBpbmZlcmVyIGNhbiBzb2x2ZSBtdWNoIG1vcmUgZGlm
ZmljdWx0IHByb2JsZW1zLCBhbmQgdGhpcyBzZWVtcyB0cml2aWFsIGNvbXBhcmVkIHRvIHRob3Nl
LjwvZGl2PjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+Jm5ic3A7PC9kaXY+PGJsb2NrcXVvdGUg
Y2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjBweCAwcHggMHB4IDAuOGV4O2JvcmRl
ci1sZWZ0OjFweCBzb2xpZCByZ2IoMjA0LDIwNCwyMDQpO3BhZGRpbmctbGVmdDoxZXgiPjxkaXYg
c3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtc2l6ZTox
MnB0O2NvbG9yOnJnYigwLDAsMCkiPjxkaXY+TXkgYmFkLCBJIHNob3VsZCBoYXZlIHdyaXR0ZW4g
TGlzdCZsdDs/IHN1cGVyIExpc3QmbHQ7PyBzdXBlciBUJmd0OyZndDsuPGJyPjwvZGl2PjxkaXY+
PGJyPjwvZGl2PjwvZGl2PjwvYmxvY2txdW90ZT48ZGl2Pjxicj48L2Rpdj48ZGl2PlN1cnByaXNp
bmdseSAodG8gbWUpLCB0aGF0IHdvdWxkIGNvbXBpbGUgd2l0aG91dCBleHBsaWNpdGx5IHNwZWNp
ZnlpbmcgdGhlIHR5cGUgYXJndW1lbnRzICh0aG91Z2ggb2YgY291cnNlIHRoYXQgaXMgbm90IGEg
dHlwZSBkZWNsYXJhdGlvbiB0aGF0IGlzIGFjY2VwdGFibGUgZm9yIG1lKS4gV2hhdCBzdXJwcmlz
ZXMgbWUgaGVyZSBpcyB0aGF0IEkgd291bGQgdGhpbmsgdGhhdCB0aGlzIHdvdWxkIG1ha2UgdGhl
IGpvYiBvZiB0aGUgdHlwZSBpbmZlcmVyIGhhcmRlciwgc2luY2Ugbm93IGl0IGlzIG1vcmUgZGlm
ZmljdWx0IHRvIGZpbmQgdGhlIGNvcnJlY3QgdHlwZXMsIHNpbmNlIHRoZXJlIGFyZSBtb3JlIG9w
dGlvbnMuIFdpdGhvdXQgdGhlIG91dGVyICI/IHN1cGVyIiB0aGUgaW5mZXJlciB3b3VsZCBiZSBm
b3JjZWQgdG8gbWFrZSB0aGUgY29ycmVjdCB0eXBlIGFzc2lnbm1lbnQgKHNpbmNlIHRoZXJlIGlz
IGFsd2F5cyBvbmx5IG9uZSBwb3NzaWJpbGl0eSkuIFRoYXQgaXMsIHdoZW4geW91IHdyaXRlIGBM
aXN0Jmx0Oz8gc3VwZXIgTGlzdCZsdDs/IHN1cGVyIFQmZ3Q7YCwgbm93IHlvdSBnZXQgYW5vdGhl
ciBmcmVzaCB0eXBlIHZhcmlhYmxlIHRvIHNhdGlzZnkuIE5hbWVseSwgeW91IGhhdmUgdG8gcGlj
ayBhIHR5cGUgb2YgYD8gc3VwZXIgTGlzdCZsdDs/IHN1cGVyIFQmZ3Q7YC4gV2hpbGUgaW4gdGhl
IG90aGVyIGNhc2UgeW91ciBvbmx5IG9wdGlvbiBmb3IgdGhpcyB3YXMgYExpc3QmbHQ7PyBzdXBl
ciBUJmd0O2AgKHdoaWNoIGlzIHRoZSBvbmx5IGNvcnJlY3QgY2hvaWNlIGV2ZW4gaW4gdGhlIGA/
IHN1cGVyYCB2YXJpYW50LjwvZGl2PjwvZGl2PjwvZGl2PgoKPC9ibG9ja3F1b3RlPg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;"></div>
</div>
</blockquote>
<br>
</body>
</html>