RE: ASPELL aspell-0.60.8.1 compilation failure on MSYS2 + MINGW64

Vincent Belaïche <[email protected]> Thu, 15 May 2025 07:46:42 +0000
Newsgroups gmane.comp.gnu.aspell.devel
Message-ID <DBBP194MB1098F8898B7994A7BAEB9AE48490A@DBBP194MB1098.EURP194.PROD.OUTLOOK.COM>
--_004_DBBP194MB1098F8898B7994A7BAEB9AE48490ADBBP194MB1098EURP_
Content-Type: multipart/alternative;
	boundary="_000_DBBP194MB1098F8898B7994A7BAEB9AE48490ADBBP194MB1098EURP_"

--_000_DBBP194MB1098F8898B7994A7BAEB9AE48490ADBBP194MB1098EURP_
Content-Type: text/plain; charset="Windows-1252"
Content-Transfer-Encoding: quoted-printable

Dear Kevin,

Thank you for bringing aspell and for providing this patch. To give you the=
 full picture, the reason why I was trying to compile from source is that a=
spell installed on MSYS2 by means of pacman package manager did not work pr=
operly with Emacs ispell.el Emacs Lisp wrapper (which can use aspell, hunsp=
ell, etc=85)

After investigating why so, I found that although I had installed the Frenc=
h dictionary properly the =AB aspell dict =BB command made empty output. Af=
ter compiling from sources I had the same problem. Looking into this, I fou=
nd that the dictionary path was hard coded in some gen/dirs.h generated hea=
der as an MSYS2 path that cannot be understood by the aspell native Windows=
 application. When you compile on MINGW64 with no --prefix option passed to=
 configure you get this into gen/dirs.h :

#define PREFIX "/mingw64"

This problem can be easily circumvented by passing an absolute MSWindows pa=
th to configure, like this :

./configure '--prefix=3Dc:/msys64/mingw64'

as MSYS unerstands both native mixed path (mixed =3D just replacing \ by /)=
 and MSYS paths.

However, this could be automated by having somewhere in the m4/lib-link.m4 =
or m4/lib-prefix.m4 the appropriate autotools M4 macro for calling (cygpath=
 -m PREFIX) under the hood when the target is MINGW. This would certainly g=
reatly help MSYS2/pacman repo maintainers to compile aspell properly.

The other issue that I had is that Emacs ispell.el needs also to know where=
 the dictionaries are located because it builds some auto-completion list t=
o help the user select a dictionary amongst those available. To get this, E=
macs ispell calls =AB aspell -vv =BB and expects to find something like

LIBDIR =3D "c:/msys64/mingw64/lib/aspell-0.60"

in the output, where "c:/msys64/mingw64" is whatever prefix the user config=
ured at install. This also does not work, so I did some hack which I attach=
ed.

With all of these I could get aspell usable by Emacs.

   V.


________________________________
De : Kevin Atkinson <[email protected]>
Envoy=E9 : mercredi 14 mai 2025 07:27
=C0 : Vincent Bela=EFche <[email protected]>
Cc : [email protected] <[email protected]>
Objet : Re: ASPELL aspell-0.60.8.1 compilation failure on MSYS2 + MINGW64

I was finally able to test complication using MING64.

On Sat, 10 May 2025 14:03:49 +0000

Vincent Bela=EFche <[email protected]> wrote:

> Dear Kevin,
>
> Thank you for the link to the patch, I had a look at it, but in fact
> there is a simpler solution to fix this, simply add =AB#define
> _INTL_NO_DEFINE_MACRO_PRINTF=BB at the beginning of common/config.hpp.

Thanks for the tip.  A better place to put this is in
common/ostream.hpp as that is where the printf method is defined.

>
> With this addition the compilation goes farther, but then it stops
> again with this error :
>
> libtool: compile:  g++ -DHAVE_CONFIG_H -I. -I./gen -I./gen -I./common
> -I./interfaces/cc/ -I./modules/speller/default/
> -DLOCALEDIR=3D/mingw64/share/locale -I/mingw64/include -g -O2
> -fno-exceptions -MT modules/speller/default/language.lo -MD -MP -MF
> modules/speller/default/.deps/language.Tpo -c
> modules/speller/default/language.cpp  -DDLL_EXPORT -DPIC -o
> modules/speller/default/.libs/language.o
> modules/speller/default/language.cpp:24:12: fatal error: langinfo.h:
> No such file or directory 24 | #  include <langinfo.h> |
> ^~~~~~~~~~~~ compilation terminated.

To fix this change "#ifdef ENABLE_NLS" to "#ifdef
HAVE_LANGINFO_CODESET"

> So finally, what I did is run again configure with option
> --disable-nls, and I could compile aspell (with --disable-nls,
> compilation is successful even w/o the addition =AB#define
> _INTL_NO_DEFINE_MACRO_PRINTF=BB). So bad, I can't have the interface in
> French.

The attached patch got Aspell to compile for me without having to
disable NLS.

Kevin

--_000_DBBP194MB1098F8898B7994A7BAEB9AE48490ADBBP194MB1098EURP_
Content-Type: text/html; charset="Windows-1252"
Content-Transfer-Encoding: quoted-printable

<html>
<head>
<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3DWindows-1=
252">
<style type=3D"text/css" style=3D"display:none;"> P {margin-top:0;margin-bo=
ttom:0;} </style>
</head>
<body dir=3D"ltr">
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
Dear Kevin,</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
Thank you for bringing aspell and for providing this patch. To give you the=
 full picture, the reason why I was trying to compile from source is that a=
spell installed on MSYS2 by means of pacman package manager did not work pr=
operly with Emacs ispell.el Emacs
 Lisp wrapper (which can use aspell, hunspell, etc=85)</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
After investigating why so, I found that although I had installed the Frenc=
h dictionary properly the =AB aspell dict =BB command made empty output. Af=
ter compiling from sources I had the same problem. Looking into this, I fou=
nd that the dictionary path was hard
 coded in some gen/dirs.h generated header as an MSYS2 path that cannot be =
understood by the aspell native Windows application. When you compile on MI=
NGW64 with no --prefix option passed to configure you get this into gen/dir=
s.h :&nbsp;</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
#define PREFIX &quot;/mingw64&quot;</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
This problem can be easily circumvented by passing an absolute MSWindows pa=
th to configure, like this :&nbsp;</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
./configure '--prefix=3Dc:/msys64/mingw64'</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
as MSYS unerstands both native mixed path (mixed =3D just replacing \ by /)=
 and MSYS paths.</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
However, this could be automated by having somewhere in the m4/lib-link.m4 =
or m4/lib-prefix.m4 the appropriate autotools M4 macro for calling (cygpath=
 -m PREFIX) under the hood when the target is MINGW. This would certainly g=
reatly help MSYS2/pacman repo maintainers
 to compile aspell properly.<br>
<br>
</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
The other issue that I had is that Emacs ispell.el needs also to know where=
 the dictionaries are located because it builds some auto-completion list t=
o help the user select a dictionary amongst those available. To get this, E=
macs ispell calls =AB aspell -vv =BB
 and expects to find something like</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
LIBDIR =3D &quot;c:/msys64/mingw64/lib/aspell-0.60&quot;</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
in the output, where &quot;c:/msys64/mingw64&quot; is whatever prefix the u=
ser configured at install. This also does not work, so I did some hack whic=
h I attached.</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
With all of these I could get aspell usable by Emacs.</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
&nbsp; &nbsp;V.</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class=3D"elementToProof" style=3D"font-family: &quot;Courier New&quot;=
, monospace; font-size: 12pt; color: rgb(0, 0, 0);">
&nbsp;</div>
<div id=3D"appendonsend"></div>
<hr style=3D"display:inline-block;width:98%" tabindex=3D"-1">
<div id=3D"divRplyFwdMsg" dir=3D"ltr"><font face=3D"Calibri, sans-serif" st=
yle=3D"font-size:11pt" color=3D"#000000"><b>De :</b> Kevin Atkinson &lt;kev=
[email protected]&gt;<br>
<b>Envoy=E9 :</b> mercredi 14 mai 2025 07:27<br>
<b>=C0 :</b> Vincent Bela=EFche &lt;[email protected]&gt;<br>
<b>Cc&nbsp;:</b> [email protected] &lt;[email protected]&gt;<br>
<b>Objet :</b> Re: ASPELL aspell-0.60.8.1 compilation failure on MSYS2 + MI=
NGW64</font>
<div>&nbsp;</div>
</div>
<div class=3D"BodyFragment"><font size=3D"2"><span style=3D"font-size:11pt;=
">
<div class=3D"PlainText">I was finally able to test complication using MING=
64.<br>
<br>
On Sat, 10 May 2025 14:03:49 +0000<br>
<br>
Vincent Bela=EFche &lt;[email protected]&gt; wrote:<br>
<br>
&gt; Dear Kevin,<br>
&gt; <br>
&gt; Thank you for the link to the patch, I had a look at it, but in fact<b=
r>
&gt; there is a simpler solution to fix this, simply add =AB#define<br>
&gt; _INTL_NO_DEFINE_MACRO_PRINTF=BB at the beginning of common/config.hpp.=
<br>
<br>
Thanks for the tip.&nbsp; A better place to put this is in<br>
common/ostream.hpp as that is where the printf method is defined.<br>
<br>
&gt; <br>
&gt; With this addition the compilation goes farther, but then it stops<br>
&gt; again with this error :<br>
&gt; <br>
&gt; libtool: compile:&nbsp; g++ -DHAVE_CONFIG_H -I. -I./gen -I./gen -I./co=
mmon<br>
&gt; -I./interfaces/cc/ -I./modules/speller/default/<br>
&gt; -DLOCALEDIR=3D/mingw64/share/locale -I/mingw64/include -g -O2<br>
&gt; -fno-exceptions -MT modules/speller/default/language.lo -MD -MP -MF<br=
>
&gt; modules/speller/default/.deps/language.Tpo -c<br>
&gt; modules/speller/default/language.cpp&nbsp; -DDLL_EXPORT -DPIC -o<br>
&gt; modules/speller/default/.libs/language.o<br>
&gt; modules/speller/default/language.cpp:24:12: fatal error: langinfo.h:<b=
r>
&gt; No such file or directory 24 | #&nbsp; include &lt;langinfo.h&gt; |<br=
>
&gt; ^~~~~~~~~~~~ compilation terminated.<br>
<br>
To fix this change &quot;#ifdef ENABLE_NLS&quot; to &quot;#ifdef<br>
HAVE_LANGINFO_CODESET&quot;<br>
<br>
&gt; So finally, what I did is run again configure with option<br>
&gt; --disable-nls, and I could compile aspell (with --disable-nls,<br>
&gt; compilation is successful even w/o the addition =AB#define<br>
&gt; _INTL_NO_DEFINE_MACRO_PRINTF=BB). So bad, I can't have the interface i=
n<br>
&gt; French.<br>
<br>
The attached patch got Aspell to compile for me without having to<br>
disable NLS.<br>
<br>
Kevin<br>
</div>
</span></font></div>
</body>
</html>

--_000_DBBP194MB1098F8898B7994A7BAEB9AE48490ADBBP194MB1098EURP_--

--_004_DBBP194MB1098F8898B7994A7BAEB9AE48490ADBBP194MB1098EURP_
Content-Type: text/plain; name="aspell.cpp"
Content-Description: aspell.cpp
Content-Disposition: attachment; filename="aspell.cpp"; size=78962;
	creation-date="Thu, 15 May 2025 07:43:18 GMT";
	modification-date="Thu, 15 May 2025 07:44:33 GMT"
Content-Transfer-Encoding: base64

Ly8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgVGhlIE5ldyBBc3BlbGwgQ29weXJpZ2h0IChDKQovLyAy
MDAyLDIwMDMsMjAwNCwyMDExLDIwMTksMjAyMyBieSBLZXZpbiBBdGtpbnNvbgovLyB1bmRlciB0
aGUgR05VIExHUEwgbGljZW5zZSB2ZXJzaW9uIDIuMCBvciAyLjEuICBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYQovLyBjb3B5IG9mIHRoZSBMR1BMIGxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnkgaWYgeW91IGRpZCBub3QgeW91IGNhbgovLyBmaW5kIGl0IGF0IGh0dHA6Ly93d3cuZ251
Lm9yZy8uCgovLwovLyBOT1RFOiBUaGlzIHByb2dyYW0gY3VycmVudGx5IHVzZXMgYSB2ZXJ5IHVn
bHkgbWl4IG9mIHRoZSBpbnRlcm5hbAovLyAgICAgICBBUEkgYW5kIHRoZSBleHRlcm5hbCBDIGlu
dGVyZmFjZS4gIFRoZSBldmVudHVhbCBnb2FsIGlzIHRvCi8vICAgICAgIHVzZSBvbmx5IHRoZSBl
eHRlcm5hbCBDKysgaW50ZXJmYWNlLCBob3dldmVyLCB0aGUgZXh0ZXJuYWwKLy8gICAgICAgQysr
IGludGVyZmFjZSBpcyBjdXJyZW50bHkgaW5jb21wbGV0ZS4gIFRoZSBDIGludGVyZmFjZSBpcwov
LyAgICAgICB1c2VkIGluIHNvbWUgcGxhY2VzIGJlY2F1c2Ugd2l0aG91dCB0aGUgc3RyaW5ncyB3
aWxsIG5vdCBnZXQKLy8gICAgICAgY29udmVydGVkIHByb3Blcmx5IHdoZW4gdGhlIGVuY29kaW5n
IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUKLy8gICAgICAgaW50ZXJuYWwgZW5jb2RpbmcgdXNlZCBi
eSBBc3BlbGwuCi8vIAoKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlICJzZXR0aW5ncy5oIgoK
I2lmZGVmIFVTRV9MT0NBTEUKIyBpbmNsdWRlIDxsb2NhbGUuaD4KI2VuZGlmCgojaWZkZWYgSEFW
RV9MQU5HSU5GT19DT0RFU0VUCiMgaW5jbHVkZSA8bGFuZ2luZm8uaD4KI2VuZGlmCgojaW5jbHVk
ZSAiYXNwZWxsLmgiCgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5o
PgoKI2lmZGVmIFVTRV9GSUxFX0lOTwojIGluY2x1ZGUgPHVuaXN0ZC5oPgojIGluY2x1ZGUgPGZj
bnRsLmg+CiNlbmRpZgoKI2luY2x1ZGUgImFzY19jdHlwZS5ocHAiCiNpbmNsdWRlICJjaGVja19m
dW5zLmhwcCIKI2luY2x1ZGUgImNvbmZpZy5ocHAiCiNpbmNsdWRlICJjb252ZXJ0LmhwcCIKI2lu
Y2x1ZGUgImRvY3VtZW50X2NoZWNrZXIuaHBwIgojaW5jbHVkZSAiZW51bWVyYXRpb24uaHBwIgoj
aW5jbHVkZSAiZXJyb3JzLmhwcCIKI2luY2x1ZGUgImZpbGVfdXRpbC5ocHAiCiNpbmNsdWRlICJm
c3RyZWFtLmhwcCIKI2luY2x1ZGUgImluZm8uaHBwIgojaW5jbHVkZSAiaW9zdHJlYW0uaHBwIgoj
aW5jbHVkZSAicG9zaWJfZXJyLmhwcCIKI2luY2x1ZGUgInNwZWxsZXIuaHBwIgojaW5jbHVkZSAi
c3RhY2tfcHRyLmhwcCIKI2luY2x1ZGUgInN0cmluZ19lbnVtZXJhdGlvbi5ocHAiCiNpbmNsdWRl
ICJzdHJpbmdfbWFwLmhwcCIKI2luY2x1ZGUgIndvcmRfbGlzdC5ocHAiCiNpbmNsdWRlICJpc3Ry
ZWFtX2VudW1lcmF0aW9uLmhwcCIKCiNpbmNsdWRlICJzdHJpbmdfbGlzdC5ocHAiCiNpbmNsdWRl
ICJzcGVsbGVyX2ltcGwuaHBwIgojaW5jbHVkZSAiZGF0YS5ocHAiCgojaW5jbHVkZSAiaGFzaC10
LmhwcCIKI2luY2x1ZGUgImhhc2hfZnVuLmhwcCIKCiNpbmNsdWRlICJnZXR0ZXh0LmgiCgp1c2lu
ZyBuYW1lc3BhY2UgYWNvbW1vbjsKCnVzaW5nIGFzcGVsbGVyOjpDb252OwoKLy8gYWN0aW9uIGZ1
bmN0aW9ucyBkZWNsYXJhdGlvbnMKCnZvaWQgcHJpbnRfdmVyKGJvb2wgZXh0ZW5zaXZlX3ZlcnNp
b25faW5mbyA9IGZhbHNlKTsKdm9pZCBwcmludF9oZWxwKGJvb2wgdmVyYm9zZSA9IGZhbHNlKTsK
dm9pZCBjb25maWcoKTsKCnZvaWQgY2hlY2soKTsKdm9pZCBwaXBlKCk7CnZvaWQgY29udnQoKTsK
dm9pZCBub3JtbHooKTsKdm9pZCBmaWx0ZXIoKTsKdm9pZCBsaXN0KCk7CnZvaWQgZGljdHMoKTsK
dm9pZCBtb2RlcygpOwp2b2lkIGZpbHRlcnMoKTsKCnZvaWQgY2xlYW4oKTsKdm9pZCBtYXN0ZXIo
KTsKdm9pZCBwZXJzb25hbCgpOwp2b2lkIHJlcGwoKTsKdm9pZCBzb3VuZHNsaWtlKCk7CnZvaWQg
bXVuY2goKTsKdm9pZCBleHBhbmQoKTsKdm9pZCBjb21iaW5lKCk7CnZvaWQgbXVuY2hfbGlzdCgp
Owp2b2lkIGR1bXBfYWZmaXgoKTsKCnZvaWQgcHJpbnRfZXJyb3IoUGFybVN0cmluZyBtc2cpCnsK
ICBDRVJSLnByaW50ZihfKCJFcnJvcjogJXNcbiIpLCBtc2cuc3RyKCkpOwp9Cgp2b2lkIHByaW50
X2Vycm9yKFBhcm1TdHJpbmcgbXNnLCBQYXJtU3RyaW5nIHN0cikKewogIENFUlIucHV0KF8oIkVy
cm9yOiAiKSk7CiAgQ0VSUi5wcmludGYobXNnLnN0cigpLCBzdHIuc3RyKCkpOwogIENFUlIucHV0
KCdcbicpOwp9CgojZGVmaW5lIEVYSVRfT05fRVJSKGNvbW1hbmQpIFwKICBkb3tQb3NpYkVyckJh
c2UgcGUoY29tbWFuZCk7XAogIGlmKHBlLmhhc19lcnIoKSl7cHJpbnRfZXJyb3IocGUuZ2V0X2Vy
cigpLT5tZXNnKTsgZXhpdCgxKTt9XAogIH0gd2hpbGUoZmFsc2UpCiNkZWZpbmUgRVhJVF9PTl9F
UlJfU0VUKGNvbW1hbmQsIHR5cGUsIHZhcilcCiAgdHlwZSB2YXI7XAogIGRve1Bvc2liRXJyPCB0
eXBlID4gcGUoY29tbWFuZCk7XAogIGlmKHBlLmhhc19lcnIoKSl7cHJpbnRfZXJyb3IocGUuZ2V0
X2VycigpLT5tZXNnKTsgZXhpdCgxKTt9XAogIGVsc2Uge3Zhcj1wZS5kYXRhO31cCiAgfSB3aGls
ZShmYWxzZSkKI2RlZmluZSBCUkVBS19PTl9FUlIoY29tbWFuZCkgXAogIGRve1Bvc2liRXJyQmFz
ZSBwZShjb21tYW5kKTtcCiAgaWYocGUuaGFzX2VycigpKXtwcmludF9lcnJvcihwZS5nZXRfZXJy
KCktPm1lc2cpOyBicmVhazt9XAogIH0gd2hpbGUoZmFsc2UpCiNkZWZpbmUgQlJFQUtfT05fRVJS
X1NFVChjb21tYW5kLCB0eXBlLCB2YXIpXAogIHR5cGUgdmFyO1wKICBkb3tQb3NpYkVycjwgdHlw
ZSA+IHBlKGNvbW1hbmQpO1wKICBpZihwZS5oYXNfZXJyKCkpe3ByaW50X2Vycm9yKHBlLmdldF9l
cnIoKS0+bWVzZyk7IGJyZWFrO31cCiAgZWxzZSB7dmFyPXBlLmRhdGE7fVwKICB9IHdoaWxlKGZh
bHNlKQoKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLwovLwovLyBDb21tYW5kIGxpbmUgb3B0aW9ucyBmdW5jdGlvbnMgYW5kIGNsYXNzZXMK
Ly8gKGluY2x1ZGluZyBtYWluKQovLwoKdHlwZWRlZiBWZWN0b3I8U3RyaW5nPiBBcmdzOwp0eXBl
ZGVmIENvbmZpZyAgICAgICAgIE9wdGlvbnM7CmVudW0gQWN0aW9uIHtkb19jcmVhdGUsIGRvX21l
cmdlLCBkb19kdW1wLCBkb190ZXN0LCBkb19vdGhlcn07CgpBcmdzICAgICAgICAgICAgICBhcmdz
OwpTdGFja1B0cjxPcHRpb25zPiBvcHRpb25zOwpBY3Rpb24gICAgICAgICAgICBhY3Rpb24gID0g
ZG9fb3RoZXI7CgpzdHJ1Y3QgUG9zc2libGVPcHRpb24gewogIGNvbnN0IGNoYXIgKiBuYW1lOwog
IGNoYXIgICAgICAgICBhYnJ2OwogIGludCAgICAgICAgICBudW1fYXJnOwogIGJvb2wgICAgICAg
ICBpc19jb21tYW5kOwp9OwoKI2RlZmluZSBPUFRJT04obmFtZSxhYnJ2LG51bSkgICAgICAgICB7
bmFtZSxhYnJ2LG51bSxmYWxzZX0KI2RlZmluZSBDT01NQU5EKG5hbWUsYWJydixudW0pICAgICAg
ICB7bmFtZSxhYnJ2LG51bSx0cnVlfQojZGVmaW5lIElTUEVMTF9DT01QKGFicnYsbnVtKSAgICAg
ICAgIHsiIixhYnJ2LG51bSxmYWxzZX0KCmNvbnN0IFBvc3NpYmxlT3B0aW9uIHBvc3NpYmxlX29w
dGlvbnNbXSA9IHsKICBPUFRJT04oIm1hc3RlciIsICAgICAgICAgICAnZCcsIDEpLAogIE9QVElP
TigicGVyc29uYWwiLCAgICAgICAgICdwJywgMSksCiAgT1BUSU9OKCJpZ25vcmUiLCAgICAgICAg
ICAgJ1cnLCAxKSwKICBPUFRJT04oImxhbmciLCAgICAgICAgICAgICAnbCcsIDEpLAogIE9QVElP
TigiYmFja3VwIiwgICAgICAgICAgICdiJywgMCksCiAgT1BUSU9OKCJkb250LWJhY2t1cCIsICAg
ICAgJ3gnLCAwKSwKICBPUFRJT04oInJ1bi10b2dldGhlciIsICAgICAnQycsIDApLAogIE9QVElP
TigiZG9udC1ydW4tdG9nZXRoZXIiLCdCJywgMCksCiAgT1BUSU9OKCJndWVzcyIsICAgICAgICAg
ICAgJ20nLCAwKSwKICBPUFRJT04oImRvbnQtZ3Vlc3MiLCAgICAgICAnUCcsIDApLAogIAogIENP
TU1BTkQoInVzYWdlIiwgICAgICc/JywgIDApLAogIENPTU1BTkQoImhlbHAiLCAgICAgICdcMCcs
IDApLAogIENPTU1BTkQoInZlcnNpb24iLCAgICd2JywgIDApLAogIENPTU1BTkQoImNvbmZpZyIs
ICAgICdcMCcsIDApLAogIENPTU1BTkQoImRpY3RzIiwgICAgICdcMCcsIDApLAogIENPTU1BTkQo
ImNoZWNrIiwgICAgICdjJywgIDApLAogIENPTU1BTkQoInBpcGUiLCAgICAgICdhJywgIDApLAog
IENPTU1BTkQoImxpc3QiLCAgICAgICdcMCcsIDApLAogIENPTU1BTkQoImNvbnYiLCAgICAgICdc
MCcsIDIpLAogIENPTU1BTkQoIm5vcm0iLCAgICAgICdcMCcsIDEpLAogIENPTU1BTkQoImZpbHRl
ciIsICAgICdcMCcsIDApLAogIENPTU1BTkQoInNvdW5kc2xpa2UiLCdcMCcsIDApLAogIENPTU1B
TkQoIm11bmNoIiwgICAgICdcMCcsIDApLAogIENPTU1BTkQoImV4cGFuZCIsICAgICdcMCcsIDAp
LAogIENPTU1BTkQoImNvbWJpbmUiLCAgICdcMCcsIDApLAogIENPTU1BTkQoIm11bmNoLWxpc3Qi
LCdcMCcsIDApLAogIENPTU1BTkQoImNsZWFuIiwgICAgICdcMCcsIDApLAogIENPTU1BTkQoImZp
bHRlcnMiLCAgICdcMCcsIDApLAogIENPTU1BTkQoIm1vZGVzIiwgICAgICdcMCcsIDApLAoKICBD
T01NQU5EKCJkdW1wIiwgICAnXDAnLCAxKSwKICBDT01NQU5EKCJjcmVhdGUiLCAnXDAnLCAxKSwK
ICBDT01NQU5EKCJtZXJnZSIsICAnXDAnLCAxKSwKCiAgSVNQRUxMX0NPTVAoJ1MnLDApLCBJU1BF
TExfQ09NUCgndycsMSksIElTUEVMTF9DT01QKCdUJywxKSwKCiAgeyIiLCdcMCd9LCB7IiIsJ1ww
J30KfTsKCmNvbnN0IFBvc3NpYmxlT3B0aW9uICogcG9zc2libGVfb3B0aW9uc19lbmQgPSBwb3Nz
aWJsZV9vcHRpb25zICsgc2l6ZW9mKHBvc3NpYmxlX29wdGlvbnMpL3NpemVvZihQb3NzaWJsZU9w
dGlvbikgLSAyOwoKc3RydWN0IE1vZGVBYnJ2IHsKICBjaGFyIGFicnY7CiAgY29uc3QgY2hhciAq
IG1vZGU7CiAgY29uc3QgY2hhciAqIGRlc2M7Cn07CnN0YXRpYyBjb25zdCBNb2RlQWJydiBtb2Rl
X2FicnZzW10gPSB7CiAgeydlJywgIm1vZGU9ZW1haWwiLCBOXygiZW50ZXIgRW1haWwgbW9kZS4i
KX0sCiAgeydIJywgIm1vZGU9aHRtbCIsICBOXygiZW50ZXIgSFRNTCBtb2RlLiIpfSwKICB7J3Qn
LCAibW9kZT10ZXgiLCAgIE5fKCJlbnRlciBUZVggbW9kZS4iKX0sCiAgeyduJywgIm1vZGU9bnJv
ZmYiLCBOXygiZW50ZXIgTnJvZmYgbW9kZS4iKX0sCiAgeydNJywgIm1vZGU9bWFya2Rvd24iLCBO
XygiZW50ZXIgTWFya2Rvd24gbW9kZS4iKX0sCn07CgpzdGF0aWMgY29uc3QgTW9kZUFicnYgKiAg
bW9kZV9hYnJ2c19lbmQgPSBtb2RlX2FicnZzICsgc2l6ZW9mKG1vZGVfYWJydnMpL3NpemVvZihN
b2RlQWJydik7Cgpjb25zdCBQb3NzaWJsZU9wdGlvbiAqIGZpbmRfb3B0aW9uKGNoYXIgYykgewog
IGNvbnN0IFBvc3NpYmxlT3B0aW9uICogaSA9IHBvc3NpYmxlX29wdGlvbnM7CiAgd2hpbGUgKGkg
IT0gcG9zc2libGVfb3B0aW9uc19lbmQgJiYgaS0+YWJydiAhPSBjKSAKICAgICsraTsKICByZXR1
cm4gaTsKfQoKc3RhdGljIGlubGluZSBib29sIHN0cl9lcXVhbChjb25zdCBjaGFyICogYmVnaW4s
IGNvbnN0IGNoYXIgKiBlbmQsIAoJCQkgICAgIGNvbnN0IGNoYXIgKiBvdGhlcikgCnsKICB3aGls
ZShiZWdpbiAhPSBlbmQgJiYgKmJlZ2luID09ICpvdGhlcikKICAgICsrYmVnaW4sICsrb3RoZXI7
CiAgcmV0dXJuIChiZWdpbiA9PSBlbmQgJiYgKm90aGVyID09ICdcMCcpOwp9CgpzdGF0aWMgY29u
c3QgUG9zc2libGVPcHRpb24gKiBmaW5kX29wdGlvbihjb25zdCBjaGFyICogYmVnaW4sIGNvbnN0
IGNoYXIgKiBlbmQpIHsKICBjb25zdCBQb3NzaWJsZU9wdGlvbiAqIGkgPSBwb3NzaWJsZV9vcHRp
b25zOwogIHdoaWxlIChpICE9IHBvc3NpYmxlX29wdGlvbnNfZW5kIAoJICYmICFzdHJfZXF1YWwo
YmVnaW4sIGVuZCwgaS0+bmFtZSkpCiAgICArK2k7CiAgcmV0dXJuIGk7Cn0KCnN0YXRpYyBjb25z
dCBQb3NzaWJsZU9wdGlvbiAqIGZpbmRfb3B0aW9uKGNvbnN0IGNoYXIgKiBzdHIpIHsKICBjb25z
dCBQb3NzaWJsZU9wdGlvbiAqIGkgPSBwb3NzaWJsZV9vcHRpb25zOwogIHdoaWxlIChpICE9IHBv
c3NpYmxlX29wdGlvbnNfZW5kIAoJICYmIHN0cmNtcChzdHIsIGktPm5hbWUpICE9IDApCiAgICAr
K2k7CiAgcmV0dXJuIGk7Cn0KCnN0YXRpYyB2b2lkIGxpbmVfYnVmZmVyKCkgewojaWZuZGVmIFdJ
TjMyCiAgLy8gc2V0IHVwIHN0ZGluIGFuZCBzdGRvdXQgdG8gYmUgbGluZSBidWZmZXJlZAogIGFz
c2VydChzZXR2YnVmKHN0ZGluLCAwLCBfSU9MQkYsIDApID09IDApOyAKICBhc3NlcnQoc2V0dmJ1
ZihzdGRvdXQsIDAsIF9JT0xCRiwgMCkgPT0gMCk7CiNlbmRpZgp9CgpDb252IGRjb252OwpDb252
IHVpY29udjsKCmludCBtYWluIChpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSAKewogIG9w
dGlvbnMgPSBuZXdfY29uZmlnKCk7IC8vIHRoaXMgbmVlZHMgdG8gYmUgaGVyZSBiZWNhdXNlIG9m
IGEgYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBzdGF0aWMgaW5pdGxpemVy
cyBvbiBEYXJ3aW4uCiNpZmRlZiBVU0VfTE9DQUxFCiAgc2V0bG9jYWxlIChMQ19BTEwsICIiKTsK
I2VuZGlmCiAgYXNwZWxsX2dldHRleHRfaW5pdCgpOwoKICBvcHRpb25zLT5zZXRfY29tbWl0dGVk
X3N0YXRlKGZhbHNlKTsKCiAgaWYgKGFyZ2MgPT0gMSkge3ByaW50X2hlbHAoKTsgcmV0dXJuIDA7
fQoKICBpbnQgaSA9IDE7CiAgYm9vbCBleHRlbnNpdmVfdmVyc2lvbl9pbmZvID0gZmFsc2U7CiAg
Y29uc3QgUG9zc2libGVPcHRpb24gKiBvOwogIGNvbnN0IGNoYXIgICAgICAgICAgICogcGFybTsK
CiAgLy8KICAvLyBwcm9jZXNzIGNvbW1hbmQgbGluZSBvcHRpb25zIGJ5IHNldHRpbmcgdGhlIGFw
cHJvcHJpYXRlIG9wdGlvbnMKICAvLyBpbiAib3B0aW9ucyIgYW5kL29yIHB1c2hpbmcgbm9uLW9w
dGlvbnMgb250byAiYXJndiIKICAvLwogIFBvc3NpYmxlT3B0aW9uIG90aGVyX29wdCA9IE9QVElP
TigiIiwnXDAnLDApOwogIFN0cmluZyBvcHRpb25fbmFtZTsKICB3aGlsZSAoaSAhPSBhcmdjKSB7
CiAgICBpZiAoYXJndltpXVswXSA9PSAnLScpIHsKICAgICAgYm9vbCBoYXZlX3Bhcm0gPSBmYWxz
ZTsKICAgICAgaWYgKGFyZ3ZbaV1bMV0gPT0gJy0nKSB7CgkvLyBhIGxvbmcgYXJnCgljb25zdCBj
aGFyICogYyA9IGFyZ3ZbaV0gKyAyOwoJd2hpbGUoKmMgIT0gJz0nICYmICpjICE9ICdcMCcpICsr
YzsKCW8gPSBmaW5kX29wdGlvbihhcmd2W2ldICsgMiwgYyk7CglpZiAobyA9PSBwb3NzaWJsZV9v
cHRpb25zX2VuZCkgewoJICBvcHRpb25fbmFtZS5hc3NpZ24oYXJndltpXSArIDIsIGMgLSBhcmd2
W2ldIC0gMik7CiAgICAgICAgICBvdGhlcl9vcHQubmFtZSAgICA9IG9wdGlvbl9uYW1lLmNfc3Ry
KCk7CiAgICAgICAgICBvdGhlcl9vcHQubnVtX2FyZyA9IC0xOwogICAgICAgICAgbyA9ICZvdGhl
cl9vcHQ7Cgl9CglpZiAoKmMgPT0gJz0nKSB7aGF2ZV9wYXJtID0gdHJ1ZTsgKytjO30KCXBhcm0g
PSBjOwogICAgICB9IGVsc2UgewoJLy8gYSBzaG9ydCBhcmcKCWNvbnN0IE1vZGVBYnJ2ICogaiA9
IG1vZGVfYWJydnM7Cgl3aGlsZSAoaiAhPSBtb2RlX2FicnZzX2VuZCAmJiBqLT5hYnJ2ICE9IGFy
Z3ZbaV1bMV0pICsrajsKCWlmIChqID09IG1vZGVfYWJydnNfZW5kKSB7CgkgIG8gPSBmaW5kX29w
dGlvbihhcmd2W2ldWzFdKTsKCSAgaWYgKGFyZ3ZbaV1bMV0gPT0gJ3YnICYmIGFyZ3ZbaV1bMl0g
PT0gJ3YnKSB7CgkgICAgLy8gSGFjayBmb3IgLXZ2CgkgICAgcGFybSA9IGFyZ3ZbaV0gKyAzOwoJ
ICAgIGV4dGVuc2l2ZV92ZXJzaW9uX2luZm8gPSB0cnVlOwoJICB9CgkgIGVsc2UKCSAgICBwYXJt
ID0gYXJndltpXSArIDI7Cgl9IGVsc2UgeyAvLyBtb2RlIG9wdGlvbgoJICBvdGhlcl9vcHQubmFt
ZSA9ICJtb2RlIjsKCSAgb3RoZXJfb3B0Lm51bV9hcmcgPSAxOwoJICBvID0gJm90aGVyX29wdDsK
CSAgcGFybSA9IGotPm1vZGUgKyA1OwoJfQogICAgICAgIGlmICgqcGFybSkgaGF2ZV9wYXJtID0g
dHJ1ZTsKICAgICAgfQogICAgICBpZiAobyA9PSBwb3NzaWJsZV9vcHRpb25zX2VuZCkgewoJcHJp
bnRfZXJyb3IoXygiSW52YWxpZCBPcHRpb246ICVzIiksIGFyZ3ZbaV0pOwoJcmV0dXJuIDE7CiAg
ICAgIH0KICAgICAgaW50IG51bV9wYXJtczsKICAgICAgaWYgKG8tPm51bV9hcmcgPT0gMCkgewog
ICAgICAgIG51bV9wYXJtcyA9IDA7CglpZiAocGFybVswXSAhPSAnXDAnKSB7CgkgIHByaW50X2Vy
cm9yKF8oIiclcycgZG9lcyBub3QgdGFrZSBhbnkgcGFyYW1ldGVycy4iKSwKCQkgICAgICBTdHJp
bmcoYXJndltpXSwgcGFybSAtIGFyZ3ZbaV0pKTsKCSAgcmV0dXJuIDE7Cgl9CglpICs9IDE7CiAg
ICAgIH0gZWxzZSBpZiAoaGF2ZV9wYXJtKSB7CiAgICAgICAgbnVtX3Bhcm1zID0gMTsKICAgICAg
ICBpICs9IDE7CiAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT0gYXJnYyB8fCBhcmd2W2krMV1bMF0g
PT0gJy0nKSB7CiAgICAgICAgaWYgKG8tPm51bV9hcmcgPT0gLTEpIHsKICAgICAgICAgIG51bV9w
YXJtcyA9IDA7CiAgICAgICAgICBpICs9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHBy
aW50X2Vycm9yKF8oIllvdSBtdXN0IHNwZWNpZnkgYSBwYXJhbWV0ZXIgZm9yIFwiJXNcIi4iKSwg
YXJndltpXSk7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAg
ICAgICAgbnVtX3Bhcm1zID0gby0+bnVtX2FyZzsKICAgICAgICBwYXJtID0gYXJndltpICsgMV07
CiAgICAgICAgaSArPSAyOwogICAgICB9CiAgICAgIGlmIChvLT5pc19jb21tYW5kKSB7Cglhcmdz
LnB1c2hfYmFjayhvLT5uYW1lKTsKCWlmIChvLT5udW1fYXJnID09IDEpCgkgIGFyZ3MucHVzaF9i
YWNrKHBhcm0pOwogICAgICB9IGVsc2UgaWYgKG8tPm5hbWVbMF0gIT0gJ1wwJykgewogICAgICAg
IENvbmZpZzo6RW50cnkgKiBlbnRyeSA9IG5ldyBDb25maWc6OkVudHJ5OwogICAgICAgIGVudHJ5
LT5rZXkgPSBvLT5uYW1lOwogICAgICAgIGVudHJ5LT52YWx1ZSA9IHBhcm07CiAgICAgICAgZW50
cnktPm5lZWRfY29udiA9IHRydWU7CiAgICAgICAgaWYgKG51bV9wYXJtcyA9PSAtMSkgewogICAg
ICAgICAgZW50cnktPnBsYWNlX2hvbGRlciA9IGFyZ3Muc2l6ZSgpOwogICAgICAgICAgYXJncy5w
dXNoX2JhY2socGFybSk7CiAgICAgICAgfQogICAgICAgIG9wdGlvbnMtPnNldChlbnRyeSk7CiAg
ICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGFyZ3MucHVzaF9iYWNrKGFyZ3ZbaV0pOwogICAgICBp
ICs9IDE7CiAgICB9CiAgfQoKICBFWElUX09OX0VSUihvcHRpb25zLT5yZWFkX2luX3NldHRpbmdz
KCkpOwoKICBjb25zdCBjaGFyICogY29kZXNldCA9IDA7CiNpZmRlZiBIQVZFX0xBTkdJTkZPX0NP
REVTRVQKICBjb2Rlc2V0ID0gbmxfbGFuZ2luZm8oQ09ERVNFVCk7CiAgaWYgKGFzY2lpX2VuY29k
aW5nKCpvcHRpb25zLCBjb2Rlc2V0KSkgY29kZXNldCA9IDA7CiNlbmRpZgoKLy8gI2lmZGVmIFVT
RV9MT0NBTEUKLy8gICBpZiAoIW9wdGlvbnMtPmhhdmUoImVuY29kaW5nIikgJiYgY29kZXNldCkK
Ly8gICAgIEVYSVRfT05fRVJSKG9wdGlvbnMtPnJlcGxhY2UoImVuY29kaW5nIiwgY29kZXNldCkp
OwovLyAjZW5kaWYKCiAgVmVjdG9yPGludD4gdG9fcmVtb3ZlOwogIEVYSVRfT05fRVJSKG9wdGlv
bnMtPmNvbW1pdF9hbGwoJnRvX3JlbW92ZSwgY29kZXNldCkpOwogIGZvciAoaW50IGkgPSB0b19y
ZW1vdmUuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgIGFyZ3MuZXJhc2UoYXJncy5iZWdp
bigpICsgdG9fcmVtb3ZlW2ldKTsKICB9CgogIGlmIChhcmdzLmVtcHR5KCkpIHsKICAgIHByaW50
X2Vycm9yKF8oIllvdSBtdXN0IHNwZWNpZnkgYW4gYWN0aW9uIikpOwogICAgcmV0dXJuIDE7CiAg
fQoKICBTdHJpbmcgYWN0aW9uX3N0ciA9IGFyZ3MuZnJvbnQoKTsKICBhcmdzLnBvcF9mcm9udCgp
OwogIGNvbnN0IFBvc3NpYmxlT3B0aW9uICogYWN0aW9uX29wdCA9IGZpbmRfb3B0aW9uKGFjdGlv
bl9zdHIuc3RyKCkpOwogIGlmICghYWN0aW9uX29wdC0+aXNfY29tbWFuZCkgewogICAgcHJpbnRf
ZXJyb3IoXygiVW5rbm93biBBY3Rpb246ICVzIiksICBhY3Rpb25fc3RyKTsKICAgIHJldHVybiAx
OwogIH0gZWxzZSBpZiAoYWN0aW9uX29wdC0+bnVtX2FyZyA9PSAxICYmIGFyZ3MuZW1wdHkoKSkg
ewogICAgcHJpbnRfZXJyb3IoXygiWW91IG11c3Qgc3BlY2lmeSBhIHBhcmFtZXRlciBmb3IgXCIl
c1wiLiIpLCBhY3Rpb25fc3RyKTsKICAgIHJldHVybiAxOwogIH0gZWxzZSBpZiAoYWN0aW9uX29w
dC0+bnVtX2FyZyA+IChpbnQpYXJncy5zaXplKCkpIHsKICAgIENFUlIucHJpbnRmKF8oIkVycm9y
OiBZb3UgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0ICVkIHBhcmFtZXRlcnMgZm9yIFwiJXNcIi5cbiIp
LCAKICAgICAgICAgICAgICAgIGFjdGlvbl9vcHQtPm51bV9hcmcsIGFjdGlvbl9zdHIuc3RyKCkp
OwogICAgcmV0dXJuIDE7CiAgfQoKICAvLwogIC8vIHBlcmZvcm0gdGhlIHJlcXVlc3RlZCBhY3Rp
b24KICAvLwogIGlmIChhY3Rpb25fc3RyID09ICJ1c2FnZSIpCiAgICBwcmludF9oZWxwKCk7CiAg
ZWxzZSBpZiAoYWN0aW9uX3N0ciA9PSAiaGVscCIpCiAgICBwcmludF9oZWxwKHRydWUpOwogIGVs
c2UgaWYgKGFjdGlvbl9zdHIgPT0gInZlcnNpb24iKQogICAgcHJpbnRfdmVyKGV4dGVuc2l2ZV92
ZXJzaW9uX2luZm8pOwogIGVsc2UgaWYgKGFjdGlvbl9zdHIgPT0gImNvbmZpZyIpCiAgICBjb25m
aWcoKTsKICBlbHNlIGlmIChhY3Rpb25fc3RyID09ICJkaWN0cyIpCiAgICBkaWN0cygpOwogIGVs
c2UgaWYgKGFjdGlvbl9zdHIgPT0gImNoZWNrIikKICAgIGNoZWNrKCk7CiAgZWxzZSBpZiAoYWN0
aW9uX3N0ciA9PSAicGlwZSIpCiAgICBwaXBlKCk7CiAgZWxzZSBpZiAoYWN0aW9uX3N0ciA9PSAi
bGlzdCIpCiAgICBsaXN0KCk7CiAgZWxzZSBpZiAoYWN0aW9uX3N0ciA9PSAiY29udiIpCiAgICBj
b252dCgpOwogIGVsc2UgaWYgKGFjdGlvbl9zdHIgPT0gIm5vcm0iKQogICAgbm9ybWx6KCk7CiAg
ZWxzZSBpZiAoYWN0aW9uX3N0ciA9PSAiZmlsdGVyIikKICAgIGZpbHRlcigpOwogIGVsc2UgaWYg
KGFjdGlvbl9zdHIgPT0gInNvdW5kc2xpa2UiKQogICAgc291bmRzbGlrZSgpOwogIGVsc2UgaWYg
KGFjdGlvbl9zdHIgPT0gIm11bmNoIikKICAgIG11bmNoKCk7CiAgZWxzZSBpZiAoYWN0aW9uX3N0
ciA9PSAiZXhwYW5kIikKICAgIGV4cGFuZCgpOwogIGVsc2UgaWYgKGFjdGlvbl9zdHIgPT0gImNv
bWJpbmUiKQogICAgY29tYmluZSgpOwogIGVsc2UgaWYgKGFjdGlvbl9zdHIgPT0gIm11bmNoLWxp
c3QiKQogICAgbXVuY2hfbGlzdCgpOwogIGVsc2UgaWYgKGFjdGlvbl9zdHIgPT0gImNsZWFuIikK
ICAgIGNsZWFuKCk7CiAgZWxzZSBpZiAoYWN0aW9uX3N0ciA9PSAiZmlsdGVycyIpCiAgICBmaWx0
ZXJzKCk7CiAgZWxzZSBpZiAoYWN0aW9uX3N0ciA9PSAibW9kZXMiKQogICAgbW9kZXMoKTsKICBl
bHNlIGlmIChhY3Rpb25fc3RyID09ICJkdW1wIikKICAgIGFjdGlvbiA9IGRvX2R1bXA7CiAgZWxz
ZSBpZiAoYWN0aW9uX3N0ciA9PSAiY3JlYXRlIikKICAgIGFjdGlvbiA9IGRvX2NyZWF0ZTsKICBl
bHNlIGlmIChhY3Rpb25fc3RyID09ICJtZXJnZSIpCiAgICBhY3Rpb24gPSBkb19tZXJnZTsKICBl
bHNlCiAgICBhYm9ydCgpOyAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuCgogIGlmIChhY3Rpb24g
IT0gZG9fb3RoZXIpIHsKICAgIGlmIChhcmdzLmVtcHR5KCkpIHsKICAgICAgcHJpbnRfZXJyb3Io
XygiVW5rbm93biBBY3Rpb246ICVzIiksICBhY3Rpb25fc3RyKTsKICAgICAgcmV0dXJuIDE7CiAg
ICB9CiAgICBTdHJpbmcgd2hhdF9zdHIgPSBhcmdzLmZyb250KCk7CiAgICBhcmdzLnBvcF9mcm9u
dCgpOwogICAgaWYgKHdoYXRfc3RyID09ICJjb25maWciKQogICAgICBjb25maWcoKTsKICAgIGVs
c2UgaWYgKHdoYXRfc3RyID09ICJkaWN0cyIpCiAgICAgIGRpY3RzKCk7CiAgICBlbHNlIGlmICh3
aGF0X3N0ciA9PSAiZmlsdGVycyIpCiAgICAgIGZpbHRlcnMoKTsKICAgIGVsc2UgaWYgKHdoYXRf
c3RyID09ICJtb2RlcyIpCiAgICAgIG1vZGVzKCk7CiAgICBlbHNlIGlmICh3aGF0X3N0ciA9PSAi
bWFzdGVyIikKICAgICAgbWFzdGVyKCk7CiAgICBlbHNlIGlmICh3aGF0X3N0ciA9PSAicGVyc29u
YWwiKQogICAgICBwZXJzb25hbCgpOwogICAgZWxzZSBpZiAod2hhdF9zdHIgPT0gInJlcGwiKQog
ICAgICByZXBsKCk7CiAgICBlbHNlIGlmICh3aGF0X3N0ciA9PSAiYWZmaXgiKQogICAgICBkdW1w
X2FmZml4KCk7CiAgICBlbHNlIHsKICAgICAgcHJpbnRfZXJyb3IoXygiVW5rbm93biBBY3Rpb246
ICVzIiksCgkJICBTdHJpbmcoYWN0aW9uX3N0ciArICIgIiArIHdoYXRfc3RyKSk7CiAgICAgIHJl
dHVybiAxOwogICAgfQogIH0KCiAgcmV0dXJuIDA7Cgp9CgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vCi8vIEFjdGlvbiBGdW5jdGlv
bnMKLy8KLy8KCiAgCnN0YXRpYyBDb252ZXJ0ICogc2V0dXBfY29udihjb25zdCBhc3BlbGxlcjo6
TGFuZ3VhZ2UgKiBsYW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnICogY29u
ZmlnKQp7CiAgaWYgKGNvbmZpZy0+cmV0cmlldmUoImVuY29kaW5nIikgIT0gIm5vbmUiKSB7CiAg
ICBQb3NpYkVycjxDb252ZXJ0ICo+IHBlID0gbmV3X2NvbnZlcnRfaWZfbmVlZGVkKCpjb25maWcs
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmct
PmNoYXJtYXAoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29uZmlnLT5yZXRyaWV2ZSgiZW5jb2RpbmciKSwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ybVRvKTsKICAgIGlmIChwZS5oYXNfZXJy
KCkpIHtwcmludF9lcnJvcihwZS5nZXRfZXJyKCktPm1lc2cpOyBleGl0KDEpO30KICAgIHJldHVy
biBwZS5kYXRhOwogIH0gZWxzZSB7CiAgICByZXR1cm4gMDsKICB9Cn0KCnN0YXRpYyBDb252ZXJ0
ICogc2V0dXBfY29udihDb25maWcgKiBjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBhc3BlbGxlcjo6TGFuZ3VhZ2UgKiBsYW5nKQp7CiAgaWYgKGNvbmZpZy0+cmV0cmll
dmUoImVuY29kaW5nIikgIT0gIm5vbmUiKSB7CiAgICBQb3NpYkVycjxDb252ZXJ0ICo+IHBlID0g
bmV3X2NvbnZlcnRfaWZfbmVlZGVkKCpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+cmV0cmlldmUoImVuY29kaW5nIiksCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmctPmNo
YXJtYXAoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgTm9ybUZyb20pOwogICAgaWYgKHBlLmhhc19lcnIoKSkge3ByaW50X2Vycm9yKHBlLmdldF9l
cnIoKS0+bWVzZyk7IGV4aXQoMSk7fQogICAgcmV0dXJuIHBlLmRhdGE7CiAgfSBlbHNlIHsKICAg
IHJldHVybiAwOwogIH0KfQoKdm9pZCBzZXR1cF9kaXNwbGF5X2NvbnYoKQp7CiAgY29uc3QgY2hh
ciAqIGdldHRleHRfZW5jID0gMDsKICBjb25zdCBjaGFyICogZW52X2VuYyA9IDA7CiAgU3RyaW5n
IGRvY19lbmMgPSBvcHRpb25zLT5yZXRyaWV2ZSgiZW5jb2RpbmciKTsKICBTdHJpbmcgZW5jOwoj
aWZkZWYgRU5BQkxFX05MUwogIGdldHRleHRfZW5jID0gYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQo
ImFzcGVsbCIsIDApOwogIGlmIChhc2NpaV9lbmNvZGluZygqb3B0aW9ucyxnZXR0ZXh0X2VuYykp
IGdldHRleHRfZW5jID0gMDsKI2VuZGlmCiNpZmRlZiBIQVZFX0xBTkdJTkZPX0NPREVTRVQKICBl
bnZfZW5jID0gbmxfbGFuZ2luZm8oQ09ERVNFVCk7CiAgaWYgKGFzY2lpX2VuY29kaW5nKCpvcHRp
b25zLCBlbnZfZW5jKSkgZW52X2VuYyA9IDA7CiNlbmRpZgogIGlmIChnZXR0ZXh0X2VuYyAmJiBl
bnZfZW5jICYmIHN0cmNtcChnZXR0ZXh0X2VuYyxlbnZfZW5jKSAhPSAwKSAKICB7CiAgICBmcHV0
cygoIkVycm9yOiBiaW5kX3RleHRkb21haW5fY29kZXNldCAhPSBubF9sYW5naW5mbyhDT0RFU0VU
KVxuIiksIHN0ZGVycik7CiAgICBleGl0KC0xKTsKICB9CiAgaWYgKGdldHRleHRfZW5jKQogICAg
ZW5jID0gZ2V0dGV4dF9lbmM7CiAgZWxzZSBpZiAoZW52X2VuYykKICAgIGVuYyA9IGVudl9lbmM7
CiAgZWxzZQogICAgZW5jID0gZG9jX2VuYzsKCiAgRVhJVF9PTl9FUlIoZGNvbnYuc2V0dXAoKm9w
dGlvbnMsIGRvY19lbmMsIGVuYywgTm9ybU5vbmUpKTsKICBFWElUX09OX0VSUih1aWNvbnYuc2V0
dXAoKm9wdGlvbnMsIGVuYywgZG9jX2VuYywgTm9ybU5vbmUpKTsKfQoKCi8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLwovLwovLyBjb25maWcKLy8KCnZvaWQgY29uZmlnICgpCnsKICBpZiAoYXJn
cy5zaXplKCkgPT0gMCkgewogICAgbG9hZF9hbGxfZmlsdGVycyhvcHRpb25zKTsKICAgIG9wdGlv
bnMtPndyaXRlX3RvX3N0cmVhbShDT1VUKTsKICB9IGVsc2UgewogICAgRVhJVF9PTl9FUlJfU0VU
KG9wdGlvbnMtPnJldHJpZXZlX2FueShhcmdzWzBdKSwgU3RyaW5nLCB2YWx1ZSk7CiAgICBDT1VU
IDw8IHZhbHVlIDw8ICJcbiI7CiAgfQp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8K
Ly8gZGljdHMKLy8KCnZvaWQgZGljdHMoKSAKewogIGNvbnN0IERpY3RJbmZvTGlzdCAqIGRsaXN0
ID0gZ2V0X2RpY3RfaW5mb19saXN0KG9wdGlvbnMpOwoKICBTdGFja1B0cjxEaWN0SW5mb0VudW1l
cmF0aW9uPiBkZWxzKGRsaXN0LT5lbGVtZW50cygpKTsKCiAgY29uc3QgRGljdEluZm8gKiBlbnRy
eTsKCiAgd2hpbGUgKCAoZW50cnkgPSBkZWxzLT5uZXh0KCkpICE9IDApIAogICAgcHV0cyhlbnRy
eS0+bmFtZSk7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBsaXN0IGF2YWls
YWJsZSAoZmlsdGVycy9maWx0ZXIgbW9kZXMpCi8vCgp2b2lkIGxpc3RfYXZhaWxhYmxlKFBvc2li
RXJyPFN0cmluZ1BhaXJFbnVtZXJhdGlvbiAqPiAoKmZ1bikoQ29uZmlnICopKQp7CiAgRVhJVF9P
Tl9FUlJfU0VUKGZ1bihvcHRpb25zKSwgU3RyaW5nUGFpckVudW1lcmF0aW9uICosIGVscyk7CiAg
U3RyaW5nUGFpciBzcDsKICB3aGlsZSAoIWVscy0+YXRfZW5kKCkpIHsKICAgIHNwID0gZWxzLT5u
ZXh0KCk7CiAgICBwcmludGYoIiUtMTRzICVzXG4iLCBzcC5maXJzdCwgZ3RfKHNwLnNlY29uZCkp
OwogIH0KICBkZWxldGUgZWxzOwp9Cgp2b2lkIGZpbHRlcnMoKQp7CiAgbG9hZF9hbGxfZmlsdGVy
cyhvcHRpb25zKTsKICBsaXN0X2F2YWlsYWJsZShhdmFpbGFibGVfZmlsdGVycyk7Cn0KCnZvaWQg
bW9kZXMoKQp7CiAgbGlzdF9hdmFpbGFibGUoYXZhaWxhYmxlX2ZpbHRlcl9tb2Rlcyk7Cn0KCi8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBwaXBlCi8vCgovLyBwcmVjb25kOiBzdHJs
ZW4oc3RyKSA+IDAKY2hhciAqIHRyaW1fd3NwYWNlIChjaGFyICogc3RyKQp7CiAgaW50IGxhc3Qg
PSBzdHJsZW4oc3RyKSAtIDE7CiAgd2hpbGUgKGFzY19pc3NwYWNlKHN0clswXSkpIHsKICAgICsr
c3RyOwogICAgLS1sYXN0OwogIH0KICB3aGlsZSAobGFzdCA+IDAgJiYgYXNjX2lzc3BhY2Uoc3Ry
W2xhc3RdKSkgewogICAgLS1sYXN0OwogIH0KICBzdHJbbGFzdCArIDFdID0gJ1wwJzsKICByZXR1
cm4gc3RyOwp9Cgpib29sIGdldF93b3JkX3BhaXIoY2hhciAqIGxpbmUsIGNoYXIgKiAmIHcxLCBj
aGFyICogJiB3MikKewogIHcyID0gc3RyY2hyKGxpbmUsICcsJyk7CiAgaWYgKCF3MikgewogICAg
cHJpbnRfZXJyb3IoXygiSW52YWxpZCBJbnB1dCIpKTsKICAgIHJldHVybiBmYWxzZTsKICB9CiAg
KncyID0gJ1wwJzsKICArK3cyOwogIHcxID0gdHJpbV93c3BhY2UobGluZSk7CiAgdzIgPSB0cmlt
X3dzcGFjZSh3Mik7CiAgcmV0dXJuIHRydWU7Cn0KCnZvaWQgcHJpbnRfZWxlbWVudHMoY29uc3Qg
QXNwZWxsV29yZExpc3QgKiB3bCkgewogIEFzcGVsbFN0cmluZ0VudW1lcmF0aW9uICogZWxzID0g
YXNwZWxsX3dvcmRfbGlzdF9lbGVtZW50cyh3bCk7CiAgaW50IGNvdW50ID0gMDsKICBjb25zdCBj
aGFyICogdzsKICBTdHJpbmcgbGluZTsKICB3aGlsZSAoICh3ID0gYXNwZWxsX3N0cmluZ19lbnVt
ZXJhdGlvbl9uZXh0KGVscykpICE9IDAgKSB7CiAgICArK2NvdW50OwogICAgbGluZSArPSB3Owog
ICAgbGluZSArPSAiLCAiOwogIH0KICBsaW5lLnJlc2l6ZShsaW5lLnNpemUoKSAtIDIpOwogIENP
VVQucHJpbnRmKCIldTogJXNcbiIsIGNvdW50LCBsaW5lLmNfc3RyKCkpOwp9CgpzdHJ1Y3QgU3Rh
dHVzRnVuSW5mIAp7CiAgYXNwZWxsZXI6OlNwZWxsZXJJbXBsICogcmVhbF9zcGVsbGVyOwogIENv
bnYgb2NvbnY7CiAgYm9vbCB2ZXJib3NlOwogIFN0YXR1c0Z1bkluZihDb252ZXJ0ICogYykgOiBv
Y29udihjKSB7fQp9OwoKdm9pZCBzdGF0dXNfZnVuKHZvaWQgKiBkLCBUb2tlbiwgaW50IGNvcnJl
Y3QpCnsKICBTdGF0dXNGdW5JbmYgKiBwID0gc3RhdGljX2Nhc3Q8U3RhdHVzRnVuSW5mICo+KGQp
OwogIGlmIChwLT52ZXJib3NlICYmIGNvcnJlY3QpIHsKICAgIGNvbnN0IENoZWNrSW5mbyAqIGNp
ID0gcC0+cmVhbF9zcGVsbGVyLT5jaGVja19pbmZvKCk7CiAgICBpZiAoY2ktPmNvbXBvdW5kKQog
ICAgICBDT1VULnB1dCgiLVxuIik7CiAgICBlbHNlIGlmIChjaS0+cHJlX2ZsYWcgfHwgY2ktPnN1
Zl9mbGFnKQogICAgICBDT1VULnByaW50ZigiKyAlc1xuIiwgcC0+b2NvbnYoY2ktPndvcmQuc3Ry
LCBjaS0+d29yZC5sZW4pKTsKICAgIGVsc2UKICAgICAgQ09VVC5wdXQoIipcbiIpOwogIH0KfQoK
RG9jdW1lbnRDaGVja2VyICogbmV3X2NoZWNrZXIoQXNwZWxsU3BlbGxlciAqIHNwZWxsZXIsIAoJ
CQkgICAgICBTdGF0dXNGdW5JbmYgJiBzdGF0dXNfZnVuX2luZikgCnsKICBFWElUX09OX0VSUl9T
RVQobmV3X2RvY3VtZW50X2NoZWNrZXIocmVpbnRlcnByZXRfY2FzdDxTcGVsbGVyICo+KHNwZWxs
ZXIpKSwKCQkgIFN0YWNrUHRyPERvY3VtZW50Q2hlY2tlcj4sIGNoZWNrZXIpOwogIGNoZWNrZXIt
PnNldF9zdGF0dXNfZnVuKHN0YXR1c19mdW4sICZzdGF0dXNfZnVuX2luZik7CiAgcmV0dXJuIGNo
ZWNrZXIucmVsZWFzZSgpOwp9CgojZGVmaW5lIEJSRUFLX09OX1NQRUxMRVJfRVJSXAogIGRvIHtp
ZiAoYXNwZWxsX3NwZWxsZXJfZXJyb3Ioc3BlbGxlcikpIHtcCiAgICBwcmludF9lcnJvcihhc3Bl
bGxfc3BlbGxlcl9lcnJvcl9tZXNzYWdlKHNwZWxsZXIpKTsgYnJlYWs7XAogIH0gfSB3aGlsZSAo
ZmFsc2UpCgp2b2lkIHBpcGUoKSAKewogIGxpbmVfYnVmZmVyKCk7CgogIGJvb2wgdGVyc2VfbW9k
ZSA9IHRydWU7CiAgYm9vbCBkb190aW1lID0gb3B0aW9ucy0+cmV0cmlldmVfYm9vbCgidGltZSIp
OwogIGJvb2wgc3VnZ2VzdCA9IG9wdGlvbnMtPnJldHJpZXZlX2Jvb2woInN1Z2dlc3QiKTsKICBi
b29sIGluY2x1ZGVfZ3Vlc3NlcyA9IG9wdGlvbnMtPnJldHJpZXZlX2Jvb2woImd1ZXNzIik7CiAg
Y2xvY2tfdCBzdGFydCxmaW5pc2g7CgogIGlmICghb3B0aW9ucy0+aGF2ZSgibW9kZSIpICYmICFv
cHRpb25zLT5oYXZlKCJmaWx0ZXIiKSkgewogICAgUG9zaWJFcnJCYXNlIGVycihvcHRpb25zLT5y
ZXBsYWNlKCJtb2RlIiwgIm5yb2ZmIikpOwogICAgaWYgKGVyci5oYXNfZXJyKCkpIAogICAgICBD
RVJSLnByaW50ZihfKCJXQVJOSU5HOiBVbmFibGUgdG8gZW50ZXIgTnJvZmYgbW9kZTogJXNcbiIp
LAogICAgICAgICAgICAgICAgICBlcnIuZ2V0X2VycigpLT5tZXNnKTsKICB9CgogIHN0YXJ0ID0g
Y2xvY2soKTsKICAKICBBc3BlbGxDYW5IYXZlRXJyb3IgKiByZXQgCiAgICA9IG5ld19hc3BlbGxf
c3BlbGxlcihyZWludGVycHJldF9jYXN0PEFzcGVsbENvbmZpZyAqPihvcHRpb25zLmdldCgpKSk7
CiAgaWYgKGFzcGVsbF9lcnJvcihyZXQpKSB7CiAgICBwcmludF9lcnJvcihhc3BlbGxfZXJyb3Jf
bWVzc2FnZShyZXQpKTsKICAgIGV4aXQoMSk7CiAgfQogIEFzcGVsbFNwZWxsZXIgKiBzcGVsbGVy
ID0gdG9fYXNwZWxsX3NwZWxsZXIocmV0KTsKICBhc3BlbGxlcjo6U3BlbGxlckltcGwgKiByZWFs
X3NwZWxsZXIgPSByZWludGVycHJldF9jYXN0PGFzcGVsbGVyOjpTcGVsbGVySW1wbCAqPihzcGVs
bGVyKTsKICBDb25maWcgKiBjb25maWcgPSByZWFsX3NwZWxsZXItPmNvbmZpZygpOwogIENvbnYg
aWNvbnYoc2V0dXBfY29udihjb25maWcsICZyZWFsX3NwZWxsZXItPmxhbmcoKSkpOwogIENvbnYg
b2NvbnYoc2V0dXBfY29udigmcmVhbF9zcGVsbGVyLT5sYW5nKCksIGNvbmZpZykpOwogIE1CTGVu
IG1iX2xlbjsKICBpZiAoIWNvbmZpZy0+cmV0cmlldmVfYm9vbCgiYnl0ZS1vZmZzZXRzIikpIAog
ICAgbWJfbGVuLnNldHVwKCpjb25maWcsIGNvbmZpZy0+cmV0cmlldmUoImVuY29kaW5nIikpOwog
IGlmIChkb190aW1lKQogICAgQ09VVCA8PCBfKCJUaW1lIHRvIGxvYWQgd29yZCBsaXN0OiAiKQog
ICAgICAgICA8PCAoY2xvY2soKSAtIHN0YXJ0KS8oZG91YmxlKUNMT0NLU19QRVJfU0VDIDw8ICJc
biI7CiAgU3RhdHVzRnVuSW5mIHN0YXR1c19mdW5faW5mKHNldHVwX2NvbnYoJnJlYWxfc3BlbGxl
ci0+bGFuZygpLCBjb25maWcpKTsKICBzdGF0dXNfZnVuX2luZi5yZWFsX3NwZWxsZXIgPSByZWFs
X3NwZWxsZXI7CiAgYm9vbCAmIHByaW50X3N0YXIgPSBzdGF0dXNfZnVuX2luZi52ZXJib3NlOwog
IHByaW50X3N0YXIgPSB0cnVlOwogIFN0YWNrUHRyPERvY3VtZW50Q2hlY2tlcj4gY2hlY2tlcihu
ZXdfY2hlY2tlcihzcGVsbGVyLCBzdGF0dXNfZnVuX2luZikpOwogIGludCBjOwogIGNvbnN0IGNo
YXIgKiB3OwogIENoYXJWZWN0b3IgYnVmOwogIGNoYXIgKiBsaW5lOwogIGNoYXIgKiBsaW5lMDsK
ICBjaGFyICogd29yZDsKICBjaGFyICogd29yZDI7CiAgaW50ICAgIGlnbm9yZTsKICBQb3NpYkVy
ckJhc2UgZXJyOwoKICBwcmludF92ZXIoKTsKCiAgZm9yICg7OykgewogICAgYnVmLmNsZWFyKCk7
CiAgICBmZmx1c2goc3Rkb3V0KTsKICAgIHdoaWxlIChjID0gZ2V0Y2hhcigpLCBjICE9ICdcbicg
JiYgYyAhPSBFT0YpCiAgICAgIGJ1Zi5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oYykpOwog
ICAgYnVmLnB1c2hfYmFjaygnXG4nKTsgLy8gYWx3YXlzIGFkZCBuZXcgbGluZSBzbyBzdHJsZW4g
PiAwCiAgICBidWYucHVzaF9iYWNrKCdcMCcpOwogICAgLy9DRVJSLnByaW50ZigiJXMiLCBidWYu
ZGF0YSgpKTsKICAgIGxpbmUgPSBidWYuZGF0YSgpOwogICAgaWdub3JlID0gMDsKICAgIHN3aXRj
aCAobGluZVswXSkgewogICAgY2FzZSAnXG4nOgogICAgICBpZiAoYyAhPSBFT0YpIGNvbnRpbnVl
OwogICAgICBlbHNlICAgICAgICAgIGJyZWFrOwogICAgY2FzZSAnKic6CiAgICAgIHdvcmQgPSB0
cmltX3dzcGFjZShsaW5lICsgMSk7CiAgICAgIGFzcGVsbF9zcGVsbGVyX2FkZF90b19wZXJzb25h
bChzcGVsbGVyLCB3b3JkLCAtMSk7CiAgICAgIEJSRUFLX09OX1NQRUxMRVJfRVJSOwogICAgICBi
cmVhazsKICAgIGNhc2UgJyYnOgogICAgICB3b3JkID0gdHJpbV93c3BhY2UobGluZSArIDEpOwog
ICAgICBhc3BlbGxfc3BlbGxlcl9hZGRfdG9fcGVyc29uYWwKCShzcGVsbGVyLCAKCSByZWFsX3Nw
ZWxsZXItPnRvX2xvd2VyKHdvcmQpLCAtMSk7CiAgICAgIEJSRUFLX09OX1NQRUxMRVJfRVJSOwog
ICAgICBicmVhazsKICAgIGNhc2UgJ0AnOgogICAgICB3b3JkID0gdHJpbV93c3BhY2UobGluZSAr
IDEpOwogICAgICBhc3BlbGxfc3BlbGxlcl9hZGRfdG9fc2Vzc2lvbihzcGVsbGVyLCB3b3JkLCAt
MSk7CiAgICAgIEJSRUFLX09OX1NQRUxMRVJfRVJSOwogICAgICBicmVhazsKICAgIGNhc2UgJyMn
OgogICAgICBhc3BlbGxfc3BlbGxlcl9zYXZlX2FsbF93b3JkX2xpc3RzKHNwZWxsZXIpOwogICAg
ICBCUkVBS19PTl9TUEVMTEVSX0VSUjsKICAgICAgYnJlYWs7CiAgICBjYXNlICcrJzoKICAgICAg
d29yZCA9IHRyaW1fd3NwYWNlKGxpbmUgKyAxKTsKICAgICAgZXJyID0gY29uZmlnLT5yZXBsYWNl
KCJtb2RlIiwgd29yZCk7CiAgICAgIGlmIChlcnIuZ2V0X2VycigpKQoJY29uZmlnLT5yZXBsYWNl
KCJtb2RlIiwgInRleCIpOwogICAgICByZWxvYWRfZmlsdGVycyhyZWFsX3NwZWxsZXIpOwogICAg
ICBjaGVja2VyLmRlbCgpOwogICAgICBjaGVja2VyID0gbmV3X2NoZWNrZXIoc3BlbGxlciwgc3Rh
dHVzX2Z1bl9pbmYpOwogICAgICBicmVhazsKICAgIGNhc2UgJy0nOgogICAgICBjb25maWctPnJl
bW92ZSgiZmlsdGVyIik7CiAgICAgIHJlbG9hZF9maWx0ZXJzKHJlYWxfc3BlbGxlcik7CiAgICAg
IGNoZWNrZXIuZGVsKCk7CiAgICAgIGNoZWNrZXIgPSBuZXdfY2hlY2tlcihzcGVsbGVyLCBzdGF0
dXNfZnVuX2luZik7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnfic6CiAgICAgIGJyZWFrOwogICAg
Y2FzZSAnISc6CiAgICAgIHRlcnNlX21vZGUgPSB0cnVlOwogICAgICBwcmludF9zdGFyID0gZmFs
c2U7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnJSc6CiAgICAgIHRlcnNlX21vZGUgPSBmYWxzZTsK
ICAgICAgcHJpbnRfc3RhciA9IHRydWU7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnJCc6CiAgICAg
IGlmIChsaW5lWzFdID09ICckJykgewoJc3dpdGNoKGxpbmVbMl0pIHsKCWNhc2UgJ3InOgoJICBz
d2l0Y2gobGluZVszXSkgewoJICBjYXNlICdhJzoKCSAgICBpZiAoZ2V0X3dvcmRfcGFpcihsaW5l
ICsgNCwgd29yZCwgd29yZDIpKQoJICAgICAgYXNwZWxsX3NwZWxsZXJfc3RvcmVfcmVwbGFjZW1l
bnQoc3BlbGxlciwgd29yZCwgLTEsIHdvcmQyLCAtMSk7CgkgICAgYnJlYWs7CgkgIH0KCSAgYnJl
YWs7CgljYXNlICdjJzoKCSAgc3dpdGNoIChsaW5lWzNdKSB7CgkgIGNhc2UgJ3MnOgoJICAgIGlm
IChnZXRfd29yZF9wYWlyKGxpbmUgKyA0LCB3b3JkLCB3b3JkMikpCgkgICAgICBCUkVBS19PTl9F
UlIoZXJyID0gY29uZmlnLT5yZXBsYWNlKHdvcmQsIHdvcmQyKSk7CiAgICAgICAgICAgIGlmIChz
dHJjbXAod29yZCwic3VnZ2VzdCIpID09IDApCiAgICAgICAgICAgICAgc3VnZ2VzdCA9IGNvbmZp
Zy0+cmV0cmlldmVfYm9vbCgic3VnZ2VzdCIpOwogICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAo
d29yZCwidGltZSIpID09IDApCiAgICAgICAgICAgICAgZG9fdGltZSA9IGNvbmZpZy0+cmV0cmll
dmVfYm9vbCgidGltZSIpOwogICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAod29yZCwiZ3Vlc3Mi
KSA9PSAwKQogICAgICAgICAgICAgIGluY2x1ZGVfZ3Vlc3NlcyA9IGNvbmZpZy0+cmV0cmlldmVf
Ym9vbCgiZ3Vlc3MiKTsKCSAgICBicmVhazsKCSAgY2FzZSAncic6CgkgICAgd29yZCA9IHRyaW1f
d3NwYWNlKGxpbmUgKyA0KTsKCSAgICBCUkVBS19PTl9FUlJfU0VUKGNvbmZpZy0+cmV0cmlldmUo
d29yZCksIFN0cmluZywgcmV0KTsKICAgICAgICAgICAgQ09VVC5wcmludGwocmV0KTsKCSAgICBi
cmVhazsKCSAgfQoJICBicmVhazsKCWNhc2UgJ3AnOgoJICBzd2l0Y2ggKGxpbmVbM10pIHsKCSAg
Y2FzZSAncCc6CgkgICAgcHJpbnRfZWxlbWVudHMoYXNwZWxsX3NwZWxsZXJfcGVyc29uYWxfd29y
ZF9saXN0KHNwZWxsZXIpKTsKCSAgICBicmVhazsKCSAgY2FzZSAncyc6CgkgICAgcHJpbnRfZWxl
bWVudHMoYXNwZWxsX3NwZWxsZXJfc2Vzc2lvbl93b3JkX2xpc3Qoc3BlbGxlcikpOwoJICAgIGJy
ZWFrOwoJICB9CgkgIGJyZWFrOwoJY2FzZSAnbCc6CgkgIENPVVQucHJpbnRsKGNvbmZpZy0+cmV0
cmlldmUoImxhbmciKSk7CgkgIGJyZWFrOwoJfQoJYnJlYWs7CiAgICAgIH0gZWxzZSB7CgkvLyBj
b250aW51ZSBvbiAobm8gYnJlYWspCiAgICAgIH0KICAgIGNhc2UgJ14nOgogICAgICBpZ25vcmUg
PSAxOwogICAgZGVmYXVsdDoKICAgICAgbGluZTAgPSBsaW5lOwogICAgICBsaW5lICs9IGlnbm9y
ZTsKICAgICAgY2hlY2tlci0+cHJvY2VzcyhsaW5lLCBzdHJsZW4obGluZSkpOwogICAgICB3aGls
ZSAoVG9rZW4gdG9rZW4gPSBjaGVja2VyLT5uZXh0X21pc3NwZWxsaW5nKCkpIHsKCXdvcmQgPSBs
aW5lICsgdG9rZW4ub2Zmc2V0OwoJd29yZFt0b2tlbi5sZW5dID0gJ1wwJzsKICAgICAgICBjb25z
dCBjaGFyICogY3dvcmQgPSBpY29udih3b3JkKTsKICAgICAgICBTdHJpbmcgZ3Vlc3NlcywgZ3Vl
c3M7CiAgICAgICAgY29uc3QgQ2hlY2tJbmZvICogY2kgPSByZWFsX3NwZWxsZXItPmNoZWNrX2lu
Zm8oKTsKICAgICAgICBhc3BlbGxlcjo6Q2FzZVBhdHRlcm4gY2FzZXAgCiAgICAgICAgICA9IHJl
YWxfc3BlbGxlci0+bGFuZygpLmNhc2VfcGF0dGVybihjd29yZCk7CiAgICAgICAgd2hpbGUgKGNp
KSB7CiAgICAgICAgICBndWVzcy5jbGVhcigpOwogICAgICAgICAgaWYgKGNpLT5wcmVfYWRkICYm
IGNpLT5wcmVfYWRkWzBdKQogICAgICAgICAgICBndWVzcy5hcHBlbmQoY2ktPnByZV9hZGQsIGNp
LT5wcmVfYWRkX2xlbikuYXBwZW5kKCcrJyk7CiAgICAgICAgICBndWVzcy5hcHBlbmQoY2ktPndv
cmQuc3RyLCBjaS0+d29yZC5sZW4pOwogICAgICAgICAgaWYgKGNpLT5wcmVfc3RyaXBfbGVuID4g
MCkgCiAgICAgICAgICAgIGd1ZXNzLmFwcGVuZCgnLScpLmFwcGVuZChjaS0+d29yZC5zdHIsIGNp
LT5wcmVfc3RyaXBfbGVuKTsKICAgICAgICAgIGlmIChjaS0+c3VmX3N0cmlwX2xlbiA+IDApIAog
ICAgICAgICAgICBndWVzcy5hcHBlbmQoJy0nKS5hcHBlbmQoY2ktPndvcmQuc3RyICsgY2ktPndv
cmQubGVuIC0gY2ktPnN1Zl9zdHJpcF9sZW4sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY2ktPnN1Zl9zdHJpcF9sZW4pOwogICAgICAgICAgaWYgKGNpLT5zdWZfYWRkICYm
IGNpLT5zdWZfYWRkWzBdKQogICAgICAgICAgICBndWVzcy5hcHBlbmQoJysnKS5hcHBlbmQoY2kt
PnN1Zl9hZGQsIGNpLT5zdWZfYWRkX2xlbik7CiAgICAgICAgICBndWVzcy5lbnN1cmVfbnVsbF9l
bmQoKTsKICAgICAgICAgIHJlYWxfc3BlbGxlci0+bGFuZygpLmZpeF9jYXNlKGNhc2VwLCBndWVz
cy5kYXRhKCksIGd1ZXNzLmRhdGEoKSk7CiAgICAgICAgICBndWVzc2VzIDw8ICIsICIgPDwgb2Nv
bnYoZ3Vlc3Muc3RyKCkpOwogICAgICAgICAgY2kgPSBjaS0+bmV4dDsKICAgICAgICB9CglzdGFy
dCA9IGNsb2NrKCk7CiAgICAgICAgY29uc3QgQXNwZWxsV29yZExpc3QgKiBzdWdnZXN0aW9ucyA9
IDA7CiAgICAgICAgaWYgKHN1Z2dlc3QpIAogICAgICAgICAgc3VnZ2VzdGlvbnMgPSBhc3BlbGxf
c3BlbGxlcl9zdWdnZXN0KHNwZWxsZXIsIHdvcmQsIC0xKTsKCWZpbmlzaCA9IGNsb2NrKCk7CiAg
ICAgICAgdW5zaWduZWQgb2Zmc2V0ID0gbWJfbGVuKGxpbmUwLCB0b2tlbi5vZmZzZXQgKyBpZ25v
cmUpOwoJaWYgKHN1Z2dlc3Rpb25zICYmICFhc3BlbGxfd29yZF9saXN0X2VtcHR5KHN1Z2dlc3Rp
b25zKSkgCiAgICAgICAgewogICAgICAgICAgQ09VVC5wcmludGYoIiYgJXMgJXUgJXU6Iiwgd29y
ZCwgCiAgICAgICAgICAgICAgICAgICAgICBhc3BlbGxfd29yZF9saXN0X3NpemUoc3VnZ2VzdGlv
bnMpLCBvZmZzZXQpOwoJICBBc3BlbGxTdHJpbmdFbnVtZXJhdGlvbiAqIGVscyAKCSAgICA9IGFz
cGVsbF93b3JkX2xpc3RfZWxlbWVudHMoc3VnZ2VzdGlvbnMpOwoJICBpZiAob3B0aW9ucy0+cmV0
cmlldmVfYm9vbCgicmV2ZXJzZSIpKSB7CgkgICAgVmVjdG9yPFN0cmluZz4gc3VnczsKCSAgICBz
dWdzLnJlc2VydmUoYXNwZWxsX3dvcmRfbGlzdF9zaXplKHN1Z2dlc3Rpb25zKSk7CgkgICAgd2hp
bGUgKCAoIHcgPSBhc3BlbGxfc3RyaW5nX2VudW1lcmF0aW9uX25leHQoZWxzKSkgIT0gMCkKCSAg
ICAgIHN1Z3MucHVzaF9iYWNrKHcpOwoJICAgIFZlY3RvcjxTdHJpbmc+OjpyZXZlcnNlX2l0ZXJh
dG9yIGkgPSBzdWdzLnJiZWdpbigpOwoJICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAg
Q09VVC5wcmludGYoIiAlcyIsIGktPmNfc3RyKCkpOwoJICAgICAgKytpOwoJICAgICAgaWYgKGkg
PT0gc3Vncy5yZW5kKCkpIGJyZWFrOwogICAgICAgICAgICAgIENPVVQucHV0KCcsJyk7CgkgICAg
fQoJICB9IGVsc2UgewoJICAgIHdoaWxlICggKCB3ID0gYXNwZWxsX3N0cmluZ19lbnVtZXJhdGlv
bl9uZXh0KGVscykpICE9IDApIHsKICAgICAgICAgICAgICBDT1VULnByaW50ZigiICVzJXMiLCB3
LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlbGxfc3RyaW5nX2VudW1lcmF0aW9uX2F0
X2VuZChlbHMpID8gIiIgOiAiLCIpOwoJICAgIH0KCSAgfQoJICBkZWxldGVfYXNwZWxsX3N0cmlu
Z19lbnVtZXJhdGlvbihlbHMpOwogICAgICAgICAgaWYgKGluY2x1ZGVfZ3Vlc3NlcykKICAgICAg
ICAgICAgQ09VVC5wdXQoZ3Vlc3Nlcyk7CgkgIENPVVQucHV0KCdcbicpOwoJfSBlbHNlIHsKICAg
ICAgICAgIGlmIChndWVzc2VzLmVtcHR5KCkpCiAgICAgICAgICAgIENPVVQucHJpbnRmKCIjICVz
ICV1XG4iLCB3b3JkLCBvZmZzZXQpOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBDT1VULnBy
aW50ZigiPyAlcyAwICV1OiAlc1xuIiwgd29yZCwgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAg
ICAgICBndWVzc2VzLmNfc3RyKCkgKyAyKTsKCX0KCWlmIChkb190aW1lKQogICAgICAgICAgQ09V
VC5wcmludGYoXygiU3VnZ2VzdGlvbiBUaW1lOiAlZlxuIiksIAogICAgICAgICAgICAgICAgICAg
ICAgKGZpbmlzaC1zdGFydCkvKGRvdWJsZSlDTE9DS1NfUEVSX1NFQyk7CiAgICAgIH0KICAgICAg
Q09VVC5wdXQoJ1xuJyk7CiAgICB9CiAgICBpZiAoYyA9PSBFT0YpIGJyZWFrOwogIH0KCiAgZGVs
ZXRlX2FzcGVsbF9zcGVsbGVyKHNwZWxsZXIpOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8KLy8KLy8gY2hlY2sKLy8KCmVudW0gVXNlckNob2ljZSB7Tm9uZSwgSWdub3JlLCBJZ25vcmVB
bGwsIFJlcGxhY2UsIFJlcGxhY2VBbGwsIAoJCSBBZGQsIEFkZExvd2VyLCBFeGl0LCBBYm9ydH07
CgpzdHJ1Y3QgTWFwcGluZyB7CiAgY2hhciBwcmltYXJ5WzldOwogIFVzZXJDaG9pY2UgcmV2ZXJz
ZVsyNTZdOwogIHZvaWQgdG9fYXNwZWxsKCk7CiAgdm9pZCB0b19pc3BlbGwoKTsKICBjaGFyICYg
b3BlcmF0b3JbXSAoVXNlckNob2ljZSBjKSB7cmV0dXJuIHByaW1hcnlbY107fQogIFVzZXJDaG9p
Y2UgJiBvcGVyYXRvcltdIChjaGFyIGMpIAogICAge3JldHVybiByZXZlcnNlW3N0YXRpY19jYXN0
PHVuc2lnbmVkIGNoYXI+KGMpXTt9Cn07Cgp2b2lkIGFib3J0X2NoZWNrKCk7Cgp2b2lkIHNldHVw
X2Rpc3BsYXlfY29udigpOwoKdm9pZCBjaGVjaygpCnsKICBTdHJpbmcgZmlsZV9uYW1lOwogIFN0
cmluZyBuZXdfbmFtZTsKICBGSUxFICogaW4gPSAwOwogIEZJTEUgKiBvdXQgPSAwOwogIE1hcHBp
bmcgbWFwcGluZzsKICBib29sIGNoYW5nZWQgPSBmYWxzZTsKCiAgaWYgKGFyZ3Muc2l6ZSgpID09
IDApIHsKICAgIHByaW50X2Vycm9yKF8oIllvdSBtdXN0IHNwZWNpZnkgYSBmaWxlIG5hbWUuIikp
OwogICAgZXhpdCgtMSk7CiAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA+IDEpIHsKICAgIHByaW50
X2Vycm9yKF8oIk9ubHkgb25lIGZpbGUgbmFtZSBtYXkgYmUgc3BlY2lmaWVkLiIpKTsKICAgIGV4
aXQoLTEpOwogIH0KICAKICBmaWxlX25hbWUgPSBhcmdzWzBdOwogIG5ld19uYW1lID0gZmlsZV9u
YW1lOwogIG5ld19uYW1lICs9ICIubmV3IjsKCiAgaW4gPSBmb3BlbihmaWxlX25hbWUuY19zdHIo
KSwgInIiKTsKICBpZiAoIWluKSB7CiAgICBwcmludF9lcnJvcihfKCJDb3VsZCBub3Qgb3BlbiB0
aGUgZmlsZSBcIiVzXCIgZm9yIHJlYWRpbmciKSwgZmlsZV9uYW1lKTsKICAgIGV4aXQoLTEpOwog
IH0KICAgIAogIGlmICghb3B0aW9ucy0+aGF2ZSgibW9kZSIpKQogICAgRVhJVF9PTl9FUlIoc2V0
X21vZGVfZnJvbV9leHRlbnNpb24ob3B0aW9ucywgZmlsZV9uYW1lKSk7CiAgICAKICBTdHJpbmcg
bSA9IG9wdGlvbnMtPnJldHJpZXZlKCJrZXltYXBwaW5nIik7CiAgaWYgKG0gPT0gImFzcGVsbCIp
CiAgICBtYXBwaW5nLnRvX2FzcGVsbCgpOwogIGVsc2UgaWYgKG0gPT0gImlzcGVsbCIpCiAgICBt
YXBwaW5nLnRvX2lzcGVsbCgpOwogIGVsc2UgewogICAgcHJpbnRfZXJyb3IoXygiSW52YWxpZCBr
ZXltYXBwaW5nOiAlcyIpLCBtKTsKICAgIGV4aXQoLTEpOwogIH0KCiAgQXNwZWxsQ2FuSGF2ZUVy
cm9yICogcmV0IAogICAgPSBuZXdfYXNwZWxsX3NwZWxsZXIocmVpbnRlcnByZXRfY2FzdDxBc3Bl
bGxDb25maWcgKj4ob3B0aW9ucy5nZXQoKSkpOwogIGlmIChhc3BlbGxfZXJyb3IocmV0KSkgewog
ICAgcHJpbnRfZXJyb3IoYXNwZWxsX2Vycm9yX21lc3NhZ2UocmV0KSk7CiAgICBleGl0KDEpOwog
IH0KCiAgewogICAgc3RydWN0IHN0YXQgc3Q7CiAgICBmc3RhdChmaWxlbm8oaW4pLCAmc3QpOwog
ICAgaWYgKCFTX0lTUkVHKHN0LnN0X21vZGUpKSB7CiAgICAgIHByaW50X2Vycm9yKF8oIlwiJXNc
IiBpcyBub3QgYSByZWd1bGFyIGZpbGUiKSwgZmlsZV9uYW1lKTsKICAgICAgZXhpdCgtMSk7CiAg
ICB9CiNpZmRlZiBVU0VfRklMRV9JTk8KICAgIGludCBmZCA9IG9wZW4obmV3X25hbWUuY19zdHIo
KSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgc3Quc3RfbW9kZSk7CiAgICBpZiAoZmQg
Pj0gMCkgb3V0ID0gZmRvcGVuKGZkLCAidyIpOwojZWxzZQogICAgb3V0ID0gZm9wZW4obmV3X25h
bWUuY19zdHIoKSwgInciKTsKI2VuZGlmCiAgfQogIGlmICghb3V0KSB7CiAgICBwcmludF9lcnJv
cihfKCJDb3VsZCBub3Qgb3BlbiB0aGUgZmlsZSBcIiVzXCIgZm9yIHdyaXRpbmcuIEZpbGUgbm90
IHNhdmVkLiIpLCBmaWxlX25hbWUpOwogICAgZXhpdCgtMSk7CiAgfQoKICBzZXR1cF9kaXNwbGF5
X2NvbnYoKTsKCiAgQXNwZWxsU3BlbGxlciAqIHNwZWxsZXIgPSB0b19hc3BlbGxfc3BlbGxlcihy
ZXQpOwoKICBzdGF0ZSA9IG5ldyBDaGVja2VyU3RyaW5nKHNwZWxsZXIsaW4sb3V0LDY0KTsKIAog
IHdvcmRfY2hvaWNlcyA9IG5ldyBDaG9pY2VzOwoKICBtZW51X2Nob2ljZXMgPSBuZXcgQ2hvaWNl
czsKICBtZW51X2Nob2ljZXMtPnB1c2hfYmFjayhDaG9pY2UobWFwcGluZ1tJZ25vcmVdLCAgICAg
XygiSWdub3JlIikpKTsKICBtZW51X2Nob2ljZXMtPnB1c2hfYmFjayhDaG9pY2UobWFwcGluZ1tJ
Z25vcmVBbGxdLCAgXygiSWdub3JlIGFsbCIpKSk7CiAgbWVudV9jaG9pY2VzLT5wdXNoX2JhY2so
Q2hvaWNlKG1hcHBpbmdbUmVwbGFjZV0sICAgIF8oIlJlcGxhY2UiKSkpOwogIG1lbnVfY2hvaWNl
cy0+cHVzaF9iYWNrKENob2ljZShtYXBwaW5nW1JlcGxhY2VBbGxdLCBfKCJSZXBsYWNlIGFsbCIp
KSk7CiAgbWVudV9jaG9pY2VzLT5wdXNoX2JhY2soQ2hvaWNlKG1hcHBpbmdbQWRkXSwgICAgICAg
IF8oIkFkZCIpKSk7CiAgbWVudV9jaG9pY2VzLT5wdXNoX2JhY2soQ2hvaWNlKG1hcHBpbmdbQWRk
TG93ZXJdLCAgIF8oIkFkZCBMb3dlciIpKSk7CiAgbWVudV9jaG9pY2VzLT5wdXNoX2JhY2soQ2hv
aWNlKG1hcHBpbmdbQWJvcnRdLCAgICAgIF8oIkFib3J0IikpKTsKICBtZW51X2Nob2ljZXMtPnB1
c2hfYmFjayhDaG9pY2UobWFwcGluZ1tFeGl0XSwgICAgICAgXygiRXhpdCIpKSk7CgogIFN0cmlu
ZyB3b3JkMCwgbmV3X3dvcmQ7CiAgVmVjdG9yPFN0cmluZz4gc3VnX2NvbjsKICBTdGFja1B0cjxT
dHJpbmdNYXA+IHJlcGxhY2VfbGlzdChuZXdfc3RyaW5nX21hcCgpKTsKICBjb25zdCBjaGFyICog
dzsKCiAgYmVnaW5fY2hlY2soKTsKCiAgd2hpbGUgKHN0YXRlLT5uZXh0X21pc3NwZWxsaW5nKCkp
IHsKCiAgICBjaGFyICogd29yZCA9IHN0YXRlLT5nZXRfcmVhbF93b3JkKHdvcmQwKTsKCiAgICAv
LwogICAgLy8gY2hlY2sgaWYgaXQgaXMgaW4gdGhlIHJlcGxhY2UgbGlzdAogICAgLy8KCiAgICBp
ZiAoKHcgPSByZXBsYWNlX2xpc3QtPmxvb2t1cCh3b3JkKSkgIT0gMCkgewogICAgICBzdGF0ZS0+
cmVwbGFjZSh3KTsKICAgICAgY29udGludWU7CiAgICB9CgogICAgLy8KICAgIC8vIHByaW50IHRo
ZSBsaW5lIHdpdGggdGhlIG1pc3NwZWxsZWQgd29yZCBoaWdobGlnaHRlZDsKICAgIC8vCgogICAg
ZGlzcGxheV9taXNzcGVsbGVkX3dvcmQoKTsKCiAgICAvLwogICAgLy8gcHJpbnQgdGhlIHN1Z2dl
c3Rpb25zIGFuZCBtZW51IGNob2ljZXMKICAgIC8vCgogICAgY29uc3QgQXNwZWxsV29yZExpc3Qg
KiBzdWdnZXN0aW9ucyA9IGFzcGVsbF9zcGVsbGVyX3N1Z2dlc3Qoc3BlbGxlciwgd29yZCwgLTEp
OwogICAgQXNwZWxsU3RyaW5nRW51bWVyYXRpb24gKiBlbHMgPSBhc3BlbGxfd29yZF9saXN0X2Vs
ZW1lbnRzKHN1Z2dlc3Rpb25zKTsKICAgIHN1Z19jb24ucmVzaXplKDApOwogICAgd2hpbGUgKHN1
Z19jb24uc2l6ZSgpICE9IDEwIAogICAgICAgICAgICYmICh3ID0gYXNwZWxsX3N0cmluZ19lbnVt
ZXJhdGlvbl9uZXh0KGVscykpICE9IDApCiAgICAgIHN1Z19jb24ucHVzaF9iYWNrKHcpOwogICAg
ZGVsZXRlX2FzcGVsbF9zdHJpbmdfZW51bWVyYXRpb24oZWxzKTsKCiAgICAvLyBkaXNhYmxlIHN1
c3BlbmQKICAgIHVuc2lnbmVkIGludCBzdWdnZXN0aW9uc19zaXplID0gc3VnX2Nvbi5zaXplKCk7
CiAgICB1bnNpZ25lZCBpbnQgc3VnZ2VzdGlvbnNfbWlkID0gc3VnZ2VzdGlvbnNfc2l6ZSAvIDI7
CiAgICBpZiAoc3VnZ2VzdGlvbnNfc2l6ZSAlIDIpIHN1Z2dlc3Rpb25zX21pZCsrOyAvLyBpZiBv
ZGQKICAgIHdvcmRfY2hvaWNlcy0+cmVzaXplKDApOwogICAgZm9yICh1bnNpZ25lZCBpbnQgaiA9
IDA7IGogIT0gc3VnZ2VzdGlvbnNfbWlkOyArK2opIHsKICAgICAgd29yZF9jaG9pY2VzLT5wdXNo
X2JhY2soQ2hvaWNlKCcwJyArIGorMSwgc3VnX2NvbltqXSkpOwogICAgICBpZiAoaiArIHN1Z2dl
c3Rpb25zX21pZCAhPSBzdWdnZXN0aW9uc19zaXplKSAKICAgICAgICB3b3JkX2Nob2ljZXMKICAg
ICAgICAgIC0+cHVzaF9iYWNrKENob2ljZShqK3N1Z2dlc3Rpb25zX21pZCsxID09IDEwIAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgID8gJzAnIAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDogJzAnICsgaitzdWdnZXN0aW9uc19taWQrMSwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdWdfY29uW2orc3VnZ2VzdGlvbnNfbWlkXSkpOwogICAgfQogICAgLy9lbmFibGUgc3Vz
cGVuZAogICAgZGlzcGxheV9tZW51KCk7CgogIGNob2ljZV9wcm9tcHQ6CgogICAgcHJvbXB0KCI/
ICIpOwoKICBjaG9pY2VfbG9vcDoKCiAgICAvLwogICAgLy8gSGFuZGxlIHRoZSB1c2VycyBjaG9p
Y2UKICAgIC8vCgogICAgaW50IGNob2ljZTsKICAgIGdldF9jaG9pY2UoY2hvaWNlKTsKICAgICAg
CiAgICBpZiAoY2hvaWNlID09ICcwJykgY2hvaWNlID0gJzknICsgMTsKICAgIAogICAgc3dpdGNo
IChtYXBwaW5nW2Nob2ljZV0pIHsKICAgIGNhc2UgRXhpdDoKICAgICAgZ290byBleGl0X2xvb3A7
CiAgICBjYXNlIEFib3J0OiB7CiAgICAgIHByb21wdChfKCJBcmUgeW91IHN1cmUgeW91IHdhbnQg
dG8gYWJvcnQgKHkvbik/ICIpKTsKICAgICAgZ2V0X2Nob2ljZShjaG9pY2UpOwogICAgICAvKiBU
UkFOU0xBVE9SUzogVGhlIHVzZXIgbWF5IGlucHV0IGFueSBvZiB0aGVzZSBjaGFyYWN0ZXJzIHRv
IHNheSAieWVzIi4KICAgICAgICAgTVVTVCBPTkxZIENPTlNJU1QgT0YgQVNDSUkgQ0hBUkFDVEVS
Uy4gKi8KICAgICAgY29uc3QgY2hhciAqIHllc19jaGFyYWN0ZXJzID0gXygiWXkiKTsKICAgICAg
aWYgKHN0cmNocih5ZXNfY2hhcmFjdGVycywgY2hvaWNlKSAhPSAwKQogICAgICAgIGdvdG8gYWJv
cnRfbG9vcDsKICAgICAgZ290byBjaG9pY2VfcHJvbXB0OwogICAgfQogICAgY2FzZSBJZ25vcmU6
CiAgICAgIGJyZWFrOwogICAgY2FzZSBJZ25vcmVBbGw6CiAgICAgIGFzcGVsbF9zcGVsbGVyX2Fk
ZF90b19zZXNzaW9uKHNwZWxsZXIsIHdvcmQsIC0xKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIEFk
ZDoKICAgICAgYXNwZWxsX3NwZWxsZXJfYWRkX3RvX3BlcnNvbmFsKHNwZWxsZXIsIHdvcmQsIC0x
KTsKICAgICAgYnJlYWs7CiAgICBjYXNlIEFkZExvd2VyOiAKICAgIHsKICAgICAgLy8gRW11bGF0
ZSB0aGUgYyBmdW5jdGlvbiBhZGRfdG9fcGVyc29uYWwsIGJ1dCBhZGQgZXh0cmEgc3RlcCB0bwog
ICAgICAvLyBjb252ZXJ0IHdvcmQgdG8gbG93ZXJjYXNlLiAgWWVhaCBpdHMgYSBiaXQgb2YgYSBo
YWNrLgogICAgICBTcGVsbGVyICogc3AgPSByZWludGVycHJldF9jYXN0PFNwZWxsZXIgKj4oc3Bl
bGxlcik7CiAgICAgIHNwLT50ZW1wX3N0cl8wLmNsZWFyKCk7CiAgICAgIHNwLT50b19pbnRlcm5h
bF8tPmNvbnZlcnQod29yZCwgLTEsIHNwLT50ZW1wX3N0cl8wKTsKICAgICAgY2hhciAqIGxvd2Vy
ID0gc3AtPnRvX2xvd2VyKHNwLT50ZW1wX3N0cl8wLm1zdHIoKSk7CiAgICAgIFBvc2liRXJyPHZv
aWQ+IHJldCA9IHNwLT5hZGRfdG9fcGVyc29uYWwoTXV0YWJsZVN0cmluZyhsb3dlcikpOwogICAg
ICBzcC0+ZXJyXy5yZXNldChyZXQucmVsZWFzZV9lcnIoKSk7CiAgICAgIGJyZWFrOwogICAgfQog
ICAgY2FzZSBSZXBsYWNlOgogICAgY2FzZSBSZXBsYWNlQWxsOgogICAgICAvLyB0aGUgc3RyaW5n
IG5ld193b3JkIGlzIGluIHRoZSBlbmNvZGluZyBvZiB0aGUgZG9jdW1lbnQKICAgICAgcHJvbXB0
KF8oIldpdGg6ICIpKTsKICAgICAgZ2V0X2xpbmUobmV3X3dvcmQpOwogICAgICBpZiAobmV3X3dv
cmQuc2l6ZSgpID09IDApCiAgICAgICAgZ290byBjaG9pY2VfcHJvbXB0OwogICAgICBpZiAobmV3
X3dvcmRbMF0gPj0gJzEnICYmIG5ld193b3JkWzBdIDwgKGNoYXIpc3VnZ2VzdGlvbnNfc2l6ZSAr
ICcxJykKICAgICAgICBuZXdfd29yZCA9IHN1Z19jb25bbmV3X3dvcmRbMF0tJzEnXTsKICAgICAg
c3RhdGUtPnJlcGxhY2UobmV3X3dvcmQpOwogICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgaWYg
KG1hcHBpbmdbY2hvaWNlXSA9PSBSZXBsYWNlQWxsICYmIChzdHJjbXAod29yZCxuZXdfd29yZC5z
dHIoKSkgIT0gMCkpCiAgICAgICAgcmVwbGFjZV9saXN0LT5yZXBsYWNlKHdvcmQsIG5ld193b3Jk
KTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAvLyB0aGUgcmVwbGFzbWVudHMgYXJl
IGluIHRoZSBlbmNvZGluZyBvZiB0aGUgZG9jdW1lbnQKICAgICAgaWYgKGNob2ljZSA+PSAnMScg
JiYgY2hvaWNlIDwgKGNoYXIpc3VnZ2VzdGlvbnNfc2l6ZSArICcxJykgeyAKICAgICAgICBzdGF0
ZS0+cmVwbGFjZShzdWdfY29uW2Nob2ljZS0nMSddKTsKICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsK
ICAgICAgfSBlbHNlIHsKICAgICAgICBlcnJvcihfKCJTb3JyeSB0aGF0IGlzIGFuIGludmFsaWQg
Y2hvaWNlISIpKTsKICAgICAgICBnb3RvIGNob2ljZV9sb29wOwogICAgICB9CiAgICB9CiAgfQpl
eGl0X2xvb3A6CiAgewogICAgYXNwZWxsX3NwZWxsZXJfc2F2ZV9hbGxfd29yZF9saXN0cyhzcGVs
bGVyKTsKICAgIHN0YXRlLmRlbCgpOyAvLyB0byBjbG9zZSB0aGUgZmlsZSBoYW5kbGVzCiAgICBk
ZWxldGVfYXNwZWxsX3NwZWxsZXIoc3BlbGxlcik7CgogICAgaWYgKGNoYW5nZWQpIHsKCiAgICAg
IGJvb2wga2VlcF9iYWNrdXAgPSBvcHRpb25zLT5yZXRyaWV2ZV9ib29sKCJiYWNrdXAiKTsKICAg
ICAgaWYgKGtlZXBfYmFja3VwKSB7CiAgICAgICAgU3RyaW5nIGJhY2t1cF9uYW1lID0gZmlsZV9u
YW1lOwogICAgICAgIGJhY2t1cF9uYW1lICs9ICIuYmFrIjsKICAgICAgICByZW5hbWVfZmlsZShm
aWxlX25hbWUsIGJhY2t1cF9uYW1lKTsKICAgICAgfQogICAgICByZW5hbWVfZmlsZShuZXdfbmFt
ZSwgZmlsZV9uYW1lKTsKCiAgICB9IGVsc2UgewoKICAgICAgcmVtb3ZlX2ZpbGUobmV3X25hbWUp
OwoKICAgIH0KICAgIAogICAgLy9lbmRfY2hlY2soKTsKICAgIAogICAgcmV0dXJuOwogIH0KYWJv
cnRfbG9vcDoKICB7CiAgICBzdGF0ZS0+YWJvcnQoKTsgLy8gdG8gY2xvc2UgdGhlIGZpbGUgaGFu
ZGxlcwogICAgZGVsZXRlX2FzcGVsbF9zcGVsbGVyKHNwZWxsZXIpOwoKICAgIHJlbW92ZV9maWxl
KG5ld19uYW1lKTsKCiAgICByZXR1cm47CiAgfQp9CgojZGVmaW5lIFUgKHVuc2lnbmVkIGNoYXIp
Cgp2b2lkIE1hcHBpbmc6OnRvX2FzcGVsbCgpIAp7CiAgbWVtc2V0KHRoaXMsIDAsIHNpemVvZihN
YXBwaW5nKSk7CiAgcHJpbWFyeVtJZ25vcmUgICAgXSA9ICdpJzsKICByZXZlcnNlW1UnaSddID0g
SWdub3JlOwogIHJldmVyc2VbVScgJ10gPSBJZ25vcmU7CiAgcmV2ZXJzZVtVJ1xuJ10gPSBJZ25v
cmU7CgogIHByaW1hcnlbSWdub3JlQWxsIF0gPSAnSSc7CiAgcmV2ZXJzZVtVJ0knXSA9IElnbm9y
ZUFsbDsKCiAgcHJpbWFyeVtSZXBsYWNlICAgXSA9ICdyJzsKICByZXZlcnNlW1UnciddID0gUmVw
bGFjZTsKCiAgcHJpbWFyeVtSZXBsYWNlQWxsXSA9ICdSJzsKICByZXZlcnNlW1UnUiddID0gUmVw
bGFjZUFsbDsKCiAgcHJpbWFyeVtBZGQgICAgICAgXSA9ICdhJzsKICByZXZlcnNlW1UnQSddID0g
QWRkOwogIHJldmVyc2VbVSdhJ10gPSBBZGQ7CgogIHByaW1hcnlbQWRkTG93ZXIgIF0gPSAnbCc7
CiAgcmV2ZXJzZVtVJ0wnXSA9IEFkZExvd2VyOwogIHJldmVyc2VbVSdsJ10gPSBBZGRMb3dlcjsK
CiAgcHJpbWFyeVtBYm9ydCAgICAgXSA9ICdiJzsKICByZXZlcnNlW1UnYiddID0gQWJvcnQ7CiAg
cmV2ZXJzZVtVJ0InXSA9IEFib3J0OwogIHJldmVyc2VbY29udHJvbCgnYycpXSA9IEFib3J0OwoK
ICBwcmltYXJ5W0V4aXQgICAgICBdID0gJ3gnOwogIHJldmVyc2VbVSd4J10gPSBFeGl0OwogIHJl
dmVyc2VbVSdYJ10gPSBFeGl0Owp9Cgp2b2lkIE1hcHBpbmc6OnRvX2lzcGVsbCgpIAp7CiAgbWVt
c2V0KHRoaXMsIDAsIHNpemVvZihNYXBwaW5nKSk7CiAgcHJpbWFyeVtJZ25vcmUgICAgXSA9ICcg
JzsKICByZXZlcnNlW1UnICddID0gSWdub3JlOwogIHJldmVyc2VbVSdcbiddID0gSWdub3JlOwoK
ICBwcmltYXJ5W0lnbm9yZUFsbCBdID0gJ0EnOwogIHJldmVyc2VbVSdBJ10gPSBJZ25vcmVBbGw7
CiAgcmV2ZXJzZVtVJ2EnXSA9IElnbm9yZUFsbDsKCiAgcHJpbWFyeVtSZXBsYWNlICAgXSA9ICdS
JzsKICByZXZlcnNlW1UnUiddID0gUmVwbGFjZUFsbDsKICByZXZlcnNlW1UnciddID0gUmVwbGFj
ZTsKCiAgcHJpbWFyeVtSZXBsYWNlQWxsXSA9ICdFJzsKICByZXZlcnNlW1UnRSddID0gUmVwbGFj
ZUFsbDsKICByZXZlcnNlW1UnZSddID0gUmVwbGFjZTsKCiAgcHJpbWFyeVtBZGQgICAgICAgXSA9
ICdJJzsKICByZXZlcnNlW1UnSSddID0gQWRkOwogIHJldmVyc2VbVSdpJ10gPSBBZGQ7CgogIHBy
aW1hcnlbQWRkTG93ZXIgIF0gPSAnVSc7CiAgcmV2ZXJzZVtVJ1UnXSA9IEFkZExvd2VyOwogIHJl
dmVyc2VbVSd1J10gPSBBZGRMb3dlcjsKCiAgcHJpbWFyeVtBYm9ydCAgICAgXSA9ICdRJzsKICBy
ZXZlcnNlW1UnUSddID0gQWJvcnQ7CiAgcmV2ZXJzZVtVJ3EnXSA9IEFib3J0OwogIHJldmVyc2Vb
Y29udHJvbCgnYycpXSA9IEFib3J0OwoKICBwcmltYXJ5W0V4aXQgICAgICBdID0gJ1gnOwogIHJl
dmVyc2VbVSdYJ10gPSBFeGl0OwogIHJldmVyc2VbVSd4J10gPSBFeGl0Owp9CiN1bmRlZiBVCgov
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8KLy8gbGlzdAovLwoKdm9pZCBsaXN0KCkKewog
IEFzcGVsbENhbkhhdmVFcnJvciAqIHJldCAKICAgID0gbmV3X2FzcGVsbF9zcGVsbGVyKHJlaW50
ZXJwcmV0X2Nhc3Q8QXNwZWxsQ29uZmlnICo+KG9wdGlvbnMuZ2V0KCkpKTsKICBpZiAoYXNwZWxs
X2Vycm9yKHJldCkpIHsKICAgIHByaW50X2Vycm9yKGFzcGVsbF9lcnJvcl9tZXNzYWdlKHJldCkp
OwogICAgZXhpdCgxKTsKICB9CiAgQXNwZWxsU3BlbGxlciAqIHNwZWxsZXIgPSB0b19hc3BlbGxf
c3BlbGxlcihyZXQpOwoKICBzdGF0ZSA9IG5ldyBDaGVja2VyU3RyaW5nKHNwZWxsZXIsc3RkaW4s
MCw2NCk7CgogIFN0cmluZyB3b3JkOwogCiAgd2hpbGUgKHN0YXRlLT5uZXh0X21pc3NwZWxsaW5n
KCkpIHsKCiAgICBzdGF0ZS0+Z2V0X3JlYWxfd29yZCh3b3JkKTsKICAgIENPVVQucHJpbnRsKHdv
cmQpOwoKICB9CiAgCiAgc3RhdGUuZGVsKCk7IC8vIHRvIGNsb3NlIHRoZSBmaWxlIGhhbmRsZXMK
ICBkZWxldGVfYXNwZWxsX3NwZWxsZXIoc3BlbGxlcik7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLwovLwovLyBjb252dAovLwoKdm9pZCBjb252dCgpCnsKICBDb252IGNvbnY7CiAgU3Ry
aW5nIGJ1ZjEsIGJ1ZjI7CiAgY29uc3QgY2hhciAqIGZyb20gPSBmaXhfZW5jb2Rpbmdfc3RyKGFy
Z3NbMF0sIGJ1ZjEpOwogIGNvbnN0IGNoYXIgKiB0byAgID0gZml4X2VuY29kaW5nX3N0cihhcmdz
WzFdLCBidWYyKTsKICBOb3JtYWxpemUgbm9ybSA9IE5vcm1Ob25lOwogIGlmIChzdHJjbXAoZnJv
bSwgInV0Zi04IikgPT0gMCAmJiBzdHJjbXAodG8sICJ1dGYtOCIpICE9IDApCiAgICBub3JtID0g
Tm9ybUZyb207CiAgZWxzZSBpZiAoc3RyY21wKGZyb20sICJ1dGYtOCIpICE9IDAgJiYgc3RyY21w
KHRvLCAidXRmLTgiKSA9PSAwKQogICAgbm9ybSA9IE5vcm1UbzsKICBpZiAoYXJncy5zaXplKCkg
PiAyKSB7CiAgICBmb3IgKFN0cmluZzo6aXRlcmF0b3IgaSA9IGFyZ3NbMl0uYmVnaW4oKTsgaSAh
PSBhcmdzWzJdLmVuZCgpOyArK2kpCiAgICAgICppID0gYXNjX3RvbG93ZXIoKmkpOwogICAgb3B0
aW9ucy0+cmVwbGFjZSgibm9ybWFsaXplIiwgInRydWUiKTsKICAgIGlmIChhcmdzWzJdID09ICJu
b25lIikKICAgICAgb3B0aW9ucy0+cmVwbGFjZSgibm9ybWFsaXplIiwgImZhbHNlIik7CiAgICBl
bHNlIGlmIChhcmdzWzJdID09ICJpbnRlcm5hbCIpCiAgICAgIG9wdGlvbnMtPnJlcGxhY2UoIm5v
cm0tc3RyaWN0IiwgImZhbHNlIik7CiAgICBlbHNlIGlmIChhcmdzWzJdID09ICJzdHJpY3QiKQog
ICAgICBvcHRpb25zLT5yZXBsYWNlKCJub3JtLXN0cmljdCIsICJ0cnVlIik7CiAgICBlbHNlCiAg
ICAgIEVYSVRfT05fRVJSKG9wdGlvbnMtPnJlcGxhY2UoIm5vcm0tZm9ybSIsIGFyZ3NbMl0pKTsK
ICB9CiAgRVhJVF9PTl9FUlIoY29udi5zZXR1cCgqb3B0aW9ucywgYXJnc1swXSwgYXJnc1sxXSwg
bm9ybSkpOwogIFN0cmluZyBsaW5lOwogIHdoaWxlIChDSU4uZ2V0bGluZShsaW5lKSkKICAgIENP
VVQucHJpbnRsKGNvbnYobGluZSkpOwp9Cgp2b2lkIG5vcm1seigpCnsKICBvcHRpb25zLT5yZXBs
YWNlKCJub3JtYWxpemUiLCAidHJ1ZSIpOwogIGNvbnN0IGNoYXIgKiBmcm9tID0gYXJncy5zaXpl
KCkgPCAzID8gInV0Zi04IiA6IGFyZ3NbMF0uc3RyKCk7CiAgY29uc3QgY2hhciAqIHRvICAgPSBh
cmdzLnNpemUoKSA8IDMgPyAidXRmLTgiIDogYXJnc1syXS5zdHIoKTsKICBjb25zdCBjaGFyICog
aW50ciA9IGFyZ3Muc2l6ZSgpIDwgMyA/IGFyZ3NbMF0uc3RyKCkgOiBhcmdzWzFdLnN0cigpOwog
IFN0cmluZyAqIGZvcm0gPSAoYXJncy5zaXplKCkgPT0gMiAgID8gJmFyZ3NbMV0gCiAgICAgICAg
ICAgICAgICAgICA6IGFyZ3Muc2l6ZSgpID09IDQgPyAmYXJnc1szXQogICAgICAgICAgICAgICAg
ICAgOiAwKTsKICBOb3JtYWxpemUgZGVjb2RlX25vcm0gPSBOb3JtVG87CiAgaWYgKGZvcm0pIHsK
ICAgIGZvciAoU3RyaW5nOjppdGVyYXRvciBpID0gZm9ybS0+YmVnaW4oKTsgaSAhPSBmb3JtLT5l
bmQoKTsgKytpKQogICAgICAqaSA9IGFzY190b2xvd2VyKCppKTsKICAgIGlmICgqZm9ybSA9PSAi
aW50ZXJuYWwiKSB7CiAgICAgIG9wdGlvbnMtPnJlcGxhY2UoIm5vcm0tc3RyaWN0IiwgImZhbHNl
Iik7CiAgICAgIGRlY29kZV9ub3JtID0gTm9ybU5vbmU7CiAgICB9IGVsc2UgaWYgKCpmb3JtID09
ICJzdHJpY3QiKSB7CiAgICAgIG9wdGlvbnMtPnJlcGxhY2UoIm5vcm0tc3RyaWN0IiwgInRydWUi
KTsKICAgICAgZGVjb2RlX25vcm0gPSBOb3JtTm9uZTsKICAgIH0KICAgIGlmIChkZWNvZGVfbm9y
bSA9PSBOb3JtVG8pIEVYSVRfT05fRVJSKG9wdGlvbnMtPnJlcGxhY2UoIm5vcm0tZm9ybSIsICpm
b3JtKSk7CiAgfQogIENvbnYgZW5jb2RlLGRlY29kZTsKICBFWElUX09OX0VSUihlbmNvZGUuc2V0
dXAoKm9wdGlvbnMsIGZyb20sIGludHIsIE5vcm1Gcm9tKSk7CiAgRVhJVF9PTl9FUlIoZGVjb2Rl
LnNldHVwKCpvcHRpb25zLCBpbnRyLCB0bywgZGVjb2RlX25vcm0pKTsKICBTdHJpbmcgbGluZTsK
ICB3aGlsZSAoQ0lOLmdldGxpbmUobGluZSkpCiAgICBDT1VULnByaW50bChkZWNvZGUoZW5jb2Rl
KGxpbmUpKSk7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBmaWx0ZXIKLy8K
CnZvaWQgZmlsdGVyKCkKewogIGxpbmVfYnVmZmVyKCk7CgogIFN0cmluZyBlbmMgPSBvcHRpb25z
LT5yZXRyaWV2ZSgiZW5jb2RpbmciKTsKICBpZiAoZW5jID09ICJub25lIikKICAgIGVuYz0idXRm
LTgiOwogIFN0cmluZyBlbmNvZGluZzsKICBmaXhfZW5jb2Rpbmdfc3RyKGVuYywgZW5jb2Rpbmcp
OwoKICBFWElUX09OX0VSUl9TRVQoRGVjb2RlOjpnZXRfbmV3KGVuY29kaW5nLCBvcHRpb25zLmdl
dCgpKSwKICAgICAgICAgICAgICAgICAgU3RhY2tQdHI8RGVjb2RlPiwgaWNvbnYpOwogIEVYSVRf
T05fRVJSX1NFVChFbmNvZGU6OmdldF9uZXcoZW5jb2RpbmcsIG9wdGlvbnMuZ2V0KCkpLAogICAg
ICAgICAgICAgICAgICBTdGFja1B0cjxFbmNvZGU+LCBvY29udik7CgogIFN0YWNrUHRyPEZpbHRl
cj4gZmlsdGVyKG5ldyBGaWx0ZXIpOwogIEVYSVRfT05fRVJSKHNldHVwX2ZpbHRlcigqZmlsdGVy
LCBvcHRpb25zLmdldCgpLCB0cnVlLCB0cnVlLCBmYWxzZSkpOwoKICBDaGFyVmVjdG9yIGJ1ZjsK
ICBGaWx0ZXJDaGFyVmVjdG9yIHByb2Nfc3RyOwoKICBpbnQgYzsKICBmb3IgKDs7KSB7CiAgICBi
dWYuY2xlYXIoKTsKICAgIHdoaWxlIChjID0gZ2V0Y2hhcigpLCBjICE9ICdcbicgJiYgYyAhPSBF
T0YpCiAgICAgIGJ1Zi5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oYykpOwogICAgaWYgKGMg
PT0gRU9GKSBicmVhazsKICAgIGJ1Zi5wdXNoX2JhY2soJ1xuJyk7CiAgICBidWYucHVzaF9iYWNr
KCdcMCcpOwogICAgcHJvY19zdHIuY2xlYXIoKTsKICAgIGljb252LT5kZWNvZGUoYnVmLmRhdGEo
KSwgYnVmLnNpemUoKS0xLCBwcm9jX3N0cik7CiAgICBwcm9jX3N0ci5hcHBlbmQoMCk7CiAgICBG
aWx0ZXJDaGFyICogYmVnaW4gPSBwcm9jX3N0ci5wYmVnaW4oKTsKICAgIEZpbHRlckNoYXIgKiBl
bmQgICA9IHByb2Nfc3RyLnBlbmQoKSAtIDE7CiAgICBmaWx0ZXItPnByb2Nlc3MoYmVnaW4sIGVu
ZCk7CiAgICBidWYuY2xlYXIoKTsKICAgIG9jb252LT5lbmNvZGUoYmVnaW4sZW5kLGJ1Zik7CiAg
ICBpZiAoYnVmLmVtcHR5KCkgfHwgYnVmLmJhY2soKSAhPSAnXG4nKQogICAgICBidWYucHVzaF9i
YWNrKCdcbicpOwogICAgQ09VVC53cml0ZShidWYpOwogIH0KfQoKLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vCi8vCi8vIHByaW50X3ZlcgovLwoKdm9pZCBwcmludF92ZXIgKGJvb2wgZXh0ZW5z
aXZlX3ZlcnNpb25faW5mbykgewogICAgcHJpbnRmKCJAKCMpIEludGVybmF0aW9uYWwgSXNwZWxs
IFZlcnNpb24gMy4xLjIwICIgCiAgICAgICAgICAgIihidXQgcmVhbGx5IEFzcGVsbCAlcylcbiIs
IGFzcGVsbF92ZXJzaW9uX3N0cmluZygpKTsKICAgIGlmIChleHRlbnNpdmVfdmVyc2lvbl9pbmZv
KSB7CiAgICAgICAgbG9hZF9hbGxfZmlsdGVycyhvcHRpb25zKTsKICAgICAgICBDT1VUIDw8ICJM
SUJESVIgPSBcIiIgPDwgb3B0aW9ucy0+cmV0cmlldmUoImRhdGEtZGlyIikgPDwgIlwiXG4iOwog
ICAgfQp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBUaGVzZSBmdW5jdGlvbnMgdXNlIGltcGxlbWVu
dGF0aW9uIGRldGFpbHMgb2YgdGhlIGRlZmF1bHQgc3BlbGxlcgovLyBtb2R1bGUKLy8KCi8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBjbGVhbgovLwoKdm9pZCBjbGVhbigpCnsKICB1
c2luZyBuYW1lc3BhY2UgYXNwZWxsZXI7CgogIGJvb2wgc3RyaWN0ID0gYXJncy5zaXplKCkgIT0g
MCAmJiBhcmdzWzBdID09ICJzdHJpY3QiOwogIAogIENvbmZpZyAqIGNvbmZpZyA9IG9wdGlvbnM7
CgogIENhY2hlUHRyPExhbmd1YWdlPiBsYW5nOwogIGZpbmRfbGFuZ3VhZ2UoKmNvbmZpZyk7CiAg
UG9zaWJFcnI8TGFuZ3VhZ2UgKj4gcmVzID0gbmV3X2xhbmd1YWdlKCpjb25maWcpOwogIGlmIChy
ZXMuaGFzX2VycigpKSB7cHJpbnRfZXJyb3IocmVzLmdldF9lcnIoKS0+bWVzZyk7IGV4aXQoMSk7
fQogIGxhbmcucmVzZXQocmVzLmRhdGEpOwogIElzdHJlYW1FbnVtZXJhdGlvbiBpbihDSU4pOwog
IFdvcmRMaXN0SXRlcmF0b3Igd2xfaXRyKCZpbiwgbGFuZywgJkNFUlIpOwogIGNvbmZpZy0+cmVw
bGFjZSgidmFsaWRhdGUtd29yZHMiLCAidHJ1ZSIpOwogIGNvbmZpZy0+cmVwbGFjZSgidmFsaWRh
dGUtYWZmaXhlcyIsICJ0cnVlIik7CiAgaWYgKCFzdHJpY3QpCiAgICBjb25maWctPnJlcGxhY2Uo
ImNsZWFuLXdvcmRzIiwgInRydWUiKTsKICBjb25maWctPnJlcGxhY2UoImNsZWFuLWFmZml4ZXMi
LCAidHJ1ZSIpOwogIGNvbmZpZy0+cmVwbGFjZSgic2tpcC1pbnZhbGlkLXdvcmRzIiwgInRydWUi
KTsKICB3bF9pdHIuaW5pdCgqY29uZmlnKTsKICBDb252IG9jb252LCBvY29udjI7CiAgaWYgKGNv
bmZpZy0+aGF2ZSgiZW5jb2RpbmciKSkgewogICAgRVhJVF9PTl9FUlIob2NvbnYuc2V0dXAoKmNv
bmZpZywgbGFuZy0+Y2hhcm1hcCgpLCBjb25maWctPnJldHJpZXZlKCJlbmNvZGluZyIpLCBOb3Jt
VG8pKTsKICAgIEVYSVRfT05fRVJSKG9jb252Mi5zZXR1cCgqY29uZmlnLCBsYW5nLT5jaGFybWFw
KCksIGNvbmZpZy0+cmV0cmlldmUoImVuY29kaW5nIiksIE5vcm1UbykpOwogIH0gZWxzZSB7CiAg
ICBFWElUX09OX0VSUihvY29udi5zZXR1cCgqY29uZmlnLCBsYW5nLT5jaGFybWFwKCksIGxhbmct
PmRhdGFfZW5jb2RpbmcoKSwgTm9ybVRvKSk7CiAgICBFWElUX09OX0VSUihvY29udjIuc2V0dXAo
KmNvbmZpZywgbGFuZy0+Y2hhcm1hcCgpLCBsYW5nLT5kYXRhX2VuY29kaW5nKCksIE5vcm1Ubykp
OwogIH0KICB3aGlsZSAod2xfaXRyLmFkdigpKSB7CiAgICBpZiAoKndsX2l0ci0+YWZmLnN0cikg
CiAgICAgIENPVVQucHJpbnRmKCIlcy8lc1xuIiwgb2NvbnYod2xfaXRyLT53b3JkKSwgb2NvbnYy
KHdsX2l0ci0+YWZmKSk7CiAgICBlbHNlCiAgICAgIENPVVQucHJpbnRsKG9jb252KHdsX2l0ci0+
d29yZCkpOwogIH0KfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vCi8vIG1hc3Rlcgov
LwoKdm9pZCBkdW1wIChhc3BlbGxlcjo6RGljdCAqIGx3cywgQ29udmVydCAqIGNvbnYpIAp7CiAg
dXNpbmcgbmFtZXNwYWNlIGFzcGVsbGVyOwoKICBzd2l0Y2ggKGx3cy0+YmFzaWNfdHlwZSkgewog
IGNhc2UgRGljdDo6YmFzaWNfZGljdDoKICAgIHsKICAgICAgRGljdGlvbmFyeSAqIHdzID0gc3Rh
dGljX2Nhc3Q8RGljdGlvbmFyeSAqPihsd3MpOwogICAgICBTdGFja1B0cjxXb3JkRW50cnlFbnVt
ZXJhdGlvbj4gZWxzKHdzLT5kZXRhaWxlZF9lbGVtZW50cygpKTsKICAgICAgV29yZEVudHJ5ICog
d2k7CiAgICAgIHdoaWxlICh3aSA9IGVscy0+bmV4dCgpLCB3aSkgewogICAgICAgIHdpLT53cml0
ZShDT1VULCp3cy0+bGFuZygpLCBjb252KTsKICAgICAgICBDT1VUIDw8ICdcbic7CiAgICAgIH0K
ICAgIH0KICAgIGJyZWFrOwogIGNhc2UgRGljdDo6bXVsdGlfZGljdDoKICAgIHsKICAgICAgU3Rh
Y2tQdHI8RGljdHNFbnVtZXJhdGlvbj4gZWxzKGx3cy0+ZGljdGlvbmFyaWVzKCkpOwogICAgICBE
aWN0ICogd3M7CiAgICAgIHdoaWxlICh3cyA9IGVscy0+bmV4dCgpLCB3cykgCglkdW1wICh3cywg
Y29udik7CiAgICB9CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgYWJvcnQoKTsKICB9Cn0KCnZv
aWQgbWFzdGVyICgpIHsKICB1c2luZyBuYW1lc3BhY2UgYXNwZWxsZXI7CgogIGlmIChhcmdzLnNp
emUoKSAhPSAwKSB7CiAgICBvcHRpb25zLT5yZXBsYWNlKCJtYXN0ZXIiLCBhcmdzWzBdLmNfc3Ry
KCkpOwogIH0KCiAgQ29uZmlnICogY29uZmlnID0gb3B0aW9uczsKCiAgaWYgKGFjdGlvbiA9PSBk
b19jcmVhdGUpIHsKICAgIAogICAgZmluZF9sYW5ndWFnZSgqY29uZmlnKTsKICAgIEVYSVRfT05f
RVJSKGNyZWF0ZV9kZWZhdWx0X3JlYWRvbmx5X2RpY3QKICAgICAgICAgICAgICAgIChuZXcgSXN0
cmVhbUVudW1lcmF0aW9uKENJTiksCiAgICAgICAgICAgICAgICAgKmNvbmZpZykpOwoKICB9IGVs
c2UgaWYgKGFjdGlvbiA9PSBkb19tZXJnZSkgewogICAgCiAgICBwcmludF9lcnJvcihfKCJDYW4n
dCBtZXJnZSBhIG1hc3RlciB3b3JkIGxpc3QgeWV0LiBTb3JyeS4iKSk7CiAgICBleGl0ICgxKTsK
ICAgIAogIH0gZWxzZSBpZiAoYWN0aW9uID09IGRvX2R1bXApIHsKCiAgICBFWElUX09OX0VSUl9T
RVQoYWRkX2RhdGFfc2V0KGNvbmZpZy0+cmV0cmlldmUoIm1hc3Rlci1wYXRoIiksICpjb25maWcp
LCBEaWN0ICosIGQpOwogICAgU3RhY2tQdHI8Q29udmVydD4gY29udihzZXR1cF9jb252KGQtPmxh
bmcoKSwgY29uZmlnKSk7CiAgICBkdW1wKGQsIGNvbnYpOwogIH0KfQoKLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vCi8vCi8vIHBlcnNvbmFsCi8vCgp2b2lkIHBlcnNvbmFsICgpIHsKICB1c2lu
ZyBuYW1lc3BhY2UgYXNwZWxsZXI7CgogIGlmIChhcmdzLnNpemUoKSAhPSAwKSB7CiAgICBFWElU
X09OX0VSUihvcHRpb25zLT5yZXBsYWNlKCJwZXJzb25hbCIsIGFyZ3NbMF0pKTsKICB9CiAgb3B0
aW9ucy0+cmVwbGFjZSgibW9kdWxlIiwgImFzcGVsbGVyIik7CiAgaWYgKGFjdGlvbiA9PSBkb19j
cmVhdGUgfHwgYWN0aW9uID09IGRvX21lcmdlKSB7CiAgICBDRVJSIDw8IF8oIlNvcnJ5IFwiY3Jl
YXRlL21lcmdlIHBlcnNvbmFsXCIgaXMgY3VycmVudGx5IHVuaW1wbGVtZW50ZWQuXG4iKTsKICAg
IGV4aXQoMyk7CgogICAgLy8gRklYTUUKI2lmIDAKICAgIFN0YWNrUHRyPFNwZWxsZXI+IHNwZWxs
ZXIobmV3X3NwZWxsZXIob3B0aW9ucykpOwoKICAgIGlmIChhY3Rpb24gPT0gZG9fY3JlYXRlKSB7
CiAgICAgIGlmIChmaWxlX2V4aXN0cyhzcGVsbGVyLT5jb25maWcoKS0+cmV0cmlldmUoInBlcnNv
bmFsLXBhdGgiKSkpIHsKICAgICAgICBwcmludF9lcnJvcihfKCJTb3JyeSBJIHdvbid0IG92ZXJ3
cml0ZSBcIiVzXCIiKSwgCgkJICAgIHNwZWxsZXItPmNvbmZpZygpLT5yZXRyaWV2ZSgicGVyc29u
YWwtcGF0aCIpKTsKICAgICAgICBleGl0ICgxKTsKICAgICAgfQogICAgICBzcGVsbGVyLT5wZXJz
b25hbF93b3JkX2xpc3QoKS5kYXRhLT5jbGVhcigpOwogICAgfQoKICAgIFN0cmluZyB3b3JkOwog
ICAgd2hpbGUgKENJTiA+PiB3b3JkKSAKICAgICAgc3BlbGxlci0+YWRkX3RvX3BlcnNvbmFsKHdv
cmQpOwoKICAgIHNwZWxsZXItPnNhdmVfYWxsX3dvcmRfbGlzdHMoKTsKI2VuZGlmCgogIH0gZWxz
ZSB7IC8vIGFjdGlvbiA9PSBkb19kdW1wCgogICAgLy8gRklYTUU6IFRoaXMgaXMgY3VycmVudGx5
IGJyb2tlbgoKICAgIENvbmZpZyAqIGNvbmZpZyA9IG9wdGlvbnM7CiAgICBEaWN0aW9uYXJ5ICog
cGVyID0gbmV3X2RlZmF1bHRfd3JpdGFibGVfZGljdCgqY29uZmlnKTsKICAgIEVYSVRfT05fRVJS
KHBlci0+bG9hZChjb25maWctPnJldHJpZXZlKCJwZXJzb25hbC1wYXRoIiksICpjb25maWcpKTsK
ICAgIFN0YWNrUHRyPFdvcmRFbnRyeUVudW1lcmF0aW9uPiBlbHMocGVyLT5kZXRhaWxlZF9lbGVt
ZW50cygpKTsKICAgIFN0YWNrUHRyPENvbnZlcnQ+IGNvbnYoc2V0dXBfY29udihwZXItPmxhbmco
KSwgY29uZmlnKSk7CgogICAgV29yZEVudHJ5ICogd2k7CiAgICB3aGlsZSAod2kgPSBlbHMtPm5l
eHQoKSwgd2kpIHsKICAgICAgd2ktPndyaXRlKENPVVQsKihwZXItPmxhbmcoKSksIGNvbnYpOwog
ICAgICBDT1VULnB1dCgnXG4nKTsKICAgIH0KICAgIGRlbGV0ZSBwZXI7CiAgfQp9CgovLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8KLy8KLy8gcmVwbAovLwoKdm9pZCByZXBsKCkgewogIHVzaW5n
IG5hbWVzcGFjZSBhc3BlbGxlcjsKCiAgaWYgKGFyZ3Muc2l6ZSgpICE9IDApIHsKICAgIG9wdGlv
bnMtPnJlcGxhY2UoInJlcGwiLCBhcmdzWzBdLmNfc3RyKCkpOwogIH0KCiAgaWYgKGFjdGlvbiA9
PSBkb19jcmVhdGUgfHwgYWN0aW9uID09IGRvX21lcmdlKSB7CgogICAgQ0VSUiA8PCBfKCJTb3Jy
eSBcImNyZWF0ZS9tZXJnZSByZXBsXCIgaXMgY3VycmVudGx5IHVuaW1wbGVtZW50ZWQuXG4iKTsK
ICAgIGV4aXQoMyk7CgogICAgLy8gRklYTUUKI2lmIDAKICAgIFNwZWxsZXJJbXBsIHNwZWxsZXIo
b3B0aW9ucyk7CgogICAgaWYgKGFjdGlvbiA9PSBkb19jcmVhdGUpIHsKICAgICAgaWYgKGZpbGVf
ZXhpc3RzKHNwZWxsZXItPmNvbmZpZygpLT5yZXRyaWV2ZSgicmVwbC1wYXRoIikpKSB7CiAgICAg
ICAgcHJpbnRfZXJyb3IoXygiU29ycnkgSSB3b24ndCBvdmVyd3JpdGUgXCIlc1wiIiksCgkJICAg
IHNwZWxsZXItPmNvbmZpZygpLT5yZXRyaWV2ZSgicmVwbC1wYXRoIikpOwogICAgICAgIGV4aXQg
KDEpOwogICAgICB9CiAgICAgIHNwZWxsZXItPnBlcnNvbmFsX3JlcGwoKS5jbGVhcigpOwogICAg
fQogICAgCiAgICB0cnkgewogICAgICBTdHJpbmcgd29yZCxyZXBsOwoKICAgICAgd2hpbGUgKHRy
dWUpIHsKCWdldF93b3JkX3BhaXIod29yZCxyZXBsLCc6Jyk7CglFWElUX09OX0VSUihzcGVsbGVy
LT5zdG9yZV9yZXBsKHdvcmQscmVwbCxmYWxzZSkpOwogICAgICB9CgogICAgfSBjYXRjaCAoYmFk
X2Npbikge30KCiAgICBFWElUX09OX0VSUihzcGVsbGVyLT5wZXJzb25hbF9yZXBsKCkuc3luY2hy
b25pemUoKSk7CgojZW5kaWYKCiAgfSBlbHNlIGlmIChhY3Rpb24gPT0gZG9fZHVtcCkgewoKICAg
IC8vIEZJWE1FOiBUaGlzIGlzIGN1cnJlbnRseSBicm9rZW4KCiAgICBSZXBsYWNlbWVudERpY3Qg
KiByZXBsID0gbmV3X2RlZmF1bHRfcmVwbGFjZW1lbnRfZGljdCgqb3B0aW9ucyk7CiAgICByZXBs
LT5sb2FkKG9wdGlvbnMtPnJldHJpZXZlKCJyZXBsLXBhdGgiKSwgKm9wdGlvbnMpOwogICAgU3Rh
Y2tQdHI8V29yZEVudHJ5RW51bWVyYXRpb24+IGVscyhyZXBsLT5kZXRhaWxlZF9lbGVtZW50cygp
KTsKICAgIAogICAgV29yZEVudHJ5ICogcmwgPSAwOwogICAgV29yZEVudHJ5IHdvcmRzOwogICAg
Q29udiBjb252KHNldHVwX2NvbnYocmVwbC0+bGFuZygpLCBvcHRpb25zKSk7CiAgICB3aGlsZSAo
KHJsID0gZWxzLT5uZXh0KCkpKSB7CiAgICAgIHJlcGwtPnJlcGxfbG9va3VwKCpybCwgd29yZHMp
OwogICAgICBkbyB7CiAgICAgICAgQ09VVCA8PCBjb252KHJsLT53b3JkKSA8PCAiOiAiIDw8IGNv
bnYod29yZHMud29yZCkgPDwgIlxuIjsKICAgICAgfSB3aGlsZSAod29yZHMuYWR2KCkpOwogICAg
fQogICAgZGVsZXRlIHJlcGw7CiAgfQp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwov
LyBzb3VuZHNsaWtlCi8vCgp2b2lkIHNvdW5kc2xpa2UoKSB7CiAgdXNpbmcgbmFtZXNwYWNlIGFz
cGVsbGVyOwogIENhY2hlUHRyPExhbmd1YWdlPiBsYW5nOwogIGZpbmRfbGFuZ3VhZ2UoKm9wdGlv
bnMpOwogIFBvc2liRXJyPExhbmd1YWdlICo+IHJlcyA9IG5ld19sYW5ndWFnZSgqb3B0aW9ucyk7
CiAgaWYgKHJlcy5oYXNfZXJyKCkpIHtwcmludF9lcnJvcihyZXMuZ2V0X2VycigpLT5tZXNnKTsg
ZXhpdCgxKTt9CiAgbGFuZy5yZXNldChyZXMuZGF0YSk7CiAgQ29udiBpY29udihzZXR1cF9jb252
KG9wdGlvbnMsIGxhbmcpKTsKICBDb252IG9jb252KHNldHVwX2NvbnYobGFuZywgb3B0aW9ucykp
OwogIFN0cmluZyB3b3JkOwogIFN0cmluZyBzbDsKICBsaW5lX2J1ZmZlcigpOwogIHdoaWxlIChD
SU4uZ2V0bGluZSh3b3JkKSkgewogICAgY29uc3QgY2hhciAqIHcgPSBpY29udih3b3JkKTsKICAg
IGxhbmctPkxhbmdJbXBsOjp0b19zb3VuZHNsaWtlKHNsLCB3KTsKICAgIHByaW50ZigiJXNcdCVz
XG4iLCB3b3JkLnN0cigpLCBvY29udihzbCkpOwogIH0KfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8KLy8KLy8gbXVuY2gKLy8KCnZvaWQgbXVuY2goKSAKewogIHVzaW5nIG5hbWVzcGFjZSBh
c3BlbGxlcjsKICBDYWNoZVB0cjxMYW5ndWFnZT4gbGFuZzsKICBmaW5kX2xhbmd1YWdlKCpvcHRp
b25zKTsKICBQb3NpYkVycjxMYW5ndWFnZSAqPiByZXMgPSBuZXdfbGFuZ3VhZ2UoKm9wdGlvbnMp
OwogIGlmIChyZXMuaGFzX2VycigpKSB7cHJpbnRfZXJyb3IocmVzLmdldF9lcnIoKS0+bWVzZyk7
IGV4aXQoMSk7fQogIGxhbmcucmVzZXQocmVzLmRhdGEpOwogIENvbnYgaWNvbnYoc2V0dXBfY29u
dihvcHRpb25zLCBsYW5nKSk7CiAgQ29udiBvY29udihzZXR1cF9jb252KGxhbmcsIG9wdGlvbnMp
KTsKICBTdHJpbmcgd29yZDsKICBHdWVzc0luZm8gZ2k7CiAgbGluZV9idWZmZXIoKTsKICB3aGls
ZSAoQ0lOLmdldGxpbmUod29yZCkpIHsKICAgIGxhbmctPm11bmNoKGljb252KHdvcmQpLCAmZ2kp
OwogICAgQ09VVCA8PCB3b3JkOwogICAgZm9yIChjb25zdCBhc3BlbGxlcjo6Q2hlY2tJbmZvICog
Y2kgPSBnaS5oZWFkOyBjaTsgY2kgPSBjaS0+bmV4dCkKICAgIHsKICAgICAgQ09VVCA8PCAnICcg
PDwgb2NvbnYoY2ktPndvcmQuc3RyLCBjaS0+d29yZC5sZW4pIDw8ICcvJzsKICAgICAgaWYgKGNp
LT5wcmVfZmxhZyAhPSAwKSBDT1VUIDw8IG9jb252KHN0YXRpY19jYXN0PGNoYXI+KGNpLT5wcmVf
ZmxhZykpOwogICAgICBpZiAoY2ktPnN1Zl9mbGFnICE9IDApIENPVVQgPDwgb2NvbnYoc3RhdGlj
X2Nhc3Q8Y2hhcj4oY2ktPnN1Zl9mbGFnKSk7CiAgICB9CiAgICBDT1VUIDw8ICdcbic7CiAgfQp9
CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBleHBhbmQKLy8KCnZvaWQgZXhwYW5k
KCkgCnsKICBpbnQgbGV2ZWwgPSAxOwogIGlmIChhcmdzLnNpemUoKSA+IDApCiAgICBsZXZlbCA9
IGF0b2koYXJnc1swXS5jX3N0cigpKTsgLy9GSVhNRTogTW9yZSB2ZXJib3NlCiAgaW50IGxpbWl0
ID0gSU5UX01BWDsKICBpZiAoYXJncy5zaXplKCkgPiAxKQogICAgbGltaXQgPSBhdG9pKGFyZ3Nb
MV0uY19zdHIoKSk7CiAgCiAgdXNpbmcgbmFtZXNwYWNlIGFzcGVsbGVyOwogIENhY2hlUHRyPExh
bmd1YWdlPiBsYW5nOwogIGZpbmRfbGFuZ3VhZ2UoKm9wdGlvbnMpOwogIFBvc2liRXJyPExhbmd1
YWdlICo+IHJlcyA9IG5ld19sYW5ndWFnZSgqb3B0aW9ucyk7CiAgaWYgKHJlcy5oYXNfZXJyKCkp
IHtwcmludF9lcnJvcihyZXMuZ2V0X2VycigpLT5tZXNnKTsgZXhpdCgxKTt9CiAgbGFuZy5yZXNl
dChyZXMuZGF0YSk7CiAgQ29udiBpY29udihzZXR1cF9jb252KG9wdGlvbnMsIGxhbmcpKTsKICBD
b252IG9jb252KHNldHVwX2NvbnYobGFuZywgb3B0aW9ucykpOwogIFN0cmluZyB3b3JkLCBidWY7
CiAgT2JqU3RhY2sgZXhwX2J1ZjsKICBXb3JkQWZmICogZXhwX2xpc3Q7CiAgbGluZV9idWZmZXIo
KTsKICB3aGlsZSAoQ0lOLmdldGxpbmUod29yZCkpIHsKICAgIGJ1ZiA9IHdvcmQ7CiAgICBjaGFy
ICogdyA9IGljb252KGJ1Zi5tc3RyKCksIGJ1Zi5zaXplKCkpOwogICAgY2hhciAqIGFmID0gc3Ry
Y2hyKHcsICcvJyk7CiAgICBzaXplX3QgczsKICAgIGlmIChhZiAhPSAwKSB7CiAgICAgIHMgPSBh
ZiAtIHc7CiAgICAgICphZisrID0gJ1wwJzsKICAgIH0gZWxzZSB7CiAgICAgIHMgPSBzdHJsZW4o
dyk7CiAgICAgIGFmID0gdyArIHM7CiAgICB9CiAgICBleHBfYnVmLnJlc2V0KCk7CiAgICBleHBf
bGlzdCA9IGxhbmctPmV4cGFuZCh3LCBhZiwgZXhwX2J1ZiwgbGltaXQpOwogICAgaWYgKGxldmVs
IDw9IDIpIHsKICAgICAgaWYgKGxldmVsID09IDIpIAogICAgICAgIENPVVQgPDwgd29yZCA8PCAn
ICc7CiAgICAgIFdvcmRBZmYgKiBwID0gZXhwX2xpc3Q7CiAgICAgIHdoaWxlIChwKSB7CiAgICAg
ICAgQ09VVCA8PCBvY29udihwLT53b3JkKTsKICAgICAgICBpZiAobGltaXQgPCBJTlRfTUFYICYm
IHAtPmFmZlswXSkgQ09VVCA8PCAnLycgPDwgb2NvbnYoKGNvbnN0IGNoYXIgKilwLT5hZmYpOwog
ICAgICAgIHAgPSBwLT5uZXh0OwogICAgICAgIGlmIChwKSBDT1VUIDw8ICcgJzsKICAgICAgfQog
ICAgICBDT1VUIDw8ICdcbic7CiAgICB9IGVsc2UgaWYgKGxldmVsID49IDMpIHsKICAgICAgZG91
YmxlIHJhdGlvID0gMDsKICAgICAgaWYgKGxldmVsID49IDQpIHsKICAgICAgICBmb3IgKFdvcmRB
ZmYgKiBwID0gZXhwX2xpc3Q7IHA7IHAgPSBwLT5uZXh0KQogICAgICAgICAgcmF0aW8gKz0gcC0+
d29yZC5zaXplOwogICAgICAgIHJhdGlvIC89IGV4cF9saXN0LT53b3JkLnNpemU7IC8vIGl0IGlz
IGFzc3VtZWQgdGhlIGZpcnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gZXhwYW5zaW9uIGlzIGp1c3QgdGhlIHJvb3QKICAgICAgfQogICAgICBmb3IgKFdvcmRBZmYg
KiBwID0gZXhwX2xpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CiAgICAgICAgQ09VVCA8PCB3b3JkIDw8
ICcgJyA8PCBvY29udihwLT53b3JkKTsKICAgICAgICBpZiAobGltaXQgPCBJTlRfTUFYICYmIHAt
PmFmZlswXSkgQ09VVCA8PCAnLycgPDwgb2NvbnYoKGNvbnN0IGNoYXIgKilwLT5hZmYpOwogICAg
ICAgIGlmIChsZXZlbCA+PSA0KSBDT1VULnByaW50ZigiICVmXG4iLCByYXRpbyk7CiAgICAgICAg
ZWxzZSBDT1VUIDw8ICdcbic7CiAgICAgIH0KICAgIH0KICB9Cn0KCi8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vCi8vCi8vIGNvbWJpbmUKLy8KCnN0YXRpYyB2b2lkIGNvbWJpbmVfYWZmKFN0cmlu
ZyAmIGFmZiwgY29uc3QgY2hhciAqIGFwcCkKewogIGZvciAoOyAqYXBwOyArK2FwcCkgewogICAg
aWYgKCFtZW1jaHIoYWZmLmNfc3RyKCksKmFwcCxhZmYuc2l6ZSgpKSkKICAgICAgYWZmLnB1c2hf
YmFjaygqYXBwKTsKICB9Cn0KCnN0YXRpYyB2b2lkIHByaW50X3dvcmRhZmYoY29uc3QgU3RyaW5n
ICYgYmFzZSwgY29uc3QgU3RyaW5nICYgYWZmcywgQ29udiAmIG9jb252KQp7CiAgaWYgKGJhc2Uu
ZW1wdHkoKSkgcmV0dXJuOwogIENPVVQgPDwgb2NvbnYoYmFzZSk7CiAgaWYgKGFmZnMuZW1wdHko
KSkKICAgIENPVVQgPDwgJ1xuJzsKICBlbHNlCiAgICBDT1VULnByaW50ZigiLyVzXG4iLCBvY29u
dihhZmZzKSk7Cn0KCnN0YXRpYyBib29sIGxvd2VyX2VxdWFsKGFzcGVsbGVyOjpMYW5ndWFnZSAq
IGwsIFBhcm1TdHJpbmcgYSwgUGFybVN0cmluZyBiKQp7CiAgaWYgKGEuc2l6ZSgpICE9IGIuc2l6
ZSgpKSByZXR1cm4gZmFsc2U7CiAgaWYgKGwtPnRvX2xvd2VyKGFbMF0pICE9IGwtPnRvX2xvd2Vy
KGJbMF0pKSByZXR1cm4gZmFsc2U7CiAgcmV0dXJuIG1lbWNtcChhICsgMSwgYiArIDEsIGEuc2l6
ZSgpIC0gMSkgPT0gMDsKfQoKdm9pZCBjb21iaW5lKCkKewogIHVzaW5nIG5hbWVzcGFjZSBhc3Bl
bGxlcjsKICBDYWNoZVB0cjxMYW5ndWFnZT4gbGFuZzsKICBmaW5kX2xhbmd1YWdlKCpvcHRpb25z
KTsKICBQb3NpYkVycjxMYW5ndWFnZSAqPiByZXMgPSBuZXdfbGFuZ3VhZ2UoKm9wdGlvbnMpOwog
IGlmIChyZXMuaGFzX2VycigpKSB7cHJpbnRfZXJyb3IocmVzLmdldF9lcnIoKS0+bWVzZyk7IGV4
aXQoMSk7fQogIGxhbmcucmVzZXQocmVzLmRhdGEpOwogIENvbnYgaWNvbnYoc2V0dXBfY29udihv
cHRpb25zLCBsYW5nKSk7CiAgQ29udiBvY29udihzZXR1cF9jb252KGxhbmcsIG9wdGlvbnMpKTsK
ICBTdHJpbmcgd29yZDsKICBTdHJpbmcgYmFzZTsKICBTdHJpbmcgYWZmczsKICBsaW5lX2J1ZmZl
cigpOwogIHdoaWxlIChDSU4uZ2V0bGluZSh3b3JkKSkgewogICAgd29yZCA9IGljb252KHdvcmQp
OwoKICAgIENoYXJWZWN0b3IgYnVmOyBidWYuYXBwZW5kKHdvcmQuY19zdHIoKSwgd29yZC5zaXpl
KCkgKyAxKTsKICAgIGNoYXIgKiB3ID0gYnVmLmRhdGEoKTsKICAgIGNoYXIgKiBhZiA9IHN0cmNo
cih3LCAnLycpOwogICAgc2l6ZV90IHM7CiAgICBpZiAoYWYgIT0gMCkgewogICAgICBzID0gYWYg
LSB3OwogICAgICAqYWYrKyA9ICdcMCc7CiAgICB9IGVsc2UgewogICAgICBzID0gc3RybGVuKHcp
OwogICAgICBhZiA9IHcgKyBzOwogICAgfQoKICAgIGlmIChsb3dlcl9lcXVhbChsYW5nLCBiYXNl
LCB3KSkgewogICAgICBpZiAobGFuZy0+aXNfbG93ZXIoYmFzZS5zdHIoKSkpIHsKICAgICAgICBj
b21iaW5lX2FmZihhZmZzLCBhZik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYmFzZSA9IHc7CiAg
ICAgICAgY29tYmluZV9hZmYoYWZmcywgYWYpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBw
cmludF93b3JkYWZmKGJhc2UsIGFmZnMsIG9jb252KTsKICAgICAgYmFzZSA9IHc7CiAgICAgIGFm
ZnMgPSBhZjsKICAgIH0KCiAgfQogIHByaW50X3dvcmRhZmYoYmFzZSwgYWZmcywgb2NvbnYpOwp9
CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBtdW5jaCBsaXN0Ci8vCgp2b2lkIG11
bmNoX2xpc3Rfc2ltcGxlKCk7CnZvaWQgbXVuY2hfbGlzdF9jb21wbGV0ZShib29sLCBib29sKTsK
CnZvaWQgbXVuY2hfbGlzdCgpCnsKICBib29sIHNpbXBsZSA9IGZhbHNlOwogIGJvb2wgbXVsdGkg
PSBmYWxzZTsKICBib29sIHNpbXBsaWZ5ID0gdHJ1ZTsKCiAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IGFyZ3Muc2l6ZSgpOyArK2kpIHsKICAgIGlmIChhcmdzW2ldID09ICJzaW1wbGUiKSAgICAg
IHNpbXBsZSA9IHRydWU7CiAgICBlbHNlIGlmIChhcmdzW2ldID09ICJzaW5nbGUiKSBtdWx0aSA9
IGZhbHNlOwogICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAibXVsdGkiKSAgbXVsdGkgPSB0cnVlOwog
ICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAia2VlcCIpICAgc2ltcGxpZnkgPSBmYWxzZTsKICAgIGVs
c2UgCiAgICB7CiAgICAgIHByaW50X2Vycm9yKF8oIlwiJXNcIiBpcyBub3QgYSB2YWxpZCBmbGFn
IGZvciB0aGUgXCJtdW5jaC1saXN0XCIgY29tbWFuZC4iKSwKICAgICAgICAgICAgICAgICAgYXJn
c1tpXSk7CiAgICAgIGV4aXQoMSk7CiAgICB9CiAgfQogIGlmIChzaW1wbGUpCiAgICBtdW5jaF9s
aXN0X3NpbXBsZSgpOwogIGVsc2UKICAgIG11bmNoX2xpc3RfY29tcGxldGUobXVsdGksIHNpbXBs
aWZ5KTsKfQoKLy8KLy8gbXVuY2ggbGlzdCAoc2ltcGxlIHZlcnNpb24pCi8vCgovLyBUaGlzIHZl
cnNpb24gd29ya3MgdGhlIHNhbWUgd2F5IGFzIHRoZSBteXNwZWxsICJtdW5jaCIgcHJvZ3JhbS4K
Ly8gSG93ZXZlciwgYmVjYXVzZSB0aGUgcmVzdWx0cyBkZXBlbmRzIG9uIHRoZSBoYXNoIHRhYmxl
IHVzZWQgYW5kIHRoZQovLyBvcmRlciBvZiB0aGUgd29yZCBsaXN0IGl0IHdvbm4ndCBwcm9kdWNl
IGlkZW50aWNhbCByZXN1bHRzLgoKc3RydWN0IFNNTF9Xb3JkRW50cnkgewogIGNvbnN0IGNoYXIg
KiB3b3JkOwogIGNoYXIgKiBhZmY7CiAgYm9vbCBrZWVwOyAvLyBib29sZWFuCiAgU01MX1dvcmRF
bnRyeShjb25zdCBjaGFyICogdyA9IDApIDogd29yZCh3KSwgYWZmKDApLCBrZWVwKGZhbHNlKSB7
fQp9OwoKc3RydWN0IFNNTF9QYXJtcyB7CiAgdHlwZWRlZiBTTUxfV29yZEVudHJ5IFZhbHVlOwog
IHR5cGVkZWYgY29uc3QgY2hhciAqIEtleTsKICBzdGF0aWMgY29uc3QgYm9vbCBpc19tdWx0aSA9
IGZhbHNlOwogIGFjb21tb246Omhhc2g8Y29uc3QgY2hhciAqPiBoYXNoOwogIGJvb2wgZXF1YWwo
S2V5IHgsIEtleSB5KSB7cmV0dXJuIHN0cmNtcCh4LHkpID09IDA7fQogIEtleSBrZXkoY29uc3Qg
VmFsdWUgJiB2KSB7cmV0dXJuIHYud29yZDt9Cn07Cgp0eXBlZGVmIEhhc2hUYWJsZTxTTUxfUGFy
bXM+IFNNTF9UYWJsZTsKCnN0YXRpYyBpbmxpbmUgdm9pZCBhZGRfYWZmaXgoU01MX1RhYmxlOjpp
dGVyYXRvciBiLCBjaGFyIGFmZikKewogIGNoYXIgKiBwID0gYi0+YWZmOwogIGlmIChwKSB7d2hp
bGUgKCpwKSB7aWYgKCpwID09IGFmZikgcmV0dXJuOyArK3A7fX0KICBpbnQgcyA9IHAgLSBiLT5h
ZmY7CiAgYi0+YWZmID0gKGNoYXIgKilyZWFsbG9jKGItPmFmZiwgcyArIDIpOwogIGItPmFmZltz
ICsgMF0gPSBhZmY7CiAgYi0+YWZmW3MgKyAxXSA9ICdcMCc7Cn0KCnZvaWQgbXVuY2hfbGlzdF9z
aW1wbGUoKQp7CiAgdXNpbmcgbmFtZXNwYWNlIGFzcGVsbGVyOwogIENhY2hlUHRyPExhbmd1YWdl
PiBsYW5nOwogIGZpbmRfbGFuZ3VhZ2UoKm9wdGlvbnMpOwogIFBvc2liRXJyPExhbmd1YWdlICo+
IHJlcyA9IG5ld19sYW5ndWFnZSgqb3B0aW9ucyk7CiAgaWYgKHJlcy5oYXNfZXJyKCkpIHtwcmlu
dF9lcnJvcihyZXMuZ2V0X2VycigpLT5tZXNnKTsgZXhpdCgxKTt9CiAgbGFuZy5yZXNldChyZXMu
ZGF0YSk7CiAgQ29udiBpY29udihzZXR1cF9jb252KG9wdGlvbnMsIGxhbmcpKTsKICBDb252IG9j
b252KHNldHVwX2NvbnYobGFuZywgb3B0aW9ucykpOwogIFN0cmluZyB3b3JkLCBidWY7CiAgT2Jq
U3RhY2sgZXhwX2J1ZjsKICBXb3JkQWZmICogZXhwX2xpc3Q7CiAgR3Vlc3NJbmZvIGdpOwogIFNN
TF9UYWJsZSB0YWJsZTsKICBPYmpTdGFjayB0YWJsZV9idWY7CgogIC8vIGFkZCB3b3JkcyB0byBk
aWN0aW9uYXJ5CiAgd2hpbGUgKENJTi5nZXRsaW5lKHdvcmQpKSB7CiAgICBidWYgPSB3b3JkOwog
ICAgY2hhciAqIHcgPSBpY29udihidWYubXN0cigpLCBidWYuc2l6ZSgpKTsKICAgIGNoYXIgKiBh
ZiA9IHN0cmNocih3LCAnLycpOwogICAgc2l6ZV90IHM7CiAgICBpZiAoYWYgIT0gMCkgewogICAg
ICBzID0gYWYgLSB3OwogICAgICAqYWYrKyA9ICdcMCc7CiAgICB9IGVsc2UgewogICAgICBzID0g
c3RybGVuKHcpOwogICAgICBhZiA9IHcgKyBzOwogICAgfQogICAgZXhwX2J1Zi5yZXNldCgpOwog
ICAgZXhwX2xpc3QgPSBsYW5nLT5leHBhbmQodywgYWYsIGV4cF9idWYpOwogICAgZm9yIChXb3Jk
QWZmICogcSA9IGV4cF9saXN0OyBxOyBxID0gcS0+bmV4dCkgewogICAgICB0YWJsZS5pbnNlcnQo
U01MX1dvcmRFbnRyeSh0YWJsZV9idWYuZHVwKHEtPndvcmQpKSk7CiAgICB9CiAgfQoKICAvLyBu
b3cgdHJ5IHRvIG11bmNoIGVhY2ggd29yZCBpbiB0aGUgZGljdGlvbmFyeQogIFNNTF9UYWJsZTo6
aXRlcmF0b3IgcCA9IHRhYmxlLmJlZ2luKCk7CiAgU01MX1RhYmxlOjppdGVyYXRvciBlbmQgPSB0
YWJsZS5lbmQoKTsKICBTdHJpbmcgZmxhZ3M7CiAgZm9yICg7IHAgIT0gZW5kOyArK3ApIAogIHsK
ICAgIGNvbnN0IGFzcGVsbGVyOjpDaGVja0luZm8gKiBiZXN0ID0gMDsKICAgIHVuc2lnbmVkIG1p
bl9iYXNlX3NpemUgPSBJTlRfTUFYOwogICAgbGFuZy0+bXVuY2gocC0+d29yZCwgJmdpKTsKICAg
IGNvbnN0IGFzcGVsbGVyOjpDaGVja0luZm8gKiBjaSA9IGdpLmhlYWQ7CiAgICB3aGlsZSAoY2kp
CiAgICB7IHsKICAgICAgLy8gY2hlY2sgaWYgdGhlIGJhc2Ugd29yZCBpcyBpbiB0aGUgZGljdGlv
bmFyeQogICAgICBTTUxfVGFibGU6Oml0ZXJhdG9yIGIgPSB0YWJsZS5maW5kKGNpLT53b3JkLnN0
cik7CiAgICAgIGlmIChiID09IHRhYmxlLmVuZCgpKSBnb3RvIGNvbnQ7CgogICAgICAvLyBjaGVj
ayBpZiBhbGwgdGhlIHdvcmRzIG9uY2UgZXhwYW5kZWQgYXJlIGluIHRoZSBkaWN0aW9uYXJ5CiAg
ICAgIC8vIHRoaXMgaW5jbHVkZWQgdGhlIGV4aXRpbmcgZmxhZ3MgZHVlIHRvIHByZS1zdWYgY3Jv
c3MgcHJvZHVjdHMKICAgICAgaWYgKGItPmFmZikgZmxhZ3MgPSBiLT5hZmY7CiAgICAgIGVsc2Ug
ICAgICAgIGZsYWdzLmNsZWFyKCk7CiAgICAgIGlmIChjaS0+cHJlX2ZsYWcgIT0gMCkgZmxhZ3Mg
Kz0gY2ktPnByZV9mbGFnOwogICAgICBpZiAoY2ktPnN1Zl9mbGFnICE9IDApIGZsYWdzICs9IGNp
LT5zdWZfZmxhZzsKICAgICAgZXhwX2J1Zi5yZXNldCgpOwogICAgICBleHBfbGlzdCA9IGxhbmct
PmV4cGFuZChjaS0+d29yZC5zdHIsIGZsYWdzLCBleHBfYnVmKTsKICAgICAgZm9yIChXb3JkQWZm
ICogcSA9IGV4cF9saXN0OyBxOyBxID0gcS0+bmV4dCkgewogICAgICAgIGlmICghdGFibGUuaGF2
ZShxLT53b3JkKSkgZ290byBjb250OwogICAgICB9CgogICAgICAvLyB0aGUgYmFzZSB3b3JkIGFu
ZCBmbGFncyBhcmUgdmFsaWQsIG5vdyBrZWVwIHRoZSBvbmUgd2l0aCB0aGUKICAgICAgLy8gc21h
bGxlc3QgYmFzZSB3b3JkCiAgICAgIGlmIChjaS0+d29yZC5sZW4gPCBtaW5fYmFzZV9zaXplKSB7
CiAgICAgICAgbWluX2Jhc2Vfc2l6ZSA9IGNpLT53b3JkLmxlbjsKICAgICAgICBiZXN0ID0gY2k7
CiAgICAgIH0KCiAgICB9IGNvbnQ6CiAgICAgIGNpID0gY2ktPm5leHQ7CiAgICB9CiAgICAvLyBu
b3cgYWRkIHRoZSBiYXNlIHRvIHRoZSBrZWVwIGxpc3QgaWYgb25lIGV4aXN0cwogICAgLy8gb3Ro
ZXJ3aXNlIGp1c3Qga2VlcCB0aGUgb3JpZ2luYWwgd29yZAogICAgaWYgKGJlc3QpIHsKICAgICAg
U01MX1RhYmxlOjppdGVyYXRvciBiID0gdGFibGUuZmluZChiZXN0LT53b3JkLnN0cik7CiAgICAg
IGFzc2VydChiICE9IHRhYmxlLmVuZCgpKTsKICAgICAgaWYgKGJlc3QtPnByZV9mbGFnKSBhZGRf
YWZmaXgoYiwgYmVzdC0+cHJlX2ZsYWcpOwogICAgICBpZiAoYmVzdC0+c3VmX2ZsYWcpIGFkZF9h
ZmZpeChiLCBiZXN0LT5zdWZfZmxhZyk7CiAgICAgIGItPmtlZXAgPSB0cnVlOwogICAgfSBlbHNl
IHsKICAgICAgcC0+a2VlcCA9IHRydWU7CiAgICB9CiAgfQoKICAvLyBQcmludCB0aGUgZW50cmll
cyBpbiB0aGUgdGFibGUgbWFya2VkIGFzICJ0byBrZWVwIgogIHAgPSB0YWJsZS5iZWdpbigpOwog
IGZvciAoOyBwICE9IGVuZDsgKytwKSAKICB7CiAgICBpZiAocC0+a2VlcCkgewogICAgICBDT1VU
IDw8IG9jb252KHAtPndvcmQpOwogICAgICBpZiAocC0+YWZmKSB7CiAgICAgICAgQ09VVCA8PCAn
LycgPDwgb2NvbnYocC0+YWZmKTsKICAgICAgfQogICAgICBDT1VUIDw8ICdcbic7CiAgICB9CiAg
fQoKICBwID0gdGFibGUuYmVnaW4oKTsKICBmb3IgKDsgcCAhPSBlbmQ7ICsrcCkgCiAgewogICAg
aWYgKHAtPmFmZikgZnJlZShwLT5hZmYpOwogICAgcC0+YWZmID0gMDsKICB9Cn0KCi8vCi8vIG11
bmNoIGxpc3QgKGNvbXBsZXRlIHZlcnNpb24pCi8vCi8vCi8vIFRoaXMgdmVyc2lvbiB3aWxsIHBy
b2R1Y2UgYSBzbWFsbGVyIGxpc3QgdGhhbiB0aGUgc2ltcGxlIHZlcnNpb24uCi8vIEl0IGlzIHZl
cnkgY2xvc2UgdG8gdGhlIG9wdGltdW0gcmVzdWx0LiAKLy8KCi8vCi8vIEhhc2ggdGFibGUgdG8g
c3RvcmUgdGhlIHdvcmRzCi8vCgpzdHJ1Y3QgQ01MX0VudHJ5IHsKICBjb25zdCBjaGFyICogd29y
ZDsKICBjaGFyICogYWZmOwogIENNTF9FbnRyeSAqIHBhcmVudDsKICBDTUxfRW50cnkgKiBuZXh0
OwogIGludCByYW5rOwogIENNTF9FbnRyeShjb25zdCBjaGFyICogdyA9IDApIDogd29yZCh3KSwg
YWZmKDApLCBwYXJlbnQoMCksIG5leHQoMCksIHJhbmsoMCkge30KfTsKCnN0cnVjdCBDTUxfUGFy
bXMgewogIHR5cGVkZWYgQ01MX0VudHJ5IFZhbHVlOwogIHR5cGVkZWYgY29uc3QgY2hhciAqIEtl
eTsKICBzdGF0aWMgY29uc3QgYm9vbCBpc19tdWx0aSA9IHRydWU7CiAgYWNvbW1vbjo6aGFzaDxj
b25zdCBjaGFyICo+IGhhc2g7CiAgYm9vbCBlcXVhbChLZXkgeCwgS2V5IHkpIHtyZXR1cm4gc3Ry
Y21wKHgseSkgPT0gMDt9CiAgS2V5IGtleShjb25zdCBWYWx1ZSAmIHYpIHtyZXR1cm4gdi53b3Jk
O30KfTsKCnR5cGVkZWYgSGFzaFRhYmxlPENNTF9QYXJtcz4gQ01MX1RhYmxlOwoKLy8KLy8gYWRk
IGFuIGFmZml4IHRvIGEgd29yZCBidXQga2VlcCB0aGUgcHJlZml4ZXMgYW5kIHN1ZmZpeGVzIHNl
cGFyYXRlCi8vCgpzdGF0aWMgdm9pZCBhZGRfYWZmaXgoQ01MX1RhYmxlOjppdGVyYXRvciBiLCBj
aGFyIGFmZiwgYm9vbCBwcmVmaXgpCnsKICBjaGFyICogcCA9IGItPmFmZjsKICBpbnQgcyA9IDM7
CiAgaWYgKHApIHsKICAgIHdoaWxlICgqcCkgewogICAgICBpZiAoKnAgPT0gYWZmKSByZXR1cm47
IAogICAgICArK3A7CiAgICB9CiAgICBzID0gKHAgLSBiLT5hZmYpICsgMjsKICB9CiAgY2hhciAq
IHRtcCA9IChjaGFyICopbWFsbG9jKHMpOwogIHAgPSBiLT5hZmY7CiAgY2hhciAqIHEgPSB0bXA7
CiAgaWYgKHApIHt3aGlsZSAoKnAgIT0gJy8nKSAqcSsrID0gKnArKzt9CiAgaWYgKHByZWZpeCkg
KnErKyA9IGFmZjsKICAqcSsrID0gJy8nOwogIGlmIChwKSB7cCsrOyB3aGlsZSAoKnAgIT0gJ1ww
JykgKnErKyA9ICpwKys7fQogIGlmICghcHJlZml4KSAqcSsrID0gYWZmOwogICpxKysgPSAnXDAn
OwogIGFzc2VydChxIC0gdG1wID09IHMpOwogIGlmIChiLT5hZmYpIGZyZWUoYi0+YWZmKTsKICBi
LT5hZmYgPSB0bXA7Cn0KCi8vCi8vIFN0YW5kYXJkIGRpc2pvaW50IHNldCBhbGdvIHdpdGggdW5p
b24gYnkgcmFuayBhbmQgcGF0aCBjb21wcmVzc2lvbgovLwoKc3RhdGljIHZvaWQgbGluayhDTUxf
RW50cnkgKiB4LCBDTUxfRW50cnkgKiB5KQp7CiAgaWYgKHggPT0geSkgcmV0dXJuOwogIGlmICh4
LT5yYW5rID4geS0+cmFuaykgewogICAgeS0+cGFyZW50ID0geDsKICB9IGVsc2UgewogICAgeC0+
cGFyZW50ID0geTsKICAgIGlmICh4LT5yYW5rID09IHktPnJhbmspIHktPnJhbmsrKzsKICB9Cn0K
CnN0YXRpYyBDTUxfRW50cnkgKiBmaW5kX3NldCAoQ01MX0VudHJ5ICogeCkgCnsKICBpZiAoeC0+
cGFyZW50KQogICAgcmV0dXJuIHgtPnBhcmVudCA9IGZpbmRfc2V0KHgtPnBhcmVudCk7CiAgZWxz
ZQogICAgcmV0dXJuIHg7Cn0KCi8vCi8vIFN0dWZmIHRvIG1hbmFnZSBwcmVmaXgtc3VmZml4IGNv
bWJpbmF0aW9ucwovLwoKc3RydWN0IFByZVN1ZiB7CiAgU3RyaW5nIHByZTsKICBTdHJpbmcgc3Vm
OwogIFN0cmluZyAmIGdldChpbnQgaSkge3JldHVybiBpID09IDAgPyBwcmUgOiBzdWY7fQogIGNv
bnN0IFN0cmluZyAmIGdldChpbnQgaSkgY29uc3Qge3JldHVybiBpID09IDAgPyBwcmUgOiBzdWY7
fQogIFByZVN1ZigpIDogbmV4dCgwKSB7fQogIFByZVN1ZiAqIG5leHQ7Cn07CgpjbGFzcyBQcmVT
dWZMaXN0IHsKcHVibGljOgogIFByZVN1ZiAqIGhlYWQ7CiAgUHJlU3VmTGlzdCgpIDogaGVhZCgw
KSB7fQogIHZvaWQgYWRkKFByZVN1ZiAqIHRvX2FkZCkgewogICAgdG9fYWRkLT5uZXh0ID0gaGVh
ZDsKICAgIGhlYWQgPSB0b19hZGQ7CiAgfQogIHZvaWQgY2xlYXIoKSB7CiAgICB3aGlsZSAoaGVh
ZCkgewogICAgICBQcmVTdWYgKiB0bXAgPSBoZWFkOwogICAgICBoZWFkID0gaGVhZC0+bmV4dDsK
ICAgICAgZGVsZXRlIHRtcDsKICAgIH0KICB9CiAgdm9pZCB0cmFuc2ZlcihQcmVTdWZMaXN0ICYg
b3RoZXIpIHsKICAgIGNsZWFyKCk7CiAgICBoZWFkID0gb3RoZXIuaGVhZDsKICAgIG90aGVyLmhl
YWQgPSAwOwogIH0KICB+UHJlU3VmTGlzdCgpIHsKICAgIGNsZWFyKCk7CiAgfQp9OwoKCi8vIEV4
YW1wbGUgb2YgdXNhZ2U6Ci8vICAgY29tYmluZShpbiwgcmVzLCAwKQovLyAgIFByZTogIGluID0g
IFsoYWIsIGMpIChhYiwgZCkgKGMsIGRlKSAoYywgZWYpXQovLyAgIFBvc3Q6IHJlcyA9IFsoYWIs
IGNkKSwgKGMsIGRlZildCnN0YXRpYyB2b2lkIGNvbWJpbmUoY29uc3QgUHJlU3VmTGlzdCAmIGlu
LCBQcmVTdWZMaXN0ICYgcmVzLCBpbnQgd2hpY2gpCnsKICBjb25zdCBQcmVTdWYgKiBpID0gaW4u
aGVhZDsKICB3aGlsZSAoaSkgeyB7CiAgICBjb25zdCBTdHJpbmcgJiBzID0gaS0+Z2V0KHdoaWNo
KTsKICAgIGZvciAoY29uc3QgUHJlU3VmICogaiA9IGluLmhlYWQ7IGogIT0gaTsgaiA9IGotPm5l
eHQpIHsKICAgICAgaWYgKGotPmdldCh3aGljaCkgPT0gcykgZ290byBjb250OwogICAgfQogICAg
UHJlU3VmICogdG1wID0gbmV3IFByZVN1ZjsKICAgIHRtcC0+cHJlID0gaS0+cHJlOwogICAgdG1w
LT5zdWYgPSBpLT5zdWY7CiAgICBTdHJpbmcgJiBiID0gdG1wLT5nZXQoIXdoaWNoKTsKICAgIGZv
ciAoY29uc3QgUHJlU3VmICogaiA9IGktPm5leHQ7IGo7IGogPSBqLT5uZXh0KSB7CiAgICAgIGlm
IChqLT5nZXQod2hpY2gpICE9IHMpIGNvbnRpbnVlOwogICAgICBjb25zdCBTdHJpbmcgJiBhID0g
ai0+Z2V0KCF3aGljaCk7CiAgICAgIGZvciAoU3RyaW5nOjpjb25zdF9pdGVyYXRvciB4ID0gYS5i
ZWdpbigpOyB4ICE9IGEuZW5kKCk7ICsreCkgewogICAgICAgIGlmIChtZW1jaHIoYi5kYXRhKCks
ICp4LCBiLnNpemUoKSkpIGNvbnRpbnVlOwogICAgICAgIGIgKz0gKng7CiAgICAgIH0KICAgIH0K
ICAgIHJlcy5hZGQodG1wKTsKICB9IGNvbnQ6CiAgICBpID0gaS0+bmV4dDsKICB9Cn0KCi8vCi8v
IFN0dWZmIHVzZWQgd2hlbiBwcnVuaW5nIHRoZSBsaXN0IG9mIGJhc2Ugd29yZHMKLy8KCnN0cnVj
dCBFeHBhbnNpb24gewogIGNvbnN0IGNoYXIgKiB3b3JkOwogIGNoYXIgKiBhZmY7IC8vIG1vZGlm
eWluZyB0aGlzIHdpbGwgbW9kaWZ5IHRoZSBhZmZpeCBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZQog
IHN0ZDo6dmVjdG9yPGJvb2w+IGV4cDsKICBzdGQ6OnZlY3Rvcjxib29sPiBvcmlnX2V4cDsKfTsK
Ci8vIHN0YXRpYyB2b2lkIGR1bXAoY29uc3QgVmVjdG9yPEV4cGFuc2lvbiAqPiAmIHdvcmtpbmcs
IAovLyAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxDTUxfVGFibGU6Oml0ZXJhdG9yPiAm
IGVudHJpZXMpCi8vIHsKLy8gICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IHdvcmtpbmcuc2l6
ZSgpOyArK2kpIHsKLy8gICAgIGlmICghd29ya2luZ1tpXSkgY29udGludWU7Ci8vICAgICBDRVJS
LnByaW50ZigiJXMvJXMgIiwgd29ya2luZ1tpXS0+d29yZCwgd29ya2luZ1tpXS0+YWZmKTsKLy8g
ICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogIT0gd29ya2luZ1tpXS0+ZXhwLnNpemUoKTsgKytq
KSB7Ci8vICAgICAgIGlmICh3b3JraW5nW2ldLT5leHBbal0pCi8vICAgICAgICAgQ0VSUi5wcmlu
dGYoIiVzICIsIGVudHJpZXNbal0tPndvcmQpOwovLyAgICAgfQovLyAgICAgQ0VSUi5wdXQoJ1xu
Jyk7Ci8vICAgfQovLyAgIENFUlIucHV0KCdcbicpOwovLyB9CgovLyBzdGFuZGFyZCBzZXQgYWxn
b3JpdGhtcyBvbiBhIGJpdCB2ZWN0b3IKCnN0YXRpYyBib29sIHN1YnNldChjb25zdCBzdGQ6OnZl
Y3Rvcjxib29sPiAmIHNtYWxsZXIsIAogICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0
b3I8Ym9vbD4gJiBsYXJnZXIpCnsKICBhc3NlcnQoc21hbGxlci5zaXplKCkgPT0gbGFyZ2VyLnNp
emUoKSk7CiAgdW5zaWduZWQgcyA9IGxhcmdlci5zaXplKCk7CiAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSAhPSBzOyArK2kpIHsKICAgIGlmIChzbWFsbGVyW2ldICYmICFsYXJnZXJbaV0pIHJldHVy
biBmYWxzZTsKICB9CiAgcmV0dXJuIHRydWU7Cn0KCnN0YXRpYyB2b2lkIG1lcmdlKHN0ZDo6dmVj
dG9yPGJvb2w+ICYgeCwgY29uc3Qgc3RkOjp2ZWN0b3I8Ym9vbD4gJiB5KQp7CiAgYXNzZXJ0KHgu
c2l6ZSgpID09IHkuc2l6ZSgpKTsKICB1bnNpZ25lZCBzID0geC5zaXplKCk7CiAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSAhPSBzOyArK2kpIHsKICAgIGlmICh5W2ldKSB4W2ldID0gdHJ1ZTsKICB9
Cn0KCnN0YXRpYyB2b2lkIHB1cmdlKHN0ZDo6dmVjdG9yPGJvb2w+ICYgeCwgY29uc3Qgc3RkOjp2
ZWN0b3I8Ym9vbD4gJiB5KQp7CiAgYXNzZXJ0KHguc2l6ZSgpID09IHkuc2l6ZSgpKTsKICB1bnNp
Z25lZCBzID0geC5zaXplKCk7CiAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBzOyArK2kpIHsK
ICAgIGlmICh5W2ldKSB4W2ldID0gZmFsc2U7CiAgfQp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVk
IGNvdW50KGNvbnN0IHN0ZDo6dmVjdG9yPGJvb2w+ICYgeCkgewogIHVuc2lnbmVkIGMgPSAwOwog
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0geC5zaXplKCk7ICsraSkgewogICAgaWYgKHhbaV0p
ICsrYzsKICB9CiAgcmV0dXJuIGM7Cn0KCi8vIAoKc3RydWN0IFdvcmtpbmdMdCB7CiAgYm9vbCBv
cGVyYXRvcigpIChFeHBhbnNpb24gKiB4LCBFeHBhbnNpb24gKiB5KSB7CgogICAgLy8gTEFSR0VT
VCBudW1iZXIgb2YgZXhwYW5zaW9ucwogICAgdW5zaWduZWQgeF9zID0gY291bnQoeC0+ZXhwKTsK
ICAgIHVuc2lnbmVkIHlfcyA9IGNvdW50KHktPmV4cCk7CiAgICBpZiAoeF9zICE9IHlfcykgcmV0
dXJuIHhfcyA+IHlfczsKCiAgICAvLyBTTUFMTEVTVCBiYXNlIHdvcmQKICAgIHhfcyA9IHN0cmxl
bih4LT53b3JkKTsKICAgIHlfcyA9IHN0cmxlbih5LT53b3JkKTsKICAgIGlmICh4X3MgIT0geV9z
KSByZXR1cm4geF9zIDwgeV9zOwoKICAgIC8vIExBUkdFU1QgYWZmaXggc3RyaW5nCiAgICB4X3Mg
PSBzdHJsZW4oeC0+YWZmKTsKICAgIHlfcyA9IHN0cmxlbih5LT5hZmYpOwogICAgaWYgKHhfcyAh
PSB5X3MpIHJldHVybiB4X3MgPiB5X3M7IAoKICAgIC8vIAogICAgaW50IGNtcCA9IHN0cmNtcCh4
LT53b3JkLCB5LT53b3JkKTsKICAgIGlmIChjbXAgIT0gMCkgcmV0dXJuIGNtcCA8IDA7CgogICAg
Ly8KICAgIGNtcCA9IHN0cmNtcCh4LT5hZmYsIHktPmFmZik7CiAgICByZXR1cm4gY21wIDwgMDsK
ICB9Cn07CgovLwovLyBGaW5hbGx5IHRoZSBmdW5jdGlvbiB0aGF0IGRvZXMgdGhlIHJlYWwgd29y
awovLwoKdm9pZCBtdW5jaF9saXN0X2NvbXBsZXRlKGJvb2wgbXVsdGksIGJvb2wgc2ltcGxpZnkp
CnsKICB1c2luZyBuYW1lc3BhY2UgYXNwZWxsZXI7CiAgQ2FjaGVQdHI8TGFuZ3VhZ2U+IGxhbmc7
CiAgZmluZF9sYW5ndWFnZSgqb3B0aW9ucyk7CiAgUG9zaWJFcnI8TGFuZ3VhZ2UgKj4gcmVzID0g
bmV3X2xhbmd1YWdlKCpvcHRpb25zKTsKICBpZiAocmVzLmhhc19lcnIoKSkge3ByaW50X2Vycm9y
KHJlcy5nZXRfZXJyKCktPm1lc2cpOyBleGl0KDEpO30KICBsYW5nLnJlc2V0KHJlcy5kYXRhKTsK
ICBDb252IGljb252KHNldHVwX2NvbnYob3B0aW9ucywgbGFuZykpOwogIENvbnYgb2NvbnYoc2V0
dXBfY29udihsYW5nLCBvcHRpb25zKSk7CiAgU3RyaW5nIHdvcmQsIGJ1ZjsKICBPYmpTdGFjayBl
eHBfYnVmOwogIFdvcmRBZmYgKiBleHBfbGlzdDsKICBHdWVzc0luZm8gZ2k7CiAgQ01MX1RhYmxl
IHRhYmxlOwogIE9ialN0YWNrIHRhYmxlX2J1ZjsKCiAgLy8gYWRkIHdvcmRzIHRvIGRpY3Rpb25h
cnkKICB3aGlsZSAoQ0lOLmdldGxpbmUod29yZCkpIHsKICAgIGJ1ZiA9IHdvcmQ7CiAgICBjaGFy
ICogdyA9IGljb252KGJ1Zi5tc3RyKCksIGJ1Zi5zaXplKCkpOwogICAgY2hhciAqIGFmID0gc3Ry
Y2hyKHcsICcvJyk7CiAgICBzaXplX3QgczsKICAgIGlmIChhZiAhPSAwKSB7CiAgICAgIHMgPSBh
ZiAtIHc7CiAgICAgICphZisrID0gJ1wwJzsKICAgIH0gZWxzZSB7CiAgICAgIHMgPSBzdHJsZW4o
dyk7CiAgICAgIGFmID0gdyArIHM7CiAgICB9CiAgICBleHBfYnVmLnJlc2V0KCk7CiAgICBleHBf
bGlzdCA9IGxhbmctPmV4cGFuZCh3LCBhZiwgZXhwX2J1Zik7CiAgICBmb3IgKFdvcmRBZmYgKiBx
ID0gZXhwX2xpc3Q7IHE7IHEgPSBxLT5uZXh0KSB7CiAgICAgIGlmICghdGFibGUuaGF2ZShxLT53
b3JkKSkgLy8gc2luY2UgaXQgaXMgYSBtdWx0aSBoYXNoIHRhYmxlCiAgICAgICAgdGFibGUuaW5z
ZXJ0KENNTF9FbnRyeSh0YWJsZV9idWYuZHVwKHEtPndvcmQpKSkuZmlyc3Q7CiAgICB9CiAgfQoK
ICAvLyBOb3cgdHJ5IHRvIG11bmNoIGVhY2ggd29yZCBpbiB0aGUgZGljdGlvbmFyeS4gIFRoaXMg
d2lsbCBhbHNvCiAgLy8gZ3JvdXAgdGhlIGJhc2Ugd29yZHMgaW50byBkaXNqb2ludCBzZXRzIGJh
c2VkIG9uIHRoZXJlIGV4cGFuc2lvbi4KICBDTUxfVGFibGU6Oml0ZXJhdG9yIHAgPSB0YWJsZS5i
ZWdpbigpOwogIENNTF9UYWJsZTo6aXRlcmF0b3IgZW5kID0gdGFibGUuZW5kKCk7CiAgU3RyaW5n
IGZsYWdzOwogIGZvciAoOyBwICE9IGVuZDsgKytwKSAKICB7CiAgICBsYW5nLT5tdW5jaChwLT53
b3JkLCAmZ2ksIGZhbHNlKTsKICAgIGNvbnN0IGFzcGVsbGVyOjpDaGVja0luZm8gKiBjaSA9IGdp
LmhlYWQ7CiAgICB3aGlsZSAoY2kpCiAgICB7IHsKICAgICAgLy8gY2hlY2sgaWYgdGhlIGJhc2Ug
d29yZCBpcyBpbiB0aGUgZGljdGlvbmFyeQogICAgICBDTUxfVGFibGU6Oml0ZXJhdG9yIGIgPSB0
YWJsZS5maW5kKGNpLT53b3JkLnN0cik7CiAgICAgIGlmIChiID09IHRhYmxlLmVuZCgpKSBnb3Rv
IGNvbnQ7CgogICAgICAvLyBjaGVjayBpZiBhbGwgdGhlIHdvcmRzIG9uY2UgZXhwYW5kZWQgYXJl
IGluIHRoZSBkaWN0aW9uYXJ5CiAgICAgIGNoYXIgZmxhZ3NbMl07CiAgICAgIGFzc2VydCghKGNp
LT5wcmVfZmxhZyAmJiBjaS0+c3VmX2ZsYWcpKTsKICAgICAgaWYgICAgICAoY2ktPnByZV9mbGFn
ICE9IDApIGZsYWdzWzBdID0gY2ktPnByZV9mbGFnOwogICAgICBlbHNlIGlmIChjaS0+c3VmX2Zs
YWcgIT0gMCkgZmxhZ3NbMF0gPSBjaS0+c3VmX2ZsYWc7CiAgICAgIGZsYWdzWzFdID0gJ1wwJzsK
ICAgICAgZXhwX2J1Zi5yZXNldCgpOwogICAgICBleHBfbGlzdCA9IGxhbmctPmV4cGFuZChjaS0+
d29yZC5zdHIsIGZsYWdzLCBleHBfYnVmKTsKICAgICAgZm9yIChXb3JkQWZmICogcSA9IGV4cF9s
aXN0OyBxOyBxID0gcS0+bmV4dCkgewogICAgICAgIGlmICghdGFibGUuaGF2ZShxLT53b3JkKSkg
Z290byBjb250OwogICAgICB9CgogICAgICAvLyBhbGwgdGhlIGV4cGFuc2lvbnMgYXJlIGluIHRo
ZSBkaWN0aW9uYXJ5IG5vdyBhZGQgdGhlIGFmZml4IHRvCiAgICAgIC8vIHRoZSBiYXNlIHdvcmQg
YW5kIGZpZ3VyZSBvdXQgd2hpY2ggZGlzam9pbnQgc2V0IGl0IGJlbG9uZ3MgdG8KICAgICAgYWRk
X2FmZml4KGIsIGZsYWdzWzBdLCBjaS0+cHJlX2ZsYWcgIT0gMCk7CiAgICAgIENNTF9FbnRyeSAq
IGJzID0gZmluZF9zZXQoJipiKTsKICAgICAgZm9yIChXb3JkQWZmICogcSA9IGV4cF9saXN0OyBx
OyBxID0gcS0+bmV4dCkgewogICAgICAgIENNTF9UYWJsZTo6aXRlcmF0b3IgdyA9IHRhYmxlLmZp
bmQocS0+d29yZCk7CiAgICAgICAgYXNzZXJ0KGIgIT0gdGFibGUuZW5kKCkpOwogICAgICAgIENN
TF9FbnRyeSAqIHdzID0gZmluZF9zZXQoJip3KTsKICAgICAgICBsaW5rKGJzLHdzKTsKICAgICAg
fQoKICAgIH0gY29udDoKICAgICAgY2kgPSBjaS0+bmV4dDsKICAgIH0KICB9CgogIC8vIElmIGEg
YmFzZSB3b3JkIGhhcyBib3RoIHByZWZpeGVzIGFuZCBzdWZmaXhlcyB0cnkgdG8gY29tYmluZSB0
aGVtLgogIC8vIFRoaXMgY2FuIGxlYWQgdG8gbXVsdGlwbGUgZW50cmllcyBmb3IgdGhlIHNhbWUg
YmFzZSB3b3JkLiAgSWYgIm11bHRpIgogIC8vIGlzIHRydWUsIHRoZW4gaW5jbHVkZSBhbGwgdGhl
IGVudHJpZXMuICBPdGhlcndpc2UsIG9ubHkgaW5jbHVkZSB0aGUKICAvLyBvbmUgd2l0aCB0aGUg
bGFyZ2VzdCBudW1iZXIgb2YgZXhwYW5zaW9ucy4gIFRoaXMgaXMgYSBncmVlZHkgY2hvaWNlCiAg
Ly8gdGhhdCBtYXkgbm90IGJlIG9wdGltYWwsIGJ1dCBpcyBjbG9zZSB0byBpdC4KICBwID0gdGFi
bGUuYmVnaW4oKTsKICBTdHJpbmcgcHJlLHN1ZjsKICBDTUxfRW50cnkgKiBleHRyYXMgPSAwOwog
IGZvciAoOyBwICE9IGVuZDsgKytwKSAKICB7CiAgICBwcmUuY2xlYXIoKTsgc3VmLmNsZWFyKCk7
CiAgICBpZiAoIXAtPmFmZikgY29udGludWU7CiAgICBjaGFyICogcyA9IHAtPmFmZjsKICAgIHdo
aWxlICgqcyAhPSAnLycpIHByZSArPSAqcysrOwogICAgKytzOwogICAgd2hpbGUgKCpzICE9ICdc
MCcpIHN1ZiArPSAqcysrOwogICAgaWYgKHByZS5lbXB0eSgpKSB7CgogICAgICBzdHJjcHkocC0+
YWZmLCBzdWYuc3RyKCkpOwoKICAgIH0gZWxzZSBpZiAoc3VmLmVtcHR5KCkpIHsKCiAgICAgIHN0
cmNweShwLT5hZmYsIHByZS5zdHIoKSk7CgogICAgfSBlbHNlIHsKCiAgICAgIC8vIFRyeSBhbGwg
cG9zc2libGUgY29tYmluYXRpb25zIGFuZCBrZWVwIHRoZSBvbmVzIHdoaWNoIGV4cGFuZAogICAg
ICAvLyB0byBsZWdhbCB3b3Jkcy4KCiAgICAgIFByZVN1Zkxpc3QgY3Jvc3MsdG1wMSx0bXAyOwog
ICAgICBQcmVTdWYgKiBwcyA9IDA7CgogICAgICBmb3IgKFN0cmluZzo6aXRlcmF0b3IgcGkgPSBw
cmUuYmVnaW4oKTsgcGkgIT0gcHJlLmVuZCgpOyArK3BpKSB7CiAgICAgICAgU3RyaW5nOjppdGVy
YXRvciBzaSA9IHN1Zi5iZWdpbigpOwogICAgICAgIHdoaWxlIChzaSAhPSBzdWYuZW5kKCkpIHsg
ewogICAgICAgICAgY2hhciBmbGFnc1szXSA9IHsqcGksICpzaSwgJ1wwJ307CiAgICAgICAgICBl
eHBfYnVmLnJlc2V0KCk7CiAgICAgICAgICBleHBfbGlzdCA9IGxhbmctPmV4cGFuZChwLT53b3Jk
LCBmbGFncywgZXhwX2J1Zik7CiAgICAgICAgICBmb3IgKFdvcmRBZmYgKiBxID0gZXhwX2xpc3Q7
IHE7IHEgPSBxLT5uZXh0KSB7CiAgICAgICAgICAgIGlmICghdGFibGUuaGF2ZShxLT53b3JkKSkg
Z290byBjb250MjsKICAgICAgICAgIH0KICAgICAgICAgIHBzID0gbmV3IFByZVN1ZjsKICAgICAg
ICAgIHBzLT5wcmUgKz0gKnBpOwogICAgICAgICAgcHMtPnN1ZiArPSAqc2k7CiAgICAgICAgICBj
cm9zcy5hZGQocHMpOwogICAgICAgIH0gY29udDI6CiAgICAgICAgICArK3NpOwogICAgICAgIH0K
ICAgICAgfQoKICAgICAgLy8gTm93IGNvbWJpbmUgdGhlIGxlZ2FsIGNyb3NzIHBhaXJzIHdpdGgg
b3RoZXIgb25lcyB3aGVuCiAgICAgIC8vIHBvc3NpYmxlLgoKICAgICAgLy8gZmluYWwgcmVzID0g
WyAocHJlLCBbXSkgKFtdLHN1ZiksCiAgICAgIC8vICAgICAgICAgICAgICAgKGNyb3NzIHwgY29t
YmluZSBmaXJzdCB8IGNvbWJpbmUgc2Vjb25kKQogICAgICAvLyAgICAgICAgICAgICAgIChjcm9z
cyB8IGNvbWJpbmUgc2Vjb25kIHwgY29tYmluZSBmaXJzdCkKICAgICAgLy8gICAgICAgICAgICAg
fCBjb21iaW5lIGZpcnN0CiAgICAgIC8vICAgICAgICAgICAgIHwgY29tYmluZSBzZWNvbmQKICAg
ICAgLy8KICAgICAgLy8gY29tYmluZSBmaXJzdCBbKGFiLCBjKSAoYWIsIGQpIChjLCBkZSkgKGMs
IGVmKV0KICAgICAgLy8gICA9ICBbKGFiLCBjZCksIChjLCBkZWYpXQogICAgICAKICAgICAgY29t
YmluZShjcm9zcywgdG1wMSwgMCk7IAogICAgICBjb21iaW5lKHRtcDEsICB0bXAyLCAxKTsKICAg
ICAgdG1wMS5jbGVhcigpOwogICAgICAKICAgICAgY29tYmluZShjcm9zcywgdG1wMSwgMSk7CiAg
ICAgIGNvbWJpbmUodG1wMSwgIHRtcDIsIDApOwogICAgICB0bXAxLmNsZWFyKCk7CgogICAgICBj
cm9zcy5jbGVhcigpOwoKICAgICAgcHMgPSBuZXcgUHJlU3VmOwogICAgICBwcy0+cHJlID0gcHJl
OwogICAgICB0bXAyLmFkZChwcyk7CiAgICAgIHBzID0gbmV3IFByZVN1ZjsKICAgICAgcHMtPnN1
ZiA9IHN1ZjsKICAgICAgdG1wMi5hZGQocHMpOwoKICAgICAgY29tYmluZSh0bXAyLCB0bXAxLCAw
KTsKICAgICAgY29tYmluZSh0bXAxLCBjcm9zcywgMSk7CgogICAgICBpZiAobXVsdGkpIHsKCiAg
ICAgICAgLy8gSXQgaXMgT0sgdG8gaGF2ZSBtdWx0aXBsZSBlbnRyaWVzIHdpdGggdGhlIHNhbWUg
YmFzZSB3b3JkCiAgICAgICAgLy8gc28gdXNlIHRoZW0gYWxsLgoKICAgICAgICBwcyA9IGNyb3Nz
LmhlYWQ7CiAgICAgICAgYXNzZXJ0KHBzKTsKICAgICAgICBtZW1jcHkocC0+YWZmLCBwcy0+cHJl
LmRhdGEoKSwgcHMtPnByZS5zaXplKCkpOwogICAgICAgIG1lbWNweShwLT5hZmYgKyBwcy0+cHJl
LnNpemUoKSwgcHMtPnN1Zi5zdHIoKSwgcHMtPnN1Zi5zaXplKCkgKyAxKTsKICAgICAgICAKICAg
ICAgICBwcyA9IHBzLT5uZXh0OwogICAgICAgIENNTF9FbnRyeSAqIGJzID0gZmluZF9zZXQoJipw
KTsKICAgICAgICBmb3IgKDsgcHM7IHBzID0gcHMtPm5leHQpIHsKICAgICAgICAgIAogICAgICAg
ICAgQ01MX0VudHJ5ICogdG1wID0gbmV3IENNTF9FbnRyeTsKICAgICAgICAgIHRtcC0+d29yZCA9
IHAtPndvcmQ7CiAgICAgICAgICB0bXAtPmFmZiA9IChjaGFyICopbWFsbG9jKHBzLT5wcmUuc2l6
ZSgpICsgcHMtPnN1Zi5zaXplKCkgKyAxKTsKICAgICAgICAgIG1lbWNweSh0bXAtPmFmZiwgcHMt
PnByZS5kYXRhKCksIHBzLT5wcmUuc2l6ZSgpKTsKICAgICAgICAgIG1lbWNweSh0bXAtPmFmZiAr
IHBzLT5wcmUuc2l6ZSgpLCBwcy0+c3VmLnN0cigpLCBwcy0+c3VmLnNpemUoKSArIDEpOwogICAg
ICAgICAgCiAgICAgICAgICB0bXAtPnBhcmVudCA9IGJzOwogICAgICAgICAgCiAgICAgICAgICB0
bXAtPm5leHQgPSBleHRyYXM7CiAgICAgICAgICBleHRyYXMgPSB0bXA7CiAgICAgICAgfQoKICAg
ICAgfSBlbHNlIHsKCiAgICAgICAgLy8gY2hvc2UgdGhlIG9uZSB3aGljaCBoYXMgdGhlIGxhcmdl
c3QgbnVtYmVyIG9mIGV4cGFuc2lvbnMKCiAgICAgICAgaW50IG1heF9leHAgPSAwOwogICAgICAg
IFByZVN1ZiAqIGJlc3QgPSAwOwogICAgICAgIFN0cmluZyBmbGFnczsKCiAgICAgICAgZm9yIChw
cyA9IGNyb3NzLmhlYWQ7IHBzOyBwcyA9IHBzLT5uZXh0KSB7CiAgICAgICAgICBmbGFncyAgPSBw
cy0+cHJlOwogICAgICAgICAgZmxhZ3MgKz0gcHMtPnN1ZjsKICAgICAgICAgIGV4cF9idWYucmVz
ZXQoKTsKICAgICAgICAgIGV4cF9saXN0ID0gbGFuZy0+ZXhwYW5kKHAtPndvcmQsIGZsYWdzLCBl
eHBfYnVmKTsKICAgICAgICAgIGludCBjID0gMDsKICAgICAgICAgIGZvciAoV29yZEFmZiAqIHEg
PSBleHBfbGlzdDsgcTsgcSA9IHEtPm5leHQpICsrYzsKICAgICAgICAgIGlmIChjID4gbWF4X2V4
cCkge21heF9leHAgPSBjOyBiZXN0ID0gcHM7fQogICAgICAgIH0KCiAgICAgICAgbWVtY3B5KHAt
PmFmZiwgYmVzdC0+cHJlLmRhdGEoKSwgYmVzdC0+cHJlLnNpemUoKSk7CiAgICAgICAgbWVtY3B5
KHAtPmFmZiArIGJlc3QtPnByZS5zaXplKCksIGJlc3QtPnN1Zi5zdHIoKSwgYmVzdC0+c3VmLnNp
emUoKSArIDEpOwogICAgICB9CiAgICB9CiAgfQoKICB3aGlsZSAoZXh0cmFzKSB7CiAgICBDTUxf
RW50cnkgKiB0bXAgPSBleHRyYXM7CiAgICBleHRyYXMgPSBleHRyYXMtPm5leHQ7CiAgICB0bXAt
Pm5leHQgPSAwOwogICAgdGFibGUuaW5zZXJ0KCp0bXApOwogICAgZGVsZXRlIHRtcDsKICB9Cgog
IC8vIENyZWF0ZSBhIGxpbmtlZCBsaXN0IGZvciBlYWNoIGRpc2pvaW50IHNldAogIHAgPSB0YWJs
ZS5iZWdpbigpOwogIGZvciAoOyBwICE9IGVuZDsgKytwKSAKICB7CiAgICBwLT5yYW5rID0gLTE7
CiAgICBDTUxfRW50cnkgKiBicyA9IGZpbmRfc2V0KCYqcCk7CiAgICBpZiAoYnMgIT0gJipwKSB7
CiAgICAgIHAtPm5leHQgPSBicy0+bmV4dDsKICAgICAgYnMtPm5leHQgPSAmKnA7CiAgICB9IAog
IH0KCiAgLy8gTm93IHByb2Nlc3MgZWFjaCBkaXNqb2ludCBzZXQgaW5kZXBlbmRlbnRseQogIHAg
PSB0YWJsZS5iZWdpbigpOwogIGZvciAoOyBwICE9IGVuZDsgKytwKSAKICB7CiAgICBpZiAocC0+
cGFyZW50KSBjb250aW51ZTsKCiAgICBWZWN0b3I8Q01MX1RhYmxlOjppdGVyYXRvcj4gZW50cmll
czsKICAgIFZlY3RvcjxFeHBhbnNpb24+IGV4cGFuc2lvbnM7CiAgICBWZWN0b3I8RXhwYW5zaW9u
ICo+IHRvX2tlZXA7CiAgICBzdGQ6OnZlY3Rvcjxib29sPiB0b19rZWVwX2V4cDsKICAgIFZlY3Rv
cjxFeHBhbnNpb24gKj4gd29ya2luZzsKICAgIFZlY3Rvcjx1bnNpZ25lZD4gdG9fcmVtb3ZlOwoK
ICAgIC8vIEZpcnN0IGFzc2lnbiBudW1iZXJzIHRvIGVhY2ggdW5pcXVlIHdvcmQuICBUaGUgcmFu
ayBmaWVsZCBpcwogICAgLy8gbm8gbG9uZ2VyIHVzZWQgc28gdXNlIGl0IHRvIHN0b3JlIHRoZSBu
dW1iZXIuCiAgICBmb3IgKENNTF9FbnRyeSAqIHEgPSAmKnA7IHE7IHEgPSBxLT5uZXh0KSB7CiAg
ICAgIENNTF9UYWJsZTo6aXRlcmF0b3IgZSA9IHRhYmxlLmZpbmQocS0+d29yZCk7CiAgICAgIGlm
IChlLT5yYW5rID09IC0xKSB7CiAgICAgICAgZS0+cmFuayA9IGVudHJpZXMuc2l6ZSgpOwogICAg
ICAgIHEtPnJhbmsgPSBlbnRyaWVzLnNpemUoKTsKICAgICAgICBlbnRyaWVzLnB1c2hfYmFjayhl
KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBxLT5yYW5rID0gZS0+cmFuazsKICAgICAgfQogICAg
ICBpZiAocS0+YWZmKSB7CiAgICAgICAgRXhwYW5zaW9uIHRtcDsKICAgICAgICB0bXAud29yZCA9
IHEtPndvcmQ7CiAgICAgICAgdG1wLmFmZiAgPSBxLT5hZmY7CiAgICAgICAgZXhwYW5zaW9ucy5w
dXNoX2JhY2sodG1wKTsKICAgICAgfQogICAgfQoKICAgIHRvX2tlZXBfZXhwLnJlc2l6ZShlbnRy
aWVzLnNpemUoKSk7CiAgICAvL2ZvciAoaW50IGkgPSAwOyBpICE9IHRvX2tlZXBfZXhwLnNpemUo
KTsgKytpKSB7CiAgICAvLyAgcHJpbnRmKCI+Pj4gJWQgJWRcbiIsIGksIChpbnQpdG9fa2VlcF9l
eHBbaV0pOwogICAgLy99CgogICAgLy8gU3RvcmUgdGhlIGV4cGFuc2lvbiBvZiBlYWNoIGJhc2Ug
d29yZCBpbiBhIGJpdCB2ZWN0b3IgYW5kCiAgICAvLyBhZGQgaXQgdG8gdGhlIHdvcmtpbmcgc2V0
CiAgICBmb3IgKFZlY3RvcjxFeHBhbnNpb24+OjppdGVyYXRvciBxID0gZXhwYW5zaW9ucy5iZWdp
bigpOyAKICAgICAgICAgcSAhPSBleHBhbnNpb25zLmVuZCgpOyAKICAgICAgICAgKytxKQogICAg
ewogICAgICBxLT5leHAucmVzaXplKGVudHJpZXMuc2l6ZSgpKTsKICAgICAgZXhwX2J1Zi5yZXNl
dCgpOwogICAgICBleHBfbGlzdCA9IGxhbmctPmV4cGFuZChxLT53b3JkLCBxLT5hZmYsIGV4cF9i
dWYpOwogICAgICBmb3IgKFdvcmRBZmYgKiBpID0gZXhwX2xpc3Q7IGk7IGkgPSBpLT5uZXh0KSB7
CiAgICAgICAgQ01MX1RhYmxlOjppdGVyYXRvciBlID0gdGFibGUuZmluZChpLT53b3JkKTsKICAg
ICAgICBhc3NlcnQoMCA8PSBlLT5yYW5rICYmIGUtPnJhbmsgPCAoaW50KWVudHJpZXMuc2l6ZSgp
KTsKICAgICAgICBxLT5leHBbZS0+cmFua10gPSB0cnVlOwogICAgICB9CiAgICAgIHEtPm9yaWdf
ZXhwID0gcS0+ZXhwOwogICAgICB3b3JraW5nLnB1c2hfYmFjaygmKnEpOwogICAgfQogICAgCiAg
ICB1bnNpZ25lZCBwcmV2X3dvcmtpbmdfc2l6ZSA9IElOVF9NQVg7CgogICAgLy8gVGhpcyBsb29w
IHdpbGwgcmVwZWF0IHVudGlsIHRoZSB3b3JraW5nIHNldCBpcyBlbXB0eS4gIFRoaXMKICAgIC8v
IHdpbGwgcHJvZHVjZSBvcHRpbXVtIHJlc3VsdHMgaW4gbW9zdCBjYXNlcy4gIE5vbiBvcHRpbXVt
CiAgICAvLyByZXN1bHRzIG1heSBiZSBwb3NzaWJsZSBpZiBzdGVwICg0KSBpcyBuZWNlc3Nhcnks
IGJ1dCBpbgogICAgLy8gcHJhY3RpY2UgdGhpcyBzdGVwIGlzIHJhcmx5IG5lY2Vzc2FyeS4KICAg
IGRvIHsKICAgICAgcHJldl93b3JraW5nX3NpemUgPSB3b3JraW5nLnNpemUoKTsKCiAgICAgIC8v
IFNvcnQgdGhlIGxpc3QgYmFzZWQgb24gV29ya2luZ0x0LiAgVGhpcyBpcyBuZWNlc3NhcnkgZXZl
cnkKICAgICAgLy8gdGltZSBzaW5jZSB0aGUgZXhwYW5zaW9uIGxpc3QgY2FuIGNoYW5nZS4KICAg
ICAgc3RkOjpzb3J0KHdvcmtpbmcuYmVnaW4oKSwgd29ya2luZy5lbmQoKSwgV29ya2luZ0x0KCkp
OwoKICAgICAgLy8gKDEpIEVsaW1pbmF0ZSBhbnkgZWxlbWVudHMgd2hpY2ggYXJlIGEgc3Vic2V0
IG9mIG90aGVycwogICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IHdvcmtpbmcuc2l6ZSgp
OyArK2kpIHsKICAgICAgICBpZiAoIXdvcmtpbmdbaV0pIGNvbnRpbnVlOwogICAgICAgIGZvciAo
dW5zaWduZWQgaiA9IGkgKyAxOyBqICE9IHdvcmtpbmcuc2l6ZSgpOyArK2opIHsKICAgICAgICAg
IGlmICghd29ya2luZ1tqXSkgY29udGludWU7CiAgICAgICAgICBpZiAoc3Vic2V0KHdvcmtpbmdb
al0tPmV4cCwgd29ya2luZ1tpXS0+ZXhwKSkgewogICAgICAgICAgICB3b3JraW5nW2pdID0gMDsK
ICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vICgyKSBNb3ZlIGFueSBlbGVt
ZW50cyB3aGljaCBleHBhbmQgdG8gdW5pcXVlIGVudHJlZSAKICAgICAgLy8gaW50byB0aGUgdG9f
a2VlcCBsaXN0CiAgICAgIHRvX3JlbW92ZS5jbGVhcigpOwogICAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpICE9IGVudHJpZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICBpbnQgbiA9IC0xOwogICAg
ICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogIT0gd29ya2luZy5zaXplKCk7ICsraikgewogICAg
ICAgICAgaWYgKHdvcmtpbmdbal0gJiYgd29ya2luZ1tqXS0+ZXhwW2ldKSB7CiAgICAgICAgICAg
IGlmIChuID09IC0xKSBuID0gajsKICAgICAgICAgICAgZWxzZSAgICAgICAgIG4gPSAtMjsKICAg
ICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKG4gPj0gMCkgdG9fcmVtb3ZlLnB1c2hfYmFj
ayhuKTsKICAgICAgfQogICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IHRvX3JlbW92ZS5z
aXplKCk7ICsraSkgewogICAgICAgIHVuc2lnbmVkIG4gPSB0b19yZW1vdmVbaV07CiAgICAgICAg
aWYgKCF3b3JraW5nW25dKSBjb250aW51ZTsKICAgICAgICB0b19rZWVwLnB1c2hfYmFjayh3b3Jr
aW5nW25dKTsKICAgICAgICBtZXJnZSh0b19rZWVwX2V4cCwgd29ya2luZ1tuXS0+ZXhwKTsKICAg
ICAgICB3b3JraW5nW25dID0gMDsKICAgICAgfQoKICAgICAgLy8gKDMpIEVsaW1pbmF0ZSBhbnkg
ZWxlbWVudHMgd2hpY2ggYXJlIGEgc3Vic2V0IG9mIGFsbCB0aGUKICAgICAgLy8gZWxlbWVudHMg
aW4gdGhlIHRvX2tlZXAgbGlzdAogICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IHdvcmtp
bmcuc2l6ZSgpOyArK2kpIHsKICAgICAgICBpZiAod29ya2luZ1tpXSAmJiBzdWJzZXQod29ya2lu
Z1tpXS0+ZXhwLCB0b19rZWVwX2V4cCkpIHsKICAgICAgICAgIHdvcmtpbmdbaV0gPSAwOwogICAg
ICAgIH0KICAgICAgfQoKICAgICAgLy8gQ29tcGFjdCB0aGUgd29ya2luZyBsaXN0CiAgICAgIHsK
ICAgICAgICBpbnQgaSA9IDAsIGogPSAwOwogICAgICAgIHdoaWxlIChqICE9IChpbnQpd29ya2lu
Zy5zaXplKCkpIHsKICAgICAgICAgIGlmICh3b3JraW5nW2pdKSB7CiAgICAgICAgICAgIHdvcmtp
bmdbaV0gPSB3b3JraW5nW2pdOwogICAgICAgICAgICArK2k7CiAgICAgICAgICB9CiAgICAgICAg
ICArK2o7CiAgICAgICAgfQogICAgICAgIHdvcmtpbmcucmVzaXplKGkpOwogICAgICB9CgogICAg
ICAvLyAoNCkgSWYgbm9uZSBvZiB0aGUgZW50cmllcyBpbiB3b3JraW5nIGhhdmUgYmVlbiByZW1v
dmVkIHZpYQogICAgICAvLyB0aGUgYWJvdmUgbWV0aG9kcyB0aGVuIG1ha2UgYSBncmVlZHkgY2hv
aWNlIGFuZCBtb3ZlIHRoZQogICAgICAvLyBmaXJzdCBlbGVtZW50IGludG8gdGhlIHRvX2tlZXAg
bGlzdC4KICAgICAgaWYgKHdvcmtpbmcuc2l6ZSgpID4gMCAmJiB3b3JraW5nLnNpemUoKSA9PSBw
cmV2X3dvcmtpbmdfc2l6ZSkKICAgICAgewogICAgICAgIHRvX2tlZXAucHVzaF9iYWNrKHdvcmtp
bmdbMF0pOwogICAgICAgIC8vQ0VSUi5wcmludGYoIk1ha2luZyBncmVlZHkgY2hvaWNlISBDaG9v
c2luZyAlcy8lcy5cbiIsCiAgICAgICAgLy8gICAgICAgICAgICB3b3JraW5nWzBdLT53b3JkLCB3
b3JraW5nWzBdLT5hZmYpOwogICAgICAgIG1lcmdlKHRvX2tlZXBfZXhwLCB3b3JraW5nWzBdLT5l
eHApOwogICAgICAgIHdvcmtpbmcuZXJhc2Uod29ya2luZy5iZWdpbigpLCB3b3JraW5nLmJlZ2lu
KCkgKyAxKTsKICAgICAgfQoKICAgICAgLy8gKDUpIFRyaW0gdGhlIGV4cGFuc2lvbiBsaXN0IGZv
ciBhbnkgZWxlbWVudHMgbGVmdCBpbiB0aGUKICAgICAgLy8gd29ya2luZyBzZXQgYnkgcmVtb3Zp
bmcgdGhlIGV4cGFuc2lvbnMgdGhhdCBhbHJlYWR5IGV4aXN0IGluCiAgICAgIC8vIHRoZSB0b19r
ZWVwIGxpc3QKICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSB3b3JraW5nLnNpemUoKTsg
KytpKSB7CiAgICAgICAgcHVyZ2Uod29ya2luZ1tpXS0+ZXhwLCB0b19rZWVwX2V4cCk7CiAgICAg
IH0KCiAgICB9IHdoaWxlICh3b3JraW5nLnNpemUoKSA+IDApOwoKICAgIGlmIChzaW1wbGlmeSkg
ewoKICAgICAgLy8gUmVtb3ZlIHVubmVjZXNzYXJ5IGZsYWdzLiAgQSBmbGFnIGlzIHVubmVjZXNz
YXJ5IGlmIGl0IGRvZXMKICAgICAgLy8gZG9lcyBub3QgZXhwYW5kIHRvIGFueSBuZXcgd29yZHMs
IHRoYXQgaXMgd29yZHMgdGhhdCBhcmUgbm90CiAgICAgIC8vIGFscmVhZHkgY292ZXJlZCBieSBh
biBlYXJsaWVyIGVudHJpZXMgaW4gdGhlIGxpc3QuCgogICAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpICE9IHRvX2tlZXAuc2l6ZSgpOyArK2kpIHsKICAgICAgICB0b19rZWVwW2ldLT5leHAgPSB0
b19rZWVwW2ldLT5vcmlnX2V4cDsKICAgICAgfQogICAgIAogICAgICBzdGQ6OnNvcnQodG9fa2Vl
cC5iZWdpbigpLCB0b19rZWVwLmVuZCgpLCBXb3JraW5nTHQoKSk7CgogICAgICBzdGQ6OnZlY3Rv
cjxib29sPiB0YWxseShlbnRyaWVzLnNpemUoKSk7CiAgICAgIHN0ZDo6dmVjdG9yPGJvb2w+IGJh
Y2t1cChlbnRyaWVzLnNpemUoKSk7CiAgICAgIHN0ZDo6dmVjdG9yPGJvb2w+IHdvcmtpbmcoZW50
cmllcy5zaXplKCkpOwogICAgICBTdHJpbmcgZmxhZ3M7CiAgICAgIAogICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpICE9IHRvX2tlZXAuc2l6ZSgpOyArK2kpIHsKCiAgICAgICAgYmFja3VwID0g
dGFsbHk7CgogICAgICAgIG1lcmdlKHRhbGx5LCB0b19rZWVwW2ldLT5leHApOwoKICAgICAgICBT
dHJpbmcgZmxhZ3NfdG9fa2VlcCA9IHRvX2tlZXBbaV0tPmFmZjsKICAgICAgICBib29sIHNvbWV0
aGluZ19jaGFuZ2VkOwogICAgICAgIGRvIHsKICAgICAgICAgIHNvbWV0aGluZ19jaGFuZ2VkID0g
ZmFsc2U7CiAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqICE9IGZsYWdzX3RvX2tlZXAu
c2l6ZSgpOyArK2opIHsKICAgICAgICAgICAgZmxhZ3MuYXNzaWduKGZsYWdzX3RvX2tlZXAuZGF0
YSgpLCBqKTsKICAgICAgICAgICAgZmxhZ3MuYXBwZW5kKGZsYWdzX3RvX2tlZXAuZGF0YShqKzEp
LCAKICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzX3RvX2tlZXAuc2l6ZSgpIC0gKGorMSkp
OwogICAgICAgICAgICB3b3JraW5nID0gYmFja3VwOwogICAgICAgICAgICBleHBfYnVmLnJlc2V0
KCk7CiAgICAgICAgICAgIGV4cF9saXN0ID0gbGFuZy0+ZXhwYW5kKHRvX2tlZXBbaV0tPndvcmQs
IGZsYWdzLCBleHBfYnVmKTsKICAgICAgICAgICAgZm9yIChXb3JkQWZmICogcSA9IGV4cF9saXN0
OyBxOyBxID0gcS0+bmV4dCkgewogICAgICAgICAgICAgIENNTF9UYWJsZTo6aXRlcmF0b3IgZSA9
IHRhYmxlLmZpbmQocS0+d29yZCk7CiAgICAgICAgICAgICAgd29ya2luZ1tlLT5yYW5rXSA9IHRy
dWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHdvcmtpbmcgPT0gdGFsbHkpIHsKICAg
ICAgICAgICAgICBmbGFnc190b19rZWVwID0gZmxhZ3M7CiAgICAgICAgICAgICAgc29tZXRoaW5n
X2NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAg
ICAgICB9CiAgICAgICAgfSB3aGlsZSAoc29tZXRoaW5nX2NoYW5nZWQpOwoKICAgICAgICBpZiAo
ZmxhZ3NfdG9fa2VlcCAhPSB0b19rZWVwW2ldLT5hZmYpIHsKICAgICAgICAgIG1lbWNweSh0b19r
ZWVwW2ldLT5hZmYsIGZsYWdzX3RvX2tlZXAuc3RyKCksIGZsYWdzX3RvX2tlZXAuc2l6ZSgpICsg
MSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgfQoKICAgIC8vIEZpbmFsbHkgcHJpbnQg
dGhlIHJlc3VsdGluZyBsaXN0CgogICAgLy9wcmludGYoIlhYWCAlZCAlZFxuIiwgdG9fa2VlcC5z
aXplKCksIHRvX2tlZXBfZXhwLnNpemUoKSk7CiAgICAvL2ZvciAoaW50IGkgPSAwOyBpICE9IHRv
X2tlZXBfZXhwLnNpemUoKTsgKytpKSB7CiAgICAvLyAgcHJpbnRmKCI+Pj4gJWQgJWRcbiIsIGks
IChpbnQpdG9fa2VlcF9leHBbaV0pOwogICAgLy99CgogICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSAhPSB0b19rZWVwLnNpemUoKTsgKytpKSB7CiAgICAgIENPVVQgPDwgb2NvbnYodG9fa2VlcFtp
XS0+d29yZCk7CiAgICAgIGlmICh0b19rZWVwW2ldLT5hZmZbMF0pIHsKICAgICAgICBDT1VUIDw8
ICcvJzsKICAgICAgICBDT1VUIDw8IG9jb252KHRvX2tlZXBbaV0tPmFmZik7CiAgICAgIH0KICAg
ICAgQ09VVCA8PCAnXG4nOwogICAgfQogICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSB0b19r
ZWVwX2V4cC5zaXplKCk7ICsraSkgewogICAgICBpZiAoIXRvX2tlZXBfZXhwW2ldKSB7CiAgICAg
ICAgYXNzZXJ0KCFlbnRyaWVzW2ldLT5hZmYpOwogICAgICAgIENPVVQucHJpbnRmKCIlc1xuIiwg
b2NvbnYoZW50cmllc1tpXS0+d29yZCkpOwogICAgICB9CiAgICB9CiAgfQoKICBwID0gdGFibGUu
YmVnaW4oKTsKICBmb3IgKDsgcCAhPSBlbmQ7ICsrcCkgCiAgewogICAgaWYgKHAtPmFmZikgZnJl
ZShwLT5hZmYpOwogICAgcC0+YWZmID0gMDsKICB9Cn0KCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLwovLwovLyBkdW1wIGFmZml4Ci8vCgp2b2lkIGR1bXBfYWZmaXgoKQp7CiAgRlN0cmVhbSBp
bjsKICBFWElUX09OX0VSUihhc3BlbGxlcjo6b3Blbl9hZmZpeF9maWxlKCpvcHRpb25zLCBpbikp
OwogIAogIFN0cmluZyBsaW5lOwogIHdoaWxlIChpbi5nZXRsaW5lKGxpbmUpKQogICAgQ09VVCA8
PCBsaW5lIDw8ICdcbic7Cn0KCgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgovLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8KLy8KLy8gcHJpbnRfaGVscAovLwoKdm9pZCBwcmludF9oZWxwX2xpbmUoY2hhciBh
YnJ2LCBjaGFyIGRvbnRfYWJydiwgY29uc3QgY2hhciAqIG5hbWUsIAoJCSAgICAgS2V5SW5mb1R5
cGUgdHlwZSwgY29uc3QgY2hhciAqIGRlc2MsIGJvb2wgbm9fZG9udCA9IGZhbHNlKSAKewogIFN0
cmluZyBjb21tYW5kOwogIGlmIChhYnJ2ICE9ICdcMCcpIHsKICAgIGNvbW1hbmQgKz0gJy0nOwog
ICAgY29tbWFuZCArPSBhYnJ2OwogICAgaWYgKGRvbnRfYWJydiAhPSAnXDAnKSB7CiAgICAgIGNv
bW1hbmQgKz0gJ3wnOwogICAgICBjb21tYW5kICs9ICctJzsKICAgICAgY29tbWFuZCArPSBkb250
X2FicnY7CiAgICB9CiAgICBjb21tYW5kICs9ICcsJzsKICB9CiAgY29tbWFuZCArPSAiLS0iOwog
IGlmICh0eXBlID09IEtleUluZm9Cb29sICYmICFub19kb250KSBjb21tYW5kICs9ICJbZG9udC1d
IjsKICBpZiAodHlwZSA9PSBLZXlJbmZvTGlzdCkgY29tbWFuZCArPSAiYWRkfHJlbS0iOwogIGNv
bW1hbmQgKz0gbmFtZTsKICBpZiAodHlwZSA9PSBLZXlJbmZvU3RyaW5nIHx8IHR5cGUgPT0gS2V5
SW5mb0xpc3QpIAogICAgY29tbWFuZCArPSAiPTxzdHI+IjsKICBpZiAodHlwZSA9PSBLZXlJbmZv
SW50KQogICAgY29tbWFuZCArPSAiPTxpbnQ+IjsKICBjb25zdCBjaGFyICogdGRlc2MgPSBfKGRl
c2MpOwogIGNoYXIgYnVmWzEyMF07CiAgaW50IGxlbiA9IHNucHJpbnRmKGJ1ZiwgMTIwLCAiICAl
LTI3cyIsIGNvbW1hbmQuY19zdHIoKSk7CiAgaWYgKGxlbiA9PSAyOSkKICAgIHByaW50ZigiJXMg
JXNcbiIsIGJ1ZiwgdGRlc2MpOwogIGVsc2UKICAgIHByaW50ZigiJXNcbiUzMHMlc1xuIiwgYnVm
LCAiIiwgdGRlc2MpOwp9CgpuYW1lc3BhY2UgYWNvbW1vbiB7CiAgUG9zaWJFcnI8Q29uZmlnTW9k
dWxlICo+IGdldF9keW5hbWljX2ZpbHRlcihDb25maWcgKiBjb25maWcsIFBhcm1TdHIgdmFsdWUp
Owp9CgpzdGF0aWMgY29uc3QgY2hhciAqIHVzYWdlX3RleHRbXSA9IAp7CiAgLyogVFJBTlNMQVRP
UlM6IFRoZXNlIHNob3VsZCBhbGwgYmUgZm9ybWF0ZWQgdG8gZml0IGluIDgwIGNvbHVtbiBvcgog
ICAgIGxlc3MgKi8KICBOXygiVXNhZ2U6IGFzcGVsbCBbb3B0aW9uc10gPGNvbW1hbmQ+IiksCiAg
Tl8oIjxjb21tYW5kPiBpcyBvbmUgb2Y6IiksCiAgTl8oIiAgLT98dXNhZ2UgICAgICAgICBkaXNw
bGF5IGEgYnJpZWYgdXNhZ2UgbWVzc2FnZSIpLAogIE5fKCIgIGhlbHAgICAgICAgICAgICAgZGlz
cGxheSBhIGRldGFpbGVkIGhlbHAgbWVzc2FnZSIpLAogIE5fKCIgIC1jfGNoZWNrIDxmaWxlPiAg
c3BlbGxjaGVja3MgYSBmaWxlIiksCiAgTl8oIiAgLWF8cGlwZSAgICAgICAgICBcImlzcGVsbCAt
YVwiIGNvbXBhdGliaWxpdHkgbW9kZSIpLAogIE5fKCIgIFtkdW1wXSBjb25maWcgICAgZHVtcHMg
dGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB0byBzdGRvdXQiKSwKICBOXygiICBjb25maWcgPGtl
eT4gICAgIHByaW50cyB0aGUgY3VycmVudCB2YWx1ZSBvZiBhbiBvcHRpb24iKSwKICBOXygiICBb
ZHVtcF0gZGljdHMgfCBmaWx0ZXJzIHwgbW9kZXMiKSwKICBOXygiICAgIGxpc3RzIGF2YWlsYWJs
ZSBkaWN0aW9uYXJpZXMgLyBmaWx0ZXJzIC8gZmlsdGVyIG1vZGVzIiksCiAgTl8oIltvcHRpb25z
XSBpcyBhbnkgb2YgdGhlIGZvbGxvd2luZzoiKQp9OwpzdGF0aWMgY29uc3QgdW5zaWduZWQgdXNh
Z2VfdGV4dF9zaXplID0gc2l6ZW9mKHVzYWdlX3RleHQpL3NpemVvZihjb25zdCBjaGFyICopOwoK
c3RhdGljIGNvbnN0IGNoYXIgKiBoZWxwX3RleHRbXSA9IAp7CiAgdXNhZ2VfdGV4dFswXSwKICAi
IiwKICB1c2FnZV90ZXh0WzFdLAogIHVzYWdlX3RleHRbMl0sCiAgdXNhZ2VfdGV4dFszXSwKICB1
c2FnZV90ZXh0WzRdLAogIHVzYWdlX3RleHRbNV0sCiAgTl8oIiAgbGlzdCAgICAgICAgICAgICBw
cm9kdWNlIGEgbGlzdCBvZiBtaXNzcGVsbGVkIHdvcmRzIGZyb20gc3RhbmRhcmQgaW5wdXQiKSwK
ICB1c2FnZV90ZXh0WzZdLAogIHVzYWdlX3RleHRbN10sCiAgTl8oIiAgc291bmRzbGlrZSAgICAg
ICByZXR1cm5zIHRoZSBzb3VuZHMgbGlrZSBlcXVpdmFsZW50IGZvciBlYWNoIHdvcmQgZW50ZXJl
ZCIpLAogIE5fKCIgIG11bmNoICAgICAgICAgICAgZ2VuZXJhdGUgcG9zc2libGUgcm9vdCB3b3Jk
cyBhbmQgYWZmaXhlcyIpLAogIE5fKCIgIGV4cGFuZCBbMS00XSAgICAgZXhwYW5kcyBhZmZpeCBm
bGFncyIpLAogIE5fKCIgIGNsZWFuIFtzdHJpY3RdICAgY2xlYW5zIGEgd29yZCBsaXN0IHNvIHRo
YXQgZXZlcnkgbGluZSBpcyBhIHZhbGlkIHdvcmQiKSwKICBOXygiICBmaWx0ZXIgICAgICAgICAg
IGZpbHRlcnMgaW5wdXQgYXMgaWYgaXQgd2FzIGJlaW5nIHNwZWxsY2hlY2tlZCIpLAogIE5fKCIg
IC12fHZlcnNpb24gICAgICAgcHJpbnRzIGEgdmVyc2lvbiBsaW5lIiksCiAgTl8oIiAgbXVuY2gt
bGlzdCBbc2ltcGxlXSBbc2luZ2xlfG11bHRpXSBba2VlcF0iKSwKICBOXygiICAgIHJlZHVjZSB0
aGUgc2l6ZSBvZiBhIHdvcmQgbGlzdCB2aWEgYWZmaXggY29tcHJlc3Npb24iKSwKICBOXygiICBj
b252IDxmcm9tPiA8dG8+IFs8bm9ybS1mb3JtPl0iKSwKICBOXygiICAgIGNvbnZlcnRzIGZyb20g
b25lIGVuY29kaW5nIHRvIGFub3RoZXIiKSwKICBOXygiICBub3JtICg8bm9ybS1tYXA+IHwgPGZy
b20+IDxub3JtLW1hcD4gPHRvPikgWzxub3JtLWZvcm0+XSIpLAogIE5fKCIgICAgcGVyZm9ybSBV
bmljb2RlIG5vcm1hbGl6YXRpb24iKSwKICB1c2FnZV90ZXh0WzhdLAogIHVzYWdlX3RleHRbOV0s
CiAgTl8oIiAgZHVtcHxjcmVhdGV8bWVyZ2UgbWFzdGVyfHBlcnNvbmFsfHJlcGwgWzxuYW1lPl0i
KSwKICBOXygiICAgIGR1bXBzLCBjcmVhdGVzIG9yIG1lcmdlcyBhIG1hc3RlciwgcGVyc29uYWws
IG9yIHJlcGxhY2VtZW50IGRpY3Rpb25hcnkuIiksCiAgIiIsCiAgLyogVFJBTlNMQVRPUlM6ICJu
b25lIiwgImludGVybmFsIiBhbmQgInN0cmljdCIgYXJlIGxpdGVyYWwgdmFsdWVzCiAgICAgYW5k
IHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZC4gKi8KICBOXygiICA8bm9ybS1mb3JtPiAgICAgIG5v
cm1hbGl6YXRpb24gZm9ybSB0byB1c2UsIGVpdGhlciBub25lLCBpbnRlcm5hbCwgb3Igc3RyaWN0
IiksCiAgIiIsCiAgdXNhZ2VfdGV4dFsxMF0sCiAgIiIKfTsKc3RhdGljIGNvbnN0IHVuc2lnbmVk
IGhlbHBfdGV4dF9zaXplID0gc2l6ZW9mKGhlbHBfdGV4dCkvc2l6ZW9mKGNvbnN0IGNoYXIgKik7
Cgp2b2lkIHByaW50X2hlbHAgKGJvb2wgdmVyYm9zZSkgewogIGxvYWRfYWxsX2ZpbHRlcnMob3B0
aW9ucyk7CiAgaWYgKHZlcmJvc2UpIHsKICAgIHByaW50ZihfKCJcbiIKICAgICAgICAgICAgICJB
c3BlbGwgJXMuICBDb3B5cmlnaHQgMjAwMC0yMDIzIGJ5IEtldmluIEF0a2luc29uLlxuIgogICAg
ICAgICAgICAgIlxuIiksIGFzcGVsbF92ZXJzaW9uX3N0cmluZygpKTsKICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBoZWxwX3RleHRfc2l6ZTsgKytpKQogICAgICBwdXRzKGd0XyhoZWxwX3Rl
eHRbaV0pKTsKICB9IGVsc2UgewogICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHVzYWdlX3Rl
eHRfc2l6ZTsgKytpKQogICAgICBwdXRzKGd0Xyh1c2FnZV90ZXh0W2ldKSk7CiAgfQogIFN0YWNr
UHRyPEtleUluZm9FbnVtZXJhdGlvbj4gZWxzKG9wdGlvbnMtPnBvc3NpYmxlX2VsZW1lbnRzKHRy
dWUsZmFsc2UpKTsKICBjb25zdCBLZXlJbmZvICogazsKICB3aGlsZSAoayA9IGVscy0+bmV4dCgp
LCBrKSB7CiAgICBpZiAoay0+ZGVzYyA9PSAwIHx8IGstPmZsYWdzICYgS0VZSU5GT19ISURERU4p
IGNvbnRpbnVlOwogICAgaWYgKCF2ZXJib3NlICYmICEoay0+ZmxhZ3MgJiBLRVlJTkZPX0NPTU1P
TikpIGNvbnRpbnVlOwogICAgY29uc3QgUG9zc2libGVPcHRpb24gKiBvID0gZmluZF9vcHRpb24o
ay0+bmFtZSk7CiAgICBjb25zdCBjaGFyICogbmFtZSA9IGstPm5hbWU7CiAgICBwcmludF9oZWxw
X2xpbmUoby0+YWJydiwgCgkJICAgIHN0cm5jbXAoKG8rMSktPm5hbWUsICJkb250LSIsIDUpID09
IDAgPyAobysxKS0+YWJydiA6ICdcMCcsCgkJICAgIG5hbWUsIGstPnR5cGUsIGstPmRlc2MpOwog
ICAgaWYgKHZlcmJvc2UgJiYgc3RyY21wKG5hbWUsICJtb2RlIikgPT0gMCkgewogICAgICBmb3Ig
KGNvbnN0IE1vZGVBYnJ2ICogaiA9IG1vZGVfYWJydnM7CiAgICAgICAgICAgaiAhPSBtb2RlX2Fi
cnZzX2VuZDsKICAgICAgICAgICArK2opCiAgICAgIHsKICAgICAgICBwcmludF9oZWxwX2xpbmUo
ai0+YWJydiwgJ1wwJywgai0+bW9kZSwgS2V5SW5mb0Jvb2wsIGotPmRlc2MsIHRydWUpOwogICAg
ICB9CiAgICB9CiAgfQoKICBpZiAodmVyYm9zZSkgewogICAgLy8KICAgIHB1dGNoYXIoJ1xuJyk7
CiAgICBwdXRjaGFyKCdcbicpOwogICAgcHV0cygKICAgICAgXygiQXZhaWxhYmxlIERpY3Rpb25h
cmllczpcbiIKICAgICAgICAiICAgIERpY3Rpb25hcmllcyBjYW4gYmUgc2VsZWN0ZWQgZGlyZWN0
bHkgdmlhIHRoZSBcIi1kXCIgb3IgXCJtYXN0ZXJcIlxuIgogICAgICAgICIgICAgb3B0aW9uLiAg
VGhleSBjYW4gYWxzbyBiZSBzZWxlY3RlZCBpbmRpcmVjdGx5IHZpYSB0aGUgXCJsYW5nXCIsXG4i
CiAgICAgICAgIiAgICBcInZhcmlldHlcIiwgYW5kIFwic2l6ZVwiIG9wdGlvbnMuXG4iKSk7CiAg
ICAKICAgIGNvbnN0IERpY3RJbmZvTGlzdCAqIGRsaXN0ID0gZ2V0X2RpY3RfaW5mb19saXN0KG9w
dGlvbnMpOwogICAgCiAgICBTdGFja1B0cjxEaWN0SW5mb0VudW1lcmF0aW9uPiBkZWxzKGRsaXN0
LT5lbGVtZW50cygpKTsKICAgIAogICAgY29uc3QgRGljdEluZm8gKiBlbnRyeTsKICAgIAogICAg
d2hpbGUgKCAoZW50cnkgPSBkZWxzLT5uZXh0KCkpICE9IDApIAogICAgewogICAgICBwcmludGYo
IiAgJXNcbiIsIGVudHJ5LT5uYW1lKTsKICAgIH0KCgogICAgLy8KICAgIHB1dGNoYXIoJ1xuJyk7
CiAgICBwdXRjaGFyKCdcbicpOwogICAgZnB1dHMoCiAgICAgIF8oIkF2YWlsYWJsZSBGaWx0ZXJz
IChhbmQgYXNzb2NpYXRlZCBvcHRpb25zKTpcbiIKICAgICAgICAiICAgIEZpbHRlcnMgY2FuIGJl
IGFkZGVkIG9yIHJlbW92ZWQgdmlhIHRoZSBcImZpbHRlclwiIG9wdGlvbi5cbiIpLAogICAgICBz
dGRvdXQpOwogICAgZm9yIChWZWN0b3I8Q29uZmlnTW9kdWxlPjo6Y29uc3RfaXRlcmF0b3IgbSA9
IG9wdGlvbnMtPmZpbHRlcl9tb2R1bGVzLmJlZ2luKCk7CiAgICAgICAgIG0gIT0gb3B0aW9ucy0+
ZmlsdGVyX21vZHVsZXMuZW5kKCk7CiAgICAgICAgICsrbSkKICAgIHsKICAgICAgcHJpbnRmKF8o
IlxuICAlcyBmaWx0ZXI6ICVzXG4iKSwgbS0+bmFtZSwgZ3RfKG0tPmRlc2MpKTsKICAgICAgZm9y
IChrID0gbS0+YmVnaW47IGsgIT0gbS0+ZW5kOyArK2spIHsKICAgICAgICBjb25zdCBQb3NzaWJs
ZU9wdGlvbiAqIG8gPSBmaW5kX29wdGlvbihrLT5uYW1lKTsKICAgICAgICBjb25zdCBjaGFyICog
bmFtZSA9IGstPm5hbWU7CiAgICAgICAgY29uc3QgS2V5SW5mbyAqIG9rID0gb3B0aW9ucy0+a2V5
aW5mbyhuYW1lICsgMik7CiAgICAgICAgaWYgKGsgPT0gb2spIG5hbWUgKz0gMjsKICAgICAgICBw
cmludF9oZWxwX2xpbmUoby0+YWJydiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jbXAo
KG8rMSktPm5hbWUsICJkb250LSIsIDUpID09IDAgPyAobysxKS0+YWJydiA6ICdcMCcsCiAgICAg
ICAgICAgICAgICAgICAgICAgIG5hbWUsIGstPnR5cGUsIGstPmRlc2MpOwogICAgICB9CiAgICB9
CgogICAgLy8KICAgIHB1dGNoYXIoJ1xuJyk7CiAgICBwdXRjaGFyKCdcbicpOwogICAgcHV0cygg
IAogICAgICAvKiBUUkFOU0xBVE9SUzogVGhpcyBzaG91bGQgYmUgZm9ybWF0ZWQgdG8gZml0IGlu
IDgwIGNvbHVtbiBvciBsZXNzICovCiAgICAgIF8oIkF2YWlsYWJsZSBGaWx0ZXIgTW9kZXM6XG4i
CiAgICAgICAgIiAgICBGaWx0ZXIgTW9kZXMgYXJlIHJlY29uZmlndXJlZCBjb21iaW5hdGlvbnMg
b2YgZmlsdGVycyBvcHRpbWl6ZWQgZm9yXG4iCiAgICAgICAgIiAgICBmaWxlcyBvZiBhIHNwZWNp
ZmljIHR5cGUuIEEgbW9kZSBpcyBzZWxlY3RlZCB2aWEgdGhlIFwibW9kZVwiIG9wdGlvbi5cbiIK
ICAgICAgICAiICAgIFRoaXMgd2lsbCBoYXBwZW4gaW1wbGljaXRseSBpZiBBc3BlbGwgaXMgYWJs
ZSB0byBpZGVudGlmeSB0aGUgZmlsZVxuIgogICAgICAgICIgICAgdHlwZSBmcm9tIHRoZSBleHRl
bnNpb24sIGFuZCBwb3NzaWJpbGl0eSB0aGUgY29udGVudHMsIG9mIHRoZSBmaWxlLlxuIikpOwog
ICAgCiAgICBFWElUX09OX0VSUl9TRVQoYXZhaWxhYmxlX2ZpbHRlcl9tb2RlcyhvcHRpb25zKSwg
U3RyaW5nUGFpckVudW1lcmF0aW9uICosIGVscyk7CiAgICBTdHJpbmdQYWlyIHNwOwogICAgd2hp
bGUgKCFlbHMtPmF0X2VuZCgpKSB7CiAgICAgIHNwID0gZWxzLT5uZXh0KCk7CiAgICAgIHByaW50
ZigiICAlLTE0cyAlc1xuIiwgc3AuZmlyc3QsIGd0XyhzcC5zZWNvbmQpKTsKICAgIH0KICAgIGRl
bGV0ZSBlbHM7CiAgfQp9Cgo=

--_004_DBBP194MB1098F8898B7994A7BAEB9AE48490ADBBP194MB1098EURP_--