NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: kern/46990: tmpfs_gro_genealogy() panic - rename/rmdir race condition not handled
The following reply was made to PR kern/46990; it has been noted by GNATS.
From: Wolfgang Stukenbrock <wolfgang.stukenbrock%nagler-company.com@localhost>
To: Taylor R Campbell <riastradh%NetBSD.org@localhost>
Cc: gnats-bugs%NetBSD.org@localhost
Subject: Re: kern/46990: tmpfs_gro_genealogy() panic - rename/rmdir race
condition not handled
Date: Fri, 21 Sep 2012 13:10:26 +0200
This is a multi-part message in MIME format.
--------------030801010402050202010402
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
Hi, of cause you can have them.
I've already ask if someone is interested in - see PR46955.
The attached tar file contains all modified files.
It is mainly the version from Head with some "missing" stuff copied in
from kernel_auth and genfs directly into the tmpfs-sources.
I don't want to upgrade all of other parts too, because then I have to
change everything ...
I don't expect to get the "best integration of the year"-award for this
work. I simply need a stable version for our productive systems running
5.1.x - and currently they lockup in tmpfs from time to time.
(remark: as far as I remember, one kauth-change is not marked with "#if
0 // not in 5.1" in the lookup code - a diff against the version from
head will show it.)
now to the problem itself.
OK - you are right.
tmpfs_gro_lock_directory will check the parent link - I've overlooked
that sorry.
But I've added a printf() statement in my new error handling path when
dnode is NULL and I've got it!
Also the analyses with DDB before shows, that dnode is NULL. The
(manualy) reconstructed call path (accedently mutex_enter is an
assembler stuff that does not have a frame pointer ...) say that
VOP_RENAME calls genfs_insane_rename, that calls tmpfs_sane_rename, that
calls genfs_sane_rename that calls the function from ops at offset 0x40
(this is tmpfs_gro_genealogy - not shown in the backtrace of ddb due to
the missing frame pointer in mutex_enter) and that crashes inside the
call mutex_enter(&dnode->tn_vlock).
I cannot say if it is the first loop or the second one - I assumed the
first one in my report ... My fault.
If we can exclude the first loop pass, than the "problem" must happen
while walking up the parent chain.
We will vput(vp) after getting tn_vlock on the parent - so we have no
lock on any vnode anymore.
The normal way is to get tn_vlock and than seaches for the vnode by
calling tmpfs_vnode_get(). There we have two different ways to handle
the locks:
- If the vnode is present we get the v_interlock on it, release tn_vlock
and call vget().
- If the vnode is missing, we allocate one, call vn_lock on it and than
release the tn_vlock.
The second one is OK in any case, but not used in our case here - I think.
If the vnode is "present", than another process may have locked that
vnode and is e.g. trying to get to "our" vnode. When we release it, this
process will get it. At this time we "only" hold the tn_vlock on the parent.
I'm not shure if there is a possibility that other processes may kill
the old directory vnode and than kill the one where we have the tn_vlock
too.
The only location where tn_parent gets killed is in tmpfs_dir_detach().
and that one is called in tmpfs_gro_rename (nobody may come there -
rename-lock in vfs), tmpfs_gro_remove (not used for directories) and
tmpfs_rmdir.
OK - it is always possible that somewhere else someone is throwing
bombs. I've "only" tested tmpfs with dirconc, so in case of bombs they
may be there but still not explode. but I don't think so.
By the way:
What will happen if I've a reference to a directory (e.g. current-dir)
and someone delete it and the parent of it too?
When a directory is deleted, it is either realy deleted
(tmpfs_free_dirent) or set to WHITEOUT-state (tmpfs_dir_attach again).
I've seen no code that will destroy the link between the vnode and the
node structure till now, but I assume it is present somewhere.
As a second action all WHITEOUT children of the just removed directory
are simply deleted during directory delete operation. (calls to
tmpfs_dir_detach and tmpfs_free_dirent without any checks for vnode
references.)
If there are still vnodes associated to the nodes in the dirents, is
this code save?
I'm not shure, but I've no time to go deeper there.
Perhaps the process is suspended so long, that the dirent-structure gets
reuses and removed (as WHITEOUT) before it continues ...
(I'm running dirconc ....)
The system where I've tested my patch is spare at the moment. So I can
do other tests if desired.
I will enable KASSERT() and will try to get out more information.
Accedently enabling all KASSERT in the kernel will change the timing
behaviour in a way, that the problem may not come up again.
Just as information:
The last problem I've fixed before was the sync with the cache after
rename occured.
In Head the call to genfs_rename_cache_purge() was commented out in
tmpfs_gro_rename.
5.1 seems to need it, because I've ended up with having the object in
the correct tmpfs-structure, but when accessing it in the cache it is
not found.
Symtom: "ls <dir>" will show the name but "ls -l <dir>" say "file not
found".
Either this is wrong in Head too or there are some changes in the
vnode-cache, that I've overlooked. Neverless it should be possible all
the time to kill some "random" entries from the cache. So adding removal
shouldn't do anything wrong - perhaps I loose some performance, but I
can live with that.
But I don't think this is relavant for this problem.
If you prefer that I try it in Head instead, let me know the location of
the source-tar-files on an ftp-server I should use for installation. I
can (cross-)compile them on another system and install the resulting
binaries via network.
Best regards
W. Stukenbrock
Taylor R Campbell wrote:
> Date: Thu, 20 Sep 2012 14:50:01 +0000
> From: Wolfgang.Stukenbrock%nagler-company.com@localhost
>
> The comment in tmpfs_rename.c tmpfs_gro_genealogy() that dnode may
> not be NULL is simply not true. Need to check if dnode is NULL and
> return an error (e.g. ENOENT) instead.
>
> I'm not sure this analysis is correct. If tmpfs_rmdired_p(vp) is
> false, then VP_TO_TMPFS_NODE(vp)->tn_spec.tn_dir.tn_parent is
> guaranteed to be nonnull, provided that vp is locked. Can you enable
> DIAGNOSTIC and see what earlier kassert fires? Also, have you
> reproduced the problem in HEAD too?
>
> I suspect that this not a rename locking issue in particular so much
> as tmpfs locking issue in general -- if I recall correctly, after
> netbsd-5, rmind rototilled the tmpfs locking some time before I
> committed changes to fix tmpfs_rename last year.
>
> Can we see your patches to back-port tmpfs_rename?
>
>
--------------030801010402050202010402
Content-Type: application/octet-stream;
name="tmpfs-patch.tar"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="tmpfs-patch.tar"
dG1wZnMtcGF0Y2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwNDA3NTUA
MDAwMDAwMAAwMDAwMDAwADAwMDAwMDAwMDAwADEyMDI3MDExNDEzADAwMTIwMzcANQAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHJvb3QA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0bXBmcy1wYXRjaC9zcmMAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAMDA0MDc1NQAwMDAwMDAwADAwMDAwMDAAMDAwMDAwMDAwMDAA
MTIwMjcwMTA3NjMAMDAxMjYzNQA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAHVzdGFyICAAcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3
aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRt
cGZzLXBhdGNoL3NyYy9zeXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDQwNzU1ADAw
MDAwMDAAMDAwMDAwMAAwMDAwMDAwMDAwMAAxMjAyNzAxMTE2NwAwMDEzNDUyADUAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAByb290AAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdG1wZnMtcGF0Y2gvc3JjL3N5cy9mcwAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAADAwNDA3NTUAMDAwMDAwMAAwMDAwMDAwADAwMDAwMDAwMDAwADEy
MDI0NTY2NzE2ADAwMTQwNzYANQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAB1c3RhciAgAHJvb3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hl
ZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0bXBm
cy1wYXRjaC9zcmMvc3lzL2ZzL3RtcGZzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDA0MDc1NQAwMDAw
MDAwADAwMDAwMDAAMDAwMDAwMDAwMDAAMTIwMjcwMTA0NzUAMDAxNTIxNAA1AAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAcm9vdAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRtcGZzLXBhdGNoL3NyYy9zeXMvZnMvdG1wZnMvdG1w
ZnNfdm5vcHMuYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAwMTAwNjQ0ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDA3NzUxNAAxMjAy
NjM1MjA0MQAwMDIwMDI1ADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAdXN0YXIgIAByb290AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVs
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyoJJE5l
dEJTRDogdG1wZnNfdm5vcHMuYyx2IDEuOTggMjAxMi8wNy8yMiAwMDo1MzoyMSBybWluZCBF
eHAgJAkqLwoKLyoKICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IFRoZSBOZXRC
U0QgRm91bmRhdGlvbiwgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBUaGlz
IGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIFRoZSBOZXRC
U0QgRm91bmRhdGlvbgogKiBieSBKdWxpbyBNLiBNZXJpbm8gVmlkYWwsIGRldmVsb3BlZCBh
cyBwYXJ0IG9mIEdvb2dsZSdzIFN1bW1lciBvZiBDb2RlCiAqIDIwMDUgcHJvZ3JhbS4KICoK
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBUSEUgTkVUQlNEIEZPVU5EQVRJT04sIElOQy4gQU5EIENPTlRSSUJVVE9SUwogKiBg
YEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQKICogVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBGT1VOREFUSU9OIE9S
IENPTlRSSUJVVE9SUwogKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCiAqIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCiAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUwogKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgogKiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQogKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogKiBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KICovCgovKgogKiB0bXBmcyB2bm9kZSBpbnRlcmZhY2UuCiAqLwoKI2luY2x1
ZGUgPHN5cy9jZGVmcy5oPgpfX0tFUk5FTF9SQ1NJRCgwLCAiJE5ldEJTRDogdG1wZnNfdm5v
cHMuYyx2IDEuOTggMjAxMi8wNy8yMiAwMDo1MzoyMSBybWluZCBFeHAgJCIpOwoKI2luY2x1
ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8c3lzL2RpcmVudC5oPgojaW5jbHVkZSA8c3lz
L2ZjbnRsLmg+CiNpbmNsdWRlIDxzeXMvZXZlbnQuaD4KI2luY2x1ZGUgPHN5cy9tYWxsb2Mu
aD4KI2luY2x1ZGUgPHN5cy9uYW1laS5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1
ZGUgPHN5cy91aW8uaD4KI2luY2x1ZGUgPHN5cy91bmlzdGQuaD4KI2luY2x1ZGUgPHN5cy92
bm9kZS5oPgojaW5jbHVkZSA8c3lzL2xvY2tmLmg+CiNpbmNsdWRlIDxzeXMva2F1dGguaD4K
CiNpbmNsdWRlIDx1dm0vdXZtLmg+CgojaW5jbHVkZSA8bWlzY2ZzL2ZpZm9mcy9maWZvLmg+
CiNpbmNsdWRlIDxmcy90bXBmcy90bXBmc192bm9wcy5oPgojaW5jbHVkZSA8ZnMvdG1wZnMv
dG1wZnMuaD4KCiNpZiAxIC8vIHN0aWxsIG1pc3NpbmcgZnJvbSBzeXMvZnN0eXBlcy5oIGlu
IDUuMS54CiNkZWZpbmUJTU5UX1JFTEFUSU1FCTB4MDAwMjAwMDAKI2VuZGlmCgovKgogKiB2
bm9kZSBvcGVyYXRpb25zIHZlY3RvciB1c2VkIGZvciBmaWxlcyBzdG9yZWQgaW4gYSB0bXBm
cyBmaWxlIHN5c3RlbS4KICovCmludCAoKip0bXBmc192bm9kZW9wX3ApKHZvaWQgKik7CmNv
bnN0IHN0cnVjdCB2bm9kZW9wdl9lbnRyeV9kZXNjIHRtcGZzX3Zub2Rlb3BfZW50cmllc1td
ID0gewoJeyAmdm9wX2RlZmF1bHRfZGVzYywJCXZuX2RlZmF1bHRfZXJyb3IgfSwKCXsgJnZv
cF9sb29rdXBfZGVzYywJCXRtcGZzX2xvb2t1cCB9LAoJeyAmdm9wX2NyZWF0ZV9kZXNjLAkJ
dG1wZnNfY3JlYXRlIH0sCgl7ICZ2b3BfbWtub2RfZGVzYywJCXRtcGZzX21rbm9kIH0sCgl7
ICZ2b3Bfb3Blbl9kZXNjLAkJdG1wZnNfb3BlbiB9LAoJeyAmdm9wX2Nsb3NlX2Rlc2MsCQl0
bXBmc19jbG9zZSB9LAoJeyAmdm9wX2FjY2Vzc19kZXNjLAkJdG1wZnNfYWNjZXNzIH0sCgl7
ICZ2b3BfZ2V0YXR0cl9kZXNjLAkJdG1wZnNfZ2V0YXR0ciB9LAoJeyAmdm9wX3NldGF0dHJf
ZGVzYywJCXRtcGZzX3NldGF0dHIgfSwKCXsgJnZvcF9yZWFkX2Rlc2MsCQl0bXBmc19yZWFk
IH0sCgl7ICZ2b3Bfd3JpdGVfZGVzYywJCXRtcGZzX3dyaXRlIH0sCgl7ICZ2b3BfaW9jdGxf
ZGVzYywJCXRtcGZzX2lvY3RsIH0sCgl7ICZ2b3BfZmNudGxfZGVzYywJCXRtcGZzX2ZjbnRs
IH0sCgl7ICZ2b3BfcG9sbF9kZXNjLAkJdG1wZnNfcG9sbCB9LAoJeyAmdm9wX2txZmlsdGVy
X2Rlc2MsCQl0bXBmc19rcWZpbHRlciB9LAoJeyAmdm9wX3Jldm9rZV9kZXNjLAkJdG1wZnNf
cmV2b2tlIH0sCgl7ICZ2b3BfbW1hcF9kZXNjLAkJdG1wZnNfbW1hcCB9LAoJeyAmdm9wX2Zz
eW5jX2Rlc2MsCQl0bXBmc19mc3luYyB9LAoJeyAmdm9wX3NlZWtfZGVzYywJCXRtcGZzX3Nl
ZWsgfSwKCXsgJnZvcF9yZW1vdmVfZGVzYywJCXRtcGZzX3JlbW92ZSB9LAoJeyAmdm9wX2xp
bmtfZGVzYywJCXRtcGZzX2xpbmsgfSwKCXsgJnZvcF9yZW5hbWVfZGVzYywJCXRtcGZzX3Jl
bmFtZSB9LAoJeyAmdm9wX21rZGlyX2Rlc2MsCQl0bXBmc19ta2RpciB9LAoJeyAmdm9wX3Jt
ZGlyX2Rlc2MsCQl0bXBmc19ybWRpciB9LAoJeyAmdm9wX3N5bWxpbmtfZGVzYywJCXRtcGZz
X3N5bWxpbmsgfSwKCXsgJnZvcF9yZWFkZGlyX2Rlc2MsCQl0bXBmc19yZWFkZGlyIH0sCgl7
ICZ2b3BfcmVhZGxpbmtfZGVzYywJCXRtcGZzX3JlYWRsaW5rIH0sCgl7ICZ2b3BfYWJvcnRv
cF9kZXNjLAkJdG1wZnNfYWJvcnRvcCB9LAoJeyAmdm9wX2luYWN0aXZlX2Rlc2MsCQl0bXBm
c19pbmFjdGl2ZSB9LAoJeyAmdm9wX3JlY2xhaW1fZGVzYywJCXRtcGZzX3JlY2xhaW0gfSwK
CXsgJnZvcF9sb2NrX2Rlc2MsCQl0bXBmc19sb2NrIH0sCgl7ICZ2b3BfdW5sb2NrX2Rlc2Ms
CQl0bXBmc191bmxvY2sgfSwKCXsgJnZvcF9ibWFwX2Rlc2MsCQl0bXBmc19ibWFwIH0sCgl7
ICZ2b3Bfc3RyYXRlZ3lfZGVzYywJCXRtcGZzX3N0cmF0ZWd5IH0sCgl7ICZ2b3BfcHJpbnRf
ZGVzYywJCXRtcGZzX3ByaW50IH0sCgl7ICZ2b3BfcGF0aGNvbmZfZGVzYywJCXRtcGZzX3Bh
dGhjb25mIH0sCgl7ICZ2b3BfaXNsb2NrZWRfZGVzYywJCXRtcGZzX2lzbG9ja2VkIH0sCgl7
ICZ2b3BfYWR2bG9ja19kZXNjLAkJdG1wZnNfYWR2bG9jayB9LAoJeyAmdm9wX2J3cml0ZV9k
ZXNjLAkJdG1wZnNfYndyaXRlIH0sCgl7ICZ2b3BfZ2V0cGFnZXNfZGVzYywJCXRtcGZzX2dl
dHBhZ2VzIH0sCgl7ICZ2b3BfcHV0cGFnZXNfZGVzYywJCXRtcGZzX3B1dHBhZ2VzIH0sCgl7
ICZ2b3Bfd2hpdGVvdXRfZGVzYywJCXRtcGZzX3doaXRlb3V0IH0sCgl7IE5VTEwsIE5VTEwg
fQp9OwoKY29uc3Qgc3RydWN0IHZub2Rlb3B2X2Rlc2MgdG1wZnNfdm5vZGVvcF9vcHZfZGVz
YyA9IHsKCSZ0bXBmc192bm9kZW9wX3AsIHRtcGZzX3Zub2Rlb3BfZW50cmllcwp9OwoKLyoK
ICogdG1wZnNfbG9va3VwOiBwYXRoIG5hbWUgdHJhdmVyc2FsIHJvdXRpbmUuCiAqCiAqIEFy
Z3VtZW50czogZHZwIChkaXJlY3RvcnkgYmVpbmcgc2VhcmNoZWQpLCB2cHAgKHJlc3VsdCks
CiAqIGNucCAoY29tcG9uZW50IG5hbWUgLSBwYXRoKS4KICoKICogPT4gQ2FsbGVyIGhvbGRz
IGEgcmVmZXJlbmNlIGFuZCBsb2NrIG9uIGR2cC4KICogPT4gV2UgcmV0dXJuIGxvb2tlZC11
cCB2bm9kZSAodnBwKSBsb2NrZWQsIHdpdGggYSByZWZlcmVuY2UgaGVsZC4KICovCmludAp0
bXBmc19sb29rdXAodm9pZCAqdikKewoJc3RydWN0IHZvcF9sb29rdXBfYXJncyAvKiB7CgkJ
c3RydWN0IHZub2RlICphX2R2cDsKCQlzdHJ1Y3Qgdm5vZGUgKiphX3ZwcDsKCQlzdHJ1Y3Qg
Y29tcG9uZW50bmFtZSAqYV9jbnA7Cgl9ICovICphcCA9IHY7Cgl2bm9kZV90ICpkdnAgPSBh
cC0+YV9kdnAsICoqdnBwID0gYXAtPmFfdnBwOwoJc3RydWN0IGNvbXBvbmVudG5hbWUgKmNu
cCA9IGFwLT5hX2NucDsKCWNvbnN0IGJvb2wgbGFzdGNuID0gKGNucC0+Y25fZmxhZ3MgJiBJ
U0xBU1RDTikgIT0gMDsKCXRtcGZzX25vZGVfdCAqZG5vZGUsICp0bm9kZTsKCXRtcGZzX2Rp
cmVudF90ICpkZTsKCWludCBlcnJvcjsKCglLQVNTRVJUKFZPUF9JU0xPQ0tFRChkdnApKTsK
Cglkbm9kZSA9IFZQX1RPX1RNUEZTX0RJUihkdnApOwoJKnZwcCA9IE5VTEw7CgoJLyogQ2hl
Y2sgYWNjZXNzaWJpbGl0eSBvZiBkaXJlY3RvcnkuICovCgllcnJvciA9IFZPUF9BQ0NFU1Mo
ZHZwLCBWRVhFQywgY25wLT5jbl9jcmVkKTsKCWlmIChlcnJvcikgewoJCWdvdG8gb3V0OwoJ
fQoKCS8qCgkgKiBJZiByZXF1ZXN0aW5nIHRoZSBsYXN0IHBhdGggY29tcG9uZW50IG9uIGEg
cmVhZC1vbmx5IGZpbGUgc3lzdGVtCgkgKiB3aXRoIGEgd3JpdGUgb3BlcmF0aW9uLCBkZW55
IGl0LgoJICovCglpZiAobGFzdGNuICYmIChkdnAtPnZfbW91bnQtPm1udF9mbGFnICYgTU5U
X1JET05MWSkgIT0gMCAmJgoJICAgIChjbnAtPmNuX25hbWVpb3AgPT0gREVMRVRFIHx8IGNu
cC0+Y25fbmFtZWlvcCA9PSBSRU5BTUUpKSB7CgkJZXJyb3IgPSBFUk9GUzsKCQlnb3RvIG91
dDsKCX0KCgkvKgoJICogQXZvaWQgZG9pbmcgYSBsaW5lYXIgc2NhbiBvZiB0aGUgZGlyZWN0
b3J5IGlmIHRoZSByZXF1ZXN0ZWQKCSAqIGRpcmVjdG9yeS9uYW1lIGNvdXBsZSBpcyBhbHJl
YWR5IGluIHRoZSBjYWNoZS4KCSAqLwoJZXJyb3IgPSBjYWNoZV9sb29rdXAoZHZwLCB2cHAs
IGNucCk7CglpZiAoZXJyb3IgPj0gMCkgewoJCS8qIEJvdGggY2FjaGUtaGl0IG9yIGFuIGVy
cm9yIGNhc2UuICovCgkJZ290byBvdXQ7Cgl9CgoJaWYgKGNucC0+Y25fZmxhZ3MgJiBJU0RP
VERPVCkgewoJCXRtcGZzX25vZGVfdCAqcG5vZGU7CgoJCS8qCgkJICogTG9va3VwIG9mICIu
LiIgY2FzZS4KCQkgKi8KCQlpZiAobGFzdGNuICYmIGNucC0+Y25fbmFtZWlvcCA9PSBSRU5B
TUUpIHsKCQkJZXJyb3IgPSBFSU5WQUw7CgkJCWdvdG8gb3V0OwoJCX0KCQlLQVNTRVJUKGRu
b2RlLT50bl90eXBlID09IFZESVIpOwoJCXBub2RlID0gZG5vZGUtPnRuX3NwZWMudG5fZGly
LnRuX3BhcmVudDsKCQlpZiAocG5vZGUgPT0gTlVMTCkgewoJCQllcnJvciA9IEVOT0VOVDsK
CQkJZ290byBvdXQ7CgkJfQoKCQkvKgoJCSAqIExvY2sgdGhlIHBhcmVudCB0bl92bG9jayBi
ZWZvcmUgcmVsZWFzaW5nIHRoZSB2bm9kZSBsb2NrLAoJCSAqIGFuZCB0aHVzIHByZXZlbnRz
IHBhcmVudCBmcm9tIGRpc2FwcGVhcmluZy4KCQkgKi8KCQltdXRleF9lbnRlcigmcG5vZGUt
PnRuX3Zsb2NrKTsKCQlWT1BfVU5MT0NLKGR2cCwgMCk7CgoJCS8qCgkJICogR2V0IGEgdm5v
ZGUgb2YgdGhlICcuLicgZW50cnkgYW5kIHJlLWFjcXVpcmUgdGhlIGxvY2suCgkJICogUmVs
ZWFzZSB0aGUgdG5fdmxvY2suCgkJICovCgkJZXJyb3IgPSB0bXBmc192bm9kZV9nZXQoZHZw
LT52X21vdW50LCBwbm9kZSwgdnBwKTsKCQl2bl9sb2NrKGR2cCwgTEtfRVhDTFVTSVZFIHwg
TEtfUkVUUlkpOwoJCWdvdG8gb3V0OwoKCX0gZWxzZSBpZiAoY25wLT5jbl9uYW1lbGVuID09
IDEgJiYgY25wLT5jbl9uYW1lcHRyWzBdID09ICcuJykgewoJCS8qCgkJICogTG9va3VwIG9m
ICIuIiBjYXNlLgoJCSAqLwoJCWlmIChsYXN0Y24gJiYgY25wLT5jbl9uYW1laW9wID09IFJF
TkFNRSkgewoJCQllcnJvciA9IEVJU0RJUjsKCQkJZ290byBvdXQ7CgkJfQoJCXZyZWYoZHZw
KTsKCQkqdnBwID0gZHZwOwoJCWVycm9yID0gMDsKCQlnb3RvIGRvbmU7Cgl9CgoJLyoKCSAq
IE90aGVyIGxvb2t1cCBjYXNlczogcGVyZm9ybSBkaXJlY3Rvcnkgc2Nhbi4KCSAqLwoJZGUg
PSB0bXBmc19kaXJfbG9va3VwKGRub2RlLCBjbnApOwoJaWYgKGRlID09IE5VTEwgfHwgZGUt
PnRkX25vZGUgPT0gVE1QRlNfTk9ERV9XSElURU9VVCkgewoJCS8qCgkJICogVGhlIGVudHJ5
IHdhcyBub3QgZm91bmQgaW4gdGhlIGRpcmVjdG9yeS4gIFRoaXMgaXMgdmFsaWQKCQkgKiBp
ZiB3ZSBhcmUgY3JlYXRpbmcgb3IgcmVuYW1pbmcgYW4gZW50cnkgYW5kIGFyZSB3b3JraW5n
CgkJICogb24gdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBwYXRoIG5hbWUuCgkJICovCgkJ
aWYgKGxhc3RjbiAmJiAoY25wLT5jbl9uYW1laW9wID09IENSRUFURSB8fAoJCSAgICBjbnAt
PmNuX25hbWVpb3AgPT0gUkVOQU1FKSkgewoJCQllcnJvciA9IFZPUF9BQ0NFU1MoZHZwLCBW
V1JJVEUsIGNucC0+Y25fY3JlZCk7CgkJCWlmIChlcnJvcikgewoJCQkJZ290byBvdXQ7CgkJ
CX0KCQkJY25wLT5jbl9mbGFncyB8PSBTQVZFTkFNRTsKCQkJZXJyb3IgPSBFSlVTVFJFVFVS
TjsKCQl9IGVsc2UgewoJCQllcnJvciA9IEVOT0VOVDsKCQl9CgkJaWYgKGRlKSB7CgkJCUtB
U1NFUlQoZGUtPnRkX25vZGUgPT0gVE1QRlNfTk9ERV9XSElURU9VVCk7CgkJCWNucC0+Y25f
ZmxhZ3MgfD0gSVNXSElURU9VVDsKCQl9CgkJZ290byBkb25lOwoJfQoKCXRub2RlID0gZGUt
PnRkX25vZGU7CgoJLyoKCSAqIElmIGl0IGlzIG5vdCB0aGUgbGFzdCBwYXRoIGNvbXBvbmVu
dCBhbmQgZm91bmQgYSBub24tZGlyZWN0b3J5CgkgKiBvciBub24tbGluayBlbnRyeSAod2hp
Y2ggbWF5IGl0c2VsZiBiZSBwb2ludGluZyB0byBhIGRpcmVjdG9yeSksCgkgKiByYWlzZSBh
biBlcnJvci4KCSAqLwoJaWYgKCFsYXN0Y24gJiYgdG5vZGUtPnRuX3R5cGUgIT0gVkRJUiAm
JiB0bm9kZS0+dG5fdHlwZSAhPSBWTE5LKSB7CgkJZXJyb3IgPSBFTk9URElSOwoJCWdvdG8g
b3V0OwoJfQoKCS8qIENoZWNrIHRoZSBwZXJtaXNzaW9ucy4gKi8KCWlmIChsYXN0Y24gJiYg
KGNucC0+Y25fbmFtZWlvcCA9PSBERUxFVEUgfHwgY25wLT5jbl9uYW1laW9wID09IFJFTkFN
RSkpIHsKCQllcnJvciA9IFZPUF9BQ0NFU1MoZHZwLCBWV1JJVEUsIGNucC0+Y25fY3JlZCk7
CgkJaWYgKGVycm9yKQoJCQlnb3RvIG91dDsKCgkJaWYgKChkbm9kZS0+dG5fbW9kZSAmIFNf
SVNUWFQpICE9IDApIHsKCQkgIGlmIChrYXV0aF9hdXRob3JpemVfZ2VuZXJpYyhjbnAtPmNu
X2NyZWQsIEtBVVRIX0dFTkVSSUNfSVNTVVNFUiwgTlVMTCkgIT0gMCAmJgoJCSAgICAgIGth
dXRoX2NyZWRfZ2V0ZXVpZChjbnAtPmNuX2NyZWQpICE9IGRub2RlLT50bl91aWQgJiYKCQkg
ICAgICBrYXV0aF9jcmVkX2dldGV1aWQoY25wLT5jbl9jcmVkKSAhPSB0bm9kZS0+dG5fdWlk
KSB7CgkJCQllcnJvciA9IEVQRVJNOwoJCQkJZ290byBvdXQ7CgkJCX0KCQl9CgkJY25wLT5j
bl9mbGFncyB8PSBTQVZFTkFNRTsKCX0KCgkvKiBHZXQgYSB2bm9kZSBmb3IgdGhlIG1hdGNo
aW5nIGVudHJ5LiAqLwoJbXV0ZXhfZW50ZXIoJnRub2RlLT50bl92bG9jayk7CgllcnJvciA9
IHRtcGZzX3Zub2RlX2dldChkdnAtPnZfbW91bnQsIHRub2RlLCB2cHApOwpkb25lOgoJLyoK
CSAqIENhY2hlIHRoZSByZXN1bHQsIHVubGVzcyByZXF1ZXN0IHdhcyBmb3IgY3JlYXRpb24g
KGFzIGl0IGRvZXMKCSAqIG5vdCBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSkuCgkgKi8KCWlm
IChjbnAtPmNuX25hbWVpb3AgIT0gQ1JFQVRFKSB7CgkJY2FjaGVfZW50ZXIoZHZwLCAqdnBw
LCBjbnApOwoJfQpvdXQ6CglLQVNTRVJUKCgqdnBwICYmIFZPUF9JU0xPQ0tFRCgqdnBwKSkg
fHwgZXJyb3IpOwoJS0FTU0VSVChWT1BfSVNMT0NLRUQoZHZwKSk7CgoJcmV0dXJuIGVycm9y
Owp9CgppbnQKdG1wZnNfY3JlYXRlKHZvaWQgKnYpCnsKCXN0cnVjdCB2b3BfY3JlYXRlX2Fy
Z3MgLyogewoJCXN0cnVjdCB2bm9kZQkJKmFfZHZwOwoJCXN0cnVjdCB2bm9kZQkJKiphX3Zw
cDsKCQlzdHJ1Y3QgY29tcG9uZW50bmFtZQkqYV9jbnA7CgkJc3RydWN0IHZhdHRyCQkqYV92
YXA7Cgl9ICovICphcCA9IHY7Cgl2bm9kZV90ICpkdnAgPSBhcC0+YV9kdnAsICoqdnBwID0g
YXAtPmFfdnBwOwoJc3RydWN0IGNvbXBvbmVudG5hbWUgKmNucCA9IGFwLT5hX2NucDsKCXN0
cnVjdCB2YXR0ciAqdmFwID0gYXAtPmFfdmFwOwoKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKGR2
cCkpOwoJS0FTU0VSVCh2YXAtPnZhX3R5cGUgPT0gVlJFRyB8fCB2YXAtPnZhX3R5cGUgPT0g
VlNPQ0spOwoJcmV0dXJuIHRtcGZzX2FsbG9jX2ZpbGUoZHZwLCB2cHAsIHZhcCwgY25wLCBO
VUxMKTsKfQoKaW50CnRtcGZzX21rbm9kKHZvaWQgKnYpCnsKCXN0cnVjdCB2b3BfbWtub2Rf
YXJncyAvKiB7CgkJc3RydWN0IHZub2RlCQkqYV9kdnA7CgkJc3RydWN0IHZub2RlCQkqKmFf
dnBwOwoJCXN0cnVjdCBjb21wb25lbnRuYW1lCSphX2NucDsKCQlzdHJ1Y3QgdmF0dHIJCSph
X3ZhcDsKCX0gKi8gKmFwID0gdjsKCXZub2RlX3QgKmR2cCA9IGFwLT5hX2R2cCwgKip2cHAg
PSBhcC0+YV92cHA7CglzdHJ1Y3QgY29tcG9uZW50bmFtZSAqY25wID0gYXAtPmFfY25wOwoJ
c3RydWN0IHZhdHRyICp2YXAgPSBhcC0+YV92YXA7CgllbnVtIHZ0eXBlIHZ0ID0gdmFwLT52
YV90eXBlOwoKCWlmICh2dCAhPSBWQkxLICYmIHZ0ICE9IFZDSFIgJiYgdnQgIT0gVkZJRk8p
IHsKCQl2cHV0KGR2cCk7CgkJcmV0dXJuIEVJTlZBTDsKCX0KCXJldHVybiB0bXBmc19hbGxv
Y19maWxlKGR2cCwgdnBwLCB2YXAsIGNucCwgTlVMTCk7Cn0KCmludAp0bXBmc19vcGVuKHZv
aWQgKnYpCnsKCXN0cnVjdCB2b3Bfb3Blbl9hcmdzIC8qIHsKCQlzdHJ1Y3Qgdm5vZGUJKmFf
dnA7CgkJaW50CQlhX21vZGU7CgkJa2F1dGhfY3JlZF90CWFfY3JlZDsKCX0gKi8gKmFwID0g
djsKCXZub2RlX3QgKnZwID0gYXAtPmFfdnA7Cgltb2RlX3QgbW9kZSA9IGFwLT5hX21vZGU7
Cgl0bXBmc19ub2RlX3QgKm5vZGU7CgoJS0FTU0VSVChWT1BfSVNMT0NLRUQodnApKTsKCglu
b2RlID0gVlBfVE9fVE1QRlNfTk9ERSh2cCk7CglpZiAobm9kZS0+dG5fbGlua3MgPCAxKSB7
CgkJLyoKCQkgKiBUaGUgZmlsZSBpcyBzdGlsbCBhY3RpdmUsIGJ1dCBhbGwgaXRzIG5hbWVz
IGhhdmUgYmVlbgoJCSAqIHJlbW92ZWQgKGUuZy4gYnkgYSAicm1kaXIgJChwd2QpIikuICBJ
dCBjYW5ub3QgYmUgb3BlbmVkCgkJICogYW55IG1vcmUsIGFzIGl0IGlzIGFib3V0IHRvIGJl
IGRlc3Ryb3llZC4KCQkgKi8KCQlyZXR1cm4gRU5PRU5UOwoJfQoKCS8qIElmIHRoZSBmaWxl
IGlzIG1hcmtlZCBhcHBlbmQtb25seSwgZGVueSB3cml0ZSByZXF1ZXN0cy4gKi8KCWlmICgo
bm9kZS0+dG5fZmxhZ3MgJiBBUFBFTkQpICE9IDAgJiYKCSAgICAobW9kZSAmIChGV1JJVEUg
fCBPX0FQUEVORCkpID09IEZXUklURSkgewoJCXJldHVybiBFUEVSTTsKCX0KCXJldHVybiAw
Owp9CgppbnQKdG1wZnNfY2xvc2Uodm9pZCAqdikKewoJc3RydWN0IHZvcF9jbG9zZV9hcmdz
IC8qIHsKCQlzdHJ1Y3Qgdm5vZGUJKmFfdnA7CgkJaW50CQlhX2ZmbGFnOwoJCWthdXRoX2Ny
ZWRfdAlhX2NyZWQ7Cgl9ICovICphcCA9IHY7Cgl2bm9kZV90ICp2cCA9IGFwLT5hX3ZwOwoK
CUtBU1NFUlQoVk9QX0lTTE9DS0VEKHZwKSk7CgoJdG1wZnNfdXBkYXRlKHZwLCBOVUxMLCBO
VUxMLCBOVUxMLCBVUERBVEVfQ0xPU0UpOwoJcmV0dXJuIDA7Cn0KCmludAp0bXBmc19hY2Nl
c3Modm9pZCAqdikKewoJc3RydWN0IHZvcF9hY2Nlc3NfYXJncyAvKiB7CgkJc3RydWN0IHZu
b2RlCSphX3ZwOwoJCWludAkJYV9tb2RlOwoJCWthdXRoX2NyZWRfdAlhX2NyZWQ7Cgl9ICov
ICphcCA9IHY7Cgl2bm9kZV90ICp2cCA9IGFwLT5hX3ZwOwoJbW9kZV90IG1vZGUgPSBhcC0+
YV9tb2RlOwoJa2F1dGhfY3JlZF90IGNyZWQgPSBhcC0+YV9jcmVkOwoJdG1wZnNfbm9kZV90
ICpub2RlID0gVlBfVE9fVE1QRlNfTk9ERSh2cCk7Cgljb25zdCBib29sIHdyaXRpbmcgPSAo
bW9kZSAmIFZXUklURSkgIT0gMDsKCglLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkpOwoKCS8q
IFBvc3NpYmxlPyAqLwoJc3dpdGNoICh2cC0+dl90eXBlKSB7CgljYXNlIFZESVI6CgljYXNl
IFZMTks6CgljYXNlIFZSRUc6CgkJaWYgKHdyaXRpbmcgJiYgKHZwLT52X21vdW50LT5tbnRf
ZmxhZyAmIE1OVF9SRE9OTFkpICE9IDApIHsKCQkJcmV0dXJuIEVST0ZTOwoJCX0KCQlicmVh
azsKCWNhc2UgVkJMSzoKCWNhc2UgVkNIUjoKCWNhc2UgVlNPQ0s6CgljYXNlIFZGSUZPOgoJ
CWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gRUlOVkFMOwoJfQoJaWYgKHdyaXRpbmcgJiYg
KG5vZGUtPnRuX2ZsYWdzICYgSU1NVVRBQkxFKSAhPSAwKSB7CgkJcmV0dXJuIEVQRVJNOwoJ
fQoKICAgICAgIHJldHVybiB2YWNjZXNzKHZwLT52X3R5cGUsIG5vZGUtPnRuX21vZGUsIG5v
ZGUtPnRuX3VpZCwKCSAgIG5vZGUtPnRuX2dpZCwgbW9kZSwgY3JlZCk7Cn0KCmludAp0bXBm
c19nZXRhdHRyKHZvaWQgKnYpCnsKCXN0cnVjdCB2b3BfZ2V0YXR0cl9hcmdzIC8qIHsKCQlz
dHJ1Y3Qgdm5vZGUJKmFfdnA7CgkJc3RydWN0IHZhdHRyCSphX3ZhcDsKCQlrYXV0aF9jcmVk
X3QJYV9jcmVkOwoJfSAqLyAqYXAgPSB2OwoJdm5vZGVfdCAqdnAgPSBhcC0+YV92cDsKCXN0
cnVjdCB2YXR0ciAqdmFwID0gYXAtPmFfdmFwOwoJdG1wZnNfbm9kZV90ICpub2RlID0gVlBf
VE9fVE1QRlNfTk9ERSh2cCk7CgoJdmF0dHJfbnVsbCh2YXApOwoKCXRtcGZzX3VwZGF0ZSh2
cCwgTlVMTCwgTlVMTCwgTlVMTCwgMCk7CgoJdmFwLT52YV90eXBlID0gdnAtPnZfdHlwZTsK
CXZhcC0+dmFfbW9kZSA9IG5vZGUtPnRuX21vZGU7Cgl2YXAtPnZhX25saW5rID0gbm9kZS0+
dG5fbGlua3M7Cgl2YXAtPnZhX3VpZCA9IG5vZGUtPnRuX3VpZDsKCXZhcC0+dmFfZ2lkID0g
bm9kZS0+dG5fZ2lkOwoJdmFwLT52YV9mc2lkID0gdnAtPnZfbW91bnQtPm1udF9zdGF0LmZf
ZnNpZHguX19mc2lkX3ZhbFswXTsKCXZhcC0+dmFfZmlsZWlkID0gbm9kZS0+dG5faWQ7Cgl2
YXAtPnZhX3NpemUgPSBub2RlLT50bl9zaXplOwoJdmFwLT52YV9ibG9ja3NpemUgPSBQQUdF
X1NJWkU7Cgl2YXAtPnZhX2F0aW1lID0gbm9kZS0+dG5fYXRpbWU7Cgl2YXAtPnZhX210aW1l
ID0gbm9kZS0+dG5fbXRpbWU7Cgl2YXAtPnZhX2N0aW1lID0gbm9kZS0+dG5fY3RpbWU7Cgl2
YXAtPnZhX2JpcnRodGltZSA9IG5vZGUtPnRuX2JpcnRodGltZTsKCXZhcC0+dmFfZ2VuID0g
VE1QRlNfTk9ERV9HRU4obm9kZSk7Cgl2YXAtPnZhX2ZsYWdzID0gbm9kZS0+dG5fZmxhZ3M7
Cgl2YXAtPnZhX3JkZXYgPSAodnAtPnZfdHlwZSA9PSBWQkxLIHx8IHZwLT52X3R5cGUgPT0g
VkNIUikgPwoJICAgIG5vZGUtPnRuX3NwZWMudG5fZGV2LnRuX3JkZXYgOiBWTk9WQUw7Cgl2
YXAtPnZhX2J5dGVzID0gcm91bmRfcGFnZShub2RlLT50bl9zaXplKTsKCXZhcC0+dmFfZmls
ZXJldiA9IFZOT1ZBTDsKCXZhcC0+dmFfdmFmbGFncyA9IDA7Cgl2YXAtPnZhX3NwYXJlID0g
Vk5PVkFMOyAvKiBYWFggKi8KCglyZXR1cm4gMDsKfQoKI2RlZmluZSBHT09EVElNRSh0dikJ
KCh0diktPnR2X3NlYyAhPSBWTk9WQUwgfHwgKHR2KS0+dHZfbnNlYyAhPSBWTk9WQUwpCi8q
IFhYWCBTaG91bGQgdGhpcyBvcGVyYXRpb24gYmUgYXRvbWljPyAgSSB0aGluayBpdCBzaG91
bGQsIGJ1dCBjb2RlIGluCiAqIFhYWCBvdGhlciBwbGFjZXMgKGUuZy4sIHVmcykgZG9lc24n
dCBzZWVtIHRvIGJlLi4uICovCmludAp0bXBmc19zZXRhdHRyKHZvaWQgKnYpCnsKCXN0cnVj
dCB2b3Bfc2V0YXR0cl9hcmdzIC8qIHsKCQlzdHJ1Y3Qgdm5vZGUJKmFfdnA7CgkJc3RydWN0
IHZhdHRyCSphX3ZhcDsKCQlrYXV0aF9jcmVkX3QJYV9jcmVkOwoJfSAqLyAqYXAgPSB2OwoJ
dm5vZGVfdCAqdnAgPSBhcC0+YV92cDsKCXN0cnVjdCB2YXR0ciAqdmFwID0gYXAtPmFfdmFw
OwoJa2F1dGhfY3JlZF90IGNyZWQgPSBhcC0+YV9jcmVkOwoJbHdwX3QgKmwgPSBjdXJsd3A7
CglpbnQgZXJyb3IgPSAwOwoKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKHZwKSk7CgoJLyogQWJv
cnQgaWYgYW55IHVuc2V0dGFibGUgYXR0cmlidXRlIGlzIGdpdmVuLiAqLwoJaWYgKHZhcC0+
dmFfdHlwZSAhPSBWTk9OIHx8IHZhcC0+dmFfbmxpbmsgIT0gVk5PVkFMIHx8CgkgICAgdmFw
LT52YV9mc2lkICE9IFZOT1ZBTCB8fCB2YXAtPnZhX2ZpbGVpZCAhPSBWTk9WQUwgfHwKCSAg
ICB2YXAtPnZhX2Jsb2Nrc2l6ZSAhPSBWTk9WQUwgfHwgR09PRFRJTUUoJnZhcC0+dmFfY3Rp
bWUpIHx8CgkgICAgdmFwLT52YV9nZW4gIT0gVk5PVkFMIHx8IHZhcC0+dmFfcmRldiAhPSBW
Tk9WQUwgfHwKCSAgICB2YXAtPnZhX2J5dGVzICE9IFZOT1ZBTCkgewoJCXJldHVybiBFSU5W
QUw7Cgl9CglpZiAoZXJyb3IgPT0gMCAmJiAodmFwLT52YV9mbGFncyAhPSBWTk9WQUwpKQoJ
CWVycm9yID0gdG1wZnNfY2hmbGFncyh2cCwgdmFwLT52YV9mbGFncywgY3JlZCwgbCk7CgoJ
aWYgKGVycm9yID09IDAgJiYgKHZhcC0+dmFfc2l6ZSAhPSBWTk9WQUwpKQoJCWVycm9yID0g
dG1wZnNfY2hzaXplKHZwLCB2YXAtPnZhX3NpemUsIGNyZWQsIGwpOwoKCWlmIChlcnJvciA9
PSAwICYmICh2YXAtPnZhX3VpZCAhPSBWTk9WQUwgfHwgdmFwLT52YV9naWQgIT0gVk5PVkFM
KSkKCQllcnJvciA9IHRtcGZzX2Nob3duKHZwLCB2YXAtPnZhX3VpZCwgdmFwLT52YV9naWQs
IGNyZWQsIGwpOwoKCWlmIChlcnJvciA9PSAwICYmICh2YXAtPnZhX21vZGUgIT0gVk5PVkFM
KSkKCQllcnJvciA9IHRtcGZzX2NobW9kKHZwLCB2YXAtPnZhX21vZGUsIGNyZWQsIGwpOwoK
CWlmIChlcnJvciA9PSAwICYmIChHT09EVElNRSgmdmFwLT52YV9hdGltZSkgfHwgR09PRFRJ
TUUoJnZhcC0+dmFfbXRpbWUpCgkgICAgfHwgR09PRFRJTUUoJnZhcC0+dmFfYmlydGh0aW1l
KSkpIHsKCQllcnJvciA9IHRtcGZzX2NodGltZXModnAsICZ2YXAtPnZhX2F0aW1lLCAmdmFw
LT52YV9tdGltZSwKCQkgICAgJnZhcC0+dmFfYmlydGh0aW1lLCB2YXAtPnZhX3ZhZmxhZ3Ms
IGNyZWQsIGwpOwoJCWlmIChlcnJvciA9PSAwKQoJCQlyZXR1cm4gMDsKCX0KCXRtcGZzX3Vw
ZGF0ZSh2cCwgTlVMTCwgTlVMTCwgTlVMTCwgMCk7CglyZXR1cm4gZXJyb3I7Cn0KCmludAp0
bXBmc19yZWFkKHZvaWQgKnYpCnsKCXN0cnVjdCB2b3BfcmVhZF9hcmdzIC8qIHsKCQlzdHJ1
Y3Qgdm5vZGUgKmFfdnA7CgkJc3RydWN0IHVpbyAqYV91aW87CgkJaW50IGFfaW9mbGFnOwoJ
CWthdXRoX2NyZWRfdCBhX2NyZWQ7Cgl9ICovICphcCA9IHY7Cgl2bm9kZV90ICp2cCA9IGFw
LT5hX3ZwOwoJc3RydWN0IHVpbyAqdWlvID0gYXAtPmFfdWlvOwoJY29uc3QgaW50IGlvZmxh
ZyA9IGFwLT5hX2lvZmxhZzsKCXRtcGZzX25vZGVfdCAqbm9kZTsKCXN0cnVjdCB1dm1fb2Jq
ZWN0ICp1b2JqOwoJaW50IGVycm9yOwoKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKHZwKSk7CgoJ
aWYgKHZwLT52X3R5cGUgIT0gVlJFRykgewoJCXJldHVybiBFSVNESVI7Cgl9CglpZiAodWlv
LT51aW9fb2Zmc2V0IDwgMCkgewoJCXJldHVybiBFSU5WQUw7Cgl9CgoJbm9kZSA9IFZQX1RP
X1RNUEZTX05PREUodnApOwoJbm9kZS0+dG5fc3RhdHVzIHw9IFRNUEZTX05PREVfQUNDRVNT
RUQ7Cgl1b2JqID0gbm9kZS0+dG5fc3BlYy50bl9yZWcudG5fYW9iajsKCWVycm9yID0gMDsK
Cgl3aGlsZSAoZXJyb3IgPT0gMCAmJiB1aW8tPnVpb19yZXNpZCA+IDApIHsKCQl2c2l6ZV90
IGxlbjsKCgkJaWYgKG5vZGUtPnRuX3NpemUgPD0gdWlvLT51aW9fb2Zmc2V0KSB7CgkJCWJy
ZWFrOwoJCX0KCQlsZW4gPSBNSU4obm9kZS0+dG5fc2l6ZSAtIHVpby0+dWlvX29mZnNldCwg
dWlvLT51aW9fcmVzaWQpOwoJCWlmIChsZW4gPT0gMCkgewoJCQlicmVhazsKCQl9CiNpZm5k
ZWYgVUJDX1VOTUFQX0ZMQUcKI2RlZmluZSBVQkNfVU5NQVBfRkxBRyh2cCkgKFVCQ19XQU5U
X1VOTUFQKHZwKSA/IFVCQ19VTk1BUCA6IDApCiNlbmRpZgoJCWVycm9yID0gdWJjX3Vpb21v
dmUodW9iaiwgdWlvLCBsZW4sIElPX0FEVl9ERUNPREUoaW9mbGFnKSwKCQkgICAgVUJDX1JF
QUQgfCBVQkNfUEFSVElBTE9LIHwgVUJDX1VOTUFQX0ZMQUcodnApKTsKCX0KCXJldHVybiBl
cnJvcjsKfQoKaW50CnRtcGZzX3dyaXRlKHZvaWQgKnYpCnsKCXN0cnVjdCB2b3Bfd3JpdGVf
YXJncyAvKiB7CgkJc3RydWN0IHZub2RlCSphX3ZwOwoJCXN0cnVjdCB1aW8JKmFfdWlvOwoJ
CWludAkJYV9pb2ZsYWc7CgkJa2F1dGhfY3JlZF90CWFfY3JlZDsKCX0gKi8gKmFwID0gdjsK
CXZub2RlX3QgKnZwID0gYXAtPmFfdnA7CglzdHJ1Y3QgdWlvICp1aW8gPSBhcC0+YV91aW87
Cgljb25zdCBpbnQgaW9mbGFnID0gYXAtPmFfaW9mbGFnOwoJdG1wZnNfbm9kZV90ICpub2Rl
OwoJc3RydWN0IHV2bV9vYmplY3QgKnVvYmo7CglvZmZfdCBvbGRzaXplOwoJYm9vbCBleHRl
bmRlZDsKCWludCBlcnJvcjsKCglLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkpOwoKCW5vZGUg
PSBWUF9UT19UTVBGU19OT0RFKHZwKTsKCW9sZHNpemUgPSBub2RlLT50bl9zaXplOwoKCWlm
ICh1aW8tPnVpb19vZmZzZXQgPCAwIHx8IHZwLT52X3R5cGUgIT0gVlJFRykgewoJCWVycm9y
ID0gRUlOVkFMOwoJCWdvdG8gb3V0OwoJfQoJaWYgKHVpby0+dWlvX3Jlc2lkID09IDApIHsK
CQllcnJvciA9IDA7CgkJZ290byBvdXQ7Cgl9CglpZiAoaW9mbGFnICYgSU9fQVBQRU5EKSB7
CgkJdWlvLT51aW9fb2Zmc2V0ID0gbm9kZS0+dG5fc2l6ZTsKCX0KCglleHRlbmRlZCA9IHVp
by0+dWlvX29mZnNldCArIHVpby0+dWlvX3Jlc2lkID4gbm9kZS0+dG5fc2l6ZTsKCWlmIChl
eHRlbmRlZCkgewoJCWVycm9yID0gdG1wZnNfcmVnX3Jlc2l6ZSh2cCwgdWlvLT51aW9fb2Zm
c2V0ICsgdWlvLT51aW9fcmVzaWQpOwoJCWlmIChlcnJvcikKCQkJZ290byBvdXQ7Cgl9CgoJ
dW9iaiA9IG5vZGUtPnRuX3NwZWMudG5fcmVnLnRuX2FvYmo7CgllcnJvciA9IDA7Cgl3aGls
ZSAoZXJyb3IgPT0gMCAmJiB1aW8tPnVpb19yZXNpZCA+IDApIHsKCQl2c2l6ZV90IGxlbjsK
CgkJbGVuID0gTUlOKG5vZGUtPnRuX3NpemUgLSB1aW8tPnVpb19vZmZzZXQsIHVpby0+dWlv
X3Jlc2lkKTsKCQlpZiAobGVuID09IDApIHsKCQkJYnJlYWs7CgkJfQoJCWVycm9yID0gdWJj
X3Vpb21vdmUodW9iaiwgdWlvLCBsZW4sIElPX0FEVl9ERUNPREUoaW9mbGFnKSwKCQkgICAg
VUJDX1dSSVRFIHwgVUJDX1VOTUFQX0ZMQUcodnApKTsKCX0KCWlmIChlcnJvcikgewoJCSh2
b2lkKXRtcGZzX3JlZ19yZXNpemUodnAsIG9sZHNpemUpOwoJfQoKCW5vZGUtPnRuX3N0YXR1
cyB8PSBUTVBGU19OT0RFX0FDQ0VTU0VEIHwgVE1QRlNfTk9ERV9NT0RJRklFRCB8CgkgICAg
KGV4dGVuZGVkID8gVE1QRlNfTk9ERV9DSEFOR0VEIDogMCk7CglWTl9LTk9URSh2cCwgTk9U
RV9XUklURSk7Cm91dDoKCWlmIChlcnJvcikgewoJCUtBU1NFUlQob2xkc2l6ZSA9PSBub2Rl
LT50bl9zaXplKTsKCX0gZWxzZSB7CgkJS0FTU0VSVCh1aW8tPnVpb19yZXNpZCA9PSAwKTsK
CX0KCXJldHVybiBlcnJvcjsKfQoKaW50CnRtcGZzX2ZzeW5jKHZvaWQgKnYpCnsKCXN0cnVj
dCB2b3BfZnN5bmNfYXJncyAvKiB7CgkJc3RydWN0IHZub2RlICphX3ZwOwoJCWthdXRoX2Ny
ZWRfdCBhX2NyZWQ7CgkJaW50IGFfZmxhZ3M7CgkJb2ZmX3QgYV9vZmZsbzsKCQlvZmZfdCBh
X29mZmhpOwoJCXN0cnVjdCBsd3AgKmFfbDsKCX0gKi8gKmFwID0gdjsKCXZub2RlX3QgKnZw
ID0gYXAtPmFfdnA7CgoJLyogTm90aGluZyB0byBkby4gIEp1c3QgdXBkYXRlLiAqLwoJS0FT
U0VSVChWT1BfSVNMT0NLRUQodnApKTsKCXRtcGZzX3VwZGF0ZSh2cCwgTlVMTCwgTlVMTCwg
TlVMTCwgMCk7CglyZXR1cm4gMDsKfQoKLyoKICogdG1wZnNfcmVtb3ZlOiB1bmxpbmsgYSBm
aWxlLgogKgogKiA9PiBCb3RoIGRpcmVjdG9yeSAoZHZwKSBhbmQgZmlsZSAodnApIGFyZSBs
b2NrZWQuCiAqID0+IFdlIHVubG9jayBhbmQgZHJvcCB0aGUgcmVmZXJlbmNlIG9uIGJvdGgu
CiAqLwppbnQKdG1wZnNfcmVtb3ZlKHZvaWQgKnYpCnsKCXN0cnVjdCB2b3BfcmVtb3ZlX2Fy
Z3MgLyogewoJCXN0cnVjdCB2bm9kZSAqYV9kdnA7CgkJc3RydWN0IHZub2RlICphX3ZwOwoJ
CXN0cnVjdCBjb21wb25lbnRuYW1lICphX2NucDsKCX0gKi8gKmFwID0gdjsKCXZub2RlX3Qg
KmR2cCA9IGFwLT5hX2R2cCwgKnZwID0gYXAtPmFfdnA7Cgl0bXBmc19ub2RlX3QgKm5vZGU7
Cgl0bXBmc19kaXJlbnRfdCAqZGU7CglpbnQgZXJyb3I7CgoJS0FTU0VSVChWT1BfSVNMT0NL
RUQoZHZwKSk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkpOwoKCWlmICh2cC0+dl90eXBl
ID09IFZESVIpIHsKCQllcnJvciA9IEVQRVJNOwoJCWdvdG8gb3V0OwoJfQoJbm9kZSA9IFZQ
X1RPX1RNUEZTX05PREUodnApOwoKCS8qIEZpbGVzIG1hcmtlZCBhcyBpbW11dGFibGUgb3Ig
YXBwZW5kLW9ubHkgY2Fubm90IGJlIGRlbGV0ZWQuICovCglpZiAobm9kZS0+dG5fZmxhZ3Mg
JiAoSU1NVVRBQkxFIHwgQVBQRU5EKSkgewoJCWVycm9yID0gRVBFUk07CgkJZ290byBvdXQ7
Cgl9CgoJLyogTG9va3VwIHRoZSBkaXJlY3RvcnkgZW50cnkgKGNoZWNrIHRoZSBjYWNoZWQg
aGludCBmaXJzdCkuICovCglkZSA9IHRtcGZzX2Rpcl9jYWNoZWQobm9kZSk7CglpZiAoZGUg
PT0gTlVMTCkgewoJCXRtcGZzX25vZGVfdCAqZG5vZGUgPSBWUF9UT19UTVBGU19ESVIoZHZw
KTsKCQlzdHJ1Y3QgY29tcG9uZW50bmFtZSAqY25wID0gYXAtPmFfY25wOwoJCWRlID0gdG1w
ZnNfZGlyX2xvb2t1cChkbm9kZSwgY25wKTsKCX0KCUtBU1NFUlQoZGUgJiYgZGUtPnRkX25v
ZGUgPT0gbm9kZSk7CgoJLyoKCSAqIFJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgZGlyZWN0
b3J5IChkcm9wcyB0aGUgbGluayBjb3VudCkgYW5kCgkgKiBkZXN0cm95IGl0IG9yIHJlcGxh
Y2UgaXQgd2l0aCBhIHdoaXRlb3V0LgoJICogTm90ZTogdGhlIGlub2RlIHJlZmVycmVkIGJ5
IGl0IHdpbGwgbm90IGJlIGRlc3Ryb3llZAoJICogdW50aWwgdGhlIHZub2RlIGlzIHJlY2xh
aW1lZC9yZWN5Y2xlZC4KCSAqLwoJdG1wZnNfZGlyX2RldGFjaChkdnAsIGRlKTsKCWlmIChh
cC0+YV9jbnAtPmNuX2ZsYWdzICYgRE9XSElURU9VVCkKCQl0bXBmc19kaXJfYXR0YWNoKGR2
cCwgZGUsIFRNUEZTX05PREVfV0hJVEVPVVQpOwoJZWxzZQoJCXRtcGZzX2ZyZWVfZGlyZW50
KFZGU19UT19UTVBGUyh2cC0+dl9tb3VudCksIGRlKTsKCWVycm9yID0gMDsKb3V0OgoJLyog
RHJvcCB0aGUgcmVmZXJlbmNlcyBhbmQgdW5sb2NrIHRoZSB2bm9kZXMuICovCgl2cHV0KHZw
KTsKCWlmIChkdnAgPT0gdnApIHsKCQl2cmVsZShkdnApOwoJfSBlbHNlIHsKCQl2cHV0KGR2
cCk7Cgl9CglyZXR1cm4gZXJyb3I7Cn0KCi8qCiAqIHRtcGZzX2xpbms6IGNyZWF0ZSBhIGhh
cmQgbGluay4KICovCmludAp0bXBmc19saW5rKHZvaWQgKnYpCnsKCXN0cnVjdCB2b3BfbGlu
a19hcmdzIC8qIHsKCQlzdHJ1Y3Qgdm5vZGUgKmFfZHZwOwoJCXN0cnVjdCB2bm9kZSAqYV92
cDsKCQlzdHJ1Y3QgY29tcG9uZW50bmFtZSAqYV9jbnA7Cgl9ICovICphcCA9IHY7Cgl2bm9k
ZV90ICpkdnAgPSBhcC0+YV9kdnA7Cgl2bm9kZV90ICp2cCA9IGFwLT5hX3ZwOwoJc3RydWN0
IGNvbXBvbmVudG5hbWUgKmNucCA9IGFwLT5hX2NucDsKCXRtcGZzX25vZGVfdCAqZG5vZGUs
ICpub2RlOwoJdG1wZnNfZGlyZW50X3QgKmRlOwoJaW50IGVycm9yOwoKCUtBU1NFUlQoZHZw
ICE9IHZwKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKGR2cCkpOwoJS0FTU0VSVCh2cC0+dl90
eXBlICE9IFZESVIpOwoJS0FTU0VSVChkdnAtPnZfbW91bnQgPT0gdnAtPnZfbW91bnQpOwoK
CWRub2RlID0gVlBfVE9fVE1QRlNfRElSKGR2cCk7Cglub2RlID0gVlBfVE9fVE1QRlNfTk9E
RSh2cCk7CgoJdm5fbG9jayh2cCwgTEtfRVhDTFVTSVZFIHwgTEtfUkVUUlkpOwoKCS8qIENo
ZWNrIGZvciBtYXhpbXVtIG51bWJlciBvZiBsaW5rcyBsaW1pdC4gKi8KCWlmIChub2RlLT50
bl9saW5rcyA9PSBMSU5LX01BWCkgewoJCWVycm9yID0gRU1MSU5LOwoJCWdvdG8gb3V0OwoJ
fQoJS0FTU0VSVChub2RlLT50bl9saW5rcyA8IExJTktfTUFYKTsKCgkvKiBXZSBjYW5ub3Qg
Y3JlYXRlIGxpbmtzIG9mIGZpbGVzIG1hcmtlZCBpbW11dGFibGUgb3IgYXBwZW5kLW9ubHku
ICovCglpZiAobm9kZS0+dG5fZmxhZ3MgJiAoSU1NVVRBQkxFIHwgQVBQRU5EKSkgewoJCWVy
cm9yID0gRVBFUk07CgkJZ290byBvdXQ7Cgl9CgoJLyogQWxsb2NhdGUgYSBuZXcgZGlyZWN0
b3J5IGVudHJ5IHRvIHJlcHJlc2VudCB0aGUgaW5vZGUuICovCgllcnJvciA9IHRtcGZzX2Fs
bG9jX2RpcmVudChWRlNfVE9fVE1QRlModnAtPnZfbW91bnQpLAoJICAgIGNucC0+Y25fbmFt
ZXB0ciwgY25wLT5jbl9uYW1lbGVuLCAmZGUpOwoJaWYgKGVycm9yKSB7CgkJZ290byBvdXQ7
Cgl9CgoJLyogCgkgKiBJbnNlcnQgdGhlIGVudHJ5IGludG8gdGhlIGRpcmVjdG9yeS4KCSAq
IEl0IHdpbGwgaW5jcmVhc2UgdGhlIGlub2RlIGxpbmsgY291bnQuCgkgKi8KCXRtcGZzX2Rp
cl9hdHRhY2goZHZwLCBkZSwgbm9kZSk7CgoJLyogVXBkYXRlIHRoZSB0aW1lc3RhbXBzIGFu
ZCB0cmlnZ2VyIHRoZSBldmVudC4gKi8KCWlmIChub2RlLT50bl92bm9kZSkgewoJCVZOX0tO
T1RFKG5vZGUtPnRuX3Zub2RlLCBOT1RFX0xJTkspOwoJfQoJbm9kZS0+dG5fc3RhdHVzIHw9
IFRNUEZTX05PREVfQ0hBTkdFRDsKCXRtcGZzX3VwZGF0ZSh2cCwgTlVMTCwgTlVMTCwgTlVM
TCwgMCk7CgllcnJvciA9IDA7Cm91dDoKCVZPUF9VTkxPQ0sodnAsIDApOwoJdnB1dChkdnAp
OwoJcmV0dXJuIGVycm9yOwp9CgppbnQKdG1wZnNfbWtkaXIodm9pZCAqdikKewoJc3RydWN0
IHZvcF9ta2Rpcl9hcmdzIC8qIHsKCQlzdHJ1Y3Qgdm5vZGUJCSphX2R2cDsKCQlzdHJ1Y3Qg
dm5vZGUJCSoqYV92cHA7CgkJc3RydWN0IGNvbXBvbmVudG5hbWUJKmFfY25wOwoJCXN0cnVj
dCB2YXR0cgkJKmFfdmFwOwoJfSAqLyAqYXAgPSB2OwoJdm5vZGVfdCAqZHZwID0gYXAtPmFf
ZHZwOwoJdm5vZGVfdCAqKnZwcCA9IGFwLT5hX3ZwcDsKCXN0cnVjdCBjb21wb25lbnRuYW1l
ICpjbnAgPSBhcC0+YV9jbnA7CglzdHJ1Y3QgdmF0dHIgKnZhcCA9IGFwLT5hX3ZhcDsKCglL
QVNTRVJUKHZhcC0+dmFfdHlwZSA9PSBWRElSKTsKCXJldHVybiB0bXBmc19hbGxvY19maWxl
KGR2cCwgdnBwLCB2YXAsIGNucCwgTlVMTCk7Cn0KCmludAp0bXBmc19ybWRpcih2b2lkICp2
KQp7CglzdHJ1Y3Qgdm9wX3JtZGlyX2FyZ3MgLyogewoJCXN0cnVjdCB2bm9kZQkJKmFfZHZw
OwoJCXN0cnVjdCB2bm9kZQkJKmFfdnA7CgkJc3RydWN0IGNvbXBvbmVudG5hbWUJKmFfY25w
OwoJfSAqLyAqYXAgPSB2OwoJdm5vZGVfdCAqZHZwID0gYXAtPmFfZHZwOwoJdm5vZGVfdCAq
dnAgPSBhcC0+YV92cDsKCXRtcGZzX21vdW50X3QgKnRtcCA9IFZGU19UT19UTVBGUyhkdnAt
PnZfbW91bnQpOwoJdG1wZnNfbm9kZV90ICpkbm9kZSA9IFZQX1RPX1RNUEZTX0RJUihkdnAp
OwoJdG1wZnNfbm9kZV90ICpub2RlID0gVlBfVE9fVE1QRlNfRElSKHZwKTsKCXRtcGZzX2Rp
cmVudF90ICpkZTsKCWludCBlcnJvciA9IDA7CgoJS0FTU0VSVChWT1BfSVNMT0NLRUQoZHZw
KSk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkpOwoJS0FTU0VSVChub2RlLT50bl9zcGVj
LnRuX2Rpci50bl9wYXJlbnQgPT0gZG5vZGUpOwoKCS8qCgkgKiBEaXJlY3RvcmllcyB3aXRo
IG1vcmUgdGhhbiB0d28gbm9uLXdoaXRlb3V0CgkgKiBlbnRyaWVzICgnLicgYW5kICcuLicp
IGNhbm5vdCBiZSByZW1vdmVkLgoJICovCglpZiAobm9kZS0+dG5fc2l6ZSA+IDApIHsKCQlL
QVNTRVJUKGVycm9yID09IDApOwoJCVRBSUxRX0ZPUkVBQ0goZGUsICZub2RlLT50bl9zcGVj
LnRuX2Rpci50bl9kaXIsIHRkX2VudHJpZXMpIHsKCQkJaWYgKGRlLT50ZF9ub2RlICE9IFRN
UEZTX05PREVfV0hJVEVPVVQpIHsKCQkJCWVycm9yID0gRU5PVEVNUFRZOwoJCQkJYnJlYWs7
CgkJCX0KCQl9CgkJaWYgKGVycm9yKQoJCQlnb3RvIG91dDsKCX0KCgkvKiBMb29rdXAgdGhl
IGRpcmVjdG9yeSBlbnRyeSAoY2hlY2sgdGhlIGNhY2hlZCBoaW50IGZpcnN0KS4gKi8KCWRl
ID0gdG1wZnNfZGlyX2NhY2hlZChub2RlKTsKCWlmIChkZSA9PSBOVUxMKSB7CgkJc3RydWN0
IGNvbXBvbmVudG5hbWUgKmNucCA9IGFwLT5hX2NucDsKCQlkZSA9IHRtcGZzX2Rpcl9sb29r
dXAoZG5vZGUsIGNucCk7Cgl9CglLQVNTRVJUKGRlICYmIGRlLT50ZF9ub2RlID09IG5vZGUp
OwoKCS8qIENoZWNrIGZsYWdzIHRvIHNlZSBpZiB3ZSBhcmUgYWxsb3dlZCB0byByZW1vdmUg
dGhlIGRpcmVjdG9yeS4gKi8KCWlmIChkbm9kZS0+dG5fZmxhZ3MgJiBBUFBFTkQgfHwgbm9k
ZS0+dG5fZmxhZ3MgJiAoSU1NVVRBQkxFIHwgQVBQRU5EKSkgewoJCWVycm9yID0gRVBFUk07
CgkJZ290byBvdXQ7Cgl9CgoJLyogRGVjcmVtZW50IHRoZSBsaW5rIGNvdW50IGZvciB0aGUg
dmlydHVhbCAnLicgZW50cnkuICovCglub2RlLT50bl9saW5rcy0tOwoJbm9kZS0+dG5fc3Rh
dHVzIHw9IFRNUEZTX05PREVfU1RBVFVTQUxMOwoKCS8qIERldGFjaCB0aGUgZGlyZWN0b3J5
IGVudHJ5IGZyb20gdGhlIGRpcmVjdG9yeS4gKi8KCXRtcGZzX2Rpcl9kZXRhY2goZHZwLCBk
ZSk7CgoJLyogUHVyZ2UgdGhlIGNhY2hlIGZvciBwYXJlbnQuICovCgljYWNoZV9wdXJnZShk
dnApOwoKCS8qCgkgKiBEZXN0cm95IHRoZSBkaXJlY3RvcnkgZW50cnkgb3IgcmVwbGFjZSBp
dCB3aXRoIGEgd2hpdGVvdXQuCgkgKiBOb3RlOiB0aGUgaW5vZGUgcmVmZXJyZWQgYnkgaXQg
d2lsbCBub3QgYmUgZGVzdHJveWVkCgkgKiB1bnRpbCB0aGUgdm5vZGUgaXMgcmVjbGFpbWVk
LgoJICovCglpZiAoYXAtPmFfY25wLT5jbl9mbGFncyAmIERPV0hJVEVPVVQpCgkJdG1wZnNf
ZGlyX2F0dGFjaChkdnAsIGRlLCBUTVBGU19OT0RFX1dISVRFT1VUKTsKCWVsc2UKCQl0bXBm
c19mcmVlX2RpcmVudCh0bXAsIGRlKTsKCgkvKiBEZXN0cm95IHRoZSB3aGl0ZW91dCBlbnRy
aWVzIGZyb20gdGhlIG5vZGUuICovCgl3aGlsZSAoKGRlID0gVEFJTFFfRklSU1QoJm5vZGUt
PnRuX3NwZWMudG5fZGlyLnRuX2RpcikpICE9IE5VTEwpIHsKCQlLQVNTRVJUKGRlLT50ZF9u
b2RlID09IFRNUEZTX05PREVfV0hJVEVPVVQpOwoJCXRtcGZzX2Rpcl9kZXRhY2godnAsIGRl
KTsKCQl0bXBmc19mcmVlX2RpcmVudCh0bXAsIGRlKTsKCX0KCglLQVNTRVJUKG5vZGUtPnRu
X2xpbmtzID09IDApOwpvdXQ6CgkvKiBSZWxlYXNlIHRoZSBub2Rlcy4gKi8KCXZwdXQoZHZw
KTsKCXZwdXQodnApOwoJcmV0dXJuIGVycm9yOwp9CgppbnQKdG1wZnNfc3ltbGluayh2b2lk
ICp2KQp7CglzdHJ1Y3Qgdm9wX3N5bWxpbmtfYXJncyAvKiB7CgkJc3RydWN0IHZub2RlCQkq
YV9kdnA7CgkJc3RydWN0IHZub2RlCQkqKmFfdnBwOwoJCXN0cnVjdCBjb21wb25lbnRuYW1l
CSphX2NucDsKCQlzdHJ1Y3QgdmF0dHIJCSphX3ZhcDsKCQljaGFyCQkJKmFfdGFyZ2V0OwoJ
fSAqLyAqYXAgPSB2OwoJdm5vZGVfdCAqZHZwID0gYXAtPmFfZHZwOwoJdm5vZGVfdCAqKnZw
cCA9IGFwLT5hX3ZwcDsKCXN0cnVjdCBjb21wb25lbnRuYW1lICpjbnAgPSBhcC0+YV9jbnA7
CglzdHJ1Y3QgdmF0dHIgKnZhcCA9IGFwLT5hX3ZhcDsKCWNoYXIgKnRhcmdldCA9IGFwLT5h
X3RhcmdldDsKCglLQVNTRVJUKHZhcC0+dmFfdHlwZSA9PSBWTE5LKTsKCXJldHVybiB0bXBm
c19hbGxvY19maWxlKGR2cCwgdnBwLCB2YXAsIGNucCwgdGFyZ2V0KTsKfQoKaW50CnRtcGZz
X3JlYWRkaXIodm9pZCAqdikKewoJc3RydWN0IHZvcF9yZWFkZGlyX2FyZ3MgLyogewoJCXN0
cnVjdCB2bm9kZQkqYV92cDsKCQlzdHJ1Y3QgdWlvCSphX3VpbzsKCQlrYXV0aF9jcmVkX3QJ
YV9jcmVkOwoJCWludAkJKmFfZW9mZmxhZzsKCQlvZmZfdAkJKiphX2Nvb2tpZXM7CgkJaW50
CQkqbmNvb2tpZXM7Cgl9ICovICphcCA9IHY7Cgl2bm9kZV90ICp2cCA9IGFwLT5hX3ZwOwoJ
c3RydWN0IHVpbyAqdWlvID0gYXAtPmFfdWlvOwoJaW50ICplb2ZmbGFnID0gYXAtPmFfZW9m
ZmxhZzsKCW9mZl90ICoqY29va2llcyA9IGFwLT5hX2Nvb2tpZXM7CglpbnQgKm5jb29raWVz
ID0gYXAtPmFfbmNvb2tpZXM7CglvZmZfdCBzdGFydG9mZiwgY250OwoJdG1wZnNfbm9kZV90
ICpub2RlOwoJaW50IGVycm9yOwoKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKHZwKSk7CgoJLyog
VGhpcyBvcGVyYXRpb24gb25seSBtYWtlcyBzZW5zZSBvbiBkaXJlY3Rvcnkgbm9kZXMuICov
CglpZiAodnAtPnZfdHlwZSAhPSBWRElSKSB7CgkJcmV0dXJuIEVOT1RESVI7Cgl9Cglub2Rl
ID0gVlBfVE9fVE1QRlNfRElSKHZwKTsKCXN0YXJ0b2ZmID0gdWlvLT51aW9fb2Zmc2V0OwoJ
Y250ID0gMDsKCWlmIChub2RlLT50bl9saW5rcyA9PSAwKSB7CgkJZXJyb3IgPSAwOwoJCWdv
dG8gb3V0OwoJfQoKCWlmICh1aW8tPnVpb19vZmZzZXQgPT0gVE1QRlNfRElSQ09PS0lFX0RP
VCkgewoJCWVycm9yID0gdG1wZnNfZGlyX2dldGRvdGRlbnQobm9kZSwgdWlvKTsKCQlpZiAo
ZXJyb3IgIT0gMCkgewoJCQlpZiAoZXJyb3IgPT0gLTEpCgkJCQllcnJvciA9IDA7CgkJCWdv
dG8gb3V0OwoJCX0KCQljbnQrKzsKCX0KCWlmICh1aW8tPnVpb19vZmZzZXQgPT0gVE1QRlNf
RElSQ09PS0lFX0RPVERPVCkgewoJCWVycm9yID0gdG1wZnNfZGlyX2dldGRvdGRvdGRlbnQo
bm9kZSwgdWlvKTsKCQlpZiAoZXJyb3IgIT0gMCkgewoJCQlpZiAoZXJyb3IgPT0gLTEpCgkJ
CQllcnJvciA9IDA7CgkJCWdvdG8gb3V0OwoJCX0KCQljbnQrKzsKCX0KCWVycm9yID0gdG1w
ZnNfZGlyX2dldGRlbnRzKG5vZGUsIHVpbywgJmNudCk7CglpZiAoZXJyb3IgPT0gLTEpIHsK
CQllcnJvciA9IDA7Cgl9CglLQVNTRVJUKGVycm9yID49IDApOwpvdXQ6CglpZiAoZW9mZmxh
ZyAhPSBOVUxMKSB7CgkJKmVvZmZsYWcgPSAoIWVycm9yICYmIHVpby0+dWlvX29mZnNldCA9
PSBUTVBGU19ESVJDT09LSUVfRU9GKTsKCX0KCWlmIChlcnJvciB8fCBjb29raWVzID09IE5V
TEwgfHwgbmNvb2tpZXMgPT0gTlVMTCkgewoJCXJldHVybiBlcnJvcjsKCX0KCgkvKiBVcGRh
dGUgTkZTLXJlbGF0ZWQgdmFyaWFibGVzLCBpZiBhbnkuICovCglvZmZfdCBpLCBvZmYgPSBz
dGFydG9mZjsKCXRtcGZzX2RpcmVudF90ICpkZSA9IE5VTEw7CgoJKmNvb2tpZXMgPSBtYWxs
b2MoY250ICogc2l6ZW9mKG9mZl90KSwgTV9URU1QLCBNX1dBSVRPSyk7CgkqbmNvb2tpZXMg
PSBjbnQ7CgoJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CgkJS0FTU0VSVChvZmYgIT0g
VE1QRlNfRElSQ09PS0lFX0VPRik7CgkJaWYgKG9mZiAhPSBUTVBGU19ESVJDT09LSUVfRE9U
KSB7CgkJCWlmIChvZmYgPT0gVE1QRlNfRElSQ09PS0lFX0RPVERPVCkgewoJCQkJZGUgPSBU
QUlMUV9GSVJTVCgmbm9kZS0+dG5fc3BlYy50bl9kaXIudG5fZGlyKTsKCQkJfSBlbHNlIGlm
IChkZSAhPSBOVUxMKSB7CgkJCQlkZSA9IFRBSUxRX05FWFQoZGUsIHRkX2VudHJpZXMpOwoJ
CQl9IGVsc2UgewoJCQkJZGUgPSB0bXBmc19kaXJfbG9va3VwYnljb29raWUobm9kZSwgb2Zm
KTsKCQkJCUtBU1NFUlQoZGUgIT0gTlVMTCk7CgkJCQlkZSA9IFRBSUxRX05FWFQoZGUsIHRk
X2VudHJpZXMpOwoJCQl9CgkJCWlmIChkZSA9PSBOVUxMKSB7CgkJCQlvZmYgPSBUTVBGU19E
SVJDT09LSUVfRU9GOwoJCQl9IGVsc2UgewoJCQkJb2ZmID0gdG1wZnNfZGlyY29va2llKGRl
KTsKCQkJfQoJCX0gZWxzZSB7CgkJCW9mZiA9IFRNUEZTX0RJUkNPT0tJRV9ET1RET1Q7CgkJ
fQoJCSgqY29va2llcylbaV0gPSBvZmY7Cgl9CglLQVNTRVJUKHVpby0+dWlvX29mZnNldCA9
PSBvZmYpOwoJcmV0dXJuIGVycm9yOwp9CgppbnQKdG1wZnNfcmVhZGxpbmsodm9pZCAqdikK
ewoJc3RydWN0IHZvcF9yZWFkbGlua19hcmdzIC8qIHsKCQlzdHJ1Y3Qgdm5vZGUJKmFfdnA7
CgkJc3RydWN0IHVpbwkqYV91aW87CgkJa2F1dGhfY3JlZF90CWFfY3JlZDsKCX0gKi8gKmFw
ID0gdjsKCXZub2RlX3QgKnZwID0gYXAtPmFfdnA7CglzdHJ1Y3QgdWlvICp1aW8gPSBhcC0+
YV91aW87Cgl0bXBmc19ub2RlX3QgKm5vZGU7CglpbnQgZXJyb3I7CgoJS0FTU0VSVChWT1Bf
SVNMT0NLRUQodnApKTsKCUtBU1NFUlQodWlvLT51aW9fb2Zmc2V0ID09IDApOwoJS0FTU0VS
VCh2cC0+dl90eXBlID09IFZMTkspOwoKCW5vZGUgPSBWUF9UT19UTVBGU19OT0RFKHZwKTsK
CWVycm9yID0gdWlvbW92ZShub2RlLT50bl9zcGVjLnRuX2xuay50bl9saW5rLAoJICAgIE1J
Tihub2RlLT50bl9zaXplLCB1aW8tPnVpb19yZXNpZCksIHVpbyk7Cglub2RlLT50bl9zdGF0
dXMgfD0gVE1QRlNfTk9ERV9BQ0NFU1NFRDsKCglyZXR1cm4gZXJyb3I7Cn0KCmludAp0bXBm
c19pbmFjdGl2ZSh2b2lkICp2KQp7CglzdHJ1Y3Qgdm9wX2luYWN0aXZlX2FyZ3MgLyogewoJ
CXN0cnVjdCB2bm9kZSAqYV92cDsKCQlib29sICphX3JlY3ljbGU7Cgl9ICovICphcCA9IHY7
Cgl2bm9kZV90ICp2cCA9IGFwLT5hX3ZwOwoJdG1wZnNfbm9kZV90ICpub2RlOwoKCUtBU1NF
UlQoVk9QX0lTTE9DS0VEKHZwKSk7CgoJbm9kZSA9IFZQX1RPX1RNUEZTX05PREUodnApOwoJ
KmFwLT5hX3JlY3ljbGUgPSAobm9kZS0+dG5fbGlua3MgPT0gMCk7CglWT1BfVU5MT0NLKHZw
LCAwKTsKCglyZXR1cm4gMDsKfQoKaW50CnRtcGZzX3JlY2xhaW0odm9pZCAqdikKewoJc3Ry
dWN0IHZvcF9yZWNsYWltX2FyZ3MgLyogewoJCXN0cnVjdCB2bm9kZSAqYV92cDsKCX0gKi8g
KmFwID0gdjsKCXZub2RlX3QgKnZwID0gYXAtPmFfdnA7Cgl0bXBmc19tb3VudF90ICp0bXAg
PSBWRlNfVE9fVE1QRlModnAtPnZfbW91bnQpOwoJdG1wZnNfbm9kZV90ICpub2RlID0gVlBf
VE9fVE1QRlNfTk9ERSh2cCk7Cglib29sIHJhY2luZzsKCgkvKiBEaXNhc3NvY2lhdGUgaW5v
ZGUgZnJvbSB2bm9kZS4gKi8KCW11dGV4X2VudGVyKCZub2RlLT50bl92bG9jayk7Cglub2Rl
LT50bl92bm9kZSA9IE5VTEw7Cgl2cC0+dl9kYXRhID0gTlVMTDsKCS8qIENoZWNrIGlmIHRt
cGZzX3Zub2RlX2dldCgpIGlzIHJhY2luZyB3aXRoIHVzLiAqLwoJcmFjaW5nID0gVE1QRlNf
Tk9ERV9SRUNMQUlNSU5HKG5vZGUpOwoJbXV0ZXhfZXhpdCgmbm9kZS0+dG5fdmxvY2spOwoK
CS8qCgkgKiBJZiBpbm9kZSBpcyBub3QgcmVmZXJlbmNlZCwgaS5lLiBubyBsaW5rcywgdGhl
biBkZXN0cm95IGl0LgoJICogTm90ZTogaWYgcmFjaW5nIC0gaW5vZGUgaXMgYWJvdXQgdG8g
Z2V0IGEgbmV3IHZub2RlLCBsZWF2ZSBpdC4KCSAqLwoJaWYgKG5vZGUtPnRuX2xpbmtzID09
IDAgJiYgIXJhY2luZykgewoJCXRtcGZzX2ZyZWVfbm9kZSh0bXAsIG5vZGUpOwoJfQoJcmV0
dXJuIDA7Cn0KCmludAp0bXBmc19wYXRoY29uZih2b2lkICp2KQp7CglzdHJ1Y3Qgdm9wX3Bh
dGhjb25mX2FyZ3MgLyogewoJCXN0cnVjdCB2bm9kZQkqYV92cDsKCQlpbnQJCWFfbmFtZTsK
CQlyZWdpc3Rlcl90CSphX3JldHZhbDsKCX0gKi8gKmFwID0gdjsKCWNvbnN0IGludCBuYW1l
ID0gYXAtPmFfbmFtZTsKCXJlZ2lzdGVyX3QgKnJldHZhbCA9IGFwLT5hX3JldHZhbDsKCWlu
dCBlcnJvciA9IDA7CgoJc3dpdGNoIChuYW1lKSB7CgljYXNlIF9QQ19MSU5LX01BWDoKCQkq
cmV0dmFsID0gTElOS19NQVg7CgkJYnJlYWs7CgljYXNlIF9QQ19OQU1FX01BWDoKCQkqcmV0
dmFsID0gVE1QRlNfTUFYTkFNTEVOOwoJCWJyZWFrOwoJY2FzZSBfUENfUEFUSF9NQVg6CgkJ
KnJldHZhbCA9IFBBVEhfTUFYOwoJCWJyZWFrOwoJY2FzZSBfUENfUElQRV9CVUY6CgkJKnJl
dHZhbCA9IFBJUEVfQlVGOwoJCWJyZWFrOwoJY2FzZSBfUENfQ0hPV05fUkVTVFJJQ1RFRDoK
CQkqcmV0dmFsID0gMTsKCQlicmVhazsKCWNhc2UgX1BDX05PX1RSVU5DOgoJCSpyZXR2YWwg
PSAxOwoJCWJyZWFrOwoJY2FzZSBfUENfU1lOQ19JTzoKCQkqcmV0dmFsID0gMTsKCQlicmVh
azsKCWNhc2UgX1BDX0ZJTEVTSVpFQklUUzoKCQkqcmV0dmFsID0gc2l6ZW9mKG9mZl90KSAq
IENIQVJfQklUOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQllcnJvciA9IEVJTlZBTDsKCX0KCXJl
dHVybiBlcnJvcjsKfQoKaW50CnRtcGZzX2FkdmxvY2sodm9pZCAqdikKewoJc3RydWN0IHZv
cF9hZHZsb2NrX2FyZ3MgLyogewoJCXN0cnVjdCB2bm9kZQkqYV92cDsKCQl2b2lkICoJCWFf
aWQ7CgkJaW50CQlhX29wOwoJCXN0cnVjdCBmbG9jawkqYV9mbDsKCQlpbnQJCWFfZmxhZ3M7
Cgl9ICovICphcCA9IHY7Cgl2bm9kZV90ICp2cCA9IGFwLT5hX3ZwOwoJdG1wZnNfbm9kZV90
ICpub2RlID0gVlBfVE9fVE1QRlNfTk9ERSh2cCk7CgoJcmV0dXJuIGxmX2FkdmxvY2sodiwg
Jm5vZGUtPnRuX2xvY2tmLCBub2RlLT50bl9zaXplKTsKfQoKaW50CnRtcGZzX2dldHBhZ2Vz
KHZvaWQgKnYpCnsKCXN0cnVjdCB2b3BfZ2V0cGFnZXNfYXJncyAvKiB7CgkJc3RydWN0IHZu
b2RlICphX3ZwOwoJCXZvZmZfdCBhX29mZnNldDsKCQlzdHJ1Y3Qgdm1fcGFnZSAqKmFfbTsK
CQlpbnQgKmFfY291bnQ7CgkJaW50IGFfY2VudGVyaWR4OwoJCXZtX3Byb3RfdCBhX2FjY2Vz
c190eXBlOwoJCWludCBhX2FkdmljZTsKCQlpbnQgYV9mbGFnczsKCX0gKi8gKiBjb25zdCBh
cCA9IHY7Cgl2bm9kZV90ICp2cCA9IGFwLT5hX3ZwOwoJY29uc3Qgdm9mZl90IG9mZnNldCA9
IGFwLT5hX29mZnNldDsKCXN0cnVjdCB2bV9wYWdlICoqcGdzID0gYXAtPmFfbTsKCWNvbnN0
IGludCBjZW50ZXJpZHggPSBhcC0+YV9jZW50ZXJpZHg7Cgljb25zdCB2bV9wcm90X3QgYWNj
ZXNzX3R5cGUgPSBhcC0+YV9hY2Nlc3NfdHlwZTsKCWNvbnN0IGludCBhZHZpY2UgPSBhcC0+
YV9hZHZpY2U7Cgljb25zdCBpbnQgZmxhZ3MgPSBhcC0+YV9mbGFnczsKCWludCBlcnJvciwg
bnBhZ2VzID0gKmFwLT5hX2NvdW50OwoJdG1wZnNfbm9kZV90ICpub2RlOwoJc3RydWN0IHV2
bV9vYmplY3QgKnVvYmo7CgoJS0FTU0VSVCh2cC0+dl90eXBlID09IFZSRUcpOwoJS0FTU0VS
VChtdXRleF9vd25lZCgmdnAtPnZfaW50ZXJsb2NrKSk7CgoJbm9kZSA9IFZQX1RPX1RNUEZT
X05PREUodnApOwoJdW9iaiA9IG5vZGUtPnRuX3NwZWMudG5fcmVnLnRuX2FvYmo7CgoJLyoK
CSAqIEN1cnJlbnRseSwgUEdPX1BBU1RFT0YgaXMgbm90IHN1cHBvcnRlZC4KCSAqLwoJaWYg
KHZwLT52X3NpemUgPD0gb2Zmc2V0ICsgKGNlbnRlcmlkeCA8PCBQQUdFX1NISUZUKSkgewoJ
CWlmICgoZmxhZ3MgJiBQR09fTE9DS0VEKSA9PSAwKQoJCQltdXRleF9leGl0KCZ2cC0+dl9p
bnRlcmxvY2spOwoJCXJldHVybiBFSU5WQUw7Cgl9CgoJaWYgKHZwLT52X3NpemUgPCBvZmZz
ZXQgKyAobnBhZ2VzIDw8IFBBR0VfU0hJRlQpKSB7CgkJbnBhZ2VzID0gKHJvdW5kX3BhZ2Uo
dnAtPnZfc2l6ZSkgLSBvZmZzZXQpID4+IFBBR0VfU0hJRlQ7Cgl9CgoJaWYgKChmbGFncyAm
IFBHT19MT0NLRUQpICE9IDApCgkJcmV0dXJuIEVCVVNZOwoKCWlmICgoZmxhZ3MgJiBQR09f
Tk9USU1FU1RBTVApID09IDApIHsKCQlpZiAoKHZwLT52X21vdW50LT5tbnRfZmxhZyAmIE1O
VF9OT0FUSU1FKSA9PSAwKQoJCQlub2RlLT50bl9zdGF0dXMgfD0gVE1QRlNfTk9ERV9BQ0NF
U1NFRDsKCgkJaWYgKChhY2Nlc3NfdHlwZSAmIFZNX1BST1RfV1JJVEUpICE9IDApIHsKCQkJ
bm9kZS0+dG5fc3RhdHVzIHw9IFRNUEZTX05PREVfTU9ESUZJRUQ7CgkJCWlmICh2cC0+dl9t
b3VudC0+bW50X2ZsYWcgJiBNTlRfUkVMQVRJTUUpCgkJCQlub2RlLT50bl9zdGF0dXMgfD0g
VE1QRlNfTk9ERV9BQ0NFU1NFRDsKCQl9Cgl9CgoJLyoKCSAqIEludm9rZSB0aGUgcGFnZXIu
CgkgKgoJICogQ2xlYW4gdGhlIGFycmF5IG9mIHBhZ2VzIGJlZm9yZS4gIFhYWDogUFIvMzIx
NjYKCSAqIE5vdGUgdGhhdCB2bm9kZSBsb2NrIGlzIHNoYXJlZCB3aXRoIHVuZGVybHlpbmcg
VVZNIG9iamVjdC4KCSAqLwojaWYgMSAvLyBuZWVkZWQgaW4gNS4xIC4uLgoJbXV0ZXhfZXhp
dCgmdnAtPnZfaW50ZXJsb2NrKTsKI2VuZGlmCglpZiAocGdzKSB7CgkJbWVtc2V0KHBncywg
MCwgc2l6ZW9mKHN0cnVjdCB2bV9wYWdlcyAqKSAqIG5wYWdlcyk7Cgl9CiNpZiAwIC8vIG5v
dCBpbiBpbiA1LjEgLi4uCglLQVNTRVJUKCZ2cC0+dl9pbnRlcmxvY2sgPT0gJnVvYmotPnZt
b2JqbG9jayk7CiNlbHNlCgltdXRleF9lbnRlcigmdW9iai0+dm1vYmpsb2NrKTsKI2VuZGlm
CgoJZXJyb3IgPSAoKnVvYmotPnBnb3BzLT5wZ29fZ2V0KSh1b2JqLCBvZmZzZXQsIHBncywg
Jm5wYWdlcywgY2VudGVyaWR4LAoJICAgIGFjY2Vzc190eXBlLCBhZHZpY2UsIGZsYWdzIHwg
UEdPX0FMTFBBR0VTKTsKCiNpZiBkZWZpbmVkKERFQlVHKQoJaWYgKCFlcnJvciAmJiBwZ3Mp
IHsKCQlmb3IgKGludCBpID0gMDsgaSA8IG5wYWdlczsgaSsrKSB7CgkJCUtBU1NFUlQocGdz
W2ldICE9IE5VTEwpOwoJCX0KCX0KI2VuZGlmCglyZXR1cm4gZXJyb3I7Cn0KCmludAp0bXBm
c19wdXRwYWdlcyh2b2lkICp2KQp7CglzdHJ1Y3Qgdm9wX3B1dHBhZ2VzX2FyZ3MgLyogewoJ
CXN0cnVjdCB2bm9kZSAqYV92cDsKCQl2b2ZmX3QgYV9vZmZsbzsKCQl2b2ZmX3QgYV9vZmZo
aTsKCQlpbnQgYV9mbGFnczsKCX0gKi8gKiBjb25zdCBhcCA9IHY7Cgl2bm9kZV90ICp2cCA9
IGFwLT5hX3ZwOwoJY29uc3Qgdm9mZl90IG9mZmxvID0gYXAtPmFfb2ZmbG87Cgljb25zdCB2
b2ZmX3Qgb2ZmaGkgPSBhcC0+YV9vZmZoaTsKCWNvbnN0IGludCBmbGFncyA9IGFwLT5hX2Zs
YWdzOwoJdG1wZnNfbm9kZV90ICpub2RlOwoJc3RydWN0IHV2bV9vYmplY3QgKnVvYmo7Cglp
bnQgZXJyb3I7CgoJS0FTU0VSVChtdXRleF9vd25lZCgmdnAtPnZfaW50ZXJsb2NrKSk7CgoJ
aWYgKHZwLT52X3R5cGUgIT0gVlJFRykgewoJCW11dGV4X2V4aXQoJnZwLT52X2ludGVybG9j
ayk7CgkJcmV0dXJuIDA7Cgl9CgoJbm9kZSA9IFZQX1RPX1RNUEZTX05PREUodnApOwoJdW9i
aiA9IG5vZGUtPnRuX3NwZWMudG5fcmVnLnRuX2FvYmo7CgojaWYgMCAvLyBub3QgaW4gaW4g
NS4xIC4uLgoJS0FTU0VSVCgmdnAtPnZfaW50ZXJsb2NrID09ICZ1b2JqLT52bW9iamxvY2sp
OwojZWxzZQoJbXV0ZXhfZXhpdCgmdnAtPnZfaW50ZXJsb2NrKTsKCW11dGV4X2VudGVyKCZ1
b2JqLT52bW9iamxvY2spOwojZW5kaWYKCWVycm9yID0gKCp1b2JqLT5wZ29wcy0+cGdvX3B1
dCkodW9iaiwgb2ZmbG8sIG9mZmhpLCBmbGFncyk7CgoJLyogWFhYIG10aW1lICovCgoJcmV0
dXJuIGVycm9yOwp9CgppbnQKdG1wZnNfd2hpdGVvdXQodm9pZCAqdikKewoJc3RydWN0IHZv
cF93aGl0ZW91dF9hcmdzIC8qIHsKCQlzdHJ1Y3Qgdm5vZGUJCSphX2R2cDsKCQlzdHJ1Y3Qg
Y29tcG9uZW50bmFtZQkqYV9jbnA7CgkJaW50CQkJYV9mbGFnczsKCX0gKi8gKmFwID0gdjsK
CXZub2RlX3QgKmR2cCA9IGFwLT5hX2R2cDsKCXN0cnVjdCBjb21wb25lbnRuYW1lICpjbnAg
PSBhcC0+YV9jbnA7Cgljb25zdCBpbnQgZmxhZ3MgPSBhcC0+YV9mbGFnczsKCXRtcGZzX21v
dW50X3QgKnRtcCA9IFZGU19UT19UTVBGUyhkdnAtPnZfbW91bnQpOwoJdG1wZnNfZGlyZW50
X3QgKmRlOwoJaW50IGVycm9yOwoKCXN3aXRjaCAoZmxhZ3MpIHsKCWNhc2UgTE9PS1VQOgoJ
CWJyZWFrOwoJY2FzZSBDUkVBVEU6CgkJZXJyb3IgPSB0bXBmc19hbGxvY19kaXJlbnQodG1w
LCBjbnAtPmNuX25hbWVwdHIsCgkJICAgIGNucC0+Y25fbmFtZWxlbiwgJmRlKTsKCQlpZiAo
ZXJyb3IpCgkJCXJldHVybiBlcnJvcjsKCQl0bXBmc19kaXJfYXR0YWNoKGR2cCwgZGUsIFRN
UEZTX05PREVfV0hJVEVPVVQpOwoJCWJyZWFrOwoJY2FzZSBERUxFVEU6CgkJY25wLT5jbl9m
bGFncyAmPSB+RE9XSElURU9VVDsgLyogd2hlbiBpbiBkb3VidCwgY2FyZ28gY3VsdCAqLwoJ
CWRlID0gdG1wZnNfZGlyX2xvb2t1cChWUF9UT19UTVBGU19ESVIoZHZwKSwgY25wKTsKCQlp
ZiAoZGUgPT0gTlVMTCkKCQkJcmV0dXJuIEVOT0VOVDsKCQl0bXBmc19kaXJfZGV0YWNoKGR2
cCwgZGUpOwoJCXRtcGZzX2ZyZWVfZGlyZW50KHRtcCwgZGUpOwoJCWJyZWFrOwoJfQoJcmV0
dXJuIDA7Cn0KCmludAp0bXBmc19wcmludCh2b2lkICp2KQp7CglzdHJ1Y3Qgdm9wX3ByaW50
X2FyZ3MgLyogewoJCXN0cnVjdCB2bm9kZQkqYV92cDsKCX0gKi8gKmFwID0gdjsKCXZub2Rl
X3QgKnZwID0gYXAtPmFfdnA7Cgl0bXBmc19ub2RlX3QgKm5vZGUgPSBWUF9UT19UTVBGU19O
T0RFKHZwKTsKCglwcmludGYoInRhZyBWVF9UTVBGUywgdG1wZnNfbm9kZSAlcCwgZmxhZ3Mg
MHgleCwgbGlua3MgJWRcbiIKCSAgICAiXHRtb2RlIDAlbywgb3duZXIgJWQsIGdyb3VwICVk
LCBzaXplICUiIFBSSWRNQVggIiwgc3RhdHVzIDB4JXgiLAoJICAgIG5vZGUsIG5vZGUtPnRu
X2ZsYWdzLCBub2RlLT50bl9saW5rcywgbm9kZS0+dG5fbW9kZSwgbm9kZS0+dG5fdWlkLAoJ
ICAgIG5vZGUtPnRuX2dpZCwgKHVpbnRtYXhfdClub2RlLT50bl9zaXplLCBub2RlLT50bl9z
dGF0dXMpOwoJaWYgKHZwLT52X3R5cGUgPT0gVkZJRk8pIHsKCQlWT0NBTEwoZmlmb192bm9k
ZW9wX3AsIFZPRkZTRVQodm9wX3ByaW50KSwgdik7Cgl9CglwcmludGYoIlxuIik7CglyZXR1
cm4gMDsKfQoKLy8gbG9jay91bmxvY2sgdmVyc2lvbiBmcm9tIGFjdHVhbCBnZW5mcyAtIGRv
IG5vdCB1c2UgbG9ja21nciBhbnltb3JlIC4uLgoKI2lmbmRlZiBGU1RSQU5TX1NIQVJFRAov
LyBoYWNrIGZvciBsaWIgcnVtcCAtIGZ0cmFucyBzdHVmZiBub3Qga25vd24gdGhlcmUgLSBm
YWxsIGJhY2sgdG8gb2xkIHZlcnNpb24gLi4uLgppbnQgdG1wZnNfbG9jayh2b2lkICp2KSB7
IHJldHVybiBnZW5mc19sb2NrKHYpOyB9CmludCB0bXBmc191bmxvY2sodm9pZCAqdikgeyBy
ZXR1cm4gZ2VuZnNfdW5sb2NrKHYpOyB9CiNlbHNlCmludCAgICAgCnRtcGZzX2xvY2sodm9p
ZCAqdikKeyAKICAgICAgICBzdHJ1Y3Qgdm9wX2xvY2tfYXJncyAvKiB7IAogICAgICAgICAg
ICAgICAgc3RydWN0IHZub2RlICphX3ZwOwogICAgICAgICAgICAgICAgaW50IGFfZmxhZ3M7
CiAgICAgICAgfSAqLyAqYXAgPSB2OwogICAgICAgIHN0cnVjdCB2bm9kZSAqdnAgPSBhcC0+
YV92cDsKICAgICAgICBpbnQgZmxhZ3MgPSBhcC0+YV9mbGFnczsKICAgICAgICBrcndfdCBv
cDsKIAovLyBhZGRlZCB0byBzdXBwb3J0IG9sZCBpbnRlcmxvY2stc2VtYW50aWNzCiAgICAg
ICAgaWYgKChmbGFncyAmIExLX0lOVEVSTE9DSykgIT0gMCkgewogICAgICAgICAgICAgICAg
ZmxhZ3MgJj0gfkxLX0lOVEVSTE9DSzsKICAgICAgICAgICAgICAgIG11dGV4X2V4aXQoJnZw
LT52X2ludGVybG9jayk7CiAgICAgICAgfQogCiAgICAgICAgS0FTU0VSVCgoZmxhZ3MgJiB+
KExLX0VYQ0xVU0lWRSB8IExLX1NIQVJFRCB8IExLX05PV0FJVCkpID09IDApOyAKIAogICAg
ICAgIG9wID0gKChmbGFncyAmIExLX0VYQ0xVU0lWRSkgIT0gMCA/IFJXX1dSSVRFUiA6IFJX
X1JFQURFUik7CiAgICAgICAgaWYgKChmbGFncyAmIExLX05PV0FJVCkgIT0gMCkgewogICAg
ICAgICAgICAgICAgaWYgKGZzdHJhbnNfc3RhcnRfbm93YWl0KHZwLT52X21vdW50LCBGU1RS
QU5TX1NIQVJFRCkpIAogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUJVU1k7CiAg
ICAgICAgICAgICAgICBpZiAoISByd190cnllbnRlcigmdnAtPnZfbG9jay52bF9sb2NrLCBv
cCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnN0cmFuc19kb25lKHZwLT52X21vdW50
KTsgCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFQlVTWTsKICAgICAgICAgICAg
ICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KIAogICAgICAgIGZz
dHJhbnNfc3RhcnQodnAtPnZfbW91bnQsIEZTVFJBTlNfU0hBUkVEKTsKICAgICAgICByd19l
bnRlcigmdnAtPnZfbG9jay52bF9sb2NrLCBvcCk7CiAgIAogICAgICAgIHJldHVybiAwOwp9
CgovKgogKiBVbmxvY2sgdGhlIG5vZGUuCiAqLwppbnQKdG1wZnNfdW5sb2NrKHZvaWQgKnYp
IAp7CiAgICAgICAgc3RydWN0IHZvcF91bmxvY2tfYXJncyAvKiB7CiAgICAgICAgICAgICAg
ICBzdHJ1Y3Qgdm5vZGUgKmFfdnA7CiAgICAgICAgfSAqLyAqYXAgPSB2OwogICAgICAgIHN0
cnVjdCB2bm9kZSAqdnAgPSBhcC0+YV92cDsKCiAgICAgICAgcndfZXhpdCgmdnAtPnZfbG9j
ay52bF9sb2NrKTsKICAgICAgICBmc3RyYW5zX2RvbmUodnAtPnZfbW91bnQpOwogICAgICAg
IHJldHVybiAwOwp9CiNlbmRpZgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0bXBmcy1wYXRjaC9zcmMv
c3lzL2ZzL3RtcGZzL3RtcGZzX3N1YnIuYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEwMDQ0NAAwMDAwMDAwADAwMDAwMDAA
MDAwMDAwNzY3NjQAMTIwMjYwMjI3NTUAMDAxNzY0NQAwAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAcm9vdAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAC8qCSROZXRCU0Q6IHRtcGZzX3N1YnIuYyx2IDEuNzIgMjAxMS8wNS8yOSAy
Mjo0MzozMiBybWluZCBFeHAgJAkqLwoKLyoKICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTEg
VGhlIE5ldEJTRCBGb3VuZGF0aW9uLCBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAq
CiAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8g
VGhlIE5ldEJTRCBGb3VuZGF0aW9uCiAqIGJ5IEp1bGlvIE0uIE1lcmlubyBWaWRhbCwgZGV2
ZWxvcGVkIGFzIHBhcnQgb2YgR29vZ2xlJ3MgU3VtbWVyIG9mIENvZGUKICogMjAwNSBwcm9n
cmFtLCBhbmQgYnkgTWluZGF1Z2FzIFJhc2l1a2V2aWNpdXMuCiAqCiAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE5FVEJT
RCBGT1VOREFUSU9OLCBJTkMuIEFORCBDT05UUklCVVRPUlMKICogYGBBUyBJUycnIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVECiAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgRk9VTkRBVElPTiBPUiBDT05UUklCVVRPUlMK
ICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgogKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MKICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUKICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqLwoK
LyoKICogRWZmaWNpZW50IG1lbW9yeSBmaWxlIHN5c3RlbTogaW50ZXJmYWNlcyBmb3IgaW5v
ZGUgYW5kIGRpcmVjdG9yeSBlbnRyeQogKiBjb25zdHJ1Y3Rpb24sIGRlc3RydWN0aW9uIGFu
ZCBtYW5pcHVsYXRpb24uCiAqCiAqIFJlZmVyZW5jZSBjb3VudGluZwogKgogKglUaGUgbGlu
ayBjb3VudCBvZiBpbm9kZSAodG1wZnNfbm9kZV90Ojp0bl9saW5rcykgaXMgdXNlZCBhcyBh
CiAqCXJlZmVyZW5jZSBjb3VudGVyLiAgSG93ZXZlciwgaXQgaGFzIHNsaWdodGx5IGRpZmZl
cmVudCBzZW1hbnRpY3MuCiAqCiAqCUZvciBkaXJlY3RvcmllcyAtIGxpbmsgY291bnQgcmVw
cmVzZW50cyBkaXJlY3RvcnkgZW50cmllcywgd2hpY2gKICoJcmVmZXIgdG8gdGhlIGRpcmVj
dG9yaWVzLiAgSW4gb3RoZXIgd29yZHMsIGl0IHJlcHJlc2VudHMgdGhlIGNvdW50CiAqCW9m
IHN1Yi1kaXJlY3Rvcmllcy4gIEl0IGFsc28gdGFrZXMgaW50byBhY2NvdW50IHRoZSB2aXJ0
dWFsICcuJwogKgllbnRyeSAod2hpY2ggaGFzIG5vIHJlYWwgZW50cnkgaW4gdGhlIGxpc3Qp
LiAgRm9yIGZpbGVzIC0gbGluayBjb3VudAogKglyZXByZXNlbnRzIHRoZSBoYXJkIGxpbmtz
LiAgU2luY2Ugb25seSBlbXB0eSBkaXJlY3RvcmllcyBjYW4gYmUKICoJcmVtb3ZlZCAtIGxp
bmsgY291bnQgYWxpZ25zIHRoZSByZWZlcmVuY2UgY291bnRpbmcgcmVxdWlyZW1lbnRzCiAq
CWVub3VnaC4gIE5vdGU6IHRvIGNoZWNrIHdoZXRoZXIgZGlyZWN0b3J5IGlzIG5vdCBlbXB0
eSwgdGhlIGlub2RlCiAqCXNpemUgKHRtcGZzX25vZGVfdDo6dG5fc2l6ZSkgY2FuIGJlIHVz
ZWQuCiAqCiAqCVRoZSBpbm9kZSBpdHNlbGYsIGFzIGFuIG9iamVjdCwgZ2F0aGVycyBpdHMg
Zmlyc3QgcmVmZXJlbmNlIHdoZW4KICoJZGlyZWN0b3J5IGVudHJ5IGlzIGF0dGFjaGVkIHZp
YSB0bXBmc19kaXJfYXR0YWNoKDkpLiAgRm9yIGluc3RhbmNlLAogKglhZnRlciByZWd1bGFy
IHRtcGZzX2NyZWF0ZSgpLCBhIGZpbGUgd291bGQgaGF2ZSBhIGxpbmsgY291bnQgb2YgMSwK
ICoJd2hpbGUgZGlyZWN0b3J5IGFmdGVyIHRtcGZzX21rZGlyKCkgd291bGQgaGF2ZSAyIChk
dWUgdG8gJy4nKS4KICoKICogUmVjbGFtYXRpb24KICoKICoJSXQgc2hvdWxkIGJlIG5vdGVk
IHRoYXQgdG1wZnMgaW5vZGVzIHJlbHkgb24gYSBjb21iaW5hdGlvbiBvZiB2bm9kZQogKgly
ZWZlcmVuY2UgY291bnRpbmcgYW5kIGxpbmsgY291bnRpbmcuICBUaGF0IGlzLCBhbiBpbm9k
ZSBjYW4gb25seSBiZQogKglkZXN0cm95ZWQgaWYgaXRzIGFzc29jaWF0ZWQgdm5vZGUgaXMg
aW5hY3RpdmUuICBUaGUgZGVzdHJ1Y3Rpb24gaXMKICoJZG9uZSBvbiB2bm9kZSByZWNsYW1h
dGlvbiBpLmUuIHRtcGZzX3JlY2xhaW0oKS4gIEl0IHNob3VsZCBiZSBub3RlZAogKgl0aGF0
IHRtcGZzX25vZGVfdDo6dG5fbGlua3MgYmVpbmcgMCBpcyBhIGRlc3RydWN0aW9uIGNyaXRl
cmlvbi4gCiAqCiAqCUlmIGFuIGlub2RlIGhhcyByZWZlcmVuY2VzIHdpdGhpbiB0aGUgZmls
ZSBzeXN0ZW0gKHRuX2xpbmtzID4gMCkgYW5kCiAqCWl0cyBpbmFjdGl2ZSB2bm9kZSBnZXRz
IHJlY2xhaW1lZC9yZWN5Y2xlZCAtIHRoZW4gdGhlIGFzc29jaWF0aW9uIGlzCiAqCWJyb2tl
biBpbiB0bXBmc19yZWNsYWltKCkuICBJbiBzdWNoIGNhc2UsIGFuIGlub2RlIHdpbGwgYWx3
YXlzIHBhc3MKICoJdG1wZnNfbG9va3VwKCkgYW5kIHRodXMgdG1wZnNfdm5vZGVfZ2V0KCkg
dG8gYXNzb2NpYXRlIGEgbmV3IHZub2RlLgogKgogKiBMb2NrIG9yZGVyCiAqCiAqCXRtcGZz
X25vZGVfdDo6dG5fdmxvY2sgLT4KICoJCXZub2RlX3Q6OnZfdmxvY2sgLT4KICoJCQl2bm9k
ZV90Ojp2X2ludGVybG9jawogKi8KCiNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KX19LRVJORUxf
UkNTSUQoMCwgIiROZXRCU0Q6IHRtcGZzX3N1YnIuYyx2IDEuNzIgMjAxMS8wNS8yOSAyMjo0
MzozMiBybWluZCBFeHAgJCIpOwoKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8
c3lzL2RpcmVudC5oPgojaW5jbHVkZSA8c3lzL2V2ZW50Lmg+CiNpbmNsdWRlIDxzeXMva21l
bS5oPgojaW5jbHVkZSA8c3lzL21vdW50Lmg+CiNpbmNsdWRlIDxzeXMvbmFtZWkuaD4KI2lu
Y2x1ZGUgPHN5cy90aW1lLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8c3lz
L3N5c3RtLmg+CiNpbmNsdWRlIDxzeXMvdm5vZGUuaD4KI2luY2x1ZGUgPHN5cy9rYXV0aC5o
PgojaW5jbHVkZSA8c3lzL2F0b21pYy5oPgoKI2luY2x1ZGUgPHV2bS91dm0uaD4KCiNpbmNs
dWRlIDxtaXNjZnMvc3BlY2ZzL3NwZWNkZXYuaD4KI2lmIDAgLy8gbm90IG9uIDUuMSAuLi4u
LgojaW5jbHVkZSA8bWlzY2ZzL2dlbmZzL2dlbmZzLmg+CiNlbHNlCnN0YXRpYyBpbnQKZ2Vu
ZnNfY2FuX2NodGltZXModm5vZGVfdCAqdnAsIHVfaW50IHZhZmxhZ3MsIHVpZF90IG93bmVy
X3VpZCwga2F1dGhfY3JlZF90IGNyZWQpCnsKCWludCBlcnJvcjsKCgkvKiBNdXN0IGJlIG93
bmVyLCBvci4uLiAqLwoJaWYgKGthdXRoX2NyZWRfZ2V0ZXVpZChjcmVkKSA9PSBvd25lcl91
aWQpIHJldHVybiAoMCk7CgoJLyogc2V0IHRoZSB0aW1lcyB0byB0aGUgY3VycmVudCB0aW1l
LCBhbmQuLi4gKi8KCWlmICgodmFmbGFncyAmIFZBX1VUSU1FU19OVUxMKSA9PSAwKSByZXR1
cm4gKEVQRVJNKTsKCgkvKiBoYXZlIHdyaXRlIGFjY2Vzcy4gKi8KCWVycm9yID0gVk9QX0FD
Q0VTUyh2cCwgVldSSVRFLCBjcmVkKTsKCWlmIChlcnJvcikgcmV0dXJuIChlcnJvcik7CgoJ
cmV0dXJuICgwKTsKfQoKc3RhdGljIGludAkKZ2VuZnNfY2FuX2Nob3duKGthdXRoX2NyZWRf
dCBjcmVkLCB1aWRfdCBjdXJfdWlkLCBnaWRfdCBjdXJfZ2lkLCB1aWRfdCBuZXdfdWlkLCBn
aWRfdCBuZXdfZ2lkKQp7CglpbnQgZXJyb3IsIGlzbWVtYmVyOwoKI2lmIDEgLy8gd29ya2Fy
b3VuZCBmb3IgNS4xLnggLi4KLy8gcm9vdCBtYXkgZG8gaXQgYWxsIHRoZSB0aW1lIC0gaGFj
ayB0byBnZXQgcmlkIG9mIGluc3RhbGwtcm9vdC10bXBmcyBwcm9ibGVtcwogIGlmIChrYXV0
aF9jcmVkX2dldGV1aWQoY3JlZCkgPT0gKHVpZF90KTApIHJldHVybiAwOwojZW5kaWYKCS8q
CgkgKiBZb3UgY2FuIG9ubHkgY2hhbmdlIG93bmVyc2hpcCBvZiBhIGZpbGUgaWY6CgkgKiBZ
b3Ugb3duIHRoZSBmaWxlIGFuZC4uLgoJICovCglpZiAoa2F1dGhfY3JlZF9nZXRldWlkKGNy
ZWQpID09IGN1cl91aWQpIHsKCQkvKgoJCSAqIFlvdSBkb24ndCB0cnkgdG8gY2hhbmdlIG93
bmVyc2hpcCwgYW5kLi4uCgkJICovCgkJaWYgKG5ld191aWQgIT0gY3VyX3VpZCkgcmV0dXJu
IChFUEVSTSk7CgoJCS8qCgkJICogWW91IGRvbid0IHRyeSB0byBjaGFuZ2UgZ3JvdXAgKG5v
LW9wKSwgb3IuLi4KCQkgKi8KCQlpZiAobmV3X2dpZCA9PSBjdXJfZ2lkKSByZXR1cm4gKDAp
OwoKCQkvKgoJCSAqIFlvdXIgZWZmZWN0aXZlIGdpZCBpcyB0aGUgbmV3IGdpZCwgb3IuLi4K
CQkgKi8KCQlpZiAoa2F1dGhfY3JlZF9nZXRlZ2lkKGNyZWQpID09IG5ld19naWQpIHJldHVy
biAoMCk7CgoJCS8qCgkJICogVGhlIG5ldyBnaWQgaXMgb25lIHlvdSdyZSBhIG1lbWJlciBv
Zi4KCQkgKi8KCQlpc21lbWJlciA9IDA7CgkJZXJyb3IgPSBrYXV0aF9jcmVkX2lzbWVtYmVy
X2dpZChjcmVkLCBuZXdfZ2lkLCAmaXNtZW1iZXIpOwoJCWlmICghZXJyb3IgJiYgaXNtZW1i
ZXIpIHJldHVybiAoMCk7Cgl9CgoJcmV0dXJuIChFUEVSTSk7Cn0KCnN0YXRpYyBpbnQKZ2Vu
ZnNfY2FuX2NobW9kKGVudW0gdnR5cGUgdHlwZSwga2F1dGhfY3JlZF90IGNyZWQsIHVpZF90
IGN1cl91aWQsCiAgICBnaWRfdCBjdXJfZ2lkLCBtb2RlX3QgbmV3X21vZGUpCnsKCWludCBl
cnJvcjsKCiNpZiAxIC8vIHdvcmthcm91bmQgZm9yIDUuMS54IC4uCi8vIHJvb3QgbWF5IGRv
IGl0IGFsbCB0aGUgdGltZSAuLi4KICBpZiAoa2F1dGhfY3JlZF9nZXRldWlkKGNyZWQpID09
ICh1aWRfdCkwKSByZXR1cm4gMDsKI2VuZGlmCgkvKiBUaGUgdXNlciBtdXN0IG93biB0aGUg
ZmlsZS4gKi8KCWlmIChrYXV0aF9jcmVkX2dldGV1aWQoY3JlZCkgIT0gY3VyX3VpZCkgcmV0
dXJuIChFUEVSTSk7CgoJLyoKCSAqIFVucHJpdmlsZWdlZCB1c2VycyBjYW4ndCBzZXQgdGhl
IHN0aWNreSBiaXQgb24gZmlsZXMuCgkgKi8KCWlmICgodHlwZSAhPSBWRElSKSAmJiAobmV3
X21vZGUgJiBTX0lTVFhUKSkgcmV0dXJuIChFRlRZUEUpOwoKCS8qCgkgKiBJZiB0aGUgaW52
b2tlciBpcyB0cnlpbmcgdG8gc2V0IHRoZSBTR0lEIGJpdCBvbiB0aGUgZmlsZSwKCSAqIGNo
ZWNrIGdyb3VwIG1lbWJlcnNoaXAuCgkgKi8KCWlmIChuZXdfbW9kZSAmIFNfSVNHSUQpIHsK
CQlpbnQgaXNtZW1iZXI7CgoJCWVycm9yID0ga2F1dGhfY3JlZF9pc21lbWJlcl9naWQoY3Jl
ZCwgY3VyX2dpZCwgJmlzbWVtYmVyKTsKCQlpZiAoZXJyb3IgfHwgIWlzbWVtYmVyKSByZXR1
cm4gKEVQRVJNKTsKCX0KCglyZXR1cm4gKDApOwp9CgojZW5kaWYKI2luY2x1ZGUgPGZzL3Rt
cGZzL3RtcGZzLmg+CiNpbmNsdWRlIDxmcy90bXBmcy90bXBmc19maWZvb3BzLmg+CiNpbmNs
dWRlIDxmcy90bXBmcy90bXBmc19zcGVjb3BzLmg+CiNpbmNsdWRlIDxmcy90bXBmcy90bXBm
c192bm9wcy5oPgoKI2lmIDEKaW50IGthdXRoX2F1dGhvcml6ZV92bm9kZShrYXV0aF9jcmVk
X3QsIGthdXRoX2FjdGlvbl90LCBzdHJ1Y3Qgdm5vZGUqLCBzdHJ1Y3Qgdm5vZGUqLCBpbnQp
OwoKLy8gc29tZSBkdW1teSBkZWZpbml0aW9ucwojZGVmaW5lIEtBVVRIX1ZOT0RFX1dSSVRF
X0ZMQUdTICAgICAgMAojZGVmaW5lIEtBVVRIX1ZOT0RFX0hBU19TWVNGTEFHUyAgICAgMAoj
ZGVmaW5lIEtBVVRIX1ZOT0RFX0NIQU5HRV9PV05FUlNISVAgMAojZGVmaW5lIEtBVVRIX1ZO
T0RFX1dSSVRFX1NFQ1VSSVRZICAgMAojZGVmaW5lIEtBVVRIX1ZOT0RFX1dSSVRFX1RJTUVT
ICAgICAgMAovLyBzb21lIGR1bW15IGRlZmluaXRpbm9zIHdpdGggcmVhbCB2YWx1ZXMsIGJl
Y2F1c2UgdGhleSBhcmUgY2hlY2tlZCBoZXJlIGFnYWluIC4uLgojZGVmaW5lIEtBVVRIX1ZO
T0RFX1dSSVRFX1NZU0ZMQUdTICAgMQojZW5kaWYKCi8qCiAqIHRtcGZzX2FsbG9jX25vZGU6
IGFsbG9jYXRlIGEgbmV3IGlub2RlIG9mIGEgc3BlY2lmaWVkIHR5cGUgYW5kCiAqIGluc2Vy
dCBpdCBpbnRvIHRoZSBsaXN0IG9mIHNwZWNpZmllZCBtb3VudCBwb2ludC4KICovCmludAp0
bXBmc19hbGxvY19ub2RlKHRtcGZzX21vdW50X3QgKnRtcCwgZW51bSB2dHlwZSB0eXBlLCB1
aWRfdCB1aWQsIGdpZF90IGdpZCwKICAgIG1vZGVfdCBtb2RlLCBjaGFyICp0YXJnZXQsIGRl
dl90IHJkZXYsIHRtcGZzX25vZGVfdCAqKm5vZGUpCnsKCXRtcGZzX25vZGVfdCAqbm5vZGU7
CgoJbm5vZGUgPSB0bXBmc19ub2RlX2dldCh0bXApOwoJaWYgKG5ub2RlID09IE5VTEwpIHsK
CQlyZXR1cm4gRU5PU1BDOwoJfQoKCS8qIEluaXRpYWxseSwgbm8gcmVmZXJlbmNlcyBhbmQg
bm8gYXNzb2NpYXRpb25zLiAqLwoJbm5vZGUtPnRuX2xpbmtzID0gMDsKCW5ub2RlLT50bl92
bm9kZSA9IE5VTEw7Cglubm9kZS0+dG5fZGlyZW50X2hpbnQgPSBOVUxMOwoKCS8qCgkgKiBY
WFggV2hlcmUgdGhlIHBvb2wgaXMgYmFja2VkIGJ5IGEgbWFwIGxhcmdlciB0aGFuICg0R0Ig
KgoJICogc2l6ZW9mKCpubm9kZSkpLCB0aGlzIG1heSBwcm9kdWNlIGR1cGxpY2F0ZSBpbm9k
ZSBudW1iZXJzCgkgKiBmb3IgYXBwbGljYXRpb25zIHRoYXQgZG8gbm90IHVuZGVyc3RhbmQg
NjQtYml0IGlub190LgoJICovCglubm9kZS0+dG5faWQgPSAoaW5vX3QpKCh1aW50cHRyX3Qp
bm5vZGUgLyBzaXplb2YoKm5ub2RlKSk7Cglubm9kZS0+dG5fZ2VuID0gVE1QRlNfTk9ERV9H
RU5fTUFTSyAmIGFyYzRyYW5kb20oKTsKCgkvKiBHZW5lcmljIGluaXRpYWxpemF0aW9uLiAq
LwoJbm5vZGUtPnRuX3R5cGUgPSB0eXBlOwoJbm5vZGUtPnRuX3NpemUgPSAwOwoJbm5vZGUt
PnRuX3N0YXR1cyA9IDA7Cglubm9kZS0+dG5fZmxhZ3MgPSAwOwoJbm5vZGUtPnRuX2xvY2tm
ID0gTlVMTDsKCgl2ZnNfdGltZXN0YW1wKCZubm9kZS0+dG5fYXRpbWUpOwoJbm5vZGUtPnRu
X2JpcnRodGltZSA9IG5ub2RlLT50bl9hdGltZTsKCW5ub2RlLT50bl9jdGltZSA9IG5ub2Rl
LT50bl9hdGltZTsKCW5ub2RlLT50bl9tdGltZSA9IG5ub2RlLT50bl9hdGltZTsKCglLQVNT
RVJUKHVpZCAhPSBWTk9WQUwgJiYgZ2lkICE9IFZOT1ZBTCAmJiBtb2RlICE9IFZOT1ZBTCk7
Cglubm9kZS0+dG5fdWlkID0gdWlkOwoJbm5vZGUtPnRuX2dpZCA9IGdpZDsKCW5ub2RlLT50
bl9tb2RlID0gbW9kZTsKCgkvKiBUeXBlLXNwZWNpZmljIGluaXRpYWxpemF0aW9uLiAqLwoJ
c3dpdGNoIChubm9kZS0+dG5fdHlwZSkgewoJY2FzZSBWQkxLOgoJY2FzZSBWQ0hSOgoJCS8q
IENoYXJhY3Rlci9ibG9jayBzcGVjaWFsIGRldmljZS4gKi8KCQlLQVNTRVJUKHJkZXYgIT0g
Vk5PVkFMKTsKCQlubm9kZS0+dG5fc3BlYy50bl9kZXYudG5fcmRldiA9IHJkZXY7CgkJYnJl
YWs7CgljYXNlIFZESVI6CgkJLyogRGlyZWN0b3J5LiAqLwoJCVRBSUxRX0lOSVQoJm5ub2Rl
LT50bl9zcGVjLnRuX2Rpci50bl9kaXIpOwoJCW5ub2RlLT50bl9zcGVjLnRuX2Rpci50bl9w
YXJlbnQgPSBOVUxMOwoJCW5ub2RlLT50bl9zcGVjLnRuX2Rpci50bl9yZWFkZGlyX2xhc3Ru
ID0gMDsKCQlubm9kZS0+dG5fc3BlYy50bl9kaXIudG5fcmVhZGRpcl9sYXN0cCA9IE5VTEw7
CgoJCS8qIEV4dHJhIGxpbmsgY291bnQgZm9yIHRoZSB2aXJ0dWFsICcuJyBlbnRyeS4gKi8K
CQlubm9kZS0+dG5fbGlua3MrKzsKCQlicmVhazsKCWNhc2UgVkZJRk86CgljYXNlIFZTT0NL
OgoJCWJyZWFrOwoJY2FzZSBWTE5LOgoJCS8qIFN5bWJvbGljIGxpbmsuICBUYXJnZXQgc3Bl
Y2lmaWVzIHRoZSBmaWxlIG5hbWUuICovCgkJS0FTU0VSVCh0YXJnZXQgJiYgc3RybGVuKHRh
cmdldCkgPCBNQVhQQVRITEVOKTsKCgkJbm5vZGUtPnRuX3NpemUgPSBzdHJsZW4odGFyZ2V0
KTsKCQlpZiAobm5vZGUtPnRuX3NpemUgPT0gMCkgewoJCQlubm9kZS0+dG5fc3BlYy50bl9s
bmsudG5fbGluayA9IE5VTEw7CgkJCWJyZWFrOwoJCX0KCQlubm9kZS0+dG5fc3BlYy50bl9s
bmsudG5fbGluayA9CgkJICAgIHRtcGZzX3N0cm5hbWVfYWxsb2ModG1wLCBubm9kZS0+dG5f
c2l6ZSk7CgkJaWYgKG5ub2RlLT50bl9zcGVjLnRuX2xuay50bl9saW5rID09IE5VTEwpIHsK
CQkJdG1wZnNfbm9kZV9wdXQodG1wLCBubm9kZSk7CgkJCXJldHVybiBFTk9TUEM7CgkJfQoJ
CW1lbWNweShubm9kZS0+dG5fc3BlYy50bl9sbmsudG5fbGluaywgdGFyZ2V0LCBubm9kZS0+
dG5fc2l6ZSk7CgkJYnJlYWs7CgljYXNlIFZSRUc6CgkJLyogUmVndWxhciBmaWxlLiAgQ3Jl
YXRlIGFuIHVuZGVybHlpbmcgVVZNIG9iamVjdC4gKi8KCQlubm9kZS0+dG5fc3BlYy50bl9y
ZWcudG5fYW9iaiA9CgkJICAgIHVhb19jcmVhdGUoSU5UMzJfTUFYIC0gUEFHRV9TSVpFLCAw
KTsKCQlubm9kZS0+dG5fc3BlYy50bl9yZWcudG5fYW9ial9wYWdlcyA9IDA7CgkJYnJlYWs7
CglkZWZhdWx0OgoJCUtBU1NFUlQoZmFsc2UpOwoJfQoKCW11dGV4X2luaXQoJm5ub2RlLT50
bl92bG9jaywgTVVURVhfREVGQVVMVCwgSVBMX05PTkUpOwoKCW11dGV4X2VudGVyKCZ0bXAt
PnRtX2xvY2spOwoJTElTVF9JTlNFUlRfSEVBRCgmdG1wLT50bV9ub2Rlcywgbm5vZGUsIHRu
X2VudHJpZXMpOwoJbXV0ZXhfZXhpdCgmdG1wLT50bV9sb2NrKTsKCgkqbm9kZSA9IG5ub2Rl
OwoJcmV0dXJuIDA7Cn0KCi8qCiAqIHRtcGZzX2ZyZWVfbm9kZTogcmVtb3ZlIHRoZSBpbm9k
ZSBmcm9tIGEgbGlzdCBpbiB0aGUgbW91bnQgcG9pbnQgYW5kCiAqIGRlc3Ryb3kgdGhlIGlu
b2RlIHN0cnVjdHVyZXMuCiAqLwp2b2lkCnRtcGZzX2ZyZWVfbm9kZSh0bXBmc19tb3VudF90
ICp0bXAsIHRtcGZzX25vZGVfdCAqbm9kZSkKewoJc2l6ZV90IG9ianN6OwoKCW11dGV4X2Vu
dGVyKCZ0bXAtPnRtX2xvY2spOwoJTElTVF9SRU1PVkUobm9kZSwgdG5fZW50cmllcyk7Cglt
dXRleF9leGl0KCZ0bXAtPnRtX2xvY2spOwoKCXN3aXRjaCAobm9kZS0+dG5fdHlwZSkgewoJ
Y2FzZSBWTE5LOgoJCWlmIChub2RlLT50bl9zaXplID4gMCkgewoJCQl0bXBmc19zdHJuYW1l
X2ZyZWUodG1wLCBub2RlLT50bl9zcGVjLnRuX2xuay50bl9saW5rLAoJCQkgICAgbm9kZS0+
dG5fc2l6ZSk7CgkJfQoJCWJyZWFrOwoJY2FzZSBWUkVHOgoJCS8qCgkJICogQ2FsY3VsYXRl
IHRoZSBzaXplIG9mIGlub2RlIGRhdGEsIGRlY3JlYXNlIHRoZSB1c2VkLW1lbW9yeQoJCSAq
IGNvdW50ZXIsIGFuZCBkZXN0cm95IHRoZSB1bmVybHlpbmcgVVZNIG9iamVjdCAoaWYgYW55
KS4KCQkgKi8KCQlvYmpzeiA9IFBBR0VfU0laRSAqIG5vZGUtPnRuX3NwZWMudG5fcmVnLnRu
X2FvYmpfcGFnZXM7CgkJaWYgKG9ianN6ICE9IDApIHsKCQkJdG1wZnNfbWVtX2RlY3IodG1w
LCBvYmpzeik7CgkJfQoJCWlmIChub2RlLT50bl9zcGVjLnRuX3JlZy50bl9hb2JqICE9IE5V
TEwpIHsKCQkJdWFvX2RldGFjaChub2RlLT50bl9zcGVjLnRuX3JlZy50bl9hb2JqKTsKCQl9
CgkJYnJlYWs7CgljYXNlIFZESVI6CgkJLyoKCQkgKiBLQVNTRVJUKFRBSUxRX0VNUFRZKCZu
b2RlLT50bl9zcGVjLnRuX2Rpci50bl9kaXIpKTsKCQkgKiBLQVNTRVJUKG5vZGUtPnRuX3Nw
ZWMudG5fZGlyLnRuX3BhcmVudCA9PSBOVUxMIHx8CgkJICogICAgIG5vZGUgPT0gdG1wLT50
bV9yb290KTsKCQkgKi8KCQlicmVhazsKCWRlZmF1bHQ6CgkJYnJlYWs7Cgl9CgoJbXV0ZXhf
ZGVzdHJveSgmbm9kZS0+dG5fdmxvY2spOwoJdG1wZnNfbm9kZV9wdXQodG1wLCBub2RlKTsK
fQoKLyoKICogdG1wZnNfdm5vZGVfZ2V0OiBhbGxvY2F0ZSBvciByZWNsYWltIGEgdm5vZGUg
Zm9yIGEgc3BlY2lmaWVkIGlub2RlLgogKgogKiA9PiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRt
cGZzX25vZGVfdDo6dG5fdmxvY2sgaGVsZC4KICogPT4gUmV0dXJucyB2bm9kZSAoKnZwcCkg
bG9ja2VkLgogKi8KaW50CnRtcGZzX3Zub2RlX2dldChzdHJ1Y3QgbW91bnQgKm1wLCB0bXBm
c19ub2RlX3QgKm5vZGUsIHZub2RlX3QgKip2cHApCnsKCXZub2RlX3QgKnZwOwoJaW50IGVy
cm9yOwphZ2FpbjoKCS8qIElmIHRoZXJlIGlzIGFscmVhZHkgYSB2bm9kZSwgdHJ5IHRvIHJl
Y2xhaW0gaXQuICovCglpZiAoKHZwID0gbm9kZS0+dG5fdm5vZGUpICE9IE5VTEwpIHsKCQlh
dG9taWNfb3JfdWxvbmcoJm5vZGUtPnRuX2dlbiwgVE1QRlNfUkVDTEFJTUlOR19CSVQpOwoJ
CW11dGV4X2VudGVyKCZ2cC0+dl9pbnRlcmxvY2spOwoJCW11dGV4X2V4aXQoJm5vZGUtPnRu
X3Zsb2NrKTsKCQllcnJvciA9IHZnZXQodnAsIExLX0VYQ0xVU0lWRSB8IExLX0lOVEVSTE9D
Syk7CgkJaWYgKGVycm9yID09IEVOT0VOVCkgewoJCQltdXRleF9lbnRlcigmbm9kZS0+dG5f
dmxvY2spOwoJCQlnb3RvIGFnYWluOwoJCX0KCQlhdG9taWNfYW5kX3Vsb25nKCZub2RlLT50
bl9nZW4sIH5UTVBGU19SRUNMQUlNSU5HX0JJVCk7CgkJKnZwcCA9IHZwOwoJCXJldHVybiBl
cnJvcjsKCX0KCWlmIChUTVBGU19OT0RFX1JFQ0xBSU1JTkcobm9kZSkpIHsKCQlhdG9taWNf
YW5kX3Vsb25nKCZub2RlLT50bl9nZW4sIH5UTVBGU19SRUNMQUlNSU5HX0JJVCk7Cgl9CgoJ
LyogR2V0IGEgbmV3IHZub2RlIGFuZCBhc3NvY2lhdGUgaXQgd2l0aCBvdXIgbm9kZS4gKi8K
CWVycm9yID0gZ2V0bmV3dm5vZGUoVlRfVE1QRlMsIG1wLCB0bXBmc192bm9kZW9wX3AsICZ2
cCk7CglpZiAoZXJyb3IpIHsKCQltdXRleF9leGl0KCZub2RlLT50bl92bG9jayk7CgkJcmV0
dXJuIGVycm9yOwoJfQoKCXZuX2xvY2sodnAsIExLX0VYQ0xVU0lWRSB8IExLX1JFVFJZKTsK
CXZwLT52X3R5cGUgPSBub2RlLT50bl90eXBlOwoKCS8qIFR5cGUtc3BlY2lmaWMgaW5pdGlh
bGl6YXRpb24uICovCglzd2l0Y2ggKG5vZGUtPnRuX3R5cGUpIHsKCWNhc2UgVkJMSzoKCWNh
c2UgVkNIUjoKCQl2cC0+dl9vcCA9IHRtcGZzX3NwZWNvcF9wOwoJCXNwZWNfbm9kZV9pbml0
KHZwLCBub2RlLT50bl9zcGVjLnRuX2Rldi50bl9yZGV2KTsKCQlicmVhazsKCWNhc2UgVkRJ
UjoKCQl2cC0+dl92ZmxhZyB8PSBub2RlLT50bl9zcGVjLnRuX2Rpci50bl9wYXJlbnQgPT0g
bm9kZSA/CgkJICAgIFZWX1JPT1QgOiAwOwoJCWJyZWFrOwoJY2FzZSBWRklGTzoKCQl2cC0+
dl9vcCA9IHRtcGZzX2ZpZm9vcF9wOwoJCWJyZWFrOwoJY2FzZSBWTE5LOgoJY2FzZSBWUkVH
OgoJY2FzZSBWU09DSzoKCQlicmVhazsKCWRlZmF1bHQ6CgkJS0FTU0VSVChmYWxzZSk7Cgl9
CgoJdXZtX3ZucF9zZXRzaXplKHZwLCBub2RlLT50bl9zaXplKTsKCXZwLT52X2RhdGEgPSBu
b2RlOwoJbm9kZS0+dG5fdm5vZGUgPSB2cDsKCW11dGV4X2V4aXQoJm5vZGUtPnRuX3Zsb2Nr
KTsKCglLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkpOwoJKnZwcCA9IHZwOwoJcmV0dXJuIDA7
Cn0KCi8qCiAqIHRtcGZzX2FsbG9jX2ZpbGU6IGFsbG9jYXRlIGEgbmV3IGZpbGUgb2Ygc3Bl
Y2lmaWVkIHR5cGUgYW5kIGFkZHMgaXQKICogaW50byB0aGUgcGFyZW50IGRpcmVjdG9yeS4K
ICoKICogPT4gQ3JlZGVudGlhbHMgb2YgdGhlIGNhbGxlciBhcmUgdXNlZC4KICovCmludAp0
bXBmc19hbGxvY19maWxlKHZub2RlX3QgKmR2cCwgdm5vZGVfdCAqKnZwcCwgc3RydWN0IHZh
dHRyICp2YXAsCiAgICBzdHJ1Y3QgY29tcG9uZW50bmFtZSAqY25wLCBjaGFyICp0YXJnZXQp
CnsKCXRtcGZzX21vdW50X3QgKnRtcCA9IFZGU19UT19UTVBGUyhkdnAtPnZfbW91bnQpOwoJ
dG1wZnNfbm9kZV90ICpkbm9kZSA9IFZQX1RPX1RNUEZTX0RJUihkdnApLCAqbm9kZTsKCXRt
cGZzX2RpcmVudF90ICpkZTsKCWludCBlcnJvcjsKCglLQVNTRVJUKFZPUF9JU0xPQ0tFRChk
dnApKTsKCSp2cHAgPSBOVUxMOwoKCS8qIENoZWNrIGZvciB0aGUgbWF4aW11bSBudW1iZXIg
b2YgbGlua3MgbGltaXQuICovCglpZiAodmFwLT52YV90eXBlID09IFZESVIpIHsKCQkvKiBD
aGVjayBmb3IgbWF4aW11bSBsaW5rcyBsaW1pdC4gKi8KCQlpZiAoZG5vZGUtPnRuX2xpbmtz
ID09IExJTktfTUFYKSB7CgkJCWVycm9yID0gRU1MSU5LOwoJCQlnb3RvIG91dDsKCQl9CgkJ
S0FTU0VSVChkbm9kZS0+dG5fbGlua3MgPCBMSU5LX01BWCk7Cgl9CgoJLyogQWxsb2NhdGUg
YSBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgbmV3IGZpbGUuICovCgllcnJvciA9IHRtcGZz
X2FsbG9jX25vZGUodG1wLCB2YXAtPnZhX3R5cGUsIGthdXRoX2NyZWRfZ2V0ZXVpZChjbnAt
PmNuX2NyZWQpLAoJICAgIGRub2RlLT50bl9naWQsIHZhcC0+dmFfbW9kZSwgdGFyZ2V0LCB2
YXAtPnZhX3JkZXYsICZub2RlKTsKCWlmIChlcnJvcikKCQlnb3RvIG91dDsKCgkvKiBBbGxv
Y2F0ZSBhIGRpcmVjdG9yeSBlbnRyeSB0aGF0IHBvaW50cyB0byB0aGUgbmV3IGZpbGUuICov
CgllcnJvciA9IHRtcGZzX2FsbG9jX2RpcmVudCh0bXAsIGNucC0+Y25fbmFtZXB0ciwgY25w
LT5jbl9uYW1lbGVuLCAmZGUpOwoJaWYgKGVycm9yKSB7CgkJdG1wZnNfZnJlZV9ub2RlKHRt
cCwgbm9kZSk7CgkJZ290byBvdXQ7Cgl9CgoJLyogR2V0IGEgdm5vZGUgZm9yIHRoZSBuZXcg
ZmlsZS4gKi8KCW11dGV4X2VudGVyKCZub2RlLT50bl92bG9jayk7CgllcnJvciA9IHRtcGZz
X3Zub2RlX2dldChkdnAtPnZfbW91bnQsIG5vZGUsIHZwcCk7CglpZiAoZXJyb3IpIHsKCQl0
bXBmc19mcmVlX2RpcmVudCh0bXAsIGRlKTsKCQl0bXBmc19mcmVlX25vZGUodG1wLCBub2Rl
KTsKCQlnb3RvIG91dDsKCX0KCgkvKiBBc3NvY2lhdGUgaW5vZGUgYW5kIGF0dGFjaCB0aGUg
ZW50cnkgaW50byB0aGUgZGlyZWN0b3J5LiAqLwoJdG1wZnNfZGlyX2F0dGFjaChkdnAsIGRl
LCBub2RlKTsKb3V0OgoJdnB1dChkdnApOwoJcmV0dXJuIGVycm9yOwp9CgovKgogKiB0bXBm
c19hbGxvY19kaXJlbnQ6IGFsbG9jYXRlcyBhIG5ldyBkaXJlY3RvcnkgZW50cnkgZm9yIHRo
ZSBpbm9kZS4KICogVGhlIGRpcmVjdG9yeSBlbnRyeSBjb250YWlucyBhIHBhdGggbmFtZSBj
b21wb25lbnQuCiAqLwppbnQKdG1wZnNfYWxsb2NfZGlyZW50KHRtcGZzX21vdW50X3QgKnRt
cCwgY29uc3QgY2hhciAqbmFtZSwgdWludDE2X3QgbGVuLAogICAgdG1wZnNfZGlyZW50X3Qg
KipkZSkKewoJdG1wZnNfZGlyZW50X3QgKm5kZTsKCgluZGUgPSB0bXBmc19kaXJlbnRfZ2V0
KHRtcCk7CglpZiAobmRlID09IE5VTEwpCgkJcmV0dXJuIEVOT1NQQzsKCgluZGUtPnRkX25h
bWUgPSB0bXBmc19zdHJuYW1lX2FsbG9jKHRtcCwgbGVuKTsKCWlmIChuZGUtPnRkX25hbWUg
PT0gTlVMTCkgewoJCXRtcGZzX2RpcmVudF9wdXQodG1wLCBuZGUpOwoJCXJldHVybiBFTk9T
UEM7Cgl9CgluZGUtPnRkX25hbWVsZW4gPSBsZW47CgltZW1jcHkobmRlLT50ZF9uYW1lLCBu
YW1lLCBsZW4pOwoKCSpkZSA9IG5kZTsKCXJldHVybiAwOwp9CgovKgogKiB0bXBmc19mcmVl
X2RpcmVudDogZnJlZSBhIGRpcmVjdG9yeSBlbnRyeS4KICovCnZvaWQKdG1wZnNfZnJlZV9k
aXJlbnQodG1wZnNfbW91bnRfdCAqdG1wLCB0bXBmc19kaXJlbnRfdCAqZGUpCnsKCgkvKiBL
QVNTRVJUKGRlLT50ZF9ub2RlID09IE5VTEwpOyAqLwoJdG1wZnNfc3RybmFtZV9mcmVlKHRt
cCwgZGUtPnRkX25hbWUsIGRlLT50ZF9uYW1lbGVuKTsKCXRtcGZzX2RpcmVudF9wdXQodG1w
LCBkZSk7Cn0KCi8qCiAqIHRtcGZzX2Rpcl9hdHRhY2g6IGFzc29jaWF0ZSBkaXJlY3Rvcnkg
ZW50cnkgd2l0aCBhIHNwZWNpZmllZCBpbm9kZSwKICogYW5kIGF0dGFjaCB0aGUgZW50cnkg
aW50byB0aGUgZGlyZWN0b3J5LCBzcGVjaWZpZWQgYnkgdm5vZGUuCiAqCiAqID0+IEluY3Jl
YXNlcyBsaW5rIGNvdW50IG9uIHRoZSBhc3NvY2lhdGVkIG5vZGUuCiAqID0+IEluY3JlYXNl
cyBsaW5rIGNvdW50IG9uIGRpcmVjdG9yeSBub2RlLCBpZiBvdXIgbm9kZSBpcyBWRElSLgog
KiAgICBJdCBpcyBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBjaGVjayBmb3IgdGhlIExJ
TktfTUFYIGxpbWl0LgogKiA9PiBUcmlnZ2VycyBrcXVldWUgZXZlbnRzIGhlcmUuCiAqLwp2
b2lkCnRtcGZzX2Rpcl9hdHRhY2godm5vZGVfdCAqZHZwLCB0bXBmc19kaXJlbnRfdCAqZGUs
IHRtcGZzX25vZGVfdCAqbm9kZSkKewoJdG1wZnNfbm9kZV90ICpkbm9kZSA9IFZQX1RPX1RN
UEZTX0RJUihkdnApOwoJaW50IGV2ZW50cyA9IE5PVEVfV1JJVEU7CgoJS0FTU0VSVChWT1Bf
SVNMT0NLRUQoZHZwKSk7CgoJLyogQXNzb2NpYXRlIGRpcmVjdG9yeSBlbnRyeSBhbmQgdGhl
IGlub2RlLiAqLwoJaWYgKG5vZGUgIT0gVE1QRlNfTk9ERV9XSElURU9VVCkgewoJCWRlLT50
ZF9ub2RlID0gbm9kZTsKCQlLQVNTRVJUKG5vZGUtPnRuX2xpbmtzIDwgTElOS19NQVgpOwoJ
CW5vZGUtPnRuX2xpbmtzKys7CgoJCS8qIFNhdmUgdGhlIGhpbnQgKG1pZ2h0IG92ZXJ3cml0
ZSkuICovCgkJbm9kZS0+dG5fZGlyZW50X2hpbnQgPSBkZTsKCX0KCgkvKiBJbnNlcnQgdGhl
IGVudHJ5IHRvIHRoZSBkaXJlY3RvcnkgKHBhcmVudCBvZiBpbm9kZSkuICovCglUQUlMUV9J
TlNFUlRfVEFJTCgmZG5vZGUtPnRuX3NwZWMudG5fZGlyLnRuX2RpciwgZGUsIHRkX2VudHJp
ZXMpOwoJZG5vZGUtPnRuX3NpemUgKz0gc2l6ZW9mKHRtcGZzX2RpcmVudF90KTsKCWRub2Rl
LT50bl9zdGF0dXMgfD0gVE1QRlNfTk9ERV9TVEFUVVNBTEw7Cgl1dm1fdm5wX3NldHNpemUo
ZHZwLCBkbm9kZS0+dG5fc2l6ZSk7CgoJaWYgKG5vZGUgIT0gVE1QRlNfTk9ERV9XSElURU9V
VCAmJiBub2RlLT50bl90eXBlID09IFZESVIpIHsKCQkvKiBTZXQgcGFyZW50LiAqLwoJCUtB
U1NFUlQobm9kZS0+dG5fc3BlYy50bl9kaXIudG5fcGFyZW50ID09IE5VTEwpOwoJCW5vZGUt
PnRuX3NwZWMudG5fZGlyLnRuX3BhcmVudCA9IGRub2RlOwoKCQkvKiBJbmNyZWFzZSB0aGUg
bGluayBjb3VudCBvZiBwYXJlbnQuICovCgkJS0FTU0VSVChkbm9kZS0+dG5fbGlua3MgPCBM
SU5LX01BWCk7CgkJZG5vZGUtPnRuX2xpbmtzKys7CgkJZXZlbnRzIHw9IE5PVEVfTElOSzsK
CgkJVE1QRlNfVkFMSURBVEVfRElSKG5vZGUpOwoJfQoJVk5fS05PVEUoZHZwLCBldmVudHMp
Owp9CgovKgogKiB0bXBmc19kaXJfZGV0YWNoOiBkaXNhc3NvY2lhdGUgZGlyZWN0b3J5IGVu
dHJ5IGFuZCBpdHMgaW5vZGUsCiAqIGFuZCBkZXRhY2ggdGhlIGVudHJ5IGZyb20gdGhlIGRp
cmVjdG9yeSwgc3BlY2lmaWVkIGJ5IHZub2RlLgogKgogKiA9PiBEZWNyZWFzZXMgbGluayBj
b3VudCBvbiB0aGUgYXNzb2NpYXRlZCBub2RlLgogKiA9PiBEZWNyZWFzZXMgdGhlIGxpbmsg
Y291bnQgb24gZGlyZWN0b3J5IG5vZGUsIGlmIG91ciBub2RlIGlzIFZESVIuCiAqID0+IFRy
aWdnZXJzIGtxdWV1ZSBldmVudHMgaGVyZS4KICovCnZvaWQKdG1wZnNfZGlyX2RldGFjaCh2
bm9kZV90ICpkdnAsIHRtcGZzX2RpcmVudF90ICpkZSkKewoJdG1wZnNfbm9kZV90ICpkbm9k
ZSA9IFZQX1RPX1RNUEZTX0RJUihkdnApOwoJdG1wZnNfbm9kZV90ICpub2RlID0gZGUtPnRk
X25vZGU7CglpbnQgZXZlbnRzID0gTk9URV9XUklURTsKCglLQVNTRVJUKFZPUF9JU0xPQ0tF
RChkdnApKTsKCglpZiAobm9kZSAhPSBUTVBGU19OT0RFX1dISVRFT1VUKSB7CgkJdm5vZGVf
dCAqdnAgPSBub2RlLT50bl92bm9kZTsKCgkJS0FTU0VSVChWT1BfSVNMT0NLRUQodnApKTsK
CgkJLyogRGVhc3NvY2lhdGUgdGhlIGlub2RlIGFuZCBlbnRyeS4gKi8KCQlkZS0+dGRfbm9k
ZSA9IE5VTEw7CgkJbm9kZS0+dG5fZGlyZW50X2hpbnQgPSBOVUxMOwoKCQlLQVNTRVJUKG5v
ZGUtPnRuX2xpbmtzID4gMCk7CgkJbm9kZS0+dG5fbGlua3MtLTsKCQlpZiAodnApIHsKCQkJ
Vk5fS05PVEUodnAsIG5vZGUtPnRuX2xpbmtzID8KCQkJICAgIE5PVEVfTElOSyA6IE5PVEVf
REVMRVRFKTsKCQl9CgoJCS8qIElmIGRpcmVjdG9yeSAtIGRlY3JlYXNlIHRoZSBsaW5rIGNv
dW50IG9mIHBhcmVudC4gKi8KCQlpZiAobm9kZS0+dG5fdHlwZSA9PSBWRElSKSB7CgkJCUtB
U1NFUlQobm9kZS0+dG5fc3BlYy50bl9kaXIudG5fcGFyZW50ID09IGRub2RlKTsKCQkJbm9k
ZS0+dG5fc3BlYy50bl9kaXIudG5fcGFyZW50ID0gTlVMTDsKCgkJCUtBU1NFUlQoZG5vZGUt
PnRuX2xpbmtzID4gMCk7CgkJCWRub2RlLT50bl9saW5rcy0tOwoJCQlldmVudHMgfD0gTk9U
RV9MSU5LOwoJCX0KCX0KCgkvKiBSZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIGRpcmVjdG9y
eS4gKi8KCWlmIChkbm9kZS0+dG5fc3BlYy50bl9kaXIudG5fcmVhZGRpcl9sYXN0cCA9PSBk
ZSkgewoJCWRub2RlLT50bl9zcGVjLnRuX2Rpci50bl9yZWFkZGlyX2xhc3RuID0gMDsKCQlk
bm9kZS0+dG5fc3BlYy50bl9kaXIudG5fcmVhZGRpcl9sYXN0cCA9IE5VTEw7Cgl9CglUQUlM
UV9SRU1PVkUoJmRub2RlLT50bl9zcGVjLnRuX2Rpci50bl9kaXIsIGRlLCB0ZF9lbnRyaWVz
KTsKCglkbm9kZS0+dG5fc2l6ZSAtPSBzaXplb2YodG1wZnNfZGlyZW50X3QpOwoJZG5vZGUt
PnRuX3N0YXR1cyB8PSBUTVBGU19OT0RFX1NUQVRVU0FMTDsKCXV2bV92bnBfc2V0c2l6ZShk
dnAsIGRub2RlLT50bl9zaXplKTsKCVZOX0tOT1RFKGR2cCwgZXZlbnRzKTsKfQoKLyoKICog
dG1wZnNfZGlyX2xvb2t1cDogZmluZCBhIGRpcmVjdG9yeSBlbnRyeSBpbiB0aGUgc3BlY2lm
aWVkIGlub2RlLgogKgogKiBOb3RlIHRoYXQgdGhlIC4gYW5kIC4uIGNvbXBvbmVudHMgYXJl
IG5vdCBhbGxvd2VkIGFzIHRoZXkgZG8gbm90CiAqIHBoeXNpY2FsbHkgZXhpc3Qgd2l0aGlu
IGRpcmVjdG9yaWVzLgogKi8KdG1wZnNfZGlyZW50X3QgKgp0bXBmc19kaXJfbG9va3VwKHRt
cGZzX25vZGVfdCAqbm9kZSwgc3RydWN0IGNvbXBvbmVudG5hbWUgKmNucCkKewoJY29uc3Qg
Y2hhciAqbmFtZSA9IGNucC0+Y25fbmFtZXB0cjsKCWNvbnN0IHVpbnQxNl90IG5sZW4gPSBj
bnAtPmNuX25hbWVsZW47Cgl0bXBmc19kaXJlbnRfdCAqZGU7CgoJS0FTU0VSVChWT1BfSVNM
T0NLRUQobm9kZS0+dG5fdm5vZGUpKTsKCUtBU1NFUlQobmxlbiAhPSAxIHx8ICEobmFtZVsw
XSA9PSAnLicpKTsKCUtBU1NFUlQobmxlbiAhPSAyIHx8ICEobmFtZVswXSA9PSAnLicgJiYg
bmFtZVsxXSA9PSAnLicpKTsKCVRNUEZTX1ZBTElEQVRFX0RJUihub2RlKTsKCglUQUlMUV9G
T1JFQUNIKGRlLCAmbm9kZS0+dG5fc3BlYy50bl9kaXIudG5fZGlyLCB0ZF9lbnRyaWVzKSB7
CgkJaWYgKGRlLT50ZF9uYW1lbGVuICE9IG5sZW4pCgkJCWNvbnRpbnVlOwoJCWlmIChtZW1j
bXAoZGUtPnRkX25hbWUsIG5hbWUsIG5sZW4pICE9IDApCgkJCWNvbnRpbnVlOwoJCWJyZWFr
OwoJfQoJbm9kZS0+dG5fc3RhdHVzIHw9IFRNUEZTX05PREVfQUNDRVNTRUQ7CglyZXR1cm4g
ZGU7Cn0KCi8qCiAqIHRtcGZzX2Rpcl9jYWNoZWQ6IGdldCBhIGNhY2hlZCBkaXJlY3Rvcnkg
ZW50cnkgaWYgaXQgaXMgdmFsaWQuICBVc2VkIHRvCiAqIGF2b2lkIHVubmVjZXNzYXJ5IHRt
cGRzX2Rpcl9sb29rdXAoKS4KICoKICogPT4gVGhlIHZub2RlIG11c3QgYmUgbG9ja2VkLgog
Ki8KdG1wZnNfZGlyZW50X3QgKgp0bXBmc19kaXJfY2FjaGVkKHRtcGZzX25vZGVfdCAqbm9k
ZSkKewoJdG1wZnNfZGlyZW50X3QgKmRlID0gbm9kZS0+dG5fZGlyZW50X2hpbnQ7CgoJS0FT
U0VSVChWT1BfSVNMT0NLRUQobm9kZS0+dG5fdm5vZGUpKTsKCglpZiAoZGUgPT0gTlVMTCkg
ewoJCXJldHVybiBOVUxMOwoJfQoJS0FTU0VSVChkZS0+dGRfbm9kZSA9PSBub2RlKTsKCgkv
KgoJICogRGlyZWN0b3JpZXMgYWx3YXlzIGhhdmUgYSB2YWxpZCBoaW50LiAgRm9yIGZpbGVz
LCBjaGVjayBpZiB0aGVyZQoJICogYXJlIGFueSBoYXJkIGxpbmtzLiAgSWYgdGhlcmUgYXJl
IC0gaGludCBtaWdodCBiZSBpbnZhbGlkLgoJICovCglyZXR1cm4gKG5vZGUtPnRuX3R5cGUg
IT0gVkRJUiAmJiBub2RlLT50bl9saW5rcyA+IDEpID8gTlVMTCA6IGRlOwp9CgovKgogKiB0
bXBmc19kaXJfZ2V0ZG90ZGVudDogaGVscGVyIGZ1bmN0aW9uIGZvciB0bXBmc19yZWFkZGly
LiAgQ3JlYXRlcyBhCiAqICcuJyBlbnRyeSBmb3IgdGhlIGdpdmVuIGRpcmVjdG9yeSBhbmQg
cmV0dXJucyBpdCBpbiB0aGUgdWlvIHNwYWNlLgogKi8KaW50CnRtcGZzX2Rpcl9nZXRkb3Rk
ZW50KHRtcGZzX25vZGVfdCAqbm9kZSwgc3RydWN0IHVpbyAqdWlvKQp7CglzdHJ1Y3QgZGly
ZW50ICpkZW50cDsKCWludCBlcnJvcjsKCglUTVBGU19WQUxJREFURV9ESVIobm9kZSk7CglL
QVNTRVJUKHVpby0+dWlvX29mZnNldCA9PSBUTVBGU19ESVJDT09LSUVfRE9UKTsKCglkZW50
cCA9IGttZW1fYWxsb2Moc2l6ZW9mKHN0cnVjdCBkaXJlbnQpLCBLTV9TTEVFUCk7CglkZW50
cC0+ZF9maWxlbm8gPSBub2RlLT50bl9pZDsKCWRlbnRwLT5kX3R5cGUgPSBEVF9ESVI7Cglk
ZW50cC0+ZF9uYW1sZW4gPSAxOwoJZGVudHAtPmRfbmFtZVswXSA9ICcuJzsKCWRlbnRwLT5k
X25hbWVbMV0gPSAnXDAnOwoJZGVudHAtPmRfcmVjbGVuID0gX0RJUkVOVF9TSVpFKGRlbnRw
KTsKCglpZiAoZGVudHAtPmRfcmVjbGVuID4gdWlvLT51aW9fcmVzaWQpCgkJZXJyb3IgPSAt
MTsKCWVsc2UgewoJCWVycm9yID0gdWlvbW92ZShkZW50cCwgZGVudHAtPmRfcmVjbGVuLCB1
aW8pOwoJCWlmIChlcnJvciA9PSAwKQoJCQl1aW8tPnVpb19vZmZzZXQgPSBUTVBGU19ESVJD
T09LSUVfRE9URE9UOwoJfQoJbm9kZS0+dG5fc3RhdHVzIHw9IFRNUEZTX05PREVfQUNDRVNT
RUQ7CglrbWVtX2ZyZWUoZGVudHAsIHNpemVvZihzdHJ1Y3QgZGlyZW50KSk7CglyZXR1cm4g
ZXJyb3I7Cn0KCi8qCiAqIHRtcGZzX2Rpcl9nZXRkb3Rkb3RkZW50OiBoZWxwZXIgZnVuY3Rp
b24gZm9yIHRtcGZzX3JlYWRkaXIuICBDcmVhdGVzIGEKICogJy4uJyBlbnRyeSBmb3IgdGhl
IGdpdmVuIGRpcmVjdG9yeSBhbmQgcmV0dXJucyBpdCBpbiB0aGUgdWlvIHNwYWNlLgogKi8K
aW50CnRtcGZzX2Rpcl9nZXRkb3Rkb3RkZW50KHRtcGZzX25vZGVfdCAqbm9kZSwgc3RydWN0
IHVpbyAqdWlvKQp7CglzdHJ1Y3QgZGlyZW50ICpkZW50cDsKCWludCBlcnJvcjsKCglUTVBG
U19WQUxJREFURV9ESVIobm9kZSk7CglLQVNTRVJUKHVpby0+dWlvX29mZnNldCA9PSBUTVBG
U19ESVJDT09LSUVfRE9URE9UKTsKCglkZW50cCA9IGttZW1fYWxsb2Moc2l6ZW9mKHN0cnVj
dCBkaXJlbnQpLCBLTV9TTEVFUCk7CglkZW50cC0+ZF9maWxlbm8gPSBub2RlLT50bl9zcGVj
LnRuX2Rpci50bl9wYXJlbnQtPnRuX2lkOwoJZGVudHAtPmRfdHlwZSA9IERUX0RJUjsKCWRl
bnRwLT5kX25hbWxlbiA9IDI7CglkZW50cC0+ZF9uYW1lWzBdID0gJy4nOwoJZGVudHAtPmRf
bmFtZVsxXSA9ICcuJzsKCWRlbnRwLT5kX25hbWVbMl0gPSAnXDAnOwoJZGVudHAtPmRfcmVj
bGVuID0gX0RJUkVOVF9TSVpFKGRlbnRwKTsKCglpZiAoZGVudHAtPmRfcmVjbGVuID4gdWlv
LT51aW9fcmVzaWQpCgkJZXJyb3IgPSAtMTsKCWVsc2UgewoJCWVycm9yID0gdWlvbW92ZShk
ZW50cCwgZGVudHAtPmRfcmVjbGVuLCB1aW8pOwoJCWlmIChlcnJvciA9PSAwKSB7CgkJCXRt
cGZzX2RpcmVudF90ICpkZTsKCgkJCWRlID0gVEFJTFFfRklSU1QoJm5vZGUtPnRuX3NwZWMu
dG5fZGlyLnRuX2Rpcik7CgkJCWlmIChkZSA9PSBOVUxMKQoJCQkJdWlvLT51aW9fb2Zmc2V0
ID0gVE1QRlNfRElSQ09PS0lFX0VPRjsKCQkJZWxzZQoJCQkJdWlvLT51aW9fb2Zmc2V0ID0g
dG1wZnNfZGlyY29va2llKGRlKTsKCQl9Cgl9Cglub2RlLT50bl9zdGF0dXMgfD0gVE1QRlNf
Tk9ERV9BQ0NFU1NFRDsKCWttZW1fZnJlZShkZW50cCwgc2l6ZW9mKHN0cnVjdCBkaXJlbnQp
KTsKCXJldHVybiBlcnJvcjsKfQoKLyoKICogdG1wZnNfZGlyX2xvb2t1cGJ5Y29va2llOiBs
b29rdXAgYSBkaXJlY3RvcnkgZW50cnkgYnkgYXNzb2NpYXRlZCBjb29raWUuCiAqLwp0bXBm
c19kaXJlbnRfdCAqCnRtcGZzX2Rpcl9sb29rdXBieWNvb2tpZSh0bXBmc19ub2RlX3QgKm5v
ZGUsIG9mZl90IGNvb2tpZSkKewoJdG1wZnNfZGlyZW50X3QgKmRlOwoKCUtBU1NFUlQoVk9Q
X0lTTE9DS0VEKG5vZGUtPnRuX3Zub2RlKSk7CgoJaWYgKGNvb2tpZSA9PSBub2RlLT50bl9z
cGVjLnRuX2Rpci50bl9yZWFkZGlyX2xhc3RuICYmCgkgICAgbm9kZS0+dG5fc3BlYy50bl9k
aXIudG5fcmVhZGRpcl9sYXN0cCAhPSBOVUxMKSB7CgkJcmV0dXJuIG5vZGUtPnRuX3NwZWMu
dG5fZGlyLnRuX3JlYWRkaXJfbGFzdHA7Cgl9CglUQUlMUV9GT1JFQUNIKGRlLCAmbm9kZS0+
dG5fc3BlYy50bl9kaXIudG5fZGlyLCB0ZF9lbnRyaWVzKSB7CgkJaWYgKHRtcGZzX2RpcmNv
b2tpZShkZSkgPT0gY29va2llKSB7CgkJCWJyZWFrOwoJCX0KCX0KCXJldHVybiBkZTsKfQoK
LyoKICogdG1wZnNfZGlyX2dldGRlbnRzOiByZWxwZXIgZnVuY3Rpb24gZm9yIHRtcGZzX3Jl
YWRkaXIuCiAqCiAqID0+IFJldHVybnMgYXMgbXVjaCBkaXJlY3RvcnkgZW50cmllcyBhcyBj
YW4gZml0IGluIHRoZSB1aW8gc3BhY2UuCiAqID0+IFRoZSByZWFkIHN0YXJ0cyBhdCB1aW8t
PnVpb19vZmZzZXQuCiAqLwppbnQKdG1wZnNfZGlyX2dldGRlbnRzKHRtcGZzX25vZGVfdCAq
bm9kZSwgc3RydWN0IHVpbyAqdWlvLCBvZmZfdCAqY250cCkKewoJdG1wZnNfZGlyZW50X3Qg
KmRlOwoJc3RydWN0IGRpcmVudCAqZGVudHA7CglvZmZfdCBzdGFydGNvb2tpZTsKCWludCBl
cnJvcjsKCglLQVNTRVJUKFZPUF9JU0xPQ0tFRChub2RlLT50bl92bm9kZSkpOwoJVE1QRlNf
VkFMSURBVEVfRElSKG5vZGUpOwoKCS8qCgkgKiBMb2NhdGUgdGhlIGZpcnN0IGRpcmVjdG9y
eSBlbnRyeSB3ZSBoYXZlIHRvIHJldHVybi4gIFdlIGhhdmUgY2FjaGVkCgkgKiB0aGUgbGFz
dCByZWFkZGlyIGluIHRoZSBub2RlLCBzbyB1c2UgdGhvc2UgdmFsdWVzIGlmIGFwcHJvcHJp
YXRlLgoJICogT3RoZXJ3aXNlIGRvIGEgbGluZWFyIHNjYW4gdG8gZmluZCB0aGUgcmVxdWVz
dGVkIGVudHJ5LgoJICovCglzdGFydGNvb2tpZSA9IHVpby0+dWlvX29mZnNldDsKCUtBU1NF
UlQoc3RhcnRjb29raWUgIT0gVE1QRlNfRElSQ09PS0lFX0RPVCk7CglLQVNTRVJUKHN0YXJ0
Y29va2llICE9IFRNUEZTX0RJUkNPT0tJRV9ET1RET1QpOwoJaWYgKHN0YXJ0Y29va2llID09
IFRNUEZTX0RJUkNPT0tJRV9FT0YpIHsKCQlyZXR1cm4gMDsKCX0gZWxzZSB7CgkJZGUgPSB0
bXBmc19kaXJfbG9va3VwYnljb29raWUobm9kZSwgc3RhcnRjb29raWUpOwoJfQoJaWYgKGRl
ID09IE5VTEwpIHsKCQlyZXR1cm4gRUlOVkFMOwoJfQoKCS8qCgkgKiBSZWFkIGFzIG11Y2gg
ZW50cmllcyBhcyBwb3NzaWJsZTsgaS5lLiwgdW50aWwgd2UgcmVhY2ggdGhlIGVuZAoJICog
b2YgdGhlIGRpcmVjdG9yeSBvciB3ZSBleGhhdXN0IHVpbyBzcGFjZS4KCSAqLwoJZGVudHAg
PSBrbWVtX2FsbG9jKHNpemVvZihzdHJ1Y3QgZGlyZW50KSwgS01fU0xFRVApOwoJZG8gewoJ
CS8qCgkJICogQ3JlYXRlIGEgZGlyZW50IHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGN1
cnJlbnQKCQkgKiBpbm9kZSBhbmQgZmlsbCBpdC4KCQkgKi8KCQlpZiAoZGUtPnRkX25vZGUg
PT0gVE1QRlNfTk9ERV9XSElURU9VVCkgewoJCQlkZW50cC0+ZF9maWxlbm8gPSAxOwoJCQlk
ZW50cC0+ZF90eXBlID0gRFRfV0hUOwoJCX0gZWxzZSB7CgkJCWRlbnRwLT5kX2ZpbGVubyA9
IGRlLT50ZF9ub2RlLT50bl9pZDsKCQkJc3dpdGNoIChkZS0+dGRfbm9kZS0+dG5fdHlwZSkg
ewoJCQljYXNlIFZCTEs6CgkJCQlkZW50cC0+ZF90eXBlID0gRFRfQkxLOwoJCQkJYnJlYWs7
CgkJCWNhc2UgVkNIUjoKCQkJCWRlbnRwLT5kX3R5cGUgPSBEVF9DSFI7CgkJCQlicmVhazsK
CQkJY2FzZSBWRElSOgoJCQkJZGVudHAtPmRfdHlwZSA9IERUX0RJUjsKCQkJCWJyZWFrOwoJ
CQljYXNlIFZGSUZPOgoJCQkJZGVudHAtPmRfdHlwZSA9IERUX0ZJRk87CgkJCQlicmVhazsK
CQkJY2FzZSBWTE5LOgoJCQkJZGVudHAtPmRfdHlwZSA9IERUX0xOSzsKCQkJCWJyZWFrOwoJ
CQljYXNlIFZSRUc6CgkJCQlkZW50cC0+ZF90eXBlID0gRFRfUkVHOwoJCQkJYnJlYWs7CgkJ
CWNhc2UgVlNPQ0s6CgkJCQlkZW50cC0+ZF90eXBlID0gRFRfU09DSzsKCQkJCWJyZWFrOwoJ
CQlkZWZhdWx0OgoJCQkJS0FTU0VSVChmYWxzZSk7CgkJCX0KCQl9CgkJZGVudHAtPmRfbmFt
bGVuID0gZGUtPnRkX25hbWVsZW47CgkJS0FTU0VSVChkZS0+dGRfbmFtZWxlbiA8IHNpemVv
ZihkZW50cC0+ZF9uYW1lKSk7CgkJbWVtY3B5KGRlbnRwLT5kX25hbWUsIGRlLT50ZF9uYW1l
LCBkZS0+dGRfbmFtZWxlbik7CgkJZGVudHAtPmRfbmFtZVtkZS0+dGRfbmFtZWxlbl0gPSAn
XDAnOwoJCWRlbnRwLT5kX3JlY2xlbiA9IF9ESVJFTlRfU0laRShkZW50cCk7CgoJCS8qIFN0
b3AgcmVhZGluZyBpZiB0aGUgZGlyZWN0b3J5IGVudHJ5IHdlIGFyZSB0cmVhdGluZyBpcwoJ
CSAqIGJpZ2dlciB0aGFuIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGNhbiBiZSByZXR1cm5l
ZC4gKi8KCQlpZiAoZGVudHAtPmRfcmVjbGVuID4gdWlvLT51aW9fcmVzaWQpIHsKCQkJZXJy
b3IgPSAtMTsKCQkJYnJlYWs7CgkJfQoKCQkvKgoJCSAqIENvcHkgdGhlIG5ldyBkaXJlbnQg
c3RydWN0dXJlIGludG8gdGhlIG91dHB1dCBidWZmZXIgYW5kCgkJICogYWR2YW5jZSBwb2lu
dGVycy4KCQkgKi8KCQllcnJvciA9IHVpb21vdmUoZGVudHAsIGRlbnRwLT5kX3JlY2xlbiwg
dWlvKTsKCgkJKCpjbnRwKSsrOwoJCWRlID0gVEFJTFFfTkVYVChkZSwgdGRfZW50cmllcyk7
Cgl9IHdoaWxlIChlcnJvciA9PSAwICYmIHVpby0+dWlvX3Jlc2lkID4gMCAmJiBkZSAhPSBO
VUxMKTsKCgkvKiBVcGRhdGUgdGhlIG9mZnNldCBhbmQgY2FjaGUuICovCglpZiAoZGUgPT0g
TlVMTCkgewoJCXVpby0+dWlvX29mZnNldCA9IFRNUEZTX0RJUkNPT0tJRV9FT0Y7CgkJbm9k
ZS0+dG5fc3BlYy50bl9kaXIudG5fcmVhZGRpcl9sYXN0biA9IDA7CgkJbm9kZS0+dG5fc3Bl
Yy50bl9kaXIudG5fcmVhZGRpcl9sYXN0cCA9IE5VTEw7Cgl9IGVsc2UgewoJCW5vZGUtPnRu
X3NwZWMudG5fZGlyLnRuX3JlYWRkaXJfbGFzdG4gPSB1aW8tPnVpb19vZmZzZXQgPQoJCSAg
ICB0bXBmc19kaXJjb29raWUoZGUpOwoJCW5vZGUtPnRuX3NwZWMudG5fZGlyLnRuX3JlYWRk
aXJfbGFzdHAgPSBkZTsKCX0KCW5vZGUtPnRuX3N0YXR1cyB8PSBUTVBGU19OT0RFX0FDQ0VT
U0VEOwoJa21lbV9mcmVlKGRlbnRwLCBzaXplb2Yoc3RydWN0IGRpcmVudCkpOwoJcmV0dXJu
IGVycm9yOwp9CgovKgogKiB0bXBmc19yZWdfcmVzaXplOiByZXNpemUgdGhlIHVuZGVybHlp
bmcgVVZNIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIAogKiBzcGVjaWZpZWQgcmVndWxh
ciBmaWxlLgogKi8KaW50CnRtcGZzX3JlZ19yZXNpemUoc3RydWN0IHZub2RlICp2cCwgb2Zm
X3QgbmV3c2l6ZSkKewoJdG1wZnNfbW91bnRfdCAqdG1wID0gVkZTX1RPX1RNUEZTKHZwLT52
X21vdW50KTsKCXRtcGZzX25vZGVfdCAqbm9kZSA9IFZQX1RPX1RNUEZTX05PREUodnApOwoJ
c2l6ZV90IG5ld3BhZ2VzLCBvbGRwYWdlczsKCW9mZl90IG9sZHNpemU7CgoJS0FTU0VSVCh2
cC0+dl90eXBlID09IFZSRUcpOwoJS0FTU0VSVChuZXdzaXplID49IDApOwoKCW9sZHNpemUg
PSBub2RlLT50bl9zaXplOwoJb2xkcGFnZXMgPSByb3VuZF9wYWdlKG9sZHNpemUpID4+IFBB
R0VfU0hJRlQ7CgluZXdwYWdlcyA9IHJvdW5kX3BhZ2UobmV3c2l6ZSkgPj4gUEFHRV9TSElG
VDsKCUtBU1NFUlQob2xkcGFnZXMgPT0gbm9kZS0+dG5fc3BlYy50bl9yZWcudG5fYW9ial9w
YWdlcyk7CgoJaWYgKG5ld3BhZ2VzID4gb2xkcGFnZXMpIHsKCQkvKiBJbmNyZWFzZSB0aGUg
dXNlZC1tZW1vcnkgY291bnRlciBpZiBnZXR0aW5nIGV4dHJhIHBhZ2VzLiAqLwoJCWlmICgh
dG1wZnNfbWVtX2luY3IodG1wLCAobmV3cGFnZXMgLSBvbGRwYWdlcykgPDwgUEFHRV9TSElG
VCkpIHsKCQkJcmV0dXJuIEVOT1NQQzsKCQl9Cgl9IGVsc2UgaWYgKG5ld3NpemUgPCBvbGRz
aXplKSB7CgkJaW50IHplcm9sZW4gPSBNSU4ocm91bmRfcGFnZShuZXdzaXplKSwgbm9kZS0+
dG5fc2l6ZSkgLSBuZXdzaXplOwoKCQkvKiBaZXJvIG91dCB0aGUgdHJ1bmNhdGVkIHBhcnQg
b2YgdGhlIGxhc3QgcGFnZS4gKi8KCQl1dm1fdm5wX3plcm9yYW5nZSh2cCwgbmV3c2l6ZSwg
emVyb2xlbik7Cgl9CgoJbm9kZS0+dG5fc3BlYy50bl9yZWcudG5fYW9ial9wYWdlcyA9IG5l
d3BhZ2VzOwoJbm9kZS0+dG5fc2l6ZSA9IG5ld3NpemU7Cgl1dm1fdm5wX3NldHNpemUodnAs
IG5ld3NpemUpOwoKCS8qCgkgKiBGcmVlICJiYWNraW5nIHN0b3JlIi4KCSAqLwoJaWYgKG5l
d3BhZ2VzIDwgb2xkcGFnZXMpIHsKCQlzdHJ1Y3QgdXZtX29iamVjdCAqdW9iajsKCgkJdW9i
aiA9IG5vZGUtPnRuX3NwZWMudG5fcmVnLnRuX2FvYmo7CgoJCW11dGV4X2VudGVyKCZ1b2Jq
LT52bW9iamxvY2spOwoJCXVhb19kcm9wc3dhcF9yYW5nZSh1b2JqLCBuZXdwYWdlcywgb2xk
cGFnZXMpOwoJCW11dGV4X2V4aXQoJnVvYmotPnZtb2JqbG9jayk7CgoJCS8qIERlY3JlYXNl
IHRoZSB1c2VkLW1lbW9yeSBjb3VudGVyLiAqLwoJCXRtcGZzX21lbV9kZWNyKHRtcCwgKG9s
ZHBhZ2VzIC0gbmV3cGFnZXMpIDw8IFBBR0VfU0hJRlQpOwoJfQoJaWYgKG5ld3NpemUgPiBv
bGRzaXplKSB7CgkJVk5fS05PVEUodnAsIE5PVEVfRVhURU5EKTsKCX0KCXJldHVybiAwOwp9
CgovKgogKiB0bXBmc19jaGZsYWdzOiBjaGFuZ2UgZmxhZ3Mgb2YgdGhlIGdpdmVuIHZub2Rl
LgogKgogKiA9PiBDYWxsZXIgc2hvdWxkIHBlcmZvcm0gdG1wZnNfdXBkYXRlKCkuCiAqLwpp
bnQKdG1wZnNfY2hmbGFncyh2bm9kZV90ICp2cCwgaW50IGZsYWdzLCBrYXV0aF9jcmVkX3Qg
Y3JlZCwgbHdwX3QgKmwpCnsKCXRtcGZzX25vZGVfdCAqbm9kZSA9IFZQX1RPX1RNUEZTX05P
REUodnApOwoJa2F1dGhfYWN0aW9uX3QgYWN0aW9uID0gS0FVVEhfVk5PREVfV1JJVEVfRkxB
R1M7CglpbnQgZXJyb3IsIGZzX2RlY2lzaW9uID0gMDsKCglLQVNTRVJUKFZPUF9JU0xPQ0tF
RCh2cCkpOwoKCS8qIERpc2FsbG93IHRoaXMgb3BlcmF0aW9uIGlmIHRoZSBmaWxlIHN5c3Rl
bSBpcyBtb3VudGVkIHJlYWQtb25seS4gKi8KCWlmICh2cC0+dl9tb3VudC0+bW50X2ZsYWcg
JiBNTlRfUkRPTkxZKQoJCXJldHVybiBFUk9GUzsKCglpZiAoa2F1dGhfY3JlZF9nZXRldWlk
KGNyZWQpICE9IG5vZGUtPnRuX3VpZCkgewoJCWZzX2RlY2lzaW9uID0gRUFDQ0VTOwoJfQoK
CS8qCgkgKiBJZiB0aGUgbmV3IGZsYWdzIGhhdmUgbm9uLXVzZXIgZmxhZ3MgdGhhdCBhcmUg
ZGlmZmVyZW50IHRoYW4KCSAqIHRob3NlIG9uIHRoZSBub2RlLCB3ZSBuZWVkIHNwZWNpYWwg
cGVybWlzc2lvbiB0byBjaGFuZ2UgdGhlbS4KCSAqLwoJaWYgKChmbGFncyAmIFNGX1NFVFRB
QkxFKSAhPSAobm9kZS0+dG5fZmxhZ3MgJiBTRl9TRVRUQUJMRSkpIHsKCQlhY3Rpb24gfD0g
S0FVVEhfVk5PREVfV1JJVEVfU1lTRkxBR1M7CgkJaWYgKCFmc19kZWNpc2lvbikgewoJCQlm
c19kZWNpc2lvbiA9IEVQRVJNOwoJCX0KCX0KCgkvKgoJICogSW5kaWNhdGUgdGhhdCB0aGlz
IG5vZGUncyBmbGFncyBoYXZlIHN5c3RlbSBhdHRyaWJ1dGVzIGluIHRoZW0gaWYKCSAqIHRo
YXQncyB0aGUgY2FzZS4KCSAqLwoJaWYgKG5vZGUtPnRuX2ZsYWdzICYgKFNGX0lNTVVUQUJM
RSB8IFNGX0FQUEVORCkpIHsKCQlhY3Rpb24gfD0gS0FVVEhfVk5PREVfSEFTX1NZU0ZMQUdT
OwoJfQoKCWVycm9yID0ga2F1dGhfYXV0aG9yaXplX3Zub2RlKGNyZWQsIGFjdGlvbiwgdnAs
IE5VTEwsIGZzX2RlY2lzaW9uKTsKCWlmIChlcnJvcikKCQlyZXR1cm4gZXJyb3I7CgoJLyoK
CSAqIFNldCB0aGUgZmxhZ3MuIElmIHdlJ3JlIG5vdCBzZXR0aW5nIG5vbi11c2VyIGZsYWdz
LCBiZSBjYXJlZnVsIG5vdAoJICogdG8gb3ZlcndyaXRlIHRoZW0uCgkgKgoJICogWFhYOiBD
YW4ndCB3ZSBhbHdheXMgYXNzaWduIGhlcmU/IGlmIHRoZSBzeXN0ZW0gZmxhZ3MgYXJlIGRp
ZmZlcmVudCwKCSAqICAgICAgdGhlIGNvZGUgYWJvdmUgc2hvdWxkIGNhdGNoIGF0dGVtcHRz
IHRvIGNoYW5nZSB0aGVtIHdpdGhvdXQKCSAqICAgICAgcHJvcGVyIHBlcm1pc3Npb25zLCBh
bmQgaWYgd2UncmUgaGVyZSBpdCBtZWFucyBpdCdzIG9rYXkgdG8KCSAqICAgICAgY2hhbmdl
IHRoZW0uLi4KCSAqLwoJaWYgKChhY3Rpb24gJiBLQVVUSF9WTk9ERV9XUklURV9TWVNGTEFH
UykgPT0gMCkgewoJCS8qIENsZWFyIGFsbCB1c2VyLXNldHRhYmxlIGZsYWdzIGFuZCByZS1z
ZXQgdGhlbS4gKi8KCQlub2RlLT50bl9mbGFncyAmPSBTRl9TRVRUQUJMRTsKCQlub2RlLT50
bl9mbGFncyB8PSAoZmxhZ3MgJiBVRl9TRVRUQUJMRSk7Cgl9IGVsc2UgewoJCW5vZGUtPnRu
X2ZsYWdzID0gZmxhZ3M7Cgl9Cglub2RlLT50bl9zdGF0dXMgfD0gVE1QRlNfTk9ERV9DSEFO
R0VEOwoJVk5fS05PVEUodnAsIE5PVEVfQVRUUklCKTsKCXJldHVybiAwOwp9CgovKgogKiB0
bXBmc19jaG1vZDogY2hhbmdlIGFjY2VzcyBtb2RlIG9uIHRoZSBnaXZlbiB2bm9kZS4KICoK
ICogPT4gQ2FsbGVyIHNob3VsZCBwZXJmb3JtIHRtcGZzX3VwZGF0ZSgpLgogKi8KaW50CnRt
cGZzX2NobW9kKHZub2RlX3QgKnZwLCBtb2RlX3QgbW9kZSwga2F1dGhfY3JlZF90IGNyZWQs
IGx3cF90ICpsKQp7Cgl0bXBmc19ub2RlX3QgKm5vZGUgPSBWUF9UT19UTVBGU19OT0RFKHZw
KTsKCWludCBlcnJvcjsKCglLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkpOwoKCS8qIERpc2Fs
bG93IHRoaXMgb3BlcmF0aW9uIGlmIHRoZSBmaWxlIHN5c3RlbSBpcyBtb3VudGVkIHJlYWQt
b25seS4gKi8KCWlmICh2cC0+dl9tb3VudC0+bW50X2ZsYWcgJiBNTlRfUkRPTkxZKQoJCXJl
dHVybiBFUk9GUzsKCgkvKiBJbW11dGFibGUgb3IgYXBwZW5kLW9ubHkgZmlsZXMgY2Fubm90
IGJlIG1vZGlmaWVkLCBlaXRoZXIuICovCglpZiAobm9kZS0+dG5fZmxhZ3MgJiAoSU1NVVRB
QkxFIHwgQVBQRU5EKSkKCQlyZXR1cm4gRVBFUk07CgoJZXJyb3IgPSBrYXV0aF9hdXRob3Jp
emVfdm5vZGUoY3JlZCwgS0FVVEhfVk5PREVfV1JJVEVfU0VDVVJJVFksIHZwLAoJICAgIE5V
TEwsIGdlbmZzX2Nhbl9jaG1vZCh2cC0+dl90eXBlLCBjcmVkLCBub2RlLT50bl91aWQsIG5v
ZGUtPnRuX2dpZCwgbW9kZSkpOwoJaWYgKGVycm9yKSB7CgkJcmV0dXJuIGVycm9yOwoJfQoJ
bm9kZS0+dG5fbW9kZSA9IChtb2RlICYgQUxMUEVSTVMpOwoJbm9kZS0+dG5fc3RhdHVzIHw9
IFRNUEZTX05PREVfQ0hBTkdFRDsKCVZOX0tOT1RFKHZwLCBOT1RFX0FUVFJJQik7CglyZXR1
cm4gMDsKfQoKLyoKICogdG1wZnNfY2hvd246IGNoYW5nZSBvd25lcnNoaXAgb2YgdGhlIGdp
dmVuIHZub2RlLgogKgogKiA9PiBBdCBsZWFzdCBvbmUgb2YgdWlkIG9yIGdpZCBtdXN0IGJl
IGRpZmZlcmVudCB0aGFuIFZOT1ZBTC4KICogPT4gQXR0cmlidXRlIGlzIHVuY2hhbmdlZCBm
b3IgVk5PVkFMIGNhc2UuCiAqID0+IENhbGxlciBzaG91bGQgcGVyZm9ybSB0bXBmc191cGRh
dGUoKS4KICovCmludAp0bXBmc19jaG93bih2bm9kZV90ICp2cCwgdWlkX3QgdWlkLCBnaWRf
dCBnaWQsIGthdXRoX2NyZWRfdCBjcmVkLCBsd3BfdCAqbCkKewoJdG1wZnNfbm9kZV90ICpu
b2RlID0gVlBfVE9fVE1QRlNfTk9ERSh2cCk7CglpbnQgZXJyb3I7CgoJS0FTU0VSVChWT1Bf
SVNMT0NLRUQodnApKTsKCgkvKiBBc3NpZ24gZGVmYXVsdCB2YWx1ZXMgaWYgdGhleSBhcmUg
dW5rbm93bi4gKi8KCUtBU1NFUlQodWlkICE9IFZOT1ZBTCB8fCBnaWQgIT0gVk5PVkFMKTsK
CWlmICh1aWQgPT0gVk5PVkFMKSB7CgkJdWlkID0gbm9kZS0+dG5fdWlkOwoJfQoJaWYgKGdp
ZCA9PSBWTk9WQUwpIHsKCQlnaWQgPSBub2RlLT50bl9naWQ7Cgl9CgoJLyogRGlzYWxsb3cg
dGhpcyBvcGVyYXRpb24gaWYgdGhlIGZpbGUgc3lzdGVtIGlzIG1vdW50ZWQgcmVhZC1vbmx5
LiAqLwoJaWYgKHZwLT52X21vdW50LT5tbnRfZmxhZyAmIE1OVF9SRE9OTFkpCgkJcmV0dXJu
IEVST0ZTOwoKCS8qIEltbXV0YWJsZSBvciBhcHBlbmQtb25seSBmaWxlcyBjYW5ub3QgYmUg
bW9kaWZpZWQsIGVpdGhlci4gKi8KCWlmIChub2RlLT50bl9mbGFncyAmIChJTU1VVEFCTEUg
fCBBUFBFTkQpKQoJCXJldHVybiBFUEVSTTsKCgllcnJvciA9IGthdXRoX2F1dGhvcml6ZV92
bm9kZShjcmVkLCBLQVVUSF9WTk9ERV9DSEFOR0VfT1dORVJTSElQLCB2cCwKCSAgICBOVUxM
LCBnZW5mc19jYW5fY2hvd24oY3JlZCwgbm9kZS0+dG5fdWlkLCBub2RlLT50bl9naWQsIHVp
ZCwKCSAgICBnaWQpKTsKCWlmIChlcnJvcikgewoJCXJldHVybiBlcnJvcjsKCX0KCW5vZGUt
PnRuX3VpZCA9IHVpZDsKCW5vZGUtPnRuX2dpZCA9IGdpZDsKCW5vZGUtPnRuX3N0YXR1cyB8
PSBUTVBGU19OT0RFX0NIQU5HRUQ7CglWTl9LTk9URSh2cCwgTk9URV9BVFRSSUIpOwoJcmV0
dXJuIDA7Cn0KCi8qCiAqIHRtcGZzX2Noc2l6ZTogY2hhbmdlIHNpemUgb2YgdGhlIGdpdmVu
IHZub2RlLgogKi8KaW50CnRtcGZzX2Noc2l6ZSh2bm9kZV90ICp2cCwgdV9xdWFkX3Qgc2l6
ZSwga2F1dGhfY3JlZF90IGNyZWQsIGx3cF90ICpsKQp7Cgl0bXBmc19ub2RlX3QgKm5vZGUg
PSBWUF9UT19UTVBGU19OT0RFKHZwKTsKCglLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkpOwoK
CS8qIERlY2lkZSB3aGV0aGVyIHRoaXMgaXMgYSB2YWxpZCBvcGVyYXRpb24gYmFzZWQgb24g
dGhlIGZpbGUgdHlwZS4gKi8KCXN3aXRjaCAodnAtPnZfdHlwZSkgewoJY2FzZSBWRElSOgoJ
CXJldHVybiBFSVNESVI7CgljYXNlIFZSRUc6CgkJaWYgKHZwLT52X21vdW50LT5tbnRfZmxh
ZyAmIE1OVF9SRE9OTFkpIHsKCQkJcmV0dXJuIEVST0ZTOwoJCX0KCQlicmVhazsKCWNhc2Ug
VkJMSzoKCWNhc2UgVkNIUjoKCWNhc2UgVkZJRk86CgkJLyoKCQkgKiBBbGxvdyBtb2RpZmlj
YXRpb25zIG9mIHNwZWNpYWwgZmlsZXMgZXZlbiBpZiBpbiB0aGUgZmlsZQoJCSAqIHN5c3Rl
bSBpcyBtb3VudGVkIHJlYWQtb25seSAod2UgYXJlIG5vdCBtb2RpZnlpbmcgdGhlCgkJICog
ZmlsZXMgdGhlbXNlbHZlcywgYnV0IHRoZSBvYmplY3RzIHRoZXkgcmVwcmVzZW50KS4KCQkg
Ki8KCQlyZXR1cm4gMDsKCWRlZmF1bHQ6CgkJcmV0dXJuIEVPUE5PVFNVUFA7Cgl9CgoJLyog
SW1tdXRhYmxlIG9yIGFwcGVuZC1vbmx5IGZpbGVzIGNhbm5vdCBiZSBtb2RpZmllZCwgZWl0
aGVyLiAqLwoJaWYgKG5vZGUtPnRuX2ZsYWdzICYgKElNTVVUQUJMRSB8IEFQUEVORCkpIHsK
CQlyZXR1cm4gRVBFUk07Cgl9CgoJLyogTm90ZTogdG1wZnNfdHJ1bmNhdGUoKSB3aWxsIHJh
aXNlIE5PVEVfRVhURU5EIGFuZCBOT1RFX0FUVFJJQi4gKi8KCXJldHVybiB0bXBmc190cnVu
Y2F0ZSh2cCwgc2l6ZSk7Cn0KCi8qCiAqIHRtcGZzX2NodGltZXM6IGNoYW5nZSBhY2Nlc3Mg
YW5kIG1vZGlmaWNhdGlvbiB0aW1lcyBmb3Igdm5vZGUuCiAqLwppbnQKdG1wZnNfY2h0aW1l
cyh2bm9kZV90ICp2cCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICphdGltZSwKICAgIGNvbnN0
IHN0cnVjdCB0aW1lc3BlYyAqbXRpbWUsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqYnRpbWUs
CiAgICBpbnQgdmFmbGFncywga2F1dGhfY3JlZF90IGNyZWQsIGx3cF90ICpsKQp7Cgl0bXBm
c19ub2RlX3QgKm5vZGUgPSBWUF9UT19UTVBGU19OT0RFKHZwKTsKCWludCBlcnJvcjsKCglL
QVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkpOwoKCS8qIERpc2FsbG93IHRoaXMgb3BlcmF0aW9u
IGlmIHRoZSBmaWxlIHN5c3RlbSBpcyBtb3VudGVkIHJlYWQtb25seS4gKi8KCWlmICh2cC0+
dl9tb3VudC0+bW50X2ZsYWcgJiBNTlRfUkRPTkxZKQoJCXJldHVybiBFUk9GUzsKCgkvKiBJ
bW11dGFibGUgb3IgYXBwZW5kLW9ubHkgZmlsZXMgY2Fubm90IGJlIG1vZGlmaWVkLCBlaXRo
ZXIuICovCglpZiAobm9kZS0+dG5fZmxhZ3MgJiAoSU1NVVRBQkxFIHwgQVBQRU5EKSkKCQly
ZXR1cm4gRVBFUk07CgoJZXJyb3IgPSBrYXV0aF9hdXRob3JpemVfdm5vZGUoY3JlZCwgS0FV
VEhfVk5PREVfV1JJVEVfVElNRVMsIHZwLCBOVUxMLAoJICAgIGdlbmZzX2Nhbl9jaHRpbWVz
KHZwLCB2YWZsYWdzLCBub2RlLT50bl91aWQsIGNyZWQpKTsKCWlmIChlcnJvcikKCQlyZXR1
cm4gZXJyb3I7CgoJaWYgKGF0aW1lLT50dl9zZWMgIT0gVk5PVkFMICYmIGF0aW1lLT50dl9u
c2VjICE9IFZOT1ZBTCkKCQlub2RlLT50bl9zdGF0dXMgfD0gVE1QRlNfTk9ERV9BQ0NFU1NF
RDsKCglpZiAobXRpbWUtPnR2X3NlYyAhPSBWTk9WQUwgJiYgbXRpbWUtPnR2X25zZWMgIT0g
Vk5PVkFMKQoJCW5vZGUtPnRuX3N0YXR1cyB8PSBUTVBGU19OT0RFX01PRElGSUVEOwoKCWlm
IChidGltZS0+dHZfc2VjID09IFZOT1ZBTCAmJiBidGltZS0+dHZfbnNlYyA9PSBWTk9WQUwp
CgkJYnRpbWUgPSBOVUxMOwoKCXRtcGZzX3VwZGF0ZSh2cCwgYXRpbWUsIG10aW1lLCBidGlt
ZSwgMCk7CglWTl9LTk9URSh2cCwgTk9URV9BVFRSSUIpOwoJcmV0dXJuIDA7Cn0KCi8qCiAq
IHRtcGZzX3VwZGF0ZTogdXBkYXRlIHRpbWVzdGFtcHMsIGV0IGFsLgogKi8Kdm9pZAp0bXBm
c191cGRhdGUodm5vZGVfdCAqdnAsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqYWNjLAogICAg
Y29uc3Qgc3RydWN0IHRpbWVzcGVjICptb2QsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqYmly
dGgsIGludCBmbGFncykKewoJdG1wZnNfbm9kZV90ICpub2RlID0gVlBfVE9fVE1QRlNfTk9E
RSh2cCk7CglzdHJ1Y3QgdGltZXNwZWMgbm93dG07CgoJLyogS0FTU0VSVChWT1BfSVNMT0NL
RUQodnApKTsgKi8KCglpZiAoZmxhZ3MgJiBVUERBVEVfQ0xPU0UpIHsKCQkvKiBYWFggTmVl
ZCB0byBkbyBhbnl0aGluZyBzcGVjaWFsPyAqLwoJfQoJaWYgKChub2RlLT50bl9zdGF0dXMg
JiBUTVBGU19OT0RFX1NUQVRVU0FMTCkgPT0gMCkgewoJCXJldHVybjsKCX0KCWlmIChiaXJ0
aCAhPSBOVUxMKSB7CgkJbm9kZS0+dG5fYmlydGh0aW1lID0gKmJpcnRoOwoJfQoJdmZzX3Rp
bWVzdGFtcCgmbm93dG0pOwoKCWlmIChub2RlLT50bl9zdGF0dXMgJiBUTVBGU19OT0RFX0FD
Q0VTU0VEKSB7CgkJbm9kZS0+dG5fYXRpbWUgPSBhY2MgPyAqYWNjIDogbm93dG07Cgl9Cglp
ZiAobm9kZS0+dG5fc3RhdHVzICYgVE1QRlNfTk9ERV9NT0RJRklFRCkgewoJCW5vZGUtPnRu
X210aW1lID0gbW9kID8gKm1vZCA6IG5vd3RtOwoJfQoJaWYgKG5vZGUtPnRuX3N0YXR1cyAm
IFRNUEZTX05PREVfQ0hBTkdFRCkgewoJCW5vZGUtPnRuX2N0aW1lID0gbm93dG07Cgl9CgoJ
bm9kZS0+dG5fc3RhdHVzICY9IH5UTVBGU19OT0RFX1NUQVRVU0FMTDsKfQoKaW50CnRtcGZz
X3RydW5jYXRlKHZub2RlX3QgKnZwLCBvZmZfdCBsZW5ndGgpCnsKCXRtcGZzX25vZGVfdCAq
bm9kZSA9IFZQX1RPX1RNUEZTX05PREUodnApOwoJaW50IGVycm9yOwoKCWlmIChsZW5ndGgg
PCAwKSB7CgkJZXJyb3IgPSBFSU5WQUw7CgkJZ290byBvdXQ7Cgl9CglpZiAobm9kZS0+dG5f
c2l6ZSA9PSBsZW5ndGgpIHsKCQllcnJvciA9IDA7CgkJZ290byBvdXQ7Cgl9CgllcnJvciA9
IHRtcGZzX3JlZ19yZXNpemUodnAsIGxlbmd0aCk7CglpZiAoZXJyb3IgPT0gMCkgewoJCW5v
ZGUtPnRuX3N0YXR1cyB8PSBUTVBGU19OT0RFX0NIQU5HRUQgfCBUTVBGU19OT0RFX01PRElG
SUVEOwoJfQpvdXQ6Cgl0bXBmc191cGRhdGUodnAsIE5VTEwsIE5VTEwsIE5VTEwsIDApOwoJ
cmV0dXJuIGVycm9yOwp9CgAAAAAAAAAAAAAAAHRtcGZzLXBhdGNoL3NyYy9zeXMvZnMvdG1w
ZnMvdG1wZnMuaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNDQ0ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDAyNTI1
NwAxMjAyNjI2NjQyMgAwMDE2NjA3ADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAdXN0YXIgIAByb290AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
LyoJJE5ldEJTRDogdG1wZnMuaCx2IDEuNDUgMjAxMS8wOS8yNyAwMToxMDo0MyBjaHJpc3Rv
cyBFeHAgJAkqLwoKLyoKICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IFRoZSBO
ZXRCU0QgRm91bmRhdGlvbiwgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBU
aGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIFRoZSBO
ZXRCU0QgRm91bmRhdGlvbgogKiBieSBKdWxpbyBNLiBNZXJpbm8gVmlkYWwsIGRldmVsb3Bl
ZCBhcyBwYXJ0IG9mIEdvb2dsZSdzIFN1bW1lciBvZiBDb2RlCiAqIDIwMDUgcHJvZ3JhbS4K
ICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBUSEUgTkVUQlNEIEZPVU5EQVRJT04sIElOQy4gQU5EIENPTlRSSUJVVE9SUwog
KiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQKICogVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBGT1VOREFUSU9O
IE9SIENPTlRSSUJVVE9SUwogKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCiAqIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
CiAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUwogKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgogKiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQogKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogKiBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KICovCgojaWZuZGVmIF9GU19UTVBGU19UTVBGU19IXwojZGVmaW5lIF9G
U19UTVBGU19UTVBGU19IXwoKI2lmIDAgLy8gbm90IGluIDUuMSAtIHNvcnJ5IC4uLgojaWYg
IWRlZmluZWQoX0tFUk5FTCkgJiYgIWRlZmluZWQoX0tNRU1VU0VSKQojZXJyb3IgIm5vdCBz
dXBwb3NlZCB0byBiZSBleHBvc2VkIHRvIHVzZXJsYW5kIgojZW5kaWYKI2VuZGlmCgojaW5j
bHVkZSA8c3lzL2RpcmVudC5oPgojaW5jbHVkZSA8c3lzL21vdW50Lmg+CiNpbmNsdWRlIDxz
eXMvcG9vbC5oPgojaW5jbHVkZSA8c3lzL3F1ZXVlLmg+CiNpbmNsdWRlIDxzeXMvdm5vZGUu
aD4KCi8qCiAqIEludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgdG1wZnMgZGlyZWN0b3J5
IGVudHJ5LgogKgogKiBBbGwgZmllbGRzIGFyZSBwcm90ZWN0ZWQgYnkgdm5vZGUgbG9jay4K
ICovCnR5cGVkZWYgc3RydWN0IHRtcGZzX2RpcmVudCB7CglUQUlMUV9FTlRSWSh0bXBmc19k
aXJlbnQpCXRkX2VudHJpZXM7CgoJLyogUG9pbnRlciB0byB0aGUgaW5vZGUgdGhpcyBlbnRy
eSByZWZlcnMgdG8uICovCglzdHJ1Y3QgdG1wZnNfbm9kZSAqCQl0ZF9ub2RlOwoKCS8qIE5h
bWUgYW5kIGl0cyBsZW5ndGguICovCgljaGFyICoJCQkJdGRfbmFtZTsKCXVpbnQxNl90CQkJ
dGRfbmFtZWxlbjsKfSB0bXBmc19kaXJlbnRfdDsKClRBSUxRX0hFQUQodG1wZnNfZGlyLCB0
bXBmc19kaXJlbnQpOwoKI2lmIGRlZmluZWQoX0tFUk5FTCkKCiNkZWZpbmUgVE1QRlNfTUFY
TkFNTEVOCTI1NQovKiBWYWxpZGF0ZSBtYXhpbXVtIHRkX25hbWVsZW4gbGVuZ3RoLiAqLwpD
VEFTU0VSVChUTVBGU19NQVhOQU1MRU4gPCBVSU5UMTZfTUFYKTsKCiNkZWZpbmUJVE1QRlNf
RElSQ09PS0lFX0RPVAkwCiNkZWZpbmUJVE1QRlNfRElSQ09PS0lFX0RPVERPVAkxCiNkZWZp
bmUJVE1QRlNfRElSQ09PS0lFX0VPRgkyCgovKgogKiBFYWNoIGVudHJ5IGluIGEgZGlyZWN0
b3J5IGhhcyBhIGNvb2tpZSB0aGF0IGlkZW50aWZpZXMgaXQuICBDb29raWVzCiAqIHN1cGVy
c2VkZSBvZmZzZXRzIHdpdGhpbiBkaXJlY3RvcmllcywgYXMgdG1wZnMgaGFzIG5vIG9mZnNl
dHMgYXMgc3VjaC4KICoKICogVGhlICcuJywgJy4uJyBhbmQgdGhlIGVuZCBvZiBkaXJlY3Rv
cnkgbWFya2VycyBoYXZlIGZpeGVkIGNvb2tpZXMsCiAqIHdoaWNoIGNhbm5vdCBjb2xsaWRl
IHdpdGggdGhlIGNvb2tpZXMgZ2VuZXJhdGVkIGJ5IG90aGVyIGVudHJpZXMuCiAqCiAqIFRo
ZSBjb29raWVzIGZvciB0aGUgb3RoZXIgZW50cmllcyBhcmUgZ2VuZXJhdGVkIGJhc2VkIG9u
IHRoZSBtZW1vcnkKICogYWRkcmVzcyBvZiB0aGVpciByZXByZXNlbnRhdGl2ZSBtZXRhLWRh
dGEgc3RydWN0dXJlLgogKgogKiBYWFg6IFRydW5jYXRpbmcgZGlyZWN0b3J5IGNvb2tpZXMg
dG8gMzEgYml0cyBub3cgLSB3b3JrYXJvdW5kIGZvcgogKiBwcm9ibGVtIHdpdGggTGludXgg
Y29tcGF0LCBzZWUgUFIvMzIwMzQuCiAqLwpzdGF0aWMgaW5saW5lIG9mZl90CnRtcGZzX2Rp
cmNvb2tpZSh0bXBmc19kaXJlbnRfdCAqZGUpCnsKCW9mZl90IGNvb2tpZTsKCgljb29raWUg
PSAoKG9mZl90KSh1aW50cHRyX3QpZGUgPj4gMSkgJiAweDdGRkZGRkZGOwoJS0FTU0VSVChj
b29raWUgIT0gVE1QRlNfRElSQ09PS0lFX0RPVCk7CglLQVNTRVJUKGNvb2tpZSAhPSBUTVBG
U19ESVJDT09LSUVfRE9URE9UKTsKCUtBU1NFUlQoY29va2llICE9IFRNUEZTX0RJUkNPT0tJ
RV9FT0YpOwoKCXJldHVybiBjb29raWU7Cn0KI2VuZGlmCgovKgogKiBJbnRlcm5hbCByZXBy
ZXNlbnRhdGlvbiBvZiBhIHRtcGZzIGZpbGUgc3lzdGVtIG5vZGUgLS0gaW5vZGUuCiAqCiAq
IFRoaXMgc3RydWN0dXJlIGlzIHNwbGl0dGVkIGluIHR3byBwYXJ0czogb25lIGhvbGRzIGF0
dHJpYnV0ZXMgY29tbW9uCiAqIHRvIGFsbCBmaWxlIHR5cGVzIGFuZCB0aGUgb3RoZXIgaG9s
ZHMgZGF0YSB0aGF0IGlzIG9ubHkgYXBwbGljYWJsZSB0bwogKiBhIHBhcnRpY3VsYXIgdHlw
ZS4KICoKICogQWxsIGZpZWxkcyBhcmUgcHJvdGVjdGVkIGJ5IHZub2RlIGxvY2suICBUaGUg
dm5vZGUgYXNzb2NpYXRpb24gaXRzZWxmCiAqIGlzIHByb3RlY3RlZCBieSB0bXBmc19ub2Rl
X3Q6OnRuX3Zsb2NrLgogKi8KdHlwZWRlZiBzdHJ1Y3QgdG1wZnNfbm9kZSB7CglMSVNUX0VO
VFJZKHRtcGZzX25vZGUpCXRuX2VudHJpZXM7CgoJLyoKCSAqIEVhY2ggaW5vZGUgaGFzIGEg
Y29ycmVzcG9uZGluZyB2bm9kZS4gIEl0IGlzIGEgYmktZGlyZWN0aW9uYWwKCSAqIGFzc29j
aWF0aW9uLiAgV2hlbmV2ZXIgdm5vZGUgaXMgYWxsb2NhdGVkLCBpdHMgdl9kYXRhIGZpZWxk
IGlzCgkgKiBzZXQgdG8gdGhlIGlub2RlIGl0IHJlZmVyZW5jZSwgYW5kIHRtcGZzX25vZGVf
dDo6dG5fdm5vZGUgaXMKCSAqIHNldCB0byBwb2ludCB0byB0aGUgc2FpZCB2bm9kZS4KCSAq
CgkgKiBGdXJ0aGVyIGF0dGVtcHRzIHRvIGFsbG9jYXRlIGEgdm5vZGUgZm9yIHRoaXMgc2Ft
ZSBub2RlIHdpbGwKCSAqIHJlc3VsdCBpbiByZXR1cm5pbmcgYSBuZXcgcmVmZXJlbmNlIHRv
IHRoZSB2YWx1ZSBzdG9yZWQgaW4KCSAqIHRuX3Zub2RlLiAgSXQgbWF5IGJlIE5VTEwgd2hl
biB0aGUgbm9kZSBpcyB1bnVzZWQgKHRoYXQgaXMsCgkgKiBubyB2bm9kZSBoYXMgYmVlbiBh
bGxvY2F0ZWQgb3IgaXQgaGFzIGJlZW4gcmVjbGFpbWVkKS4KCSAqLwoJa211dGV4X3QJCXRu
X3Zsb2NrOwoJdm5vZGVfdCAqCQl0bl92bm9kZTsKCgkvKiBEaXJlY3RvcnkgZW50cnkuICBP
bmx5IGEgaGludCwgc2luY2UgaGFyZCBsaW5rIGNhbiBoYXZlIG11bHRpcGxlLiAqLwoJdG1w
ZnNfZGlyZW50X3QgKgl0bl9kaXJlbnRfaGludDsKCgkvKiBUaGUgaW5vZGUgdHlwZTogVkJM
SywgVkNIUiwgVkRJUiwgVkZJRk8sIFZMTkssIFZSRUcgb3IgVlNPQ0suICovCgllbnVtIHZ0
eXBlCQl0bl90eXBlOwoKCS8qIElub2RlIGlkZW50aWZpZXIgYW5kIGdlbmVyYXRpb24gbnVt
YmVyLiAqLwoJaW5vX3QJCQl0bl9pZDsKCXVuc2lnbmVkIGxvbmcJCXRuX2dlbjsKCgkvKiBJ
bm9kZSBzdGF0dXMgZmxhZ3MgKGZvciBvcGVyYXRpb25zIGluIGRlbGF5ZWQgbWFubmVyKS4g
Ki8KCWludAkJCXRuX3N0YXR1czsKCgkvKiBUaGUgaW5vZGUgc2l6ZS4gKi8KCW9mZl90CQkJ
dG5fc2l6ZTsKCgkvKiBHZW5lcmljIG5vZGUgYXR0cmlidXRlcy4gKi8KCXVpZF90CQkJdG5f
dWlkOwoJZ2lkX3QJCQl0bl9naWQ7Cgltb2RlX3QJCQl0bl9tb2RlOwoJaW50CQkJdG5fZmxh
Z3M7CglubGlua190CQkJdG5fbGlua3M7CglzdHJ1Y3QgdGltZXNwZWMJCXRuX2F0aW1lOwoJ
c3RydWN0IHRpbWVzcGVjCQl0bl9tdGltZTsKCXN0cnVjdCB0aW1lc3BlYwkJdG5fY3RpbWU7
CglzdHJ1Y3QgdGltZXNwZWMJCXRuX2JpcnRodGltZTsKCgkvKiBIZWFkIG9mIGJ5dGUtbGV2
ZWwgbG9jayBsaXN0ICh1c2VkIGJ5IHRtcGZzX2FkdmxvY2spLiAqLwoJc3RydWN0IGxvY2tm
ICoJCXRuX2xvY2tmOwoKCXVuaW9uIHsKCQkvKiBUeXBlIGNhc2U6IFZCTEsgb3IgVkNIUi4g
Ki8KCQlzdHJ1Y3QgewoJCQlkZXZfdAkJCXRuX3JkZXY7CgkJfSB0bl9kZXY7CgoJCS8qIFR5
cGUgY2FzZTogVkRJUi4gKi8KCQlzdHJ1Y3QgewoJCQkvKiBQYXJlbnQgZGlyZWN0b3J5IChy
b290IGlub2RlIHBvaW50cyB0byBpdHNlbGYpLiAqLwoJCQlzdHJ1Y3QgdG1wZnNfbm9kZSAq
CXRuX3BhcmVudDsKCgkJCS8qIExpc3Qgb2YgZGlyZWN0b3J5IGVudHJpZXMuICovCgkJCXN0
cnVjdCB0bXBmc19kaXIJdG5fZGlyOwoKCQkJLyoKCQkJICogTnVtYmVyIGFuZCBwb2ludGVy
IG9mIHRoZSBsYXN0IGRpcmVjdG9yeSBlbnRyeQoJCQkgKiByZXR1cm5lZCBieSB0aGUgcmVh
ZGRpcigzKSBvcGVyYXRpb24uCgkJCSAqLwoJCQlvZmZfdAkJCXRuX3JlYWRkaXJfbGFzdG47
CgkJCXN0cnVjdCB0bXBmc19kaXJlbnQgKgl0bl9yZWFkZGlyX2xhc3RwOwoJCX0gdG5fZGly
OwoKCQkvKiBUeXBlIGNhc2U6IFZMTksuICovCgkJc3RydWN0IHRuX2xuayB7CgkJCS8qIFRo
ZSBsaW5rJ3MgdGFyZ2V0LiAqLwoJCQljaGFyICoJCQl0bl9saW5rOwoJCX0gdG5fbG5rOwoK
CQkvKiBUeXBlIGNhc2U6IFZSRUcuICovCgkJc3RydWN0IHRuX3JlZyB7CgkJCS8qIFVuZGVy
bHlpbmcgVVZNIG9iamVjdCB0byBzdG9yZSBjb250ZW50cy4gKi8KCQkJc3RydWN0IHV2bV9v
YmplY3QgKgl0bl9hb2JqOwoJCQlzaXplX3QJCQl0bl9hb2JqX3BhZ2VzOwoJCX0gdG5fcmVn
OwoJfSB0bl9zcGVjOwp9IHRtcGZzX25vZGVfdDsKCiNpZiBkZWZpbmVkKF9LRVJORUwpCgpM
SVNUX0hFQUQodG1wZnNfbm9kZV9saXN0LCB0bXBmc19ub2RlKTsKCi8qIFN0YXR1cyBmbGFn
cy4gKi8KI2RlZmluZQlUTVBGU19OT0RFX0FDQ0VTU0VECTB4MDEKI2RlZmluZQlUTVBGU19O
T0RFX01PRElGSUVECTB4MDIKI2RlZmluZQlUTVBGU19OT0RFX0NIQU5HRUQJMHgwNAoKI2Rl
ZmluZQlUTVBGU19OT0RFX1NUQVRVU0FMTAlcCiAgICAoVE1QRlNfTk9ERV9BQ0NFU1NFRCB8
IFRNUEZTX05PREVfTU9ESUZJRUQgfCBUTVBGU19OT0RFX0NIQU5HRUQpCgovKgogKiBCaXQg
aW5kaWNhdGluZyB2bm9kZSByZWNsYW1hdGlvbi4KICogV2UgYWJ1c2UgdG1wZnNfbm9kZV90
Ojp0bl9nZW4gZm9yIHRoYXQuCiAqLwojZGVmaW5lCVRNUEZTX05PREVfR0VOX01BU0sJKH4w
VUwgPj4gMSkKI2RlZmluZQlUTVBGU19SRUNMQUlNSU5HX0JJVAkoflRNUEZTX05PREVfR0VO
X01BU0spCgojZGVmaW5lCVRNUEZTX05PREVfUkVDTEFJTUlORyhub2RlKSBcCiAgICAoKChu
b2RlKS0+dG5fZ2VuICYgVE1QRlNfUkVDTEFJTUlOR19CSVQpICE9IDApCgojZGVmaW5lCVRN
UEZTX05PREVfR0VOKG5vZGUpIFwKICAgICgobm9kZSktPnRuX2dlbiAmIFRNUEZTX05PREVf
R0VOX01BU0spCgovKiBXaGl0ZS1vdXQgaW5vZGUgaW5kaWNhdG9yLiAqLwojZGVmaW5lCVRN
UEZTX05PREVfV0hJVEVPVVQJKCh0bXBmc19ub2RlX3QgKiktMSkKCi8qCiAqIEludGVybmFs
IHJlcHJlc2VudGF0aW9uIG9mIGEgdG1wZnMgbW91bnQgcG9pbnQuCiAqLwp0eXBlZGVmIHN0
cnVjdCB0bXBmc19tb3VudCB7CgkvKiBMaW1pdCBhbmQgbnVtYmVyIG9mIGJ5dGVzIGluIHVz
ZSBieSB0aGUgZmlsZSBzeXN0ZW0uICovCgl1aW50NjRfdAkJdG1fbWVtX2xpbWl0OwoJdWlu
dDY0X3QJCXRtX2J5dGVzX3VzZWQ7CglrbXV0ZXhfdAkJdG1fYWNjX2xvY2s7CgoJLyogUG9p
bnRlciB0byB0aGUgcm9vdCBpbm9kZS4gKi8KCXRtcGZzX25vZGVfdCAqCQl0bV9yb290OwoK
CS8qIE1heGltdW0gbnVtYmVyIG9mIHBvc3NpYmxlIG5vZGVzIGZvciB0aGlzIGZpbGUgc3lz
dGVtLiAqLwoJdW5zaWduZWQgaW50CQl0bV9ub2Rlc19tYXg7CgoJLyogTnVtYmVyIG9mIG5v
ZGVzIGN1cnJlbnRseSBhbGxvY2F0ZWQuICovCgl1bnNpZ25lZCBpbnQJCXRtX25vZGVzX2Nu
dDsKCgkvKiBMaXN0IG9mIGlub2RlcyBhbmQgdGhlIGxvY2sgcHJvdGVjdGluZyBpdC4gKi8K
CWttdXRleF90CQl0bV9sb2NrOwoJc3RydWN0IHRtcGZzX25vZGVfbGlzdAl0bV9ub2RlczsK
fSB0bXBmc19tb3VudF90OwoKLyoKICogVGhpcyBzdHJ1Y3R1cmUgbWFwcyBhIGZpbGUgaWRl
bnRpZmllciB0byBhIHRtcGZzIG5vZGUuICBVc2VkIGJ5IHRoZQogKiBORlMgY29kZS4KICov
CnR5cGVkZWYgc3RydWN0IHRtcGZzX2ZpZCB7Cgl1aW50MTZfdAkJdGZfbGVuOwoJdWludDE2
X3QJCXRmX3BhZDsKCXVpbnQzMl90CQl0Zl9nZW47Cglpbm9fdAkJCXRmX2lkOwp9IHRtcGZz
X2ZpZF90OwoKLyoKICogUHJvdG90eXBlcyBmb3IgdG1wZnNfc3Vici5jLgogKi8KCmludAkJ
dG1wZnNfYWxsb2Nfbm9kZSh0bXBmc19tb3VudF90ICosIGVudW0gdnR5cGUsIHVpZF90LCBn
aWRfdCwKCQkgICAgbW9kZV90LCBjaGFyICosIGRldl90LCB0bXBmc19ub2RlX3QgKiopOwp2
b2lkCQl0bXBmc19mcmVlX25vZGUodG1wZnNfbW91bnRfdCAqLCB0bXBmc19ub2RlX3QgKik7
CgppbnQJCXRtcGZzX2FsbG9jX2ZpbGUodm5vZGVfdCAqLCB2bm9kZV90ICoqLCBzdHJ1Y3Qg
dmF0dHIgKiwKCQkgICAgc3RydWN0IGNvbXBvbmVudG5hbWUgKiwgY2hhciAqKTsKCmludAkJ
dG1wZnNfdm5vZGVfZ2V0KHN0cnVjdCBtb3VudCAqLCB0bXBmc19ub2RlX3QgKiwgdm5vZGVf
dCAqKik7CgppbnQJCXRtcGZzX2FsbG9jX2RpcmVudCh0bXBmc19tb3VudF90ICosIGNvbnN0
IGNoYXIgKiwgdWludDE2X3QsCgkJICAgIHRtcGZzX2RpcmVudF90ICoqKTsKdm9pZAkJdG1w
ZnNfZnJlZV9kaXJlbnQodG1wZnNfbW91bnRfdCAqLCB0bXBmc19kaXJlbnRfdCAqKTsKdm9p
ZAkJdG1wZnNfZGlyX2F0dGFjaCh2bm9kZV90ICosIHRtcGZzX2RpcmVudF90ICosIHRtcGZz
X25vZGVfdCAqKTsKdm9pZAkJdG1wZnNfZGlyX2RldGFjaCh2bm9kZV90ICosIHRtcGZzX2Rp
cmVudF90ICopOwoKdG1wZnNfZGlyZW50X3QgKnRtcGZzX2Rpcl9sb29rdXAodG1wZnNfbm9k
ZV90ICosIHN0cnVjdCBjb21wb25lbnRuYW1lICopOwp0bXBmc19kaXJlbnRfdCAqdG1wZnNf
ZGlyX2NhY2hlZCh0bXBmc19ub2RlX3QgKik7CgppbnQJCXRtcGZzX2Rpcl9nZXRkb3RkZW50
KHRtcGZzX25vZGVfdCAqLCBzdHJ1Y3QgdWlvICopOwppbnQJCXRtcGZzX2Rpcl9nZXRkb3Rk
b3RkZW50KHRtcGZzX25vZGVfdCAqLCBzdHJ1Y3QgdWlvICopOwp0bXBmc19kaXJlbnRfdCAq
dG1wZnNfZGlyX2xvb2t1cGJ5Y29va2llKHRtcGZzX25vZGVfdCAqLCBvZmZfdCk7CmludAkJ
dG1wZnNfZGlyX2dldGRlbnRzKHRtcGZzX25vZGVfdCAqLCBzdHJ1Y3QgdWlvICosIG9mZl90
ICopOwoKaW50CQl0bXBmc19yZWdfcmVzaXplKHZub2RlX3QgKiwgb2ZmX3QpOwppbnQJCXRt
cGZzX3RydW5jYXRlKHZub2RlX3QgKiwgb2ZmX3QpOwoKaW50CQl0bXBmc19jaGZsYWdzKHZu
b2RlX3QgKiwgaW50LCBrYXV0aF9jcmVkX3QsIGx3cF90ICopOwppbnQJCXRtcGZzX2NobW9k
KHZub2RlX3QgKiwgbW9kZV90LCBrYXV0aF9jcmVkX3QsIGx3cF90ICopOwppbnQJCXRtcGZz
X2Nob3duKHZub2RlX3QgKiwgdWlkX3QsIGdpZF90LCBrYXV0aF9jcmVkX3QsIGx3cF90ICop
OwppbnQJCXRtcGZzX2Noc2l6ZSh2bm9kZV90ICosIHVfcXVhZF90LCBrYXV0aF9jcmVkX3Qs
IGx3cF90ICopOwppbnQJCXRtcGZzX2NodGltZXModm5vZGVfdCAqLCBjb25zdCBzdHJ1Y3Qg
dGltZXNwZWMgKiwKCQkgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICosIGNvbnN0IHN0cnVj
dCB0aW1lc3BlYyAqLCBpbnQsCgkJICAgIGthdXRoX2NyZWRfdCwgbHdwX3QgKik7CnZvaWQJ
CXRtcGZzX3VwZGF0ZSh2bm9kZV90ICosIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqLAoJCSAg
ICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKiwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICosIGlu
dCk7CgovKgogKiBQcm90b3R5cGVzIGZvciB0bXBmc19tZW0uYy4KICovCgp2b2lkCQl0bXBm
c19tbnRtZW1faW5pdCh0bXBmc19tb3VudF90ICosIHVpbnQ2NF90KTsKdm9pZAkJdG1wZnNf
bW50bWVtX2Rlc3Ryb3kodG1wZnNfbW91bnRfdCAqKTsKCnNpemVfdAkJdG1wZnNfbWVtX2lu
Zm8oYm9vbCk7CnVpbnQ2NF90CXRtcGZzX2J5dGVzX21heCh0bXBmc19tb3VudF90ICopOwpz
aXplX3QJCXRtcGZzX3BhZ2VzX2F2YWlsKHRtcGZzX21vdW50X3QgKik7CmJvb2wJCXRtcGZz
X21lbV9pbmNyKHRtcGZzX21vdW50X3QgKiwgc2l6ZV90KTsKdm9pZAkJdG1wZnNfbWVtX2Rl
Y3IodG1wZnNfbW91bnRfdCAqLCBzaXplX3QpOwoKdG1wZnNfZGlyZW50X3QgKnRtcGZzX2Rp
cmVudF9nZXQodG1wZnNfbW91bnRfdCAqKTsKdm9pZAkJdG1wZnNfZGlyZW50X3B1dCh0bXBm
c19tb3VudF90ICosIHRtcGZzX2RpcmVudF90ICopOwoKdG1wZnNfbm9kZV90ICoJdG1wZnNf
bm9kZV9nZXQodG1wZnNfbW91bnRfdCAqKTsKdm9pZAkJdG1wZnNfbm9kZV9wdXQodG1wZnNf
bW91bnRfdCAqLCB0bXBmc19ub2RlX3QgKik7CgpjaGFyICoJCXRtcGZzX3N0cm5hbWVfYWxs
b2ModG1wZnNfbW91bnRfdCAqLCBzaXplX3QpOwp2b2lkCQl0bXBmc19zdHJuYW1lX2ZyZWUo
dG1wZnNfbW91bnRfdCAqLCBjaGFyICosIHNpemVfdCk7CmJvb2wJCXRtcGZzX3N0cm5hbWVf
bmVxbGVuKHN0cnVjdCBjb21wb25lbnRuYW1lICosIHN0cnVjdCBjb21wb25lbnRuYW1lICop
OwoKLyoKICogRW5zdXJlcyB0aGF0IHRoZSBub2RlIHBvaW50ZWQgYnkgJ25vZGUnIGlzIGEg
ZGlyZWN0b3J5IGFuZCB0aGF0IGl0cwogKiBjb250ZW50cyBhcmUgY29uc2lzdGVudCB3aXRo
IHJlc3BlY3QgdG8gZGlyZWN0b3JpZXMuCiAqLwojZGVmaW5lIFRNUEZTX1ZBTElEQVRFX0RJ
Uihub2RlKSBcCiAgICBLQVNTRVJUKChub2RlKS0+dG5fdHlwZSA9PSBWRElSKTsgXAogICAg
S0FTU0VSVCgobm9kZSktPnRuX3NpemUgJSBzaXplb2YodG1wZnNfZGlyZW50X3QpID09IDAp
OyBcCiAgICBLQVNTRVJUKChub2RlKS0+dG5fc3BlYy50bl9kaXIudG5fcmVhZGRpcl9sYXN0
cCA9PSBOVUxMIHx8IFwKICAgICAgICB0bXBmc19kaXJjb29raWUoKG5vZGUpLT50bl9zcGVj
LnRuX2Rpci50bl9yZWFkZGlyX2xhc3RwKSA9PSBcCiAgICAgICAgKG5vZGUpLT50bl9zcGVj
LnRuX2Rpci50bl9yZWFkZGlyX2xhc3RuKTsKCi8qCiAqIE1lbW9yeSBtYW5hZ2VtZW50IHN0
dWZmLgogKi8KCi8qIEFtb3VudCBvZiBtZW1vcnkgcGFnZXMgdG8gcmVzZXJ2ZSBmb3IgdGhl
IHN5c3RlbS4gKi8KI2RlZmluZQlUTVBGU19QQUdFU19SRVNFUlZFRAkoNCAqIDEwMjQgKiAx
MDI0IC8gUEFHRV9TSVpFKQoKLyoKICogUm91dGluZXMgdG8gY29udmVydCBWRlMgc3RydWN0
dXJlcyB0byB0bXBmcyBpbnRlcm5hbCBvbmVzLgogKi8KCnN0YXRpYyBpbmxpbmUgdG1wZnNf
bW91bnRfdCAqClZGU19UT19UTVBGUyhzdHJ1Y3QgbW91bnQgKm1wKQp7Cgl0bXBmc19tb3Vu
dF90ICp0bXAgPSBtcC0+bW50X2RhdGE7CgoJS0FTU0VSVCh0bXAgIT0gTlVMTCk7CglyZXR1
cm4gdG1wOwp9CgpzdGF0aWMgaW5saW5lIHRtcGZzX25vZGVfdCAqClZQX1RPX1RNUEZTX0RJ
Uih2bm9kZV90ICp2cCkKewoJdG1wZnNfbm9kZV90ICpub2RlID0gdnAtPnZfZGF0YTsKCglL
QVNTRVJUKG5vZGUgIT0gTlVMTCk7CglUTVBGU19WQUxJREFURV9ESVIobm9kZSk7CglyZXR1
cm4gbm9kZTsKfQoKI2VuZGlmIC8qIGRlZmluZWQoX0tFUk5FTCkgKi8KCnN0YXRpYyBfX2lu
bGluZSB0bXBmc19ub2RlX3QgKgpWUF9UT19UTVBGU19OT0RFKHZub2RlX3QgKnZwKQp7Cgl0
bXBmc19ub2RlX3QgKm5vZGUgPSB2cC0+dl9kYXRhOwojaWZkZWYgS0FTU0VSVAoJS0FTU0VS
VChub2RlICE9IE5VTEwpOwojZW5kaWYKCXJldHVybiBub2RlOwp9CgojZW5kaWYgLyogX0ZT
X1RNUEZTX1RNUEZTX0hfICovCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0bXBmcy1wYXRjaC9zcmMvc3lzL2Zz
L3RtcGZzL2ZpbGVzLnRtcGZzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEwMDQ0NAAwMDAwMDAwADAwMDAwMDAAMDAwMDAw
MDA1MjAAMTIwMjQ2MDM0NjUAMDAxNzQ0NAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACMJJE5ldEJTRDogZmlsZXMudG1wZnMsdiAxLjIgMjAwNS8xMi8xMSAxMjoyNDoyOSBj
aHJpc3RvcyBFeHAgJAoKZGVmZnMJZnNfdG1wZnMuaAkJCVRNUEZTCgpmaWxlCWZzL3RtcGZz
L3RtcGZzX2ZpZm9vcHMuYwl0bXBmcwpmaWxlCWZzL3RtcGZzL3RtcGZzX21lbS5jCQl0bXBm
cwpmaWxlCWZzL3RtcGZzL3RtcGZzX3JlbmFtZS5jCXRtcGZzCmZpbGUJZnMvdG1wZnMvdG1w
ZnNfc3BlY29wcy5jCXRtcGZzCmZpbGUJZnMvdG1wZnMvdG1wZnNfc3Vici5jCQl0bXBmcwpm
aWxlCWZzL3RtcGZzL3RtcGZzX3Zmc29wcy5jCQl0bXBmcwpmaWxlCWZzL3RtcGZzL3RtcGZz
X3Zub3BzLmMJCXRtcGZzCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdG1wZnMtcGF0Y2gvc3JjL3N5cy9mcy90
bXBmcy90bXBmc19yZW5hbWUuYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA0NDQAMDAwMDAwMAAwMDAwMDAwADAwMDAwMDQx
MDY0ADEyMDI2NjI2NzAyADAwMjAxMjQAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHJvb3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAvKgkkTmV0QlNEOiB0bXBmc19yZW5hbWUuYyx2IDEuMiAyMDEyLzA1LzA5IDIyOjQ2OjI1
IHJpYXN0cmFkaCBFeHAgJAkqLwoKLyotCiAqIENvcHlyaWdodCAoYykgMjAxMiBUaGUgTmV0
QlNEIEZvdW5kYXRpb24sIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhp
cyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBUaGUgTmV0
QlNEIEZvdW5kYXRpb24KICogYnkgVGF5bG9yIFIgQ2FtcGJlbGwuCiAqCiAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE5F
VEJTRCBGT1VOREFUSU9OLCBJTkMuIEFORCBDT05UUklCVVRPUlMKICogYGBBUyBJUycnIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVECiAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgRk9VTkRBVElPTiBPUiBDT05UUklCVVRP
UlMKICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgogKiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKICog
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUKICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAq
LwoKLyoKICogdG1wZnMgcmVuYW1lCiAqLwoKI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgpfX0tF
Uk5FTF9SQ1NJRCgwLCAiJE5ldEJTRDogdG1wZnNfcmVuYW1lLmMsdiAxLjIgMjAxMi8wNS8w
OSAyMjo0NjoyNSByaWFzdHJhZGggRXhwICQiKTsKCiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4K
I2luY2x1ZGUgPHN5cy9lcnJuby5oPgojaW5jbHVkZSA8c3lzL2thdXRoLmg+CiNpbmNsdWRl
IDxzeXMvbW91bnQuaD4KI2luY2x1ZGUgPHN5cy9uYW1laS5oPgojaW5jbHVkZSA8c3lzL3N0
YXQuaD4KI2luY2x1ZGUgPHN5cy92bm9kZS5oPgojaW5jbHVkZSA8c3lzL3Zub2RlX2lmLmg+
CgojaWYgMCAvLyBub3QgaW4gNS4xLnggLi4KI2luY2x1ZGUgPG1pc2Nmcy9nZW5mcy9nZW5m
cy5oPgojZW5kaWYKCiNpbmNsdWRlIDxmcy90bXBmcy90bXBmc192bm9wcy5oPgojaW5jbHVk
ZSA8ZnMvdG1wZnMvdG1wZnMuaD4KCiNpZiAxIC8vIG5lZWRlZCBpbiA1LjEueCBhcyB3b3Jr
YXJvdW5kIGluc3RlYWQgLi4uCiNpbmNsdWRlIDxmcy90bXBmcy9nZW5mc19yZW5hbWUuYz4K
I2VuZGlmCgovKgogKiBGb3J3YXJkIGRlY2xhcmF0aW9ucwogKi8KCnN0YXRpYyBpbnQgdG1w
ZnNfc2FuZV9yZW5hbWUoc3RydWN0IHZub2RlICosIHN0cnVjdCBjb21wb25lbnRuYW1lICos
CiAgICBzdHJ1Y3Qgdm5vZGUgKiwgc3RydWN0IGNvbXBvbmVudG5hbWUgKiwKICAgIGthdXRo
X2NyZWRfdCwgYm9vbCk7CnN0YXRpYyBib29sIHRtcGZzX3JtZGlyZWRfcChzdHJ1Y3Qgdm5v
ZGUgKik7CnN0YXRpYyBpbnQgdG1wZnNfZ3JvX2xvY2tfZGlyZWN0b3J5KHN0cnVjdCBtb3Vu
dCAqLCBzdHJ1Y3Qgdm5vZGUgKik7CgpzdGF0aWMgY29uc3Qgc3RydWN0IGdlbmZzX3JlbmFt
ZV9vcHMgdG1wZnNfZ2VuZnNfcmVuYW1lX29wczsKCi8qCiAqIHRtcGZzX3NhbmVfcmVuYW1l
OiBUaGUgaGFpcmllc3Qgdm9wLCB3aXRoIHRoZSBzYW5lciBBUEkuCiAqCiAqIEFyZ3VtZW50
czoKICoKICogLiBmZHZwIChmcm9tIGRpcmVjdG9yeSB2bm9kZSksCiAqIC4gZmNucCAoZnJv
bSBjb21wb25lbnQgbmFtZSksCiAqIC4gdGR2cCAodG8gZGlyZWN0b3J5IHZub2RlKSwKICog
LiB0Y25wICh0byBjb21wb25lbnQgbmFtZSksCiAqIC4gY3JlZCAoY3JlZGVudGlhbHMgc3Ry
dWN0dXJlKSwgYW5kCiAqIC4gcG9zaXhseV9jb3JyZWN0IChmbGFnIGZvciBiZWhhdmlvdXIg
aWYgdGFyZ2V0ICYgc291cmNlIGxpbmsgc2FtZSBmaWxlKS4KICoKICogZmR2cCBhbmQgdGR2
cCBtYXkgYmUgdGhlIHNhbWUsIGFuZCBtdXN0IGJlIHJlZmVyZW5jZWQgYW5kIHVubG9ja2Vk
LgogKi8Kc3RhdGljIGludAp0bXBmc19zYW5lX3JlbmFtZSgKICAgIHN0cnVjdCB2bm9kZSAq
ZmR2cCwgc3RydWN0IGNvbXBvbmVudG5hbWUgKmZjbnAsCiAgICBzdHJ1Y3Qgdm5vZGUgKnRk
dnAsIHN0cnVjdCBjb21wb25lbnRuYW1lICp0Y25wLAogICAga2F1dGhfY3JlZF90IGNyZWQs
IGJvb2wgcG9zaXhseV9jb3JyZWN0KQp7CglzdHJ1Y3QgdG1wZnNfZGlyZW50ICpmZGlyZW50
LCAqdGRpcmVudDsKCglyZXR1cm4gZ2VuZnNfc2FuZV9yZW5hbWUoJnRtcGZzX2dlbmZzX3Jl
bmFtZV9vcHMsCgkgICAgZmR2cCwgZmNucCwgJmZkaXJlbnQsIHRkdnAsIHRjbnAsICZ0ZGly
ZW50LAoJICAgIGNyZWQsIHBvc2l4bHlfY29ycmVjdCk7Cn0KCi8qCiAqIHRtcGZzX3JlbmFt
ZTogVGhlIGhhaXJpZXN0IHZvcCwgd2l0aCB0aGUgaW5zYW5lc3QgQVBJLiAgRGVmZXIgdG8K
ICogZ2VuZnNfaW5zYW5lX3JlbmFtZSBpbW1lZGlhdGVseS4KICovCmludAp0bXBmc19yZW5h
bWUodm9pZCAqdikKewoKCXJldHVybiBnZW5mc19pbnNhbmVfcmVuYW1lKHYsICZ0bXBmc19z
YW5lX3JlbmFtZSk7Cn0KCi8qCiAqIHRtcGZzX2dyb19kaXJlY3RvcnlfZW1wdHlfcDogUmV0
dXJuIHRydWUgaWYgdGhlIGRpcmVjdG9yeSB2cCBpcwogKiBlbXB0eS4gIGR2cCBpcyBpdHMg
cGFyZW50LgogKgogKiB2cCBhbmQgZHZwIG11c3QgYmUgbG9ja2VkIGFuZCByZWZlcmVuY2Vk
LgogKi8Kc3RhdGljIGJvb2wKdG1wZnNfZ3JvX2RpcmVjdG9yeV9lbXB0eV9wKHN0cnVjdCBt
b3VudCAqbXAsIGthdXRoX2NyZWRfdCBjcmVkLAogICAgc3RydWN0IHZub2RlICp2cCwgc3Ry
dWN0IHZub2RlICpkdnApCnsKCgkodm9pZCltcDsKCSh2b2lkKWNyZWQ7Cgkodm9pZClkdnA7
CglLQVNTRVJUKG1wICE9IE5VTEwpOwoJS0FTU0VSVCh2cCAhPSBOVUxMKTsKCUtBU1NFUlQo
ZHZwICE9IE5VTEwpOwoJS0FTU0VSVCh2cCAhPSBkdnApOwoJS0FTU0VSVCh2cC0+dl9tb3Vu
dCA9PSBtcCk7CglLQVNTRVJUKGR2cC0+dl9tb3VudCA9PSBtcCk7CglLQVNTRVJUKFZPUF9J
U0xPQ0tFRCh2cCkgPT0gTEtfRVhDTFVTSVZFKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKGR2
cCkgPT0gTEtfRVhDTFVTSVZFKTsKCglyZXR1cm4gKFZQX1RPX1RNUEZTX05PREUodnApLT50
bl9zaXplID09IDApOwp9CgovKgogKiB0bXBmc19ncm9fcmVuYW1lX2NoZWNrX3Bvc3NpYmxl
OiBDaGVjayB3aGV0aGVyIGEgcmVuYW1lIGlzIHBvc3NpYmxlCiAqIGluZGVwZW5kZW50IG9m
IGNyZWRlbnRpYWxzLgogKi8Kc3RhdGljIGludAp0bXBmc19ncm9fcmVuYW1lX2NoZWNrX3Bv
c3NpYmxlKHN0cnVjdCBtb3VudCAqbXAsCiAgICBzdHJ1Y3Qgdm5vZGUgKmZkdnAsIHN0cnVj
dCB2bm9kZSAqZnZwLAogICAgc3RydWN0IHZub2RlICp0ZHZwLCBzdHJ1Y3Qgdm5vZGUgKnR2
cCkKewoKCSh2b2lkKW1wOwoJS0FTU0VSVChtcCAhPSBOVUxMKTsKCUtBU1NFUlQoZmR2cCAh
PSBOVUxMKTsKCUtBU1NFUlQoZnZwICE9IE5VTEwpOwoJS0FTU0VSVCh0ZHZwICE9IE5VTEwp
OwoJS0FTU0VSVChmZHZwICE9IGZ2cCk7CglLQVNTRVJUKGZkdnAgIT0gdHZwKTsKCUtBU1NF
UlQodGR2cCAhPSBmdnApOwoJS0FTU0VSVCh0ZHZwICE9IHR2cCk7CglLQVNTRVJUKGZ2cCAh
PSB0dnApOwoJS0FTU0VSVChmZHZwLT52X3R5cGUgPT0gVkRJUik7CglLQVNTRVJUKHRkdnAt
PnZfdHlwZSA9PSBWRElSKTsKCUtBU1NFUlQoZmR2cC0+dl9tb3VudCA9PSBtcCk7CglLQVNT
RVJUKGZ2cC0+dl9tb3VudCA9PSBtcCk7CglLQVNTRVJUKHRkdnAtPnZfbW91bnQgPT0gbXAp
OwoJS0FTU0VSVCgodHZwID09IE5VTEwpIHx8ICh0dnAtPnZfbW91bnQgPT0gbXApKTsKCUtB
U1NFUlQoVk9QX0lTTE9DS0VEKGZkdnApID09IExLX0VYQ0xVU0lWRSk7CglLQVNTRVJUKFZP
UF9JU0xPQ0tFRChmdnApID09IExLX0VYQ0xVU0lWRSk7CglLQVNTRVJUKFZPUF9JU0xPQ0tF
RCh0ZHZwKSA9PSBMS19FWENMVVNJVkUpOwoJS0FTU0VSVCgodHZwID09IE5VTEwpIHx8IChW
T1BfSVNMT0NLRUQodHZwKSA9PSBMS19FWENMVVNJVkUpKTsKCglyZXR1cm4gZ2VuZnNfdWZz
bGlrZV9yZW5hbWVfY2hlY2tfcG9zc2libGUoCgkgICAgVlBfVE9fVE1QRlNfTk9ERShmZHZw
KS0+dG5fZmxhZ3MsIFZQX1RPX1RNUEZTX05PREUoZnZwKS0+dG5fZmxhZ3MsCgkgICAgVlBf
VE9fVE1QRlNfTk9ERSh0ZHZwKS0+dG5fZmxhZ3MsCgkgICAgKHR2cD8gVlBfVE9fVE1QRlNf
Tk9ERSh0dnApLT50bl9mbGFncyA6IDApLCAodHZwICE9IE5VTEwpLAoJICAgIElNTVVUQUJM
RSwgQVBQRU5EKTsKfQoKLyoKICogdG1wZnNfZ3JvX3JlbmFtZV9jaGVja19wZXJtaXR0ZWQ6
IENoZWNrIHdoZXRoZXIgYSByZW5hbWUgaXMKICogcGVybWl0dGVkIGdpdmVuIG91ciBjcmVk
ZW50aWFscy4KICovCnN0YXRpYyBpbnQKdG1wZnNfZ3JvX3JlbmFtZV9jaGVja19wZXJtaXR0
ZWQoc3RydWN0IG1vdW50ICptcCwga2F1dGhfY3JlZF90IGNyZWQsCiAgICBzdHJ1Y3Qgdm5v
ZGUgKmZkdnAsIHN0cnVjdCB2bm9kZSAqZnZwLAogICAgc3RydWN0IHZub2RlICp0ZHZwLCBz
dHJ1Y3Qgdm5vZGUgKnR2cCkKewoKCSh2b2lkKW1wOwoJS0FTU0VSVChtcCAhPSBOVUxMKTsK
CUtBU1NFUlQoZmR2cCAhPSBOVUxMKTsKCUtBU1NFUlQoZnZwICE9IE5VTEwpOwoJS0FTU0VS
VCh0ZHZwICE9IE5VTEwpOwoJS0FTU0VSVChmZHZwICE9IGZ2cCk7CglLQVNTRVJUKGZkdnAg
IT0gdHZwKTsKCUtBU1NFUlQodGR2cCAhPSBmdnApOwoJS0FTU0VSVCh0ZHZwICE9IHR2cCk7
CglLQVNTRVJUKGZ2cCAhPSB0dnApOwoJS0FTU0VSVChmZHZwLT52X3R5cGUgPT0gVkRJUik7
CglLQVNTRVJUKHRkdnAtPnZfdHlwZSA9PSBWRElSKTsKCUtBU1NFUlQoZmR2cC0+dl9tb3Vu
dCA9PSBtcCk7CglLQVNTRVJUKGZ2cC0+dl9tb3VudCA9PSBtcCk7CglLQVNTRVJUKHRkdnAt
PnZfbW91bnQgPT0gbXApOwoJS0FTU0VSVCgodHZwID09IE5VTEwpIHx8ICh0dnAtPnZfbW91
bnQgPT0gbXApKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKGZkdnApID09IExLX0VYQ0xVU0lW
RSk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRChmdnApID09IExLX0VYQ0xVU0lWRSk7CglLQVNT
RVJUKFZPUF9JU0xPQ0tFRCh0ZHZwKSA9PSBMS19FWENMVVNJVkUpOwoJS0FTU0VSVCgodHZw
ID09IE5VTEwpIHx8IChWT1BfSVNMT0NLRUQodHZwKSA9PSBMS19FWENMVVNJVkUpKTsKCgly
ZXR1cm4gZ2VuZnNfdWZzbGlrZV9yZW5hbWVfY2hlY2tfcGVybWl0dGVkKGNyZWQsCgkgICAg
ZmR2cCwgVlBfVE9fVE1QRlNfTk9ERShmZHZwKS0+dG5fbW9kZSwKCSAgICBWUF9UT19UTVBG
U19OT0RFKGZkdnApLT50bl91aWQsCgkgICAgZnZwLCBWUF9UT19UTVBGU19OT0RFKGZ2cCkt
PnRuX3VpZCwKCSAgICB0ZHZwLCBWUF9UT19UTVBGU19OT0RFKHRkdnApLT50bl9tb2RlLAoJ
ICAgIFZQX1RPX1RNUEZTX05PREUodGR2cCktPnRuX3VpZCwKCSAgICB0dnAsICh0dnA/IFZQ
X1RPX1RNUEZTX05PREUodHZwKS0+dG5fdWlkIDogMCkpOwp9CgovKgogKiB0bXBmc19ncm9f
cmVtb3ZlX2NoZWNrX3Bvc3NpYmxlOiBDaGVjayB3aGV0aGVyIGEgcmVtb3ZlIGlzIHBvc3Np
YmxlCiAqIGluZGVwZW5kZW50IG9mIGNyZWRlbnRpYWxzLgogKi8Kc3RhdGljIGludAp0bXBm
c19ncm9fcmVtb3ZlX2NoZWNrX3Bvc3NpYmxlKHN0cnVjdCBtb3VudCAqbXAsCiAgICBzdHJ1
Y3Qgdm5vZGUgKmR2cCwgc3RydWN0IHZub2RlICp2cCkKewoKCSh2b2lkKW1wOwoJS0FTU0VS
VChtcCAhPSBOVUxMKTsKCUtBU1NFUlQoZHZwICE9IE5VTEwpOwoJS0FTU0VSVCh2cCAhPSBO
VUxMKTsKCUtBU1NFUlQoZHZwICE9IHZwKTsKCUtBU1NFUlQoZHZwLT52X3R5cGUgPT0gVkRJ
Uik7CglLQVNTRVJUKHZwLT52X3R5cGUgIT0gVkRJUik7CglLQVNTRVJUKGR2cC0+dl9tb3Vu
dCA9PSBtcCk7CglLQVNTRVJUKHZwLT52X21vdW50ID09IG1wKTsKCUtBU1NFUlQoVk9QX0lT
TE9DS0VEKGR2cCkgPT0gTEtfRVhDTFVTSVZFKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKHZw
KSA9PSBMS19FWENMVVNJVkUpOwoKCXJldHVybiBnZW5mc191ZnNsaWtlX3JlbW92ZV9jaGVj
a19wb3NzaWJsZSgKCSAgICBWUF9UT19UTVBGU19OT0RFKGR2cCktPnRuX2ZsYWdzLCBWUF9U
T19UTVBGU19OT0RFKHZwKS0+dG5fZmxhZ3MsCgkgICAgSU1NVVRBQkxFLCBBUFBFTkQpOwp9
CgovKgogKiB0bXBmc19ncm9fcmVtb3ZlX2NoZWNrX3Blcm1pdHRlZDogQ2hlY2sgd2hldGhl
ciBhIHJlbW92ZSBpcwogKiBwZXJtaXR0ZWQgZ2l2ZW4gb3VyIGNyZWRlbnRpYWxzLgogKi8K
c3RhdGljIGludAp0bXBmc19ncm9fcmVtb3ZlX2NoZWNrX3Blcm1pdHRlZChzdHJ1Y3QgbW91
bnQgKm1wLCBrYXV0aF9jcmVkX3QgY3JlZCwKICAgIHN0cnVjdCB2bm9kZSAqZHZwLCBzdHJ1
Y3Qgdm5vZGUgKnZwKQp7CgoJKHZvaWQpbXA7CglLQVNTRVJUKG1wICE9IE5VTEwpOwoJS0FT
U0VSVChkdnAgIT0gTlVMTCk7CglLQVNTRVJUKHZwICE9IE5VTEwpOwoJS0FTU0VSVChkdnAg
IT0gdnApOwoJS0FTU0VSVChkdnAtPnZfdHlwZSA9PSBWRElSKTsKCUtBU1NFUlQodnAtPnZf
dHlwZSAhPSBWRElSKTsKCUtBU1NFUlQoZHZwLT52X21vdW50ID09IG1wKTsKCUtBU1NFUlQo
dnAtPnZfbW91bnQgPT0gbXApOwoJS0FTU0VSVChWT1BfSVNMT0NLRUQoZHZwKSA9PSBMS19F
WENMVVNJVkUpOwoJS0FTU0VSVChWT1BfSVNMT0NLRUQodnApID09IExLX0VYQ0xVU0lWRSk7
CgoJcmV0dXJuIGdlbmZzX3Vmc2xpa2VfcmVtb3ZlX2NoZWNrX3Blcm1pdHRlZChjcmVkLAoJ
ICAgIGR2cCwgVlBfVE9fVE1QRlNfTk9ERShkdnApLT50bl9tb2RlLCBWUF9UT19UTVBGU19O
T0RFKGR2cCktPnRuX3VpZCwKCSAgICB2cCwgVlBfVE9fVE1QRlNfTk9ERSh2cCktPnRuX3Vp
ZCk7Cn0KCi8qCiAqIHRtcGZzX2dyb19yZW5hbWU6IEFjdHVhbGx5IHBlcmZvcm0gdGhlIHJl
bmFtZSBvcGVyYXRpb24uCiAqLwpzdGF0aWMgaW50CnRtcGZzX2dyb19yZW5hbWUoc3RydWN0
IG1vdW50ICptcCwga2F1dGhfY3JlZF90IGNyZWQsCiAgICBzdHJ1Y3Qgdm5vZGUgKmZkdnAs
IHN0cnVjdCBjb21wb25lbnRuYW1lICpmY25wLAogICAgdm9pZCAqZmRlLCBzdHJ1Y3Qgdm5v
ZGUgKmZ2cCwKICAgIHN0cnVjdCB2bm9kZSAqdGR2cCwgc3RydWN0IGNvbXBvbmVudG5hbWUg
KnRjbnAsCiAgICB2b2lkICp0ZGUsIHN0cnVjdCB2bm9kZSAqdHZwKQp7CglzdHJ1Y3QgdG1w
ZnNfZGlyZW50ICoqZmRlcCA9IGZkZTsKCXN0cnVjdCB0bXBmc19kaXJlbnQgKip0ZGVwID0g
dGRlOwoJY2hhciAqbmV3bmFtZTsKCgkodm9pZCljcmVkOwoJS0FTU0VSVChtcCAhPSBOVUxM
KTsKCUtBU1NFUlQoZmR2cCAhPSBOVUxMKTsKCUtBU1NFUlQoZmNucCAhPSBOVUxMKTsKCUtB
U1NFUlQoZmRlcCAhPSBOVUxMKTsKCUtBU1NFUlQoZnZwICE9IE5VTEwpOwoJS0FTU0VSVCh0
ZHZwICE9IE5VTEwpOwoJS0FTU0VSVCh0Y25wICE9IE5VTEwpOwoJS0FTU0VSVCh0ZGVwICE9
IE5VTEwpOwoJS0FTU0VSVChmZGVwICE9IHRkZXApOwoJS0FTU0VSVCgoKmZkZXApICE9ICgq
dGRlcCkpOwoJS0FTU0VSVCgoKmZkZXApICE9IE5VTEwpOwoJS0FTU0VSVCgoKmZkZXApLT50
ZF9ub2RlID09IFZQX1RPX1RNUEZTX05PREUoZnZwKSk7CglLQVNTRVJUKCh0dnAgPT0gTlVM
TCkgfHwgKCgqdGRlcCkgIT0gTlVMTCkpOwoJS0FTU0VSVCgodHZwID09IE5VTEwpIHx8ICgo
KnRkZXApLT50ZF9ub2RlID09IFZQX1RPX1RNUEZTX05PREUodHZwKSkpOwoJS0FTU0VSVChm
ZHZwICE9IGZ2cCk7CglLQVNTRVJUKGZkdnAgIT0gdHZwKTsKCUtBU1NFUlQodGR2cCAhPSBm
dnApOwoJS0FTU0VSVCh0ZHZwICE9IHR2cCk7CglLQVNTRVJUKGZ2cCAhPSB0dnApOwoJS0FT
U0VSVChmZHZwLT52X21vdW50ID09IG1wKTsKCUtBU1NFUlQoZnZwLT52X21vdW50ID09IG1w
KTsKCUtBU1NFUlQodGR2cC0+dl9tb3VudCA9PSBtcCk7CglLQVNTRVJUKCh0dnAgPT0gTlVM
TCkgfHwgKHR2cC0+dl9tb3VudCA9PSBtcCkpOwoJS0FTU0VSVChWT1BfSVNMT0NLRUQoZmR2
cCkgPT0gTEtfRVhDTFVTSVZFKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKGZ2cCkgPT0gTEtf
RVhDTFVTSVZFKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKHRkdnApID09IExLX0VYQ0xVU0lW
RSk7CglLQVNTRVJUKCh0dnAgPT0gTlVMTCkgfHwgKFZPUF9JU0xPQ0tFRCh0dnApID09IExL
X0VYQ0xVU0lWRSkpOwoKCWlmICh0bXBmc19zdHJuYW1lX25lcWxlbihmY25wLCB0Y25wKSkg
ewoJCW5ld25hbWUgPSB0bXBmc19zdHJuYW1lX2FsbG9jKFZGU19UT19UTVBGUyhtcCksCgkJ
ICAgIHRjbnAtPmNuX25hbWVsZW4pOwoJCWlmIChuZXduYW1lID09IE5VTEwpCgkJCXJldHVy
biBFTk9TUEM7Cgl9IGVsc2UgewoJCW5ld25hbWUgPSBOVUxMOwoJfQoKCS8qCgkgKiBJZiB3
ZSBhcmUgbW92aW5nIGZyb20gb25lIGRpcmVjdG9yeSB0byBhbm90aGVyLCBkZXRhY2ggdGhl
CgkgKiBzb3VyY2UgZW50cnkgYW5kIHJlYXR0YWNoIGl0IHRvIHRoZSB0YXJnZXQgZGlyZWN0
b3J5LgoJICovCglpZiAoZmR2cCAhPSB0ZHZwKSB7CgkJdG1wZnNfZGlyX2RldGFjaChmZHZw
LCAqZmRlcCk7CgkJdG1wZnNfZGlyX2F0dGFjaCh0ZHZwLCAqZmRlcCwgVlBfVE9fVE1QRlNf
Tk9ERShmdnApKTsKCX0gZWxzZSBpZiAodHZwID09IE5VTEwpIHsKCQkvKgoJCSAqIFdlIGFy
ZSBjaGFuZ2luZyB0aGUgZGlyZWN0b3J5LiAgdG1wZnNfZGlyX2F0dGFjaCBhbmQKCQkgKiB0
bXBmc19kaXJfZGV0YWNoIG5vdGUgdGhlIGV2ZW50cyBmb3IgdXMsIGJ1dCBmb3IKCQkgKiB0
aGlzIGNhc2Ugd2UgZG9uJ3QgY2FsbCB0aGVtLCBzbyB3ZSBtdXN0IG5vdGUgdGhlCgkJICog
ZXZlbnQgZXhwbGljaXRseS4KCQkgKi8KCQlWTl9LTk9URShmZHZwLCBOT1RFX1dSSVRFKTsK
CX0KCgkvKgoJICogSWYgd2UgYXJlIHJlcGxhY2luZyBhbiBleGlzdGluZyB0YXJnZXQgZW50
cnksIGRlbGV0ZSBpdC4KCSAqCgkgKiBYWFggV2hhdCBpZiB0aGUgdGFyZ2V0IGlzIGEgZGly
ZWN0b3J5IHdpdGggd2hpdGVvdXQgZW50cmllcz8KCSAqLwoJaWYgKHR2cCAhPSBOVUxMKSB7
CgkJS0FTU0VSVCgoKnRkZXApICE9IE5VTEwpOwoJCUtBU1NFUlQoKCp0ZGVwKS0+dGRfbm9k
ZSA9PSBWUF9UT19UTVBGU19OT0RFKHR2cCkpOwoJCUtBU1NFUlQoKGZ2cC0+dl90eXBlID09
IFZESVIpID09ICh0dnAtPnZfdHlwZSA9PSBWRElSKSk7CgkJaWYgKHR2cC0+dl90eXBlID09
IFZESVIpIHsKCQkJS0FTU0VSVChWUF9UT19UTVBGU19OT0RFKHR2cCktPnRuX3NpemUgPT0g
MCk7CgkJCUtBU1NFUlQoVlBfVE9fVE1QRlNfTk9ERSh0dnApLT50bl9saW5rcyA9PSAyKTsK
CgkJCS8qCgkJCSAqIERlY3JlbWVudCB0aGUgZXh0cmEgbGluayBjb3VudCBmb3IgYC4nIHNv
CgkJCSAqIHRoZSB2bm9kZSB3aWxsIGJlIHJlY3ljbGVkIHdoZW4gcmVsZWFzZWQuCgkJCSAq
CgkJCSAqIFhYWCBXaHkgbm90IGp1c3QgcmVsZWFzZSBkaXJlY3Rvcnkgdm5vZGVzCgkJCSAq
IHdoZW4gdGhlaXIgbGluayBjb3VudCBpcyAxIGluc3RlYWQgb2YgMCBpbgoJCQkgKiB0bXBm
c19pbmFjdGl2ZSwgc2luY2UgYC4nIGlzIGJlaW5nIHRyZWF0ZWQKCQkJICogc3BlY2lhbGx5
IGFueXdheT8KCQkJICovCgkJCVZQX1RPX1RNUEZTX05PREUodHZwKS0+dG5fbGlua3MtLTsK
CQl9CgkJdG1wZnNfZGlyX2RldGFjaCh0ZHZwLCAqdGRlcCk7CgkJdG1wZnNfZnJlZV9kaXJl
bnQoVkZTX1RPX1RNUEZTKG1wKSwgKnRkZXApOwoJfQoKCS8qCgkgKiBVcGRhdGUgdGhlIGRp
cmVjdG9yeSBlbnRyeSdzIG5hbWUgaWYgbmVjZXNzYXJ5LCBhbmQgZmxhZwoJICogbWV0YWRh
dGEgdXBkYXRlcy4gIEEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBoZXJlIGlzIG5vdAoJ
ICogT0sgYmVjYXVzZSB3ZSd2ZSBhbHJlYWR5IGNvbW1pdHRlZCBzb21lIGNoYW5nZXMgdGhh
dCB3ZQoJICogY2FuJ3QgYmFjayBvdXQgYXQgdGhpcyBwb2ludCwgaGVuY2UgdGhlIGVhcmx5
IGFsbG9jYXRpb24KCSAqIGFib3ZlLgoJICovCglpZiAobmV3bmFtZSAhPSBOVUxMKSB7CgkJ
S0FTU0VSVCh0Y25wLT5jbl9uYW1lbGVuIDw9IFRNUEZTX01BWE5BTUxFTik7CgoJCXRtcGZz
X3N0cm5hbWVfZnJlZShWRlNfVE9fVE1QRlMobXApLCAoKmZkZXApLT50ZF9uYW1lLAoJCSAg
ICAoKmZkZXApLT50ZF9uYW1lbGVuKTsKCQkoKmZkZXApLT50ZF9uYW1lbGVuID0gKHVpbnQx
Nl90KXRjbnAtPmNuX25hbWVsZW47CgkJKHZvaWQpbWVtY3B5KG5ld25hbWUsIHRjbnAtPmNu
X25hbWVwdHIsIHRjbnAtPmNuX25hbWVsZW4pOwoJCSgqZmRlcCktPnRkX25hbWUgPSBuZXdu
YW1lOwoKCQlWUF9UT19UTVBGU19OT0RFKGZ2cCktPnRuX3N0YXR1cyB8PSBUTVBGU19OT0RF
X0NIQU5HRUQ7CgkJVlBfVE9fVE1QRlNfTk9ERSh0ZHZwKS0+dG5fc3RhdHVzIHw9IFRNUEZT
X05PREVfTU9ESUZJRUQ7Cgl9CgoJVk5fS05PVEUoZnZwLCBOT1RFX1JFTkFNRSk7CgojaWYg
MQkJCQkvKiBYWFggKi8KLy8gdGhpcyBpcyBuZWVkZWQgb24gNS4xLnggb3IgdGhlIGNhY2hl
IHdpbGwgZ2V0IG91dCBvZiBzeW5jIC4uLi4KCWdlbmZzX3JlbmFtZV9jYWNoZV9wdXJnZShm
ZHZwLCBmdnAsIHRkdnAsIHR2cCk7CiNlbmRpZgoKCXJldHVybiAwOwp9CgovKgogKiB0bXBm
c19ncm9fcmVtb3ZlOiBSZW5hbWUgYW4gb2JqZWN0IG92ZXIgYW5vdGhlciBsaW5rIHRvIGl0
c2VsZiwKICogZWZmZWN0aXZlbHkgcmVtb3ZpbmcganVzdCB0aGUgb3JpZ2luYWwgbGluay4K
ICovCnN0YXRpYyBpbnQKdG1wZnNfZ3JvX3JlbW92ZShzdHJ1Y3QgbW91bnQgKm1wLCBrYXV0
aF9jcmVkX3QgY3JlZCwKICAgIHN0cnVjdCB2bm9kZSAqZHZwLCBzdHJ1Y3QgY29tcG9uZW50
bmFtZSAqY25wLCB2b2lkICpkZSwgc3RydWN0IHZub2RlICp2cCkKewoJc3RydWN0IHRtcGZz
X2RpcmVudCAqKmRlcCA9IGRlOwoKCSh2b2lkKXZwOwoJS0FTU0VSVChtcCAhPSBOVUxMKTsK
CUtBU1NFUlQoZHZwICE9IE5VTEwpOwoJS0FTU0VSVChjbnAgIT0gTlVMTCk7CglLQVNTRVJU
KGRlcCAhPSBOVUxMKTsKCUtBU1NFUlQodnAgIT0gTlVMTCk7CglLQVNTRVJUKGR2cCAhPSB2
cCk7CglLQVNTRVJUKGR2cC0+dl9tb3VudCA9PSBtcCk7CglLQVNTRVJUKHZwLT52X21vdW50
ID09IG1wKTsKCUtBU1NFUlQoZHZwLT52X3R5cGUgPT0gVkRJUik7CglLQVNTRVJUKHZwLT52
X3R5cGUgIT0gVkRJUik7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRChkdnApID09IExLX0VYQ0xV
U0lWRSk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkgPT0gTEtfRVhDTFVTSVZFKTsKCgl0
bXBmc19kaXJfZGV0YWNoKGR2cCwgKmRlcCk7Cgl0bXBmc19mcmVlX2RpcmVudChWRlNfVE9f
VE1QRlMobXApLCAqZGVwKTsKCglyZXR1cm4gMDsKfQoKLyoKICogdG1wZnNfZ3JvX2xvb2t1
cDogTG9vayB1cCBhbmQgc2F2ZSB0aGUgbG9va3VwIHJlc3VsdHMuCiAqLwpzdGF0aWMgaW50
CnRtcGZzX2dyb19sb29rdXAoc3RydWN0IG1vdW50ICptcCwgc3RydWN0IHZub2RlICpkdnAs
CiAgICBzdHJ1Y3QgY29tcG9uZW50bmFtZSAqY25wLCB2b2lkICpkZV9yZXQsIHN0cnVjdCB2
bm9kZSAqKnZwX3JldCkKewoJc3RydWN0IHRtcGZzX2RpcmVudCAqZGlyZW50LCAqKmRlcF9y
ZXQgPSBkZV9yZXQ7CglzdHJ1Y3Qgdm5vZGUgKnZwOwoJaW50IGVycm9yOwoKCSh2b2lkKW1w
OwoJS0FTU0VSVChtcCAhPSBOVUxMKTsKCUtBU1NFUlQoZHZwICE9IE5VTEwpOwoJS0FTU0VS
VChjbnAgIT0gTlVMTCk7CglLQVNTRVJUKGRlcF9yZXQgIT0gTlVMTCk7CglLQVNTRVJUKHZw
X3JldCAhPSBOVUxMKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKGR2cCkgPT0gTEtfRVhDTFVT
SVZFKTsKCglkaXJlbnQgPSB0bXBmc19kaXJfbG9va3VwKFZQX1RPX1RNUEZTX05PREUoZHZw
KSwgY25wKTsKCWlmIChkaXJlbnQgPT0gTlVMTCkKCQlyZXR1cm4gRU5PRU5UOwoKCW11dGV4
X2VudGVyKCZkaXJlbnQtPnRkX25vZGUtPnRuX3Zsb2NrKTsKCWVycm9yID0gdG1wZnNfdm5v
ZGVfZ2V0KG1wLCBkaXJlbnQtPnRkX25vZGUsICZ2cCk7CgkvKiBOb3RlOiB0bXBmc192bm9k
ZV9nZXQgYWx3YXlzIHJlbGVhc2VzIGRpcmVudC0+dGRfbm9kZS0+dG5fdmxvY2suICAqLwoJ
aWYgKGVycm9yKQoJCXJldHVybiBlcnJvcjsKCglLQVNTRVJUKHZwICE9IE5VTEwpOwoJS0FT
U0VSVChWT1BfSVNMT0NLRUQodnApID09IExLX0VYQ0xVU0lWRSk7CgoJLyoKCSAqIHRtcGZz
X3Zub2RlX2dldCByZXR1cm5zIHRoaXMgbG9ja2VkIGZvciB1cywgd2hpY2ggd291bGQgYmUK
CSAqIGNvbnZlbmllbnQgYnV0IGZvciBsb3NzYWdlIGluIG90aGVyIGZpbGUgc3lzdGVtcy4g
IFNvLCBmb3IKCSAqIGh5c3RlcmljYWwgcmFpc2lucywgd2UgaGF2ZSB0byB1bmxvY2sgaXQg
aGVyZS4gIFRoZSBjYWxsZXIKCSAqIHdpbGwgbG9jayBpdCBhZ2FpbiwgYW5kIHdlIGRvbid0
IHJlbHkgb24gYW55IGludGVyZXN0aW5nCgkgKiBpbnZhcmlhbnRzIGluIHRoZSBpbnRlcmlt
LCBiZXlvbmQgdGhhdCBpdCB3b24ndCB2YW5pc2ggZnJvbQoJICogdW5kZXIgdXMsIHdoaWNo
IGl0IHdvbid0IGJlY2F1c2UgaXQncyByZWZlcmVuY2VkLgoJICoKCSAqIFhYWCBPbmNlIG5h
bWVpIGlzIGZpeGVkLCB3ZSBjYW4gY2hhbmdlIHRoZSBnZW5mc19yZW5hbWUKCSAqIHByb3Rv
Y29sIHNvIHRoYXQgdGhpcyB1bmxvY2sgaXMgbm90IG5lY2Vzc2FyeS4KCSAqLwoJVk9QX1VO
TE9DSyh2cCwgMCk7CgoJKmRlcF9yZXQgPSBkaXJlbnQ7CgkqdnBfcmV0ID0gdnA7CglyZXR1
cm4gMDsKfQoKLyoKICogdG1wZnNfcm1kaXJlZF9wOiBDaGVjayB3aGV0aGVyIHRoZSBkaXJl
Y3RvcnkgdnAgaGFzIGJlZW4gcm1kaXJlZC4KICoKICogdnAgbXVzdCBiZSBsb2NrZWQgYW5k
IHJlZmVyZW5jZWQuCiAqLwpzdGF0aWMgYm9vbAp0bXBmc19ybWRpcmVkX3Aoc3RydWN0IHZu
b2RlICp2cCkKewoKCUtBU1NFUlQodnAgIT0gTlVMTCk7CglLQVNTRVJUKFZPUF9JU0xPQ0tF
RCh2cCkgPT0gTEtfRVhDTFVTSVZFKTsKCUtBU1NFUlQodnAtPnZfdHlwZSA9PSBWRElSKTsK
CglyZXR1cm4gKFZQX1RPX1RNUEZTX05PREUodnApLT50bl9zcGVjLnRuX2Rpci50bl9wYXJl
bnQgPT0gTlVMTCk7Cn0KCi8qCiAqIHRtcGZzX2dyb19nZW5lYWxvZ3k6IEFuYWx5emUgdGhl
IGdlbmVhbG9neSBvZiB0aGUgc291cmNlIGFuZCB0YXJnZXQKICogZGlyZWN0b3JpZXMuCiAq
LwpzdGF0aWMgaW50CnRtcGZzX2dyb19nZW5lYWxvZ3koc3RydWN0IG1vdW50ICptcCwga2F1
dGhfY3JlZF90IGNyZWQsCiAgICBzdHJ1Y3Qgdm5vZGUgKmZkdnAsIHN0cnVjdCB2bm9kZSAq
dGR2cCwKICAgIHN0cnVjdCB2bm9kZSAqKmludGVybWVkaWF0ZV9ub2RlX3JldCkKewoJc3Ry
dWN0IHZub2RlICp2cDsKCXN0cnVjdCB0bXBmc19ub2RlICpkbm9kZTsKCWludCBlcnJvcjsK
Cgkodm9pZCljcmVkOwoJS0FTU0VSVChtcCAhPSBOVUxMKTsKCUtBU1NFUlQoZmR2cCAhPSBO
VUxMKTsKCUtBU1NFUlQodGR2cCAhPSBOVUxMKTsKCUtBU1NFUlQoZmR2cCAhPSB0ZHZwKTsK
CUtBU1NFUlQoaW50ZXJtZWRpYXRlX25vZGVfcmV0ICE9IE5VTEwpOwoJS0FTU0VSVChmZHZw
LT52X21vdW50ID09IG1wKTsKCUtBU1NFUlQodGR2cC0+dl9tb3VudCA9PSBtcCk7CglLQVNT
RVJUKGZkdnAtPnZfdHlwZSA9PSBWRElSKTsKCUtBU1NFUlQodGR2cC0+dl90eXBlID09IFZE
SVIpOwoKCS8qCgkgKiBXZSBuZWVkIHRvIHByb3Zpc2lvbmFsbHkgbG9jayB0ZHZwIHRvIGtl
ZXAgcm1kaXIgZnJvbQoJICogZGVsZXRpbmcgaXQgLS0gb3IgYW55IGFuY2VzdG9yIC0tIGF0
IGFuIGlub3Bwb3J0dW5lIG1vbWVudC4KCSAqLwoJZXJyb3IgPSB0bXBmc19ncm9fbG9ja19k
aXJlY3RvcnkobXAsIHRkdnApOwoJaWYgKGVycm9yKQoJCXJldHVybiBlcnJvcjsKCgl2cCA9
IHRkdnA7Cgl2cmVmKHZwKTsKCglmb3IgKDs7KSB7CgkJS0FTU0VSVCh2cCAhPSBOVUxMKTsK
CQlLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkgPT0gTEtfRVhDTFVTSVZFKTsKCQlLQVNTRVJU
KHZwLT52X21vdW50ID09IG1wKTsKCQlLQVNTRVJUKHZwLT52X3R5cGUgPT0gVkRJUik7CgkJ
S0FTU0VSVCghdG1wZnNfcm1kaXJlZF9wKHZwKSk7CgoJCWRub2RlID0gVlBfVE9fVE1QRlNf
Tk9ERSh2cCktPnRuX3NwZWMudG5fZGlyLnRuX3BhcmVudDsKCiNpZiAxIC8vIGJ1ZyAtIFBS
NDY5OTAKCQkvLyB0aGVyZSBpcyBhIHJhY2UgYmV0d2VlbiByZW5hbWUoKSBhbmQgcm1kaXIo
KSAuLi4KCQkvLyBkbm9kZSBtYXkgZ2V0IE5VTEwgaWYgdGhlIHRvLWRpcmVjdG9yeSBnZXRz
IHJlbW92ZWQKCQkvLyBwcmlvciB3ZSBnZXQgaGVyZSAuLi4KCQlpZiAoZG5vZGUgPT0gTlVM
TCkgewoJCQl2cHV0KHZwKTsKCQkJKmludGVybWVkaWF0ZV9ub2RlX3JldCA9IE5VTEw7CgkJ
CXJldHVybiBFTk9FTlQ7CgkJfQojZWxzZQoJCS8qCgkJICogSWYgZG5vZGUgaXMgbnVsbCB0
aGVuIHZwIGhhcyBiZWVuIHJtZGlyJ2QsIHdoaWNoIGlzCgkJICogbm90IHN1cHBvc2VkIHRv
IGhhcHBlbiBiZWNhdXNlIHdlIGhhdmUgaXQgbG9ja2VkLgoJCSAqLwoJCUtBU1NFUlQoZG5v
ZGUgIT0gTlVMTCk7CiNlbmRpZgoKCQkvKiBEaWQgd2UgaGl0IHRoZSByb290IHdpdGhvdXQg
ZmluZGluZyBmZHZwPyAgKi8KCQlpZiAoZG5vZGUgPT0gVlBfVE9fVE1QRlNfTk9ERSh2cCkp
IHsKCQkJdnB1dCh2cCk7CgkJCSppbnRlcm1lZGlhdGVfbm9kZV9yZXQgPSBOVUxMOwoJCQly
ZXR1cm4gMDsKCQl9CgoJCS8qIERpZCB3ZSBmaW5kIHRoYXQgZmR2cCBpcyBhbiBhbmNlc3Rv
ciBvZiB0ZHZwPyAqLwoJCWlmIChkbm9kZSA9PSBWUF9UT19UTVBGU19OT0RFKGZkdnApKSB7
CgkJCUtBU1NFUlQoZG5vZGUtPnRuX3Zub2RlID09IGZkdnApOwoJCQkvKiBVbmxvY2sgdnAs
IGJ1dCBrZWVwIGl0IHJlZmVyZW5jZWQuICAqLwoJCQlWT1BfVU5MT0NLKHZwLCAwKTsKCQkJ
KmludGVybWVkaWF0ZV9ub2RlX3JldCA9IHZwOwoJCQlyZXR1cm4gMDsKCQl9CgoJCS8qIE5l
aXRoZXIgLS0ga2VlcCBhc2NlbmRpbmcgdGhlIGZhbWlseSB0cmVlLiAgKi8KCQltdXRleF9l
bnRlcigmZG5vZGUtPnRuX3Zsb2NrKTsKCQl2cHV0KHZwKTsKCQl2cCA9IE5VTEw7CS8qIEp1
c3QgaW4gY2FzZSwgZm9yIHRoZSBrYXNzZXJ0IGFib3ZlLi4uICAqLwoJCWVycm9yID0gdG1w
ZnNfdm5vZGVfZ2V0KG1wLCBkbm9kZSwgJnZwKTsKCQlpZiAoZXJyb3IpCgkJCXJldHVybiBl
cnJvcjsKCX0KfQoKLyoKICogdG1wZnNfZ3JvX2xvY2tfZGlyZWN0b3J5OiBMb2NrIHRoZSBk
aXJlY3RvcnkgdnAsIGJ1dCBmYWlsIGlmIGl0IGhhcwogKiBiZWVuIHJtZGlyJ2QuCiAqLwpz
dGF0aWMgaW50CnRtcGZzX2dyb19sb2NrX2RpcmVjdG9yeShzdHJ1Y3QgbW91bnQgKm1wLCBz
dHJ1Y3Qgdm5vZGUgKnZwKQp7CgoJKHZvaWQpbXA7CglLQVNTRVJUKG1wICE9IE5VTEwpOwoJ
S0FTU0VSVCh2cCAhPSBOVUxMKTsKCUtBU1NFUlQodnAtPnZfbW91bnQgPT0gbXApOwoKCXZu
X2xvY2sodnAsIExLX0VYQ0xVU0lWRSB8IExLX1JFVFJZKTsKCglpZiAodG1wZnNfcm1kaXJl
ZF9wKHZwKSkgewoJCVZPUF9VTkxPQ0sodnAsIDApOwoJCXJldHVybiBFTk9FTlQ7Cgl9CgoJ
cmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgZ2VuZnNfcmVuYW1lX29wcyB0bXBm
c19nZW5mc19yZW5hbWVfb3BzID0gewoJLmdyb19kaXJlY3RvcnlfZW1wdHlfcAkJPSB0bXBm
c19ncm9fZGlyZWN0b3J5X2VtcHR5X3AsCgkuZ3JvX3JlbmFtZV9jaGVja19wb3NzaWJsZQk9
IHRtcGZzX2dyb19yZW5hbWVfY2hlY2tfcG9zc2libGUsCgkuZ3JvX3JlbmFtZV9jaGVja19w
ZXJtaXR0ZWQJPSB0bXBmc19ncm9fcmVuYW1lX2NoZWNrX3Blcm1pdHRlZCwKCS5ncm9fcmVt
b3ZlX2NoZWNrX3Bvc3NpYmxlCT0gdG1wZnNfZ3JvX3JlbW92ZV9jaGVja19wb3NzaWJsZSwK
CS5ncm9fcmVtb3ZlX2NoZWNrX3Blcm1pdHRlZAk9IHRtcGZzX2dyb19yZW1vdmVfY2hlY2tf
cGVybWl0dGVkLAoJLmdyb19yZW5hbWUJCQk9IHRtcGZzX2dyb19yZW5hbWUsCgkuZ3JvX3Jl
bW92ZQkJCT0gdG1wZnNfZ3JvX3JlbW92ZSwKCS5ncm9fbG9va3VwCQkJPSB0bXBmc19ncm9f
bG9va3VwLAoJLmdyb19nZW5lYWxvZ3kJCQk9IHRtcGZzX2dyb19nZW5lYWxvZ3ksCgkuZ3Jv
X2xvY2tfZGlyZWN0b3J5CQk9IHRtcGZzX2dyb19sb2NrX2RpcmVjdG9yeSwKfTsKAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRtcGZzLXBhdGNoL3NyYy9zeXMvZnMvdG1wZnMvdG1w
ZnNfbWVtLmMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAwMTAwNDQ0ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDAxMjY2MgAxMjAy
NDYwMzUxMAAwMDE3NDIzADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAdXN0YXIgIAByb290AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVs
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyoJJE5l
dEJTRDogdG1wZnNfbWVtLmMsdiAxLjQgMjAxMS8wNS8yNCAwMTowOTo0NyBybWluZCBFeHAg
JAkqLwoKLyoKICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIFRoZSBOZXRCU0QgRm91bmRh
dGlvbiwgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBUaGlzIGNvZGUgaXMg
ZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIFRoZSBOZXRCU0QgRm91bmRh
dGlvbgogKiBieSBNaW5kYXVnYXMgUmFzaXVrZXZpY2l1cy4KICoKICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTkVUQlNE
IEZPVU5EQVRJT04sIElOQy4gQU5EIENPTlRSSUJVVE9SUwogKiBgYEFTIElTJycgQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQKICogVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBGT1VOREFUSU9OIE9SIENPTlRSSUJVVE9SUwog
KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCiAqIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUwogKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgogKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQogKiBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRQogKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICovCgov
KgogKiB0bXBmcyBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcy4KICogSW1wbGVtZW50cyBt
ZW1vcnkgdXNhZ2UgYWNjb3VudGluZyBhbmQgbGltaXRpbmcuCiAqLwoKI2luY2x1ZGUgPHN5
cy9jZGVmcy5oPgpfX0tFUk5FTF9SQ1NJRCgwLCAiJE5ldEJTRDogdG1wZnNfbWVtLmMsdiAx
LjQgMjAxMS8wNS8yNCAwMTowOTo0NyBybWluZCBFeHAgJCIpOwoKI2luY2x1ZGUgPHN5cy9w
YXJhbS5oPgojaW5jbHVkZSA8c3lzL2F0b21pYy5oPgojaW5jbHVkZSA8c3lzL2ttZW0uaD4K
I2luY2x1ZGUgPHN5cy9uYW1laS5oPgojaW5jbHVkZSA8c3lzL3Bvb2wuaD4KCiNpbmNsdWRl
IDxmcy90bXBmcy90bXBmcy5oPgoKZXh0ZXJuIHN0cnVjdCBwb29sCXRtcGZzX2RpcmVudF9w
b29sOwpleHRlcm4gc3RydWN0IHBvb2wJdG1wZnNfbm9kZV9wb29sOwoKdm9pZAp0bXBmc19t
bnRtZW1faW5pdChzdHJ1Y3QgdG1wZnNfbW91bnQgKm1wLCB1aW50NjRfdCBtZW1saW1pdCkK
ewoKCW11dGV4X2luaXQoJm1wLT50bV9hY2NfbG9jaywgTVVURVhfREVGQVVMVCwgSVBMX05P
TkUpOwoJbXAtPnRtX21lbV9saW1pdCA9IG1lbWxpbWl0OwoJbXAtPnRtX2J5dGVzX3VzZWQg
PSAwOwp9Cgp2b2lkCnRtcGZzX21udG1lbV9kZXN0cm95KHN0cnVjdCB0bXBmc19tb3VudCAq
bXApCnsKCglLQVNTRVJUKG1wLT50bV9ieXRlc191c2VkID09IDApOwoJbXV0ZXhfZGVzdHJv
eSgmbXAtPnRtX2FjY19sb2NrKTsKfQoKLyoKICogdG1wZnNfbWVtX2luZm86IHJldHVybiB0
aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBtZW1vcnkgcGFnZXMuCiAqCiAqID0+IElmICd0b3Rh
bCcgaXMgdHJ1ZSwgdGhlbiByZXR1cm4gX3RvdGFsXyBhbW91bnQgb2YgcGFnZXMuCiAqID0+
IElmIGZhbHNlLCB0aGVuIHJldHVybiB0aGUgYW1vdW50IG9mIF9mcmVlXyBtZW1vcnkgcGFn
ZXMuCiAqCiAqIFJlbWVtYmVyIHRvIHJlbW92ZSBUTVBGU19QQUdFU19SRVNFUlZFRCBmcm9t
IHRoZSByZXR1cm5lZCB2YWx1ZSB0byBhdm9pZAogKiBleGNlc3NpdmUgbWVtb3J5IHVzYWdl
LgogKi8Kc2l6ZV90CnRtcGZzX21lbV9pbmZvKGJvb2wgdG90YWwpCnsKCXNpemVfdCBzaXpl
ID0gMDsKCgkvKiBYWFg6IHVubG9ja2VkICovCglzaXplICs9IHV2bWV4cC5zd3BnYXZhaWw7
CglpZiAoIXRvdGFsKSB7CgkJc2l6ZSAtPSB1dm1leHAuc3dwZ29ubHk7Cgl9CglzaXplICs9
IHV2bWV4cC5mcmVlOwoJc2l6ZSArPSB1dm1leHAuZmlsZXBhZ2VzOwoJaWYgKHNpemUgPiB1
dm1leHAud2lyZWQpIHsKCQlzaXplIC09IHV2bWV4cC53aXJlZDsKCX0gZWxzZSB7CgkJc2l6
ZSA9IDA7Cgl9CglyZXR1cm4gc2l6ZTsKfQoKdWludDY0X3QKdG1wZnNfYnl0ZXNfbWF4KHN0
cnVjdCB0bXBmc19tb3VudCAqbXApCnsKCXNpemVfdCBmcmVlcGFnZXMgPSB0bXBmc19tZW1f
aW5mbyhmYWxzZSk7Cgl1aW50NjRfdCBhdmFpbF9tZW07CgoJaWYgKGZyZWVwYWdlcyA8IFRN
UEZTX1BBR0VTX1JFU0VSVkVEKSB7CgkJZnJlZXBhZ2VzID0gMDsKCX0gZWxzZSB7CgkJZnJl
ZXBhZ2VzIC09IFRNUEZTX1BBR0VTX1JFU0VSVkVEOwoJfQoJYXZhaWxfbWVtID0gcm91bmRf
cGFnZShtcC0+dG1fYnl0ZXNfdXNlZCkgKyAoZnJlZXBhZ2VzIDw8IFBBR0VfU0hJRlQpOwoJ
cmV0dXJuIE1JTihtcC0+dG1fbWVtX2xpbWl0LCBhdmFpbF9tZW0pOwp9CgpzaXplX3QKdG1w
ZnNfcGFnZXNfYXZhaWwoc3RydWN0IHRtcGZzX21vdW50ICptcCkKewoKCXJldHVybiAodG1w
ZnNfYnl0ZXNfbWF4KG1wKSAtIG1wLT50bV9ieXRlc191c2VkKSA+PiBQQUdFX1NISUZUOwp9
Cgpib29sCnRtcGZzX21lbV9pbmNyKHN0cnVjdCB0bXBmc19tb3VudCAqbXAsIHNpemVfdCBz
eikKewoJdWludDY0X3QgbGltOwoKCW11dGV4X2VudGVyKCZtcC0+dG1fYWNjX2xvY2spOwoJ
bGltID0gdG1wZnNfYnl0ZXNfbWF4KG1wKTsKCWlmIChtcC0+dG1fYnl0ZXNfdXNlZCArIHN6
ID49IGxpbSkgewoJCW11dGV4X2V4aXQoJm1wLT50bV9hY2NfbG9jayk7CgkJcmV0dXJuIGZh
bHNlOwoJfQoJbXAtPnRtX2J5dGVzX3VzZWQgKz0gc3o7CgltdXRleF9leGl0KCZtcC0+dG1f
YWNjX2xvY2spOwoJcmV0dXJuIHRydWU7Cn0KCnZvaWQKdG1wZnNfbWVtX2RlY3Ioc3RydWN0
IHRtcGZzX21vdW50ICptcCwgc2l6ZV90IHN6KQp7CgoJbXV0ZXhfZW50ZXIoJm1wLT50bV9h
Y2NfbG9jayk7CglLQVNTRVJUKG1wLT50bV9ieXRlc191c2VkID49IHN6KTsKCW1wLT50bV9i
eXRlc191c2VkIC09IHN6OwoJbXV0ZXhfZXhpdCgmbXAtPnRtX2FjY19sb2NrKTsKfQoKc3Ry
dWN0IHRtcGZzX2RpcmVudCAqCnRtcGZzX2RpcmVudF9nZXQoc3RydWN0IHRtcGZzX21vdW50
ICptcCkKewoKCWlmICghdG1wZnNfbWVtX2luY3IobXAsIHNpemVvZihzdHJ1Y3QgdG1wZnNf
ZGlyZW50KSkpIHsKCQlyZXR1cm4gTlVMTDsKCX0KCXJldHVybiBwb29sX2dldCgmdG1wZnNf
ZGlyZW50X3Bvb2wsIFBSX1dBSVRPSyk7Cn0KCnZvaWQKdG1wZnNfZGlyZW50X3B1dChzdHJ1
Y3QgdG1wZnNfbW91bnQgKm1wLCBzdHJ1Y3QgdG1wZnNfZGlyZW50ICpkZSkKewoKCXRtcGZz
X21lbV9kZWNyKG1wLCBzaXplb2Yoc3RydWN0IHRtcGZzX2RpcmVudCkpOwoJcG9vbF9wdXQo
JnRtcGZzX2RpcmVudF9wb29sLCBkZSk7Cn0KCnN0cnVjdCB0bXBmc19ub2RlICoKdG1wZnNf
bm9kZV9nZXQoc3RydWN0IHRtcGZzX21vdW50ICptcCkKewoKCWlmIChhdG9taWNfaW5jX3Vp
bnRfbnYoJm1wLT50bV9ub2Rlc19jbnQpID49IG1wLT50bV9ub2Rlc19tYXgpIHsKCQlhdG9t
aWNfZGVjX3VpbnQoJm1wLT50bV9ub2Rlc19jbnQpOwoJCXJldHVybiBOVUxMOwoJfQoJaWYg
KCF0bXBmc19tZW1faW5jcihtcCwgc2l6ZW9mKHN0cnVjdCB0bXBmc19ub2RlKSkpIHsKCQly
ZXR1cm4gTlVMTDsKCX0KCXJldHVybiBwb29sX2dldCgmdG1wZnNfbm9kZV9wb29sLCBQUl9X
QUlUT0spOwp9Cgp2b2lkCnRtcGZzX25vZGVfcHV0KHN0cnVjdCB0bXBmc19tb3VudCAqbXAs
IHN0cnVjdCB0bXBmc19ub2RlICp0bikKewoKCWF0b21pY19kZWNfdWludCgmbXAtPnRtX25v
ZGVzX2NudCk7Cgl0bXBmc19tZW1fZGVjcihtcCwgc2l6ZW9mKHN0cnVjdCB0bXBmc19ub2Rl
KSk7Cglwb29sX3B1dCgmdG1wZnNfbm9kZV9wb29sLCB0bik7Cn0KCi8qCiAqIFF1YW50dW0g
c2l6ZSB0byByb3VuZC11cCB0aGUgdG1wZnMgbmFtZXMgaW4gb3JkZXIgdG8gcmVkdWNlIHJl
LWFsbG9jYXRpb25zLgogKi8KCiNkZWZpbmUJVE1QRlNfTkFNRV9RVUFOVFVNCSgzMikKCmNo
YXIgKgp0bXBmc19zdHJuYW1lX2FsbG9jKHN0cnVjdCB0bXBmc19tb3VudCAqbXAsIHNpemVf
dCBsZW4pCnsKCWNvbnN0IHNpemVfdCBzeiA9IHJvdW5kdXAyKGxlbiwgVE1QRlNfTkFNRV9R
VUFOVFVNKTsKCglLQVNTRVJUKHN6ID4gMCAmJiBzeiA8PSAxMDI0KTsKCWlmICghdG1wZnNf
bWVtX2luY3IobXAsIHN6KSkgewoJCXJldHVybiBOVUxMOwoJfQoJcmV0dXJuIGttZW1fYWxs
b2Moc3osIEtNX1NMRUVQKTsKfQoKdm9pZAp0bXBmc19zdHJuYW1lX2ZyZWUoc3RydWN0IHRt
cGZzX21vdW50ICptcCwgY2hhciAqc3RyLCBzaXplX3QgbGVuKQp7Cgljb25zdCBzaXplX3Qg
c3ogPSByb3VuZHVwMihsZW4sIFRNUEZTX05BTUVfUVVBTlRVTSk7CgoJS0FTU0VSVChzeiA+
IDAgJiYgc3ogPD0gMTAyNCk7Cgl0bXBmc19tZW1fZGVjcihtcCwgc3opOwoJa21lbV9mcmVl
KHN0ciwgc3opOwp9Cgpib29sCnRtcGZzX3N0cm5hbWVfbmVxbGVuKHN0cnVjdCBjb21wb25l
bnRuYW1lICpmY25wLCBzdHJ1Y3QgY29tcG9uZW50bmFtZSAqdGNucCkKewoJY29uc3Qgc2l6
ZV90IGZsbiA9IHJvdW5kdXAyKGZjbnAtPmNuX25hbWVsZW4sIFRNUEZTX05BTUVfUVVBTlRV
TSk7Cgljb25zdCBzaXplX3QgdGxuID0gcm91bmR1cDIodGNucC0+Y25fbmFtZWxlbiwgVE1Q
RlNfTkFNRV9RVUFOVFVNKTsKCglyZXR1cm4gKGZsbiAhPSB0bG4pIHx8IG1lbWNtcChmY25w
LT5jbl9uYW1lcHRyLCB0Y25wLT5jbl9uYW1lcHRyLCBmbG4pOwp9CgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHRtcGZzLXBhdGNoL3NyYy9zeXMvZnMvdG1wZnMvdG1wZnNfdmZzb3BzLmMA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAwMTAwNDQ0ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDAyNTExMwAxMjAyNDYwNDIwMAAwMDIw
MTU1ADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0
YXIgIAByb290AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyoJJE5ldEJTRDogdG1wZnNf
dmZzb3BzLmMsdiAxLjUyIDIwMTEvMDkvMjcgMDE6MTA6NDMgY2hyaXN0b3MgRXhwICQJKi8K
Ci8qCiAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBUaGUgTmV0QlNEIEZvdW5k
YXRpb24sIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhpcyBjb2RlIGlz
IGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBUaGUgTmV0QlNEIEZvdW5k
YXRpb24KICogYnkgSnVsaW8gTS4gTWVyaW5vIFZpZGFsLCBkZXZlbG9wZWQgYXMgcGFydCBv
ZiBHb29nbGUncyBTdW1tZXIgb2YgQ29kZQogKiAyMDA1IHByb2dyYW0uCiAqCiAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhF
IE5FVEJTRCBGT1VOREFUSU9OLCBJTkMuIEFORCBDT05UUklCVVRPUlMKICogYGBBUyBJUycn
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVECiAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgRk9VTkRBVElPTiBPUiBDT05UUklC
VVRPUlMKICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgogKiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KICogQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CiAqLwoKLyoKICogRWZmaWNpZW50IG1lbW9yeSBmaWxlIHN5c3RlbS4KICoKICogdG1wZnMg
aXMgYSBmaWxlIHN5c3RlbSB0aGF0IHVzZXMgTmV0QlNEJ3MgdmlydHVhbCBtZW1vcnkgc3Vi
LXN5c3RlbQogKiAodGhlIHdlbGwta25vd24gVVZNKSB0byBzdG9yZSBmaWxlIGRhdGEgYW5k
IG1ldGFkYXRhIGluIGFuIGVmZmljaWVudAogKiB3YXkuICBUaGlzIG1lYW5zIHRoYXQgaXQg
ZG9lcyBub3QgZm9sbG93IHRoZSBzdHJ1Y3R1cmUgb2YgYW4gb24tZGlzawogKiBmaWxlIHN5
c3RlbSBiZWNhdXNlIGl0IHNpbXBseSBkb2VzIG5vdCBuZWVkIHRvLiAgSW5zdGVhZCwgaXQg
dXNlcwogKiBtZW1vcnktc3BlY2lmaWMgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBhbGdvcml0aG1z
IHRvIGF1dG9tYXRpY2FsbHkKICogYWxsb2NhdGUgYW5kIHJlbGVhc2UgcmVzb3VyY2VzLgog
Ki8KCiNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KX19LRVJORUxfUkNTSUQoMCwgIiROZXRCU0Q6
IHRtcGZzX3Zmc29wcy5jLHYgMS41MiAyMDExLzA5LzI3IDAxOjEwOjQzIGNocmlzdG9zIEV4
cCAkIik7CgojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4K
I2luY2x1ZGUgPHN5cy9rbWVtLmg+CiNpbmNsdWRlIDxzeXMvbW91bnQuaD4KI2luY2x1ZGUg
PHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxzeXMvc3lzdG0uaD4KI2luY2x1ZGUgPHN5cy92bm9k
ZS5oPgojaW5jbHVkZSA8c3lzL21vZHVsZS5oPgoKI2luY2x1ZGUgPG1pc2Nmcy9nZW5mcy9n
ZW5mcy5oPgojaW5jbHVkZSA8ZnMvdG1wZnMvdG1wZnMuaD4KI2luY2x1ZGUgPGZzL3RtcGZz
L3RtcGZzX2FyZ3MuaD4KCk1PRFVMRShNT0RVTEVfQ0xBU1NfVkZTLCB0bXBmcywgTlVMTCk7
CgpzdHJ1Y3QgcG9vbAl0bXBmc19kaXJlbnRfcG9vbDsKc3RydWN0IHBvb2wJdG1wZnNfbm9k
ZV9wb29sOwoKc3RhdGljIGludAl0bXBmc19tb3VudChzdHJ1Y3QgbW91bnQgKiwgY29uc3Qg
Y2hhciAqLCB2b2lkICosIHNpemVfdCAqKTsKc3RhdGljIGludAl0bXBmc19zdGFydChzdHJ1
Y3QgbW91bnQgKiwgaW50KTsKc3RhdGljIGludAl0bXBmc191bm1vdW50KHN0cnVjdCBtb3Vu
dCAqLCBpbnQpOwpzdGF0aWMgaW50CXRtcGZzX3Jvb3Qoc3RydWN0IG1vdW50ICosIHZub2Rl
X3QgKiopOwpzdGF0aWMgaW50CXRtcGZzX3ZnZXQoc3RydWN0IG1vdW50ICosIGlub190LCB2
bm9kZV90ICoqKTsKc3RhdGljIGludAl0bXBmc19maHRvdnAoc3RydWN0IG1vdW50ICosIHN0
cnVjdCBmaWQgKiwgdm5vZGVfdCAqKik7CnN0YXRpYyBpbnQJdG1wZnNfdnB0b2ZoKHN0cnVj
dCB2bm9kZSAqLCBzdHJ1Y3QgZmlkICosIHNpemVfdCAqKTsKc3RhdGljIGludAl0bXBmc19z
dGF0dmZzKHN0cnVjdCBtb3VudCAqLCBzdHJ1Y3Qgc3RhdHZmcyAqKTsKc3RhdGljIGludAl0
bXBmc19zeW5jKHN0cnVjdCBtb3VudCAqLCBpbnQsIGthdXRoX2NyZWRfdCk7CnN0YXRpYyB2
b2lkCXRtcGZzX2luaXQodm9pZCk7CnN0YXRpYyB2b2lkCXRtcGZzX2RvbmUodm9pZCk7CnN0
YXRpYyBpbnQJdG1wZnNfc25hcHNob3Qoc3RydWN0IG1vdW50ICosIHZub2RlX3QgKiwgc3Ry
dWN0IHRpbWVzcGVjICopOwoKc3RhdGljIHZvaWQKdG1wZnNfaW5pdCh2b2lkKQp7CgoJcG9v
bF9pbml0KCZ0bXBmc19kaXJlbnRfcG9vbCwgc2l6ZW9mKHRtcGZzX2RpcmVudF90KSwgMCwg
MCwgMCwKCSAgICAidG1wZnNfZGlyZW50IiwgJnBvb2xfYWxsb2NhdG9yX25vaW50ciwgSVBM
X05PTkUpOwoJcG9vbF9pbml0KCZ0bXBmc19ub2RlX3Bvb2wsIHNpemVvZih0bXBmc19ub2Rl
X3QpLCAwLCAwLCAwLAoJICAgICJ0bXBmc19ub2RlIiwgJnBvb2xfYWxsb2NhdG9yX25vaW50
ciwgSVBMX05PTkUpOwp9CgpzdGF0aWMgdm9pZAp0bXBmc19kb25lKHZvaWQpCnsKCglwb29s
X2Rlc3Ryb3koJnRtcGZzX2RpcmVudF9wb29sKTsKCXBvb2xfZGVzdHJveSgmdG1wZnNfbm9k
ZV9wb29sKTsKfQoKc3RhdGljIGludAp0bXBmc19tb3VudChzdHJ1Y3QgbW91bnQgKm1wLCBj
b25zdCBjaGFyICpwYXRoLCB2b2lkICpkYXRhLCBzaXplX3QgKmRhdGFfbGVuKQp7CglzdHJ1
Y3QgdG1wZnNfYXJncyAqYXJncyA9IGRhdGE7Cgl0bXBmc19tb3VudF90ICp0bXA7Cgl0bXBm
c19ub2RlX3QgKnJvb3Q7Cgl1aW50NjRfdCBtZW1saW1pdDsKCWlub190IG5vZGVzOwoJaW50
IGVycm9yOwoKCS8qIFZhbGlkYXRlIHRoZSB2ZXJzaW9uLiAqLwoJaWYgKCpkYXRhX2xlbiA8
IHNpemVvZigqYXJncykgfHwKCSAgICBhcmdzLT50YV92ZXJzaW9uICE9IFRNUEZTX0FSR1Nf
VkVSU0lPTikKCQlyZXR1cm4gRUlOVkFMOwoKCS8qIEhhbmRsZSByZXRyaWV2YWwgb2YgbW91
bnQgcG9pbnQgYXJndW1lbnRzLiAqLwoJaWYgKG1wLT5tbnRfZmxhZyAmIE1OVF9HRVRBUkdT
KSB7CgkJaWYgKG1wLT5tbnRfZGF0YSA9PSBOVUxMKQoJCQlyZXR1cm4gRUlPOwoJCXRtcCA9
IFZGU19UT19UTVBGUyhtcCk7CgoJCWFyZ3MtPnRhX3ZlcnNpb24gPSBUTVBGU19BUkdTX1ZF
UlNJT047CgkJYXJncy0+dGFfbm9kZXNfbWF4ID0gdG1wLT50bV9ub2Rlc19tYXg7CgkJYXJn
cy0+dGFfc2l6ZV9tYXggPSB0bXAtPnRtX21lbV9saW1pdDsKCgkJcm9vdCA9IHRtcC0+dG1f
cm9vdDsKCQlhcmdzLT50YV9yb290X3VpZCA9IHJvb3QtPnRuX3VpZDsKCQlhcmdzLT50YV9y
b290X2dpZCA9IHJvb3QtPnRuX2dpZDsKCQlhcmdzLT50YV9yb290X21vZGUgPSByb290LT50
bl9tb2RlOwoKCQkqZGF0YV9sZW4gPSBzaXplb2YoKmFyZ3MpOwoJCXJldHVybiAwOwoJfQoK
CWlmIChtcC0+bW50X2ZsYWcgJiBNTlRfVVBEQVRFKSB7CgkJLyogVE9ETyAqLwoJCXJldHVy
biBFT1BOT1RTVVBQOwoJfQoKCS8qIFByb2hpYml0IG1vdW50cyBpZiB0aGVyZSBpcyBub3Qg
ZW5vdWdoIG1lbW9yeS4gKi8KCWlmICh0bXBmc19tZW1faW5mbyh0cnVlKSA8IFRNUEZTX1BB
R0VTX1JFU0VSVkVEKQoJCXJldHVybiBFSU5WQUw7CgoJLyogR2V0IHRoZSBtZW1vcnkgdXNh
Z2UgbGltaXQgZm9yIHRoaXMgZmlsZS1zeXN0ZW0uICovCglpZiAoYXJncy0+dGFfc2l6ZV9t
YXggPCBQQUdFX1NJWkUpIHsKCQltZW1saW1pdCA9IFVJTlQ2NF9NQVg7Cgl9IGVsc2UgewoJ
CW1lbWxpbWl0ID0gYXJncy0+dGFfc2l6ZV9tYXg7Cgl9CglLQVNTRVJUKG1lbWxpbWl0ID4g
MCk7CgoJaWYgKGFyZ3MtPnRhX25vZGVzX21heCA8PSAzKSB7CgkJbm9kZXMgPSAzICsgKG1l
bWxpbWl0IC8gMTAyNCk7Cgl9IGVsc2UgewoJCW5vZGVzID0gYXJncy0+dGFfbm9kZXNfbWF4
OwoJfQoJbm9kZXMgPSBNSU4obm9kZXMsIElOVF9NQVgpOwoJS0FTU0VSVChub2RlcyA+PSAz
KTsKCgkvKiBBbGxvY2F0ZSB0aGUgdG1wZnMgbW91bnQgc3RydWN0dXJlIGFuZCBmaWxsIGl0
LiAqLwoJdG1wID0ga21lbV96YWxsb2Moc2l6ZW9mKHRtcGZzX21vdW50X3QpLCBLTV9TTEVF
UCk7CglpZiAodG1wID09IE5VTEwpCgkJcmV0dXJuIEVOT01FTTsKCgl0bXAtPnRtX25vZGVz
X21heCA9IG5vZGVzOwoJdG1wLT50bV9ub2Rlc19jbnQgPSAwOwoJTElTVF9JTklUKCZ0bXAt
PnRtX25vZGVzKTsKCgltdXRleF9pbml0KCZ0bXAtPnRtX2xvY2ssIE1VVEVYX0RFRkFVTFQs
IElQTF9OT05FKTsKCXRtcGZzX21udG1lbV9pbml0KHRtcCwgbWVtbGltaXQpOwoKCS8qIEFs
bG9jYXRlIHRoZSByb290IG5vZGUuICovCgllcnJvciA9IHRtcGZzX2FsbG9jX25vZGUodG1w
LCBWRElSLCBhcmdzLT50YV9yb290X3VpZCwKCSAgICBhcmdzLT50YV9yb290X2dpZCwgYXJn
cy0+dGFfcm9vdF9tb2RlICYgQUxMUEVSTVMsIE5VTEwsCgkgICAgVk5PVkFMLCAmcm9vdCk7
CglLQVNTRVJUKGVycm9yID09IDAgJiYgcm9vdCAhPSBOVUxMKTsKCgkvKgoJICogUGFyZW50
IG9mIHRoZSByb290IGlub2RlIGlzIGl0c2VsZi4gIEFsc28sIHJvb3QgaW5vZGUgaGFzIG5v
CgkgKiBkaXJlY3RvcnkgZW50cnkgKGkuZS4gaXMgbmV2ZXIgYXR0YWNoZWQpLCB0aHVzIGhv
bGQgYW4gZXh0cmEKCSAqIHJlZmVyZW5jZSAobGluaykgZm9yIGl0LgoJICovCglyb290LT50
bl9saW5rcysrOwoJcm9vdC0+dG5fc3BlYy50bl9kaXIudG5fcGFyZW50ID0gcm9vdDsKCXRt
cC0+dG1fcm9vdCA9IHJvb3Q7CgoJbXAtPm1udF9kYXRhID0gdG1wOwoJbXAtPm1udF9mbGFn
IHw9IE1OVF9MT0NBTDsKCW1wLT5tbnRfc3RhdC5mX25hbWVtYXggPSBUTVBGU19NQVhOQU1M
RU47CgltcC0+bW50X2ZzX2JzaGlmdCA9IFBBR0VfU0hJRlQ7CgltcC0+bW50X2Rldl9ic2hp
ZnQgPSBERVZfQlNISUZUOwoJbXAtPm1udF9pZmxhZyB8PSBJTU5UX01QU0FGRTsKCXZmc19n
ZXRuZXdmc2lkKG1wKTsKCgllcnJvciA9IHNldF9zdGF0dmZzX2luZm8ocGF0aCwgVUlPX1VT
RVJTUEFDRSwgInRtcGZzIiwgVUlPX1NZU1NQQUNFLAoJICAgIG1wLT5tbnRfb3AtPnZmc19u
YW1lLCBtcCwgY3VybHdwKTsKCWlmIChlcnJvcikgewoJCSh2b2lkKXRtcGZzX3VubW91bnQo
bXAsIE1OVF9GT1JDRSk7Cgl9CglyZXR1cm4gZXJyb3I7Cn0KCnN0YXRpYyBpbnQKdG1wZnNf
c3RhcnQoc3RydWN0IG1vdW50ICptcCwgaW50IGZsYWdzKQp7CgoJcmV0dXJuIDA7Cn0KCnN0
YXRpYyBpbnQKdG1wZnNfdW5tb3VudChzdHJ1Y3QgbW91bnQgKm1wLCBpbnQgbW50ZmxhZ3Mp
CnsKCXRtcGZzX21vdW50X3QgKnRtcDsKCXRtcGZzX25vZGVfdCAqbm9kZTsKCWludCBlcnJv
ciwgZmxhZ3MgPSAwOwoKCS8qIEhhbmRsZSBmb3JjZWQgdW5tb3VudHMuICovCglpZiAobW50
ZmxhZ3MgJiBNTlRfRk9SQ0UpCgkJZmxhZ3MgfD0gRk9SQ0VDTE9TRTsKCgkvKiBGaW5hbGl6
ZSBhbGwgcGVuZGluZyBJL08uICovCgllcnJvciA9IHZmbHVzaChtcCwgTlVMTCwgZmxhZ3Mp
OwoJaWYgKGVycm9yICE9IDApCgkJcmV0dXJuIGVycm9yOwoKCXRtcCA9IFZGU19UT19UTVBG
UyhtcCk7CgoJLyogRGVzdHJveSBhbnkgZXhpc3RpbmcgaW5vZGVzLiAqLwoJd2hpbGUgKChu
b2RlID0gTElTVF9GSVJTVCgmdG1wLT50bV9ub2RlcykpICE9IE5VTEwpIHsKCQlpZiAobm9k
ZS0+dG5fdHlwZSA9PSBWRElSKSB7CgkJCXRtcGZzX2RpcmVudF90ICpkZTsKCgkJCS8qIERl
c3Ryb3kgYW55IGRpcmVjdG9yeSBlbnRyaWVzLiAqLwoJCQlkZSA9IFRBSUxRX0ZJUlNUKCZu
b2RlLT50bl9zcGVjLnRuX2Rpci50bl9kaXIpOwoJCQl3aGlsZSAoZGUgIT0gTlVMTCkgewoJ
CQkJdG1wZnNfZGlyZW50X3QgKm5kZTsKCgkJCQluZGUgPSBUQUlMUV9ORVhUKGRlLCB0ZF9l
bnRyaWVzKTsKCQkJCXRtcGZzX2ZyZWVfZGlyZW50KHRtcCwgZGUpOwoJCQkJbm9kZS0+dG5f
c2l6ZSAtPSBzaXplb2YodG1wZnNfZGlyZW50X3QpOwoJCQkJZGUgPSBuZGU7CgkJCX0KCQl9
CgkJLyogUmVtb3ZlcyBpbm9kZSBmcm9tIHRoZSBsaXN0LiAqLwoJCXRtcGZzX2ZyZWVfbm9k
ZSh0bXAsIG5vZGUpOwoJfQoKCS8qIFRocm93IGF3YXkgdGhlIHRtcGZzX21vdW50IHN0cnVj
dHVyZS4gKi8KCXRtcGZzX21udG1lbV9kZXN0cm95KHRtcCk7CgltdXRleF9kZXN0cm95KCZ0
bXAtPnRtX2xvY2spOwoJa21lbV9mcmVlKHRtcCwgc2l6ZW9mKCp0bXApKTsKCW1wLT5tbnRf
ZGF0YSA9IE5VTEw7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKdG1wZnNfcm9vdChzdHJ1
Y3QgbW91bnQgKm1wLCB2bm9kZV90ICoqdnBwKQp7Cgl0bXBmc19ub2RlX3QgKm5vZGUgPSBW
RlNfVE9fVE1QRlMobXApLT50bV9yb290OwoKCW11dGV4X2VudGVyKCZub2RlLT50bl92bG9j
ayk7CglyZXR1cm4gdG1wZnNfdm5vZGVfZ2V0KG1wLCBub2RlLCB2cHApOwp9CgpzdGF0aWMg
aW50CnRtcGZzX3ZnZXQoc3RydWN0IG1vdW50ICptcCwgaW5vX3QgaW5vLCB2bm9kZV90ICoq
dnBwKQp7CgoJcHJpbnRmKCJ0bXBmc192Z2V0IGNhbGxlZDsgbmVlZCBmb3IgaXQgdW5rbm93
biB5ZXRcbiIpOwoJcmV0dXJuIEVPUE5PVFNVUFA7Cn0KCnN0YXRpYyBpbnQKdG1wZnNfZmh0
b3ZwKHN0cnVjdCBtb3VudCAqbXAsIHN0cnVjdCBmaWQgKmZocCwgdm5vZGVfdCAqKnZwcCkK
ewoJdG1wZnNfbW91bnRfdCAqdG1wID0gVkZTX1RPX1RNUEZTKG1wKTsKCXRtcGZzX25vZGVf
dCAqbm9kZTsKCXRtcGZzX2ZpZF90IHRmaDsKCglpZiAoZmhwLT5maWRfbGVuICE9IHNpemVv
Zih0bXBmc19maWRfdCkpIHsKCQlyZXR1cm4gRUlOVkFMOwoJfQoJbWVtY3B5KCZ0ZmgsIGZo
cCwgc2l6ZW9mKHRtcGZzX2ZpZF90KSk7CgoJbXV0ZXhfZW50ZXIoJnRtcC0+dG1fbG9jayk7
CglMSVNUX0ZPUkVBQ0gobm9kZSwgJnRtcC0+dG1fbm9kZXMsIHRuX2VudHJpZXMpIHsKCQlp
ZiAobm9kZS0+dG5faWQgIT0gdGZoLnRmX2lkKSB7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAo
VE1QRlNfTk9ERV9HRU4obm9kZSkgIT0gdGZoLnRmX2dlbikgewoJCQljb250aW51ZTsKCQl9
CgkJbXV0ZXhfZW50ZXIoJm5vZGUtPnRuX3Zsb2NrKTsKCQlicmVhazsKCX0KCW11dGV4X2V4
aXQoJnRtcC0+dG1fbG9jayk7CgoJLyogV2lsbCByZWxlYXNlIHRoZSB0bl92bG9jay4gKi8K
CXJldHVybiBub2RlID8gdG1wZnNfdm5vZGVfZ2V0KG1wLCBub2RlLCB2cHApIDogRVNUQUxF
Owp9CgpzdGF0aWMgaW50CnRtcGZzX3ZwdG9maCh2bm9kZV90ICp2cCwgc3RydWN0IGZpZCAq
ZmhwLCBzaXplX3QgKmZoX3NpemUpCnsKCXRtcGZzX2ZpZF90IHRmaDsKCXRtcGZzX25vZGVf
dCAqbm9kZTsKCglpZiAoKmZoX3NpemUgPCBzaXplb2YodG1wZnNfZmlkX3QpKSB7CgkJKmZo
X3NpemUgPSBzaXplb2YodG1wZnNfZmlkX3QpOwoJCXJldHVybiBFMkJJRzsKCX0KCSpmaF9z
aXplID0gc2l6ZW9mKHRtcGZzX2ZpZF90KTsKCW5vZGUgPSBWUF9UT19UTVBGU19OT0RFKHZw
KTsKCgltZW1zZXQoJnRmaCwgMCwgc2l6ZW9mKHRmaCkpOwoJdGZoLnRmX2xlbiA9IHNpemVv
Zih0bXBmc19maWRfdCk7Cgl0ZmgudGZfZ2VuID0gVE1QRlNfTk9ERV9HRU4obm9kZSk7Cgl0
ZmgudGZfaWQgPSBub2RlLT50bl9pZDsKCW1lbWNweShmaHAsICZ0ZmgsIHNpemVvZih0Zmgp
KTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludAp0bXBmc19zdGF0dmZzKHN0cnVjdCBtb3Vu
dCAqbXAsIHN0cnVjdCBzdGF0dmZzICpzYnApCnsKCXRtcGZzX21vdW50X3QgKnRtcDsKCWZz
ZmlsY250X3QgZnJlZW5vZGVzOwoJc2l6ZV90IGF2YWlsOwoKCXRtcCA9IFZGU19UT19UTVBG
UyhtcCk7CgoJc2JwLT5mX2lvc2l6ZSA9IHNicC0+Zl9mcnNpemUgPSBzYnAtPmZfYnNpemUg
PSBQQUdFX1NJWkU7CgoJbXV0ZXhfZW50ZXIoJnRtcC0+dG1fYWNjX2xvY2spOwoJYXZhaWwg
PSAgdG1wZnNfcGFnZXNfYXZhaWwodG1wKTsKCXNicC0+Zl9ibG9ja3MgPSAodG1wZnNfYnl0
ZXNfbWF4KHRtcCkgPj4gUEFHRV9TSElGVCk7CglzYnAtPmZfYmF2YWlsID0gc2JwLT5mX2Jm
cmVlID0gYXZhaWw7CglzYnAtPmZfYnJlc3ZkID0gMDsKCglmcmVlbm9kZXMgPSBNSU4odG1w
LT50bV9ub2Rlc19tYXggLSB0bXAtPnRtX25vZGVzX2NudCwKCSAgICBhdmFpbCAqIFBBR0Vf
U0laRSAvIHNpemVvZih0bXBmc19ub2RlX3QpKTsKCglzYnAtPmZfZmlsZXMgPSB0bXAtPnRt
X25vZGVzX2NudCArIGZyZWVub2RlczsKCXNicC0+Zl9mYXZhaWwgPSBzYnAtPmZfZmZyZWUg
PSBmcmVlbm9kZXM7CglzYnAtPmZfZnJlc3ZkID0gMDsKCW11dGV4X2V4aXQoJnRtcC0+dG1f
YWNjX2xvY2spOwoKCWNvcHlfc3RhdHZmc19pbmZvKHNicCwgbXApOwoKCXJldHVybiAwOwp9
CgpzdGF0aWMgaW50CnRtcGZzX3N5bmMoc3RydWN0IG1vdW50ICptcCwgaW50IHdhaXRmb3Is
IGthdXRoX2NyZWRfdCB1YykKewoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CnRtcGZzX3Nu
YXBzaG90KHN0cnVjdCBtb3VudCAqbXAsIHZub2RlX3QgKnZwLCBzdHJ1Y3QgdGltZXNwZWMg
KmN0aW1lKQp7CgoJcmV0dXJuIEVPUE5PVFNVUFA7Cn0KCi8qCiAqIHRtcGZzIHZmcyBvcGVy
YXRpb25zLgogKi8KCmV4dGVybiBjb25zdCBzdHJ1Y3Qgdm5vZGVvcHZfZGVzYyB0bXBmc19m
aWZvb3Bfb3B2X2Rlc2M7CmV4dGVybiBjb25zdCBzdHJ1Y3Qgdm5vZGVvcHZfZGVzYyB0bXBm
c19zcGVjb3Bfb3B2X2Rlc2M7CmV4dGVybiBjb25zdCBzdHJ1Y3Qgdm5vZGVvcHZfZGVzYyB0
bXBmc192bm9kZW9wX29wdl9kZXNjOwoKY29uc3Qgc3RydWN0IHZub2Rlb3B2X2Rlc2MgKiBj
b25zdCB0bXBmc192bm9kZW9wdl9kZXNjc1tdID0gewoJJnRtcGZzX2ZpZm9vcF9vcHZfZGVz
YywKCSZ0bXBmc19zcGVjb3Bfb3B2X2Rlc2MsCgkmdG1wZnNfdm5vZGVvcF9vcHZfZGVzYywK
CU5VTEwsCn07CgpzdHJ1Y3QgdmZzb3BzIHRtcGZzX3Zmc29wcyA9IHsKCU1PVU5UX1RNUEZT
LAkJCS8qIHZmc19uYW1lICovCglzaXplb2YgKHN0cnVjdCB0bXBmc19hcmdzKSwKCXRtcGZz
X21vdW50LAkJCS8qIHZmc19tb3VudCAqLwoJdG1wZnNfc3RhcnQsCQkJLyogdmZzX3N0YXJ0
ICovCgl0bXBmc191bm1vdW50LAkJCS8qIHZmc191bm1vdW50ICovCgl0bXBmc19yb290LAkJ
CS8qIHZmc19yb290ICovCgkodm9pZCAqKWVvcG5vdHN1cHAsCQkvKiB2ZnNfcXVvdGFjdGwg
Ki8KCXRtcGZzX3N0YXR2ZnMsCQkJLyogdmZzX3N0YXR2ZnMgKi8KCXRtcGZzX3N5bmMsCQkJ
LyogdmZzX3N5bmMgKi8KCXRtcGZzX3ZnZXQsCQkJLyogdmZzX3ZnZXQgKi8KCXRtcGZzX2Zo
dG92cCwJCQkvKiB2ZnNfZmh0b3ZwICovCgl0bXBmc192cHRvZmgsCQkJLyogdmZzX3ZwdG9m
aCAqLwoJdG1wZnNfaW5pdCwJCQkvKiB2ZnNfaW5pdCAqLwoJTlVMTCwJCQkJLyogdmZzX3Jl
aW5pdCAqLwoJdG1wZnNfZG9uZSwJCQkvKiB2ZnNfZG9uZSAqLwoJTlVMTCwJCQkJLyogdmZz
X21vdW50cm9vdCAqLwoJdG1wZnNfc25hcHNob3QsCQkJLyogdmZzX3NuYXBzaG90ICovCgl2
ZnNfc3RkZXh0YXR0cmN0bCwJCS8qIHZmc19leHRhdHRyY3RsICovCgkodm9pZCAqKWVvcG5v
dHN1cHAsCQkvKiB2ZnNfc3VzcGVuZGN0bCAqLwoJZ2VuZnNfcmVuYW1lbG9ja19lbnRlciwK
CWdlbmZzX3JlbmFtZWxvY2tfZXhpdCwKCSh2b2lkICopZW9wbm90c3VwcCwKCXRtcGZzX3Zu
b2Rlb3B2X2Rlc2NzLAoJMCwJCQkJLyogdmZzX3JlZmNvdW50ICovCgl7IE5VTEwsIE5VTEwg
fSwKfTsKCnN0YXRpYyBpbnQKdG1wZnNfbW9kY21kKG1vZGNtZF90IGNtZCwgdm9pZCAqYXJn
KQp7CgoJc3dpdGNoIChjbWQpIHsKCWNhc2UgTU9EVUxFX0NNRF9JTklUOgoJCXJldHVybiB2
ZnNfYXR0YWNoKCZ0bXBmc192ZnNvcHMpOwoJY2FzZSBNT0RVTEVfQ01EX0ZJTkk6CgkJcmV0
dXJuIHZmc19kZXRhY2goJnRtcGZzX3Zmc29wcyk7CglkZWZhdWx0OgoJCXJldHVybiBFTk9U
VFk7Cgl9Cn0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAB0bXBmcy1wYXRjaC9zcmMvc3lzL2ZzL3RtcGZzL2dlbmZzX3JlbmFt
ZS5jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAMDEwMDQ0NAAwMDAwMDAwADAwMDAwMDAAMDAwMDAxMDU0NjcAMTIwMjYzNDYxMTUA
MDAyMDEwMgAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AHVzdGFyICAAcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8qCSROZXRCU0Q6IGdl
bmZzX3JlbmFtZS5jLHYgMS4xIDIwMTIvMDUvMDggMjM6NTM6MjYgcmlhc3RyYWRoIEV4cCAk
CSovCgovKi0KICogQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBOZXRCU0QgRm91bmRhdGlvbiwg
SW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBUaGlzIGNvZGUgaXMgZGVyaXZl
ZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIFRoZSBOZXRCU0QgRm91bmRhdGlvbgog
KiBieSBUYXlsb3IgUiBDYW1wYmVsbC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwogKiBhcmUgbWV0OgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoK
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTkVUQlNEIEZPVU5EQVRJT04s
IElOQy4gQU5EIENPTlRSSUJVVE9SUwogKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKICogVE8s
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIFRIRSBGT1VOREFUSU9OIE9SIENPTlRSSUJVVE9SUwogKiBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCiAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwogKiBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTgogKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQogKiBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRQogKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICovCgovKgogKiBHZW5lcmlj
IHJlbmFtZSBhYnN0cmFjdGlvbi4KICoKICogUmVuYW1lIGlzIHVuYmVsaWV2YWJseSBoYWly
eS4gIFRyeSB0byB1c2UgdGhpcyBpZiB5b3UgY2FuIC0tCiAqIG90aGVyd2lzZSB5b3UgYXJl
IHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gZ2V0IGl0IHdyb25nLgogKi8KCiNpbmNsdWRl
IDxzeXMvY2RlZnMuaD4KX19LRVJORUxfUkNTSUQoMCwgIiROZXRCU0Q6IGdlbmZzX3JlbmFt
ZS5jLHYgMS4xIDIwMTIvMDUvMDggMjM6NTM6MjYgcmlhc3RyYWRoIEV4cCAkIik7CgojaW5j
bHVkZSA8c3lzL3BhcmFtLmg+CiNpbmNsdWRlIDxzeXMva2F1dGguaD4KI2luY2x1ZGUgPHN5
cy9tb3VudC5oPgojaW5jbHVkZSA8c3lzL25hbWVpLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5o
PgojaW5jbHVkZSA8c3lzL3Zub2RlLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KCiNpZiAw
CiNpbmNsdWRlIDxtaXNjZnMvZ2VuZnMvZ2VuZnMuaD4KI2Vsc2UgLy8gaW5jbHVkZWQgZnJv
bSBnZW5mcy5oCgovLyBmcm9tIHN5cy9rZXJuL2thcm5fYXV0aC5jIC4uLgoKLy8gc29tZSBk
dW1teSBkZWZpbml0aW9ucyAuLi4KI2RlZmluZSBLQVVUSF9WTk9ERV9ERUxFVEUgMAojZGVm
aW5lIEtBVVRIX1ZOT0RFX1JFTkFNRSAwCgpzdGF0aWMgaW50CmdlbmZzX2Nhbl9zdGlja3ko
a2F1dGhfY3JlZF90IGNyZWQsIHVpZF90IGRpcl91aWQsIHVpZF90IGZpbGVfdWlkKQp7CiAg
aWYgKGthdXRoX2NyZWRfZ2V0ZXVpZChjcmVkKSAhPSBkaXJfdWlkICYmCiAgICAgIGthdXRo
X2NyZWRfZ2V0ZXVpZChjcmVkKSAhPSBmaWxlX3VpZCkKICAgIHJldHVybiBFUEVSTTsKCiAg
cmV0dXJuIDA7Cn0KCmludCBrYXV0aF9hdXRob3JpemVfdm5vZGUoa2F1dGhfY3JlZF90LCBr
YXV0aF9hY3Rpb25fdCwgc3RydWN0IHZub2RlKiwgc3RydWN0IHZub2RlKiwgaW50KTsKCmlu
dAprYXV0aF9hdXRob3JpemVfdm5vZGUoa2F1dGhfY3JlZF90IGNyZWQsIGthdXRoX2FjdGlv
bl90IGFjdGlvbiwKICAgIHN0cnVjdCB2bm9kZSAqdnAsIHN0cnVjdCB2bm9kZSAqZHZwLCBp
bnQgZnNfZGVjaXNpb24pCnsKI2lmIDAgLy8gbm90IGluIDUuMSAuLi4uCglpbnQgZXJyb3I7
CgoJZXJyb3IgPSBrYXV0aF9hdXRob3JpemVfYWN0aW9uX2ludGVybmFsKGthdXRoX2J1aWx0
aW5fc2NvcGVfdm5vZGUsIGNyZWQsCgkgICAgYWN0aW9uLCB2cCwgZHZwLCBOVUxMLCBOVUxM
KTsKCglpZiAoZXJyb3IgPT0gS0FVVEhfUkVTVUxUX0RFTlkpCgkJcmV0dXJuIChFQUNDRVMp
OwoKCWlmIChlcnJvciA9PSBLQVVUSF9SRVNVTFRfQUxMT1cpCgkJcmV0dXJuICgwKTsKCgkv
KgoJICogSWYgdGhlIGZpbGUtc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgZGVjaXNpb24tYmVm
b3JlLWFjdGlvbiwgd2UgY2FuCgkgKiBvbmx5IHNob3J0LWNpcmN1aXQgdGhlIG9wZXJhdGlv
biAoZGVueSkuIElmIHdlJ3JlIGhlcmUsIGl0IG1lYW5zIG5vCgkgKiBsaXN0ZW5lciBkZW5p
ZWQgaXQsIHNvIG91ciBvbmx5IGFsdGVybmF0aXZlIGlzIHRvIHN1cHBvc2VkbHktYWxsb3cK
CSAqIGl0IGFuZCBsZXQgdGhlIGZpbGUtc3lzdGVtIGhhdmUgdGhlIGxhc3Qgd29yZC4KCSAq
LwoJaWYgKGZzX2RlY2lzaW9uID09IEtBVVRIX1ZOT0RFX1JFTU9URUZTKQoJCXJldHVybiAo
MCk7CiNlbHNlCglpZiAoa2F1dGhfYXV0aG9yaXplX2dlbmVyaWMoY3JlZCwgS0FVVEhfR0VO
RVJJQ19JU1NVU0VSLCBOVUxMKSAhPSAwICYmCgkgICAgZ2VuZnNfY2FuX3N0aWNreShjcmVk
LCBWUF9UT19UTVBGU19OT0RFKGR2cCktPnRuX3VpZCwgVlBfVE9fVE1QRlNfTk9ERSh2cCkt
PnRuX3VpZCkgIT0gMCkKCSAgcmV0dXJuIEVQRVJNOwojZW5kaWYKCglyZXR1cm4gKGZzX2Rl
Y2lzaW9uKTsKfQoKCnN0cnVjdCBnZW5mc19yZW5hbWVfb3BzOwoKCmludAlnZW5mc19pbnNh
bmVfcmVuYW1lKHZvaWQgKiwKCSAgICBpbnQgKCopKHN0cnVjdCB2bm9kZSAqLCBzdHJ1Y3Qg
Y29tcG9uZW50bmFtZSAqLAoJCXN0cnVjdCB2bm9kZSAqLCBzdHJ1Y3QgY29tcG9uZW50bmFt
ZSAqLAoJCWthdXRoX2NyZWRfdCwgYm9vbCkpOwppbnQJZ2VuZnNfc2FuZV9yZW5hbWUoY29u
c3Qgc3RydWN0IGdlbmZzX3JlbmFtZV9vcHMgKiwKCSAgICBzdHJ1Y3Qgdm5vZGUgKiwgc3Ry
dWN0IGNvbXBvbmVudG5hbWUgKiwgdm9pZCAqLAoJICAgIHN0cnVjdCB2bm9kZSAqLCBzdHJ1
Y3QgY29tcG9uZW50bmFtZSAqLCB2b2lkICosCgkgICAga2F1dGhfY3JlZF90LCBib29sKTsK
CnZvaWQJZ2VuZnNfcmVuYW1lX2tub3RlKHN0cnVjdCB2bm9kZSAqLCBzdHJ1Y3Qgdm5vZGUg
Kiwgc3RydWN0IHZub2RlICosCgkgICAgc3RydWN0IHZub2RlICosIGJvb2wpOwp2b2lkCWdl
bmZzX3JlbmFtZV9jYWNoZV9wdXJnZShzdHJ1Y3Qgdm5vZGUgKiwgc3RydWN0IHZub2RlICos
IHN0cnVjdCB2bm9kZSAqLAoJICAgIHN0cnVjdCB2bm9kZSAqKTsKCmludAlnZW5mc191ZnNs
aWtlX3JlbmFtZV9jaGVja19wb3NzaWJsZSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25n
LAoJICAgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGJvb2wsCgkgICAgdW5zaWdu
ZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CmludAlnZW5mc191ZnNsaWtlX3JlbmFtZV9jaGVj
a19wZXJtaXR0ZWQoa2F1dGhfY3JlZF90LAoJICAgIHN0cnVjdCB2bm9kZSAqLCBtb2RlX3Qs
IHVpZF90LAoJICAgIHN0cnVjdCB2bm9kZSAqLCB1aWRfdCwKCSAgICBzdHJ1Y3Qgdm5vZGUg
KiwgbW9kZV90LCB1aWRfdCwKCSAgICBzdHJ1Y3Qgdm5vZGUgKiwgdWlkX3QpOwppbnQJZ2Vu
ZnNfdWZzbGlrZV9yZW1vdmVfY2hlY2tfcG9zc2libGUodW5zaWduZWQgbG9uZywgdW5zaWdu
ZWQgbG9uZywKCSAgICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKaW50CWdlbmZz
X3Vmc2xpa2VfcmVtb3ZlX2NoZWNrX3Blcm1pdHRlZChrYXV0aF9jcmVkX3QsCgkgICAgc3Ry
dWN0IHZub2RlICosIG1vZGVfdCwgdWlkX3QsCgkgICAgc3RydWN0IHZub2RlICosIHVpZF90
KTsKCnN0cnVjdCBnZW5mc19yZW5hbWVfb3BzIHsKCWJvb2wgKCpncm9fZGlyZWN0b3J5X2Vt
cHR5X3ApKHN0cnVjdCBtb3VudCAqbXAsIGthdXRoX2NyZWRfdCBjcmVkLAoJICAgIHN0cnVj
dCB2bm9kZSAqdnAsIHN0cnVjdCB2bm9kZSAqZHZwKTsKCWludCAoKmdyb19yZW5hbWVfY2hl
Y2tfcG9zc2libGUpKHN0cnVjdCBtb3VudCAqbXAsCgkgICAgc3RydWN0IHZub2RlICpmZHZw
LCBzdHJ1Y3Qgdm5vZGUgKmZ2cCwKCSAgICBzdHJ1Y3Qgdm5vZGUgKnRkdnAsIHN0cnVjdCB2
bm9kZSAqdHZwKTsKCWludCAoKmdyb19yZW5hbWVfY2hlY2tfcGVybWl0dGVkKShzdHJ1Y3Qg
bW91bnQgKm1wLCBrYXV0aF9jcmVkX3QgY3JlZCwKCSAgICBzdHJ1Y3Qgdm5vZGUgKmZkdnAs
IHN0cnVjdCB2bm9kZSAqZnZwLAoJICAgIHN0cnVjdCB2bm9kZSAqdGR2cCwgc3RydWN0IHZu
b2RlICp0dnApOwoJaW50ICgqZ3JvX3JlbW92ZV9jaGVja19wb3NzaWJsZSkoc3RydWN0IG1v
dW50ICptcCwKCSAgICBzdHJ1Y3Qgdm5vZGUgKmR2cCwgc3RydWN0IHZub2RlICp2cCk7Cglp
bnQgKCpncm9fcmVtb3ZlX2NoZWNrX3Blcm1pdHRlZCkoc3RydWN0IG1vdW50ICptcCwga2F1
dGhfY3JlZF90IGNyZWQsCgkgICAgc3RydWN0IHZub2RlICpkdnAsIHN0cnVjdCB2bm9kZSAq
dnApOwoJaW50ICgqZ3JvX3JlbmFtZSkoc3RydWN0IG1vdW50ICptcCwga2F1dGhfY3JlZF90
IGNyZWQsCgkgICAgc3RydWN0IHZub2RlICpmZHZwLCBzdHJ1Y3QgY29tcG9uZW50bmFtZSAq
ZmNucCwKCSAgICB2b2lkICpmZGUsIHN0cnVjdCB2bm9kZSAqZnZwLAoJICAgIHN0cnVjdCB2
bm9kZSAqdGR2cCwgc3RydWN0IGNvbXBvbmVudG5hbWUgKnRjbnAsCgkgICAgdm9pZCAqdGRl
LCBzdHJ1Y3Qgdm5vZGUgKnR2cCk7CglpbnQgKCpncm9fcmVtb3ZlKShzdHJ1Y3QgbW91bnQg
Km1wLCBrYXV0aF9jcmVkX3QgY3JlZCwKCSAgICBzdHJ1Y3Qgdm5vZGUgKmR2cCwgc3RydWN0
IGNvbXBvbmVudG5hbWUgKmNucCwgdm9pZCAqZGUsCgkgICAgc3RydWN0IHZub2RlICp2cCk7
CglpbnQgKCpncm9fbG9va3VwKShzdHJ1Y3QgbW91bnQgKm1wLCBzdHJ1Y3Qgdm5vZGUgKmR2
cCwKCSAgICBzdHJ1Y3QgY29tcG9uZW50bmFtZSAqY25wLCB2b2lkICpmZGVfcmV0LCBzdHJ1
Y3Qgdm5vZGUgKip2cF9yZXQpOwoJaW50ICgqZ3JvX2dlbmVhbG9neSkoc3RydWN0IG1vdW50
ICptcCwga2F1dGhfY3JlZF90IGNyZWQsCgkgICAgc3RydWN0IHZub2RlICpmZHZwLCBzdHJ1
Y3Qgdm5vZGUgKnRkdnAsCgkgICAgc3RydWN0IHZub2RlICoqaW50ZXJtZWRpYXRlX25vZGVf
cmV0KTsKCWludCAoKmdyb19sb2NrX2RpcmVjdG9yeSkoc3RydWN0IG1vdW50ICptcCwgc3Ry
dWN0IHZub2RlICp2cCk7Cn07CgojZW5kaWYKCi8qCiAqIFNhbXBsZSBjb3B5cGFzdGEgZm9y
IGltcGxlbWVudGluZyBWT1BfUkVOQU1FIHZpYSBnZW5mc19yZW5hbWUuCiAqIERvbid0IGNo
YW5nZSB0aGlzIHRlbXBsYXRlIHdpdGhvdXQgY2FyZWZ1bGx5IGNvbnNpZGVyaW5nIHdoZXRo
ZXIKICogZXZlcnkgb3RoZXIgZmlsZSBzeXN0ZW0gdGhhdCBhbHJlYWR5IHVzZXMgaXQgbmVl
ZHMgdG8gY2hhbmdlIHRvby4KICogVGhhdCB3YXksIG9uY2Ugd2UgaGF2ZSBjaGFuZ2VkIGFs
bCB0aGUgZmlsZSBzeXN0ZW1zIHRvIHVzZSBpdCwgd2UKICogY2FuIGVhc2lseSByZXBsYWNl
IG11bWJsZWZzX3JlbmFtZSBieSBtdW1ibGVmc19zYW5lX3JlbmFtZSBhbmQKICogZWxpbWlu
YXRlIHRoZSBpbnNhbmUgQVBJIGFsdG9nZXRoZXIuCiAqLwoKLyogYmVnaW4gc2FtcGxlIGNv
cHlwYXN0YSAqLwojaWYgMAoKc3RhdGljIGNvbnN0IHN0cnVjdCBnZW5mc19yZW5hbWVfb3Bz
IG11bWJsZWZzX2dlbmZzX3JlbmFtZV9vcHM7CgovKgogKiBtdW1ibGVmc19zYW5lX3JlbmFt
ZTogVGhlIGhhaXJpZXN0IHZvcCwgd2l0aCB0aGUgc2FuZXIgQVBJLgogKgogKiBBcmd1bWVu
dHM6CiAqCiAqIC4gZmR2cCAoZnJvbSBkaXJlY3Rvcnkgdm5vZGUpLAogKiAuIGZjbnAgKGZy
b20gY29tcG9uZW50IG5hbWUpLAogKiAuIHRkdnAgKHRvIGRpcmVjdG9yeSB2bm9kZSksCiAq
IC4gdGNucCAodG8gY29tcG9uZW50IG5hbWUpLAogKiAuIGNyZWQgKGNyZWRlbnRpYWxzIHN0
cnVjdHVyZSksIGFuZAogKiAuIHBvc2l4bHlfY29ycmVjdCAoZmxhZyBmb3IgYmVoYXZpb3Vy
IGlmIHRhcmdldCAmIHNvdXJjZSBsaW5rIHNhbWUgZmlsZSkuCiAqCiAqIGZkdnAgYW5kIHRk
dnAgbWF5IGJlIHRoZSBzYW1lLCBhbmQgbXVzdCBiZSByZWZlcmVuY2VkIGFuZCB1bmxvY2tl
ZC4KICovCnN0YXRpYyBpbnQKbXVtYmxlZnNfc2FuZV9yZW5hbWUoCiAgICBzdHJ1Y3Qgdm5v
ZGUgKmZkdnAsIHN0cnVjdCBjb21wb25lbnRuYW1lICpmY25wLAogICAgc3RydWN0IHZub2Rl
ICp0ZHZwLCBzdHJ1Y3QgY29tcG9uZW50bmFtZSAqdGNucCwKICAgIGthdXRoX2NyZWRfdCBj
cmVkLCBib29sIHBvc2l4bHlfY29ycmVjdCkKewoJc3RydWN0IG11bWJsZWZzX2xvb2t1cF9y
ZXN1bHRzIGZ1bHIsIHR1bHI7CgoJcmV0dXJuIGdlbmZzX3NhbmVfcmVuYW1lKCZtdW1ibGVm
c19nZW5mc19yZW5hbWVfb3BzLAoJICAgIGZkdnAsIGZjbnAsICZmdWxyLCB0ZHZwLCB0Y25w
LCAmdHVsciwKCSAgICBjcmVkLCBwb3NpeGx5X2NvcnJlY3QpOwp9CgovKgogKiBtdW1ibGVm
c19yZW5hbWU6IFRoZSBoYWlyaWVzdCB2b3AsIHdpdGggdGhlIGluc2FuZXN0IEFQSS4gIERl
ZmVyIHRvCiAqIGdlbmZzX2luc2FuZV9yZW5hbWUgaW1tZWRpYXRlbHkuCiAqLwppbnQKbXVt
YmxlZnNfcmVuYW1lKHZvaWQgKnYpCnsKCglyZXR1cm4gZ2VuZnNfaW5zYW5lX3JlbmFtZSh2
LCAmbXVtYmxlZnNfc2FuZV9yZW5hbWUpOwp9CgojZW5kaWYKLyogZW5kIHNhbXBsZSBjb3B5
cGFzdGEgKi8KCi8qCiAqIEZvcndhcmQgZGVjbGFyYXRpb25zCiAqLwoKc3RhdGljIGludCBn
ZW5mc19yZW5hbWVfZW50ZXIoY29uc3Qgc3RydWN0IGdlbmZzX3JlbmFtZV9vcHMgKiwgc3Ry
dWN0IG1vdW50ICosCiAgICBrYXV0aF9jcmVkX3QsCiAgICBzdHJ1Y3Qgdm5vZGUgKiwgc3Ry
dWN0IGNvbXBvbmVudG5hbWUgKiwgdm9pZCAqLCBzdHJ1Y3Qgdm5vZGUgKiosCiAgICBzdHJ1
Y3Qgdm5vZGUgKiwgc3RydWN0IGNvbXBvbmVudG5hbWUgKiwgdm9pZCAqLCBzdHJ1Y3Qgdm5v
ZGUgKiopOwpzdGF0aWMgaW50IGdlbmZzX3JlbmFtZV9lbnRlcl9jb21tb24oY29uc3Qgc3Ry
dWN0IGdlbmZzX3JlbmFtZV9vcHMgKiwKICAgIHN0cnVjdCBtb3VudCAqLCBrYXV0aF9jcmVk
X3QsIHN0cnVjdCB2bm9kZSAqLAogICAgc3RydWN0IGNvbXBvbmVudG5hbWUgKiwgdm9pZCAq
LCBzdHJ1Y3Qgdm5vZGUgKiosCiAgICBzdHJ1Y3QgY29tcG9uZW50bmFtZSAqLCB2b2lkICos
IHN0cnVjdCB2bm9kZSAqKik7CnN0YXRpYyBpbnQgZ2VuZnNfcmVuYW1lX2VudGVyX3NlcGFy
YXRlKGNvbnN0IHN0cnVjdCBnZW5mc19yZW5hbWVfb3BzICosCiAgICBzdHJ1Y3QgbW91bnQg
Kiwga2F1dGhfY3JlZF90LAogICAgc3RydWN0IHZub2RlICosIHN0cnVjdCBjb21wb25lbnRu
YW1lICosIHZvaWQgKiwgc3RydWN0IHZub2RlICoqLAogICAgc3RydWN0IHZub2RlICosIHN0
cnVjdCBjb21wb25lbnRuYW1lICosIHZvaWQgKiwgc3RydWN0IHZub2RlICoqKTsKc3RhdGlj
IGludCBnZW5mc19yZW5hbWVfbG9jayhjb25zdCBzdHJ1Y3QgZ2VuZnNfcmVuYW1lX29wcyAq
LCBzdHJ1Y3QgbW91bnQgKiwKICAgIGthdXRoX2NyZWRfdCwgaW50LCBpbnQsIGludCwKICAg
IHN0cnVjdCB2bm9kZSAqLCBzdHJ1Y3QgY29tcG9uZW50bmFtZSAqLCBib29sLCB2b2lkICos
IHN0cnVjdCB2bm9kZSAqKiwKICAgIHN0cnVjdCB2bm9kZSAqLCBzdHJ1Y3QgY29tcG9uZW50
bmFtZSAqLCBib29sLCB2b2lkICosIHN0cnVjdCB2bm9kZSAqKik7CnN0YXRpYyB2b2lkIGdl
bmZzX3JlbmFtZV9leGl0KGNvbnN0IHN0cnVjdCBnZW5mc19yZW5hbWVfb3BzICosIHN0cnVj
dCBtb3VudCAqLAogICAgc3RydWN0IHZub2RlICosIHN0cnVjdCB2bm9kZSAqLAogICAgc3Ry
dWN0IHZub2RlICosIHN0cnVjdCB2bm9kZSAqKTsKc3RhdGljIGludCBnZW5mc19yZW5hbWVf
cmVtb3ZlKGNvbnN0IHN0cnVjdCBnZW5mc19yZW5hbWVfb3BzICosIHN0cnVjdCBtb3VudCAq
LAogICAga2F1dGhfY3JlZF90LAogICAgc3RydWN0IHZub2RlICosIHN0cnVjdCBjb21wb25l
bnRuYW1lICosIHZvaWQgKiwgc3RydWN0IHZub2RlICopOwoKLyoKICogZ2VuZnNfaW5zYW5l
X3JlbmFtZTogR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW5zYW5lIEFQSSBmb3IK
ICogdGhlIHJlbmFtZSB2b3AuCiAqCiAqIEFyZ3VtZW50czoKICoKICogLiBmZHZwIChmcm9t
IGRpcmVjdG9yeSB2bm9kZSksCiAqIC4gZnZwIChmcm9tIHZub2RlKSwKICogLiBmY25wIChm
cm9tIGNvbXBvbmVudCBuYW1lKSwKICogLiB0ZHZwICh0byBkaXJlY3Rvcnkgdm5vZGUpLAog
KiAuIHR2cCAodG8gdm5vZGUsIG9yIE5VTEwpLCBhbmQKICogLiB0Y25wICh0byBjb21wb25l
bnQgbmFtZSkuCiAqCiAqIEFueSBwYWlyIG9mIHZub2RlIHBhcmFtZXRlcnMgbWF5IGhhdmUg
dGhlIHNhbWUgdm5vZGUuCiAqCiAqIE9uIGVudHJ5LAogKgogKiAuIGZkdnAsIGZ2cCwgdGR2
cCwgYW5kIHR2cCBhcmUgcmVmZXJlbmNlZCwKICogLiBmZHZwIGFuZCBmdnAgYXJlIHVubG9j
a2VkLCBhbmQKICogLiB0ZHZwIGFuZCB0dnAgKGlmIG5vbm51bGwpIGFyZSBsb2NrZWQuCiAq
CiAqIE9uIGV4aXQsCiAqCiAqIC4gZmR2cCwgZnZwLCB0ZHZwLCBhbmQgdHZwIChpZiBub25u
dWxsKSBhcmUgdW5yZWZlcmVuY2VkLCBhbmQKICogLiB0ZHZwIGFuZCB0dnAgKGlmIG5vbm51
bGwpIGFyZSB1bmxvY2tlZC4KICovCmludApnZW5mc19pbnNhbmVfcmVuYW1lKHZvaWQgKnYs
CiAgICBpbnQgKCpzYW5lX3JlbmFtZSkoc3RydWN0IHZub2RlICpmZHZwLCBzdHJ1Y3QgY29t
cG9uZW50bmFtZSAqZmNucCwKCXN0cnVjdCB2bm9kZSAqdGR2cCwgc3RydWN0IGNvbXBvbmVu
dG5hbWUgKnRjbnAsCglrYXV0aF9jcmVkX3QgY3JlZCwgYm9vbCBwb3NpeGx5X2NvcnJlY3Qp
KQp7CglzdHJ1Y3Qgdm9wX3JlbmFtZV9hcmdzCS8qIHsKCQlzdHJ1Y3Qgdm5vZGUgKmFfZmR2
cDsKCQlzdHJ1Y3Qgdm5vZGUgKmFfZnZwOwoJCXN0cnVjdCBjb21wb25lbnRuYW1lICphX2Zj
bnA7CgkJc3RydWN0IHZub2RlICphX3RkdnA7CgkJc3RydWN0IHZub2RlICphX3R2cDsKCQlz
dHJ1Y3QgY29tcG9uZW50bmFtZSAqYV90Y25wOwoJfSAqLyAqYXAgPSB2OwoJc3RydWN0IHZu
b2RlICpmZHZwID0gYXAtPmFfZmR2cDsKCXN0cnVjdCB2bm9kZSAqZnZwID0gYXAtPmFfZnZw
OwoJc3RydWN0IGNvbXBvbmVudG5hbWUgKmZjbnAgPSBhcC0+YV9mY25wOwoJc3RydWN0IHZu
b2RlICp0ZHZwID0gYXAtPmFfdGR2cDsKCXN0cnVjdCB2bm9kZSAqdHZwID0gYXAtPmFfdHZw
OwoJc3RydWN0IGNvbXBvbmVudG5hbWUgKnRjbnAgPSBhcC0+YV90Y25wOwoJa2F1dGhfY3Jl
ZF90IGNyZWQ7CglpbnQgZXJyb3I7CgoJS0FTU0VSVChmZHZwICE9IE5VTEwpOwoJS0FTU0VS
VChmdnAgIT0gTlVMTCk7CglLQVNTRVJUKGZjbnAgIT0gTlVMTCk7CglLQVNTRVJUKGZjbnAt
PmNuX25hbWVwdHIgIT0gTlVMTCk7CglLQVNTRVJUKHRkdnAgIT0gTlVMTCk7CglLQVNTRVJU
KHRjbnAgIT0gTlVMTCk7CglLQVNTRVJUKGZjbnAtPmNuX25hbWVwdHIgIT0gTlVMTCk7Cgkv
KiBLQVNTRVJUKFZPUF9JU0xPQ0tFRChmZHZwKSAhPSBMS19FWENMVVNJVkUpOyAqLwoJLyog
S0FTU0VSVChWT1BfSVNMT0NLRUQoZnZwKSAhPSBMS19FWENMVVNJVkUpOyAqLwoJS0FTU0VS
VChWT1BfSVNMT0NLRUQodGR2cCkgPT0gTEtfRVhDTFVTSVZFKTsKCUtBU1NFUlQoKHR2cCA9
PSBOVUxMKSB8fCAoVk9QX0lTTE9DS0VEKHR2cCkgPT0gTEtfRVhDTFVTSVZFKSk7CglLQVNT
RVJUKGZkdnAtPnZfdHlwZSA9PSBWRElSKTsKCUtBU1NFUlQodGR2cC0+dl90eXBlID09IFZE
SVIpOwoKCWNyZWQgPSBmY25wLT5jbl9jcmVkOwoKCS8qCgkgKiBYWFggV2FudCBhIGJldHRl
ciBlcXVhbGl0eSB0ZXN0LiAgYHRjbnAtPmNuX2NyZWQgPT0gY3JlZCcKCSAqIGhvc2VzIHAy
ayBiZWNhdXNlIHB1ZmZzIHRyYW5zbWl0cyB0aGUgY3JlZHMgc2VwYXJhdGVseSBhbmQKCSAq
IGFsbG9jYXRlcyBkaXN0aW5jdCBidXQgZXF1aXZhbGVudCBzdHJ1Y3R1cmVzIGZvciB0aGVt
LgoJICovCglLQVNTRVJUKGthdXRoX2NyZWRfdWlkbWF0Y2goY3JlZCwgdGNucC0+Y25fY3Jl
ZCkpOwoKCS8qCgkgKiBTYW5pdGl6ZSBvdXIgd29ybGQgZnJvbSB0aGUgVkZTIGluc2FuaXR5
LiAgVW5sb2NrIHRoZSB0YXJnZXQKCSAqIGRpcmVjdG9yeSBhbmQgbm9kZSwgd2hpY2ggYXJl
IGxvY2tlZC4gIFJlbGVhc2UgdGhlIGNoaWxkcmVuLAoJICogd2hpY2ggYXJlIHJlZmVyZW5j
ZWQsIHNpbmNlIHdlJ2xsIGJlIGxvb2tpbmcgdGhlbSB1cCBhZ2FpbgoJICogbGF0ZXIuCgkg
Ki8KCglWT1BfVU5MT0NLKHRkdnAsIDApOwoJaWYgKCh0dnAgIT0gTlVMTCkgJiYgKHR2cCAh
PSB0ZHZwKSkKCQlWT1BfVU5MT0NLKHR2cCwgMCk7CgoJdnJlbGUoZnZwKTsKCWlmICh0dnAg
IT0gTlVMTCkKCQl2cmVsZSh0dnApOwoKCWVycm9yID0gKCpzYW5lX3JlbmFtZSkoZmR2cCwg
ZmNucCwgdGR2cCwgdGNucCwgY3JlZCwgZmFsc2UpOwoKCS8qCgkgKiBBbGwgZG9uZSwgd2hl
dGhlciB3aXRoIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4gIFJlbGVhc2UgdGhlCgkgKiBkaXJlY3Rv
cnkgbm9kZXMgbm93LCBhcyB0aGUgY2FsbGVyIGV4cGVjdHMgZnJvbSB0aGUgVkZTCgkgKiBw
cm90b2NvbC4KCSAqLwoJdnJlbGUoZmR2cCk7Cgl2cmVsZSh0ZHZwKTsKCglyZXR1cm4gZXJy
b3I7Cn0KCi8qCiAqIGdlbmZzX3NhbmVfcmVuYW1lOiBHZW5lcmljIGltcGxlbWVudGF0aW9u
IG9mIHRoZSBzYW5lciBBUEkgZm9yIHRoZQogKiByZW5hbWUgdm9wLiAgSGFuZGxlcyBhbmNl
c3RyeSBjaGVja3MsIGxvY2tpbmcsIGFuZCBwZXJtaXNzaW9ucwogKiBjaGVja3MuICBDYWxs
ZXIgaXMgcmVzcG9uc2libGUgZm9yIGltcGxlbWVudGluZyB0aGUgZ2VuZnMgcmVuYW1lCiAq
IG9wZXJhdGlvbnMuCiAqCiAqIGZkdnAgYW5kIHRkdnAgbXVzdCBiZSByZWZlcmVuY2VkIGFu
ZCB1bmxvY2tlZC4KICovCmludApnZW5mc19zYW5lX3JlbmFtZShjb25zdCBzdHJ1Y3QgZ2Vu
ZnNfcmVuYW1lX29wcyAqb3BzLAogICAgc3RydWN0IHZub2RlICpmZHZwLCBzdHJ1Y3QgY29t
cG9uZW50bmFtZSAqZmNucCwgdm9pZCAqZmRlLAogICAgc3RydWN0IHZub2RlICp0ZHZwLCBz
dHJ1Y3QgY29tcG9uZW50bmFtZSAqdGNucCwgdm9pZCAqdGRlLAogICAga2F1dGhfY3JlZF90
IGNyZWQsIGJvb2wgcG9zaXhseV9jb3JyZWN0KQp7CglzdHJ1Y3QgbW91bnQgKm1wOwoJc3Ry
dWN0IHZub2RlICpmdnAgPSBOVUxMLCAqdHZwID0gTlVMTDsKCWludCBlcnJvcjsKCglLQVNT
RVJUKG9wcyAhPSBOVUxMKTsKCUtBU1NFUlQoZmR2cCAhPSBOVUxMKTsKCUtBU1NFUlQoZmNu
cCAhPSBOVUxMKTsKCUtBU1NFUlQodGR2cCAhPSBOVUxMKTsKCUtBU1NFUlQodGNucCAhPSBO
VUxMKTsKCS8qIEtBU1NFUlQoVk9QX0lTTE9DS0VEKGZkdnApICE9IExLX0VYQ0xVU0lWRSk7
ICovCgkvKiBLQVNTRVJUKFZPUF9JU0xPQ0tFRCh0ZHZwKSAhPSBMS19FWENMVVNJVkUpOyAq
LwoJS0FTU0VSVChmZHZwLT52X3R5cGUgPT0gVkRJUik7CglLQVNTRVJUKHRkdnAtPnZfdHlw
ZSA9PSBWRElSKTsKI2lmIDAgLy8gbm90IGluIDUuMSAuLgogICAgICAgIEtBU1NFUlQoZmR2
cC0+dl9tb3VudCA9PSB0ZHZwLT52X21vdW50KTsKI2Vsc2UKCWlmIChmZHZwLT52X21vdW50
ICE9IHRkdnAtPnZfbW91bnQpIHJldHVybiBFWERFVjsKI2VuZGlmCglLQVNTRVJUKGZjbnAg
IT0gdGNucCk7CglLQVNTRVJUKGZjbnAtPmNuX25hbWVpb3AgPT0gREVMRVRFKTsKCUtBU1NF
UlQodGNucC0+Y25fbmFtZWlvcCA9PSBSRU5BTUUpOwoKICAgICAgICAvKiBYWFggV2FudCBh
IGJldHRlciBlcXVhbGl0eSB0ZXN0LiAgKi8KCUtBU1NFUlQoa2F1dGhfY3JlZF91aWRtYXRj
aChjcmVkLCBmY25wLT5jbl9jcmVkKSk7CglLQVNTRVJUKGthdXRoX2NyZWRfdWlkbWF0Y2go
Y3JlZCwgdGNucC0+Y25fY3JlZCkpOwoKCW1wID0gZmR2cC0+dl9tb3VudDsKCUtBU1NFUlQo
bXAgIT0gTlVMTCk7CglLQVNTRVJUKG1wID09IHRkdnAtPnZfbW91bnQpOwoJLyogWFhYIEhv
dyBjYW4gd2UgYmUgc3VyZSB0aGlzIHN0YXlzIHRydWU/ICAqLwoJS0FTU0VSVCgobXAtPm1u
dF9mbGFnICYgTU5UX1JET05MWSkgPT0gMCk7CgoJLyogUmVqZWN0IHJlbmFtZSgieC8uLiIs
IC4uLikgYW5kIHJlbmFtZSguLi4sICJ4Ly4uIikgZWFybHkuICAqLwoJaWYgKChmY25wLT5j
bl9mbGFncyB8IHRjbnAtPmNuX2ZsYWdzKSAmIElTRE9URE9UKQoJCXJldHVybiBFSU5WQUw7
CS8qIFhYWCBFSVNESVI/ICAqLwoKCWVycm9yID0gZ2VuZnNfcmVuYW1lX2VudGVyKG9wcywg
bXAsIGNyZWQsCgkgICAgZmR2cCwgZmNucCwgZmRlLCAmZnZwLAoJICAgIHRkdnAsIHRjbnAs
IHRkZSwgJnR2cCk7CglpZiAoZXJyb3IpCgkJcmV0dXJuIGVycm9yOwoKCS8qCgkgKiBDaGVj
ayB0aGF0IGV2ZXJ5dGhpbmcgaXMgbG9ja2VkIGFuZCBsb29rcyByaWdodC4KCSAqLwoJS0FT
U0VSVChmdnAgIT0gTlVMTCk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRChmZHZwKSA9PSBMS19F
WENMVVNJVkUpOwoJS0FTU0VSVChWT1BfSVNMT0NLRUQoZnZwKSA9PSBMS19FWENMVVNJVkUp
OwoJS0FTU0VSVChWT1BfSVNMT0NLRUQodGR2cCkgPT0gTEtfRVhDTFVTSVZFKTsKCUtBU1NF
UlQoKHR2cCA9PSBOVUxMKSB8fCAoVk9QX0lTTE9DS0VEKHR2cCkgPT0gTEtfRVhDTFVTSVZF
KSk7CgoJLyoKCSAqIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSB0aGUgc2Ft
ZSBvYmplY3QsIHdlIG5lZWQKCSAqIG9ubHkgYXQgbW9zdCBkZWxldGUgdGhlIHNvdXJjZSBl
bnRyeS4gIFdlIGFyZSBndWFyYW50ZWVkIGF0CgkgKiB0aGlzIHBvaW50IHRoYXQgdGhlIGVu
dHJpZXMgYXJlIGRpc3RpbmN0LgoJICovCglpZiAoZnZwID09IHR2cCkgewoJCUtBU1NFUlQo
dHZwICE9IE5VTEwpOwoJCWlmIChmdnAtPnZfdHlwZSA9PSBWRElSKQoJCQkvKiBYWFggVGhp
cyBzaG91bGRuJ3QgYmUgcG9zc2libGUuICAqLwoJCQllcnJvciA9IEVJTlZBTDsKCQllbHNl
IGlmIChwb3NpeGx5X2NvcnJlY3QpCgkJCS8qIFBPU0lYIHNleiB0byBsZWF2ZSB0aGVtIGFs
b25lLiAgKi8KCQkJZXJyb3IgPSAwOwoJCWVsc2UgaWYgKChmZHZwID09IHRkdnApICYmCgkJ
ICAgIChmY25wLT5jbl9uYW1lbGVuID09IHRjbnAtPmNuX25hbWVsZW4pICYmCgkJICAgICht
ZW1jbXAoZmNucC0+Y25fbmFtZXB0ciwgdGNucC0+Y25fbmFtZXB0ciwKCQkJZmNucC0+Y25f
bmFtZWxlbikgPT0gMCkpCgkJCS8qIFJlbmFtaW5nIGFuIGVudHJ5IG92ZXIgaXRzZWxmIGRv
ZXMgbm90aGluZy4gICovCgkJCWVycm9yID0gMDsKCQllbHNlCgkJCS8qIFhYWCBDYW4ndCB1
c2UgVk9QX1JFTU9WRSBiZWNhdXNlIG9mIGxvY2tpbmcuICAqLwoJCQllcnJvciA9IGdlbmZz
X3JlbmFtZV9yZW1vdmUob3BzLCBtcCwgY3JlZCwKCQkJICAgIGZkdnAsIGZjbnAsIGZkZSwg
ZnZwKTsKCQlnb3RvIG91dDsKCX0KCUtBU1NFUlQoZnZwICE9IHR2cCk7CglLQVNTRVJUKChm
ZHZwICE9IHRkdnApIHx8CgkgICAgKGZjbnAtPmNuX25hbWVsZW4gIT0gdGNucC0+Y25fbmFt
ZWxlbikgfHwKCSAgICAobWVtY21wKGZjbnAtPmNuX25hbWVwdHIsIHRjbnAtPmNuX25hbWVw
dHIsIGZjbnAtPmNuX25hbWVsZW4pCgkJIT0gMCkpOwoKCS8qCgkgKiBJZiB0aGUgdGFyZ2V0
IGV4aXN0cywgcmVmdXNlIHRvIHJlbmFtZSBhIGRpcmVjdG9yeSBvdmVyIGEKCSAqIG5vbi1k
aXJlY3Rvcnkgb3IgdmljZSB2ZXJzYSwgb3IgdG8gY2xvYmJlciBhIG5vbi1lbXB0eQoJICog
ZGlyZWN0b3J5LgoJICovCglpZiAodHZwICE9IE5VTEwpIHsKCQlpZiAoZnZwLT52X3R5cGUg
PT0gVkRJUiAmJiB0dnAtPnZfdHlwZSA9PSBWRElSKQoJCQllcnJvciA9CgkJCSAgICAob3Bz
LT5ncm9fZGlyZWN0b3J5X2VtcHR5X3AobXAsIGNyZWQsIHR2cCwgdGR2cCk/CgkJCQkwIDog
RU5PVEVNUFRZKTsKCQllbHNlIGlmIChmdnAtPnZfdHlwZSA9PSBWRElSICYmIHR2cC0+dl90
eXBlICE9IFZESVIpCgkJCWVycm9yID0gRU5PVERJUjsKCQllbHNlIGlmIChmdnAtPnZfdHlw
ZSAhPSBWRElSICYmIHR2cC0+dl90eXBlID09IFZESVIpCgkJCWVycm9yID0gRUlTRElSOwoJ
CWVsc2UKCQkJZXJyb3IgPSAwOwoJCWlmIChlcnJvcikKCQkJZ290byBvdXQ7CgkJS0FTU0VS
VCgoZnZwLT52X3R5cGUgPT0gVkRJUikgPT0gKHR2cC0+dl90eXBlID09IFZESVIpKTsKCX0K
CgkvKgoJICogQXV0aG9yaXplIHRoZSByZW5hbWUuCgkgKi8KCWVycm9yID0gb3BzLT5ncm9f
cmVuYW1lX2NoZWNrX3Bvc3NpYmxlKG1wLCBmZHZwLCBmdnAsIHRkdnAsIHR2cCk7CglpZiAo
ZXJyb3IpCgkJZ290byBvdXQ7CgllcnJvciA9IG9wcy0+Z3JvX3JlbmFtZV9jaGVja19wZXJt
aXR0ZWQobXAsIGNyZWQsIGZkdnAsIGZ2cCwgdGR2cCwgdHZwKTsKCWVycm9yID0ga2F1dGhf
YXV0aG9yaXplX3Zub2RlKGNyZWQsIEtBVVRIX1ZOT0RFX0RFTEVURSwgZnZwLCBmZHZwLAoJ
ICAgIGVycm9yKTsKCWVycm9yID0ga2F1dGhfYXV0aG9yaXplX3Zub2RlKGNyZWQsIEtBVVRI
X1ZOT0RFX1JFTkFNRSwgdHZwLCB0ZHZwLAoJICAgIGVycm9yKTsKCWlmIChlcnJvcikKCQln
b3RvIG91dDsKCgoJLyoKCSAqIEV2ZXJ5dGhpbmcgaXMgaHVua3ktZG9yeS4gIFNodWZmbGUg
dGhlIGRpcmVjdG9yeSBlbnRyaWVzLgoJICovCgllcnJvciA9IG9wcy0+Z3JvX3JlbmFtZSht
cCwgY3JlZCwKCSAgICBmZHZwLCBmY25wLCBmZGUsIGZ2cCwKCSAgICB0ZHZwLCB0Y25wLCB0
ZGUsIHR2cCk7CglpZiAoZXJyb3IpCgkJZ290byBvdXQ7CgoJLyogU3VjY2VzcyEgICovCgpv
dXQ6CWdlbmZzX3JlbmFtZV9leGl0KG9wcywgbXAsIGZkdnAsIGZ2cCwgdGR2cCwgdHZwKTsK
CXJldHVybiBlcnJvcjsKfQoKLyoKICogZ2VuZnNfcmVuYW1lX2tub3RlOiBOb3RlIGV2ZW50
cyBhYm91dCB0aGUgdmFyaW91cyB2bm9kZXMgaW4gYQogKiByZW5hbWUuICBUbyBiZSBjYWxs
ZWQgYnkgZ3JvX3JlbmFtZSBvbiBzdWNjZXNzLiAgVGhlIG9ubHkgcGFpciBvZgogKiB2bm9k
ZXMgdGhhdCBtYXkgYmUgaWRlbnRpY2FsIGlzIHtmZHZwLCB0ZHZwfS4gIGRlbGV0ZWRfcCBp
cyB0cnVlIGlmZgogKiB0aGUgcmVuYW1lIG92ZXJ3cm90ZSB0aGUgbGFzdCBsaW5rIHRvIHR2
cC4KICovCnZvaWQKZ2VuZnNfcmVuYW1lX2tub3RlKHN0cnVjdCB2bm9kZSAqZmR2cCwgc3Ry
dWN0IHZub2RlICpmdnAsCiAgICBzdHJ1Y3Qgdm5vZGUgKnRkdnAsIHN0cnVjdCB2bm9kZSAq
dHZwLCBib29sIGRlbGV0ZWRfcCkKewoJbG9uZyBmZHZwX2V2ZW50cywgdGR2cF9ldmVudHM7
Cglib29sIGRpcmVjdG9yeV9wLCByZXBhcmVudF9wLCByZXBsYWNlZF9wOwoKCUtBU1NFUlQo
ZmR2cCAhPSBOVUxMKTsKCUtBU1NFUlQoZnZwICE9IE5VTEwpOwoJS0FTU0VSVCh0ZHZwICE9
IE5VTEwpOwoJS0FTU0VSVChmZHZwICE9IGZ2cCk7CglLQVNTRVJUKGZkdnAgIT0gdHZwKTsK
CUtBU1NFUlQodGR2cCAhPSBmdnApOwoJS0FTU0VSVCh0ZHZwICE9IHR2cCk7CglLQVNTRVJU
KGZ2cCAhPSB0dnApOwoJS0FTU0VSVChWT1BfSVNMT0NLRUQoZmR2cCkgPT0gTEtfRVhDTFVT
SVZFKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKGZ2cCkgPT0gTEtfRVhDTFVTSVZFKTsKCUtB
U1NFUlQoVk9QX0lTTE9DS0VEKHRkdnApID09IExLX0VYQ0xVU0lWRSk7CglLQVNTRVJUKCh0
dnAgPT0gTlVMTCkgfHwgKFZPUF9JU0xPQ0tFRCh0dnApID09IExLX0VYQ0xVU0lWRSkpOwoK
CWRpcmVjdG9yeV9wID0gKGZ2cC0+dl90eXBlID09IFZESVIpOwoJcmVwYXJlbnRfcCA9IChm
ZHZwICE9IHRkdnApOwoJcmVwbGFjZWRfcCA9ICh0dnAgIT0gTlVMTCk7CgoJS0FTU0VSVCgo
dHZwID09IE5VTEwpIHx8IChkaXJlY3RvcnlfcCA9PSAodHZwLT52X3R5cGUgPT0gVkRJUikp
KTsKCUtBU1NFUlQoIWRlbGV0ZWRfcCB8fCByZXBsYWNlZF9wKTsKCglmZHZwX2V2ZW50cyA9
IE5PVEVfV1JJVEU7CglpZiAoZGlyZWN0b3J5X3AgJiYgcmVwYXJlbnRfcCkKCQlmZHZwX2V2
ZW50cyB8PSBOT1RFX0xJTks7CglWTl9LTk9URShmZHZwLCBmZHZwX2V2ZW50cyk7CgoJVk5f
S05PVEUoZnZwLCBOT1RFX1JFTkFNRSk7CgoJaWYgKHJlcGFyZW50X3ApIHsKCQl0ZHZwX2V2
ZW50cyA9IE5PVEVfV1JJVEU7CgkJaWYgKCFyZXBsYWNlZF9wKSB7CgkJCXRkdnBfZXZlbnRz
IHw9IE5PVEVfRVhURU5EOwoJCQlpZiAoZGlyZWN0b3J5X3ApCgkJCQl0ZHZwX2V2ZW50cyB8
PSBOT1RFX0xJTks7CgkJfQoJCVZOX0tOT1RFKHRkdnAsIHRkdnBfZXZlbnRzKTsKCX0KCglp
ZiAocmVwbGFjZWRfcCkKCQlWTl9LTk9URSh0dnAsIChkZWxldGVkX3A/IE5PVEVfREVMRVRF
IDogTk9URV9MSU5LKSk7Cn0KCi8qCiAqIGdlbmZzX3JlbmFtZV9jYWNoZV9wdXJnZTogUHVy
Z2UgdGhlIG5hbWUgY2FjaGUuICBUbyBiZSBjYWxsZWQgYnkKICogZ3JvX3JlbmFtZSBvbiBz
dWNjZXNzLiAgVGhlIG9ubHkgcGFpciBvZiB2bm9kZXMgdGhhdCBtYXkgYmUKICogaWRlbnRp
Y2FsIGlzIHtmZHZwLCB0ZHZwfS4KICovCnZvaWQKZ2VuZnNfcmVuYW1lX2NhY2hlX3B1cmdl
KHN0cnVjdCB2bm9kZSAqZmR2cCwgc3RydWN0IHZub2RlICpmdnAsCiAgICBzdHJ1Y3Qgdm5v
ZGUgKnRkdnAsIHN0cnVjdCB2bm9kZSAqdHZwKQp7CgoJS0FTU0VSVChmZHZwICE9IE5VTEwp
OwoJS0FTU0VSVChmdnAgIT0gTlVMTCk7CglLQVNTRVJUKHRkdnAgIT0gTlVMTCk7CglLQVNT
RVJUKGZkdnAgIT0gZnZwKTsKCUtBU1NFUlQoZmR2cCAhPSB0dnApOwoJS0FTU0VSVCh0ZHZw
ICE9IGZ2cCk7CglLQVNTRVJUKHRkdnAgIT0gdHZwKTsKCUtBU1NFUlQoZnZwICE9IHR2cCk7
CglLQVNTRVJUKGZkdnAtPnZfdHlwZSA9PSBWRElSKTsKCUtBU1NFUlQodGR2cC0+dl90eXBl
ID09IFZESVIpOwoKCS8qCgkgKiBYWFggV2hhdCBhY3R1YWxseSBuZWVkcyB0byBiZSBwdXJn
ZWQ/CgkgKi8KCgljYWNoZV9wdXJnZShmZHZwKTsKCglpZiAoZnZwLT52X3R5cGUgPT0gVkRJ
UikKCQljYWNoZV9wdXJnZShmdnApOwoKCWlmICh0ZHZwICE9IGZkdnApCgkJY2FjaGVfcHVy
Z2UodGR2cCk7CgoJaWYgKCh0dnAgIT0gTlVMTCkgJiYgKHR2cC0+dl90eXBlID09IFZESVIp
KQoJCWNhY2hlX3B1cmdlKHR2cCk7Cn0KCi8qCiAqIGdlbmZzX3JlbmFtZV9lbnRlcjogTG9v
ayB1cCBmY25wIGluIGZkdnAsIGFuZCBzdG9yZSB0aGUgbG9va3VwCiAqIHJlc3VsdHMgaW4g
KmZkZV9yZXQgYW5kIHRoZSBhc3NvY2lhdGVkIHZub2RlIGluICpmdnBfcmV0OyBmYWlsIGlm
CiAqIG5vdCBmb3VuZC4gIExvb2sgdXAgdGNucCBpbiB0ZHZwLCBhbmQgc3RvcmUgdGhlIGxv
b2t1cCByZXN1bHRzIGluCiAqICp0ZGVfcmV0IGFuZCB0aGUgYXNzb2NpYXRlZCB2bm9kZSBp
biAqdHZwX3JldDsgc3RvcmUgbnVsbCBpbnN0ZWFkIGlmCiAqIG5vdCBmb3VuZC4gIEZhaWwg
aWYgYW55dGhpbmcgaGFzIGJlZW4gbW91bnRlZCBvbiBhbnkgb2YgdGhlIG5vZGVzCiAqIGlu
dm9sdmVkLgogKgogKiBmZHZwIGFuZCB0ZHZwIG11c3QgYmUgcmVmZXJlbmNlZC4KICoKICog
T24gZW50cnksIG5vdGhpbmcgaXMgbG9ja2VkLgogKgogKiBPbiBzdWNjZXNzLCBldmVyeXRo
aW5nIGlzIGxvY2tlZCwgYW5kICpmdnBfcmV0LCBhbmQgKnR2cF9yZXQgaWYKICogbm9ubnVs
bCwgYXJlIHJlZmVyZW5jZWQuICBUaGUgb25seSBwYWlycyBvZiB2bm9kZXMgdGhhdCBtYXkg
YmUKICogaWRlbnRpY2FsIGFyZSB7ZmR2cCwgdGR2cH0gYW5kIHtmdnAsIHR2cH0uCiAqCiAq
IE9uIGZhaWx1cmUsIGV2ZXJ5dGhpbmcgcmVtYWlucyBhcyB3YXMuCiAqCiAqIExvY2tpbmcg
ZXZlcnl0aGluZyBpbmNsdWRpbmcgdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG5vZGVzIGlzCiAq
IG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgdGhhdCwgZS5nLiwgbGluayBjb3VudCB1cGRhdGVz
IGFyZSBPSy4gIFRoZQogKiBsb2NraW5nIG9yZGVyIGlzLCBpbiBnZW5lcmFsLCBhbmNlc3Rv
ci1maXJzdCwgbWF0Y2hpbmcgdGhlIG9yZGVyIHlvdQogKiBuZWVkIHRvIHVzZSB0byBsb29r
IHVwIGEgZGVzY2VuZGFudCBhbnl3YXkuCiAqLwpzdGF0aWMgaW50CmdlbmZzX3JlbmFtZV9l
bnRlcihjb25zdCBzdHJ1Y3QgZ2VuZnNfcmVuYW1lX29wcyAqb3BzLAogICAgc3RydWN0IG1v
dW50ICptcCwga2F1dGhfY3JlZF90IGNyZWQsCiAgICBzdHJ1Y3Qgdm5vZGUgKmZkdnAsIHN0
cnVjdCBjb21wb25lbnRuYW1lICpmY25wLAogICAgdm9pZCAqZmRlX3JldCwgc3RydWN0IHZu
b2RlICoqZnZwX3JldCwKICAgIHN0cnVjdCB2bm9kZSAqdGR2cCwgc3RydWN0IGNvbXBvbmVu
dG5hbWUgKnRjbnAsCiAgICB2b2lkICp0ZGVfcmV0LCBzdHJ1Y3Qgdm5vZGUgKip0dnBfcmV0
KQp7CglpbnQgZXJyb3I7CgoJS0FTU0VSVChtcCAhPSBOVUxMKTsKCUtBU1NFUlQoZmR2cCAh
PSBOVUxMKTsKCUtBU1NFUlQoZmNucCAhPSBOVUxMKTsKCUtBU1NFUlQoZnZwX3JldCAhPSBO
VUxMKTsKCUtBU1NFUlQodGR2cCAhPSBOVUxMKTsKCUtBU1NFUlQodGNucCAhPSBOVUxMKTsK
CUtBU1NFUlQodHZwX3JldCAhPSBOVUxMKTsKCUtBU1NFUlQoZnZwX3JldCAhPSB0dnBfcmV0
KTsKCUtBU1NFUlQoZmR2cC0+dl90eXBlID09IFZESVIpOwoJS0FTU0VSVCh0ZHZwLT52X3R5
cGUgPT0gVkRJUik7CglLQVNTRVJUKGZkdnAtPnZfbW91bnQgPT0gbXApOwoJS0FTU0VSVCh0
ZHZwLT52X21vdW50ID09IG1wKTsKCglpZiAoZmR2cCA9PSB0ZHZwKQoJCWVycm9yID0gZ2Vu
ZnNfcmVuYW1lX2VudGVyX2NvbW1vbihvcHMsIG1wLCBjcmVkLCBmZHZwLAoJCSAgICBmY25w
LCBmZGVfcmV0LCBmdnBfcmV0LAoJCSAgICB0Y25wLCB0ZGVfcmV0LCB0dnBfcmV0KTsKCWVs
c2UKCQllcnJvciA9IGdlbmZzX3JlbmFtZV9lbnRlcl9zZXBhcmF0ZShvcHMsIG1wLCBjcmVk
LAoJCSAgICBmZHZwLCBmY25wLCBmZGVfcmV0LCBmdnBfcmV0LAoJCSAgICB0ZHZwLCB0Y25w
LCB0ZGVfcmV0LCB0dnBfcmV0KTsKCglpZiAoZXJyb3IpCgkJcmV0dXJuIGVycm9yOwoKCUtB
U1NFUlQoKmZ2cF9yZXQgIT0gTlVMTCk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRCgqZnZwX3Jl
dCkgPT0gTEtfRVhDTFVTSVZFKTsKCUtBU1NFUlQoKCp0dnBfcmV0ID09IE5VTEwpIHx8IChW
T1BfSVNMT0NLRUQoKnR2cF9yZXQpID09IExLX0VYQ0xVU0lWRSkpOwoJS0FTU0VSVCgqZnZw
X3JldCAhPSBmZHZwKTsKCUtBU1NFUlQoKmZ2cF9yZXQgIT0gdGR2cCk7CglLQVNTRVJUKCp0
dnBfcmV0ICE9IGZkdnApOwoJS0FTU0VSVCgqdHZwX3JldCAhPSB0ZHZwKTsKCXJldHVybiAw
Owp9CgovKgogKiBnZW5mc19yZW5hbWVfZW50ZXJfY29tbW9uOiBMb2NrIGFuZCBsb29rIHVw
IHdpdGggYSBjb21tb24KICogc291cmNlL3RhcmdldCBkaXJlY3RvcnkuCiAqLwpzdGF0aWMg
aW50CmdlbmZzX3JlbmFtZV9lbnRlcl9jb21tb24oY29uc3Qgc3RydWN0IGdlbmZzX3JlbmFt
ZV9vcHMgKm9wcywKICAgIHN0cnVjdCBtb3VudCAqbXAsIGthdXRoX2NyZWRfdCBjcmVkLCBz
dHJ1Y3Qgdm5vZGUgKmR2cCwKICAgIHN0cnVjdCBjb21wb25lbnRuYW1lICpmY25wLAogICAg
dm9pZCAqZmRlX3JldCwgc3RydWN0IHZub2RlICoqZnZwX3JldCwKICAgIHN0cnVjdCBjb21w
b25lbnRuYW1lICp0Y25wLAogICAgdm9pZCAqdGRlX3JldCwgc3RydWN0IHZub2RlICoqdHZw
X3JldCkKewoJc3RydWN0IHZub2RlICpmdnAsICp0dnA7CglpbnQgZXJyb3I7CgoJS0FTU0VS
VChvcHMgIT0gTlVMTCk7CglLQVNTRVJUKG1wICE9IE5VTEwpOwoJS0FTU0VSVChkdnAgIT0g
TlVMTCk7CglLQVNTRVJUKGZjbnAgIT0gTlVMTCk7CglLQVNTRVJUKGZ2cF9yZXQgIT0gTlVM
TCk7CglLQVNTRVJUKHRjbnAgIT0gTlVMTCk7CglLQVNTRVJUKHR2cF9yZXQgIT0gTlVMTCk7
CglLQVNTRVJUKGR2cC0+dl90eXBlID09IFZESVIpOwoJS0FTU0VSVChkdnAtPnZfbW91bnQg
PT0gbXApOwoKCWVycm9yID0gb3BzLT5ncm9fbG9ja19kaXJlY3RvcnkobXAsIGR2cCk7Cglp
ZiAoZXJyb3IpCgkJZ290byBmYWlsMDsKCgkvKiBEaWQgd2UgbG9zZSBhIHJhY2Ugd2l0aCBt
b3VudD8gICovCglpZiAoZHZwLT52X21vdW50ZWRoZXJlICE9IE5VTEwpIHsKCQllcnJvciA9
IEVCVVNZOwoJCWdvdG8gZmFpbDE7Cgl9CgoJS0FTU0VSVChmY25wLT5jbl9uYW1laW9wID09
IERFTEVURSk7CgllcnJvciA9IG9wcy0+Z3JvX2xvb2t1cChtcCwgZHZwLCBmY25wLCBmZGVf
cmV0LCAmZnZwKTsKCWlmIChlcnJvcikKCQlnb3RvIGZhaWwxOwoKCUtBU1NFUlQoZnZwICE9
IE5VTEwpOwoKCS8qIFJlZnVzZSB0byByZW5hbWUgYC4nLiAgKi8KCWlmIChmdnAgPT0gZHZw
KSB7CgkJZXJyb3IgPSBFSU5WQUw7CgkJZ290byBmYWlsMjsKCX0KCUtBU1NFUlQoZnZwICE9
IGR2cCk7CgoJS0FTU0VSVCh0Y25wLT5jbl9uYW1laW9wID09IFJFTkFNRSk7CgllcnJvciA9
IG9wcy0+Z3JvX2xvb2t1cChtcCwgZHZwLCB0Y25wLCB0ZGVfcmV0LCAmdHZwKTsKCWlmIChl
cnJvciA9PSBFTk9FTlQpIHsKCQl0dnAgPSBOVUxMOwoJfSBlbHNlIGlmIChlcnJvcikgewoJ
CWdvdG8gZmFpbDI7Cgl9IGVsc2UgewoJCUtBU1NFUlQodHZwICE9IE5VTEwpOwoKCQkvKiBS
ZWZ1c2UgdG8gcmVuYW1lIG92ZXIgYC4nLiAgKi8KCQlpZiAodHZwID09IGR2cCkgewoJCQll
cnJvciA9IEVJU0RJUjsgLyogWFhYIEVJTlZBTD8gICovCgkJCWdvdG8gZmFpbDI7CgkJfQoJ
fQoJS0FTU0VSVCh0dnAgIT0gZHZwKTsKCgkvKgoJICogV2UndmUgbG9va2VkIHVwIGJvdGgg
bm9kZXMuICBOb3cgbG9jayB0aGVtIGFuZCBjaGVjayB0aGVtLgoJICovCgoJdm5fbG9jayhm
dnAsIExLX0VYQ0xVU0lWRSB8IExLX1JFVFJZKTsKCUtBU1NFUlQoZnZwLT52X21vdW50ID09
IG1wKTsKCS8qIFJlZnVzZSB0byByZW5hbWUgYSBtb3VudCBwb2ludC4gICovCglpZiAoKGZ2
cC0+dl90eXBlID09IFZESVIpICYmIChmdnAtPnZfbW91bnRlZGhlcmUgIT0gTlVMTCkpIHsK
CQllcnJvciA9IEVCVVNZOwoJCWdvdG8gZmFpbDM7Cgl9CgoJaWYgKCh0dnAgIT0gTlVMTCkg
JiYgKHR2cCAhPSBmdnApKSB7CgkJdm5fbG9jayh0dnAsIExLX0VYQ0xVU0lWRSB8IExLX1JF
VFJZKTsKCQlLQVNTRVJUKHR2cC0+dl9tb3VudCA9PSBtcCk7CgkJLyogUmVmdXNlIHRvIHJl
bmFtZSBvdmVyIGEgbW91bnQgcG9pbnQuICAqLwoJCWlmICgodHZwLT52X3R5cGUgPT0gVkRJ
UikgJiYgKHR2cC0+dl9tb3VudGVkaGVyZSAhPSBOVUxMKSkgewoJCQllcnJvciA9IEVCVVNZ
OwoJCQlnb3RvIGZhaWw0OwoJCX0KCX0KCglLQVNTRVJUKFZPUF9JU0xPQ0tFRChkdnApID09
IExLX0VYQ0xVU0lWRSk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRChmdnApID09IExLX0VYQ0xV
U0lWRSk7CglLQVNTRVJUKCh0dnAgPT0gTlVMTCkgfHwgKFZPUF9JU0xPQ0tFRCh0dnApID09
IExLX0VYQ0xVU0lWRSkpOwoKCSpmdnBfcmV0ID0gZnZwOwoJKnR2cF9yZXQgPSB0dnA7Cgly
ZXR1cm4gMDsKCmZhaWw0OglpZiAoKHR2cCAhPSBOVUxMKSAmJiAodHZwICE9IGZ2cCkpCgkJ
Vk9QX1VOTE9DSyh0dnAsIDApOwpmYWlsMzoJVk9QX1VOTE9DSyhmdnAsIDApOwoJaWYgKHR2
cCAhPSBOVUxMKQoJCXZyZWxlKHR2cCk7CmZhaWwyOgl2cmVsZShmdnApOwpmYWlsMToJVk9Q
X1VOTE9DSyhkdnAsIDApOwpmYWlsMDoJcmV0dXJuIGVycm9yOwp9CgovKgogKiBnZW5mc19y
ZW5hbWVfZW50ZXJfc2VwYXJhdGU6IExvY2sgYW5kIGxvb2sgdXAgd2l0aCBzZXBhcmF0ZSBz
b3VyY2UKICogYW5kIHRhcmdldCBkaXJlY3Rvcmllcy4KICovCnN0YXRpYyBpbnQKZ2VuZnNf
cmVuYW1lX2VudGVyX3NlcGFyYXRlKGNvbnN0IHN0cnVjdCBnZW5mc19yZW5hbWVfb3BzICpv
cHMsCiAgICBzdHJ1Y3QgbW91bnQgKm1wLCBrYXV0aF9jcmVkX3QgY3JlZCwKICAgIHN0cnVj
dCB2bm9kZSAqZmR2cCwgc3RydWN0IGNvbXBvbmVudG5hbWUgKmZjbnAsCiAgICB2b2lkICpm
ZGVfcmV0LCBzdHJ1Y3Qgdm5vZGUgKipmdnBfcmV0LAogICAgc3RydWN0IHZub2RlICp0ZHZw
LCBzdHJ1Y3QgY29tcG9uZW50bmFtZSAqdGNucCwKICAgIHZvaWQgKnRkZV9yZXQsIHN0cnVj
dCB2bm9kZSAqKnR2cF9yZXQpCnsKCXN0cnVjdCB2bm9kZSAqaW50ZXJtZWRpYXRlX25vZGU7
CglzdHJ1Y3Qgdm5vZGUgKmZ2cCwgKnR2cDsKCWludCBlcnJvcjsKCglLQVNTRVJUKG9wcyAh
PSBOVUxMKTsKCUtBU1NFUlQobXAgIT0gTlVMTCk7CglLQVNTRVJUKGZkdnAgIT0gTlVMTCk7
CglLQVNTRVJUKGZjbnAgIT0gTlVMTCk7CglLQVNTRVJUKGZ2cF9yZXQgIT0gTlVMTCk7CglL
QVNTRVJUKHRkdnAgIT0gTlVMTCk7CglLQVNTRVJUKHRjbnAgIT0gTlVMTCk7CglLQVNTRVJU
KHR2cF9yZXQgIT0gTlVMTCk7CglLQVNTRVJUKGZkdnAgIT0gdGR2cCk7CglLQVNTRVJUKGZj
bnAgIT0gdGNucCk7CglLQVNTRVJUKGZjbnAtPmNuX25hbWVpb3AgPT0gREVMRVRFKTsKCUtB
U1NFUlQodGNucC0+Y25fbmFtZWlvcCA9PSBSRU5BTUUpOwoJS0FTU0VSVChmdnBfcmV0ICE9
IHR2cF9yZXQpOwoJS0FTU0VSVChmZHZwLT52X3R5cGUgPT0gVkRJUik7CglLQVNTRVJUKHRk
dnAtPnZfdHlwZSA9PSBWRElSKTsKCUtBU1NFUlQoZmR2cC0+dl9tb3VudCA9PSBtcCk7CglL
QVNTRVJUKHRkdnAtPnZfbW91bnQgPT0gbXApOwoKCWVycm9yID0gb3BzLT5ncm9fZ2VuZWFs
b2d5KG1wLCBjcmVkLCBmZHZwLCB0ZHZwLCAmaW50ZXJtZWRpYXRlX25vZGUpOwoJaWYgKGVy
cm9yKQoJCXJldHVybiBlcnJvcjsKCgkvKgoJICogaW50ZXJtZWRpYXRlX25vZGUgPT0gTlVM
TCBtZWFucyBmZHZwIGlzIG5vdCBhbiBhbmNlc3RvciBvZiB0ZHZwLgoJICovCglpZiAoaW50
ZXJtZWRpYXRlX25vZGUgPT0gTlVMTCkKCQllcnJvciA9IGdlbmZzX3JlbmFtZV9sb2NrKG9w
cywgbXAsIGNyZWQsCgkJICAgIEVOT1RFTVBUWSwgRUlTRElSLCBFSU5WQUwsCgkJICAgIHRk
dnAsIHRjbnAsIHRydWUsIHRkZV9yZXQsICZ0dnAsCgkJICAgIGZkdnAsIGZjbnAsIGZhbHNl
LCBmZGVfcmV0LCAmZnZwKTsKCWVsc2UKCQllcnJvciA9IGdlbmZzX3JlbmFtZV9sb2NrKG9w
cywgbXAsIGNyZWQsCgkJICAgIEVJTlZBTCwgRUlTRElSLCBFSU5WQUwsCgkJICAgIGZkdnAs
IGZjbnAsIGZhbHNlLCBmZGVfcmV0LCAmZnZwLAoJCSAgICB0ZHZwLCB0Y25wLCB0cnVlLCB0
ZGVfcmV0LCAmdHZwKTsKCWlmIChlcnJvcikKCQlnb3RvIG91dDsKCglLQVNTRVJUKGZ2cCAh
PSBOVUxMKTsKCgkvKgoJICogUmVqZWN0IHJlbmFtZSgiZm9vL2JhciIsICJmb28vYmFyL2Jh
ei9xdXV4L3pvdCIpLgoJICovCglpZiAoZnZwID09IGludGVybWVkaWF0ZV9ub2RlKSB7CgkJ
Z2VuZnNfcmVuYW1lX2V4aXQob3BzLCBtcCwgZmR2cCwgZnZwLCB0ZHZwLCB0dnApOwoJCWVy
cm9yID0gRUlOVkFMOwoJCWdvdG8gb3V0OwoJfQoKCSpmdnBfcmV0ID0gZnZwOwoJKnR2cF9y
ZXQgPSB0dnA7CgllcnJvciA9IDA7CgpvdXQ6CWlmIChpbnRlcm1lZGlhdGVfbm9kZSAhPSBO
VUxMKQoJCXZyZWxlKGludGVybWVkaWF0ZV9ub2RlKTsKCXJldHVybiBlcnJvcjsKfQoKLyoK
ICogZ2VuZnNfcmVuYW1lX2xvY2s6IExvY2sgZGlyZWN0b3JpZXMgYSBhbmQgYiwgd2hpY2gg
bXVzdCBiZSBkaXN0aW5jdCwKICogYW5kIGxvb2sgdXAgYW5kIGxvY2sgbm9kZXMgYSBhbmQg
Yi4gIERvIGEgZmlyc3QgYW5kIHRoZW4gYi4KICogRGlyZWN0b3J5IGIgbWF5IG5vdCBiZSBh
biBhbmNlc3RvciBvZiBkaXJlY3RvcnkgYSwgYWx0aG91Z2gKICogZGlyZWN0b3J5IGEgbWF5
IGJlIGFuIGFuY2VzdG9yIG9mIGRpcmVjdG9yeSBiLiAgRmFpbCB3aXRoCiAqIG92ZXJsYXBf
ZXJyb3IgaWYgbm9kZSBhIGlzIGRpcmVjdG9yeSBiLiAgTmVpdGhlciBjb21wb25lbnRuYW1l
IG1heQogKiBiZSBgLicgb3IgYC4uJy4KICoKICogYV9kdnAgYW5kIGJfZHZwIG11c3QgYmUg
cmVmZXJlbmNlZC4KICoKICogT24gZW50cnksIGFfZHZwIGFuZCBiX2R2cCBhcmUgdW5sb2Nr
ZWQuCiAqCiAqIE9uIHN1Y2Nlc3MsCiAqIC4gYV9kdnAgYW5kIGJfZHZwIGFyZSBsb2NrZWQs
CiAqIC4gKmFfZGlyZW50X3JldCBpcyBmaWxsZWQgd2l0aCBhIGRpcmVjdG9yeSBlbnRyeSB3
aG9zZSBub2RlIGlzCiAqICAgICBsb2NrZWQgYW5kIHJlZmVyZW5jZWQsCiAqIC4gKmJfdnBf
cmV0IGlzIGZpbGxlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHZub2RlLAogKiAuICpiX2Rp
cmVudF9yZXQgaXMgZmlsbGVkIGVpdGhlciB3aXRoIG51bGwgb3Igd2l0aCBhIGRpcmVjdG9y
eSBlbnRyeQogKiAgICAgd2hvc2Ugbm9kZSBpcyBsb2NrZWQgYW5kIHJlZmVyZW5jZWQsCiAq
IC4gKmJfdnAgaXMgZmlsbGVkIGVpdGhlciB3aXRoIG51bGwgb3Igd2l0aCB0aGUgY29ycmVz
cG9uZGluZyB2bm9kZSwKICogICAgIGFuZAogKiAuIHRoZSBvbmx5IHBhaXIgb2Ygdm5vZGVz
IHRoYXQgbWF5IGJlIGlkZW50aWNhbCBpcyBhX3ZwIGFuZCBiX3ZwLgogKgogKiBPbiBmYWls
dXJlLCBhX2R2cCBhbmQgYl9kdnAgYXJlIGxlZnQgdW5sb2NrZWQsIGFuZCAqYV9kaXJlbnRf
cmV0LAogKiAqYV92cCwgKmJfZGlyZW50X3JldCwgYW5kICpiX3ZwIGFyZSBsZWZ0IGFsb25l
LgogKi8Kc3RhdGljIGludApnZW5mc19yZW5hbWVfbG9jayhjb25zdCBzdHJ1Y3QgZ2VuZnNf
cmVuYW1lX29wcyAqb3BzLAogICAgc3RydWN0IG1vdW50ICptcCwga2F1dGhfY3JlZF90IGNy
ZWQsCiAgICBpbnQgb3ZlcmxhcF9lcnJvciwgaW50IGFfZG90X2Vycm9yLCBpbnQgYl9kb3Rf
ZXJyb3IsCiAgICBzdHJ1Y3Qgdm5vZGUgKmFfZHZwLCBzdHJ1Y3QgY29tcG9uZW50bmFtZSAq
YV9jbnAsIGJvb2wgYV9taXNzaW5nX29rLAogICAgdm9pZCAqYV9kZV9yZXQsIHN0cnVjdCB2
bm9kZSAqKmFfdnBfcmV0LAogICAgc3RydWN0IHZub2RlICpiX2R2cCwgc3RydWN0IGNvbXBv
bmVudG5hbWUgKmJfY25wLCBib29sIGJfbWlzc2luZ19vaywKICAgIHZvaWQgKmJfZGVfcmV0
LCBzdHJ1Y3Qgdm5vZGUgKipiX3ZwX3JldCkKewoJc3RydWN0IHZub2RlICphX3ZwLCAqYl92
cDsKCWludCBlcnJvcjsKCglLQVNTRVJUKG9wcyAhPSBOVUxMKTsKCUtBU1NFUlQobXAgIT0g
TlVMTCk7CglLQVNTRVJUKGFfZHZwICE9IE5VTEwpOwoJS0FTU0VSVChhX2NucCAhPSBOVUxM
KTsKCUtBU1NFUlQoYV92cF9yZXQgIT0gTlVMTCk7CglLQVNTRVJUKGJfZHZwICE9IE5VTEwp
OwoJS0FTU0VSVChiX2NucCAhPSBOVUxMKTsKCUtBU1NFUlQoYl92cF9yZXQgIT0gTlVMTCk7
CglLQVNTRVJUKGFfZHZwICE9IGJfZHZwKTsKCUtBU1NFUlQoYV92cF9yZXQgIT0gYl92cF9y
ZXQpOwoJS0FTU0VSVChhX2R2cC0+dl90eXBlID09IFZESVIpOwoJS0FTU0VSVChiX2R2cC0+
dl90eXBlID09IFZESVIpOwoJS0FTU0VSVChhX2R2cC0+dl9tb3VudCA9PSBtcCk7CglLQVNT
RVJUKGJfZHZwLT52X21vdW50ID09IG1wKTsKCUtBU1NFUlQoYV9taXNzaW5nX29rICE9IGJf
bWlzc2luZ19vayk7CgoJZXJyb3IgPSBvcHMtPmdyb19sb2NrX2RpcmVjdG9yeShtcCwgYV9k
dnApOwoJaWYgKGVycm9yKQoJCWdvdG8gZmFpbDA7CgoJLyogRGlkIHdlIGxvc2UgYSByYWNl
IHdpdGggbW91bnQ/ICAqLwoJaWYgKGFfZHZwLT52X21vdW50ZWRoZXJlICE9IE5VTEwpIHsK
CQllcnJvciA9IEVCVVNZOwoJCWdvdG8gZmFpbDE7Cgl9CgoJZXJyb3IgPSBvcHMtPmdyb19s
b29rdXAobXAsIGFfZHZwLCBhX2NucCwgYV9kZV9yZXQsICZhX3ZwKTsKCWlmIChlcnJvcikg
ewoJCWlmIChhX21pc3Npbmdfb2sgJiYgKGVycm9yID09IEVOT0VOVCkpCgkJCWFfdnAgPSBO
VUxMOwoJCWVsc2UKCQkJZ290byBmYWlsMTsKCX0gZWxzZSB7CgkJS0FTU0VSVChhX3ZwICE9
IE5VTEwpOwoKCQkvKiBSZWZ1c2UgdG8gcmVuYW1lIChvdmVyKSBgLicuICAqLwoJCWlmIChh
X3ZwID09IGFfZHZwKSB7CgkJCWVycm9yID0gYV9kb3RfZXJyb3I7CgkJCWdvdG8gZmFpbDI7
CgkJfQoKCQlpZiAoYV92cCA9PSBiX2R2cCkgewoJCQllcnJvciA9IG92ZXJsYXBfZXJyb3I7
CgkJCWdvdG8gZmFpbDI7CgkJfQoJfQoKCUtBU1NFUlQoYV92cCAhPSBhX2R2cCk7CglLQVNT
RVJUKGFfdnAgIT0gYl9kdnApOwoKCWVycm9yID0gb3BzLT5ncm9fbG9ja19kaXJlY3Rvcnko
bXAsIGJfZHZwKTsKCWlmIChlcnJvcikKCQlnb3RvIGZhaWwyOwoKCS8qIERpZCB3ZSBsb3Nl
IGEgcmFjZSB3aXRoIG1vdW50PyAgKi8KCWlmIChiX2R2cC0+dl9tb3VudGVkaGVyZSAhPSBO
VUxMKSB7CgkJZXJyb3IgPSBFQlVTWTsKCQlnb3RvIGZhaWwzOwoJfQoKCWVycm9yID0gb3Bz
LT5ncm9fbG9va3VwKG1wLCBiX2R2cCwgYl9jbnAsIGJfZGVfcmV0LCAmYl92cCk7CglpZiAo
ZXJyb3IpIHsKCQlpZiAoYl9taXNzaW5nX29rICYmIChlcnJvciA9PSBFTk9FTlQpKQoJCQli
X3ZwID0gTlVMTDsKCQllbHNlCgkJCWdvdG8gZmFpbDM7Cgl9IGVsc2UgewoJCUtBU1NFUlQo
Yl92cCAhPSBOVUxMKTsKCgkJLyogUmVmdXNlIHRvIHJlbmFtZSAob3ZlcikgYC4nLiAgKi8K
CQlpZiAoYl92cCA9PSBiX2R2cCkgewoJCQllcnJvciA9IGJfZG90X2Vycm9yOwoJCQlnb3Rv
IGZhaWw0OwoJCX0KCgkJLyogYiBpcyBub3QgYW4gYW5jZXN0b3Igb2YgYS4gICovCgkJaWYg
KGJfdnAgPT0gYV9kdnApIHsKCQkJLyoKCQkJICogV2UgaGF2ZSBhIGRpcmVjdG9yeSBoYXJk
IGxpbmsgYmVmb3JlIHVzLgoJCQkgKiBYWFggV2hhdCBlcnJvciBzaG91bGQgdGhpcyByZXR1
cm4/ICBFREVBRExLPwoJCQkgKiBQYW5pYz8KCQkJICovCgkJCWVycm9yID0gRUlPOwoJCQln
b3RvIGZhaWw0OwoJCX0KCX0KCUtBU1NFUlQoYl92cCAhPSBiX2R2cCk7CglLQVNTRVJUKGJf
dnAgIT0gYV9kdnApOwoKCS8qCgkgKiBXZSd2ZSBsb29rZWQgdXAgYm90aCBub2Rlcy4gIE5v
dyBsb2NrIHRoZW0gYW5kIGNoZWNrIHRoZW0uCgkgKi8KCglpZiAoYV92cCAhPSBOVUxMKSB7
CgkJdm5fbG9jayhhX3ZwLCBMS19FWENMVVNJVkUgfCBMS19SRVRSWSk7CgkJS0FTU0VSVChh
X3ZwLT52X21vdW50ID09IG1wKTsKCQkvKiBSZWZ1c2UgdG8gcmVuYW1lIChvdmVyKSBhIG1v
dW50IHBvaW50LiAgKi8KCQlpZiAoKGFfdnAtPnZfdHlwZSA9PSBWRElSKSAmJiAoYV92cC0+
dl9tb3VudGVkaGVyZSAhPSBOVUxMKSkgewoJCQllcnJvciA9IEVCVVNZOwoJCQlnb3RvIGZh
aWw1OwoJCX0KCX0KCglpZiAoKGJfdnAgIT0gTlVMTCkgJiYgKGJfdnAgIT0gYV92cCkpIHsK
CQl2bl9sb2NrKGJfdnAsIExLX0VYQ0xVU0lWRSB8IExLX1JFVFJZKTsKCQlLQVNTRVJUKGJf
dnAtPnZfbW91bnQgPT0gbXApOwoJCS8qIFJlZnVzZSB0byByZW5hbWUgKG92ZXIpIGEgbW91
bnQgcG9pbnQuICAqLwoJCWlmICgoYl92cC0+dl90eXBlID09IFZESVIpICYmIChiX3ZwLT52
X21vdW50ZWRoZXJlICE9IE5VTEwpKSB7CgkJCWVycm9yID0gRUJVU1k7CgkJCWdvdG8gZmFp
bDY7CgkJfQoJfQoKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKGFfZHZwKSA9PSBMS19FWENMVVNJ
VkUpOwoJS0FTU0VSVChWT1BfSVNMT0NLRUQoYl9kdnApID09IExLX0VYQ0xVU0lWRSk7CglL
QVNTRVJUKGFfbWlzc2luZ19vayB8fCAoYV92cCAhPSBOVUxMKSk7CglLQVNTRVJUKGJfbWlz
c2luZ19vayB8fCAoYl92cCAhPSBOVUxMKSk7CglLQVNTRVJUKChhX3ZwID09IE5VTEwpIHx8
IChWT1BfSVNMT0NLRUQoYV92cCkgPT0gTEtfRVhDTFVTSVZFKSk7CglLQVNTRVJUKChiX3Zw
ID09IE5VTEwpIHx8IChWT1BfSVNMT0NLRUQoYl92cCkgPT0gTEtfRVhDTFVTSVZFKSk7CgoJ
KmFfdnBfcmV0ID0gYV92cDsKCSpiX3ZwX3JldCA9IGJfdnA7CglyZXR1cm4gMDsKCmZhaWw2
OglpZiAoKGJfdnAgIT0gTlVMTCkgJiYgKGJfdnAgIT0gYV92cCkpCgkJVk9QX1VOTE9DSyhi
X3ZwLCAwKTsKZmFpbDU6CWlmIChhX3ZwICE9IE5VTEwpCgkJVk9QX1VOTE9DSyhhX3ZwLCAw
KTsKZmFpbDQ6CWlmIChiX3ZwICE9IE5VTEwpCgkJdnJlbGUoYl92cCk7CmZhaWwzOglWT1Bf
VU5MT0NLKGJfZHZwLCAwKTsKZmFpbDI6CWlmIChhX3ZwICE9IE5VTEwpCgkJdnJlbGUoYV92
cCk7CmZhaWwxOglWT1BfVU5MT0NLKGFfZHZwLCAwKTsKZmFpbDA6CXJldHVybiBlcnJvcjsK
fQoKLyoKICogZ2VuZnNfcmVuYW1lX2V4aXQ6IFVubG9jayBldmVyeXRoaW5nIHdlIGxvY2tl
ZCBmb3IgcmVuYW1lLgogKgogKiBmZHZwIGFuZCB0ZHZwIG11c3QgYmUgcmVmZXJlbmNlZC4K
ICoKICogT24gZW50cnksIGV2ZXJ5dGhpbmcgaXMgbG9ja2VkLCBhbmQgZnZwIGFuZCB0dnAg
cmVmZXJlbmNlZC4KICoKICogT24gZXhpdCwgZXZlcnl0aGluZyBpcyB1bmxvY2tlZCwgYW5k
IGZ2cCBhbmQgdHZwIGFyZSByZWxlYXNlZC4KICovCnN0YXRpYyB2b2lkCmdlbmZzX3JlbmFt
ZV9leGl0KGNvbnN0IHN0cnVjdCBnZW5mc19yZW5hbWVfb3BzICpvcHMsCiAgICBzdHJ1Y3Qg
bW91bnQgKm1wLAogICAgc3RydWN0IHZub2RlICpmZHZwLCBzdHJ1Y3Qgdm5vZGUgKmZ2cCwK
ICAgIHN0cnVjdCB2bm9kZSAqdGR2cCwgc3RydWN0IHZub2RlICp0dnApCnsKCgkodm9pZClv
cHM7CglLQVNTRVJUKG9wcyAhPSBOVUxMKTsKCUtBU1NFUlQobXAgIT0gTlVMTCk7CglLQVNT
RVJUKGZkdnAgIT0gTlVMTCk7CglLQVNTRVJUKGZ2cCAhPSBOVUxMKTsKCUtBU1NFUlQoZmR2
cCAhPSBmdnApOwoJS0FTU0VSVChmZHZwICE9IHR2cCk7CglLQVNTRVJUKHRkdnAgIT0gdHZw
KTsKCUtBU1NFUlQodGR2cCAhPSBmdnApOwoJS0FTU0VSVChWT1BfSVNMT0NLRUQoZmR2cCkg
PT0gTEtfRVhDTFVTSVZFKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKHRkdnApID09IExLX0VY
Q0xVU0lWRSk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRChmdnApID09IExLX0VYQ0xVU0lWRSk7
CglLQVNTRVJUKCh0dnAgPT0gTlVMTCkgfHwgKFZPUF9JU0xPQ0tFRCh0dnApID09IExLX0VY
Q0xVU0lWRSkpOwoKCWlmICgodHZwICE9IE5VTEwpICYmICh0dnAgIT0gZnZwKSkKCQlWT1Bf
VU5MT0NLKHR2cCwgMCk7CglWT1BfVU5MT0NLKGZ2cCwgMCk7CglpZiAodHZwICE9IE5VTEwp
CgkJdnJlbGUodHZwKTsKCWlmICh0ZHZwICE9IGZkdnApCgkJVk9QX1VOTE9DSyh0ZHZwLCAw
KTsKCXZyZWxlKGZ2cCk7CglWT1BfVU5MT0NLKGZkdnAsIDApOwp9CgovKgogKiBnZW5mc19y
ZW5hbWVfcmVtb3ZlOiBSZW1vdmUgdGhlIGVudHJ5IGZvciB0aGUgbm9uLWRpcmVjdG9yeSB2
cCB3aXRoCiAqIGNvbXBvbmVudG5hbWUgY25wIGZyb20gdGhlIGRpcmVjdG9yeSBkdnAsIHVz
aW5nIHRoZSBsb29rdXAgcmVzdWx0cwogKiBkZS4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0
eSBvZiBncm9fcmVtb3ZlIHRvIHB1cmdlIHRoZSBuYW1lIGNhY2hlCiAqIGFuZCBub3RlIGtl
dmVudHMuCiAqCiAqIEV2ZXJ5dGhpbmcgbXVzdCBiZSBsb2NrZWQgYW5kIHJlZmVyZW5jZWQu
CiAqLwpzdGF0aWMgaW50CmdlbmZzX3JlbmFtZV9yZW1vdmUoY29uc3Qgc3RydWN0IGdlbmZz
X3JlbmFtZV9vcHMgKm9wcywKICAgIHN0cnVjdCBtb3VudCAqbXAsIGthdXRoX2NyZWRfdCBj
cmVkLAogICAgc3RydWN0IHZub2RlICpkdnAsIHN0cnVjdCBjb21wb25lbnRuYW1lICpjbnAs
IHZvaWQgKmRlLCBzdHJ1Y3Qgdm5vZGUgKnZwKQp7CglpbnQgZXJyb3I7CgoJS0FTU0VSVChv
cHMgIT0gTlVMTCk7CglLQVNTRVJUKG1wICE9IE5VTEwpOwoJS0FTU0VSVChkdnAgIT0gTlVM
TCk7CglLQVNTRVJUKGNucCAhPSBOVUxMKTsKCUtBU1NFUlQodnAgIT0gTlVMTCk7CglLQVNT
RVJUKGR2cCAhPSB2cCk7CglLQVNTRVJUKGR2cC0+dl90eXBlID09IFZESVIpOwoJS0FTU0VS
VCh2cC0+dl90eXBlICE9IFZESVIpOwoJS0FTU0VSVChkdnAtPnZfbW91bnQgPT0gbXApOwoJ
S0FTU0VSVCh2cC0+dl9tb3VudCA9PSBtcCk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRChkdnAp
ID09IExLX0VYQ0xVU0lWRSk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkgPT0gTEtfRVhD
TFVTSVZFKTsKCgllcnJvciA9IG9wcy0+Z3JvX3JlbW92ZV9jaGVja19wb3NzaWJsZShtcCwg
ZHZwLCB2cCk7CglpZiAoZXJyb3IpCgkJcmV0dXJuIGVycm9yOwoKCWVycm9yID0gb3BzLT5n
cm9fcmVtb3ZlX2NoZWNrX3Blcm1pdHRlZChtcCwgY3JlZCwgZHZwLCB2cCk7CgllcnJvciA9
IGthdXRoX2F1dGhvcml6ZV92bm9kZShjcmVkLCBLQVVUSF9WTk9ERV9ERUxFVEUsIHZwLCBk
dnAsCgkgICAgZXJyb3IpOwoJaWYgKGVycm9yKQoJCXJldHVybiBlcnJvcjsKCgllcnJvciA9
IG9wcy0+Z3JvX3JlbW92ZShtcCwgY3JlZCwgZHZwLCBjbnAsIGRlLCB2cCk7CglpZiAoZXJy
b3IpCgkJcmV0dXJuIGVycm9yOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CmdlbmZzX3Vm
c2xpa2VfY2hlY2tfc3RpY2t5KGthdXRoX2NyZWRfdCwgbW9kZV90LCB1aWRfdCwgc3RydWN0
IHZub2RlICosIHVpZF90KTsKCi8qCiAqIGdlbmZzX3Vmc2xpa2VfcmVuYW1lX2NoZWNrX3Bv
c3NpYmxlOiBDaGVjayB3aGV0aGVyIGEgcmVuYW1lIGlzCiAqIHBvc3NpYmxlIGluZGVwZW5k
ZW50IG9mIGNyZWRlbnRpYWxzLCBhc3N1bWluZyBVRlMtbGlrZSBpbm9kZSBmbGFnCiAqIHNl
bWFudGljcy4gIGNsb2JiZXJfcCBpcyB0cnVlIGlmZiB0aGUgdGFyZ2V0IG5vZGUgYWxyZWFk
eSBleGlzdHMuCiAqLwppbnQKZ2VuZnNfdWZzbGlrZV9yZW5hbWVfY2hlY2tfcG9zc2libGUo
CiAgICB1bnNpZ25lZCBsb25nIGZkZmxhZ3MsIHVuc2lnbmVkIGxvbmcgZmZsYWdzLAogICAg
dW5zaWduZWQgbG9uZyB0ZGZsYWdzLCB1bnNpZ25lZCBsb25nIHRmbGFncywgYm9vbCBjbG9i
YmVyX3AsCiAgICB1bnNpZ25lZCBsb25nIGltbXV0YWJsZSwgdW5zaWduZWQgbG9uZyBhcHBl
bmQpCnsKCglpZiAoKGZkZmxhZ3MgfCBmZmxhZ3MpICYgKGltbXV0YWJsZSB8IGFwcGVuZCkp
CgkJcmV0dXJuIEVQRVJNOwoKCWlmICh0ZGZsYWdzICYgKGltbXV0YWJsZSB8IChjbG9iYmVy
X3A/IGFwcGVuZCA6IDApKSkKCQlyZXR1cm4gRVBFUk07CgoJaWYgKGNsb2JiZXJfcCAmJiAo
dGZsYWdzICYgKGltbXV0YWJsZSB8IGFwcGVuZCkpKQoJCXJldHVybiBFUEVSTTsKCglyZXR1
cm4gMDsKfQoKLyoKICogZ2VuZnNfdWZzbGlrZV9yZW5hbWVfY2hlY2tfcGVybWl0dGVkOiBD
aGVjayB3aGV0aGVyIGEgcmVuYW1lIGlzCiAqIHBlcm1pdHRlZCBnaXZlbiBvdXIgY3JlZGVu
dGlhbHMsIGFzc3VtaW5nIFVGUy1saWtlIHBlcm1pc3Npb24gYW5kCiAqIG93bmVyc2hpcCBz
ZW1hbnRpY3MuCiAqCiAqIFRoZSBvbmx5IHBhaXIgb2Ygdm5vZGVzIHRoYXQgbWF5IGJlIGlk
ZW50aWNhbCBpcyB7ZmR2cCwgdGR2cH0uCiAqCiAqIEV2ZXJ5dGhpbmcgbXVzdCBiZSBsb2Nr
ZWQgYW5kIHJlZmVyZW5jZWQuCiAqLwppbnQKZ2VuZnNfdWZzbGlrZV9yZW5hbWVfY2hlY2tf
cGVybWl0dGVkKGthdXRoX2NyZWRfdCBjcmVkLAogICAgc3RydWN0IHZub2RlICpmZHZwLCBt
b2RlX3QgZmRtb2RlLCB1aWRfdCBmZHVpZCwKICAgIHN0cnVjdCB2bm9kZSAqZnZwLCB1aWRf
dCBmdWlkLAogICAgc3RydWN0IHZub2RlICp0ZHZwLCBtb2RlX3QgdGRtb2RlLCB1aWRfdCB0
ZHVpZCwKICAgIHN0cnVjdCB2bm9kZSAqdHZwLCB1aWRfdCB0dWlkKQp7CglpbnQgZXJyb3I7
CgoJS0FTU0VSVChmZHZwICE9IE5VTEwpOwoJS0FTU0VSVChmdnAgIT0gTlVMTCk7CglLQVNT
RVJUKHRkdnAgIT0gTlVMTCk7CglLQVNTRVJUKGZkdnAgIT0gZnZwKTsKCUtBU1NFUlQoZmR2
cCAhPSB0dnApOwoJS0FTU0VSVCh0ZHZwICE9IGZ2cCk7CglLQVNTRVJUKHRkdnAgIT0gdHZw
KTsKCUtBU1NFUlQoZnZwICE9IHR2cCk7CglLQVNTRVJUKGZkdnAtPnZfdHlwZSA9PSBWRElS
KTsKCUtBU1NFUlQodGR2cC0+dl90eXBlID09IFZESVIpOwoJS0FTU0VSVChmZHZwLT52X21v
dW50ID09IGZ2cC0+dl9tb3VudCk7CglLQVNTRVJUKGZkdnAtPnZfbW91bnQgPT0gdGR2cC0+
dl9tb3VudCk7CglLQVNTRVJUKCh0dnAgPT0gTlVMTCkgfHwgKGZkdnAtPnZfbW91bnQgPT0g
dHZwLT52X21vdW50KSk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRChmZHZwKSA9PSBMS19FWENM
VVNJVkUpOwoJS0FTU0VSVChWT1BfSVNMT0NLRUQoZnZwKSA9PSBMS19FWENMVVNJVkUpOwoJ
S0FTU0VSVChWT1BfSVNMT0NLRUQodGR2cCkgPT0gTEtfRVhDTFVTSVZFKTsKCUtBU1NFUlQo
KHR2cCA9PSBOVUxMKSB8fCAoVk9QX0lTTE9DS0VEKHR2cCkgPT0gTEtfRVhDTFVTSVZFKSk7
CgoJLyoKCSAqIFdlIG5lZWQgdG8gcmVtb3ZlIG9yIGNoYW5nZSBhbiBlbnRyeSBpbiB0aGUg
c291cmNlIGRpcmVjdG9yeS4KCSAqLwoJZXJyb3IgPSBWT1BfQUNDRVNTKGZkdnAsIFZXUklU
RSwgY3JlZCk7CglpZiAoZXJyb3IpCgkJcmV0dXJuIGVycm9yOwoKCS8qCgkgKiBJZiB3ZSBh
cmUgY2hhbmdpbmcgZGlyZWN0b3JpZXMsIHRoZW4gd2UgbmVlZCB0byB3cml0ZSB0byB0aGUK
CSAqIHRhcmdldCBkaXJlY3RvcnkgdG8gYWRkIG9yIGNoYW5nZSBhbiBlbnRyeS4gIEFsc28s
IGlmIGZ2cCBpcwoJICogYSBkaXJlY3RvcnksIHdlIG5lZWQgdG8gd3JpdGUgdG8gaXQgdG8g
Y2hhbmdlIGl0cyBgLi4nCgkgKiBlbnRyeS4KCSAqLwoJaWYgKGZkdnAgIT0gdGR2cCkgewoJ
CWVycm9yID0gVk9QX0FDQ0VTUyh0ZHZwLCBWV1JJVEUsIGNyZWQpOwoJCWlmIChlcnJvcikK
CQkJcmV0dXJuIGVycm9yOwoJCWlmIChmdnAtPnZfdHlwZSA9PSBWRElSKSB7CgkJCWVycm9y
ID0gVk9QX0FDQ0VTUyhmdnAsIFZXUklURSwgY3JlZCk7CgkJCWlmIChlcnJvcikKCQkJCXJl
dHVybiBlcnJvcjsKCQl9Cgl9CgoJZXJyb3IgPSBnZW5mc191ZnNsaWtlX2NoZWNrX3N0aWNr
eShjcmVkLCBmZG1vZGUsIGZkdWlkLCBmdnAsIGZ1aWQpOwoJaWYgKGVycm9yKQoJCXJldHVy
biBlcnJvcjsKCgllcnJvciA9IGdlbmZzX3Vmc2xpa2VfY2hlY2tfc3RpY2t5KGNyZWQsIHRk
bW9kZSwgdGR1aWQsIHR2cCwgdHVpZCk7CglpZiAoZXJyb3IpCgkJcmV0dXJuIGVycm9yOwoK
CXJldHVybiAwOwp9CgovKgogKiBnZW5mc191ZnNsaWtlX3JlbW92ZV9jaGVja19wb3NzaWJs
ZTogQ2hlY2sgd2hldGhlciBhIHJlbW92ZSBpcwogKiBwb3NzaWJsZSBpbmRlcGVuZGVudCBv
ZiBjcmVkZW50aWFscywgYXNzdW1pbmcgVUZTLWxpa2UgaW5vZGUgZmxhZwogKiBzZW1hbnRp
Y3MuCiAqLwppbnQKZ2VuZnNfdWZzbGlrZV9yZW1vdmVfY2hlY2tfcG9zc2libGUodW5zaWdu
ZWQgbG9uZyBkZmxhZ3MsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAgICB1bnNpZ25lZCBsb25n
IGltbXV0YWJsZSwgdW5zaWduZWQgbG9uZyBhcHBlbmQpCnsKCgkvKgoJICogV2Ugd2FudCB0
byBkZWxldGUgdGhlIGVudHJ5LiAgSWYgdGhlIGRpcmVjdG9yeSBpcyBpbW11dGFibGUsCgkg
KiB3ZSBjYW4ndCB3cml0ZSB0byBpdCB0byBkZWxldGUgdGhlIGVudHJ5LiAgSWYgdGhlIGRp
cmVjdG9yeQoJICogaXMgYXBwZW5kLW9ubHksIHRoZSBvbmx5IGNoYW5nZSB3ZSBjYW4gbWFr
ZSBpcyB0byBhZGQKCSAqIGVudHJpZXMsIHNvIHdlIGNhbid0IGRlbGV0ZSBlbnRyaWVzLiAg
SWYgdGhlIG5vZGUgaXMKCSAqIGltbXV0YWJsZSwgd2UgY2FuJ3QgY2hhbmdlIHRoZSBsaW5r
cyB0byBpdCwgc28gd2UgY2FuJ3QKCSAqIGRlbGV0ZSB0aGUgZW50cnkuICBJZiB0aGUgbm9k
ZSBpcyBhcHBlbmQtb25seS4uLndlbGwsIHRoaXMKCSAqIGlzIHdoYXQgVUZTIGRvZXMuCgkg
Ki8KCWlmICgoZGZsYWdzIHwgZmxhZ3MpICYgKGltbXV0YWJsZSB8IGFwcGVuZCkpCgkJcmV0
dXJuIEVQRVJNOwoKCXJldHVybiAwOwp9CgovKgogKiBnZW5mc191ZnNsaWtlX3JlbW92ZV9j
aGVja19wZXJtaXR0ZWQ6IENoZWNrIHdoZXRoZXIgYSByZW1vdmUgaXMKICogcGVybWl0dGVk
IGdpdmVuIG91ciBjcmVkZW50aWFscywgYXNzdW1pbmcgVUZTLWxpa2UgcGVybWlzc2lvbiBh
bmQKICogb3duZXJzaGlwIHNlbWFudGljcy4KICoKICogRXZlcnl0aGluZyBtdXN0IGJlIGxv
Y2tlZCBhbmQgcmVmZXJlbmNlZC4KICovCmludApnZW5mc191ZnNsaWtlX3JlbW92ZV9jaGVj
a19wZXJtaXR0ZWQoa2F1dGhfY3JlZF90IGNyZWQsCiAgICBzdHJ1Y3Qgdm5vZGUgKmR2cCwg
bW9kZV90IGRtb2RlLCB1aWRfdCBkdWlkLAogICAgc3RydWN0IHZub2RlICp2cCwgdWlkX3Qg
dWlkKQp7CglpbnQgZXJyb3I7CgoJS0FTU0VSVChkdnAgIT0gTlVMTCk7CglLQVNTRVJUKHZw
ICE9IE5VTEwpOwoJS0FTU0VSVChkdnAgIT0gdnApOwoJS0FTU0VSVChkdnAtPnZfdHlwZSA9
PSBWRElSKTsKCUtBU1NFUlQodnAtPnZfdHlwZSAhPSBWRElSKTsKCUtBU1NFUlQoZHZwLT52
X21vdW50ID09IHZwLT52X21vdW50KTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKGR2cCkgPT0g
TEtfRVhDTFVTSVZFKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKHZwKSA9PSBMS19FWENMVVNJ
VkUpOwoKCS8qCgkgKiBXZSBuZWVkIHRvIHdyaXRlIHRvIHRoZSBkaXJlY3RvcnkgdG8gcmVt
b3ZlIGZyb20gaXQuCgkgKi8KCWVycm9yID0gVk9QX0FDQ0VTUyhkdnAsIFZXUklURSwgY3Jl
ZCk7CglpZiAoZXJyb3IpCgkJcmV0dXJuIGVycm9yOwoKCWVycm9yID0gZ2VuZnNfdWZzbGlr
ZV9jaGVja19zdGlja3koY3JlZCwgZG1vZGUsIGR1aWQsIHZwLCB1aWQpOwoJaWYgKGVycm9y
KQoJCXJldHVybiBlcnJvcjsKCglyZXR1cm4gMDsKfQoKLyoKICogZ2VuZnNfdWZzbGlrZV9j
aGVja19zdGlja3k6IENoZWNrIHdoZXRoZXIgYSBwYXJ0eSB3aXRoIGNyZWRlbnRpYWxzCiAq
IGNyZWQgbWF5IGNoYW5nZSBhbiBlbnRyeSBpbiBhIHN0aWNreSBkaXJlY3RvcnksIGFzc3Vt
aW5nIFVGUy1saWtlCiAqIHBlcm1pc3Npb24sIG93bmVyc2hpcCwgYW5kIHN0aWNraW5lc3Mg
c2VtYW50aWNzOiBJZiB0aGUgZGlyZWN0b3J5IGlzCiAqIHN0aWNreSBhbmQgdGhlIGVudHJ5
IGV4aXN0cywgdGhlIHVzZXIgbXVzdCBvd24gZWl0aGVyIHRoZSBkaXJlY3RvcnkKICogb3Ig
dGhlIGVudHJ5J3Mgbm9kZSBpbiBvcmRlciB0byBjaGFuZ2UgdGhlIGVudHJ5LgogKgogKiBF
dmVyeXRoaW5nIG11c3QgYmUgbG9ja2VkIGFuZCByZWZlcmVuY2VkLgogKi8KaW50CmdlbmZz
X3Vmc2xpa2VfY2hlY2tfc3RpY2t5KGthdXRoX2NyZWRfdCBjcmVkLCBtb2RlX3QgZG1vZGUs
IHVpZF90IGR1aWQsCiAgICBzdHJ1Y3Qgdm5vZGUgKnZwLCB1aWRfdCB1aWQpCnsKCglpZiAo
KGRtb2RlICYgU19JU1RYVCkgJiYgKHZwICE9IE5VTEwpKQoJCXJldHVybiBnZW5mc19jYW5f
c3RpY2t5KGNyZWQsIGR1aWQsIHVpZCk7CgoJcmV0dXJuIDA7Cn0KAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdG1wZnMtcGF0Y2gvc3JjL3N5cy9mcy90bXBmcy90
bXBmc192bm9wcy5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAADAxMDA0NDQAMDAwMDAwMAAwMDAwMDAwADAwMDAwMDA2MzUyADEy
MDI2MjY2NTIzADAwMjAwMzEAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAB1c3RhciAgAHJvb3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hl
ZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvKgkk
TmV0QlNEOiB0bXBmc192bm9wcy5oLHYgMS4xMyAyMDExLzA1LzI0IDIwOjE3OjQ5IHJtaW5k
IEV4cCAkCSovCgovKgogKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgVGhlIE5ldEJTRCBG
b3VuZGF0aW9uLCBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgY29k
ZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gVGhlIE5ldEJTRCBG
b3VuZGF0aW9uCiAqIGJ5IEp1bGlvIE0uIE1lcmlubyBWaWRhbCwgZGV2ZWxvcGVkIGFzIHBh
cnQgb2YgR29vZ2xlJ3MgU3VtbWVyIG9mIENvZGUKICogMjAwNSBwcm9ncmFtLgogKgogKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQog
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IFRIRSBORVRCU0QgRk9VTkRBVElPTiwgSU5DLiBBTkQgQ09OVFJJQlVUT1JTCiAqIGBgQVMg
SVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRAogKiBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEZPVU5EQVRJT04gT1IgQ09O
VFJJQlVUT1JTCiAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTCiAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCiAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCiAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCiAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgogKi8KCiNpZm5kZWYgX0ZTX1RNUEZTX1RNUEZTX1ZOT1BTX0hfCiNkZWZpbmUgX0ZT
X1RNUEZTX1RNUEZTX1ZOT1BTX0hfCgojaWYgIWRlZmluZWQoX0tFUk5FTCkKI2Vycm9yIG5v
dCBzdXBwb3NlZCB0byBiZSBleHBvc2VkIHRvIHVzZXJsYW5kLgojZW5kaWYKCiNpbmNsdWRl
IDxtaXNjZnMvZ2VuZnMvZ2VuZnMuaD4KCi8qCiAqIERlY2xhcmF0aW9ucyBmb3IgdG1wZnNf
dm5vcHMuYy4KICovCgpleHRlcm4gaW50ICgqKnRtcGZzX3Zub2Rlb3BfcCkodm9pZCAqKTsK
CmludAl0bXBmc19sb29rdXAJCSh2b2lkICopOwppbnQJdG1wZnNfY3JlYXRlCQkodm9pZCAq
KTsKaW50CXRtcGZzX21rbm9kCQkodm9pZCAqKTsKaW50CXRtcGZzX29wZW4JCSh2b2lkICop
OwppbnQJdG1wZnNfY2xvc2UJCSh2b2lkICopOwppbnQJdG1wZnNfYWNjZXNzCQkodm9pZCAq
KTsKaW50CXRtcGZzX2dldGF0dHIJCSh2b2lkICopOwppbnQJdG1wZnNfc2V0YXR0cgkJKHZv
aWQgKik7CmludAl0bXBmc19yZWFkCQkodm9pZCAqKTsKaW50CXRtcGZzX3dyaXRlCQkodm9p
ZCAqKTsKI2RlZmluZQl0bXBmc19mY250bAkJZ2VuZnNfZmNudGwKI2RlZmluZQl0bXBmc19p
b2N0bAkJZ2VuZnNfZW5vaW9jdGwKI2RlZmluZQl0bXBmc19wb2xsCQlnZW5mc19wb2xsCiNk
ZWZpbmUJdG1wZnNfa3FmaWx0ZXIJCWdlbmZzX2txZmlsdGVyCiNkZWZpbmUJdG1wZnNfcmV2
b2tlCQlnZW5mc19yZXZva2UKI2RlZmluZQl0bXBmc19tbWFwCQlnZW5mc19tbWFwCmludAl0
bXBmc19mc3luYwkJKHZvaWQgKik7CiNkZWZpbmUJdG1wZnNfc2VlawkJZ2VuZnNfc2Vlawpp
bnQJdG1wZnNfcmVtb3ZlCQkodm9pZCAqKTsKaW50CXRtcGZzX2xpbmsJCSh2b2lkICopOwpp
bnQJdG1wZnNfcmVuYW1lCQkodm9pZCAqKTsKaW50CXRtcGZzX21rZGlyCQkodm9pZCAqKTsK
aW50CXRtcGZzX3JtZGlyCQkodm9pZCAqKTsKaW50CXRtcGZzX3N5bWxpbmsJCSh2b2lkICop
OwppbnQJdG1wZnNfcmVhZGRpcgkJKHZvaWQgKik7CmludAl0bXBmc19yZWFkbGluawkJKHZv
aWQgKik7CiNkZWZpbmUJdG1wZnNfYWJvcnRvcAkJZ2VuZnNfYWJvcnRvcAppbnQJdG1wZnNf
aW5hY3RpdmUJCSh2b2lkICopOwppbnQJdG1wZnNfcmVjbGFpbQkJKHZvaWQgKik7CiNpZiAw
IC8vIG5lZWQgdXBkYXRlZCB2ZXJzaW9uIC0gc28gdXNlIG93biBmdW5jdGlvbnMKI2RlZmlu
ZQl0bXBmc19sb2NrCQlnZW5mc19sb2NrCiNkZWZpbmUJdG1wZnNfdW5sb2NrCQlnZW5mc191
bmxvY2sKI2Vsc2UKaW50CXRtcGZzX2xvY2sJCSh2b2lkICopOwppbnQJdG1wZnNfdW5sb2Nr
CQkodm9pZCAqKTsKI2VuZGlmCiNkZWZpbmUJdG1wZnNfYm1hcAkJZ2VuZnNfZW9wbm90c3Vw
cAojZGVmaW5lCXRtcGZzX3N0cmF0ZWd5CQlnZW5mc19lb3Bub3RzdXBwCmludAl0bXBmc19w
cmludAkJKHZvaWQgKik7CmludAl0bXBmc19wYXRoY29uZgkJKHZvaWQgKik7CiNkZWZpbmUJ
dG1wZnNfaXNsb2NrZWQJCWdlbmZzX2lzbG9ja2VkCmludAl0bXBmc19hZHZsb2NrCQkodm9p
ZCAqKTsKI2RlZmluZQl0bXBmc19id3JpdGUJCWdlbmZzX251bGxvcAppbnQJdG1wZnNfZ2V0
cGFnZXMJCSh2b2lkICopOwppbnQJdG1wZnNfcHV0cGFnZXMJCSh2b2lkICopOwppbnQJdG1w
ZnNfd2hpdGVvdXQJCSh2b2lkICopOwoKI2VuZGlmIC8qIF9GU19UTVBGU19UTVBGU19WTk9Q
U19IXyAqLwoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAHRtcGZzLXBhdGNoL3NyYy9zeXMvbGttAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAwMDQwNzU1ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDAwMDAwMAAxMjAyNDYzNDE2
MwAwMDE0MjQxADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAdXN0YXIgIAByb290AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdG1wZnMtcGF0Y2gv
c3JjL3N5cy9sa20vdmZzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwNDA3NTUAMDAwMDAwMAAwMDAw
MDAwADAwMDAwMDAwMDAwADEyMDI0NjM0MTYzADAwMTUwMzcANQAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHJvb3QAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAB0bXBmcy1wYXRjaC9zcmMvc3lzL2xrbS92ZnMvdG1wZnMAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAMDA0MDc1NQAwMDAwMDAwADAwMDAwMDAAMDAwMDAwMDAwMDAAMTIwMjcwMTA0NzUA
MDAxNjE2NQA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AHVzdGFyICAAcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRtcGZzLXBhdGNoL3Ny
Yy9zeXMvbGttL3Zmcy90bXBmcy9NYWtlZmlsZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNDQ0ADAwMDAwMDAAMDAwMDAw
MAAwMDAwMDAwMDQ0NAAxMjAyNDYzNDQwNwAwMDE3NzA1ADAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAByb290AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAIwkkTmV0QlNEOiBNYWtlZmlsZSx2IDEuMSAyMDA2LzExLzA1IDIyOjQy
OjE0IGptbXYgRXhwICQKCi5pbmNsdWRlICIuLi9NYWtlZmlsZS5pbmMiCgouUEFUSDoJJFMv
ZnMvdG1wZnMgJHsuQ1VSRElSfS8uLgoKS01PRD0JdG1wZnMKClNSQ1M9CWxrbWluaXRfdmZz
LmMKU1JDUys9CXRtcGZzX2ZpZm9vcHMuYyB0bXBmc19tZW0uYyB0bXBmc19zcGVjb3BzLmMg
dG1wZnNfc3Vici5jClNSQ1MrPQl0bXBmc19yZW5hbWUuYyB0bXBmc192ZnNvcHMuYyB0bXBm
c192bm9wcy5jCgouaW5jbHVkZSA8YnNkLmttb2QubWs+CgAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0bXBmcy1wYXRjaC9zcmMv
c3lzL3J1bXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDA0MDc1NQAwMDAwMDAwADAwMDAwMDAA
MDAwMDAwMDAwMDAAMTIwMjQ2MDUxMzUAMDAxNDQzNgA1AAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAcm9vdAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHRtcGZzLXBhdGNoL3NyYy9zeXMvcnVtcC9mcwAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAwMDQwNzU1ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDAwMDAwMAAxMjAyNDYwNTE0NwAwMDE1
MDUxADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0
YXIgIAByb290AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdG1wZnMtcGF0Y2gvc3JjL3N5
cy9ydW1wL2ZzL2xpYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwNDA3NTUAMDAwMDAwMAAwMDAwMDAwADAw
MDAwMDAwMDAwADEyMDI0NjA1MTYxADAwMTU2MTMANQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHJvb3QAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAB0bXBmcy1wYXRjaC9zcmMvc3lzL3J1bXAvZnMvbGliL2xpYnRtcGZzAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
MDA0MDc1NQAwMDAwMDAwADAwMDAwMDAAMDAwMDAwMDAwMDAAMTIwMjcwMTA0NzUAMDAxNzQz
NAA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFy
ICAAcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRtcGZzLXBhdGNoL3NyYy9zeXMv
cnVtcC9mcy9saWIvbGlidG1wZnMvTWFrZWZpbGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNDQ0ADAwMDAwMDAAMDAwMDAwMAAwMDAw
MDAwMDQzMQAxMjAyNDYwNTMxMgAwMDIxMTQxADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAByb290AAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAIwkkTmV0QlNEOiBNYWtlZmlsZSx2IDEuNSAwMTIvMDUvMDkgMDA6MTY6MDcgcmlh
c3RyYWRoIEV4cCAkCiMKCi5QQVRIOgkkey5DVVJESVJ9Ly4uLy4uLy4uLy4uL2ZzL3RtcGZz
CgpMSUI9CXJ1bXBmc190bXBmcwoKU1JDUz0JdG1wZnNfZmlmb29wcy5jIHRtcGZzX3NwZWNv
cHMuYyB0bXBmc192ZnNvcHMuYyB0bXBmc19tZW0uYyBcCgl0bXBmc19yZW5hbWUuYyB0bXBm
c19zdWJyLmMgdG1wZnNfdm5vcHMuYwoKLmluY2x1ZGUgPGJzZC5saWIubWs+Ci5pbmNsdWRl
IDxic2Qua2xpbmtzLm1rPgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0bXBmcy1wYXRjaC9zcmMvc3lzL21v
ZHVsZXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDA0MDc1NQAwMDAwMDAwADAwMDAwMDAAMDAwMDAw
MDAwMDAAMTIwMjQ2MzQxNjMAMDAxNTEyNgA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAHRtcGZzLXBhdGNoL3NyYy9zeXMvbW9kdWxlcy90bXBmcwAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDQw
NzU1ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDAwMDAwMAAxMjAyNzAxMDQ3NQAwMDE2MjU0ADUA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIABy
b290AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdG1wZnMtcGF0Y2gvc3JjL3N5cy9tb2R1
bGVzL3RtcGZzL01ha2VmaWxlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA0NDQAMDAwMDAwMAAwMDAwMDAwADAwMDAwMDAw
NDAzADEyMDI0NjM0MjQzADAwMTc3NjUAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHJvb3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAjCSROZXRCU0Q6IE1ha2VmaWxlLHYgMS4xIDIwMDgvMDYvMjggMTY6MTE6MzYgcnVtYmxl
IEV4cCAkCgouaW5jbHVkZSAiLi4vTWFrZWZpbGUuaW5jIgoKLlBBVEg6CSR7U30vZnMvdG1w
ZnMKCktNT0Q9CXRtcGZzClNSQ1M9CXRtcGZzX2ZpZm9vcHMuYyB0bXBmc19yZW5hbWUuYyB0
bXBmc19zcGVjb3BzLmMgdG1wZnNfc3Vici5jIFwKCXRtcGZzX21lbS5jIHRtcGZzX3Zmc29w
cy5jIHRtcGZzX3Zub3BzLmMKCi5pbmNsdWRlIDxic2Qua21vZHVsZS5taz4KAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRtcGZzLXBhdGNoL2luc3RhbGwtaXQAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNzQ0ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDAwMDc3
NQAxMjAyNzAxMzEzMAAwMDE0MTI2ADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAdXN0YXIgIAByb290AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
IyEvYmluL3NoCgpkbj0iYGRpcm5hbWUgJDBgIgoKaWYgWyAhIC1kICIkZG4vc3JjIiBdOyB0
aGVuCiAgZWNobyAiY2Fubm90IGZpbmQgc3JjLWRpciBmb3IgcGF0Y2hlcyAtIGV4aXRpbmci
CiAgZXhpdCAxCmZpCgpwZD0iL3Vzci9zcmMiCmlmIFsgISAtZCAiJHBkLy4iIF07IHRoZW4K
ICBlY2hvICJjYW5ub3QgZmluZCBkaXIgdG8gcGF0Y2ggLSBleGl0aW5nIgogIGV4aXQgMQpm
aQoKKGNkICIkZG4vc3JjIjsgZmluZCAuIC10eXBlIGYgLXByaW50KSB8IHdoaWxlIHJlYWQg
ZjsgZG8KICBpZiBbIC1mICIkcGQvJGYiIF07IHRoZW4KICAgIGlmIFsgLWYgIiRwZC8kZi1i
ZWZvcmUtdG1wZnMtcGF0Y2giIF07IHRoZW4KICAgICAgZWNobyAiV0FSTklORzogYmFja3Vw
LWZpbGUgZm9yICckZicgYWxyZWFkeSBwcmVzZW50IgogICAgZWxzZQogICAgICBtdiAiJHBk
LyRmIiAiJHBkLyRmLWJlZm9yZS10bXBmcy1wYXRjaCIKICAgIGZpCiAgZmkKICBjcCAiJGRu
L3NyYy8kZiIgIiRwZC8kZiIKZG9uZQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
--------------030801010402050202010402--
Home |
Main Index |
Thread Index |
Old Index