<div dir="ltr">I've left something in <a href="https://github.com/hmaarrfk/libfprint/issues/4">https://github.com/hmaarrfk/libfprint/issues/4</a> because it's easier to discuss when you can point at the code.</div><br><div class="gmail_quote"><div dir="ltr">On Sat, Mar 10, 2018 at 3:06 AM Mark Harfouche <<a href="mailto:mark.harfouche@gmail.com">mark.harfouche@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="m_3992598253001033429markdown-here-wrapper"><p style="margin:0px 0px 1.2em!important">Alright, I think I finally got somewhere.</p>
<p style="margin:0px 0px 1.2em!important">I can run <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">img_capture</code> successfully. I see two pgm files in my directory that look like fingerprints.</p>
<p style="margin:0px 0px 1.2em!important">This particular device can’t do the matching so it all has to be done on the host.<br>I assume libfprint can do this?</p>
<p style="margin:0px 0px 1.2em!important">I can’t seem to run <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">enroll</code>. This is the output I get:</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-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important">This program will enroll your right index finger, unconditionally overwriting any right-index print that was enrolled previously. If you want to continue, press enter, otherwise hit Ctrl+C

Found device claimed by Validity VFS7552 driver
Opened device. It's now time to enroll your finger.

You will need to successfully scan your finger 5 times to complete the process.

Scan your finger now.
Wrote scanned image to enrolled.pgm
Didn't quite catch that. Please try again.

Scan your finger now.
libusb: warning [handle_timeout] async cancel failed -5 errno=22
Wrote scanned image to enrolled.pgm
Didn't quite catch that. Please try again.
</code></pre><p style="margin:0px 0px 1.2em!important">What is:</p><pre style="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;border-style:solid;border-width:1px;background-color:rgb(248,248,248);border-radius:3px;white-space:pre-wrap;overflow:auto;border-color:rgb(204,204,204);padding:0.5em 0.7em;display:block">libusb: warning [handle_timeout] async cancel failed -5 errno=22</code></pre><p></p><p style="margin:0px 0px 1.2em!important">Help would be appreciated, though I know it is difficult to debug other people’s hardware.</p>
<p style="margin:0px 0px 1.2em!important">Mark</p>
<div title="MDH:PGRpdj48ZGl2PjxkaXY+QWxyaWdodCwgSSB0aGluayBJIGZpbmFsbHkgZ290IHNvbWV3aGVyZS48
YnI+PGJyPjwvZGl2PkkgY2FuIHJ1biBgaW1nX2NhcHR1cmVgIHN1Y2Nlc3NmdWxseS4gSSBzZWUg
dHdvIHBnbSBmaWxlcyBpbiBteSBkaXJlY3RvcnkgdGhhdCBsb29rIGxpa2UgZmluZ2VycHJpbnRz
Ljxicj48YnI+VGhpcyBwYXJ0aWN1bGFyIGRldmljZSBjYW4ndCBkbyB0aGUgbWF0Y2hpbmcgc28g
aXQgYWxsIGhhcyB0byBiZSBkb25lIG9uIHRoZSBob3N0LiA8YnI+SSBhc3N1bWUgbGliZnByaW50
IGNhbiBkbyB0aGlzPzxicj48YnI+SSBjYW4ndCBzZWVtIHRvIHJ1biBgZW5yb2xsYC4gVGhpcyBp
cyB0aGUgb3V0cHV0IEkgZ2V0Ojxicj48YnI+YGBgPGJyPlRoaXMgcHJvZ3JhbSB3aWxsIGVucm9s
bCB5b3VyIHJpZ2h0IGluZGV4IGZpbmdlciwgdW5jb25kaXRpb25hbGx5IG92ZXJ3cml0aW5nIGFu
eSByaWdodC1pbmRleCBwcmludCB0aGF0IHdhcyBlbnJvbGxlZCBwcmV2aW91c2x5LiBJZiB5b3Ug
d2FudCB0byBjb250aW51ZSwgcHJlc3MgZW50ZXIsIG90aGVyd2lzZSBoaXQgQ3RybCtDPGJyPjxi
cj5Gb3VuZCBkZXZpY2UgY2xhaW1lZCBieSBWYWxpZGl0eSBWRlM3NTUyIGRyaXZlcjxicj5PcGVu
ZWQgZGV2aWNlLiBJdCdzIG5vdyB0aW1lIHRvIGVucm9sbCB5b3VyIGZpbmdlci48YnI+PGJyPllv
dSB3aWxsIG5lZWQgdG8gc3VjY2Vzc2Z1bGx5IHNjYW4geW91ciBmaW5nZXIgNSB0aW1lcyB0byBj
b21wbGV0ZSB0aGUgcHJvY2Vzcy48YnI+PGJyPlNjYW4geW91ciBmaW5nZXIgbm93Ljxicj5Xcm90
ZSBzY2FubmVkIGltYWdlIHRvIGVucm9sbGVkLnBnbTxicj5EaWRuJ3QgcXVpdGUgY2F0Y2ggdGhh
dC4gUGxlYXNlIHRyeSBhZ2Fpbi48YnI+PGJyPlNjYW4geW91ciBmaW5nZXIgbm93Ljxicj5saWJ1
c2I6IHdhcm5pbmcgW2hhbmRsZV90aW1lb3V0XSBhc3luYyBjYW5jZWwgZmFpbGVkIC01IGVycm5v
PTIyPGJyPldyb3RlIHNjYW5uZWQgaW1hZ2UgdG8gZW5yb2xsZWQucGdtPGJyPkRpZG4ndCBxdWl0
ZSBjYXRjaCB0aGF0LiBQbGVhc2UgdHJ5IGFnYWluLjxicj5gYGA8YnI+PGJyPjwvZGl2PkhlbHAg
d291bGQgYmUgYXBwcmVjaWF0ZWQsIHRob3VnaCBJIGtub3cgaXQgaXMgZGlmZmljdWx0IHRvIGRl
YnVnIG90aGVyIHBlb3BsZSdzIGhhcmR3YXJlLjxicj48YnI+PC9kaXY+TWFyazxicj4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Mar 9, 2018 at 11:02 AM, Igor Filatov <span dir="ltr"><<a href="mailto:ia.filatov@gmail.com" target="_blank">ia.filatov@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Not really. The same state is sent to dev_change_state after activation has ended with fpi_imgdev_activate_complete. You can ignore it.<div><br></div></div><div class="m_3992598253001033429HOEnZb"><div class="m_3992598253001033429h5"><br><div class="gmail_quote"><div dir="ltr">On Fri, Mar 9, 2018 at 8:51 PM Mark Harfouche <<a href="mailto:mark.harfouche@gmail.com" target="_blank">mark.harfouche@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="m_3992598253001033429m_-8691088033892789468m_8050939078767935927markdown-here-wrapper"><p style="margin:0px 0px 1.2em!important">Hi Igor,</p>
<p style="margin:0px 0px 1.2em!important">Thank you for your reply.</p>
<p style="margin:0px 0px 1.2em!important">I’m confused about the parameter sent to <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">dev_activate</code>. Is it useful? in uru4000.c (which seems to be the latest one written), the authors also seem to be confused</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="m_3992598253001033429m_-8691088033892789468m_8050939078767935927hljs m_3992598253001033429m_-8691088033892789468m_8050939078767935927language-c" 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-wrap;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) none repeat scroll 0% 0%"><span class="m_3992598253001033429m_-8691088033892789468m_8050939078767935927hljs-comment" style="color:rgb(153,153,136);font-style:italic">/* FIXME: having state parameter here is kinda useless, will we ever
 * see a scenario where the parameter is useful so early on in the activation
 * process? asynchronity means that it'll only be used in a later function
 * call. */</span>
<span class="m_3992598253001033429m_-8691088033892789468m_8050939078767935927hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">static</span> <span class="m_3992598253001033429m_-8691088033892789468m_8050939078767935927hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">int</span> dev_activate(<span class="m_3992598253001033429m_-8691088033892789468m_8050939078767935927hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">struct</span> fp_img_dev *dev, <span class="m_3992598253001033429m_-8691088033892789468m_8050939078767935927hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">enum</span> fp_imgdev_state state)
{
</code></pre>
<p style="margin:0px 0px 1.2em!important">Thanks,</p>
<p style="margin:0px 0px 1.2em!important">Mark</p></div></div><div dir="ltr"><div class="m_3992598253001033429m_-8691088033892789468m_8050939078767935927markdown-here-wrapper">
<p style="margin:0px 0px 1.2em!important">On Fri, Mar 9, 2018 at 10:43 AM, Igor Filatov <<a href="mailto:ia.filatov@gmail.com" target="_blank">ia.filatov@gmail.com</a>> wrote:</p>
<p style="margin:0px 0px 1.2em!important"></p><div class="m_3992598253001033429m_-8691088033892789468m_8050939078767935927markdown-here-exclude"><p></p><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi Mark,<div><br></div><div>There are no high-level docs, unfortunately. There's some valuable info in comments in drv.c, sync.c, async.c, img.c etc. but it only covers specific parts, not how they should interact.</div><div><br></div><div>There are 6 drivers for press-type sensors: aes3500.c, aes4000.c, fdu2000.c, upektc.c, uru4000.c, vcom5s.c. But there isn't much difference between press and swipe drivers. FP_SCAN_TYPE_* is used to determine which messages to show ("please touch the sensor" vs. "please swipe..."), and I think that's it. Besides that, all drivers essentially do the same thing: obtain the fingerprint image and submit it. You can use any driver as a reference.</div><div><br></div><div><div><br></div></div><div dir="ltr"><br><div class="gmail_quote"><div><div class="m_3992598253001033429m_-8691088033892789468m_8050939078767935927m_-2997991969748732207h5"><div dir="ltr">On Fri, Mar 9, 2018 at 7:50 PM Mark Harfouche <<a href="mailto:mark.harfouche@gmail.com" target="_blank">mark.harfouche@gmail.com</a>> wrote:<br></div></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="m_3992598253001033429m_-8691088033892789468m_8050939078767935927m_-2997991969748732207h5"><div dir="ltr"><div class="m_3992598253001033429m_-8691088033892789468m_8050939078767935927m_-2997991969748732207m_-7832410778618662649m_8177662341642847222m_6183061558386683585m_-8744784386542286602markdown-here-wrapper"><p style="margin:0px 0px 1.2em!important">Hello all,</p>
<p style="margin:0px 0px 1.2em!important">I would like to develop a driver for the Validity 0091 sensor available on the Dell XPS13/15 9X60.</p>
<p style="margin:0px 0px 1.2em!important">I would say I have the driver reverse engineered to 95% (There might be a few things I still don’t understand from the internal state machine).<br><a href="https://github.com/hmaarrfk/Validity91" target="_blank">https://github.com/hmaarrfk/Validity91</a><br>WIP: <a href="https://github.com/freedesktop/libfprint" target="_blank">https://github.com/freedesktop/libfprint</a></p>
<p style="margin:0px 0px 1.2em!important">I found the libfprint source, can compile it, and started creating my own driver.</p>
<p style="margin:0px 0px 1.2em!important">However, I am confused about the internal workings of libfprint and the functions I need to define.<br>I tried to follow examples that were included, but it seemed that they were mostly “swipe”‘ sensors, and not capacitive style sensor.<br>Is there any good documentation about the state machines I need to implement with regards to the functions</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-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important">    .open = dev_open,
    .close = dev_close,
    .activate = dev_activate,
    .deactivate = dev_deactivate,
    .change_state = dev_change_state,
</code></pre><p style="margin:0px 0px 1.2em!important">Thanks,</p>
<p style="margin:0px 0px 1.2em!important">Mark</p>
<div title="MDH:PGRpdj48ZGl2PjxkaXY+PGRpdj48ZGl2PjxkaXY+PGRpdj48ZGl2PkhlbGxvIGFsbCw8YnI+PGJy
PjwvZGl2Pkkgd291bGQgbGlrZSB0byBkZXZlbG9wIGEgZHJpdmVyIGZvciB0aGUgVmFsaWRpdHkg
MDA5MSBzZW5zb3IgYXZhaWxhYmxlIG9uIHRoZSBEZWxsIFhQUzEzLzE1IDlYNjAuPGJyPjxicj48
L2Rpdj5JIHdvdWxkIHNheSBJIGhhdmUgdGhlIGRyaXZlciByZXZlcnNlIGVuZ2luZWVyZWQgdG8g
OTUlIChUaGVyZSBtaWdodCBiZSBhIGZldyB0aGluZ3MgSSBzdGlsbCBkb24ndCB1bmRlcnN0YW5k
IGZyb20gdGhlIGludGVybmFsIHN0YXRlIG1hY2hpbmUpLjxicj5odHRwczovL2dpdGh1Yi5jb20v
aG1hYXJyZmsvVmFsaWRpdHk5MTxicj48L2Rpdj48ZGl2PldJUDogaHR0cHM6Ly9naXRodWIuY29t
L2ZyZWVkZXNrdG9wL2xpYmZwcmludDxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj5JIGZvdW5kIHRo
ZSBsaWJmcHJpbnQgc291cmNlLCBjYW4gY29tcGlsZSBpdCwgYW5kIHN0YXJ0ZWQgY3JlYXRpbmcg
bXkgb3duIGRyaXZlci48YnI+PC9kaXY+PGJyPkhvd2V2ZXIsIEkgYW0gY29uZnVzZWQgYWJvdXQg
dGhlIGludGVybmFsIHdvcmtpbmdzIG9mIGxpYmZwcmludCBhbmQgdGhlIGZ1bmN0aW9ucyBJIG5l
ZWQgdG8gZGVmaW5lLjxicj48L2Rpdj5JIHRyaWVkIHRvIGZvbGxvdyBleGFtcGxlcyB0aGF0IHdl
cmUgaW5jbHVkZWQsIGJ1dCBpdCBzZWVtZWQgdGhhdCB0aGV5IHdlcmUgbW9zdGx5ICJzd2lwZSIn
IHNlbnNvcnMsIGFuZCBub3QgY2FwYWNpdGl2ZSBzdHlsZSBzZW5zb3IuPGJyPjwvZGl2PklzIHRo
ZXJlIGFueSBnb29kIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIHN0YXRlIG1hY2hpbmVzIEkgbmVl
ZCB0byBpbXBsZW1lbnQgd2l0aCByZWdhcmRzIHRvIHRoZSBmdW5jdGlvbnM8YnI+PGJyPmBgYDxi
cj4mbmJzcDsmbmJzcDsmbmJzcDsgLm9wZW4gPSBkZXZfb3Blbiw8YnI+Jm5ic3A7Jm5ic3A7Jm5i
c3A7IC5jbG9zZSA9IGRldl9jbG9zZSw8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC5hY3RpdmF0ZSA9
IGRldl9hY3RpdmF0ZSw8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC5kZWFjdGl2YXRlID0gZGV2X2Rl
YWN0aXZhdGUsPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyAuY2hhbmdlX3N0YXRlID0gZGV2X2NoYW5n
ZV9zdGF0ZSw8YnI+YGBgPGJyPjxicj48L2Rpdj5UaGFua3MsPGJyPjxicj48L2Rpdj5NYXJrPGJy
Pg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div></div></div>
_______________________________________________<br>
fprint mailing list<br>
<a href="mailto:fprint@lists.freedesktop.org" target="_blank">fprint@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/fprint" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/fprint</a><br>
</blockquote></div></div></div>
</blockquote><p></p></div><p style="margin:0px 0px 1.2em!important"></p>
<div title="MDH:PGRpdj48ZGl2PjxkaXY+PGRpdj48ZGl2PkhpIElnb3IsPGJyPjxicj48L2Rpdj5UaGFuayB5b3Ug
Zm9yIHlvdXIgcmVwbHkuPGJyPjxicj48L2Rpdj5JJ20gY29uZnVzZWQgYWJvdXQgdGhlIHBhcmFt
ZXRlciBzZW50IHRvIGBkZXZfYWN0aXZhdGVgLiBJcyBpdCB1c2VmdWw/IGluIHVydTQwMDAuYyAo
d2hpY2ggc2VlbXMgdG8gYmUgdGhlIGxhdGVzdCBvbmUgd3JpdHRlbiksIHRoZSBhdXRob3JzIGFs
c28gc2VlbSB0byBiZSBjb25mdXNlZDxicj48L2Rpdj5gYGBjPGJyPi8qIEZJWE1FOiBoYXZpbmcg
c3RhdGUgcGFyYW1ldGVyIGhlcmUgaXMga2luZGEgdXNlbGVzcywgd2lsbCB3ZSBldmVyPGJyPiZu
YnNwOyogc2VlIGEgc2NlbmFyaW8gd2hlcmUgdGhlIHBhcmFtZXRlciBpcyB1c2VmdWwgc28gZWFy
bHkgb24gaW4gdGhlIGFjdGl2YXRpb248YnI+Jm5ic3A7KiBwcm9jZXNzPyBhc3luY2hyb25pdHkg
bWVhbnMgdGhhdCBpdCdsbCBvbmx5IGJlIHVzZWQgaW4gYSBsYXRlciBmdW5jdGlvbjxicj4mbmJz
cDsqIGNhbGwuICovPGJyPnN0YXRpYyBpbnQgZGV2X2FjdGl2YXRlKHN0cnVjdCBmcF9pbWdfZGV2
ICpkZXYsIGVudW0gZnBfaW1nZGV2X3N0YXRlIHN0YXRlKTxicj57PGJyPmBgYDxicj48YnI+PC9k
aXY+VGhhbmtzLDxicj48YnI+PC9kaXY+TWFyazxicj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+
PGJyPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj5PbiBGcmksIE1hciA5LCAyMDE4IGF0IDEwOjQz
IEFNLCBJZ29yIEZpbGF0b3YgPHNwYW4gZGlyPSJsdHIiPiZsdDs8YSBocmVmPSJtYWlsdG86aWEu
ZmlsYXRvdkBnbWFpbC5jb20iIHRhcmdldD0iX2JsYW5rIj5pYS5maWxhdG92QGdtYWlsLmNvbTwv
YT4mZ3Q7PC9zcGFuPiB3cm90ZTo8YnI+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBz
dHlsZT0ibWFyZ2luOjAgMCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNjY2Mgc29saWQ7cGFkZGlu
Zy1sZWZ0OjFleCI+PGRpdiBkaXI9Imx0ciI+SGkgTWFyayw8ZGl2Pjxicj48L2Rpdj48ZGl2PlRo
ZXJlIGFyZSBubyBoaWdoLWxldmVsIGRvY3MsIHVuZm9ydHVuYXRlbHkuIFRoZXJlJ3Mgc29tZSB2
YWx1YWJsZSBpbmZvIGluIGNvbW1lbnRzIGluIGRydi5jLCBzeW5jLmMsIGFzeW5jLmMsIGltZy5j
IGV0Yy4gYnV0IGl0IG9ubHkgY292ZXJzIHNwZWNpZmljIHBhcnRzLCBub3QgaG93IHRoZXkgc2hv
dWxkIGludGVyYWN0LjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+VGhlcmUgYXJlIDYgZHJpdmVy
cyBmb3IgcHJlc3MtdHlwZSBzZW5zb3JzOiBhZXMzNTAwLmMsIGFlczQwMDAuYywgZmR1MjAwMC5j
LCB1cGVrdGMuYywgdXJ1NDAwMC5jLCB2Y29tNXMuYy4gQnV0IHRoZXJlIGlzbid0IG11Y2ggZGlm
ZmVyZW5jZSBiZXR3ZWVuIHByZXNzIGFuZCBzd2lwZSBkcml2ZXJzLiBGUF9TQ0FOX1RZUEVfKiBp
cyB1c2VkIHRvIGRldGVybWluZSB3aGljaCBtZXNzYWdlcyB0byBzaG93ICgicGxlYXNlIHRvdWNo
IHRoZSBzZW5zb3IiIHZzLiAicGxlYXNlIHN3aXBlLi4uIiksIGFuZCBJIHRoaW5rIHRoYXQncyBp
dC4gQmVzaWRlcyB0aGF0LCBhbGwgZHJpdmVycyBlc3NlbnRpYWxseSBkbyB0aGUgc2FtZSB0aGlu
Zzogb2J0YWluIHRoZSBmaW5nZXJwcmludCBpbWFnZSBhbmQgc3VibWl0IGl0LiBZb3UgY2FuIHVz
ZSBhbnkgZHJpdmVyIGFzIGEgcmVmZXJlbmNlLjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+PGRp
dj48YnI+PC9kaXY+PC9kaXY+PGRpdiBkaXI9Imx0ciI+PGJyPjxkaXYgY2xhc3M9ImdtYWlsX3F1
b3RlIj48ZGl2PjxkaXYgY2xhc3M9Im1fLTI5OTc5OTE5Njk3NDg3MzIyMDdoNSI+PGRpdiBkaXI9
Imx0ciI+T24gRnJpLCBNYXIgOSwgMjAxOCBhdCA3OjUwIFBNIE1hcmsgSGFyZm91Y2hlICZsdDs8
YSBocmVmPSJtYWlsdG86bWFyay5oYXJmb3VjaGVAZ21haWwuY29tIiB0YXJnZXQ9Il9ibGFuayI+
bWFyay5oYXJmb3VjaGVAZ21haWwuY29tPC9hPiZndDsgd3JvdGU6PGJyPjwvZGl2PjwvZGl2Pjwv
ZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowIDAgMCAu
OGV4O2JvcmRlci1sZWZ0OjFweCAjY2NjIHNvbGlkO3BhZGRpbmctbGVmdDoxZXgiPjxkaXY+PGRp
diBjbGFzcz0ibV8tMjk5Nzk5MTk2OTc0ODczMjIwN2g1Ij48ZGl2IGRpcj0ibHRyIj48ZGl2IGNs
YXNzPSJtXy0yOTk3OTkxOTY5NzQ4NzMyMjA3bV8tNzgzMjQxMDc3ODYxODY2MjY0OW1fODE3NzY2
MjM0MTY0Mjg0NzIyMm1fNjE4MzA2MTU1ODM4NjY4MzU4NW1fLTg3NDQ3ODQzODY1NDIyODY2MDJt
YXJrZG93bi1oZXJlLXdyYXBwZXIiPjxwIHN0eWxlPSJtYXJnaW46MHB4IDBweCAxLjJlbSFpbXBv
cnRhbnQiPkhlbGxvIGFsbCw8L3A+CjxwIHN0eWxlPSJtYXJnaW46MHB4IDBweCAxLjJlbSFpbXBv
cnRhbnQiPkkgd291bGQgbGlrZSB0byBkZXZlbG9wIGEgZHJpdmVyIGZvciB0aGUgVmFsaWRpdHkg
MDA5MSBzZW5zb3IgYXZhaWxhYmxlIG9uIHRoZSBEZWxsIFhQUzEzLzE1IDlYNjAuPC9wPgo8cCBz
dHlsZT0ibWFyZ2luOjBweCAwcHggMS4yZW0haW1wb3J0YW50Ij5JIHdvdWxkIHNheSBJIGhhdmUg
dGhlIGRyaXZlciByZXZlcnNlIGVuZ2luZWVyZWQgdG8gOTUlIChUaGVyZSBtaWdodCBiZSBhIGZl
dyB0aGluZ3MgSSBzdGlsbCBkb27igJl0IHVuZGVyc3RhbmQgZnJvbSB0aGUgaW50ZXJuYWwgc3Rh
dGUgbWFjaGluZSkuPGJyPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9obWFhcnJmay9WYWxp
ZGl0eTkxIiB0YXJnZXQ9Il9ibGFuayIgZGF0YS1zYWZlcmVkaXJlY3R1cmw9Imh0dHBzOi8vd3d3
Lmdvb2dsZS5jb20vdXJsP2hsPWVuJmFtcDtxPWh0dHBzOi8vZ2l0aHViLmNvbS9obWFhcnJmay9W
YWxpZGl0eTkxJmFtcDtzb3VyY2U9Z21haWwmYW1wO3VzdD0xNTIwNzA3ODUxNDI4MDAwJmFtcDt1
c2c9QUZRakNORzI3Zm9UeE9GREJOYmlDYy1UMVctSWJVamwwZyI+aHR0cHM6Ly9naXRodWIuY29t
L2htYWFycmZrL1ZhPHdicj5saWRpdHk5MTwvYT48YnI+V0lQOiA8YSBocmVmPSJodHRwczovL2dp
dGh1Yi5jb20vZnJlZWRlc2t0b3AvbGliZnByaW50IiB0YXJnZXQ9Il9ibGFuayIgZGF0YS1zYWZl
cmVkaXJlY3R1cmw9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vdXJsP2hsPWVuJmFtcDtxPWh0dHBz
Oi8vZ2l0aHViLmNvbS9mcmVlZGVza3RvcC9saWJmcHJpbnQmYW1wO3NvdXJjZT1nbWFpbCZhbXA7
dXN0PTE1MjA3MDc4NTE0MjgwMDAmYW1wO3VzZz1BRlFqQ05HT1R5WGVoTHIwS1hoazA5dFJZcHZZ
Q3RDTk13Ij5odHRwczovL2dpdGh1Yi5jb20vZnJlZWRlc2t0b3A8d2JyPi9saWJmcHJpbnQ8L2E+
PC9wPgo8cCBzdHlsZT0ibWFyZ2luOjBweCAwcHggMS4yZW0haW1wb3J0YW50Ij5JIGZvdW5kIHRo
ZSBsaWJmcHJpbnQgc291cmNlLCBjYW4gY29tcGlsZSBpdCwgYW5kIHN0YXJ0ZWQgY3JlYXRpbmcg
bXkgb3duIGRyaXZlci48L3A+CjxwIHN0eWxlPSJtYXJnaW46MHB4IDBweCAxLjJlbSFpbXBvcnRh
bnQiPkhvd2V2ZXIsIEkgYW0gY29uZnVzZWQgYWJvdXQgdGhlIGludGVybmFsIHdvcmtpbmdzIG9m
IGxpYmZwcmludCBhbmQgdGhlIGZ1bmN0aW9ucyBJIG5lZWQgdG8gZGVmaW5lLjxicj5JIHRyaWVk
IHRvIGZvbGxvdyBleGFtcGxlcyB0aGF0IHdlcmUgaW5jbHVkZWQsIGJ1dCBpdCBzZWVtZWQgdGhh
dCB0aGV5IHdlcmUgbW9zdGx5IOKAnHN3aXBl4oCd4oCYIHNlbnNvcnMsIGFuZCBub3QgY2FwYWNp
dGl2ZSBzdHlsZSBzZW5zb3IuPGJyPklzIHRoZXJlIGFueSBnb29kIGRvY3VtZW50YXRpb24gYWJv
dXQgdGhlIHN0YXRlIG1hY2hpbmVzIEkgbmVlZCB0byBpbXBsZW1lbnQgd2l0aCByZWdhcmRzIHRv
IHRoZSBmdW5jdGlvbnM8L3A+CjxwcmUgc3R5bGU9ImZvbnQtc2l6ZTowLjg1ZW07Zm9udC1mYW1p
bHk6Q29uc29sYXMsSW5jb25zb2xhdGEsQ291cmllcixtb25vc3BhY2U7Zm9udC1zaXplOjFlbTts
aW5lLWhlaWdodDoxLjJlbTttYXJnaW46MS4yZW0gMHB4Ij48Y29kZSBzdHlsZT0iZm9udC1zaXpl
OjAuODVlbTtmb250LWZhbWlseTpDb25zb2xhcyxJbmNvbnNvbGF0YSxDb3VyaWVyLG1vbm9zcGFj
ZTttYXJnaW46MHB4IDAuMTVlbTtwYWRkaW5nOjBweCAwLjNlbTt3aGl0ZS1zcGFjZTpwcmUtd3Jh
cDtib3JkZXI6MXB4IHNvbGlkIHJnYigyMzQsMjM0LDIzNCk7YmFja2dyb3VuZC1jb2xvcjpyZ2Io
MjQ4LDI0OCwyNDgpO2JvcmRlci1yYWRpdXM6M3B4O2Rpc3BsYXk6aW5saW5lO3doaXRlLXNwYWNl
OnByZS13cmFwO292ZXJmbG93OmF1dG87Ym9yZGVyLXJhZGl1czozcHg7Ym9yZGVyOjFweCBzb2xp
ZCByZ2IoMjA0LDIwNCwyMDQpO3BhZGRpbmc6MC41ZW0gMC43ZW07ZGlzcGxheTpibG9jayFpbXBv
cnRhbnQiPiAgICAub3BlbiA9IGRldl9vcGVuLAogICAgLmNsb3NlID0gZGV2X2Nsb3NlLAogICAg
LmFjdGl2YXRlID0gZGV2X2FjdGl2YXRlLAogICAgLmRlYWN0aXZhdGUgPSBkZXZfZGVhY3RpdmF0
ZSwKICAgIC5jaGFuZ2Vfc3RhdGUgPSBkZXZfY2hhbmdlX3N0YXRlLAo8L2NvZGU+PC9wcmU+PHAg
c3R5bGU9Im1hcmdpbjowcHggMHB4IDEuMmVtIWltcG9ydGFudCI+VGhhbmtzLDwvcD4KPHAgc3R5
bGU9Im1hcmdpbjowcHggMHB4IDEuMmVtIWltcG9ydGFudCI+TWFyazwvcD4KPGRpdiB0aXRsZT0i
TURIOlBHUnBkajQ4WkdsMlBqeGthWFkrUEdScGRqNDhaR2wyUGp4a2FYWStQR1JwZGo0OFpHbDJQ
a2hsYkd4dklHRnNiQ3c4WW5JK1BHSnkKUGp3dlpHbDJQa2tnZDI5MWJHUWdiR2xyWlNCMGJ5Qmta
WFpsYkc5d0lHRWdaSEpwZG1WeUlHWnZjaUIwYUdVZ1ZtRnNhV1JwZEhrZwpNREE1TVNCelpXNXpi
M0lnWVhaaGFXeGhZbXhsSUc5dUlIUm9aU0JFWld4c0lGaFFVekV6THpFMUlEbFlOakF1UEdKeVBq
eGljajQ4CkwyUnBkajVKSUhkdmRXeGtJSE5oZVNCSklHaGhkbVVnZEdobElHUnlhWFpsY2lCeVpY
Wmxjbk5sSUdWdVoybHVaV1Z5WldRZ2RHOGcKT1RVbElDaFVhR1Z5WlNCdGFXZG9kQ0JpWlNCaElH
WmxkeUIwYUdsdVozTWdTU0J6ZEdsc2JDQmtiMjRuZENCMWJtUmxjbk4wWVc1awpJR1p5YjIwZ2RH
aGxJR2x1ZEdWeWJtRnNJSE4wWVhSbElHMWhZMmhwYm1VcExqeGljajVvZEhSd2N6b3ZMMmRwZEdo
MVlpNWpiMjB2CmFHMWhZWEp5Wm1zdlZtRnNhV1JwZEhrNU1UeGljajQ4TDJScGRqNDhaR2wyUGxk
SlVEb2dhSFIwY0hNNkx5OW5hWFJvZFdJdVkyOXQKTDJaeVpXVmtaWE5yZEc5d0wyeHBZbVp3Y21s
dWREeGljajQ4TDJScGRqNDhaR2wyUGp4aWNqNDhMMlJwZGo1SklHWnZkVzVrSUhSbwpaU0JzYVdK
bWNISnBiblFnYzI5MWNtTmxMQ0JqWVc0Z1kyOXRjR2xzWlNCcGRDd2dZVzVrSUhOMFlYSjBaV1Fn
WTNKbFlYUnBibWNnCmJYa2diM2R1SUdSeWFYWmxjaTQ4WW5JK1BDOWthWFkrUEdKeVBraHZkMlYy
WlhJc0lFa2dZVzBnWTI5dVpuVnpaV1FnWVdKdmRYUWcKZEdobElHbHVkR1Z5Ym1Gc0lIZHZjbXRw
Ym1keklHOW1JR3hwWW1ad2NtbHVkQ0JoYm1RZ2RHaGxJR1oxYm1OMGFXOXVjeUJKSUc1bApaV1Fn
ZEc4Z1pHVm1hVzVsTGp4aWNqNDhMMlJwZGo1SklIUnlhV1ZrSUhSdklHWnZiR3h2ZHlCbGVHRnRj
R3hsY3lCMGFHRjBJSGRsCmNtVWdhVzVqYkhWa1pXUXNJR0oxZENCcGRDQnpaV1Z0WldRZ2RHaGhk
Q0IwYUdWNUlIZGxjbVVnYlc5emRHeDVJQ0p6ZDJsd1pTSW4KSUhObGJuTnZjbk1zSUdGdVpDQnVi
M1FnWTJGd1lXTnBkR2wyWlNCemRIbHNaU0J6Wlc1emIzSXVQR0p5UGp3dlpHbDJQa2x6SUhSbwpa
WEpsSUdGdWVTQm5iMjlrSUdSdlkzVnRaVzUwWVhScGIyNGdZV0p2ZFhRZ2RHaGxJSE4wWVhSbElH
MWhZMmhwYm1WeklFa2dibVZsClpDQjBieUJwYlhCc1pXMWxiblFnZDJsMGFDQnlaV2RoY21SeklI
UnZJSFJvWlNCbWRXNWpkR2x2Ym5NOFluSStQR0p5UG1CZ1lEeGkKY2o0bWJtSnpjRHNtYm1KemNE
c21ibUp6Y0RzZ0xtOXdaVzRnUFNCa1pYWmZiM0JsYml3OFluSStKbTVpYzNBN0ptNWljM0E3Sm01
aQpjM0E3SUM1amJHOXpaU0E5SUdSbGRsOWpiRzl6WlN3OFluSStKbTVpYzNBN0ptNWljM0E3Sm01
aWMzQTdJQzVoWTNScGRtRjBaU0E5CklHUmxkbDloWTNScGRtRjBaU3c4WW5JK0ptNWljM0E3Sm01
aWMzQTdKbTVpYzNBN0lDNWtaV0ZqZEdsMllYUmxJRDBnWkdWMlgyUmwKWVdOMGFYWmhkR1VzUEdK
eVBpWnVZbk53T3ladVluTndPeVp1WW5Od095QXVZMmhoYm1kbFgzTjBZWFJsSUQwZ1pHVjJYMk5v
WVc1bgpaVjl6ZEdGMFpTdzhZbkkrWUdCZ1BHSnlQanhpY2o0OEwyUnBkajVVYUdGdWEzTXNQR0p5
UGp4aWNqNDhMMlJwZGo1TllYSnJQR0p5ClBnPT0iIHN0eWxlPSJoZWlnaHQ6MDt3aWR0aDowO21h
eC1oZWlnaHQ6MDttYXgtd2lkdGg6MDtvdmVyZmxvdzpoaWRkZW47Zm9udC1zaXplOjBlbTtwYWRk
aW5nOjA7bWFyZ2luOjAiPuKAizwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PgpfX19fX19f
X19fX19fX19fX19fX19fX19fX19fX188d2JyPl9fX19fX19fX19fX19fX19fPGJyPgpmcHJpbnQg
bWFpbGluZyBsaXN0PGJyPgo8YSBocmVmPSJtYWlsdG86ZnByaW50QGxpc3RzLmZyZWVkZXNrdG9w
Lm9yZyIgdGFyZ2V0PSJfYmxhbmsiPmZwcmludEBsaXN0cy5mcmVlZGVza3RvcC5vcmc8L2E+PGJy
Pgo8YSBocmVmPSJodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZv
L2ZwcmludCIgcmVsPSJub3JlZmVycmVyIiB0YXJnZXQ9Il9ibGFuayIgZGF0YS1zYWZlcmVkaXJl
Y3R1cmw9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vdXJsP2hsPWVuJmFtcDtxPWh0dHBzOi8vbGlz
dHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZnByaW50JmFtcDtzb3VyY2U9Z21h
aWwmYW1wO3VzdD0xNTIwNzA3ODUxNDI4MDAwJmFtcDt1c2c9QUZRakNORWlBdzB6WW9tdDZmOTky
X1dIbUh2NnNxeWpJQSI+aHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvPHdicj5tYWlsbWFu
L2xpc3RpbmZvL2ZwcmludDwvYT48YnI+CjwvYmxvY2txdW90ZT48L2Rpdj48L2Rpdj48L2Rpdj4K
PC9ibG9ja3F1b3RlPjwvZGl2Pjxicj48L2Rpdj4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div></blockquote></div>
</div></div></blockquote></div><br></div>
</blockquote></div>