Win32 port - the GC...

Anoq of the Sun anoq@hardcoreprocessing.com
Thu, 31 Jan 2002 22:06:46 +0100


This is a multi-part message in MIME format.
--------------14E4402F98B4537F7DFE25DF
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Hello!


I'm working on completing the Win32-port of the 20010806
release of MLton now. I have now come to the point where
the compilation complains about compiling mllex - so I think
MLton itself compiles now (but that probably far from means
that it works of course - most of the code I messed with is
C-code after all ;)

Anyways - I have attached gc.c from the runtime. I would like
you guys to review / fix the code if you know of any potential
problems. And all changes should only apply if the _WIN32 flag
is defined - so I hope it's still equivalent to gc.c in
version 20010806 on Linux at least.

In particular I'm concerned about the following:

1) I commented out a lot of timing stuff - which doesn't exist
   on Win32, but it seems mostly to be for debugging and feedback
   so I hope it's not important (we only cross-compile applications
   to Windows which already work on Linux - right? :)
2) It seems the garbage collector doesn't do memory shrinking of
   the stack anymore (the ML call-stack i presume?) as it did
   in the old version I ported. This should actually give one
   problem _less_ on Win32 - but maybe the code has just changed
   and maybe you still do stack shrinking, only in a different way?
3) There are no signals in Win32 - I'm not sure if it's safe to
   just uncomment all that stuff (after all the GC seems to
   only be concerned about disabling those signals... :)
   and if I've done it right.
4) Win32 does not have the mprotect function - so I uncommented
   that in ssmmap - but ssmmap is not even called anymore - after
   the uncommenting of everything in the function initSignalStack 
   because of the signals (which I'm not sure will be safe either?)
   So maybe ssmmap is not important at all...

Anyways - look for the following in the code:

_WIN32
FIXME:
DONT_SHRINK_MEM
DONT_USE_SIGNALS

I hope you can give some feedback :)


Cheers
-- 
http://www.HardcoreProcessing.com
--------------14E4402F98B4537F7DFE25DF
Content-Type: application/x-unknown-content-type-ProjectBuilder.c;
 name="gc.c"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="gc.c"

LyogQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgTkVDIFJlc2VhcmNoIEluc3RpdHV0ZS4KICog
UGxlYXNlIHNlZSB0aGUgZmlsZSBMSUNFTlNFIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgog
Ki8KCiNpbmNsdWRlICJnYy5oIgoKI2lmIGRlZmluZWQoX1dJTjMyKQojaW5jbHVkZSA8d2lu
ZG93cy5oPgojaW5jbHVkZSA8c3lzL3RpbWViLmg+CgovLyBPbiBXaW4zMiwgd2UgY2Fubm90
IGZyZWUgb25seSBwYXJ0IG9mIGEgbWVtb3J5IGFyZWEuCi8vIFRoaXMgZmVhdHVyZSBvZiBt
dW5tYXAgaXMgdXNlZCB3aGVuIHNocmlua2luZyBtZW1vcnkKLy8gYXJlYXMgKHRoZSBoZWFw
IGFuZCB0aGUgc3RhY2spLCBzbyB3ZSBzaG91bGRuJ3Qgc2hyaW5rCi8vIGFueXRoaW5nIG9u
IFdpbjMyLgojZGVmaW5lIERPTlRfU0hSSU5LX01FTSAxCgovLyBXaW5kb3dzIGRvZXNuJ3Qg
aGF2ZSBzaWduYWwgaGFuZGxlcnMgLSBzbyB3ZSBjYW5ub3QKLy8gdXNlIHRoZW0uIEhvd2V2
ZXIsIHRoZXkgYXJlIG9ubHkgYmVpbmcgdXNlZCBmb3IgZGlzYWJsaW5nCi8vIHRoZW1zZWx2
ZXMgYW5kIGlmIHRoZXkgYXJlIG5vdCB0aGVyZSB0aGV5IGRvbid0IG5lZWQgdG8gYmUKLy8g
ZGlzYWJsZWQgOikKI2RlZmluZSBET05UX1VTRV9TSUdOQUxTIDEKCi8vIEkgX3RoaW5rXyB0
aGlzIGlzIGNvcnJlY3QgLSBpdCdzIHNvbWUgY29uc3RhbnRzIGZyb20gRGVscGhpLi4uCgoj
aWZuZGVmIF9TSF9ERU5ZUkQKI2RlZmluZSBfT19SRE9OTFkgMAojZGVmaW5lIF9PX1dST05M
WSAxCiNkZWZpbmUgX09fUkRXUiAyCi8vT0ZfU0hBUkVfQ09NUEFUICAwCi8vT0ZfU0hBUkVf
RVhDTFVTSVZFICAweDEwCiNkZWZpbmUgX1NIX0RFTllXUiAgMHgyMAojZGVmaW5lIF9TSF9E
RU5ZUkQgIDQ4CiNkZWZpbmUgX1NIX0RFTllOTyAgMHg0MAovL09GX1BBUlNFICAweDEwMAov
L09GX0RFTEVURSAgMHgyMDAKLy9PRl9WRVJJRlkgIDB4NDAwCi8vT0ZfQ0FOQ0VMICAweDgw
MAovLyNkZWZpbmUgX09fQ1JFQVQgIDB4MTAwMAovL09GX1BST01QVCAgMHgyMDAwCi8vT0Zf
RVhJU1QgIDB4NDAwMAovL09GX1JFT1BFTiAgMHg4MDAwCiNlbmRpZgoKI2Vsc2UKI2luY2x1
ZGUgPHN5cy9tbWFuLmg+CiNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KI2luY2x1ZGUgPHN5
cy9zeXNpbmZvLmg+CiNpbmNsdWRlIDxzeXMvdGltZXMuaD4KI2luY2x1ZGUgPHRpbWUuaD4K
I2VuZGlmCgoKI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVk
ZSA8bWF0aC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDx2YWx1ZXMuaD4KCi8q
IAogKiBPYmplY3QgaGVhZGVycy4KICoKICogYml0IDMxID09IDEKICogICBub3JtYWwgb2Jq
ZWN0CiAqIGJpdCAzMSA9PSAwCiAqICAgYml0IDI5ID09IDAKICogICAgIGFycmF5CiAqICAg
Yml0IDI5ID09IDEKICogICAgIGJpdCAyOCA9PSAwCiAqICAgICAgIHN0YWNrCiAqICAgICBi
aXQgMjggPT0gMQogKiAgICAgICBjb250CiAqCiAqIFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0
d2VlbiBjb250cyBhbmQgc3RhY2tzIGlzIHRoYXQgdGhlIGZvcm1lciBoYXMgCiAqICAgdXNl
ZCA9PSByZXNlcnZlZC4KICoKICogYml0IDMwIGlzIHVzZWQgYXMgYSBtYXJrIGJpdC4gIEZv
ciBub3csIGl0IGlzIG9ubHkgdXNlZCBpbiBHQ19zaXplLgogKi8KCi8qIFRoZSBtdXRhdG9y
IHNob3VsZCBtYWludGFpbiB0aGUgaW52YXJpYW50cwogKgogKiAgZnVuY3Rpb24gZW50cnk6
IHN0YWNrVG9wICsgbWF4RnJhbWVTaXplICsgV09SRF9TSVpFIDw9IGVuZE9mU3RhY2sKICog
IGFueXdoZXJlIGVsc2U6IHN0YWNrVG9wICsgMiAqIG1heEZyYW1lU2l6ZSArIFdPUkRfU0la
RSA8PSBlbmRPZlN0YWNrCiAqIAogKiBUaGUgbGF0dGVyIHdpbGwgZ2l2ZSBpdCBlbm91Z2gg
c3BhY2UgdG8gbWFrZSBhIGZ1bmN0aW9uIGNhbGwgYW5kIGFsd2F5cwogKiBzYXRpc2Z5IHRo
ZSBmb3JtZXIuICBUaGUgZm9ybWVyIHdpbGwgYWxsb3cgaXQgdG8gbWFrZSBhIGdjIGNhbGwg
YXQgdGhlCiAqIGZ1bmN0aW9uIGVudHJ5IGxpbWl0LiAgVGhlIFdPUkRfU0laRXMgYXJlIHRo
ZXJlIGJlY2F1c2Ugc3RhY2tUb3AgcG9pbnRzIGF0CiAqIHRoZSB0b3Agd29yZCBpbiB1c2Ug
b24gdGhlIHN0YWNrLCBub3QgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suCiAqCiAqIFdlIGRv
IGEgc2xpZ2h0IGNoZWF0IGFuZCBkb24ndCBib3RoZXIgc3VidHJhY3Rpbmcgb2ZmIHRoZSBX
T1JEX1NJWkUgd2hlbgogKiBjb21wdXRpbmcgdGhlIHN0YWNrTGltaXQsIHNpbmNlIHRoZSBz
dGFjayBvdmVyZmxvdyB0ZXN0IGRvZXMgYSA+PSBzdGFja0xpbWl0LgogKi8KCmVudW0gewoJ
Qk9HVVNfRVhOX1NUQUNLID0gMHhGRkZGRkZGRiwKCUJPR1VTX1BPSU5URVIgPSAweDEsCglE
RUJVRyA9IEZBTFNFLAoJRk9SV0FSREVEID0gMHhGRkZGRkZGRiwKCUhFQURFUl9TSVpFID0g
V09SRF9TSVpFLAoJTElNSVRfU0xPUCA9IDUxMiwKCVNUQUNLX0hFQURFUiA9IDB4MzAwMDAw
MDAsCglDT05UX0hFQURFUiA9IDB4MjAwMDAwMDAsCglTVEFDS19IRUFERVJfU0laRSA9IFdP
UkRfU0laRSwKfTsKCiNkZWZpbmUgQk9HVVNfVEhSRUFEIChHQ190aHJlYWQpQk9HVVNfUE9J
TlRFUgojZGVmaW5lIFNUUklOR19IRUFERVIgR0NfYXJyYXlIZWFkZXIoMSwgMCkKI2RlZmlu
ZSBXT1JEOF9WRUNUT1JfSEVBREVSIEdDX2FycmF5SGVhZGVyKDEsIDApCiNkZWZpbmUgVEhS
RUFEX0hFQURFUiBHQ19vYmplY3RIZWFkZXIoMSwgMSkKCnN0YXRpYyB2b2lkIGxlYXZlKEdD
X3N0YXRlIHMpOwoKc3RhdGljIGlubGluZSB2b2lkIHNwbGl0SGVhZGVyKHdvcmQgaGVhZGVy
LCB1aW50ICpudW1Qb2ludGVycywgCgkJCQl1aW50ICpudW1Ob25Qb2ludGVycykgewoJKm51
bVBvaW50ZXJzID0gaGVhZGVyICYgT05FUyhQT0lOVEVSX0JJVFMpOwoJKm51bU5vblBvaW50
ZXJzID0gCgkJKGhlYWRlciA+PiBOT05fUE9JTlRFUlNfU0hJRlQpICYgT05FUyhOT05fUE9J
TlRFUl9CSVRTKTsKfQoKc3RhdGljIGlubGluZSBib29sIGlzTm9ybWFsKHdvcmQgaGVhZGVy
KSB7CglyZXR1cm4gaGVhZGVyICYgSElHSF9CSVQ7Cn0KCnN0YXRpYyBpbmxpbmUgYm9vbCBp
c1N0YWNrSGVhZGVyKHdvcmQgaGVhZGVyKSB7Cglhc3NlcnQobm90KGlzTm9ybWFsKGhlYWRl
cikpKTsKCXJldHVybiBoZWFkZXIgJiAweDMwMDAwMDAwOwp9CgpzdGF0aWMgaW5saW5lIHVp
bnQgdG9CeXRlcyh1aW50IG4pIHsKCXJldHVybiBuIDw8IDI7Cn0KCnN0YXRpYyBpbmxpbmUg
Ym9vbCBpc1dvcmRBbGlnbmVkKHVpbnQgeCkgewoJcmV0dXJuIDAgPT0gKHggJiAweDMpOwp9
CgojaWYgZGVmaW5lZChfV0lOMzIpCi8vIFRoZXNlIHNlZW1zIHRvIGJlIGRlZmluZWQgYWxy
ZWFkeS4uLgovLyAjZGVmaW5lIG1pbih4LCB5KSAoKCh1aW50KXggPCAodWludCl5KSA/ICh1
aW50KXggOiAodWludCl5KQovLyAjZGVmaW5lIG1heCh4LCB5KSAoKCh1aW50KXggPiAodWlu
dCl5KSA/ICh1aW50KXggOiAodWludCl5KQojZWxzZQpzdGF0aWMgaW5saW5lIHVpbnQgbWlu
KHVpbnQgeCwgdWludCB5KSB7CglyZXR1cm4gKCh4IDwgeSkgPyB4IDogeSk7Cn0KCnN0YXRp
YyBpbmxpbmUgdWludCBtYXgodWludCB4LCB1aW50IHkpIHsKCXJldHVybiAoKHggPiB5KSA/
IHggOiB5KTsKfQojZW5kaWYKCiNpZiBkZWZpbmVkKF9XSU4zMikKbG9uZyB3aW5HZXRQYWdl
U2l6ZSgpCnsKICBTWVNURU1fSU5GTyBzSW5mbzsKICAgIAogIEdldFN5c3RlbUluZm8oJnNJ
bmZvKTsKICAgICAgICAKICByZXR1cm4gc0luZm8uZHdQYWdlU2l6ZTsKfQogICAgICAgICAg
CiNkZWZpbmUgbWx0b25fZ2V0cGFnZXNpemUgd2luR2V0UGFnZVNpemUKI2Vsc2UKI2RlZmlu
ZSBtbHRvbl9nZXRwYWdlc2l6ZSBnZXRwYWdlc2l6ZQojZW5kaWYgICAgICAgICAgCgovKiBB
IHN1cGVyLXNhZmUgbW1hcC4KICogIEFsbG9jYXRlcyBhIHJlZ2lvbiBvZiBtZW1vcnkgd2l0
aCBkZWFkIHpvbmVzIGF0IHRoZSBoaWdoIGFuZCBsb3cgZW5kcy4KICogIEFueSBhdHRlbXB0
IHRvIHRvdWNoIHRoZSBkZWFkIHpvbmUgKHJlYWQgb3Igd3JpdGUpIHdpbGwgY2F1c2UgYQog
KiAgIHNlZ21lbnRhdGlvbiBmYXVsdC4KICovCnN0YXRpYyB2b2lkICpzc21tYXAoc2l6ZV90
IGxlbmd0aCwgc2l6ZV90IGRlYWRfbG93LCBzaXplX3QgZGVhZF9oaWdoKSB7CiAgdm9pZCAq
YmFzZSwqbG93LCpyZXN1bHQsKmhpZ2g7CgogIGJhc2UgPSBzbW1hcChsZW5ndGggKyBkZWFk
X2xvdyArIGRlYWRfaGlnaCk7CgogIGxvdyA9IGJhc2U7CiNpZiBkZWZpbmVkKF9XSU4zMikK
Ly8gRklYTUU6IFdpbjMyIGRvZXMgbm90IGhhdmUgbXByb3RlY3QgLSBidXQgbWF5YmUgdGhp
cyBzdXBlci1zYWZlIHByb3RlY3Rpb24KLy8gICAgICAgIGlzIG5vdCB0aGF0IGltcG9ydGFu
dD8gKGFzc3VtaW5nIHRoYXQgYW4gYXBwbGljYXRpb24gd29ya3MgZmluZSBvbiBMaW51eD8p
CiNlbHNlCiAgaWYgKG1wcm90ZWN0KGxvdywgZGVhZF9sb3csIFBST1RfTk9ORSkpCiAgICBk
aWVlKCJtcHJvdGVjdCBmYWlsZWQiKTsKI2VuZGlmCgogIHJlc3VsdCA9IGxvdyArIGRlYWRf
bG93OwogIGhpZ2ggPSByZXN1bHQgKyBsZW5ndGg7CgojaWYgZGVmaW5lZChfV0lOMzIpCi8v
IEZJWE1FOiBXaW4zMiBkb2VzIG5vdCBoYXZlIG1wcm90ZWN0IC0gYnV0IG1heWJlIHRoaXMg
c3VwZXItc2FmZSBwcm90ZWN0aW9uCi8vICAgICAgICBpcyBub3QgdGhhdCBpbXBvcnRhbnQ/
IChhc3N1bWluZyB0aGF0IGFuIGFwcGxpY2F0aW9uIHdvcmtzIGZpbmUgb24gTGludXg/KQoj
ZWxzZQogIGlmIChtcHJvdGVjdChoaWdoLCBkZWFkX2hpZ2gsIFBST1RfTk9ORSkpCiAgICBk
aWVlKCJtcHJvdGVjdCBmYWlsZWQiKTsKI2VuZGlmCgogIHJldHVybiByZXN1bHQ7Cn0KCi8q
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
LyogICAgICAgICAgICAgICAgICAgICByb3VuZFBhZ2UgICAgICAgICAgICAgICAgICAgICAq
LwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
ICovCgovKgogKiBSb3VuZCBzaXplIHVwIHRvIGEgbXVsdGlwbGUgb2YgdGhlIHNpemUgb2Yg
YSBwYWdlLgogKi8Kc3RhdGljIGlubGluZSBzaXplX3QKcm91bmRQYWdlKHNpemVfdCBzaXpl
KQp7CglzdGF0aWMgc2l6ZV90CXBzaXplOwoKCXBzaXplID0gbWx0b25fZ2V0cGFnZXNpemUo
KTsKCXNpemUgKz0gcHNpemUgLSAxOwoJc2l6ZSAtPSBzaXplICUgcHNpemU7CglyZXR1cm4g
KHNpemUpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tICovCi8qICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgICAgICAgICAg
ICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHZvaWQgZGlzcGxheShHQ19zdGF0ZSBzLCBGSUxF
ICpzdHJlYW0pIHsKCWZwcmludGYoc3RyZWFtLCAiYmFzZSA9ICV4ICBmcm9udGllciA9ICV4
ICBsaW1pdCA9ICV4ICBzdGFjayB1c2VkID0gJWRcbiIsCgkJKHVpbnQpIHMtPmJhc2UsICh1
aW50KSBzLT5mcm9udGllciwgKHVpbnQpIHMtPmxpbWl0LAoJCXMtPmN1cnJlbnRUaHJlYWQt
PnN0YWNrLT51c2VkKTsKCWZwcmludGYoc3RyZWFtLCAiZnJvbnRpZXIgLSBiYXNlID0gJWQg
IGxpbWl0IC0gYmFzZSA9ICVkXG4iLAoJCShpbnQpKHMtPmZyb250aWVyIC0gcy0+YmFzZSks
CgkJKGludCkocy0+bGltaXQgLSBzLT5iYXNlKSk7Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICAgICAg
ICAgICBlbnN1cmVGcmVlICAgICAgICAgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIGlubGlu
ZSB2b2lkCmVuc3VyZUZyZWUoR0Nfc3RhdGUgcywgdWludCBieXRlc1JlcXVlc3RlZCkKewoJ
aWYgKHMtPmZyb250aWVyICsgYnl0ZXNSZXF1ZXN0ZWQgPiBzLT5saW1pdCkgewoJCUdDX2Rv
R0MocywgYnl0ZXNSZXF1ZXN0ZWQsIDApOwoJfQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICAgICAgICAg
ICAgIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIGlubGluZSBw
b2ludGVyCm9iamVjdChHQ19zdGF0ZSBzLCB1aW50IGhlYWRlciwgdWludCBieXRlc1JlcXVl
c3RlZCkKewoJcG9pbnRlciByZXN1bHQ7CgoJYXNzZXJ0KHMtPmZyb250aWVyICsgYnl0ZXNS
ZXF1ZXN0ZWQgPD0gcy0+bGltaXQpOwoJYXNzZXJ0KGlzV29yZEFsaWduZWQoYnl0ZXNSZXF1
ZXN0ZWQpKTsKCSoodWludCopcy0+ZnJvbnRpZXIgPSBoZWFkZXI7CglyZXN1bHQgPSBzLT5m
cm9udGllciArIEhFQURFUl9TSVpFOwoJcy0+ZnJvbnRpZXIgKz0gYnl0ZXNSZXF1ZXN0ZWQ7
CglyZXR1cm4gcmVzdWx0Owp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICAgICAgICAgZ2V0RnJhbWVMYXlv
dXQgICAgICAgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIGlubGluZSBHQ19mcmFtZUxheW91
dAkqCmdldEZyYW1lTGF5b3V0KEdDX3N0YXRlIHMsIHdvcmQgcmV0dXJuQWRkcmVzcykKewoJ
R0NfZnJhbWVMYXlvdXQgKmxheW91dDsKCXVpbnQgaW5kZXg7CgoJaWYgKHMtPm5hdGl2ZSkK
CQlpbmRleCA9ICooKHVpbnQqKShyZXR1cm5BZGRyZXNzIC0gNCkpOwoJZWxzZQoJCWluZGV4
ID0gKHVpbnQpcmV0dXJuQWRkcmVzczsKCWFzc2VydCgwIDw9IGluZGV4ICYmIGluZGV4IDw9
IHMtPm1heEZyYW1lSW5kZXgpOwoJbGF5b3V0ID0gJihzLT5mcmFtZUxheW91dHNbaW5kZXhd
KTsKCXJldHVybiBsYXlvdXQ7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICAgICAgU3RhY2tz
ICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBzdGFja1Nsb3AgcmV0dXJucyB0aGUg
YW1vdW50IG9mICJzbG9wIiBzcGFjZSBuZWVkZWQgYmV0d2VlbiB0aGUgdG9wIG9mIAogKiB0
aGUgc3RhY2sgYW5kIHRoZSBlbmQgb2YgdGhlIHN0YWNrIHNwYWNlLgogKiBJZiB5b3UgY2hh
bmdlIHRoaXMsIG1ha2Ugc3VyZSBhbmQgY2hhbmdlIFRocmVhZF9zd2l0Y2hUbyBpbiBjY29k
ZWdlbi5oCiAqICAgYW5kIHRocmVhZF9zd2l0Y2hUbyBpbiB4ODYtbWx0b24uc21sLgogKi8K
c3RhdGljIGlubGluZSB1aW50IHN0YWNrU2xvcChHQ19zdGF0ZSBzKSB7CglyZXR1cm4gMiAq
IHMtPm1heEZyYW1lU2l6ZTsKfQoKc3RhdGljIGlubGluZSB1aW50IGluaXRpYWxTdGFja1Np
emUoR0Nfc3RhdGUgcykgewoJcmV0dXJuIHN0YWNrU2xvcChzKTsKfQoKc3RhdGljIGlubGlu
ZSB1aW50CnN0YWNrQnl0ZXModWludCBzaXplKQp7CglyZXR1cm4gd29yZEFsaWduKEhFQURF
Ul9TSVpFICsgc2l6ZW9mKHN0cnVjdCBHQ19zdGFjaykgKyBzaXplKTsKfQoKLyogSWYgeW91
IGNoYW5nZSB0aGlzLCBtYWtlIHN1cmUgYW5kIGNoYW5nZSBUaHJlYWRfc3dpdGNoVG8gaW4g
bWFjaGluZS5oCiAqICAgYW5kIHRocmVhZF9zd2l0Y2hUbyBpbiB4ODYtbWx0b24uc21sLgog
Ki8Kc3RhdGljIGlubGluZSBwb2ludGVyCnN0YWNrQm90dG9tKEdDX3N0YWNrIHN0YWNrKQp7
CglyZXR1cm4gKChwb2ludGVyKXN0YWNrKSArIHNpemVvZihzdHJ1Y3QgR0Nfc3RhY2spOwp9
CgovKiBQb2ludGVyIHRvIHRoZSB0b3Btb3N0IHdvcmQgaW4gdXNlIG9uIHRoZSBzdGFjay4g
Ki8KLyogSWYgeW91IGNoYW5nZSB0aGlzLCBtYWtlIHN1cmUgYW5kIGNoYW5nZSBUaHJlYWRf
c3dpdGNoVG8gaW4gbWFjaGluZS5oCiAqICAgYW5kIHRocmVhZF9zd2l0Y2hUbyBpbiB4ODYt
bWx0b24uc21sLgogKi8Kc3RhdGljIGlubGluZSBwb2ludGVyCnN0YWNrVG9wKEdDX3N0YWNr
IHN0YWNrKQp7CglyZXR1cm4gc3RhY2tCb3R0b20oc3RhY2spICsgc3RhY2stPnVzZWQgLSBX
T1JEX1NJWkU7Cn0KCi8qIFRoZSBtYXhpbXVtIHZhbHVlIHN0YWNrVG9wIG1heSB0YWtlIG9u
LiAqLwovKiBJZiB5b3UgY2hhbmdlIHRoaXMsIG1ha2Ugc3VyZSBhbmQgY2hhbmdlIFRocmVh
ZF9zd2l0Y2hUbyBpbiBtYWNoaW5lLmgKICogICBhbmQgdGhyZWFkX3N3aXRjaFRvIGluIHg4
Ni1tbHRvbi5zbWwuCiAqLwpzdGF0aWMgaW5saW5lIHBvaW50ZXIKc3RhY2tMaW1pdChHQ19z
dGF0ZSBzLCBHQ19zdGFjayBzdGFjaykKewoJLyogV2Ugc3VidHJhY3QgV09SRF9TSVpFIGJl
Y2F1c2UgdGhlIHN0YWNrVG9wIHBvaW50cyBhdCB0aGUgbGFzdCB3b3JkCgkgKiB1c2VkIGlu
IHRoZSBzdGFjayAodWdoKSwgbm90IHRoZSB0b3Agb2YgdGhlIHN0YWNrLgoJICovCglyZXR1
cm4gc3RhY2tCb3R0b20oc3RhY2spICsgc3RhY2stPnJlc2VydmVkIC0gc3RhY2tTbG9wKHMp
Owp9CgovKiBOdW1iZXIgb2YgYnl0ZXMgdXNlZCBieSB0aGUgc3RhY2suICovCi8qIElmIHlv
dSBjaGFuZ2UgdGhpcywgbWFrZSBzdXJlIGFuZCBjaGFuZ2UgVGhyZWFkX3N3aXRjaFRvIGlu
IG1hY2hpbmUuaAogKiAgIGFuZCB0aHJlYWRfc3dpdGNoVG8gaW4geDg2LW1sdG9uLnNtbC4K
ICovCnN0YXRpYyBpbmxpbmUgdWludApjdXJyZW50U3RhY2tVc2VkKEdDX3N0YXRlIHMpCnsK
CXJldHVybiBzLT5zdGFja1RvcCArIFdPUkRfU0laRSAtIHMtPnN0YWNrQm90dG9tOwp9Cgpz
dGF0aWMgaW5saW5lIGJvb2wKc3RhY2tJc0VtcHR5KEdDX3N0YWNrIHN0YWNrKQp7CglyZXR1
cm4gMCA9PSBzdGFjay0+dXNlZDsKfQoKc3RhdGljIGlubGluZSB1aW50CnRvcEZyYW1lU2l6
ZShHQ19zdGF0ZSBzLCBHQ19zdGFjayBzdGFjaykKewoJR0NfZnJhbWVMYXlvdXQgKmxheW91
dDsKCQoJYXNzZXJ0KG5vdChzdGFja0lzRW1wdHkoc3RhY2spKSk7CglsYXlvdXQgPSBnZXRG
cmFtZUxheW91dChzLCAqKHdvcmQqKXN0YWNrVG9wKHN0YWNrKSk7CglyZXR1cm4gbGF5b3V0
LT5udW1CeXRlczsKfQoKLyogc3RhY2tUb3BJc09rIGVuc3VyZXMgdGhhdCB3aGVuIHRoaXMg
c3RhY2sgYmVjb21lcyBjdXJyZW50IHRoYXQgCiAqIHRoZSBzdGFja1RvcCBpcyBsZXNzIHRo
YW4gdGhlIHN0YWNrTGltaXQuCiAqLwpzdGF0aWMgaW5saW5lIGJvb2wKc3RhY2tUb3BJc09r
KEdDX3N0YXRlIHMsIEdDX3N0YWNrIHN0YWNrKQp7CglyZXR1cm4gc3RhY2tUb3Aoc3RhY2sp
IDwgc3RhY2tMaW1pdChzLCBzdGFjaykgCgkJCSsgKHN0YWNrSXNFbXB0eShzdGFjaykgPyAw
IDogdG9wRnJhbWVTaXplKHMsIHN0YWNrKSk7Cn0KCnN0YXRpYyBpbmxpbmUgR0Nfc3RhY2sK
bmV3U3RhY2soR0Nfc3RhdGUgcywgd29yZCBoZWFkZXIsIHVpbnQgc2l6ZSkKewoJR0Nfc3Rh
Y2sgc3RhY2s7CgoJc3RhY2sgPSAoR0Nfc3RhY2spb2JqZWN0KHMsIGhlYWRlciwgc3RhY2tC
eXRlcyhzaXplKSk7CglzdGFjay0+cmVzZXJ2ZWQgPSBzaXplOwoJc3RhY2stPnVzZWQgPSAw
OwoJcmV0dXJuIHN0YWNrOwp9CgppbmxpbmUgdm9pZApHQ19zZXRTdGFjayhHQ19zdGF0ZSBz
KQp7CglHQ19zdGFjayBzdGFjazsKCglzdGFjayA9IHMtPmN1cnJlbnRUaHJlYWQtPnN0YWNr
OwoJcy0+c3RhY2tCb3R0b20gPSBzdGFja0JvdHRvbShzdGFjayk7CglzLT5zdGFja1RvcCA9
IHN0YWNrVG9wKHN0YWNrKTsKCXMtPnN0YWNrTGltaXQgPSBzdGFja0xpbWl0KHMsIHN0YWNr
KTsKfQoKc3RhdGljIGlubGluZSB2b2lkCnN0YWNrQ29weShHQ19zdGFjayBmcm9tLCBHQ19z
dGFjayB0bykKewoJYXNzZXJ0KGZyb20tPnVzZWQgPD0gdG8tPnJlc2VydmVkKTsKCXRvLT51
c2VkID0gZnJvbS0+dXNlZDsKCW1lbWNweShzdGFja0JvdHRvbSh0byksIHN0YWNrQm90dG9t
KGZyb20pLCBmcm9tLT51c2VkKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICBHQ19jb21wdXRl
SGVhcFNpemUgICAgICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlubGluZSB1aW50CkdDX2NvbXB1dGVI
ZWFwU2l6ZShHQ19zdGF0ZSBzLCB1aW50IGxpdmUsIHVpbnQgcmF0aW8pCnsKCXVsbG9uZyBu
ZWVkZWQ7CgoJYXNzZXJ0KG5vdCBzLT51c2VGaXhlZEhlYXApOwoJbmVlZGVkID0gKCh1bGxv
bmcpbGl2ZSkgKiByYXRpbzsKCXJldHVybiAoKG5lZWRlZCA+IHMtPm1heEhlYXBTaXplKQoJ
CT8gcy0+bWF4SGVhcFNpemUKCQk6IHJvdW5kUGFnZShuZWVkZWQpKTsKfQoKLyogLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAg
ICAgICAgICAgIGV4dHJhY3RBcnJheU51bUJ5dGVzICAgICAgICAgICAgICAgICovCi8qIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8q
IFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYW4gYXJyYXksIG5vdCBpbmNsdWRpbmcgdGhlIGhl
YWRlci4gKi8Kc3RhdGljIGlubGluZSB1aW50CmV4dHJhY3RBcnJheU51bUJ5dGVzKHBvaW50
ZXIgcCwgCgkJICAgICB1aW50IG51bVBvaW50ZXJzLAoJCSAgICAgdWludCBudW1Ob25Qb2lu
dGVycykKewoJdWludCBudW1FbGVtZW50cywgYnl0ZXNQZXJFbGVtZW50LCByZXN1bHQ7CgkK
CW51bUVsZW1lbnRzID0gR0NfYXJyYXlOdW1FbGVtZW50cyhwKTsKCWJ5dGVzUGVyRWxlbWVu
dCA9IG51bU5vblBvaW50ZXJzICsgdG9CeXRlcyhudW1Qb2ludGVycyk7CglyZXN1bHQgPSB3
b3JkQWxpZ24obnVtRWxlbWVudHMgKiBieXRlc1BlckVsZW1lbnQpOwoJCglyZXR1cm4gcmVz
dWx0Owp9CgpzdGF0aWMgaW5saW5lIHZvaWQKbWF5YmVDYWxsKEdDX3BvaW50ZXJGdW4gZiwg
R0Nfc3RhdGUgcywgcG9pbnRlciAqcHApCnsKCWlmIChHQ19pc1BvaW50ZXIoKnBwKSkKCQlm
KHMsIHBwKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICAgR0NfZm9yZWFjaEdsb2JhbCAgICAg
ICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gKi8KCi8qIEFwcGx5IGYgdG8gZWFjaCBnbG9iYWwgcG9pbnRlciBp
bnRvIHRoZSBoZWFwLiAqLwppbmxpbmUgdm9pZApHQ19mb3JlYWNoR2xvYmFsKEdDX3N0YXRl
IHMsIEdDX3BvaW50ZXJGdW4gZikKewoJaW50IGk7CgogCWZvciAoaSA9IDA7IGkgPCBzLT5u
dW1HbG9iYWxzOyArK2kpCgkJbWF5YmVDYWxsKGYsIHMsICZzLT5nbG9iYWxzW2ldKTsKCW1h
eWJlQ2FsbChmLCBzLCAocG9pbnRlciopJnMtPmN1cnJlbnRUaHJlYWQpOwoJbWF5YmVDYWxs
KGYsIHMsIChwb2ludGVyKikmcy0+c2F2ZWRUaHJlYWQpOwoJbWF5YmVDYWxsKGYsIHMsIChw
b2ludGVyKikmcy0+c2lnbmFsSGFuZGxlcik7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgR0NfZm9y
ZWFjaFBvaW50ZXJJbk9iamVjdCAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qCiAqIEFwcGx5IGYgdG8g
ZWFjaCBwb2ludGVyIGluIHRoZSBvYmplY3QgcCwgd2hlcmUgcCBwb2ludHMgYXQgdGhlIGZp
cnN0CiAqIGRhdGEgd29yZCBpbiB0aGUgb2JqZWN0LgogKiBSZXR1cm5zIHBvaW50ZXIgdG8g
dGhlIGVuZCBvZiBvYmplY3QsIGkuZS4ganVzdCBwYXN0IG9iamVjdC4KICovCmlubGluZSBw
b2ludGVyCkdDX2ZvcmVhY2hQb2ludGVySW5PYmplY3QoR0Nfc3RhdGUgcywgR0NfcG9pbnRl
ckZ1biBmLCBwb2ludGVyIHApCnsKCXdvcmQgaGVhZGVyOwoJdWludCBudW1Qb2ludGVyczsK
CXVpbnQgbnVtTm9uUG9pbnRlcnM7CgoJaGVhZGVyID0gR0NfZ2V0SGVhZGVyKHApOwoJaWYg
KGlzTm9ybWFsKGhlYWRlcikpIHsgLyogSXQncyBhIG5vcm1hbCBvYmplY3QuICovCgkJcG9p
bnRlciBtYXg7CgoJCXNwbGl0SGVhZGVyKGhlYWRlciwgJm51bVBvaW50ZXJzLCAmbnVtTm9u
UG9pbnRlcnMpOwoJCXAgKz0gdG9CeXRlcyhudW1Ob25Qb2ludGVycyk7CgkJbWF4ID0gcCAr
IHRvQnl0ZXMobnVtUG9pbnRlcnMpOwoJCS8qIEFwcGx5IGYgdG8gYWxsIGludGVybmFsIHBv
aW50ZXJzLiAqLwoJCWZvciAoIDsgcCA8IG1heDsgcCArPSBQT0lOVEVSX1NJWkUpIAoJCQlt
YXliZUNhbGwoZiwgcywgKHBvaW50ZXIqKXApOwoJfSBlbHNlIGlmIChpc1N0YWNrSGVhZGVy
KGhlYWRlcikpIHsKCQlHQ19zdGFjayBzdGFjazsKCQlwb2ludGVyIHRvcCwgYm90dG9tOwoJ
CWludCBpOwoJCXdvcmQgcmV0dXJuQWRkcmVzczsKCQlHQ19mcmFtZUxheW91dCAqbGF5b3V0
OwoJCUdDX29mZnNldHMgZnJhbWVPZmZzZXRzOwoKCQlzdGFjayA9IChHQ19zdGFjaylwOwoJ
CWJvdHRvbSA9IHN0YWNrQm90dG9tKHN0YWNrKTsKCQl0b3AgPSBzdGFja1RvcChzdGFjayk7
CgkJYXNzZXJ0KHN0YWNrLT51c2VkIDw9IHN0YWNrLT5yZXNlcnZlZCk7CgkJd2hpbGUgKHRv
cCA+PSBib3R0b20pIHsKCQkJLyogSW52YXJpYW50OiB0b3AgcG9pbnRzIGF0IGEgInJldHVy
biBhZGRyZXNzIi4gKi8KCQkJcmV0dXJuQWRkcmVzcyA9ICood29yZCopIHRvcDsKCQkJaWYg
KERFQlVHKQoJCQkJZnByaW50ZihzdGRlcnIsIAoJCQkJCSIgIHRvcCA9ICVkICByZXR1cm4g
YWRkcmVzcyA9ICVkLlxuIiwgCgkJCQkJdG9wIC0gYm90dG9tLCAKCQkJCQlyZXR1cm5BZGRy
ZXNzKTsKCQkJbGF5b3V0ID0gZ2V0RnJhbWVMYXlvdXQocywgcmV0dXJuQWRkcmVzcyk7IAoJ
CQlmcmFtZU9mZnNldHMgPSBsYXlvdXQtPm9mZnNldHM7CgkJCXRvcCAtPSBsYXlvdXQtPm51
bUJ5dGVzOwoJCQlmb3IgKGkgPSAwIDsgaSA8IGZyYW1lT2Zmc2V0c1swXSA7ICsraSkgewoJ
CQkJaWYgKERFQlVHKQoJCQkJCWZwcmludGYoc3RkZXJyLCAKCQkJCQkJIiAgICBvZmZzZXQg
JWQgIGFkZHJlc3MgJXhcbiIsIAoJCQkJCQlmcmFtZU9mZnNldHNbaSArIDFdLAoJCQkJCQko
dWludCkoKihwb2ludGVyKikodG9wICsgZnJhbWVPZmZzZXRzW2kgKyAxXSkpKTsKCQkJCW1h
eWJlQ2FsbChmLCBzLCAKCQkJCQkgIChwb2ludGVyKikKCQkJCQkgICh0b3AgKyBmcmFtZU9m
ZnNldHNbaSArIDFdKSk7CgkJCX0KCQl9CgkJYXNzZXJ0KHRvcCA9PSBib3R0b20gLSBXT1JE
X1NJWkUpOwoJCXAgKz0gc2l6ZW9mKHN0cnVjdCBHQ19zdGFjaykgKyBzdGFjay0+cmVzZXJ2
ZWQ7Cgl9IGVsc2UgeyAvKiBJdCdzIGFuIGFycmF5LiAqLwoJCXVpbnQgbnVtQnl0ZXM7CgoJ
CXNwbGl0SGVhZGVyKGhlYWRlciwgJm51bVBvaW50ZXJzLCAmbnVtTm9uUG9pbnRlcnMpOwoJ
CW51bUJ5dGVzID0gZXh0cmFjdEFycmF5TnVtQnl0ZXMocCwgbnVtUG9pbnRlcnMsIG51bU5v
blBvaW50ZXJzKTsKCQlpZiAobnVtQnl0ZXMgPT0gMCkKCQkJLyogQW4gZW1wdHkgYXJyYXkg
LS0gc2tpcCB0aGUgUE9JTlRFUl9TSVpFIGJ5dGVzCgkJCSAqIGZvciB0aGUgZm9yd2FyZGlu
ZyBwb2ludGVyLgoJCQkgKi8KCQkJcCArPSBQT0lOVEVSX1NJWkU7CgkJZWxzZSB7CgkJCXBv
aW50ZXIgbWF4OwoKCQkJbWF4ID0gcCArIG51bUJ5dGVzOwoJCQlpZiAobnVtUG9pbnRlcnMg
PT0gMCkgewoJCQkJLyogVGhlcmUgYXJlIG5vIHBvaW50ZXJzLCBqdXN0IHVwZGF0ZSBwLiAq
LwoJCQkJcCA9IG1heDsKCQkJfSBlbHNlIGlmIChudW1Ob25Qb2ludGVycyA9PSAwKSB7CgkJ
CSAgCS8qIEl0J3MgYW4gYXJyYXkgd2l0aCBvbmx5IHBvaW50ZXJzLiAqLwoJCQkJZm9yICg7
IHAgPCBtYXg7IHAgKz0gUE9JTlRFUl9TSVpFKQoJCQkJCW1heWJlQ2FsbChmLCBzLCAocG9p
bnRlciopcCk7CgkJCX0gZWxzZSB7CgkJCQl1aW50IG51bUJ5dGVzUG9pbnRlcnM7CgkJCQkK
CQkJCW51bUJ5dGVzUG9pbnRlcnMgPSB0b0J5dGVzKG51bVBvaW50ZXJzKTsKCQkJCS8qIEZv
ciBlYWNoIGFycmF5IGVsZW1lbnQuICovCgkJCQl3aGlsZSAocCA8IG1heCkgewoJCQkJCXBv
aW50ZXIgbWF4MjsKCgkJCQkJcCArPSBudW1Ob25Qb2ludGVyczsKCQkJCQltYXgyID0gcCAr
IG51bUJ5dGVzUG9pbnRlcnM7CgkJCQkJLyogRm9yIGVhY2ggaW50ZXJuYWwgcG9pbnRlci4g
Ki8KCQkJCQlmb3IgKCA7IHAgPCBtYXgyOyBwICs9IFBPSU5URVJfU0laRSkgCgkJCQkJCW1h
eWJlQ2FsbChmLCBzLCAocG9pbnRlciopcCk7CgkJCQl9CgkJCX0KCQkJYXNzZXJ0KHAgPT0g
bWF4KTsKCQl9Cgl9CglyZXR1cm4gcDsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICAgICAgICB0
b0RhdGEgICAgICAgICAgICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIHAgc2hvdWxkIHBvaW50IGF0
IHRoZSBiZWdpbm5pbmcgb2YgYW4gb2JqZWN0IChpLmUuIHRoZSBoZWFkZXIpLgogKiBSZXR1
cm5zIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIG9iamVjdCBkYXRhLgogKi8Kc3Rh
dGljIGlubGluZSBwb2ludGVyCnRvRGF0YShwb2ludGVyIHApCnsKCXdvcmQgaGVhZGVyOwkK
CgloZWFkZXIgPSAqKHdvcmQqKXA7CgoJcmV0dXJuICgoaXNOb3JtYWwoaGVhZGVyKSBvciBp
c1N0YWNrSGVhZGVyKGhlYWRlcikpCgkJPyBwICsgV09SRF9TSVpFCgkJOiBwICsgMiAqIFdP
UkRfU0laRSk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgR0NfZm9yZWFjaFBvaW50ZXJJblJhbmdl
ICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tICovCgovKiBBcHBseSBmIHRvIGVhY2ggcG9pbnRlciBiZXR3ZWVu
IGZyb250IGFuZCAqYmFjaywgd2hpY2ggc2hvdWxkIGJlIGEgCiAqIGNvbnRpZ3VvdXMgc2Vx
dWVuY2Ugb2Ygb2JqZWN0cywgd2hlcmUgZnJvbnQgcG9pbnRzIGF0IHRoZSBiZWdpbm5pbmcg
b2YKICogdGhlIGZpcnN0IG9iamVjdCBhbmQgKmJhY2sgcG9pbnRzIGp1c3QgcGFzdCB0aGUg
ZW5kIG9mIHRoZSBsYXN0IG9iamVjdC4KICogZiBtYXkgaW5jcmVhc2UgKmJhY2sgKGZvciBl
eGFtcGxlLCB0aGlzIGlzIGRvbmUgYnkgZm9yd2FyZCkuCiAqLwoKaW5saW5lIHZvaWQKR0Nf
Zm9yZWFjaFBvaW50ZXJJblJhbmdlKEdDX3N0YXRlIHMsIHBvaW50ZXIgZnJvbnQsIHBvaW50
ZXIgKmJhY2ssCgkJCSBHQ19wb2ludGVyRnVuIGYpCnsKCWFzc2VydChmcm9udCA8PSAqYmFj
ayk7CiAJd2hpbGUgKGZyb250IDwgKmJhY2spIHsKCQlhc3NlcnQoaXNXb3JkQWxpZ25lZCgo
dWludClmcm9udCkpOwoJCWZyb250ID0gR0NfZm9yZWFjaFBvaW50ZXJJbk9iamVjdChzLCBm
LCB0b0RhdGEoZnJvbnQpKTsKCX0KCWFzc2VydChmcm9udCA9PSAqYmFjayk7Cn0KCi8qIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyog
ICAgICAgICAgICAgICAgICAgICBpbnZhcmlhbnQgICAgICAgICAgICAgICAgICAgICAqLwov
KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICov
CgojaWZuZGVmIE5PREVCVUcKCnN0YXRpYyBpbmxpbmUgYm9vbAppc0luRnJvbVNwYWNlKEdD
X3N0YXRlIHMsIHBvaW50ZXIgcCkKewogCXJldHVybiAocy0+YmFzZSA8PSBwIGFuZCBwIDwg
cy0+ZnJvbnRpZXIpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQKYXNzZXJ0SXNJbkZyb21TcGFj
ZShHQ19zdGF0ZSBzLCBwb2ludGVyICpwKQp7Cglhc3NlcnQoaXNJbkZyb21TcGFjZShzLCAq
cCkpOwp9CgpzdGF0aWMgaW5saW5lIGJvb2wKaXNJblRvU3BhY2UoR0Nfc3RhdGUgcywgcG9p
bnRlciBwKQp7CglyZXR1cm4gKG5vdChHQ19pc1BvaW50ZXIocCkpCgkJb3IgKHMtPnRvQmFz
ZSA8PSBwIGFuZCBwIDwgcy0+dG9CYXNlICsgcy0+dG9TaXplKSk7Cn0KCnN0YXRpYyBib29s
CmludmFyaWFudChHQ19zdGF0ZSBzKQp7CgkvKiB3b3VsZCBiZSBuaWNlIHRvIGFkZCBkaXZp
c2libGl0eSBieSBwYWdlc2l6ZSBvZiB2YXJpb3VzIHRoaW5ncyAqLwoKCS8qIEZyYW1lIGxh
eW91dHMgKi8KCXsJCgkJaW50IGk7CgoJCWZvciAoaSA9IDA7IGkgPCBzLT5tYXhGcmFtZUlu
ZGV4OyArK2kpIHsKCQkJR0NfZnJhbWVMYXlvdXQgKmxheW91dDsKCiAJCQlsYXlvdXQgPSAm
KHMtPmZyYW1lTGF5b3V0c1tpXSk7CgkJCWlmIChsYXlvdXQtPm51bUJ5dGVzID4gMCkgewoJ
CQkJR0Nfb2Zmc2V0cyBvZmZzZXRzOwoJCQkJaW50IGo7CgoJCQkJYXNzZXJ0KGxheW91dC0+
bnVtQnl0ZXMgPD0gcy0+bWF4RnJhbWVTaXplKTsKCQkJCW9mZnNldHMgPSBsYXlvdXQtPm9m
ZnNldHM7CgkJCQlmb3IgKGogPSAwOyBqIDwgb2Zmc2V0c1swXTsgKytqKQoJCQkJCWFzc2Vy
dChvZmZzZXRzW2ogKyAxXSA8IGxheW91dC0+bnVtQnl0ZXMpOwoJCQl9CgkJfQoJfQoJLyog
SGVhcCAqLwoJYXNzZXJ0KGlzV29yZEFsaWduZWQoKHVpbnQpcy0+ZnJvbnRpZXIpKTsKCWFz
c2VydChzLT5iYXNlIDw9IHMtPmZyb250aWVyKTsKCWFzc2VydCgwID09IHMtPmZyb21TaXpl
IAoJCW9yIChzLT5mcm9udGllciA8PSBzLT5saW1pdCArIExJTUlUX1NMT1AKCQkJYW5kIHMt
PmxpbWl0ID09IHMtPmJhc2UgKyBzLT5mcm9tU2l6ZSAtIExJTUlUX1NMT1ApKTsKCWFzc2Vy
dChzLT51c2VGaXhlZEhlYXAgb3IgKHMtPmZyb21TaXplIDw9IHMtPm1heEhlYXBTaXplCgkg
ICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcy0+dG9TaXplIDw9IHMtPm1heEhlYXBT
aXplKSk7Cglhc3NlcnQocy0+dG9CYXNlID09IE5VTEwgb3Igcy0+dG9TaXplID09IHMtPmZy
b21TaXplKTsKCS8qIENoZWNrIHRoYXQgYWxsIHBvaW50ZXJzIGFyZSBpbnRvIGZyb20gc3Bh
Y2UuICovCglHQ19mb3JlYWNoR2xvYmFsKHMsIGFzc2VydElzSW5Gcm9tU3BhY2UpOwoJR0Nf
Zm9yZWFjaFBvaW50ZXJJblJhbmdlKHMsIHMtPmJhc2UsICZzLT5mcm9udGllciwgYXNzZXJ0
SXNJbkZyb21TcGFjZSk7CgkvKiBDdXJyZW50IHRocmVhZC4gKi8KCXsKCQl1aW50IG9mZnNl
dDsKCQlHQ19zdGFjayBzdGFjazsKCgkJc3RhY2sgPSBzLT5jdXJyZW50VGhyZWFkLT5zdGFj
azsKCQlhc3NlcnQoaXNXb3JkQWxpZ25lZChzdGFjay0+cmVzZXJ2ZWQpKTsKCQlhc3NlcnQo
cy0+c3RhY2tCb3R0b20gPT0gc3RhY2tCb3R0b20oc3RhY2spKTsKCQlhc3NlcnQocy0+c3Rh
Y2tUb3AgPT0gc3RhY2tUb3Aoc3RhY2spKTsKCSAJYXNzZXJ0KHMtPnN0YWNrTGltaXQgPT0g
c3RhY2tMaW1pdChzLCBzdGFjaykpOwoJCWFzc2VydChzdGFjay0+dXNlZCA9PSBjdXJyZW50
U3RhY2tVc2VkKHMpKTsKCQlhc3NlcnQoc3RhY2stPnVzZWQgPCBzdGFjay0+cmVzZXJ2ZWQp
OwoJIAlhc3NlcnQocy0+c3RhY2tCb3R0b20gPD0gcy0+c3RhY2tUb3AgKyBXT1JEX1NJWkUp
OwoJCWZvciAob2Zmc2V0ID0gcy0+Y3VycmVudFRocmVhZC0+ZXhuU3RhY2s7IAoJCQlvZmZz
ZXQgIT0gQk9HVVNfRVhOX1NUQUNLOyApIHsKCQkJdW5sZXNzIChzLT5zdGFja0JvdHRvbSAr
IG9mZnNldCAKCQkJCQk8PSBzLT5zdGFja1RvcCArIFdPUkRfU0laRSkKCQkJCWZwcmludGYo
c3RkZXJyLCAicy0+c3RhY2tCb3R0b20gPSAlZCAgb2Zmc2V0ID0gJWQgcy0+c3RhY2tUb3Ag
PSAlZFxuIiwgKHVpbnQpKHMtPnN0YWNrQm90dG9tKSwgb2Zmc2V0LCAodWludCkocy0+c3Rh
Y2tUb3ApKTsKCQkJYXNzZXJ0KHMtPnN0YWNrQm90dG9tICsgb2Zmc2V0IAoJCQkJCTw9IHMt
PnN0YWNrVG9wICsgV09SRF9TSVpFKTsKCQkJb2Zmc2V0ID0gKih1aW50Kikocy0+c3RhY2tC
b3R0b20gKyBvZmZzZXQgKyBXT1JEX1NJWkUpOwoJCX0KCX0KCglyZXR1cm4gVFJVRTsKfQoK
Ym9vbApHQ19tdXRhdG9ySW52YXJpYW50KEdDX3N0YXRlIHMpCnsKCWFzc2VydChzdGFja1Rv
cElzT2socywgcy0+Y3VycmVudFRocmVhZC0+c3RhY2spKTsKCWFzc2VydChpbnZhcmlhbnQo
cykpOwoJcmV0dXJuIFRSVUU7Cn0KI2VuZGlmIC8qICNpZm5kZWYgTk9ERUJVRyAqLwoKLyog
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwov
KiAgICAgICAgICAgICAgICAgICAgICBUaHJlYWRzICAgICAgICAgICAgICAgICAgICAgICov
Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g
Ki8KCnN0YXRpYyBpbmxpbmUgdWludAp0aHJlYWRCeXRlcygpCnsKCXJldHVybiB3b3JkQWxp
Z24oSEVBREVSX1NJWkUgKyBzaXplb2Yoc3RydWN0IEdDX3RocmVhZCkpOwp9CgpzdGF0aWMg
aW5saW5lIHVpbnQKaW5pdGlhbFRocmVhZEJ5dGVzKEdDX3N0YXRlIHMpCnsKCXJldHVybiB0
aHJlYWRCeXRlcygpICsgc3RhY2tCeXRlcyhpbml0aWFsU3RhY2tTaXplKHMpKTsKfQoKc3Rh
dGljIGlubGluZSBHQ190aHJlYWQKbmV3VGhyZWFkT2ZTaXplKEdDX3N0YXRlIHMsIHdvcmQg
aGVhZGVyLCB1aW50IHN0YWNrU2l6ZSkKewoJR0Nfc3RhY2sgc3RhY2s7CglHQ190aHJlYWQg
dDsKCgllbnN1cmVGcmVlKHMsIHN0YWNrQnl0ZXMoc3RhY2tTaXplKSArIHRocmVhZEJ5dGVz
KCkpOwoJc3RhY2sgPSBuZXdTdGFjayhzLCBoZWFkZXIsIHN0YWNrU2l6ZSk7Cgl0ID0gKEdD
X3RocmVhZClvYmplY3QocywgVEhSRUFEX0hFQURFUiwgdGhyZWFkQnl0ZXMoKSk7Cgl0LT5l
eG5TdGFjayA9IEJPR1VTX0VYTl9TVEFDSzsKCXQtPnN0YWNrID0gc3RhY2s7CglyZXR1cm4g
dDsKfQoKc3RhdGljIGlubGluZSB2b2lkCnN3aXRjaFRvVGhyZWFkKEdDX3N0YXRlIHMsIEdD
X3RocmVhZCB0KQp7CglzLT5jdXJyZW50VGhyZWFkID0gdDsKCUdDX3NldFN0YWNrKHMpOwp9
CgpzdGF0aWMgaW5saW5lIHZvaWQKY29weVRocmVhZChHQ19zdGF0ZSBzLCBHQ190aHJlYWQg
ZnJvbSwgd29yZCBoZWFkZXIsIHVpbnQgc2l6ZSkKewoJR0NfdGhyZWFkIHRvOwoKCS8qIG5l
d1RocmVhZE9mU2l6ZSBtYXkgZG8gYSBHQywgd2hpY2ggaW52YWxpZGF0ZXMgZnJvbS4gIAoJ
ICogSGVuY2Ugd2UgbmVlZCB0byBzdGFzaCBmcm9tIHdoZXJlIHRoZSBHQyBjYW4gZmluZCBp
dC4KCSAqLwoJcy0+c2F2ZWRUaHJlYWQgPSBmcm9tOwoJdG8gPSBuZXdUaHJlYWRPZlNpemUo
cywgaGVhZGVyLCBzaXplKTsKCWZyb20gPSBzLT5zYXZlZFRocmVhZDsKCXN0YWNrQ29weShm
cm9tLT5zdGFjaywgdG8tPnN0YWNrKTsKCXRvLT5leG5TdGFjayA9IGZyb20tPmV4blN0YWNr
OwoJcy0+c2F2ZWRUaHJlYWQgPSB0bzsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICBmcm9tU3Bh
Y2UsIHRvU3BhY2UgICAgICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyBpbmxpbmUgdm9pZCBz
ZXRMaW1pdChHQ19zdGF0ZSBzKSB7CglzLT5saW1pdCA9IHMtPmJhc2UgKyBzLT5mcm9tU2l6
ZSAtIExJTUlUX1NMT1A7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICAgICAgU2lnbmFscyAg
ICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgaW5saW5lIHZvaWQKYmxvY2tTaWdu
YWxzKEdDX3N0YXRlIHMpCnsKI2lmIGRlZmluZWQoRE9OVF9VU0VfU0lHTkFMUykKI2Vsc2UK
CXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnMtPnNpZ25hbHNIYW5kbGVkLCBOVUxMKTsKI2Vu
ZGlmCn0KCnN0YXRpYyBpbmxpbmUgdm9pZAp1bmJsb2NrU2lnbmFscyhHQ19zdGF0ZSBzKQp7
CiNpZiBkZWZpbmVkKERPTlRfVVNFX1NJR05BTFMpCiNlbHNlCglzaWdwcm9jbWFzayhTSUdf
VU5CTE9DSywgJnMtPnNpZ25hbHNIYW5kbGVkLCBOVUxMKTsKI2VuZGlmCn0KCi8qIGVudGVy
IGFuZCBsZWF2ZSBzaG91bGQgYmUgY2FsbGVkIGF0IHRoZSBzdGFydCBhbmQgZW5kIG9mIGV2
ZXJ5IEdDIGZ1bmN0aW9uCiAqIHRoYXQgaXMgZXhwb3J0ZWQgdG8gdGhlIG91dHNpZGUgd29y
bGQuICBUaGV5IG1ha2Ugc3VyZSB0aGF0IHNpZ25hbHMgYXJlCiAqIGJsb2NrZWQgZm9yIHRo
ZSBkdXJhdGlvbiBvZiB0aGUgZnVuY3Rpb24gYW5kIGNoZWNrIHRoZSBHQyBpbnZhcmlhbnQK
ICogVGhleSBhcmUgYSBiaXQgdHJpY2t5IGJlY2F1c2Ugb2YgdGhlIGNhc2Ugd2hlbiB0aGUg
cnVudGltZSBzeXN0ZW0gaXMgaW52b2tlZAogKiBmcm9tIHdpdGhpbiBhbiBNTCBzaWduYWwg
aGFuZGxlci4KICovCmlubGluZSB2b2lkCkdDX2VudGVyKEdDX3N0YXRlIHMpCnsKCS8qIHVz
ZWQgbmVlZHMgdG8gYmUgc2V0IGJlY2F1c2UgdGhlIG11dGF0b3IgaGFzIGNoYW5nZWQgcy0+
c3RhY2tUb3AuICovCglzLT5jdXJyZW50VGhyZWFkLT5zdGFjay0+dXNlZCA9IGN1cnJlbnRT
dGFja1VzZWQocyk7CglpZiAoREVCVUcpIAoJCWRpc3BsYXkocywgc3RkZXJyKTsKCXVubGVz
cyAocy0+aW5TaWduYWxIYW5kbGVyKSB7CiAgICAgICAgICAgICAgICBibG9ja1NpZ25hbHMo
cyk7CgkJaWYgKHMtPmxpbWl0ID09IHMtPmJhc2UpCgkJCXNldExpbWl0KHMpOwoJfQoJYXNz
ZXJ0KGludmFyaWFudChzKSk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZApsZWF2ZShHQ19zdGF0
ZSBzKQp7Cglhc3NlcnQoR0NfbXV0YXRvckludmFyaWFudChzKSk7CglpZiAocy0+c2lnbmFs
SXNQZW5kaW5nIGFuZCAwID09IHMtPmNhbkhhbmRsZSkKCQlzLT5saW1pdCA9IHMtPmJhc2U7
Cgl1bmxlc3MgKHMtPmluU2lnbmFsSGFuZGxlcikKCQl1bmJsb2NrU2lnbmFscyhzKTsKfQoK
aW5saW5lIHZvaWQKR0NfY29weVRocmVhZFNocmluayhHQ19zdGF0ZSBzLCBHQ190aHJlYWQg
dCkKewoJR0NfZW50ZXIocyk7Cgljb3B5VGhyZWFkKHMsIHQsIENPTlRfSEVBREVSLCB0LT5z
dGFjay0+dXNlZCk7Cglhc3NlcnQocy0+ZnJvbnRpZXIgPD0gcy0+bGltaXQpOwoJbGVhdmUo
cyk7Cn0KCnN0YXRpYyBpbmxpbmUgdWludApzdGFja05lZWRzUmVzZXJ2ZWQoR0Nfc3RhdGUg
cywgR0Nfc3RhY2sgc3RhY2spCnsKCXJldHVybiBzdGFjay0+dXNlZCArIHN0YWNrU2xvcChz
KSAtIHRvcEZyYW1lU2l6ZShzLCBzdGFjayk7Cn0KCmlubGluZSB2b2lkCkdDX2NvcHlUaHJl
YWQoR0Nfc3RhdGUgcywgR0NfdGhyZWFkIHQpCnsKCUdDX2VudGVyIChzKTsKCWFzc2VydCAo
dC0+c3RhY2stPnJlc2VydmVkID09IHQtPnN0YWNrLT51c2VkKTsKCWNvcHlUaHJlYWQgKHMs
IHQsIFNUQUNLX0hFQURFUiwgc3RhY2tOZWVkc1Jlc2VydmVkKHMsIHQtPnN0YWNrKSk7Cglh
c3NlcnQocy0+ZnJvbnRpZXIgPD0gcy0+bGltaXQpOwoJbGVhdmUocyk7Cn0KCmlubGluZSB2
b2lkIApHQ19zd2l0Y2hUb1RocmVhZChHQ19zdGF0ZSBzLCBHQ190aHJlYWQgdCkgewoJcy0+
Y3VycmVudFRocmVhZC0+c3RhY2stPnVzZWQgPSBzLT5zdGFja1RvcCArIFdPUkRfU0laRSAt
IHMtPnN0YWNrQm90dG9tOwoJc3dpdGNoVG9UaHJlYWQocywgdCk7CglzLT5jYW5IYW5kbGUt
LTsKCWlmIChzLT5zaWduYWxJc1BlbmRpbmcgJiYgMCA9PSBzLT5jYW5IYW5kbGUpCglzLT5s
aW1pdCA9IHMtPmJhc2U7ICAKfQoKCmV4dGVybiBzdHJ1Y3QgR0Nfc3RhdGUgZ2NTdGF0ZTsK
CmlubGluZSB2b2lkClRocmVhZF9hdG9taWNCZWdpbigpCnsKCWlmIChERUJVRykKCQlmcHJp
bnRmKHN0ZGVyciwgImF0b21pY0JlZ2luICVkIC0+ICVkXG4iLCAKCQkJCWdjU3RhdGUuY2Fu
SGFuZGxlLCBnY1N0YXRlLmNhbkhhbmRsZSArIDEpOwoJYXNzZXJ0KGdjU3RhdGUuY2FuSGFu
ZGxlID49IDApOwogCWdjU3RhdGUuY2FuSGFuZGxlKys7CglpZiAoZ2NTdGF0ZS5zaWduYWxJ
c1BlbmRpbmcpCgkJc2V0TGltaXQoJmdjU3RhdGUpOwp9CgppbmxpbmUgdm9pZApUaHJlYWRf
YXRvbWljRW5kKCkKewoJaWYgKERFQlVHKQoJCWZwcmludGYoc3RkZXJyLCAiYXRvbWljRW5k
ICVkIC0+ICVkXG4iLCAKCQkJCWdjU3RhdGUuY2FuSGFuZGxlLCBnY1N0YXRlLmNhbkhhbmRs
ZSAtIDEpOwoJZ2NTdGF0ZS5jYW5IYW5kbGUtLTsKCWFzc2VydChnY1N0YXRlLmNhbkhhbmRs
ZSA+PSAwKTsKCWlmIChnY1N0YXRlLnNpZ25hbElzUGVuZGluZyAmJiAwID09IGdjU3RhdGUu
Y2FuSGFuZGxlKQoJCWdjU3RhdGUubGltaXQgPSBnY1N0YXRlLmJhc2U7Cn0KCmlubGluZSB2
b2lkCkdDX2Zyb21TcGFjZShHQ19zdGF0ZSBzKQp7CglzLT5iYXNlID0gc21tYXAocy0+ZnJv
bVNpemUpOwoJaWYgKHMtPmZyb21TaXplID4gcy0+bWF4SGVhcFNpemVTZWVuKQoJCXMtPm1h
eEhlYXBTaXplU2VlbiA9IHMtPmZyb21TaXplOwoJc2V0TGltaXQocyk7Cn0KCmlubGluZSB2
b2lkCkdDX3RvU3BhY2UoR0Nfc3RhdGUgcykKewoJcy0+dG9CYXNlID0gc21tYXAocy0+dG9T
aXplKTsKCWlmIChzLT50b1NpemUgPiBzLT5tYXhIZWFwU2l6ZVNlZW4pCgkJcy0+bWF4SGVh
cFNpemVTZWVuID0gcy0+dG9TaXplOwp9CgojaWYgZGVmaW5lZChfV0lOMzIpCi8vIFdlIGp1
c3QgdXNlIEdldFRpY2tDb3VudCBvbiBXaW5kb3dzIGluc3RlYWQgb2YgYWxsIHRoaXMgcnVz
YWdlIHN0dWZmCiNlbHNlCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICAgICAgICAgICBnZXRydXNhZ2UgICAg
ICAgICAgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKaW50CmZpeGVkR2V0cnVzYWdlKGludCB3aG8sIHN0
cnVjdCBydXNhZ2UgKnJ1cCkKewoJc3RydWN0IHRtcwl0YnVmZjsKCWludAkJcmVzOwoJY2xv
Y2tfdAkJdXNlciwKCQkJc3lzOwoJc3RhdGljIGJvb2wJZmlyc3QgPSBUUlVFOwoJc3RhdGlj
IGxvbmcJaHo7CgoJaWYgKGZpcnN0KSB7CgkJZmlyc3QgPSBGQUxTRTsKCQloeiA9IHN5c2Nv
bmYoX1NDX0NMS19UQ0spOwoJfQoJcmVzID0gZ2V0cnVzYWdlKHdobywgcnVwKTsKCXVubGVz
cyAocmVzID09IDApCgkJcmV0dXJuIChyZXMpOwoJaWYgKHRpbWVzKCZ0YnVmZikgPT0gLTEp
CgkJZGllZSgiSW1wb3NzaWJsZTogdGltZXMoKSBmYWlsZWQiKTsKCXN3aXRjaCAod2hvKSB7
CgljYXNlIFJVU0FHRV9TRUxGOgoJCXVzZXIgPSB0YnVmZi50bXNfdXRpbWU7CgkJc3lzID0g
dGJ1ZmYudG1zX3N0aW1lOwoJCWJyZWFrOwoJY2FzZSBSVVNBR0VfQ0hJTERSRU46CgkJdXNl
ciA9IHRidWZmLnRtc19jdXRpbWU7CgkJc3lzID0gdGJ1ZmYudG1zX2NzdGltZTsKCQlicmVh
azsKCWRlZmF1bHQ6CgkJZGllKCJnZXRydXNhZ2UoKSBhY2NlcHRlZCB1bmtub3duIHdobzog
JWQiLCB3aG8pOwoJCWV4aXQoMSk7ICAvKiBuZWVkZWQgdG8ga2VlcCBnY2MgZnJvbSB3aGlu
aW5nLiAqLwoJfQoJcnVwLT5ydV91dGltZS50dl9zZWMgPSB1c2VyIC8gaHo7CglydXAtPnJ1
X3V0aW1lLnR2X3VzZWMgPSAodXNlciAlIGh6KSAqICgxMDAwMDAwIC8gaHopOwoJcnVwLT5y
dV9zdGltZS50dl9zZWMgPSBzeXMgLyBoejsKCXJ1cC0+cnVfc3RpbWUudHZfdXNlYyA9IChz
eXMgJSBoeikgKiAoMTAwMDAwMCAvIGh6KTsKCXJldHVybiAoMCk7Cn0KCnN0YXRpYyBpbmxp
bmUgdm9pZApydXNhZ2VaZXJvKHN0cnVjdCBydXNhZ2UgKnJ1KQp7CgltZW1zZXQocnUsIDAs
IHNpemVvZigqcnUpKTsKfQoKc3RhdGljIHZvaWQKcnVzYWdlUGx1c01heChzdHJ1Y3QgcnVz
YWdlICpydTEsCgkgICAgICBzdHJ1Y3QgcnVzYWdlICpydTIsCgkgICAgICBzdHJ1Y3QgcnVz
YWdlICpydSkKewoJY29uc3QgaW50CW1pbGxpb24gPSAxMDAwMDAwOwoJdGltZV90CQlzZWMs
CgkJCXVzZWM7CgoJc2VjID0gcnUxLT5ydV91dGltZS50dl9zZWMgKyBydTItPnJ1X3V0aW1l
LnR2X3NlYzsKCXVzZWMgPSBydTEtPnJ1X3V0aW1lLnR2X3VzZWMgKyBydTItPnJ1X3V0aW1l
LnR2X3VzZWM7CglzZWMgKz0gKHVzZWMgLyBtaWxsaW9uKTsKCXVzZWMgJT0gbWlsbGlvbjsK
CXJ1LT5ydV91dGltZS50dl9zZWMgPSBzZWM7CglydS0+cnVfdXRpbWUudHZfdXNlYyA9IHVz
ZWM7CgoJc2VjID0gcnUxLT5ydV9zdGltZS50dl9zZWMgKyBydTItPnJ1X3N0aW1lLnR2X3Nl
YzsKCXVzZWMgPSBydTEtPnJ1X3N0aW1lLnR2X3VzZWMgKyBydTItPnJ1X3N0aW1lLnR2X3Vz
ZWM7CglzZWMgKz0gKHVzZWMgLyBtaWxsaW9uKTsKCXVzZWMgJT0gbWlsbGlvbjsKCXJ1LT5y
dV9zdGltZS50dl9zZWMgPSBzZWM7CglydS0+cnVfc3RpbWUudHZfdXNlYyA9IHVzZWM7CgoJ
cnUtPnJ1X21heHJzcyA9IG1heChydTEtPnJ1X21heHJzcywgcnUyLT5ydV9tYXhyc3MpOwoJ
cnUtPnJ1X2l4cnNzID0gbWF4KHJ1MS0+cnVfaXhyc3MsIHJ1Mi0+cnVfaXhyc3MpOwoJcnUt
PnJ1X2lkcnNzID0gbWF4KHJ1MS0+cnVfaWRyc3MsIHJ1Mi0+cnVfaWRyc3MpOwoJcnUtPnJ1
X2lzcnNzID0gbWF4KHJ1MS0+cnVfaXNyc3MsIHJ1Mi0+cnVfaXNyc3MpOwoJcnUtPnJ1X21p
bmZsdCA9IHJ1MS0+cnVfbWluZmx0ICsgcnUyLT5ydV9taW5mbHQ7CglydS0+cnVfbWFqZmx0
ID0gcnUxLT5ydV9tYWpmbHQgKyBydTItPnJ1X21hamZsdDsKCXJ1LT5ydV9uc3dhcCA9IHJ1
MS0+cnVfbnN3YXAgKyBydTItPnJ1X25zd2FwOwoJcnUtPnJ1X2luYmxvY2sgPSBydTEtPnJ1
X2luYmxvY2sgKyBydTItPnJ1X2luYmxvY2s7CglydS0+cnVfb3VibG9jayA9IHJ1MS0+cnVf
b3VibG9jayArIHJ1Mi0+cnVfb3VibG9jazsKCXJ1LT5ydV9tc2dzbmQgPSBydTEtPnJ1X21z
Z3NuZCArIHJ1Mi0+cnVfbXNnc25kOwoJcnUtPnJ1X21zZ3JjdiA9IHJ1MS0+cnVfbXNncmN2
ICsgcnUyLT5ydV9tc2dyY3Y7CglydS0+cnVfbnNpZ25hbHMgPSBydTEtPnJ1X25zaWduYWxz
ICsgcnUyLT5ydV9uc2lnbmFsczsKCXJ1LT5ydV9udmNzdyA9IHJ1MS0+cnVfbnZjc3cgKyBy
dTItPnJ1X252Y3N3OwoJcnUtPnJ1X25pdmNzdyA9IHJ1MS0+cnVfbml2Y3N3ICsgcnUyLT5y
dV9uaXZjc3c7Cn0KCnN0YXRpYyB2b2lkCnJ1c2FnZU1pbnVzTWF4IChzdHJ1Y3QgcnVzYWdl
ICpydTEsCgkJc3RydWN0IHJ1c2FnZSAqcnUyLAoJCXN0cnVjdCBydXNhZ2UgKnJ1KQp7Cglj
b25zdCBpbnQJbWlsbGlvbiA9IDEwMDAwMDA7Cgl0aW1lX3QJCXNlYywKCQkJdXNlYzsKCglz
ZWMgPSAocnUxLT5ydV91dGltZS50dl9zZWMgLSBydTItPnJ1X3V0aW1lLnR2X3NlYykgLSAx
OwoJdXNlYyA9IHJ1MS0+cnVfdXRpbWUudHZfdXNlYyArIG1pbGxpb24gLSBydTItPnJ1X3V0
aW1lLnR2X3VzZWM7CglzZWMgKz0gKHVzZWMgLyBtaWxsaW9uKTsKCXVzZWMgJT0gbWlsbGlv
bjsKCXJ1LT5ydV91dGltZS50dl9zZWMgPSBzZWM7CglydS0+cnVfdXRpbWUudHZfdXNlYyA9
IHVzZWM7CgoJc2VjID0gKHJ1MS0+cnVfc3RpbWUudHZfc2VjIC0gcnUyLT5ydV9zdGltZS50
dl9zZWMpIC0gMTsKCXVzZWMgPSBydTEtPnJ1X3N0aW1lLnR2X3VzZWMgKyBtaWxsaW9uIC0g
cnUyLT5ydV9zdGltZS50dl91c2VjOwoJc2VjICs9ICh1c2VjIC8gbWlsbGlvbik7Cgl1c2Vj
ICU9IG1pbGxpb247CglydS0+cnVfc3RpbWUudHZfc2VjID0gc2VjOwoJcnUtPnJ1X3N0aW1l
LnR2X3VzZWMgPSB1c2VjOwoKCXJ1LT5ydV9tYXhyc3MgPSBtYXgocnUxLT5ydV9tYXhyc3Ms
IHJ1Mi0+cnVfbWF4cnNzKTsKCXJ1LT5ydV9peHJzcyA9IG1heChydTEtPnJ1X2l4cnNzLCBy
dTItPnJ1X2l4cnNzKTsKCXJ1LT5ydV9pZHJzcyA9IG1heChydTEtPnJ1X2lkcnNzLCBydTIt
PnJ1X2lkcnNzKTsKCXJ1LT5ydV9pc3JzcyA9IG1heChydTEtPnJ1X2lzcnNzLCBydTItPnJ1
X2lzcnNzKTsKCXJ1LT5ydV9taW5mbHQgPSBydTEtPnJ1X21pbmZsdCAtIHJ1Mi0+cnVfbWlu
Zmx0OwoJcnUtPnJ1X21hamZsdCA9IHJ1MS0+cnVfbWFqZmx0IC0gcnUyLT5ydV9tYWpmbHQ7
CglydS0+cnVfbnN3YXAgPSBydTEtPnJ1X25zd2FwIC0gcnUyLT5ydV9uc3dhcDsKCXJ1LT5y
dV9pbmJsb2NrID0gcnUxLT5ydV9pbmJsb2NrIC0gcnUyLT5ydV9pbmJsb2NrOwoJcnUtPnJ1
X291YmxvY2sgPSBydTEtPnJ1X291YmxvY2sgLSBydTItPnJ1X291YmxvY2s7CglydS0+cnVf
bXNnc25kID0gcnUxLT5ydV9tc2dzbmQgLSBydTItPnJ1X21zZ3NuZDsKCXJ1LT5ydV9tc2dy
Y3YgPSBydTEtPnJ1X21zZ3JjdiAtIHJ1Mi0+cnVfbXNncmN2OwoJcnUtPnJ1X25zaWduYWxz
ID0gcnUxLT5ydV9uc2lnbmFscyAtIHJ1Mi0+cnVfbnNpZ25hbHM7CglydS0+cnVfbnZjc3cg
PSBydTEtPnJ1X252Y3N3IC0gcnUyLT5ydV9udmNzdzsKCXJ1LT5ydV9uaXZjc3cgPSBydTEt
PnJ1X25pdmNzdyAtIHJ1Mi0+cnVfbml2Y3N3Owp9CgpzdGF0aWMgdWludApydXNhZ2VUaW1l
KHN0cnVjdCBydXNhZ2UgKnJ1KQp7Cgl1aW50CXJlc3VsdDsKCglyZXN1bHQgPSAwOwoJcmVz
dWx0ICs9IDEwMDAgKiBydS0+cnVfdXRpbWUudHZfc2VjOwoJcmVzdWx0ICs9IDEwMDAgKiBy
dS0+cnVfc3RpbWUudHZfc2VjOwoJcmVzdWx0ICs9IHJ1LT5ydV91dGltZS50dl91c2VjIC8g
MTAwMDsKCXJlc3VsdCArPSBydS0+cnVfc3RpbWUudHZfdXNlYyAvIDEwMDA7CglyZXR1cm4g
cmVzdWx0Owp9CgojZW5kaWYKCi8qIFJldHVybiB0aW1lIGFzIG51bWJlciBvZiBtaWxsaXNl
Y29uZHMuICovCnN0YXRpYyBpbmxpbmUgdWludApjdXJyZW50VGltZSgpCnsKI2lmIGRlZmlu
ZWQoX1dJTjMyKQoJcmV0dXJuIEdldFRpY2tDb3VudCgpOwojZWxzZQoJc3RydWN0IHJ1c2Fn
ZQlydTsKCglmaXhlZEdldHJ1c2FnZShSVVNBR0VfU0VMRiwgJnJ1KTsKCXJldHVybiAocnVz
YWdlVGltZSgmcnUpKTsKI2VuZGlmCn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICAgaW5pdFNp
Z25hbFN0YWNrICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgaW5saW5lIHZvaWQKaW5p
dFNpZ25hbFN0YWNrKEdDX3N0YXRlIHMpCnsKLy8gRklYTUU6IFdpbGwgdGhpcyBiZSBvaz8K
I2lmIGRlZmluZWQoRE9OVF9VU0VfU0lHTkFMUykKI2Vsc2UKCWV4dGVybiB2b2lkCXN0YXJ0
UHJvZih2b2lkKQoJCQkJX19hdHRyaWJ1dGVfXygod2VhaykpOwoKICAgICAgICBzdGF0aWMg
c3RhY2tfdCBhbHRzdGFjazsgLy8gc3RhY2tfdCBub3QgcHJlc2VudCBvbiBXaW4zMgoJc2l6
ZV90IHNzX3NpemUgPSByb3VuZFBhZ2UoU0lHU1RLU1opOyAvLyBTSUdTVEtTWiBub3QgcHJl
c2VudCBvbiBXaW4zMgoJc2l6ZV90IHBzaXplID0gbWx0b25fZ2V0cGFnZXNpemUoKTsKCXZv
aWQgKnNzX3NwID0gc3NtbWFwKDIgKiBzc19zaXplLCBwc2l6ZSwgcHNpemUpOwoJYWx0c3Rh
Y2suc3Nfc3AgPSBzc19zcCArIHNzX3NpemU7CglhbHRzdGFjay5zc19zaXplID0gc3Nfc2l6
ZTsKCWFsdHN0YWNrLnNzX2ZsYWdzID0gMDsKICAgICAgICBzaWdhbHRzdGFjaygmYWx0c3Rh
Y2ssIE5VTEwpOyAvLyBzaWdhbHRzdGFjayBub3QgcHJlc2VudCBvbiBXaW4zMgoJLyogCgkg
KiBPbmUgdGhpbmcgSSBzaG91bGQgcG9pbnQgb3V0IHRoYXQgSSBkaXNjb3ZlcmVkIHRoZSBo
YXJkIHdheTogSWYKCSAqIHRoZSBjYWxsIHRvIHNpZ2FjdGlvbiBkb2VzIE5PVCBzcGVjaWZ5
IHRoZSBTQV9PTlNUQUNLIGZsYWcsIHRoZW4KCSAqIGV2ZW4gaWYgeW91IGhhdmUgY2FsbGVk
IHNpZ2FsdHN0YWNrKCksIGl0IHdpbGwgTk9UIHN3aXRjaCBzdGFja3MsCgkgKiBzbyB5b3Ug
d2lsbCBwcm9iYWJseSBkaWUuICBXb3JzZSwgaWYgdGhlIGNhbGwgdG8gc2lnYWN0aW9uIERP
RVMKCSAqIGhhdmUgU0FfT05TVEFDSyBhbmQgeW91IGhhdmUgTk9UIGNhbGxlZCBzaWdhbHRz
dGFjaygpLCBpdCBzdGlsbAoJICogc3dpdGNoZXMgc3RhY2tzICh0byBsb2NhdGlvbiAwKSBh
bmQgeW91IGRpZSBvZiBhIFNFR1YuICBUaHVzIHRoZQoJICogc2lnYWN0aW9uKCkgY2FsbCBN
VVNUIG9jY3VyIGFmdGVyIHRoZSBjYWxsIHRvIHNpZ2FsdHN0YWNrKCksIGFuZAoJICogaW4g
b3JkZXIgdG8gaGF2ZSBwcm9maWxpbmcgY292ZXIgYXMgbXVjaCBhcyBwb3NzaWJsZSwgeW91
IHdhbnQgaXQKCSAqIHRvIG9jY3VyIHJpZ2h0IGFmdGVyIHRoZSBzaWdhbHRzdGFjaygpIGNh
bGwuCgkgKi8KCXVubGVzcyAoc3RhcnRQcm9mID09IE5VTEwpCgkJc3RhcnRQcm9mKCk7CiNl
bmRpZgp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tICovCi8qICAgICAgICAgICAgICAgICAgR0NfaW5pdENvdW50ZXJzICAgICAgICAg
ICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSAqLwoKaW5saW5lIHZvaWQKR0NfaW5pdENvdW50ZXJzKEdDX3N0YXRlIHMp
CnsKCWluaXRTaWduYWxTdGFjayhzKTsKCXMtPmJ5dGVzQWxsb2NhdGVkID0gMDsKCXMtPmJ5
dGVzQ29waWVkID0gMDsKCXMtPmNhbkhhbmRsZSA9IDA7CglzLT5jdXJyZW50VGhyZWFkID0g
Qk9HVVNfVEhSRUFEOwojaWYgZGVmaW5lZChfV0lOMzIpCiNlbHNlCglydXNhZ2VaZXJvKCZz
LT5ydV9nYyk7CiNlbmRpZgoJcy0+aW5TaWduYWxIYW5kbGVyID0gRkFMU0U7CglzLT5tYXhQ
YXVzZSA9IDA7CglzLT5tYXhIZWFwU2l6ZVNlZW4gPSAwOwoJcy0+bWF4U3RhY2tTaXplU2Vl
biA9IDA7CglzLT5tYXhCeXRlc0xpdmUgPSAwOwoJcy0+bnVtR0NzID0gMDsKICAgICAgICBz
LT5zYXZlZFRocmVhZCA9IEJPR1VTX1RIUkVBRDsKLy8gRklYTUU6IFdpbGwgdGhpcyBiZSBv
az8KI2lmIGRlZmluZWQoRE9OVF9VU0VfU0lHTkFMUykKI2Vsc2UKICAgICAgICBzLT5zaWdu
YWxIYW5kbGVyID0gQk9HVVNfVEhSRUFEOwoJc2lnZW1wdHlzZXQoJnMtPnNpZ25hbHNIYW5k
bGVkKTsKCXMtPnNpZ25hbElzUGVuZGluZyA9IEZBTFNFOwogICAgICAgIHNpZ2VtcHR5c2V0
KCZzLT5zaWduYWxzUGVuZGluZyk7CiNlbmRpZgoJcy0+c3RhcnRUaW1lID0gY3VycmVudFRp
bWUoKTsKCS8qIFRoZSBuZXh0IGJpdCBpcyBmb3IgaGVhcCByZXNpemluZy4gKi8KCXMtPm1p
bkxpdmUgPSAyMDsKCXMtPm1heExpdmUgPSAzOwoJLyogU2V0IGxpdmVSYXRpbyAoY2xvc2Up
IHRvIHRoZSBnZW9tZXRyaWMgbWVhbiBvZiBtaW5MaXZlIGFuZCBtYXhMaXZlLiAqLwoJeyAK
CQl1aW50IGk7CgkJZm9yIChpID0gcy0+bWF4TGl2ZTsgaSAqIGkgPD0gcy0+bWluTGl2ZSAq
IHMtPm1heExpdmU7ICsraSkKCQkJLyogTm90aGluZyAqLyA7CgkJcy0+bGl2ZVJhdGlvID0g
aTsKCX0KfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICAgICAgZ2V0UkFNc2l6ZSAgICAgICAgICAg
ICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gKi8KCi8qCiAqIEdldCBSQU0gc2l6ZS4gIFZlcnkgTGludXggc3BlY2lm
aWMuCiAqIE5vdGUgdGhlIHRvdGFsIGFtb3VudCBvZiBSQU0gaXMgbXVsdGlwbGllZCBieSBS
QU1TTE9QIHNvIHRoYXQgd2UgZG9uJ3QKICogdXNlIGFsbCBvZiBtZW1vcnkgb3Igc3RhcnQg
c3dhcHBpbmcuICBJdCB1c2VkIHRvIGJlIC45NSwgYnV0IExpbnV4CiAqIDIuMiBpcyBtb3Jl
IGFnZ3Jlc3NpdmUgYWJvdXQgc3dhcHBpbmcuCiAqLwojZGVmaW5lCVJBTVNMT1AJLjg1Cgpz
dGF0aWMgaW5saW5lIHVpbnQKZ2V0UkFNc2l6ZSh2b2lkKQp7CiNpZiBkZWZpbmVkKF9XSU4z
MikKICAgICAgICBNRU1PUllTVEFUVVMgbVN0YXR1czsKICAgICAgICB1aW50IG47CiAgICAg
ICAgICAgICAgICAKICAgICAgICBHbG9iYWxNZW1vcnlTdGF0dXMoJm1TdGF0dXMpOwogICAg
ICAgICAgICAgICAgICAgICAgICAKICAgICAgICBuID0gbVN0YXR1cy5kd1RvdGFsVmlydHVh
bDsKICAgICAgICAvLyBXZSBjb3VsZCBhbHNvIHVzZSBtU3RhdHVzLmR3VG90YWxQaHlzOwog
ICAgICAgIAogICAgICAgIHJldHVybiByb3VuZFBhZ2UoKHVpbnQpKChkb3VibGUpbiAqIFJB
TVNMT1ApKTsKI2Vsc2UKCXN0cnVjdCBzeXNpbmZvCXNidWY7CgoJdW5sZXNzIChzeXNpbmZv
KCZzYnVmKSA9PSAwKQoJCWRpZWUoInN5c2luZm8gZmFpbGVkIik7CglyZXR1cm4gKHJvdW5k
UGFnZShzYnVmLnRvdGFscmFtICogUkFNU0xPUCkpOwojZW5kaWYKfQoKLyogLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAg
ICAgICAgICAgR0Nfc2V0SGVhcFBhcmFtcyAgICAgICAgICAgICAgICAgICovCi8qIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIHNl
dCBmcm9tU2l6ZSBhbmQgbWF5YmUgbWF4SGVhcFNpemUsIGRlcGVuZGluZyBvbiB3aGV0aGVy
IHVzZUZpeGVkSGVhcC4KICogc2l6ZSBtdXN0IG5vdCBiZSBhbiBhcHByb3hpbWF0aW9uLCBi
ZWNhdXNlIHNldEhlYXBQYXJhbXMgd2lsbCBkaWUgaWYgaXQKICogY2FuJ3Qgc2V0IGZyb21T
aXplIGJpZyBlbm91Z2guCiAqLwppbmxpbmUgdm9pZApHQ19zZXRIZWFwUGFyYW1zKEdDX3N0
YXRlIHMsIHVpbnQgc2l6ZSkKewoJaWYgKHMtPnVzZUZpeGVkSGVhcCkgewoJCWlmICgwID09
IHMtPmZyb21TaXplKQoJCQlzLT5mcm9tU2l6ZSA9IGdldFJBTXNpemUoKTsKCSAgICAgICAg
cy0+ZnJvbVNpemUgPSByb3VuZFBhZ2Uocy0+ZnJvbVNpemUgLyAyKTsKCX0gZWxzZSB7CgkJ
aWYgKDAgPT0gcy0+bWF4SGVhcFNpemUpIAoJCQlzLT5tYXhIZWFwU2l6ZSA9IGdldFJBTXNp
emUoKTsKCQlzLT5tYXhIZWFwU2l6ZSA9IHJvdW5kUGFnZShzLT5tYXhIZWFwU2l6ZSAvIDIp
OwoJCXMtPmZyb21TaXplID0gR0NfY29tcHV0ZUhlYXBTaXplKHMsIHNpemUsIHMtPmxpdmVS
YXRpbyk7Cgl9CglpZiAoc2l6ZSArIExJTUlUX1NMT1AgPiBzLT5mcm9tU2l6ZSkKCQlkaWUo
Ik91dCBvZiBtZW1vcnkuIik7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICAgICAgR0NfaW5p
dCAgICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgppbmxpbmUgdm9pZCBHQ19pbml0KEdDX3N0
YXRlIHMpCnsKCWludCBpOwoKCWFzc2VydChpc1dvcmRBbGlnbmVkKHNpemVvZihzdHJ1Y3Qg
R0NfdGhyZWFkKSkpOwoJR0NfaW5pdENvdW50ZXJzKHMpOwoJZm9yIChpID0gMDsgaSA8IHMt
Pm51bUdsb2JhbHM7ICsraSkKCQlzLT5nbG9iYWxzW2ldID0gKHBvaW50ZXIpQk9HVVNfUE9J
TlRFUjsKCUdDX3NldEhlYXBQYXJhbXMocywgcy0+Ynl0ZXNMaXZlICsgaW5pdGlhbFRocmVh
ZEJ5dGVzKHMpKTsKCWFzc2VydChzLT5ieXRlc0xpdmUgKyBpbml0aWFsVGhyZWFkQnl0ZXMo
cykgKyBMSU1JVF9TTE9QIDw9IHMtPmZyb21TaXplKTsKCUdDX2Zyb21TcGFjZShzKTsKCXMt
PmZyb250aWVyID0gcy0+YmFzZTsKCXMtPnRvU2l6ZSA9IHMtPmZyb21TaXplOwoJR0NfdG9T
cGFjZShzKTsgLyogRklYTUU6IFdoeSBkb2VzIHRvU3BhY2UgbmVlZCB0byBiZSBhbGxvY2F0
ZWQ/ICovCglzd2l0Y2hUb1RocmVhZChzLCBuZXdUaHJlYWRPZlNpemUocywgU1RBQ0tfSEVB
REVSLCBpbml0aWFsU3RhY2tTaXplKHMpKSk7Cglhc3NlcnQoaW5pdGlhbFRocmVhZEJ5dGVz
KHMpID09IHMtPmZyb250aWVyIC0gcy0+YmFzZSk7Cglhc3NlcnQocy0+ZnJvbnRpZXIgKyBz
LT5ieXRlc0xpdmUgPD0gcy0+bGltaXQpOwoJYXNzZXJ0KEdDX211dGF0b3JJbnZhcmlhbnQo
cykpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tICovCi8qICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmQgICAgICAgICAgICAg
ICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSAqLwovKgogKiBGb3J3YXJkIHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSAq
cHAuCiAqIFVwZGF0ZSAqcHAgdG8gcG9pbnQgdG8gdGhlIG5ldyBvYmplY3QuIAogKi8Kc3Rh
dGljIGlubGluZSB2b2lkCmZvcndhcmQoR0Nfc3RhdGUgcywgcG9pbnRlciAqcHApCnsKCXBv
aW50ZXIgcDsKCXdvcmQgaGVhZGVyOwoKCWFzc2VydChpc0luRnJvbVNwYWNlKHMsICpwcCkp
OwoJcCA9ICpwcDsKCWhlYWRlciA9IEdDX2dldEhlYWRlcihwKTsKCWlmIChoZWFkZXIgIT0g
Rk9SV0FSREVEKSB7IC8qIGZvcndhcmQgdGhlIG9iamVjdCAqLwoJCXVpbnQgaGVhZGVyQnl0
ZXMsIG9iamVjdEJ5dGVzLCBzaXplLCBza2lwOwoJCXVpbnQgbnVtUG9pbnRlcnMsIG51bU5v
blBvaW50ZXJzOwoKCQkvKiBDb21wdXRlIHRoZSBzcGFjZSB0YWtlbiBieSB0aGUgaGVhZGVy
IGFuZCBvYmplY3QgYm9keS4gKi8KCQlzcGxpdEhlYWRlcihoZWFkZXIsICZudW1Qb2ludGVy
cywgJm51bU5vblBvaW50ZXJzKTsKCQlpZiAoaXNOb3JtYWwoaGVhZGVyKSkgeyAvKiBGaXhl
ZCBzaXplIG9iamVjdC4gKi8KCQkJaGVhZGVyQnl0ZXMgPSBHQ19PQkpFQ1RfSEVBREVSX1NJ
WkU7CgkJCW9iamVjdEJ5dGVzID0gdG9CeXRlcyhudW1Qb2ludGVycyArIG51bU5vblBvaW50
ZXJzKTsKCQkJc2tpcCA9IDA7CgkJfSBlbHNlIGlmIChpc1N0YWNrSGVhZGVyKGhlYWRlcikp
IHsgLyogU3RhY2suICovCgkJCUdDX3N0YWNrIHN0YWNrOwoKCQkJaGVhZGVyQnl0ZXMgPSBT
VEFDS19IRUFERVJfU0laRTsKCQkJLyogUmVzaXplIHN0YWNrcyBub3QgYmVpbmcgdXNlZCBh
cyBjb250aW51YXRpb25zLiAqLwoJCQlzdGFjayA9IChHQ19zdGFjaylwOwoJCQlpZiAoU1RB
Q0tfSEVBREVSID09IGhlYWRlcikgewoJCQkJaWYgKDQgKiBzdGFjay0+dXNlZCA8PSBzdGFj
ay0+cmVzZXJ2ZWQpCgkJCQkJc3RhY2stPnJlc2VydmVkID0gc3RhY2stPnJlc2VydmVkIC8g
MjsKCQkJCWVsc2UgaWYgKDQgKiBzdGFjay0+dXNlZCA+IDMgKiBzdGFjay0+cmVzZXJ2ZWQp
CgkJCQkJc3RhY2stPnJlc2VydmVkID0gc3RhY2stPnJlc2VydmVkICogMjsKCQkJCXN0YWNr
LT5yZXNlcnZlZCA9IAoJCQkJCXdvcmRBbGlnbihtYXgoc3RhY2stPnJlc2VydmVkLCAKCQkJ
CQkJCXN0YWNrTmVlZHNSZXNlcnZlZChzLCBzdGFjaykpKTsKCQkJCWlmIChzdGFjay0+cmVz
ZXJ2ZWQgPiBzLT5tYXhTdGFja1NpemVTZWVuKQoJCQkJCXMtPm1heFN0YWNrU2l6ZVNlZW4g
PSBzdGFjay0+cmVzZXJ2ZWQ7CgkJCQlhc3NlcnQoc3RhY2tUb3BJc09rKHMsIHN0YWNrKSk7
CgkJCX0KCQkJb2JqZWN0Qnl0ZXMgPSBzaXplb2YgKHN0cnVjdCBHQ19zdGFjaykgKyBzdGFj
ay0+dXNlZDsKCQkJc2tpcCA9IHN0YWNrLT5yZXNlcnZlZCAtIHN0YWNrLT51c2VkOwoJCX0g
ZWxzZSB7IC8qIEFycmF5LiAqLwoJCQloZWFkZXJCeXRlcyA9IEdDX0FSUkFZX0hFQURFUl9T
SVpFOwoJCQlvYmplY3RCeXRlcyA9IGV4dHJhY3RBcnJheU51bUJ5dGVzKHAsIG51bVBvaW50
ZXJzLAoJCQkJCQkJCW51bU5vblBvaW50ZXJzKTsKCQkJc2tpcCA9IDA7CgkJCS8qIEVtcHR5
IGFycmF5cyBoYXZlIFBPSU5URVJfU0laRSBieXRlcyBmb3IgdGhlIAoJCQkgKiBmb3J3YXJk
aW5nIHBvaW50ZXIuCgkJCSAqLwoJCQlpZiAoMCA9PSBvYmplY3RCeXRlcykgb2JqZWN0Qnl0
ZXMgPSBQT0lOVEVSX1NJWkU7CgkJfSAKCQlzaXplID0gaGVhZGVyQnl0ZXMgKyBvYmplY3RC
eXRlczsKICAJCWlmIChzLT5iYWNrICsgc2l6ZSArIHNraXAgPiBzLT50b0xpbWl0KQogIAkJ
CWRpZSgiT3V0IG9mIG1lbW9yeS4iKTsKICAJCS8qIENvcHkgdGhlIG9iamVjdC4gKi8KCQl7
CgkJCXVpbnQJKnRvLAoJCQkJKmZyb20sCgkJCQkqbGltaXQ7CgoJCQl0byA9ICh1aW50ICop
cy0+YmFjazsKCQkJZnJvbSA9ICh1aW50ICopKHAgLSBoZWFkZXJCeXRlcyk7CgkJCWFzc2Vy
dCAoaXNXb3JkQWxpZ25lZCgodWludCl0bykpOwoJCQlhc3NlcnQgKGlzV29yZEFsaWduZWQo
KHVpbnQpZnJvbSkpOwoJCQlhc3NlcnQgKGlzV29yZEFsaWduZWQoc2l6ZSkpOwoJCQlsaW1p
dCA9ICh1aW50ICopKChjaGFyICopZnJvbSArIHNpemUpOwoJCQl1bnRpbCAoZnJvbSA9PSBs
aW1pdCkKCQkJCSp0bysrID0gKmZyb20rKzsKCQl9CiAJCS8qIFN0b3JlIHRoZSBmb3J3YXJk
aW5nIHBvaW50ZXIgaW4gdGhlIG9sZCBvYmplY3QuICovCgkJKih3b3JkKikocCAtIFdPUkRf
U0laRSkgPSBGT1JXQVJERUQ7CgkJKihwb2ludGVyKilwID0gcy0+YmFjayArIGhlYWRlckJ5
dGVzOwoJCS8qIFVwZGF0ZSB0aGUgYmFjayBvZiB0aGUgcXVldWUuICovCgkJcy0+YmFjayAr
PSBzaXplICsgc2tpcDsKCQlhc3NlcnQoaXNXb3JkQWxpZ25lZCgodWludClzLT5iYWNrKSk7
Cgl9CgkqcHAgPSAqKHBvaW50ZXIqKXA7Cglhc3NlcnQoaXNJblRvU3BhY2UocywgKnBwKSk7
Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0gKi8KLyogICAgICAgICAgICAgICAgICAgICAgIGRvR0MgICAgICAgICAgICAgICAgICAg
ICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tICovCgp2b2lkIEdDX2RvR0MoR0Nfc3RhdGUgcywgdWludCBieXRlc1JlcXVlc3Rl
ZCwgdWludCBzdGFja0J5dGVzUmVxdWVzdGVkKSB7CiNpZiBkZWZpbmVkKF9XSU4zMikKI2Vs
c2UKCXVpbnQgZ2NUaW1lOwojZW5kaWYKCXVpbnQgc2l6ZTsKCXBvaW50ZXIgZnJvbnQ7CiNp
ZiBkZWZpbmVkKF9XSU4zMikKI2Vsc2UKCXN0cnVjdCBydXNhZ2UgcnVfc3RhcnQsIHJ1X2Zp
bmlzaCwgcnVfdG90YWw7CiNlbmRpZgoKCWFzc2VydChpbnZhcmlhbnQocykpOwoJaWYgKERF
QlVHIG9yIHMtPm1lc3NhZ2VzKQoJCWZwcmludGYoc3RkZXJyLCAiU3RhcnRpbmcgZ2MuXG4i
KTsKI2lmIGRlZmluZWQoX1dJTjMyKQojZWxzZQoJZml4ZWRHZXRydXNhZ2UoUlVTQUdFX1NF
TEYsICZydV9zdGFydCk7CiNlbmRpZgoJdW5sZXNzIChzLT51c2VGaXhlZEhlYXApIHsgLyog
R2V0IHRvU3BhY2UgcmVhZHkuICovCgkJdWludCBuZWVkZWQ7CgoJCW5lZWRlZCA9IEdDX2Nv
bXB1dGVIZWFwU2l6ZQoJCQkocywgcy0+Ynl0ZXNMaXZlICsgYnl0ZXNSZXF1ZXN0ZWQgKyBz
dGFja0J5dGVzUmVxdWVzdGVkLAoJCQkJcy0+bGl2ZVJhdGlvKTsKCQkvKiB0b1NwYWNlIG11
c3QgYmUgYXQgbGVhc3QgYXMgYmlnIGFzIGZyb21TcGFjZSAqLwoJCWlmIChuZWVkZWQgPCBz
LT5mcm9tU2l6ZSkKCQkJbmVlZGVkID0gcy0+ZnJvbVNpemU7CgkJLyogTWFzc2FnZSB0b1Nw
YWNlIHNvIHRoYXQgaXQgaXMgb2YgbmVlZGVkIHNpemUuICovCgkJaWYgKHMtPnRvQmFzZSAh
PSBOVUxMKSB7CgkJCSBpZiAocy0+dG9TaXplIDwgbmVlZGVkKSB7CgkJCQlpZiAoREVCVUcg
b3Igcy0+bWVzc2FnZXMpCgkJCQkJZnByaW50ZihzdGRlcnIsICJVbm1hcHBpbmcgdG9TcGFj
ZVxuIik7CgkJCQlzbXVubWFwKHMtPnRvQmFzZSwgcy0+dG9TaXplKTsKCQkJCXMtPnRvQmFz
ZSA9IE5VTEw7CgkJCSB9IGVsc2UgaWYgKHMtPnRvU2l6ZSA+IG5lZWRlZCkgewojaWYgZGVm
aW5lZChET05UX1NIUklOS19NRU0pCi8vIFdlIG5ldmVyIHNocmluayBtZW1vcnkgaWYgdGhp
cyBmbGFnIGlzIGRlZmluZWQKCQkJICAgICAgICBuZWVkZWQgPSBzLT50b1NpemU7CiNlbHNl
CgkJCQl1aW50IGRlbGV0ZTsKCgkJCQlkZWxldGUgPSBzLT50b1NpemUgLSBuZWVkZWQ7CgkJ
CQlpZiAoREVCVUcgb3Igcy0+bWVzc2FnZXMpCgkJCQkJZnByaW50ZihzdGRlcnIsICJTaHJp
bmtpbmcgdG9TcGFjZSBieSAldVxuIiwgZGVsZXRlKTsKCQkJCXNtdW5tYXAocy0+dG9CYXNl
ICsgbmVlZGVkLCBkZWxldGUpOwojZW5kaWYgLy9ET05UX1NIUklOS19NRU0KCQkJIH0KCQl9
CgkJcy0+dG9TaXplID0gbmVlZGVkOwoJCWlmIChOVUxMID09IHMtPnRvQmFzZSkKCQkJR0Nf
dG9TcGFjZShzKTsKCX0KIAlzLT5udW1HQ3MrKzsKIAlzLT5ieXRlc0FsbG9jYXRlZCArPSBz
LT5mcm9udGllciAtIHMtPmJhc2UgLSBzLT5ieXRlc0xpdmU7CglzLT5iYWNrID0gcy0+dG9C
YXNlOwoJaWYgKERFQlVHIG9yIHMtPm1lc3NhZ2VzKSB7CgkJZnByaW50ZihzdGRlcnIsICJm
cm9tU3BhY2UgJXMiLCB1aW50VG9Db21tYVN0cmluZyhzLT5mcm9tU2l6ZSkpOwoJCWZwcmlu
dGYoc3RkZXJyLCAiICB0b1NwYWNlICVzXG4iLCB1aW50VG9Db21tYVN0cmluZyhzLT50b1Np
emUpKTsKCX0KCXMtPnRvTGltaXQgPSBzLT50b0Jhc2UgKyBzLT50b1NpemU7CgkvKiBUaGUg
YWN0dWFsIEdDLiAqLwoJZnJvbnQgPSBzLT5iYWNrOwoJR0NfZm9yZWFjaEdsb2JhbChzLCBm
b3J3YXJkKTsKCUdDX2ZvcmVhY2hQb2ludGVySW5SYW5nZShzLCBmcm9udCwgJnMtPmJhY2ss
IGZvcndhcmQpOwoJc2l6ZSA9IHMtPmZyb21TaXplOwoJLyogU3dhcCBmcm9tU3BhY2UgYW5k
IHRvU3BhY2UuICovCgl7CgkJcG9pbnRlciB0bXA7CgkJdG1wID0gcy0+YmFzZTsKCQlzLT5i
YXNlID0gcy0+dG9CYXNlOwoJCXMtPnRvQmFzZSA9IHRtcDsKCX0KCXsKCQl1aW50IHRtcDsK
CQl0bXAgPSBzLT5mcm9tU2l6ZTsKCQlzLT5mcm9tU2l6ZSA9IHMtPnRvU2l6ZTsKCQlzLT50
b1NpemUgPSB0bXA7Cgl9CglHQ19zZXRTdGFjayhzKTsKCXMtPmZyb250aWVyID0gcy0+YmFj
azsKCXMtPmJ5dGVzTGl2ZSA9IHMtPmZyb250aWVyIC0gcy0+YmFzZTsKCWlmIChzLT5ieXRl
c0xpdmUgPiBzLT5tYXhCeXRlc0xpdmUpCgkJcy0+bWF4Qnl0ZXNMaXZlID0gcy0+Ynl0ZXNM
aXZlOwoJLyogUmVzaXplIGhlYXAsIGlmIG5lY2Vzc2FyeS4gKi8KCXVubGVzcyAocy0+dXNl
Rml4ZWRIZWFwKSB7CgkJdWludCBuZWVkZWQ7CgoJCW5lZWRlZCA9IHMtPmJ5dGVzTGl2ZSAr
IGJ5dGVzUmVxdWVzdGVkOwojaWYgZGVmaW5lZChET05UX1NIUklOS19NRU0pCi8vIFdlIG5l
dmVyIHNocmluayBtZW1vcnkgaWYgdGhpcyBmbGFnIGlzIGRlZmluZWQKI2Vsc2UKCQlpZiAo
R0NfY29tcHV0ZUhlYXBTaXplKHMsIG5lZWRlZCwgcy0+bWluTGl2ZSkgPCBzLT5mcm9tU2l6
ZSkgewoJCQkvKiBzaHJpbmsgaGVhcCAqLwoJCQl1aW50IGtlZXA7CgoJCQlrZWVwID0gR0Nf
Y29tcHV0ZUhlYXBTaXplKHMsIG5lZWRlZCwgcy0+bGl2ZVJhdGlvKTsKCQkJaWYgKERFQlVH
IG9yIHMtPm1lc3NhZ2VzKQoJCQkJZnByaW50ZihzdGRlcnIsICJTaHJpbmtpbmcgaGVhcCB0
byAldSBieXRlcy5cbiIsIGtlZXApOwoJCQlhc3NlcnQoa2VlcCA8PSBzLT5mcm9tU2l6ZSk7
CgkJCXNtdW5tYXAocy0+YmFzZSArIGtlZXAsIHMtPmZyb21TaXplIC0ga2VlcCk7CgkJCXMt
PmZyb21TaXplID0ga2VlcDsKCQl9CiNlbmRpZiAvL0RPTlRfU0hSSU5LX01FTQoJCgkJaWYg
KChzLT50b1NpemUgPCBzLT5mcm9tU2l6ZSkKCQkgICAgb3IgKEdDX2NvbXB1dGVIZWFwU2l6
ZShzLCBuZWVkZWQsIHMtPm1heExpdmUpCgkJCQk+IHMtPmZyb21TaXplKSkgewoJCQkvKiBw
cmVwYXJlIHRvIGFsbG9jYXRlIG5ldyB0b1NwYWNlIGF0IG5leHQgR0MgKi8KCQkJc211bm1h
cChzLT50b0Jhc2UsIHMtPnRvU2l6ZSk7CgkJCXMtPnRvQmFzZSA9IE5VTEw7CgkJfQojaWYg
ZGVmaW5lZChET05UX1NIUklOS19NRU0pCi8vIFdlIG5ldmVyIHNocmluayBtZW1vcnkgaWYg
dGhpcyBmbGFnIGlzIGRlZmluZWQKI2Vsc2UKCQllbHNlIHsKCQkgICAgICAgIC8qIHNocmlu
ayB0b1NwYWNlIHNvIHRoYXQgcy0+dG9TaXplID09IHMtPmZyb21TaXplICovCgkJCXNtdW5t
YXAocy0+dG9CYXNlICsgcy0+ZnJvbVNpemUsIHMtPnRvU2l6ZSAtIHMtPmZyb21TaXplKTsK
CSAJCXMtPnRvU2l6ZSA9IHMtPmZyb21TaXplOwoJCX0KI2VuZGlmIC8vRE9OVF9TSFJJTktf
TUVNCgl9CglzZXRMaW1pdChzKTsKCXMtPmJ5dGVzQ29waWVkICs9IHMtPmJ5dGVzTGl2ZTsK
I2lmIGRlZmluZWQoX1dJTjMyKQojZWxzZQoJZml4ZWRHZXRydXNhZ2UoUlVTQUdFX1NFTEYs
ICZydV9maW5pc2gpOwoJcnVzYWdlTWludXNNYXgoJnJ1X2ZpbmlzaCwgJnJ1X3N0YXJ0LCAm
cnVfdG90YWwpOwoJcnVzYWdlUGx1c01heCgmcy0+cnVfZ2MsICZydV90b3RhbCwgJnMtPnJ1
X2djKTsKCWdjVGltZSA9IHJ1c2FnZVRpbWUoJnJ1X3RvdGFsKTsKCXMtPm1heFBhdXNlID0g
bWF4KHMtPm1heFBhdXNlLCBnY1RpbWUpOwoJaWYgKERFQlVHIG9yIHMtPm1lc3NhZ2VzKSB7
CgkJZnByaW50ZihzdGRlcnIsICJGaW5pc2hlZCBnYy5cbiIpOwoJCWZwcmludGYoc3RkZXJy
LCAidGltZShtcyk6ICVzXG4iLCBpbnRUb0NvbW1hU3RyaW5nKGdjVGltZSkpOwoJCWZwcmlu
dGYoc3RkZXJyLCAibGl2ZShieXRlcyk6ICVzICglLjFmJSUpXG4iLCAKCQkJaW50VG9Db21t
YVN0cmluZyhzLT5ieXRlc0xpdmUpLAoJCQkxMDAuMCAqICgoZG91YmxlKSBzLT5ieXRlc0xp
dmUpIC8gc2l6ZSk7Cgl9CiNlbmRpZgoJdW5sZXNzIChzLT5mcm9udGllciArIGJ5dGVzUmVx
dWVzdGVkIDw9IHMtPmxpbWl0KSB7CgkJaWYgKHMtPnVzZUZpeGVkSGVhcCBvciBzLT5mcm9t
U2l6ZSA9PSBzLT5tYXhIZWFwU2l6ZSkgewoJCQlkaWUoIk91dCBvZiBtZW1vcnkuIik7CgkJ
fSAKCQlpZiAoREVCVUcpCgkJCWZwcmludGYoc3RkZXJyLCAiUmVjdXJzaXZlIGNhbGwgdG8g
ZG9HQy5cbiIpOwoJCUdDX2RvR0MocywgYnl0ZXNSZXF1ZXN0ZWQsIDApOwoJfQoJYXNzZXJ0
KHMtPmZyb250aWVyICsgYnl0ZXNSZXF1ZXN0ZWQgPD0gcy0+bGltaXQpOwoJYXNzZXJ0KGlu
dmFyaWFudChzKSk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICAgICAgIEdDX2djICAgICAg
ICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tICovCgp2b2lkIEdDX2djKEdDX3N0YXRlIHMsIHVpbnQgYnl0
ZXNSZXF1ZXN0ZWQsIGJvb2wgZm9yY2UsCgkJc3RyaW5nIGZpbGUsIGludCBsaW5lKSB7Cgl1
aW50IHN0YWNrQnl0ZXNSZXF1ZXN0ZWQ7CgoJaWYgKERFQlVHKQoJCWZwcmludGYoc3RkZXJy
LCAiJXMgJWQ6IEdDICBjYW5IYW5kbGUgPSAlZCAgYmFzZSA9ICV4ICBmcm9udGllciA9ICV4
ICBsaW1pdCA9ICV4XG4iLCAKCQkJCWZpbGUsIGxpbmUsIHMtPmNhbkhhbmRsZSwKCQkJCSh1
aW50KXMtPmJhc2UsICh1aW50KXMtPmZyb250aWVyLCAodWludClzLT5saW1pdCk7CglHQ19l
bnRlcihzKTsKCXN0YWNrQnl0ZXNSZXF1ZXN0ZWQgPQoJCShzdGFja1RvcElzT2socywgcy0+
Y3VycmVudFRocmVhZC0+c3RhY2spKQoJCT8gMCAKCQk6IHN0YWNrQnl0ZXMoMiAqIHMtPmN1
cnJlbnRUaHJlYWQtPnN0YWNrLT5yZXNlcnZlZCk7CglpZiAoREVCVUcpCgkJZnByaW50Zihz
dGRlcnIsICJieXRlc1JlcXVlc3RlZCA9ICVkICBzdGFja0J5dGVzUmVxdWVzdGVkID0gJWRc
biIsCgkJCQlieXRlc1JlcXVlc3RlZCwgc3RhY2tCeXRlc1JlcXVlc3RlZCk7CglpZiAoZm9y
Y2Ugb3IgKHMtPmZyb250aWVyICsgYnl0ZXNSZXF1ZXN0ZWQgKyBzdGFja0J5dGVzUmVxdWVz
dGVkIAoJCQk+IHMtPmxpbWl0KSkgewoJCWlmIChzLT5tZXNzYWdlcykKCQkJZnByaW50Zihz
dGRlcnIsICIlcyAlZDogR0NcbiIsIGZpbGUsIGxpbmUpOwoJCS8qIFRoaXMgR0Mgd2lsbCBn
cm93IHRoZSBzdGFjaywgaWYgbmVjZXNzYXJ5LiAqLwoJCUdDX2RvR0MgKHMsIGJ5dGVzUmVx
dWVzdGVkLCBzLT5jdXJyZW50VGhyZWFkLT5zdGFjay0+cmVzZXJ2ZWQpOwoJCWFzc2VydCAo
cy0+ZnJvbnRpZXIgKyBieXRlc1JlcXVlc3RlZCA8PSBzLT5saW1pdCk7Cgl9IGVsc2UgaWYg
KG5vdCAoc3RhY2tUb3BJc09rIChzLCBzLT5jdXJyZW50VGhyZWFkLT5zdGFjaykpKSB7CgkJ
dWludCBzaXplOwoJCUdDX3N0YWNrIHN0YWNrOwoKCQlzaXplID0gMiAqIHMtPmN1cnJlbnRU
aHJlYWQtPnN0YWNrLT5yZXNlcnZlZDsKCQlpZiAoREVCVUcpCgkJCWZwcmludGYgKHN0ZGVy
ciwgIkdyb3dpbmcgc3RhY2sgdG8gc2l6ZSAldS5cbiIsIHNpemUpOwoJCWlmIChzaXplID4g
cy0+bWF4U3RhY2tTaXplU2VlbikKCQkJcy0+bWF4U3RhY2tTaXplU2VlbiA9IHNpemU7CgkJ
LyogVGhlIG5ld1N0YWNrIGNhbid0IGNhdXNlIGEgR0MsIGJlY2F1c2Ugd2UgY2hlY2tlZCBh
Ym92ZSB0byAKCQkgKiBtYWtlIHN1cmUgdGhlcmUgd2FzIGVub3VnaCBzcGFjZS4gCgkJICov
CgkJc3RhY2sgPSBuZXdTdGFjayhzLCBTVEFDS19IRUFERVIsIHNpemUpOwoJCXN0YWNrQ29w
eShzLT5jdXJyZW50VGhyZWFkLT5zdGFjaywgc3RhY2spOwoJCXMtPmN1cnJlbnRUaHJlYWQt
PnN0YWNrID0gc3RhY2s7CgkJR0Nfc2V0U3RhY2socyk7CgkJYXNzZXJ0KHMtPmZyb250aWVy
ICsgYnl0ZXNSZXF1ZXN0ZWQgPD0gcy0+bGltaXQpOwovKgl9IGVsc2UgaWYgKDAgPT0gcy0+
Y2FuSGFuZGxlKSB7ICovCgl9IGVsc2UgewojaWYgZGVmaW5lZChET05UX1VTRV9TSUdOQUxT
KQoJCWZwcmludGYoc3RkZXJyLCAiV2UncmUgc3VwcG9zZWQgbm90IHRvIHVzZSBzaWduYWxz
IC0gc28gd2UgcHJvYmFibHkgZW5kZWQgdXAgaW4gYSBiYWQgcGxhY2UgaW4gdGhlIGNvZGVc
biIpOwojZW5kaWYKCQlhc3NlcnQgKDAgPT0gcy0+Y2FuSGFuZGxlKTsKCQkvKiBTd2l0Y2gg
dG8gdGhlIHNpZ25hbCBoYW5kbGVyIHRocmVhZC4gKi8KCQlpZiAoREVCVUcpIHsKCQkJZnBy
aW50ZihzdGRlcnIsICJzd2l0Y2hpbmcgdG8gc2lnbmFsIGhhbmRsZXJcbiIpOwoJCQlkaXNw
bGF5KHMsIHN0ZGVycik7CgkJfQoJCWFzc2VydChzLT5zaWduYWxJc1BlbmRpbmcpOwoJCXMt
PnNpZ25hbElzUGVuZGluZyA9IEZBTFNFOwoJCXMtPmluU2lnbmFsSGFuZGxlciA9IFRSVUU7
CgkJcy0+c2F2ZWRUaHJlYWQgPSBzLT5jdXJyZW50VGhyZWFkOwoJCXN3aXRjaFRvVGhyZWFk
KHMsIHMtPnNpZ25hbEhhbmRsZXIpOwoJfQoJbGVhdmUocyk7Cn0KCi8qIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAg
ICAgICAgIEdDX2NyZWF0ZVN0cmluZ3MgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgp2b2lkIEdD
X2NyZWF0ZVN0cmluZ3MoR0Nfc3RhdGUgcywgc3RydWN0IEdDX3N0cmluZ0luaXQgaW5pdHNb
XSkgewoJcG9pbnRlciBmcm9udGllcjsKCWludCBpOwoKCWFzc2VydChpbnZhcmlhbnQocykp
OwoJZnJvbnRpZXIgPSBzLT5mcm9udGllcjsKCWZvcihpID0gMDsgaW5pdHNbaV0uc3RyICE9
IE5VTEw7ICsraSkgewoJCXVpbnQgbnVtRWxlbWVudHMsIG51bUJ5dGVzOwoKCQludW1FbGVt
ZW50cyA9IGluaXRzW2ldLnNpemU7CgkJbnVtQnl0ZXMgPSBHQ19BUlJBWV9IRUFERVJfU0la
RQoJCQkrICgoMCA9PSBudW1FbGVtZW50cykgCgkJCQk/IFBPSU5URVJfU0laRSAKCQkJCTog
d29yZEFsaWduKG51bUVsZW1lbnRzKSk7CgkJaWYgKGZyb250aWVyICsgbnVtQnl0ZXMgPj0g
cy0+bGltaXQpCgkJCWRpZSgiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cmluZyBjb25zdGFudCBc
IiVzXCIuIiwgCgkJCQlpbml0c1tpXS5zdHIpOwoJCSood29yZCopZnJvbnRpZXIgPSBudW1F
bGVtZW50czsKCQkqKHdvcmQqKShmcm9udGllciArIFdPUkRfU0laRSkgPSBTVFJJTkdfSEVB
REVSOwoJCXMtPmdsb2JhbHNbaW5pdHNbaV0uZ2xvYmFsSW5kZXhdID0gCgkJCWZyb250aWVy
ICsgR0NfQVJSQVlfSEVBREVSX1NJWkU7CgkJewoJCQlpbnQgajsKCgkJCWZvciAoaiA9IDA7
IGogPCBudW1FbGVtZW50czsgKytqKQoJCQkJKihmcm9udGllciArIEdDX0FSUkFZX0hFQURF
Ul9TSVpFICsgaikgCgkJCQkJPSBpbml0c1tpXS5zdHJbal07CgkJfQoJCWZyb250aWVyICs9
IG51bUJ5dGVzOwoJfQoJcy0+ZnJvbnRpZXIgPSBmcm9udGllcjsKCWFzc2VydChHQ19tdXRh
dG9ySW52YXJpYW50KHMpKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICAgICAgICBHQ19kb25l
ICAgICAgICAgICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyB2b2lkIGRpc3BsYXlVaW50IChz
dHJpbmcgbmFtZSwgdWludCBuKSB7CglmcHJpbnRmIChzdGRlcnIsICIlczogJXNcbiIsIG5h
bWUsIHVpbnRUb0NvbW1hU3RyaW5nKG4pKTsKfQoKc3RhdGljIHZvaWQgZGlzcGxheVVsbG9u
ZyAoc3RyaW5nIG5hbWUsIHVsbG9uZyBuKSB7CglmcHJpbnRmIChzdGRlcnIsICIlczogJXNc
biIsIG5hbWUsIHVsbG9uZ1RvQ29tbWFTdHJpbmcobikpOwp9CgppbmxpbmUgdm9pZApHQ19k
b25lIChHQ19zdGF0ZSBzKQp7CglHQ19lbnRlcihzKTsKCXNtdW5tYXAocy0+YmFzZSwgcy0+
ZnJvbVNpemUpOwoJaWYgKHMtPnRvQmFzZSAhPSBOVUxMKSBzbXVubWFwKHMtPnRvQmFzZSwg
cy0+dG9TaXplKTsKCWlmIChzLT5zdW1tYXJ5KSB7CiNpZiBkZWZpbmVkKF9XSU4zMikKI2Vs
c2UKCQlkb3VibGUgdGltZTsKCQl1aW50IGdjVGltZSA9IHJ1c2FnZVRpbWUoJnMtPnJ1X2dj
KTsKI2VuZGlmCgoJCWRpc3BsYXlVaW50KCJtYXggc2VtaXNwYWNlIHNpemUoYnl0ZXMpIiwg
cy0+bWF4SGVhcFNpemVTZWVuKTsKCQlkaXNwbGF5VWludCgibWF4IHN0YWNrIHNpemUoYnl0
ZXMpIiwgcy0+bWF4U3RhY2tTaXplU2Vlbik7CiNpZiBkZWZpbmVkKF9XSU4zMikKI2Vsc2UK
CQl0aW1lID0gKGRvdWJsZSkoY3VycmVudFRpbWUoKSAtIHMtPnN0YXJ0VGltZSk7CgkJZnBy
aW50ZihzdGRlcnIsICJHQyB0aW1lKG1zKTogJXMgKCUuMWYlJSlcbiIsCgkJCWludFRvQ29t
bWFTdHJpbmcoZ2NUaW1lKSwgCgkJCSgwLjAgPT0gdGltZSkgPyAwLjAgCgkJCTogMTAwLjAg
KiAoKGRvdWJsZSkgZ2NUaW1lKSAvIHRpbWUpOwojZW5kaWYKCQlkaXNwbGF5VWludCgibWF4
UGF1c2UobXMpIiwgcy0+bWF4UGF1c2UpOwoJCWRpc3BsYXlVaW50KCJudW1iZXIgb2YgR0Nz
Iiwgcy0+bnVtR0NzKTsKCQlkaXNwbGF5VWxsb25nKCJieXRlcyBhbGxvY2F0ZWQiLAoJIAkJ
CXMtPmJ5dGVzQWxsb2NhdGVkIAoJCQkJKyAocy0+ZnJvbnRpZXIgLSBzLT5iYXNlIC0gcy0+
Ynl0ZXNMaXZlKSk7CgkJZGlzcGxheVVsbG9uZygiYnl0ZXMgY29waWVkIiwgcy0+Ynl0ZXND
b3BpZWQpOwoJCWRpc3BsYXlVaW50KCJtYXggYnl0ZXMgbGl2ZSIsIHMtPm1heEJ5dGVzTGl2
ZSk7Cgl9CQp9CgovKiBHQ19oYW5kbGVyIHNldHMgcy0+bGltaXQgPSBzLT5iYXNlIHNvIHRo
YXQgdGhlIG5leHQgbGltaXQgY2hlY2sgd2lsbCBmYWlsLiAKICogU2lnbmFscyBuZWVkIHRv
IGJlIGJsb2NrZWQgZHVyaW5nIHRoZSBoYW5kbGVyIChpLmUuIGl0IHNob3VsZCBydW4gYXRv
bWljYWxseSkKICogYmVjYXVzZSBzaWdhZGRzZXQgZG9lcyBib3RoIGEgcmVhZCBhbmQgYSB3
cml0ZSBvZiBzLT5zaWduYWxzUGVuZGluZy4KICogVGhlIHNpZ25hbHMgYXJlIGJsb2NrZWQg
YnkgUG9zaXhfU2lnbmFsX2hhbmRsZSAoc2VlIFBvc2l4L1NpZ25hbC9TaWduYWwuYykuCiAq
LwojaWYgZGVmaW5lZChET05UX1VTRV9TSUdOQUxTKQojZWxzZQppbmxpbmUgdm9pZApHQ19o
YW5kbGVyKEdDX3N0YXRlIHMsIGludCBzaWdudW0pCnsKCWlmIChERUJVRykKCQlmcHJpbnRm
KHN0ZGVyciwgIkdDX2hhbmRsZXJcbiIpOwoJaWYgKDAgPT0gcy0+Y2FuSGFuZGxlKSB7CgkJ
aWYgKERFQlVHKQoJCQlmcHJpbnRmKHN0ZGVyciwgInNldHRpbmcgbGltaXQgPSBiYXNlXG4i
KTsKCQlzLT5saW1pdCA9IHMtPmJhc2U7Cgl9CglzaWdhZGRzZXQoJnMtPnNpZ25hbHNQZW5k
aW5nLCBzaWdudW0pOwoJcy0+c2lnbmFsSXNQZW5kaW5nID0gVFJVRTsKfQoKaW5saW5lIHZv
aWQKR0NfZmluaXNoSGFuZGxlcihHQ19zdGF0ZSBzLCBHQ190aHJlYWQgdCkKewoJaWYgKERF
QlVHKSB7CgkJZnByaW50ZihzdGRlcnIsICJHQ19maW5pc2hIYW5kbGVyXG4iKTsKCQlkaXNw
bGF5KHMsIHN0ZGVycik7Cgl9CglHQ19lbnRlcihzKTsKCWFzc2VydCh0ICE9IEJPR1VTX1RI
UkVBRCk7CglzLT5pblNpZ25hbEhhbmRsZXIgPSBGQUxTRTsJCglzaWdlbXB0eXNldCgmcy0+
c2lnbmFsc1BlbmRpbmcpOwoJc3dpdGNoVG9UaHJlYWQocywgdCk7CglsZWF2ZShzKTsKfQoj
ZW5kaWYKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICAgR0Nfb2JqZWN0U2l6ZSAgICAgICAgICAg
ICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tICovCi8qIENvbXB1dGUgdGhlIHNwYWNlIHRha2VuIGJ5IHRoZSBoZWFkZXIg
YW5kIG9iamVjdCBib2R5LiAqLwoKaW5saW5lIHVpbnQKR0Nfb2JqZWN0U2l6ZShwb2ludGVy
IHApCnsKCXVpbnQgaGVhZGVyQnl0ZXMsIG9iamVjdEJ5dGVzOwogICAgICAgCXdvcmQgaGVh
ZGVyOwoJdWludCBudW1Qb2ludGVycywgbnVtTm9uUG9pbnRlcnM7CgoJaGVhZGVyID0gR0Nf
Z2V0SGVhZGVyKHApOwoJc3BsaXRIZWFkZXIoaGVhZGVyLCAmbnVtUG9pbnRlcnMsICZudW1O
b25Qb2ludGVycyk7CglpZiAoaXNOb3JtYWwoaGVhZGVyKSkgeyAvKiBGaXhlZCBzaXplIG9i
amVjdC4gKi8KCQloZWFkZXJCeXRlcyA9IEdDX09CSkVDVF9IRUFERVJfU0laRTsKCQlvYmpl
Y3RCeXRlcyA9IHRvQnl0ZXMobnVtUG9pbnRlcnMgKyBudW1Ob25Qb2ludGVycyk7Cgl9IGVs
c2UgaWYgKGlzU3RhY2tIZWFkZXIoaGVhZGVyKSkgeyAvKiBTdGFjay4gKi8KCQloZWFkZXJC
eXRlcyA9IFNUQUNLX0hFQURFUl9TSVpFOwoJCW9iamVjdEJ5dGVzID0gc2l6ZW9mKHN0cnVj
dCBHQ19zdGFjaykgKyAoKEdDX3N0YWNrKXApLT5yZXNlcnZlZDsKCX0gZWxzZSB7IC8qIEFy
cmF5LiAqLwoJCWhlYWRlckJ5dGVzID0gR0NfQVJSQVlfSEVBREVSX1NJWkU7CgkJb2JqZWN0
Qnl0ZXMgPSBleHRyYWN0QXJyYXlOdW1CeXRlcyhwLCBudW1Qb2ludGVycywKCQkJCQkJCW51
bU5vblBvaW50ZXJzKTsKCQkvKiBFbXB0eSBhcnJheXMgaGF2ZSBQT0lOVEVSX1NJWkUgYnl0
ZXMgZm9yIHRoZSAKCQkgKiBmb3J3YXJkaW5nIHBvaW50ZXIuCgkJICovCgkJaWYgKDAgPT0g
b2JqZWN0Qnl0ZXMpIG9iamVjdEJ5dGVzID0gUE9JTlRFUl9TSVpFOwoJfQoJcmV0dXJuIGhl
YWRlckJ5dGVzICsgb2JqZWN0Qnl0ZXM7Cn0K
--------------14E4402F98B4537F7DFE25DF--