Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 25 Aug 2013 22:30:01 +0800
From:      Chenchong Qin <qinchenchong@gmail.com>
To:        Adrian Chadd <adrian@freebsd.org>
Cc:        "freebsd-wireless@freebsd.org" <freebsd-wireless@freebsd.org>
Subject:   Re: Chenchong's work on net80211_ratectl
Message-ID:  <CAFnsE3eMrwpo=hcFb9XfpLL53Ppso%2B%2BXTBfpieP8FGejAKW1_w@mail.gmail.com>
In-Reply-To: <CAFnsE3cS_2Ad1geQQ0UB4doEgqVfhNBMi6j4fCRpFgQqcu2kJw@mail.gmail.com>
References:  <CAFnsE3dYdPf5yGTFH683Q1Zh0mc-g%2B_YtCTraNNt28z2vBoSKw@mail.gmail.com> <CAJ-Vmom4sY7jcNwWmJkrDwfWjsok2fk8UEwTi5A=egj1JyerLw@mail.gmail.com> <CAFnsE3cyg=msBfQqqKUMmLABSL=j24VoMBwbBjxQ6b7Dyy7Mqg@mail.gmail.com> <CAJ-Vmo=k8NddAYyAJCkx4eOaA_8XsSxg6uKrdddx%2BgmeT%2BX9KA@mail.gmail.com> <CAFnsE3eaOyRcO3LXSi3L=jbzpyMv5Nt_jRGKt_mmA0WV-EV5vA@mail.gmail.com> <CAJ-VmokdxLhK5x6kO=jJzk-dv61EDK-ZgmndOimoyWWf76HiZA@mail.gmail.com> <CAJ-VmonMjR5iVTMVN9532d%2BPqOXWNUoZvxPtQir5h=yGxU-XdQ@mail.gmail.com> <CAFnsE3d9nG-X2b=z1srKfTtpxC3w5L%2B6Hg3TbOnAQrJN%2Bt19GA@mail.gmail.com> <CAJ-VmokF6hPtg9FoEdeJXLLaZRNhzd=nr_o6nHE%2BjYiQKTg3zQ@mail.gmail.com> <CAFnsE3eMwX-GiRzJt8jk4r9mxwSAQkcrDwk%2BnWVG7q6dabeA3A@mail.gmail.com> <CAJ-Vmo=mzvS0UBC7fGx2t501%2Bfioi4DJcw8qobOpbYOUiraqGg@mail.gmail.com> <CAFnsE3df=1WEuLZh5355v_K2eBgcuBbpoza74Y-5vvNupBz22A@mail.gmail.com> <CAJ-VmokyXwkKLdsJw74bux7G5EJSRvFhugTcLR9BgXfw4ysYRg@mail.gmail.com> <CAJ-VmokU=ZXysjZfAJ-REZL7kwg-_Z-LeAKca7AefONW_O1E5A@mail.gmail.com> <CAFnsE3cS_2Ad1geQQ0UB4doEgqVfhNBMi6j4fCRpFgQqcu2kJw@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
--20cf3071c88693e1e004e4c679b2
Content-Type: text/plain; charset=ISO-8859-1

Hi!

This is the latest update.

* add a simple per vap ratectl statistic tracker and api to update it.
* port irn_capabilities to irs_capabilities in struct ieee80211_rc_stat.
  perhaps the capabilities field needs to be within ieee80211_rc_stat as
  a per vap atrribute. corresponding updates performed.
* add ieee80211_ratectl_none.h to record common ratectl state.

Thanks!

Chenchong


On Thu, Aug 15, 2013 at 8:03 PM, Chenchong Qin <qinchenchong@gmail.com>wrote:

> Hi!
>
> Here is my latest update. In this update:
>
> * add a new struct, ieee80211_ratectl_node. This is the common state that
> all per node rc
>   state, i.e. ieee80211_[amrr|sample]_node, should contains it as the
> first field. It's now used to store
>   the capabilities. see below.
> * rename ir_capabilities to irn_capabilities and move it to
> ieee80211_ratectl_node (it contained in
>   ieee80211_[amrr|sample]_node). ieee80211_ratectl is readonly, so
> ir_capabilities can't be set. And,
>   the capabilities is not a part of rc algo. It seems that it should be
> put in the per node rc state. Interface
>   of ieee80211_ratectl_node_init() and its callers  are updated.
> References to ir_capabilities are also adapted.
> * add ieee80211_ratectl_[node_is11n|get_rateset] to the ratectl api. rc
> algoes all need these functions.
> * change the naming conversion of IEEE80211_RATECTL_FLAG_*.
> * some errors fixed.
>
>
> On Thu, Aug 15, 2013 at 12:58 AM, Adrian Chadd <adrian@freebsd.org> wrote:
>
>> Hi!
>>
>> So yes, we do need to have a generic way of returning that completion
>> information to the rate control code.
>>
>> I'm all for you churning the rate control API to return a struct
>> ieee80211_rc_info in the complete function and totally just kill arg1/arg2.
>> That forces us to extend ieee80211_rc_info to be "right" for all the
>> drivers.
>>
>
> Do you mean drop arg1/arg2 and pass pointer of ieee80211_rc_info to the
> complete function directly? Or return it
> when complete function return?
>
>
>> What wifi devices do you have there? It looks like we're almost at the
>> point where we can start converting a few things to use the modified rate
>> control API and modules - notably iwn (which won't use the multi-rate retry
>> stuff to begin with - it works "differently"..) and ath (which will use the
>> multi-rate retry stuff and the sample rate control module.)
>>
>
> Yeah, I have an AR9227 device at hand.
>
> And, I also get a question here. The ieee80211_ratetable doesn't get a
> rateCode field. So, how we get the
> ratecode of the non_ht rate?
>
> Thanks!
>
> Chenchong
>
>

--20cf3071c88693e1e004e4c679b2
Content-Type: application/octet-stream; 
	name="20130825-net80211-ratectl.diff"
Content-Disposition: attachment; filename="20130825-net80211-ratectl.diff"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_hkscsnzn1

SW5kZXg6IHN5cy9kZXYvaXduL2lmX2l3bi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9kZXYvaXduL2lm
X2l3bi5jCShyZXZpc2lvbiAyNTQ4MjYpCisrKyBzeXMvZGV2L2l3bi9pZl9pd24uYwkod29ya2lu
ZyBjb3B5KQpAQCAtODc2LDcgKzg3Niw4IEBACiAJaXZwLT5pdl9uZXdzdGF0ZSA9IHZhcC0+aXZf
bmV3c3RhdGU7CiAJdmFwLT5pdl9uZXdzdGF0ZSA9IGl3bl9uZXdzdGF0ZTsKIAotCWllZWU4MDIx
MV9yYXRlY3RsX2luaXQodmFwKTsKKwkvKiBYWFggVE9ETyBmaWxsIHRoZSBjYXAgKi8KKwlpZWVl
ODAyMTFfcmF0ZWN0bF9pbml0KHZhcCwgMCk7CiAJLyogQ29tcGxldGUgc2V0dXAuICovCiAJaWVl
ZTgwMjExX3ZhcF9hdHRhY2godmFwLCBpd25fbWVkaWFfY2hhbmdlLCBpZWVlODAyMTFfbWVkaWFf
c3RhdHVzKTsKIAlpYy0+aWNfb3Btb2RlID0gb3Btb2RlOwpJbmRleDogc3lzL2Rldi9id2kvaWZf
YndpLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gc3lzL2Rldi9id2kvaWZfYndpLmMJKHJldmlzaW9uIDI1NDgy
NikKKysrIHN5cy9kZXYvYndpL2lmX2J3aS5jCSh3b3JraW5nIGNvcHkpCkBAIC02MTcsNyArNjE3
LDggQEAKICNpZiAwCiAJdmFwLT5pdl91cGRhdGVfYmVhY29uID0gYndpX2JlYWNvbl91cGRhdGU7
CiAjZW5kaWYKLQlpZWVlODAyMTFfcmF0ZWN0bF9pbml0KHZhcCk7CisJLyogWFhYIFRPRE8gZmls
bCB0aGUgY2FwICovCisJaWVlZTgwMjExX3JhdGVjdGxfaW5pdCh2YXAsIDApOwogCiAJLyogY29t
cGxldGUgc2V0dXAgKi8KIAlpZWVlODAyMTFfdmFwX2F0dGFjaCh2YXAsIGJ3aV9tZWRpYV9jaGFu
Z2UsIGllZWU4MDIxMV9tZWRpYV9zdGF0dXMpOwpJbmRleDogc3lzL2Rldi9id24vaWZfYnduLmMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gc3lzL2Rldi9id24vaWZfYnduLmMJKHJldmlzaW9uIDI1NDgyNikKKysr
IHN5cy9kZXYvYnduL2lmX2J3bi5jCSh3b3JraW5nIGNvcHkpCkBAIC0yOTcwLDcgKzI5NzAsOCBA
QAogCS8qIG92ZXJyaWRlIG1heCBhaWQgc28gc3RhJ3MgY2Fubm90IGFzc29jIHdoZW4gd2UncmUg
b3V0IG9mIHN0YSBpZCdzICovCiAJdmFwLT5pdl9tYXhfYWlkID0gQldOX1NUQUlEX01BWDsKIAot
CWllZWU4MDIxMV9yYXRlY3RsX2luaXQodmFwKTsKKwkvKiBYWFggVE9ETyBmaWxsIHRoZSBjYXAg
Ki8KKwlpZWVlODAyMTFfcmF0ZWN0bF9pbml0KHZhcCwgMCk7CiAKIAkvKiBjb21wbGV0ZSBzZXR1
cCAqLwogCWllZWU4MDIxMV92YXBfYXR0YWNoKHZhcCwgaWVlZTgwMjExX21lZGlhX2NoYW5nZSwK
SW5kZXg6IHN5cy9kZXYvdXNiL3dsYW4vaWZfdXJhbC5jCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9kZXYv
dXNiL3dsYW4vaWZfdXJhbC5jCShyZXZpc2lvbiAyNTQ4MjYpCisrKyBzeXMvZGV2L3VzYi93bGFu
L2lmX3VyYWwuYwkod29ya2luZyBjb3B5KQpAQCAtNTk4LDcgKzU5OCw4IEBACiAKIAl1c2JfY2Fs
bG91dF9pbml0X210eCgmdXZwLT5yYXRlY3RsX2NoLCAmc2MtPnNjX210eCwgMCk7CiAJVEFTS19J
TklUKCZ1dnAtPnJhdGVjdGxfdGFzaywgMCwgdXJhbF9yYXRlY3RsX3Rhc2ssIHV2cCk7Ci0JaWVl
ZTgwMjExX3JhdGVjdGxfaW5pdCh2YXApOworCS8qIFhYWCBUT0RPIGZpbGwgdGhlIGNhcCAqLwor
CWllZWU4MDIxMV9yYXRlY3RsX2luaXQodmFwLCAwKTsKIAlpZWVlODAyMTFfcmF0ZWN0bF9zZXRp
bnRlcnZhbCh2YXAsIDEwMDAgLyogMSBzZWMgKi8pOwogCiAJLyogY29tcGxldGUgc2V0dXAgKi8K
SW5kZXg6IHN5cy9kZXYvdXNiL3dsYW4vaWZfcnVtLmMKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL2Rldi91
c2Ivd2xhbi9pZl9ydW0uYwkocmV2aXNpb24gMjU0ODI2KQorKysgc3lzL2Rldi91c2Ivd2xhbi9p
Zl9ydW0uYwkod29ya2luZyBjb3B5KQpAQCAtNjEzLDcgKzYxMyw4IEBACiAKIAl1c2JfY2FsbG91
dF9pbml0X210eCgmcnZwLT5yYXRlY3RsX2NoLCAmc2MtPnNjX210eCwgMCk7CiAJVEFTS19JTklU
KCZydnAtPnJhdGVjdGxfdGFzaywgMCwgcnVtX3JhdGVjdGxfdGFzaywgcnZwKTsKLQlpZWVlODAy
MTFfcmF0ZWN0bF9pbml0KHZhcCk7CisJLyogWFhYIFRPRE8gZmlsbCB0aGUgY2FwICovCisJaWVl
ZTgwMjExX3JhdGVjdGxfaW5pdCh2YXAsIDApOwogCWllZWU4MDIxMV9yYXRlY3RsX3NldGludGVy
dmFsKHZhcCwgMTAwMCAvKiAxIHNlYyAqLyk7CiAJLyogY29tcGxldGUgc2V0dXAgKi8KIAlpZWVl
ODAyMTFfdmFwX2F0dGFjaCh2YXAsIGllZWU4MDIxMV9tZWRpYV9jaGFuZ2UsIGllZWU4MDIxMV9t
ZWRpYV9zdGF0dXMpOwpJbmRleDogc3lzL2Rldi91c2Ivd2xhbi9pZl9ydW4uYwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBzeXMvZGV2L3VzYi93bGFuL2lmX3J1bi5jCShyZXZpc2lvbiAyNTQ4MjYpCisrKyBzeXMv
ZGV2L3VzYi93bGFuL2lmX3J1bi5jCSh3b3JraW5nIGNvcHkpCkBAIC04MjAsNyArODIwLDggQEAK
IAlydnAtPm5ld3N0YXRlID0gdmFwLT5pdl9uZXdzdGF0ZTsKIAl2YXAtPml2X25ld3N0YXRlID0g
cnVuX25ld3N0YXRlOwogCi0JaWVlZTgwMjExX3JhdGVjdGxfaW5pdCh2YXApOworCS8qIFhYWCBU
T0RPIGZpbGwgdGhlIGNhcCAqLworCWllZWU4MDIxMV9yYXRlY3RsX2luaXQodmFwLCAwKTsKIAlp
ZWVlODAyMTFfcmF0ZWN0bF9zZXRpbnRlcnZhbCh2YXAsIDEwMDAgLyogMSBzZWMgKi8pOwogCiAJ
LyogY29tcGxldGUgc2V0dXAgKi8KSW5kZXg6IHN5cy9kZXYvdXNiL3dsYW4vaWZfenlkLmMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gc3lzL2Rldi91c2Ivd2xhbi9pZl96eWQuYwkocmV2aXNpb24gMjU0ODI2KQor
Kysgc3lzL2Rldi91c2Ivd2xhbi9pZl96eWQuYwkod29ya2luZyBjb3B5KQpAQCAtNDk2LDcgKzQ5
Niw4IEBACiAJenZwLT5uZXdzdGF0ZSA9IHZhcC0+aXZfbmV3c3RhdGU7CiAJdmFwLT5pdl9uZXdz
dGF0ZSA9IHp5ZF9uZXdzdGF0ZTsKIAotCWllZWU4MDIxMV9yYXRlY3RsX2luaXQodmFwKTsKKwkv
KiBYWFggVE9ETyBmaWxsIHRoZSBjYXAgKi8KKwlpZWVlODAyMTFfcmF0ZWN0bF9pbml0KHZhcCwg
MCk7CiAJaWVlZTgwMjExX3JhdGVjdGxfc2V0aW50ZXJ2YWwodmFwLCAxMDAwIC8qIDEgc2VjICov
KTsKIAogCS8qIGNvbXBsZXRlIHNldHVwICovCkluZGV4OiBzeXMvZGV2L3dwaS9pZl93cGkuYwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBzeXMvZGV2L3dwaS9pZl93cGkuYwkocmV2aXNpb24gMjU0ODI2KQorKysg
c3lzL2Rldi93cGkvaWZfd3BpLmMJKHdvcmtpbmcgY29weSkKQEAgLTc4Miw3ICs3ODIsOCBAQAog
CXd2cC0+bmV3c3RhdGUgPSB2YXAtPml2X25ld3N0YXRlOwogCXZhcC0+aXZfbmV3c3RhdGUgPSB3
cGlfbmV3c3RhdGU7CiAKLQlpZWVlODAyMTFfcmF0ZWN0bF9pbml0KHZhcCk7CisJLyogWFhYIFRP
RE8gZmlsbCB0aGUgY2FwICovCisJaWVlZTgwMjExX3JhdGVjdGxfaW5pdCh2YXAsIDApOwogCS8q
IGNvbXBsZXRlIHNldHVwICovCiAJaWVlZTgwMjExX3ZhcF9hdHRhY2godmFwLCBpZWVlODAyMTFf
bWVkaWFfY2hhbmdlLCBpZWVlODAyMTFfbWVkaWFfc3RhdHVzKTsKIAlpYy0+aWNfb3Btb2RlID0g
b3Btb2RlOwpJbmRleDogc3lzL2Rldi9yYWwvcnQyNTYwLmMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL2Rl
di9yYWwvcnQyNTYwLmMJKHJldmlzaW9uIDI1NDgyNikKKysrIHN5cy9kZXYvcmFsL3J0MjU2MC5j
CSh3b3JraW5nIGNvcHkpCkBAIC00MjYsNyArNDI2LDggQEAKIAl2YXAtPml2X25ld3N0YXRlID0g
cnQyNTYwX25ld3N0YXRlOwogCXZhcC0+aXZfdXBkYXRlX2JlYWNvbiA9IHJ0MjU2MF9iZWFjb25f
dXBkYXRlOwogCi0JaWVlZTgwMjExX3JhdGVjdGxfaW5pdCh2YXApOworCS8qIFhYWCBUT0RPIGZp
bGwgdGhlIGNhcCAqLworCWllZWU4MDIxMV9yYXRlY3RsX2luaXQodmFwLCAwKTsKIAkvKiBjb21w
bGV0ZSBzZXR1cCAqLwogCWllZWU4MDIxMV92YXBfYXR0YWNoKHZhcCwgaWVlZTgwMjExX21lZGlh
X2NoYW5nZSwgaWVlZTgwMjExX21lZGlhX3N0YXR1cyk7CiAJaWYgKFRBSUxRX0ZJUlNUKCZpYy0+
aWNfdmFwcykgPT0gdmFwKQpJbmRleDogc3lzL2Rldi9yYWwvcnQyNjYxLmMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gc3lzL2Rldi9yYWwvcnQyNjYxLmMJKHJldmlzaW9uIDI1NDgyNikKKysrIHN5cy9kZXYvcmFs
L3J0MjY2MS5jCSh3b3JraW5nIGNvcHkpCkBAIC00MjMsNyArNDIzLDggQEAKIAl2YXAtPml2X3Vw
ZGF0ZV9iZWFjb24gPSBydDI2NjFfYmVhY29uX3VwZGF0ZTsKICNlbmRpZgogCi0JaWVlZTgwMjEx
X3JhdGVjdGxfaW5pdCh2YXApOworCS8qIFhYWCBUT0RPIGZpbGwgdGhlIGNhcCAqLworCWllZWU4
MDIxMV9yYXRlY3RsX2luaXQodmFwLCAwKTsKIAkvKiBjb21wbGV0ZSBzZXR1cCAqLwogCWllZWU4
MDIxMV92YXBfYXR0YWNoKHZhcCwgaWVlZTgwMjExX21lZGlhX2NoYW5nZSwgaWVlZTgwMjExX21l
ZGlhX3N0YXR1cyk7CiAJaWYgKFRBSUxRX0ZJUlNUKCZpYy0+aWNfdmFwcykgPT0gdmFwKQpJbmRl
eDogc3lzL2Rldi9yYWwvcnQyODYwLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL2Rldi9yYWwvcnQyODYw
LmMJKHJldmlzaW9uIDI1NDgyNikKKysrIHN5cy9kZXYvcmFsL3J0Mjg2MC5jCSh3b3JraW5nIGNv
cHkpCkBAIC00ODQsNyArNDg0LDggQEAKIAkvKiBIVyBzdXBwb3J0cyB1cCB0byAyNTUgU1RBcyAo
MC0yNTQpIGluIEhvc3RBUCBhbmQgSUJTUyBtb2RlcyAqLwogCXZhcC0+aXZfbWF4X2FpZCA9IG1p
bihJRUVFODAyMTFfQUlEX01BWCwgUlQyODYwX1dDSURfTUFYKTsKIAotCWllZWU4MDIxMV9yYXRl
Y3RsX2luaXQodmFwKTsKKwkvKiBYWFggVE9ETyBmaWxsIHRoZSBjYXAgKi8KKwlpZWVlODAyMTFf
cmF0ZWN0bF9pbml0KHZhcCwgMCk7CiAJLyogY29tcGxldGUgc2V0dXAgKi8KIAlpZWVlODAyMTFf
dmFwX2F0dGFjaCh2YXAsIGllZWU4MDIxMV9tZWRpYV9jaGFuZ2UsIGllZWU4MDIxMV9tZWRpYV9z
dGF0dXMpOwogCWlmIChUQUlMUV9GSVJTVCgmaWMtPmljX3ZhcHMpID09IHZhcCkKSW5kZXg6IHN5
cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bF9ub25lLmMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL25l
dDgwMjExL2llZWU4MDIxMV9yYXRlY3RsX25vbmUuYwkocmV2aXNpb24gMjU0ODI2KQorKysgc3lz
L25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsX25vbmUuYwkod29ya2luZyBjb3B5KQpAQCAtNDQs
MTAgKzQ0LDI2IEBACiAKICNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfdmFyLmg+CiAjaW5j
bHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaD4KKyNpbmNsdWRlIDxuZXQ4MDIxMS9p
ZWVlODAyMTFfcmF0ZWN0bF9ub25lLmg+CiAKIHN0YXRpYyB2b2lkCi1ub25lX2luaXQoc3RydWN0
IGllZWU4MDIxMXZhcCAqdmFwKQorbm9uZV9pbml0KHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwg
dWludDMyX3QgY2FwYWJpbGl0aWVzKQogeworCXN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbm9uZTsK
KworCUtBU1NFUlQodmFwLT5pdl9ycyA9PSBOVUxMLCAoIiVzIGNhbGxlZCBtdWx0aXBsZSB0aW1l
cyIsIF9fZnVuY19fKSk7CisKKwlub25lID0gdmFwLT5pdl9ycyA9IG1hbGxvYyhzaXplb2Yoc3Ry
dWN0IGllZWU4MDIxMV9ub25lKSwKKwkgICAgTV84MDIxMV9SQVRFQ1RMLCBNX05PV0FJVHxNX1pF
Uk8pOworCWlmIChub25lID09IE5VTEwpIHsKKwkJaWZfcHJpbnRmKHZhcC0+aXZfaWZwLCAiY291
bGRuJ3QgYWxsb2MgcmF0ZWN0bCBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm47CisJfQorCisJc3Ry
dWN0IGllZWU4MDIxMV9yY19zdGF0ICogaXJzID0gSUVFRTgwMjExX1JBVEVDVExfU1RBVCh2YXAp
OworCWlycy0+aXJzX2NhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllczsKKworCS8qIC4uLiAqLwog
fQogCiBzdGF0aWMgdm9pZApAQCAtNTksNiArNzUsMjUgQEAKIHN0YXRpYyB2b2lkCiBub25lX25v
ZGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQogeworCXN0cnVjdCBpZWVlODAyMTF2
YXAgKnZhcCA9IG5pLT5uaV92YXA7CisJc3RydWN0IGllZWU4MDIxMV9ub25lICpub25lID0gdmFw
LT5pdl9yczsKKwlzdHJ1Y3QgaWVlZTgwMjExX25vbmVfbm9kZSAqbm9uOworCisJaWYgKG5pLT5u
aV9yY3RscyA9PSBOVUxMKSB7CisJCW5pLT5uaV9yY3RscyA9IG5vbiA9IG1hbGxvYyhzaXplb2Yo
c3RydWN0IGllZWU4MDIxMV9ub25lX25vZGUpLAorCQkgICAgTV84MDIxMV9SQVRFQ1RMLCBNX05P
V0FJVHxNX1pFUk8pOworCQlpZiAobm9uID09IE5VTEwpIHsKKwkJCWlmX3ByaW50Zih2YXAtPml2
X2lmcCwgImNvdWxkbid0IGFsbG9jIHBlci1ub2RlIHJhdGVjdGwgIgorCQkJICAgICJzdHJ1Y3R1
cmVcbiIpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlCisJCW5vbiA9IG5pLT5uaV9yY3RsczsK
KworCW5vbi0+bm9uX25vbmUgPSBub25lOworCisJLyogLi4uICovCisJCiAJbmktPm5pX3R4cmF0
ZSA9IG5pLT5uaV9yYXRlcy5yc19yYXRlc1swXSAmIElFRUU4MDIxMV9SQVRFX1ZBTDsKIH0KIApJ
bmRleDogc3lzL25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lz
L25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmMJKHJldmlzaW9uIDI1NDgyNikKKysrIHN5cy9u
ZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5jCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNiBA
QAogLyotCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUnVpIFBhdWxvIDxycGF1bG9ARnJlZUJTRC5v
cmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5v
cmc+CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDksNiAr
NTAsNDAgQEAKIAogTUFMTE9DX0RFRklORShNXzgwMjExX1JBVEVDVEwsICI4MDIxMXJhdGVjdGwi
LCAiODAyLjExIHJhdGUgY29udHJvbCIpOwogCitlbnVtIHsKKwlNQ1NfSFQyMCwKKwlNQ1NfSFQy
MF9TR0ksCisJTUNTX0hUNDAsCisJTUNTX0hUNDBfU0dJLAorfTsKKworaW50IG1heF80bXNfZnJh
bWVsZW5bNF1bMzJdID0geworCVtNQ1NfSFQyMF0gPSB7CisJCTMyMTIsICA2NDMyLCAgOTY0OCwg
IDEyODY0LCAgMTkzMDAsICAyNTczNiwgIDI4OTUyLCAgMzIxNzIsCisJCTY0MjQsICAxMjg1Miwg
MTkyODAsIDI1NzA4LCAgMzg1NjgsICA1MTQyNCwgIDU3ODUyLCAgNjQyODAsCisJCTk2MjgsICAx
OTI2MCwgMjg4OTYsIDM4NTI4LCAgNTc3OTIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsCisJCTEy
ODI4LCAyNTY1NiwgMzg0ODgsIDUxMzIwLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIs
CisJfSwKKwlbTUNTX0hUMjBfU0dJXSA9IHsKKwkJMzU3MiwgIDcxNDQsICAxMDcyMCwgIDE0Mjk2
LCAgMjE0NDQsICAyODU5NiwgIDMyMTcyLCAgMzU3NDQsCisJCTcxNDAsICAxNDI4NCwgMjE0Mjgs
ICAyODU2OCwgIDQyODU2LCAgNTcxNDQsICA2NDI4OCwgIDY1NTMyLAorCQkxMDcwMCwgMjE0MDgs
IDMyMTEyLCAgNDI4MTYsICA2NDIyOCwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwKKwkJMTQyNTYs
IDI4NTE2LCA0Mjc4MCwgIDU3MDQwLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsCisJ
fSwKKwlbTUNTX0hUNDBdID0geworCQk2NjgwLCAgMTMzNjAsICAyMDA0NCwgIDI2NzI0LCAgNDAw
OTIsICA1MzQ1NiwgIDYwMTQwLCAgNjU1MzIsCisJCTEzMzQ4LCAyNjcwMCwgIDQwMDUyLCAgNTM0
MDAsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwKKwkJMjAwMDQsIDQwMDA4LCAgNjAw
MTYsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAorCQkyNjY0NCwgNTMy
OTIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsCisJfSwK
KwlbTUNTX0hUNDBfU0dJXSA9IHsKKwkJNzQyMCwgIDE0ODQ0LCAgMjIyNzIsICAyOTY5NiwgIDQ0
NTQ0LCAgNTkzOTYsICA2NTUzMiwgIDY1NTMyLAorCQkxNDgzMiwgMjk2NjgsICA0NDUwNCwgIDU5
MzQwLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsCisJCTIyMjMyLCA0NDQ2NCwgIDY1
NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwKKwkJMjk2MTYsIDU5
MjMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAorCX0K
K307CisKIHZvaWQKIGllZWU4MDIxMV9yYXRlY3RsX3JlZ2lzdGVyKGludCB0eXBlLCBjb25zdCBz
dHJ1Y3QgaWVlZTgwMjExX3JhdGVjdGwgKnJhdGVjdGwpCiB7CkBAIC02NiwxMSArMTAxLDExIEBA
CiB9CiAKIHZvaWQKLWllZWU4MDIxMV9yYXRlY3RsX2luaXQoc3RydWN0IGllZWU4MDIxMXZhcCAq
dmFwKQoraWVlZTgwMjExX3JhdGVjdGxfaW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsIHVp
bnQzMl90IGNhcGFiaWxpdGllcykKIHsKIAlpZiAodmFwLT5pdl9yYXRlID09IHJhdGVjdGxzW0lF
RUU4MDIxMV9SQVRFQ1RMX05PTkVdKQogCQlpZWVlODAyMTFfcmF0ZWN0bF9zZXQodmFwLCBJRUVF
ODAyMTFfUkFURUNUTF9BTVJSKTsKLQl2YXAtPml2X3JhdGUtPmlyX2luaXQodmFwKTsKKwl2YXAt
Pml2X3JhdGUtPmlyX2luaXQodmFwLCBjYXBhYmlsaXRpZXMpOwogfQogCiB2b2lkCkBAIC05MCwz
ICsxMjUsMTAzIEBACiAJfQogCXZhcC0+aXZfcmF0ZSA9IHJhdGVjdGxzW3R5cGVdOwogfQorCit2
b2lkCitpZWVlODAyMTFfcmF0ZWN0bF9jb21wbGV0ZV9yY2ZsYWdzKHN0cnVjdCBpZWVlODAyMTFf
bm9kZSAqbmksCisJCXN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqcmNfaW5mbykKK3sKKwlzdHJ1
Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOworCWNvbnN0IHN0cnVjdCBpZWVlODAy
MTFfcmF0ZV90YWJsZSAqIHJ0ID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JjX3NlcmllcyAq
cmMgPSByY19pbmZvLT5pcmlfcmM7CisJLyogaW50IHNob3J0UHJlYW1ibGUgPSByY19pbmZvLT5y
aV9zaG9ydFByZWFtYmxlOyAqLworCXVpbnQ4X3QgcmF0ZTsKKwlpbnQgaTsKKworCXJ0ID0gaWVl
ZTgwMjExX2dldF9yYXRldGFibGUobmktPm5pX2ljLT5pY19jdXJjaGFuKTsKKworCS8qIE1ha2Ug
c3VyZSB0aGF0IHJhdGUgY29udHJvbCBjb2RlIGRvZXNuJ3QgbWVzcyBpdCB1cC4KKwkgKiBJZiBl
bmFibGUgcnRzL2N0cyBhbmQgaXMgcHJlLTgwMi4xMW4sIGJsYW5rIHRyaWVzIDEsIDIsIDMgCisJ
ICovCisKKwlpZiAoISBJRUVFODAyMTFfUkFURUNUTF9IQVNDQVBfTVJSUFJPVCh2YXApKQorCXsK
KwkJZm9yIChpID0gMTsgaSA8IElFRUU4MDIxMV9SQVRFQ1RMX05VTTsgaSsrKQorCQl7CisJCQlp
ZiAocmNbMF0uZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9GTEFHX1JUU0NUUykKKwkJCQlyY1tp
XS50cmllcyA9IDA7CisJCQlyY1tpXS5mbGFncyAmPSB+SUVFRTgwMjExX1JBVEVDVExfRkxBR19S
VFNDVFM7IAorCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9SQVRFQ1RMX05V
TTsgaSsrKSB7CisJCQorCQlpZiAocmNbaV0udHJpZXMgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJ
CXJhdGUgPSBydC0+aW5mb1tyY1tpXS5yaXhdLmRvdDExUmF0ZTsKKworCQkvKgorCQkgKiBPbmx5
IGVuYWJsZSBzaG9ydCBwcmVhbWJsZSBmb3IgbGVnYWN5IHJhdGVzCisJCSAqLworCisJCS8qIFhY
WCBob3cgd2UgZ2V0IHRoZSBub25faHQgcmF0ZWNvZGUgaGVyZT8gKi8KKworCQkjaWYgMAorCQlp
ZiAoKCEgSVNfSFRfUkFURShyYXRlKSkgJiYgc2hvcnRQcmVhbWJsZSkKKwkJCXJhdGUgfD0gcnQt
PmluZm9bcmNbaV0ucml4XS5zaG9ydFByZWFtYmxlOworCQkjZW5kaWYKKworCQkvKgorCQkgKiBT
YXZlIHRoaXMsIHVzZWQgYnkgdGhlIFRYIGFuZCBjb21wbGV0aW9uIGNvZGUKKwkJICovCisJCXJj
W2ldLnJhdGVjb2RlID0gcmF0ZTsKKworCQkvKiBPbmx5IGVuYWJsZSBzaG9ydGdpLCAyMDQwLCBk
dWFsLXN0cmVhbSBpZiBIVCBpcyBzZXQgKi8KKwkJaWYgKElTX0hUX1JBVEUocmF0ZSkpIHsKKwkJ
CXJjW2ldLmZsYWdzIHw9IElFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfSFQ7CisKKwkJCS8qCisJCQkg
KiBYWFggVE9ETzogTERQQworCQkJICovCisKKwkJCS8qCisJCQkgKiBEdWFsIC8gVHJpcGxlIHN0
cmVhbSByYXRlPworCQkJICovCisJCQlpZiAoSFRfUkNfMl9TVFJFQU1TKHJhdGUpID09IDIpCisJ
CQkJcmNbaV0uZmxhZ3MgfD0gSUVFRTgwMjExX1JBVEVDVExfRkxBR19EUzsKKwkJCWVsc2UgaWYg
KEhUX1JDXzJfU1RSRUFNUyhyYXRlKSA9PSAzKQorCQkJCXJjW2ldLmZsYWdzIHw9IElFRUU4MDIx
MV9SQVRFQ1RMX0ZMQUdfVFM7CisJCX0KKworCQkvKgorCQkgKiBDYWxjdWxhdGUgdGhlIG1heGlt
dW0gVFggcG93ZXIgY2FwIGZvciB0aGUgY3VycmVudAorCQkgKiBub2RlLiAKKwkJICogUmF0ZSBj
b250cm9sIGFsZ28gY2FuJ3QgY29udHJvbCBUWCBwb3dlciBieSBub3cuCisJCSAqLworCQlyY1tp
XS50eF9wb3dlcl9jYXAgPSBpZWVlODAyMTFfZ2V0X25vZGVfdHhwb3dlcihuaSk7CisJCQorCQkv
KgorCQkgKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gNG1zIGZyYW1lIGxlbmd0aCBiYXNlZAorCQkg
KiBvbiB0aGUgTUNTIHJhdGUsIFNHSSBhbmQgY2hhbm5lbCB3aWR0aCBmbGFncy4KKwkJICovCisJ
CWlmICgocmNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9GTEFHX0hUKSAmJgorCQkgICAg
KEhUX1JDXzJfTUNTKHJhdGUpIDwgMzIpKSB7CisJCQlpbnQgajsKKwkJCWlmIChyY1tpXS5mbGFn
cyAmIElFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfQ1c0MCkgeworCQkJCWlmIChyY1tpXS5mbGFncyAm
IElFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfU0dJKQorCQkJCQlqID0gTUNTX0hUNDBfU0dJOworCQkJ
CWVsc2UKKwkJCQkJaiA9IE1DU19IVDQwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocmNbaV0uZmxh
Z3MgJiBJRUVFODAyMTFfUkFURUNUTF9GTEFHX1NHSSkKKwkJCQkJaiA9IE1DU19IVDIwX1NHSTsK
KwkJCQllbHNlCisJCQkJCWogPSBNQ1NfSFQyMDsKKwkJCX0KKwkJCXJjW2ldLm1heDRtc2ZyYW1l
bGVuID0KKwkJCSAgICBtYXhfNG1zX2ZyYW1lbGVuW2pdW0hUX1JDXzJfTUNTKHJhdGUpXTsKKwkJ
fSBlbHNlCisJCQlyY1tpXS5tYXg0bXNmcmFtZWxlbiA9IDA7CisJfQorfQorCkluZGV4OiBzeXMv
bmV0ODAyMTEvaWVlZTgwMjExX2FtcnIuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbmV0ODAyMTEvaWVl
ZTgwMjExX2FtcnIuYwkocmV2aXNpb24gMjU0ODI2KQorKysgc3lzL25ldDgwMjExL2llZWU4MDIx
MV9hbXJyLmMJKHdvcmtpbmcgY29weSkKQEAgLTQ3LDggKzQ3LDggQEAKIAogI2luY2x1ZGUgPG5l
dDgwMjExL2llZWU4MDIxMV92YXIuaD4KICNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfaHQu
aD4KKyNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5oPgogI2luY2x1ZGUgPG5l
dDgwMjExL2llZWU4MDIxMV9hbXJyLmg+Ci0jaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3Jh
dGVjdGwuaD4KIAogI2RlZmluZSBpc19zdWNjZXNzKGFtbikJXAogCSgoYW1uKS0+YW1uX3JldHJ5
Y250IDwgKGFtbiktPmFtbl90eGNudCAvIDEwKQpAQCAtNTgsNyArNTgsNyBAQAogCSgoYW1uKS0+
YW1uX3R4Y250ID4gMTApCiAKIHN0YXRpYyB2b2lkCWFtcnJfc2V0aW50ZXJ2YWwoY29uc3Qgc3Ry
dWN0IGllZWU4MDIxMXZhcCAqLCBpbnQpOwotc3RhdGljIHZvaWQJYW1ycl9pbml0KHN0cnVjdCBp
ZWVlODAyMTF2YXAgKik7CitzdGF0aWMgdm9pZAlhbXJyX2luaXQoc3RydWN0IGllZWU4MDIxMXZh
cCAqLCB1aW50MzJfdCk7CiBzdGF0aWMgdm9pZAlhbXJyX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjEx
dmFwICopOwogc3RhdGljIHZvaWQJYW1ycl9ub2RlX2luaXQoc3RydWN0IGllZWU4MDIxMV9ub2Rl
ICopOwogc3RhdGljIHZvaWQJYW1ycl9ub2RlX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX25vZGUg
Kik7CkBAIC0xMDUsNyArMTA1LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWFtcnJfaW5pdChzdHJ1
Y3QgaWVlZTgwMjExdmFwICp2YXApCithbXJyX2luaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqdmFw
LCB1aW50MzJfdCBjYXBhYmlsaXRpZXMpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9hbXJyICphbXJy
OwogCkBAIC0xMTcsNiArMTE3LDEwIEBACiAJCWlmX3ByaW50Zih2YXAtPml2X2lmcCwgImNvdWxk
bid0IGFsbG9jIHJhdGVjdGwgc3RydWN0dXJlXG4iKTsKIAkJcmV0dXJuOwogCX0KKworCXN0cnVj
dCBpZWVlODAyMTFfcmNfc3RhdCAqIGlycyA9IElFRUU4MDIxMV9SQVRFQ1RMX1NUQVQodmFwKTsK
KwlpcnMtPmlyc19jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7CisKIAlhbXJyLT5hbXJyX21p
bl9zdWNjZXNzX3RocmVzaG9sZCA9IElFRUU4MDIxMV9BTVJSX01JTl9TVUNDRVNTX1RIUkVTSE9M
RDsKIAlhbXJyLT5hbXJyX21heF9zdWNjZXNzX3RocmVzaG9sZCA9IElFRUU4MDIxMV9BTVJSX01B
WF9TVUNDRVNTX1RIUkVTSE9MRDsKIAlhbXJyX3NldGludGVydmFsKHZhcCwgNTAwIC8qIG1zICov
KTsKQEAgLTEyOSwxNyArMTMzLDYgQEAKIAlmcmVlKHZhcC0+aXZfcnMsIE1fODAyMTFfUkFURUNU
TCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFtcnJfbm9kZV9pc18xMW4oc3RydWN0IGllZWU4MDIxMV9u
b2RlICpuaSkKLXsKLQotCWlmIChuaS0+bmlfY2hhbiA9PSBOVUxMKQotCQlyZXR1cm4gKDApOwot
CWlmIChuaS0+bmlfY2hhbiA9PSBJRUVFODAyMTFfQ0hBTl9BTllDKQotCQlyZXR1cm4gKDApOwot
CXJldHVybiAoSUVFRTgwMjExX0lTX0NIQU5fSFQobmktPm5pX2NoYW4pKTsKLX0KLQogc3RhdGlj
IHZvaWQKIGFtcnJfbm9kZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmkpCiB7CkBAIC0x
NTksNiArMTUyLDcgQEAKIAkJfQogCX0gZWxzZQogCQlhbW4gPSBuaS0+bmlfcmN0bHM7CisKIAlh
bW4tPmFtbl9hbXJyID0gYW1ycjsKIAlhbW4tPmFtbl9zdWNjZXNzID0gMDsKIAlhbW4tPmFtbl9y
ZWNvdmVyeSA9IDA7CkBAIC0xNjUsMjMgKzE1OSwxMyBAQAogCWFtbi0+YW1uX3R4Y250ID0gYW1u
LT5hbW5fcmV0cnljbnQgPSAwOwogCWFtbi0+YW1uX3N1Y2Nlc3NfdGhyZXNob2xkID0gYW1yci0+
YW1ycl9taW5fc3VjY2Vzc190aHJlc2hvbGQ7CiAKLQkvKiAxMW4gb3Igbm90PyBQaWNrIHRoZSBy
aWdodCByYXRlc2V0ICovCi0JaWYgKGFtcnJfbm9kZV9pc18xMW4obmkpKSB7Ci0JCS8qIFhYWCBl
dyAqLwotCQlJRUVFODAyMTFfTk9URShuaS0+bmlfdmFwLCBJRUVFODAyMTFfTVNHX1JBVEVDVEws
IG5pLAotCQkgICAgIiVzOiAxMW4gbm9kZSIsIF9fZnVuY19fKTsKLQkJcnMgPSAoc3RydWN0IGll
ZWU4MDIxMV9yYXRlc2V0ICopICZuaS0+bmlfaHRyYXRlczsKLQl9IGVsc2UgewotCQlJRUVFODAy
MTFfTk9URShuaS0+bmlfdmFwLCBJRUVFODAyMTFfTVNHX1JBVEVDVEwsIG5pLAotCQkgICAgIiVz
OiBub24tMTFuIG5vZGUiLCBfX2Z1bmNfXyk7Ci0JCXJzID0gJm5pLT5uaV9yYXRlczsKLQl9CisJ
cnMgPSBpZWVlODAyMTFfcmF0ZWN0bF9nZXRfcmF0ZXNldChuaSk7CiAKIAkvKiBJbml0aWFsIHJh
dGUgLSBsb3dlc3QgKi8KIAlyYXRlID0gcnMtPnJzX3JhdGVzWzBdOwogCiAJLyogWFhYIGNsZWFy
IHRoZSBiYXNpYyByYXRlIGZsYWcgaWYgaXQncyBub3QgMTFuICovCi0JaWYgKCEgYW1ycl9ub2Rl
X2lzXzExbihuaSkpCisJaWYgKCEgaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pczExbihuaSkpCiAJ
CXJhdGUgJj0gSUVFRTgwMjExX1JBVEVfVkFMOwogCiAJLyogcGljayBpbml0aWFsIHJhdGUgZnJv
bSB0aGUgcmF0ZXNldCAtIEhUIG9yIG90aGVyd2lzZSAqLwpAQCAtMTg5LDcgKzE3Myw3IEBACiAJ
ICAgIGFtbi0+YW1uX3JpeC0tKSB7CiAJCS8qIGxlZ2FjeSAtIGFueXRoaW5nIDwgMzZtYml0LCBz
dG9wIHNlYXJjaGluZyAqLwogCQkvKiAxMW4gLSBzdG9wIGF0IE1DUzQgLyBNQ1MxMiAvIE1DUzI4
ICovCi0JCWlmIChhbXJyX25vZGVfaXNfMTFuKG5pKSAmJgorCQlpZiAoaWVlZTgwMjExX3JhdGVj
dGxfbm9kZV9pczExbihuaSkgJiYKIAkJICAgIChycy0+cnNfcmF0ZXNbYW1uLT5hbW5fcml4XSAm
IDB4NykgPCA0KQogCQkJYnJlYWs7CiAJCWVsc2UgaWYgKChycy0+cnNfcmF0ZXNbYW1uLT5hbW5f
cml4XSAmIElFRUU4MDIxMV9SQVRFX1ZBTCkgPD0gNzIpCkBAIC0xOTgsNyArMTgyLDcgQEAKIAl9
CiAKIAkvKiBpZiB0aGUgcmF0ZSBpcyBhbiAxMW4gcmF0ZSwgZW5zdXJlIHRoZSBNQ1MgYml0IGlz
IHNldCAqLwotCWlmIChhbXJyX25vZGVfaXNfMTFuKG5pKSkKKwlpZiAoaWVlZTgwMjExX3JhdGVj
dGxfbm9kZV9pczExbihuaSkpCiAJCXJhdGUgfD0gSUVFRTgwMjExX1JBVEVfTUNTOwogCiAJLyog
QXNzaWduIGluaXRpYWwgcmF0ZSBmcm9tIHRoZSByYXRlc2V0ICovCkBAIC0yMjYsMTQgKzIxMCw5
IEBACiAKIAlLQVNTRVJUKGlzX2Vub3VnaChhbW4pLCAoInR4Y250ICVkIiwgYW1uLT5hbW5fdHhj
bnQpKTsKIAotCS8qIDExbiBvciBub3Q/IFBpY2sgdGhlIHJpZ2h0IHJhdGVzZXQgKi8KLQlpZiAo
YW1ycl9ub2RlX2lzXzExbihuaSkpIHsKLQkJLyogWFhYIGV3ICovCi0JCXJzID0gKHN0cnVjdCBp
ZWVlODAyMTFfcmF0ZXNldCAqKSAmbmktPm5pX2h0cmF0ZXM7Ci0JfSBlbHNlIHsKLQkJcnMgPSAm
bmktPm5pX3JhdGVzOwotCX0KKwlycyA9IGllZWU4MDIxMV9yYXRlY3RsX2dldF9yYXRlc2V0KG5p
KTsKIAorCiAJSUVFRTgwMjExX05PVEUobmktPm5pX3ZhcCwgSUVFRTgwMjExX01TR19SQVRFQ1RM
LCBuaSwKIAkgICAgIkFNUlI6IGN1cnJlbnQgcmF0ZSAlZCwgdHhjbnQ9JWQsIHJldHJ5Y250PSVk
IiwKIAkgICAgcnMtPnJzX3JhdGVzW3JpeF0gJiBJRUVFODAyMTFfUkFURV9WQUwsCkBAIC0zMDQs
MTMgKzI4Myw3IEBACiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlc2V0ICpycyA9IE5VTEw7
CiAJaW50IHJpeDsKIAotCS8qIDExbiBvciBub3Q/IFBpY2sgdGhlIHJpZ2h0IHJhdGVzZXQgKi8K
LQlpZiAoYW1ycl9ub2RlX2lzXzExbihuaSkpIHsKLQkJLyogWFhYIGV3ICovCi0JCXJzID0gKHN0
cnVjdCBpZWVlODAyMTFfcmF0ZXNldCAqKSAmbmktPm5pX2h0cmF0ZXM7Ci0JfSBlbHNlIHsKLQkJ
cnMgPSAmbmktPm5pX3JhdGVzOwotCX0KKwlycyA9IGllZWU4MDIxMV9yYXRlY3RsX2dldF9yYXRl
c2V0KG5pKTsKIAogCWlmIChpc19lbm91Z2goYW1uKSAmJiAodGlja3MgLSBhbW4tPmFtbl90aWNr
cykgPiBhbXJyLT5hbXJyX2ludGVydmFsKSB7CiAJCXJpeCA9IGFtcnJfdXBkYXRlKGFtcnIsIGFt
biwgbmkpOwpAQCAtMzE4LDcgKzI5MSw3IEBACiAJCQkvKiB1cGRhdGUgcHVibGljIHJhdGUgKi8K
IAkJCW5pLT5uaV90eHJhdGUgPSBycy0+cnNfcmF0ZXNbcml4XTsKIAkJCS8qIFhYWCBzdHJpcCBi
YXNpYyByYXRlIGZsYWcgZnJvbSB0eHJhdGUsIGlmIG5vbi0xMW4gKi8KLQkJCWlmIChhbXJyX25v
ZGVfaXNfMTFuKG5pKSkKKwkJCWlmIChpZWVlODAyMTFfcmF0ZWN0bF9ub2RlX2lzMTFuKG5pKSkK
IAkJCQluaS0+bmlfdHhyYXRlIHw9IElFRUU4MDIxMV9SQVRFX01DUzsKIAkJCWVsc2UKIAkJCQlu
aS0+bmlfdHhyYXRlICY9IElFRUU4MDIxMV9SQVRFX1ZBTDsKQEAgLTMzOCwxMSArMzExLDE3IEBA
CiBzdGF0aWMgdm9pZAogYW1ycl90eF9jb21wbGV0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFw
ICp2YXAsCiAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgaW50IG9rLAotICAg
IHZvaWQgKmFyZzEsIHZvaWQgKmFyZzIgX191bnVzZWQpCisgICAgdm9pZCAqYXJnMSwgdm9pZCAq
YXJnMikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2FtcnJfbm9kZSAqYW1uID0gbmktPm5pX3JjdGxz
OwogCWludCByZXRyaWVzID0gKihpbnQgKilhcmcxOwogCisJLyogWFhYIG5lZWQgdG8gY2hhbmdl
IGFyZzIgdG8gcG9pbnRlciBvZiBpZWVlODAyMTFfcmNfaW5mbyAqLworCXN0cnVjdCBpZWVlODAy
MTFfcmNfaW5mbyAqcmNfaW5mbyA9IChzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8qKWFyZzI7CisK
KwkvKiB1cGRhdGUgcGVyIHZhcCBzdGF0aXN0aWNzICovCisJaWVlZTgwMjExX3JhdGVjdGxfdXBk
YXRlX3N0YXQodmFwLCByY19pbmZvKTsKKwogCWFtbi0+YW1uX3R4Y250Kys7CiAJaWYgKG9rKQog
CQlhbW4tPmFtbl9zdWNjZXNzKys7CkluZGV4OiBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3JhdGVj
dGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaAkocmV2
aXNpb24gMjU0ODI2KQorKysgc3lzL25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmgJKHdvcmtp
bmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAvKi0KICAqIENvcHlyaWdodCAoYykgMjAxMCBSdWkg
UGF1bG8gPHJwYXVsb0BGcmVlQlNELm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAxMyBDaGVuY2hv
bmcgUWluIDxjY3FpbkBGcmVlQlNELm9yZz4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgog
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CkBAIC0yNCw2ICsyNSw4IEBACiAgKgogICogJEZyZWVCU0QkCiAgKi8KKyNp
Zm5kZWYgX05FVDgwMjExX0lFRUU4MDIxMV9SQVRFQ1RMX0hfCisjZGVmaW5lIF9ORVQ4MDIxMV9J
RUVFODAyMTFfUkFURUNUTF9IXwogCiBlbnVtIGllZWU4MDIxMV9yYXRlYWxncyB7CiAJSUVFRTgw
MjExX1JBVEVDVExfQU1SUgkJPSAwLApAQCAtMzcsMTUgKzQwLDkxIEBACiAjZGVmaW5lCUlFRUU4
MDIxMV9SQVRFQ1RMX1RYX1NVQ0NFU1MJMQogI2RlZmluZQlJRUVFODAyMTFfUkFURUNUTF9UWF9G
QUlMVVJFCTAKIAorI2RlZmluZQlJRUVFODAyMTFfUkFURUNUTF9UUlVFCQkxCisjZGVmaW5lCUlF
RUU4MDIxMV9SQVRFQ1RMX0ZBTFNFCQkwCisKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfTlVN
CQk0CisKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfRkxBR19EUwkJMHgwMQkvKiBkdWFsLXN0
cmVhbSByYXRlICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfQ1c0MAkJMHgwMgkv
KiB1c2UgSFQ0MCAqLworI2RlZmluZQlJRUVFODAyMTFfUkFURUNUTF9GTEFHX1NHSQkJMHgwNAkv
KiB1c2Ugc2hvcnQtR0kgKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfRkxBR19IVAkJMHgw
OAkvKiB1c2UgSFQgKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfRkxBR19SVFNDVFMJMHgx
MAkvKiBlbmFibGUgUlRTL0NUUyBwcm90ZWN0aW9uICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRF
Q1RMX0ZMQUdfU1RCQwkJMHgyMAkvKiBlbmFibGUgU1RCQyAqLworI2RlZmluZQlJRUVFODAyMTFf
UkFURUNUTF9GTEFHX1RTCQkweDQwCS8qIHRyaXBsZS1zdHJlYW0gcmF0ZSAqLworCisvKiBIYXJk
d2FyZSBDQVBzIG9mZmVyZWQgdG8gcmF0ZSBjb250cm9sIGFsZ28gKi8KKyNkZWZpbmUJSUVFRTgw
MjExX1JBVEVDVExfQ0FQX01SUgkJCTB4MDEJLyogc3VwcG9ydCBNUlIgKi8KKyNkZWZpbmUJSUVF
RTgwMjExX1JBVEVDVExfQ0FQX01SUlBST1QJCTB4MDIJLyogc3VwcG9ydCBNUlIgKyBwcm90ZWN0
ICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NVUxUWENIQUlOCTB4MDQJLyogaGFz
IG1vcmUgdGhhbiAxIHR4Y2hhaW4gKi8KKworI2RlZmluZSBJU19WQVBfSFQodmFwKQkoKHZhcCkt
Pml2X2h0Y2FwcyAmIElFRUU4MDIxMV9IVENfSFQpCisjZGVmaW5lIElTX0hUX1JBVEUoX3JhdGUp
ICAgKChfcmF0ZSkgJiAweDgwKQorI2RlZmluZSBIVF9SQ18yX01DUyhfcmMpICAgICgoX3JjKSAm
IDB4N2YpCisjZGVmaW5lIEhUX1JDXzJfU1RSRUFNUyhfcmMpICAgICgoKChfcmMpICYgMHg3OCkg
Pj4gMykgKyAxKQorCitleHRlcm4gaW50IG1heF80bXNfZnJhbWVsZW5bNF1bMzJdOworCitzdHJ1
Y3QgaWVlZTgwMjExX3JjX3NlcmllcyB7CisJdWludDhfdCByaXg7CQkvKiByYXRldGFibGUgaW5k
ZXgsIG5vdCByYXRlIGNvZGUgKi8KKwl1aW50OF90IHJhdGVjb2RlOwkvKiBoYXJkd2FyZSByYXRl
IGNvZGUgKi8KKwl1aW50OF90IHRyaWVzOworCXVpbnQ4X3QgdHhfcG93ZXJfY2FwOworCXVpbnQx
Nl90IGZsYWdzOworCXVpbnQxNl90IG1heDRtc2ZyYW1lbGVuOworfTsKKworc3RydWN0IGllZWU4
MDIxMV9yY19pbmZvIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JjX3NlcmllcyBpcmlfcmNbSUVFRTgw
MjExX1JBVEVDVExfTlVNXTsKKwlpbnQgaXJpX2ZyYW1lbGVuOworCWludCBpcmlfc2hvcnRQcmVh
bWJsZTsKKworCS8qIFRYIGluZm8gKi8KKwlpbnQgaXJpX3N1Y2Nlc3M7CS8qIFRYIHN1Y2Nlc3Mg
b3Igbm90ICovCisJaW50IGlyaV9va2NudDsJCS8qIFRYIG9rIHdpdGggb3Igd2l0aG91dCByZXRy
eSAqLworCWludCBpcmlfZmFpbGNudDsJLyogVFggcmV0cnktZmFpbCBjb3VudCAqLworCWludCBp
cmlfdHhjbnQ7CQkvKiBUWCBjb3VudCAqLworCWludCBpcmlfcmV0cnljbnQ7CS8qIFRYIHJldHJ5
IGNvdW50ICovCisJaW50IGlyaV9zaG9ydHJldHJ5OworCWludCBpcmlfbG9uZ3JldHJ5OworCWlu
dCBpcmlfZmluYWx0c2k7CisJaW50IGlyaV90eHJhdGU7CQkvKiBodyB0eCByYXRlICovCit9Owor
CisvKiBuZXQ4MDIxMSByYXRlY3RsIHN0YXRpc3RpY3MuIAorICogcGVyIHZhcCByYXRlY3RsIHNl
ZXRpbmcgbXVzdCBzdGFydCB3aXRoIHRoaXMgY29tbW9uIHN0YXRlCisgKi8KK3N0cnVjdCBpZWVl
ODAyMTFfcmNfc3RhdCB7CisJdWludDMyX3QgaXJzX2NhcGFiaWxpdGllczsJCS8qIGhhcmR3YXJl
IGNhcGFiaWxpdGllcyBvZmZlcmVkIHRvIHJjICovCisKKwkvKiByYXRlY3RsIHN0YXRpc3RpY3Mg
Ki8KKwl1aW50MzJfdCBpcnNfdHhjbnQ7CisJdWludDMyX3QgaXJzX2ZhaWxjbnQ7CisJdWludDMy
X3QgaXJzX3JldHJ5Y250OworCXVpbnQzMl90IGlyc19zaG9ydHJldHJ5OworCXVpbnQzMl90IGly
c19sb25ncmV0cnk7Cit9OworCisjZGVmaW5lIElFRUU4MDIxMV9SQVRFQ1RMX1NUQVQoX3ZhcCkg
XAorCSgoc3RydWN0IGllZWU4MDIxMV9yY19zdGF0ICopKChfdmFwKS0+aXZfcnMpKQorCisjZGVm
aW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0hBU0NBUF9NUlIoX3ZhcCkgXAorCShJRUVFODAyMTFfUkFU
RUNUTF9TVEFUKF92YXApLT5pcnNfY2FwYWJpbGl0aWVzICYgSUVFRTgwMjExX1JBVEVDVExfQ0FQ
X01SUikKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQX01SUlBST1QoX3ZhcCkgXAor
CShJRUVFODAyMTFfUkFURUNUTF9TVEFUKF92YXApLT5pcnNfY2FwYWJpbGl0aWVzICYgSUVFRTgw
MjExX1JBVEVDVExfQ0FQX01SUlBST1QpCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0hBU0NB
UF9NVUxUWENIQUlOKF92YXApIFwKKwkoSUVFRTgwMjExX1JBVEVDVExfU1RBVChfdmFwKS0+aXJz
X2NhcGFiaWxpdGllcyAmIElFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NVUxUWENIQUlOKQorCiBzdHJ1
Y3QgaWVlZTgwMjExX3JhdGVjdGwgewogCWNvbnN0IGNoYXIgKmlyX25hbWU7CiAJaW50CSgqaXJf
YXR0YWNoKShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICopOwogCXZvaWQJKCppcl9kZXRhY2gp
KGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKik7Ci0Jdm9pZAkoKmlyX2luaXQpKHN0cnVjdCBp
ZWVlODAyMTF2YXAgKik7CisJdm9pZAkoKmlyX2luaXQpKHN0cnVjdCBpZWVlODAyMTF2YXAgKiwg
dWludDMyX3QpOwogCXZvaWQJKCppcl9kZWluaXQpKHN0cnVjdCBpZWVlODAyMTF2YXAgKik7CiAJ
dm9pZAkoKmlyX25vZGVfaW5pdCkoc3RydWN0IGllZWU4MDIxMV9ub2RlICopOwogCXZvaWQJKCpp
cl9ub2RlX2RlaW5pdCkoc3RydWN0IGllZWU4MDIxMV9ub2RlICopOwogCWludAkoKmlyX3JhdGUp
KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCB2b2lkICosIHVpbnQzMl90KTsKKwl2b2lkCSgqaXJf
cmF0ZXMpKHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCBzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8g
Kik7CiAJdm9pZAkoKmlyX3R4X2NvbXBsZXRlKShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICos
CiAJICAgIAkJCSAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICosIGludCwKIAkgICAgCQkJ
ICB2b2lkICosIHZvaWQgKik7CkBAIC01Nyw4ICsxMzYsMTAgQEAKIAogdm9pZAlpZWVlODAyMTFf
cmF0ZWN0bF9yZWdpc3RlcihpbnQsIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZWN0bCAqKTsK
IHZvaWQJaWVlZTgwMjExX3JhdGVjdGxfdW5yZWdpc3RlcihpbnQpOwotdm9pZAlpZWVlODAyMTFf
cmF0ZWN0bF9pbml0KHN0cnVjdCBpZWVlODAyMTF2YXAgKik7Cit2b2lkCWllZWU4MDIxMV9yYXRl
Y3RsX2luaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqLCB1aW50MzJfdCk7CiB2b2lkCWllZWU4MDIx
MV9yYXRlY3RsX3NldChzdHJ1Y3QgaWVlZTgwMjExdmFwICosIGludCk7Cit2b2lkCWllZWU4MDIx
MV9yYXRlY3RsX2NvbXBsZXRlX3JjZmxhZ3Moc3RydWN0IGllZWU4MDIxMV9ub2RlICosIAorCQkJ
CQkJc3RydWN0IGllZWU4MDIxMV9yY19pbmZvKik7CiAKIE1BTExPQ19ERUNMQVJFKE1fODAyMTFf
UkFURUNUTCk7CiAKQEAgLTkzLDYgKzE3NCwxNSBAQAogfQogCiBzdGF0aWMgdm9pZCBfX2lubGlu
ZQoraWVlZTgwMjExX3JhdGVjdGxfcmF0ZXMoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgc3Ry
dWN0IGllZWU4MDIxMV9yY19pbmZvICpyY19pbmZvKQoreworCWNvbnN0IHN0cnVjdCBpZWVlODAy
MTF2YXAgKnZhcCA9IG5pLT5uaV92YXA7CisKKwl2YXAtPml2X3JhdGUtPmlyX3JhdGVzKG5pLCBy
Y19pbmZvKTsKKwlpZWVlODAyMTFfcmF0ZWN0bF9jb21wbGV0ZV9yY2ZsYWdzKG5pLCByY19pbmZv
KTsKK30KKworc3RhdGljIHZvaWQgX19pbmxpbmUKIGllZWU4MDIxMV9yYXRlY3RsX3R4X2NvbXBs
ZXRlKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwKICAgICBjb25zdCBzdHJ1Y3QgaWVl
ZTgwMjExX25vZGUgKm5pLCBpbnQgc3RhdHVzLCB2b2lkICphcmcxLCB2b2lkICphcmcyKQogewpA
QCAtMTE1LDMgKzIwNSw3MSBAQAogCQlyZXR1cm47CiAJdmFwLT5pdl9yYXRlLT5pcl9zZXRpbnRl
cnZhbCh2YXAsIG1zZWNzKTsKIH0KKworc3RhdGljIGludCBfX2lubGluZQoraWVlZTgwMjExX3Jh
dGVjdGxfaGFzY2FwX2N3NDAoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAorCQljb25z
dCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCXJldHVybiBJU19WQVBfSFQodmFwKSAm
JiAobmktPm5pX2NodyA9PSA0MCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbmxpbmUKK2llZWU4MDIx
MV9yYXRlY3RsX2hhc2NhcF9zaG9ydGdpKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwK
KwkJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sKKwlpZiAoSVNfVkFQX0hUKHZh
cCkpCisJeworCQlpZiAobmktPm5pX2NodyA9PSA0MCAmJgorCQkJCXZhcC0+aXZfaHRjYXBzICYg
SUVFRTgwMjExX0hUQ0FQX1NIT1JUR0k0MCAmJgorCQkJCW5pLT5uaV9odGNhcCAmIElFRUU4MDIx
MV9IVENBUF9TSE9SVEdJNDApCisJCQlyZXR1cm4gSUVFRTgwMjExX1JBVEVDVExfVFJVRTsKKwor
CQlpZiAobmktPm5pX2NodyA9PSAyMCAmJgorCQkJCXZhcC0+aXZfaHRjYXBzICYgSUVFRTgwMjEx
X0hUQ0FQX1NIT1JUR0kyMCAmJgorCQkJCW5pLT5uaV9odGNhcCAmIElFRUU4MDIxMV9IVENBUF9T
SE9SVEdJMjApCisJCQlyZXR1cm4gSUVFRTgwMjExX1JBVEVDVExfVFJVRTsKKwl9CisJcmV0dXJu
IElFRUU4MDIxMV9SQVRFQ1RMX0ZBTFNFOworfQorCisKK3N0YXRpYyBpbnQgX19pbmxpbmUKK2ll
ZWU4MDIxMV9yYXRlY3RsX2hhc2NhcF9zdGJjKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZh
cCwKKwkJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sKKyAgIHJldHVybiBJU19W
QVBfSFQodmFwKSAmJiAodmFwLT5pdl9odGNhcHMgJiBJRUVFODAyMTFfSFRDQVBfVFhTVEJDKSAm
JgorCQkJICAgIChuaS0+bmlfaHRjYXAgJiBJRUVFODAyMTFfSFRDQVBfUlhTVEJDXzFTVFJFQU0p
ICYmCisJCQkgICAgSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQX01VTFRYQ0hBSU4odmFwKTsKK30K
Kworc3RhdGljIGludCBfX2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pczExbihjb25z
dCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCWlmIChuaS0+bmlfY2hhbiA9PSBOVUxM
KQorCQlyZXR1cm4gKDApOworCWlmIChuaS0+bmlfY2hhbiA9PSBJRUVFODAyMTFfQ0hBTl9BTllD
KQorCQlyZXR1cm4gKDApOworCXJldHVybiAoSUVFRTgwMjExX0lTX0NIQU5fSFQobmktPm5pX2No
YW4pKTsKK30KKworX19pbmxpbmUgc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZXNl
dCAqCitpZWVlODAyMTFfcmF0ZWN0bF9nZXRfcmF0ZXNldChjb25zdCBzdHJ1Y3QgaWVlZTgwMjEx
X25vZGUgKm5pKQoreworCXJldHVybiBpZWVlODAyMTFfcmF0ZWN0bF9ub2RlX2lzMTFuKG5pKSA/
IAorCQkJCShzdHJ1Y3QgaWVlZTgwMjExX3JhdGVzZXQgKikgJm5pLT5uaV9odHJhdGVzIDoKKwkJ
CQkmbmktPm5pX3JhdGVzOworfQorCitzdGF0aWMgdm9pZCBfX2lubGluZQoraWVlZTgwMjExX3Jh
dGVjdGxfdXBkYXRlX3N0YXQoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAorCQljb25z
dCBzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8gKnJjX2luZm8pCit7CisJc3RydWN0IGllZWU4MDIx
MV9yY19zdGF0ICogaXJzID0gSUVFRTgwMjExX1JBVEVDVExfU1RBVCh2YXApOworCWlycy0+aXJz
X3R4Y250ICs9IHJjX2luZm8tPmlyaV90eGNudDsKKwlpcnMtPmlyc19mYWlsY250ICs9IHJjX2lu
Zm8tPmlyaV9mYWlsY250OworCWlycy0+aXJzX3JldHJ5Y250ICs9IHJjX2luZm8tPmlyaV9yZXRy
eWNudDsKKwlpcnMtPmlyc19zaG9ydHJldHJ5ICs9IHJjX2luZm8tPmlyaV9zaG9ydHJldHJ5Owor
CWlycy0+aXJzX2xvbmdyZXRyeSArPSByY19pbmZvLT5pcmlfbG9uZ3JldHJ5OworfQorCisjZW5k
aWYKSW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfYW1yci5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5
cy9uZXQ4MDIxMS9pZWVlODAyMTFfYW1yci5oCShyZXZpc2lvbiAyNTQ4MjYpCisrKyBzeXMvbmV0
ODAyMTEvaWVlZTgwMjExX2FtcnIuaAkod29ya2luZyBjb3B5KQpAQCAtMjAsNiArMjAsNyBAQAog
I2lmbmRlZiBfTkVUODAyMTFfSUVFRTgwMjExX0FNUlJfSF8KICNkZWZpbmUgX05FVDgwMjExX0lF
RUU4MDIxMV9BTVJSX0hfCiAKKyNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5o
PgogLyotCiAgKiBOYWl2ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQWRhcHRpdmUgTXVsdGkgUmF0
ZSBSZXRyeSBhbGdvcml0aG06CiAgKgpAQCAtMzUsNiArMzYsNyBAQAogc3RydWN0IGllZWU4MDIx
MXZhcDsKIAogc3RydWN0IGllZWU4MDIxMV9hbXJyIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JjX3N0
YXQgYW1ycl9zdGF0OwogCXVfaW50CWFtcnJfbWluX3N1Y2Nlc3NfdGhyZXNob2xkOwogCXVfaW50
CWFtcnJfbWF4X3N1Y2Nlc3NfdGhyZXNob2xkOwogCWludAlhbXJyX2ludGVydmFsOwkJLyogdXBk
YXRlIGludGVydmFsICh0aWNrcykgKi8KSW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmF0
ZWN0bF9ub25lLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL25ldDgwMjExL2llZWU4MDIxMV9yYXRlY3Rs
X25vbmUuaAkocmV2aXNpb24gMCkKKysrIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bF9u
b25lLmgJKHJldmlzaW9uIDI1NjQ4OSkKQEAgLTAsMCArMSwzOCBAQAorLyotCisgKiBDb3B5cmln
aHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+CisgKgorICogUGVy
bWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2Fy
ZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50
ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlz
IHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZU
V0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FS
UkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElN
UExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBE
SVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMK
KyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklU
UywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9U
SEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04g
V0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lm
bmRlZiBfTkVUODAyMTFfSUVFRTgwMjExX1JBVEVDVExfTk9ORV9IXworI2RlZmluZSBfTkVUODAy
MTFfSUVFRTgwMjExX1JBVEVDVExfTk9ORV9IXworCisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgw
MjExX3JhdGVjdGwuaD4KKworLyoKKyAqIFJhdGUgY29udHJvbCBzZXR0aW5ncy4KKyAqLworCitz
dHJ1Y3QgaWVlZTgwMjExX25vbmUgeworCXN0cnVjdCBpZWVlODAyMTFfcmNfc3RhdCBub25lX3N0
YXQ7CisJLyogb3RoZXIgc3R1ZmZzICovCit9OworCisvKgorICogUmF0ZSBjb250cm9sIHN0YXRl
IGZvciBhIGdpdmVuIG5vZGUuCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfbm9uZV9ub2RlIHsKKwlz
dHJ1Y3QgaWVlZTgwMjExX25vbmUgKm5vbl9ub25lOworfTsKKworI2VuZGlmIC8qIF9ORVQ4MDIx
MV9JRUVFODAyMTFfUkFURUNUTF9OT05FX0hfICovCkluZGV4OiBzeXMvbmV0ODAyMTEvaWVlZTgw
MjExX3JjX3NhbXBsZS5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmNf
c2FtcGxlLmMJKHJldmlzaW9uIDApCisrKyBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBs
ZS5jCShyZXZpc2lvbiAyNTY0NzQpCkBAIC0wLDAgKzEsMTE0MSBAQAorLyogJEZyZWVCU0Q6IGhl
YWQvc3lzL2Rldi9hdGgvYXRoX3JhdGUvc2FtcGxlL3NhbXBsZS5jIDI0ODU3MyAyMDEzLTAyLTI3
IDA0OjMzOjA2WiBhZHJpYW4gJCovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IEpvaG4g
Qmlja2V0CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJlZUJT
RC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNT
IE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAor
ICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkK
KyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSA8c3lzL2NkZWZzLmg+CisKKyNpbmNsdWRlICJvcHRfd2xhbi5oIgorCisjaW5jbHVk
ZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL2tlcm5lbC5oPgorI2luY2x1ZGUgPHN5cy9t
b2R1bGUuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3N5c2N0bC5o
PgorCisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0L2lmX21lZGlhLmg+CisKKyNp
ZmRlZiBJTkVUCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaWZf
ZXRoZXIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3Zhci5oPgor
I2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9odC5oPgorI2luY2x1ZGUgPG5ldDgwMjExL2ll
ZWU4MDIxMV9yYXRlY3RsLmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBs
ZS5oPgorI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9yY19zYW1wbGVfdHhzY2hlZC5oPgor
CitzdGF0aWMgdm9pZAlzYW1wbGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFwICosIHVpbnQzMl90
KTsKK3N0YXRpYyB2b2lkCXNhbXBsZV9kZWluaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqKTsKK3N0
YXRpYyB2b2lkCXNhbXBsZV9ub2RlX2luaXQoc3RydWN0IGllZWU4MDIxMV9ub2RlICopOworc3Rh
dGljIHZvaWQJc2FtcGxlX25vZGVfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqKTsKK3N0
YXRpYyBpbnQJc2FtcGxlX3JhdGUoc3RydWN0IGllZWU4MDIxMV9ub2RlICosIHZvaWQgKiwgdWlu
dDMyX3QpOworc3RhdGljIHZvaWQJc2FtcGxlX3R4X2NvbXBsZXRlKGNvbnN0IHN0cnVjdCBpZWVl
ODAyMTF2YXAgKiwKKyAgICAJCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgaW50LCAK
KwkJCXZvaWQgKiwgdm9pZCAqKTsKK3N0YXRpYyB2b2lkCXNhbXBsZV90eF91cGRhdGUoY29uc3Qg
c3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAorCQkJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2Rl
ICosIHZvaWQgKiwgdm9pZCAqLCB2b2lkICopOworc3RhdGljIHZvaWQJc2FtcGxlX3NldGludGVy
dmFsKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKiwgaW50KTsKKworLyogbnVtYmVyIG9mIHJl
ZmVyZW5jZXMgZnJvbSBuZXQ4MDIxMSBsYXllciAqLworc3RhdGljCWludCBucmVmcyA9IDA7CisK
K3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVjdGwgc2FtcGxlID0geworCS5pcl9u
YW1lCT0gInNhbXBsZSIsCisJLmlyX2F0dGFjaAk9IE5VTEwsCisJLmlyX2RldGFjaAk9IE5VTEws
CisJLmlyX2luaXQJPSBzYW1wbGVfaW5pdCwKKwkuaXJfZGVpbml0CT0gc2FtcGxlX2RlaW5pdCwK
KwkuaXJfbm9kZV9pbml0CT0gc2FtcGxlX25vZGVfaW5pdCwKKwkuaXJfbm9kZV9kZWluaXQJPSBz
YW1wbGVfbm9kZV9kZWluaXQsCisJLmlyX3JhdGUJPSBzYW1wbGVfcmF0ZSwKKwkuaXJfcmF0ZXMJ
PSBzYW1wbGVfcmF0ZXMsCisJLmlyX3R4X2NvbXBsZXRlCT0gc2FtcGxlX3R4X2NvbXBsZXRlLAor
CS5pcl90eF91cGRhdGUJPSBzYW1wbGVfdHhfdXBkYXRlLAorCS5pcl9zZXRpbnRlcnZhbAk9IHNh
bXBsZV9zZXRpbnRlcnZhbCwKK307CitJRUVFODAyMTFfUkFURUNUTF9NT0RVTEUoc2FtcGxlLCAx
KTsKK0lFRUU4MDIxMV9SQVRFQ1RMX0FMRyhzYW1wbGUsIElFRUU4MDIxMV9SQVRFQ1RMX1NBTVBM
RSwgc2FtcGxlKTsKKworc3RhdGljIHZvaWQKK3NhbXBsZV9pbml0KHN0cnVjdCBpZWVlODAyMTF2
YXAgKnZhcCwgdWludDMyX3QgY2FwYWJpbGl0aWVzKQoreworCXN0cnVjdCBpZWVlODAyMTFfc2Ft
cGxlICpzYW1wbGU7CisKKwlLQVNTRVJUKHZhcC0+aXZfcnMgPT0gTlVMTCwgKCIlcyBjYWxsZWQg
bXVsdGlwbGUgdGltZXMiLCBfX2Z1bmNfXykpOworCisJc2FtcGxlID0gdmFwLT5pdl9ycyA9IG1h
bGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9zYW1wbGUpLAorCSAgICBNXzgwMjExX1JBVEVD
VEwsIE1fTk9XQUlUfE1fWkVSTyk7CisJaWYgKHNhbXBsZSA9PSBOVUxMKSB7CisJCWlmX3ByaW50
Zih2YXAtPml2X2lmcCwgImNvdWxkbid0IGFsbG9jIHJhdGVjdGwgc3RydWN0dXJlXG4iKTsKKwkJ
cmV0dXJuOworCX0KKworCXN0cnVjdCBpZWVlODAyMTFfcmNfc3RhdCAqIGlycyA9IElFRUU4MDIx
MV9SQVRFQ1RMX1NUQVQodmFwKTsKKwlpcnMtPmlyc19jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRp
ZXM7CisKKwlzYW1wbGUtPnNhbXBsZV9zbW9vdGhpbmdfcmF0ZSA9IDc1OwkJLyogZXdtYSBwZXJj
ZW50YWdlIChbMC4uOTldKSAqLworCXNhbXBsZS0+c2FtcGxlX3Ntb290aGluZ19taW5wYWNrZXRz
ID0gMTAwIC8gKDEwMCAtIHNhbXBsZS0+c2FtcGxlX3Ntb290aGluZ19yYXRlKTsKKwlzYW1wbGUt
PnNhbXBsZV9yYXRlID0gMTA7CQkJLyogJXRpbWUgdG8gdHJ5IGRpZmYgdHggcmF0ZXMgKi8KKwlz
YW1wbGUtPnNhbXBsZV9tYXhfc3VjY2Vzc2l2ZV9mYWlsdXJlcyA9IDM7CS8qIHRocmVzaG9sZCBm
b3IgcmF0ZSBzYW1wbGluZyovCisJc2FtcGxlLT5zYW1wbGVfc3RhbGVfZmFpbHVyZV90aW1lb3V0
ID0gMTAgKiBoejsJLyogMTAgc2Vjb25kcyAqLworCXNhbXBsZS0+c2FtcGxlX21pbl9zd2l0Y2gg
PSBoejsJCQkvKiAxIHNlY29uZCAqLworCXNhbXBsZV9zZXRpbnRlcnZhbCh2YXAsIDUwMCAvKiBt
cyAqLyk7IAkvKiBhY3R1YWxseSBkbyBub3RoaW5nICovCisJc2FtcGxlX3N5c2N0bGF0dGFjaCh2
YXAsIHZhcC0+aXZfc3lzY3RsLCB2YXAtPml2X29pZCk7Cit9CisKK3N0YXRpYyB2b2lkCitzYW1w
bGVfZGVpbml0KHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCkKK3sKKwlmcmVlKHZhcC0+aXZfcnMs
IE1fODAyMTFfUkFURUNUTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHhzY2hlZHVsZSAq
bXJyX3NjaGVkdWxlc1tJRUVFODAyMTFfTU9ERV9NQVgrMl0gPSB7CisJTlVMTCwJCS8qIElFRUU4
MDIxMV9NT0RFX0FVVE8gKi8KKwlzZXJpZXNfMTFhLAkvKiBJRUVFODAyMTFfTU9ERV8xMUEgKi8K
KwlzZXJpZXNfMTFnLAkvKiBJRUVFODAyMTFfTU9ERV8xMUIgKi8KKwlzZXJpZXNfMTFnLAkvKiBJ
RUVFODAyMTFfTU9ERV8xMUcgKi8KKwlOVUxMLAkJLyogSUVFRTgwMjExX01PREVfRkggKi8KKwlz
ZXJpZXNfMTFhLAkvKiBJRUVFODAyMTFfTU9ERV9UVVJCT19BICovCisJc2VyaWVzXzExZywJLyog
SUVFRTgwMjExX01PREVfVFVSQk9fRyAqLworCXNlcmllc18xMWEsCS8qIElFRUU4MDIxMV9NT0RF
X1NUVVJCT19BICovCisJc2VyaWVzXzExbmEsCS8qIElFRUU4MDIxMV9NT0RFXzExTkEgKi8KKwlz
ZXJpZXNfMTFuZywJLyogSUVFRTgwMjExX01PREVfMTFORyAqLworCXNlcmllc19oYWxmLAkvKiBJ
RUVFODAyMTFfTU9ERV9IQUxGICovCisJc2VyaWVzX3F1YXJ0ZXIsCS8qIElFRUU4MDIxMV9NT0RF
X1FVQVJURVIgKi8KK307CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfbm9kZV9pbml0KHN0cnVjdCBp
ZWVlODAyMTFfbm9kZSAqbmkpCit7CisjZGVmaW5lCVJBVEUoX2l4KQkobmktPm5pX3JhdGVzLnJz
X3JhdGVzWyhfaXgpXSAmIElFRUU4MDIxMV9SQVRFX1ZBTCkKKyNkZWZpbmUJRE9UMTFSQVRFKF9p
eCkJKHJ0LT5pbmZvWyhfaXgpXS5kb3QxMVJhdGUgJiBJRUVFODAyMTFfUkFURV9WQUwpCisjZGVm
aW5lCU1DUyhfaXgpCShuaS0+bmlfaHRyYXRlcy5yc19yYXRlc1tfaXhdIHwgSUVFRTgwMjExX1JB
VEVfTUNTKQorCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92YXA7CisJc3RydWN0
IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZSA9IHZhcC0+aXZfcnM7CisJc3RydWN0IGllZWU4MDIx
MV9zYW1wbGVfbm9kZSAqc2FuID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVf
dGFibGUgKnJ0ID0gaWVlZTgwMjExX2dldF9yYXRldGFibGUodmFwLT5pdl9pYy0+aWNfY3VyY2hh
bik7CisJZW51bSBpZWVlODAyMTFfcGh5bW9kZSBjdXJtb2RlID0gaWVlZTgwMjExX2NoYW4ybW9k
ZSh2YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwlpbnQgeCwgeSwgcml4OworCisJaWYgKG5pLT5u
aV9yY3RscyA9PSBOVUxMKSB7CisJCW5pLT5uaV9yY3RscyA9IHNhbiA9IG1hbGxvYyhzaXplb2Yo
c3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSksCisJCSAgICBNXzgwMjExX1JBVEVDVEwsIE1f
Tk9XQUlUfE1fWkVSTyk7CisJCWlmIChzYW4gPT0gTlVMTCkgeworCQkJaWZfcHJpbnRmKHZhcC0+
aXZfaWZwLCAiY291bGRuJ3QgYWxsb2MgcGVyLW5vZGUgcmF0ZWN0bCAiCisJCQkgICAgInN0cnVj
dHVyZVxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UKKwkJc2FuID0gbmktPm5pX3JjdGxz
OworCQorCXNhbi0+c2FuX3NhbXBsZSA9IHNhbXBsZTsKKworCUtBU1NFUlQocnQgIT0gTlVMTCwg
KCJubyByYXRlIHRhYmxlLCBtb2RlICV1IiwgY3VybW9kZSkpOworCisJc2FuLT5zY2hlZCA9IG1y
cl9zY2hlZHVsZXNbY3VybW9kZV07CisJS0FTU0VSVChzYW4tPnNjaGVkICE9IE5VTEwsICgibm8g
bXJyIHNjaGVkdWxlIGZvciBtb2RlICV1IiwgY3VybW9kZSkpOworCisJc2FuLT5zdGF0aWNfcml4
ID0gLTE7CisJc2FtcGxlX3VwZGF0ZV9zdGF0aWNfcml4KG5pKTsKKworCS8qCisJICogQ29uc3Ry
dWN0IGEgYml0bWFzayBvZiB1c2FibGUgcmF0ZXMuICBUaGlzIGhhcyBhbGwKKwkgKiBuZWdvdGlh
dGVkIHJhdGVzIG1pbnVzIHRob3NlIG1hcmtlZCBieSB0aGUgaGFsIGFzCisJICogdG8gYmUgaWdu
b3JlZCBmb3IgZG9pbmcgcmF0ZSBjb250cm9sLgorCSAqLworCXNhbi0+cmF0ZW1hc2sgPSAwOwor
CisJLyogTUNTIHJhdGVzICovCisJaWYgKG5pLT5uaV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX0hU
KSB7CisJCWZvciAoeCA9IDA7IHggPCBuaS0+bmlfaHRyYXRlcy5yc19ucmF0ZXM7IHgrKykgewor
CQkJcml4ID0gcnQtPnJhdGVDb2RlVG9JbmRleFtNQ1MoeCldOworCQkJaWYgKHJpeCA9PSAweGZm
KQorCQkJCWNvbnRpbnVlOworCQkJLyogc2tpcCByYXRlcyBtYXJrZWQgYnJva2VuIGJ5IGhhbCAq
LworCQkJaWYgKCFydC0+aW5mb1tyaXhdLnZhbGlkKQorCQkJCWNvbnRpbnVlOworCQkJS0FTU0VS
VChyaXggPCBTQU1QTEVfTUFYUkFURVMsCisJCQkgICAgKCJtY3MgJXUgaGFzIHJpeCAlZCIsIE1D
Uyh4KSwgcml4KSk7CisJCQlzYW4tPnJhdGVtYXNrIHw9ICh1aW50NjRfdCkgMTw8cml4OworCQl9
CisJfQorCisJLyogTGVnYWN5IHJhdGVzICovCisJZm9yICh4ID0gMDsgeCA8IG5pLT5uaV9yYXRl
cy5yc19ucmF0ZXM7IHgrKykgeworCQlyaXggPSBydC0+cmF0ZUNvZGVUb0luZGV4W1JBVEUoeCld
OworCQlpZiAocml4ID09IDB4ZmYpCisJCQljb250aW51ZTsKKwkJLyogc2tpcCByYXRlcyBtYXJr
ZWQgYnJva2VuIGJ5IGhhbCAqLworCQlpZiAoIXJ0LT5pbmZvW3JpeF0udmFsaWQpCisJCQljb250
aW51ZTsKKwkJS0FTU0VSVChyaXggPCBTQU1QTEVfTUFYUkFURVMsCisJCSAgICAoInJhdGUgJXUg
aGFzIHJpeCAlZCIsIFJBVEUoeCksIHJpeCkpOworCQlzYW4tPnJhdGVtYXNrIHw9ICh1aW50NjRf
dCkgMTw8cml4OworCX0KKworCWZvciAoeSA9IDA7IHkgPCBOVU1fUEFDS0VUX1NJWkVfQklOUzsg
eSsrKSB7CisJCWludCBzaXplID0gYmluX3RvX3NpemUoeSk7CisJCXVpbnQ2NF90IG1hc2s7CisK
KwkJc2FuLT5wYWNrZXRzX3NlbnRbeV0gPSAwOworCQlzYW4tPmN1cnJlbnRfc2FtcGxlX3JpeFt5
XSA9IC0xOworCQlzYW4tPmxhc3Rfc2FtcGxlX3JpeFt5XSA9IDA7CisJCS8qIFhYWCBzdGFydCB3
aXRoIGZpcnN0IHZhbGlkIHJhdGUgKi8KKwkJc2FuLT5jdXJyZW50X3JpeFt5XSA9IGZmcyhzYW4t
PnJhdGVtYXNrKS0xOworCQkKKwkJLyoKKwkJICogSW5pdGlhbGl6ZSB0aGUgc3RhdGlzdGljcyBi
dWNrZXRzOyB0aGVzZSBhcmUKKwkJICogaW5kZXhlZCBieSB0aGUgcmF0ZSBjb2RlIGluZGV4Lgor
CQkgKi8KKwkJZm9yIChyaXggPSAwLCBtYXNrID0gc2FuLT5yYXRlbWFzazsgbWFzayAhPSAwOyBy
aXgrKywgbWFzayA+Pj0gMSkgeworCQkJaWYgKChtYXNrICYgMSkgPT0gMCkJCS8qIG5vdCBhIHZh
bGlkIHJhdGUgKi8KKwkJCQljb250aW51ZTsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS5zdWNjZXNz
aXZlX2ZhaWx1cmVzID0gMDsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS50cmllcyA9IDA7CisJCQlz
YW4tPnN0YXRzW3ldW3JpeF0udG90YWxfcGFja2V0cyA9IDA7CisJCQlzYW4tPnN0YXRzW3ldW3Jp
eF0ucGFja2V0c19hY2tlZCA9IDA7CisJCQlzYW4tPnN0YXRzW3ldW3JpeF0ubGFzdF90eCA9IDA7
CisJCQlzYW4tPnN0YXRzW3ldW3JpeF0uZXdtYV9wY3QgPSAwOworCQkJCisJCQlzYW4tPnN0YXRz
W3ldW3JpeF0ucGVyZmVjdF90eF90aW1lID0KKwkJCSAgICBjYWxjX3VzZWNzX3VuaWNhc3RfcGFj
a2V0KHZhcCwgc2l6ZSwgcml4LCAwLCAwLAorCQkJICAgIChuaS0+bmlfY2h3ID09IDQwKSk7CisJ
CQlzYW4tPnN0YXRzW3ldW3JpeF0uYXZlcmFnZV90eF90aW1lID0KKwkJCSAgICBzYW4tPnN0YXRz
W3ldW3JpeF0ucGVyZmVjdF90eF90aW1lOworCQl9CisJfQorCisJLyogc2V0IHRoZSB2aXNpYmxl
IGJpdC1yYXRlICovCisJaWYgKHNhbi0+c3RhdGljX3JpeCAhPSAtMSkKKwkJbmktPm5pX3R4cmF0
ZSA9IERPVDExUkFURShzYW4tPnN0YXRpY19yaXgpOworCWVsc2UKKwkJbmktPm5pX3R4cmF0ZSA9
IFJBVEUoMCk7CisjdW5kZWYgUkFURQorI3VuZGVmIERPVDExUkFURQorI3VuZGVmIE1DUworfQor
CitzdGF0aWMgdm9pZAorc2FtcGxlX25vZGVfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAq
bmkpCit7CisJZnJlZShuaS0+bmlfcmN0bHMsIE1fODAyMTFfUkFURUNUTCk7Cit9CisKK3N0YXRp
YyBpbnQKK2RvdDExcmF0ZShjb25zdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQsIGludCByaXgp
Cit7CisJaWYgKHJpeCA8IDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gcnQtPmluZm9bcml4XS5w
aHkgPT0gSUVFRTgwMjExX1RfSFQgPworCSAgICBydC0+aW5mb1tyaXhdLmRvdDExUmF0ZSA6IChy
dC0+aW5mb1tyaXhdLmRvdDExUmF0ZSAmIElFRUU4MDIxMV9SQVRFX1ZBTCkgLyAyOworfQorCitz
dGF0aWMgY29uc3QgY2hhciAqCitkb3QxMXJhdGVfbGFiZWwoY29uc3QgaWVlZTgwMjExX3JhdGVf
dGFibGUgKnJ0LCBpbnQgcml4KQoreworCWlmIChyaXggPCAwKQorCQlyZXR1cm4gIiI7CisJcmV0
dXJuIHJ0LT5pbmZvW3JpeF0ucGh5ID09IElFRUU4MDIxMV9UX0hUID8gIk1DUyIgOiAiTWIgIjsK
K30KKworLyoKKyAqIFJldHVybiB0aGUgcml4IHdpdGggdGhlIGxvd2VzdCBhdmVyYWdlX3R4X3Rp
bWUsCisgKiBvciAtMSBpZiBhbGwgdGhlIGF2ZXJhZ2VfdHhfdGltZXMgYXJlIDAuCisgKi8KK3N0
YXRpYyBfX2lubGluZSBpbnQKK3BpY2tfYmVzdF9yYXRlKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFf
bm9kZSAqbmksIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQsCisgICAgaW50
IHNpemVfYmluLCBpbnQgcmVxdWlyZV9hY2tlZF9iZWZvcmUpCit7CisJc3RydWN0IGllZWU4MDIx
MV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOworICAgIGludCBiZXN0X3JhdGVfcml4
LCBiZXN0X3JhdGVfdHQsIGJlc3RfcmF0ZV9wY3Q7CisJdWludDY0X3QgbWFzazsKKwlpbnQgcml4
LCB0dCwgcGN0OworCisgICAgYmVzdF9yYXRlX3JpeCA9IDA7CisgICAgYmVzdF9yYXRlX3R0ID0g
MDsKKwliZXN0X3JhdGVfcGN0ID0gMDsKKworCWZvciAobWFzayA9IHNhbi0+cmF0ZW1hc2ssIHJp
eCA9IDA7IG1hc2sgIT0gMDsgbWFzayA+Pj0gMSwgcml4KyspIHsKKwkJaWYgKChtYXNrICYgMSkg
PT0gMCkJCS8qIG5vdCBhIHN1cHBvcnRlZCByYXRlICovCisJCQljb250aW51ZTsKKworCQkvKiBE
b24ndCBwaWNrIGEgbm9uLUhUIHJhdGUgZm9yIGEgSFQgbm9kZSAqLworCQlpZiAoKG5pLT5uaV9m
bGFncyAmIElFRUU4MDIxMV9OT0RFX0hUKSAmJgorCQkgICAgKHJ0LT5pbmZvW3JpeF0ucGh5ICE9
IElFRUU4MDIxMV9UX0hUKSkgeworCQkJY29udGludWU7CisJCX0KKworCQl0dCA9IHNhbi0+c3Rh
dHNbc2l6ZV9iaW5dW3JpeF0uYXZlcmFnZV90eF90aW1lOworCQlpZiAodHQgPD0gMCB8fAorCQkg
ICAgKHJlcXVpcmVfYWNrZWRfYmVmb3JlICYmCisJCSAgICAgIXNhbi0+c3RhdHNbc2l6ZV9iaW5d
W3JpeF0ucGFja2V0c19hY2tlZCkpCisJCQljb250aW51ZTsKKworCQkvKiBDYWxjdWxhdGUgcGVy
Y2VudGFnZSBpZiBwb3NzaWJsZSAqLworCQlpZiAoc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS50
b3RhbF9wYWNrZXRzID4gMCkgeworCQkJcGN0ID0gc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5l
d21hX3BjdDsKKwkJfSBlbHNlIHsKKwkJCS8qIFhYWCBmb3Igbm93LCBhc3N1bWUgOTUlIG9rICov
CisJCQlwY3QgPSA5NTsKKwkJfQorCisJCS8qIGRvbid0IHVzZSBhIGJpdC1yYXRlIHRoYXQgaGFz
IGJlZW4gZmFpbGluZyAqLworCQlpZiAoc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5zdWNjZXNz
aXZlX2ZhaWx1cmVzID4gMykKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIEZvciBIVCwgRG9u
J3QgdXNlIGEgYml0IHJhdGUgdGhhdCBpcyBtdWNoIG1vcmUKKwkJICogbG9zc3kgdGhhbiB0aGUg
YmVzdC4KKwkJICoKKwkJICogWFhYIHRoaXMgaXNuJ3Qgb3B0aW1hbDsgaXQncyBqdXN0IGRlc2ln
bmVkIHRvCisJCSAqIGVsaW1pbmF0ZSByYXRlcyB0aGF0IGFyZSBnb2luZyB0byBiZSBvYnZpb3Vz
bHkKKwkJICogd29yc2UuCisJCSAqLworCQlpZiAobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05P
REVfSFQpIHsKKwkJCWlmIChiZXN0X3JhdGVfcGN0ID4gKHBjdCArIDUwKSkKKwkJCQljb250aW51
ZTsKKwkJfQorCisJCS8qCisJCSAqIEZvciBub24tTUNTIHJhdGVzLCB1c2UgdGhlIGN1cnJlbnQg
YXZlcmFnZSB0eHRpbWUgZm9yCisJCSAqIGNvbXBhcmlzb24uCisJCSAqLworCQlpZiAoISAobmkt
Pm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpKSB7CisJCQlpZiAoYmVzdF9yYXRlX3R0ID09
IDAgfHwgdHQgPD0gYmVzdF9yYXRlX3R0KSB7CisJCQkJYmVzdF9yYXRlX3R0ID0gdHQ7CisJCQkJ
YmVzdF9yYXRlX3JpeCA9IHJpeDsKKwkJCQliZXN0X3JhdGVfcGN0ID0gcGN0OworCQkJfQorCQl9
CisKKwkJLyoKKwkJICogU2luY2UgMiBzdHJlYW0gcmF0ZXMgaGF2ZSBzbGlnaHRseSBoaWdoZXIg
VFggdGltZXMsCisJCSAqIGFsbG93IGEgbGl0dGxlIGJpdCBvZiBsZWV3YXkuIFRoaXMgc2hvdWxk
IGxhdGVyCisJCSAqIGJlIGFic3RyYWN0ZWQgb3V0IGFuZCBwcm9wZXJseSBoYW5kbGVkLgorCQkg
Ki8KKwkJaWYgKG5pLT5uaV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX0hUKSB7CisJCQlpZiAoYmVz
dF9yYXRlX3R0ID09IDAgfHwgKHR0ICogOCA8PSBiZXN0X3JhdGVfdHQgKiAxMCkpIHsKKwkJCQli
ZXN0X3JhdGVfdHQgPSB0dDsKKwkJCQliZXN0X3JhdGVfcml4ID0gcml4OworCQkJCWJlc3RfcmF0
ZV9wY3QgPSBwY3Q7CisJCQl9CisJCX0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGJlc3Rf
cmF0ZV90dCA/IGJlc3RfcmF0ZV9yaXggOiAtMSk7Cit9CisKKy8qCisgKiBQaWNrIGEgZ29vZCAi
cmFuZG9tIiBiaXQtcmF0ZSB0byBzYW1wbGUgb3RoZXIgdGhhbiB0aGUgY3VycmVudCBvbmUuCisg
Ki8KK3N0YXRpYyBfX2lubGluZSBpbnQKK3BpY2tfc2FtcGxlX3JhdGUoY29uc3Qgc3RydWN0IGll
ZWU4MDIxMV9ub2RlICpuaSwgY29uc3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0LCAKKwlpbnQg
c2l6ZV9iaW4pCit7CisjZGVmaW5lCURPVDExUkFURShpeCkJKHJ0LT5pbmZvW2l4XS5kb3QxMVJh
dGUgJiBJRUVFODAyMTFfUkFURV9WQUwpCisjZGVmaW5lCU1DUyhpeCkJCShydC0+aW5mb1tpeF0u
ZG90MTFSYXRlIHwgSUVFRTgwMjExX1JBVEVfTUNTKQorCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxl
X25vZGUgKnNhbiA9IG5pLT5uaV9yY3RsczsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZSAqc2Ft
cGxlID0gc2FuLT5zYW5fc2FtcGxlOworCWludCBjdXJyZW50X3JpeCwgcml4OworCXVuc2lnbmVk
IGN1cnJlbnRfdHQ7CisJdWludDY0X3QgbWFzazsKKwkKKwljdXJyZW50X3JpeCA9IHNhbi0+Y3Vy
cmVudF9yaXhbc2l6ZV9iaW5dOworCWlmIChjdXJyZW50X3JpeCA8IDApIHsKKwkJLyogbm8gc3Vj
Y2Vzc2VzIHlldCwgc2VuZCBhdCB0aGUgbG93ZXN0IGJpdC1yYXRlICovCisJCS8qIFhYWCBzaG91
bGQgcmV0dXJuIE1DUzAgaWYgSFQgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJY3VycmVudF90dCA9
IHNhbi0+c3RhdHNbc2l6ZV9iaW5dW2N1cnJlbnRfcml4XS5hdmVyYWdlX3R4X3RpbWU7CisKKwly
aXggPSBzYW4tPmxhc3Rfc2FtcGxlX3JpeFtzaXplX2Jpbl0rMTsJLyogbmV4dCBzYW1wbGUgcmF0
ZSAqLworCW1hc2sgPSBzYW4tPnJhdGVtYXNrICZ+ICgodWludDY0X3QpIDE8PGN1cnJlbnRfcml4
KTsvKiBkb24ndCBzYW1wbGUgY3VycmVudCByYXRlICovCisJd2hpbGUgKG1hc2sgIT0gMCkgewor
CQlpZiAoKG1hc2sgJiAoKHVpbnQ2NF90KSAxPDxyaXgpKSA9PSAwKSB7CS8qIG5vdCBhIHN1cHBv
cnRlZCByYXRlICovCisJbmV4dHJhdGU6CisJCQlpZiAoKytyaXggPj0gcnQtPnJhdGVDb3VudCkK
KwkJCQlyaXggPSAwOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBUaGUgZm9sbG93
aW5nIGNvZGUgc3RvcHMgdHJ5aW5nIHRvIHNhbXBsZQorCQkgKiBub24tTUNTIHJhdGVzIHdoZW4g
c3BlYWtpbmcgdG8gYW4gTUNTIG5vZGUuCisJCSAqIEhvd2V2ZXIsIGF0IGxlYXN0IGZvciBDQ0sg
cmF0ZXMgaW4gMi40R0h6IG1vZGUsCisJCSAqIHRoZSBub24tTUNTIHJhdGVzIE1BWSBhY3R1YWxs
eSBwcm92aWRlIGJldHRlcgorCQkgKiBQRVIgYXQgdGhlIHZlcnkgZmFyIGVkZ2Ugb2YgcmVjZXB0
aW9uLgorCQkgKgorCQkgKiBIb3dldmVyISBVbnRpbCBhdGhfcmF0ZV9mb3JtX2FnZ3IoKSBncm93
cworCQkgKiBzb21lIGxvZ2ljIHRvIG5vdCBmb3JtIGFnZ3JlZ2F0ZXMgaWYgdGhlCisJCSAqIHNl
bGVjdGVkIHJhdGUgaXMgbm9uLU1DUywgdGhpcyB3b24ndCB3b3JrLgorCQkgKgorCQkgKiBTbyBk
b24ndCBkaXNhYmxlIHRoaXMgY29kZSB1bnRpbCB5b3UndmUgdGF1Z2h0CisJCSAqIGF0aF9yYXRl
X2Zvcm1fYWdncigpIHRvIGRyb3Agb3V0IGlmIGFueSBvZgorCQkgKiB0aGUgc2VsZWN0ZWQgcmF0
ZXMgYXJlIG5vbi1NQ1MuCisJCSAqLworI2lmIDEKKwkJLyogaWYgdGhlIG5vZGUgaXMgSFQgYW5k
IHRoZSByYXRlIGlzbid0IEhULCBkb24ndCBib3RoZXIgc2FtcGxlICovCisJCWlmICgobmktPm5p
X2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpICYmCisJCSAgICAocnQtPmluZm9bcml4XS5waHkg
IT0gSUVFRTgwMjExX1RfSFQpKSB7CisJCQltYXNrICY9IH4oKHVpbnQ2NF90KSAxPDxyaXgpOwor
CQkJZ290byBuZXh0cmF0ZTsKKwkJfQorI2VuZGlmCisKKwkJLyogdGhpcyBiaXQtcmF0ZSBpcyBh
bHdheXMgd29yc2UgdGhhbiB0aGUgY3VycmVudCBvbmUgKi8KKwkJaWYgKHNhbi0+c3RhdHNbc2l6
ZV9iaW5dW3JpeF0ucGVyZmVjdF90eF90aW1lID4gY3VycmVudF90dCkgeworCQkJbWFzayAmPSB+
KCh1aW50NjRfdCkgMTw8cml4KTsKKwkJCWdvdG8gbmV4dHJhdGU7CisJCX0KKworCQkvKiByYXJl
bHkgc2FtcGxlIGJpdC1yYXRlcyB0aGF0IGZhaWwgYSBsb3QgKi8KKwkJaWYgKHNhbi0+c3RhdHNb
c2l6ZV9iaW5dW3JpeF0uc3VjY2Vzc2l2ZV9mYWlsdXJlcyA+IHNhbXBsZS0+c2FtcGxlX21heF9z
dWNjZXNzaXZlX2ZhaWx1cmVzICYmCisJCSAgICB0aWNrcyAtIHNhbi0+c3RhdHNbc2l6ZV9iaW5d
W3JpeF0ubGFzdF90eCA8IHNhbXBsZS0+c2FtcGxlX3N0YWxlX2ZhaWx1cmVfdGltZW91dCkgewor
CQkJbWFzayAmPSB+KCh1aW50NjRfdCkgMTw8cml4KTsKKwkJCWdvdG8gbmV4dHJhdGU7CisJCX0K
KworCQkvKgorCQkgKiBGb3IgSFQsIG9ubHkgc2FtcGxlIGEgZmV3IHJhdGVzIG9uIGVpdGhlciBz
aWRlIG9mIHRoZQorCQkgKiBjdXJyZW50IHJpeDsgdGhlcmUncyBxdWl0ZSBsaWtlbHkgYSBsb3Qg
b2YgdGhlbS4KKwkJICovCisJCWlmIChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkg
eworCQkJaWYgKHJpeCA8IChjdXJyZW50X3JpeCAtIDMpIHx8CisJCQkgICAgcml4ID4gKGN1cnJl
bnRfcml4ICsgMykpIHsKKwkJCQltYXNrICY9IH4oKHVpbnQ2NF90KSAxPDxyaXgpOworCQkJCWdv
dG8gbmV4dHJhdGU7CisJCQl9CisJCX0KKworCQkvKiBEb24ndCBzYW1wbGUgbW9yZSB0aGFuIDIg
cmF0ZXMgaGlnaGVyIGZvciByYXRlcyA+IDExTSBmb3Igbm9uLUhUIHJhdGVzICovCisJCWlmICgh
IChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkpIHsKKwkJCWlmIChET1QxMVJBVEUo
cml4KSA+IDIqMTEgJiYgcml4ID4gY3VycmVudF9yaXggKyAyKSB7CisJCQkJbWFzayAmPSB+KCh1
aW50NjRfdCkgMTw8cml4KTsKKwkJCQlnb3RvIG5leHRyYXRlOworCQkJfQorCQl9CisKKwkJc2Fu
LT5sYXN0X3NhbXBsZV9yaXhbc2l6ZV9iaW5dID0gcml4OworCQlyZXR1cm4gcml4OworCX0KKwly
ZXR1cm4gY3VycmVudF9yaXg7CisjdW5kZWYgRE9UMTFSQVRFCisjdW5kZWYgTUNTCit9CisKK3N0
YXRpYyBpbnQKK3NhbXBsZV9nZXRfc3RhdGljX3JpeChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25v
ZGUgKm5pKQoreworI2RlZmluZQlSQVRFKF9peCkJKG5pLT5uaV9yYXRlcy5yc19yYXRlc1soX2l4
KV0gJiBJRUVFODAyMTFfUkFURV9WQUwpCisjZGVmaW5lCU1DUyhfaXgpCShuaS0+bmlfaHRyYXRl
cy5yc19yYXRlc1tfaXhdIHwgSUVFRTgwMjExX1JBVEVfTUNTKQorCXN0cnVjdCBpZWVlODAyMTF2
YXAgKnZhcCA9IG5pLT5uaV92YXA7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxl
ICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOwor
CWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhwYXJhbSAqdHAgPSBuaS0+bmlfdHhwYXJtczsKKwlp
bnQgc3JhdGU7CisKKwkvKiBDaGVjayBNQ1MgcmF0ZXMgKi8KKwlmb3IgKHNyYXRlID0gbmktPm5p
X2h0cmF0ZXMucnNfbnJhdGVzIC0gMTsgc3JhdGUgPj0gMDsgc3JhdGUtLSkgeworCQlpZiAoTUNT
KHNyYXRlKSA9PSB0cC0+dWNhc3RyYXRlKQorCQkJcmV0dXJuIHJ0LT5yYXRlQ29kZVRvSW5kZXhb
dHAtPnVjYXN0cmF0ZV07CisJfQorCisJLyogQ2hlY2sgbGVnYWN5IHJhdGVzICovCisJZm9yIChz
cmF0ZSA9IG5pLT5uaV9yYXRlcy5yc19ucmF0ZXMgLSAxOyBzcmF0ZSA+PSAwOyBzcmF0ZS0tKSB7
CisJCWlmIChSQVRFKHNyYXRlKSA9PSB0cC0+dWNhc3RyYXRlKQorCQkJcmV0dXJuIHJ0LT5yYXRl
Q29kZVRvSW5kZXhbdHAtPnVjYXN0cmF0ZV07CisJfQorCXJldHVybiAtMTsKKyN1bmRlZglSQVRF
CisjdW5kZWYJTUNTCit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfdXBkYXRlX3N0YXRpY19yaXgo
c3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9u
b2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eHBhcmFt
ICp0cCA9IG5pLT5uaV90eHBhcm1zOworCisJaWYgKHRwICE9IE5VTEwgJiYgdHAtPnVjYXN0cmF0
ZSAhPSBJRUVFODAyMTFfRklYRURfUkFURV9OT05FKSB7CisJCS8qCisJCSAqIEEgZml4ZWQgcmF0
ZSBpcyB0byBiZSB1c2VkOyB1Y2FzdHJhdGUgaXMgdGhlIElFRUUgY29kZQorCQkgKiBmb3IgdGhp
cyByYXRlIChzYW5zIGJhc2ljIGJpdCkuICBDaGVjayB0aGlzIGFnYWluc3QgdGhlCisJCSAqIG5l
Z290aWF0ZWQgcmF0ZSBzZXQgZm9yIHRoZSBub2RlLiAgTm90ZSB0aGUgZml4ZWQgcmF0ZQorCQkg
KiBtYXkgbm90IGJlIGF2YWlsYWJsZSBmb3IgdmFyaW91cyByZWFzb25zIHNvIHdlIG9ubHkKKwkJ
ICogc2V0dXAgdGhlIHN0YXRpYyByYXRlIGluZGV4IGlmIHRoZSBsb29rdXAgaXMgc3VjY2Vzc2Z1
bC4KKwkJICovCisJCXNhbi0+c3RhdGljX3JpeCA9IHNhbXBsZV9nZXRfc3RhdGljX3JpeChuaSk7
CisJfSBlbHNlIHsKKwkJc2FuLT5zdGF0aWNfcml4ID0gLTE7CisJfQorfQorCisvKgorICogUGlj
ayBhIG5vbi1IVCByYXRlIHRvIGJlZ2luIHVzaW5nLgorICovCitzdGF0aWMgaW50CitzYW1wbGVf
cGlja19zZWVkX3JhdGVfbGVnYWN5KGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksIGlu
dCBmcmFtZUxlbikKK3sKKyNkZWZpbmUJRE9UMTFSQVRFKGl4KQkocnQtPmluZm9baXhdLmRvdDEx
UmF0ZSAmIElFRUU4MDIxMV9SQVRFX1ZBTCkKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBu
aS0+bmlfdmFwOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNhbiA9IG5pLT5uaV9y
Y3RsczsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0ID0gaWVlZTgwMjEx
X2dldF9yYXRldGFibGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisJCisJY29uc3QgaW50IHNp
emVfYmluID0gc2l6ZV90b19iaW4oZnJhbWVMZW4pOworCWludCByaXggPSAtMTsKKworCS8qIG5v
IHBhY2tldCBoYXMgYmVlbiBzZW50IHN1Y2Nlc3NmdWxseSB5ZXQgKi8KKwlmb3IgKHJpeCA9IHJ0
LT5yYXRlQ291bnQtMTsgcml4ID4gMDsgcml4LS0pIHsKKwkJaWYgKChzYW4tPnJhdGVtYXNrICYg
KCh1aW50NjRfdCkgMTw8cml4KSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIFNraXAgSFQg
cmF0ZXMgKi8KKwkJaWYgKHJ0LT5pbmZvW3JpeF0ucGh5ID09IElFRUU4MDIxMV9UX0hUKQorCQkJ
Y29udGludWU7CisKKwkJLyoKKwkJICogUGljayB0aGUgaGlnaGVzdCByYXRlIDw9IDM2IE1icHMK
KwkJICogdGhhdCBoYXNuJ3QgZmFpbGVkLgorCQkgKi8KKwkJaWYgKERPVDExUkFURShyaXgpIDw9
IDcyICYmCisJCSAgICBzYW4tPnN0YXRzW3NpemVfYmluXVtyaXhdLnN1Y2Nlc3NpdmVfZmFpbHVy
ZXMgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJpeDsKKyN1bmRlZiBET1Qx
MVJBVEUKK30KKworLyoKKyAqIFBpY2sgYSBIVCByYXRlIHRvIGJlZ2luIHVzaW5nLgorICoKKyAq
IERvbid0IHVzZSBhbnkgbm9uLUhUIHJhdGVzOyBvbmx5IGNvbnNpZGVyIEhUIHJhdGVzLgorICov
CitzdGF0aWMgaW50CitzYW1wbGVfcGlja19zZWVkX3JhdGVfaHQoY29uc3Qgc3RydWN0IGllZWU4
MDIxMV9ub2RlICpuaSwgaW50IGZyYW1lTGVuKQoreworI2RlZmluZQlNQ1MoaXgpCQkocnQtPmlu
Zm9baXhdLmRvdDExUmF0ZSB8IElFRUU4MDIxMV9SQVRFX01DUykKKwlzdHJ1Y3QgaWVlZTgwMjEx
dmFwICp2YXAgPSBuaS0+bmlfdmFwOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNh
biA9IG5pLT5uaV9yY3RsczsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0
ID0gaWVlZTgwMjExX2dldF9yYXRldGFibGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisJCisJ
Y29uc3QgaW50IHNpemVfYmluID0gc2l6ZV90b19iaW4oZnJhbWVMZW4pOworCWludCByaXggPSAt
MSwgaHRfcml4ID0gLTE7CisKKwkvKiBubyBwYWNrZXQgaGFzIGJlZW4gc2VudCBzdWNjZXNzZnVs
bHkgeWV0ICovCisJZm9yIChyaXggPSBydC0+cmF0ZUNvdW50LTE7IHJpeCA+IDA7IHJpeC0tKSB7
CisJCS8qIFNraXAgcmF0ZXMgd2UgY2FuJ3QgdXNlICovCisJCWlmICgoc2FuLT5yYXRlbWFzayAm
ICgodWludDY0X3QpIDE8PHJpeCkpID09IDApCisJCQljb250aW51ZTsKKworCQkvKiBLZWVwIGEg
Y29weSBvZiB0aGUgbGFzdCBzZWVuIEhUIHJhdGUgaW5kZXggKi8KKwkJaWYgKHJ0LT5pbmZvW3Jp
eF0ucGh5ID09IElFRUU4MDIxMV9UX0hUKQorCQkJaHRfcml4ID0gcml4OworCisJCS8qIFNraXAg
bm9uLUhUIHJhdGVzICovCisJCWlmIChydC0+aW5mb1tyaXhdLnBoeSAhPSBJRUVFODAyMTFfVF9I
VCkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIFBpY2sgYSBtZWRpdW0tc3BlZWQgcmF0ZSBy
ZWdhcmRsZXNzIG9mIHN0cmVhbSBjb3VudAorCQkgKiB3aGljaCBoYXMgbm90IHNlZW4gYW55IGZh
aWx1cmVzLiBIaWdoZXIgcmF0ZXMgbWF5IGZhaWw7CisJCSAqIHdlJ2xsIHRyeSB0aGVtIGxhdGVy
LgorCQkgKi8KKwkJaWYgKCgoTUNTKHJpeCkgJiAweDcpIDw9IDQpICYmCisJCSAgICBzYW4tPnN0
YXRzW3NpemVfYmluXVtyaXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMgPT0gMCkgeworCQkJYnJlYWs7
CisJCX0KKwl9CisKKwkvKgorCSAqIElmIGFsbCB0aGUgTUNTIHJhdGVzIGhhdmUgc3VjY2Vzc2l2
ZSBmYWlsdXJlcywgcml4IHNob3VsZCBiZQorCSAqID4gMDsgb3RoZXJ3aXNlIHVzZSB0aGUgbG93
ZXN0IE1DUyByaXggKGhvcGVmdWxseSBNQ1MgMC4pCisJICovCisJcmV0dXJuIE1BWChyaXgsIGh0
X3JpeCk7CisjdW5kZWYgTUNTCit9CisKK3N0YXRpYyBpbnQKK3NhbXBsZV9yYXRlKHN0cnVjdCBp
ZWVlODAyMTFfbm9kZSAqbmksIHZvaWQgKmFyZyBfX3VudXNlZCwgdWludDMyX3QgaWFyZyBfX3Vu
dXNlZCkKK3sKKyNkZWZpbmUJRE9UMTFSQVRFKGl4KQkocnQtPmluZm9baXhdLmRvdDExUmF0ZSAm
IElFRUU4MDIxMV9SQVRFX1ZBTCkKKyNkZWZpbmUJTUNTKGl4KQkJKHJ0LT5pbmZvW2l4XS5kb3Qx
MVJhdGUgfCBJRUVFODAyMTFfUkFURV9NQ1MpCisjZGVmaW5lCVJBVEUoaXgpCShET1QxMVJBVEUo
aXgpIC8gMikKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOworCXN0cnVj
dCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNhbiA9IG5pLT5uaV9yY3RsczsKKwlzdHJ1Y3QgaWVl
ZTgwMjExX3NhbXBsZSAqc2FtcGxlID0gc2FuLT5zYW5fc2FtcGxlOworCWNvbnN0IHN0cnVjdCBp
ZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQgPSBpZWVlODAyMTFfZ2V0X3JhdGV0YWJsZSh2YXAtPml2
X2ljLT5pY19jdXJjaGFuKTsKKwkKKwlpbnQgcml4LCBtcnIsIGJlc3Rfcml4LCBjaGFuZ2VfcmF0
ZXM7CisJdW5zaWduZWQgYXZlcmFnZV90eF90aW1lOworCQorCXNpemVfdCBmcmFtZUxlbiA9IChz
aXplX3QpaWFyZzsKKwljb25zdCBpbnQgc2l6ZV9iaW4gPSBzaXplX3RvX2JpbihmcmFtZUxlbik7
CisKKwlzYW1wbGVfdXBkYXRlX3N0YXRpY19yaXgobmkpOworCisJaWYgKHNhbi0+c3RhdGljX3Jp
eCAhPSAtMSkgeworCQlyaXggPSBzYW4tPnN0YXRpY19yaXg7CisJCWdvdG8gZG9uZTsKKwl9CisK
KwlpZiAoSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQX01SUih2YXApKQorCQltcnIgPSAxOworCWlm
ICghIElFRUU4MDIxMV9SQVRFQ1RMX0hBU0NBUF9NUlJQUk9UKHZhcCkpCisJCW1yciA9IDA7CisK
KwliZXN0X3JpeCA9IHBpY2tfYmVzdF9yYXRlKG5pLCBydCwgc2l6ZV9iaW4sICFtcnIpOworCWlm
IChiZXN0X3JpeCA+PSAwKSB7CisJCWF2ZXJhZ2VfdHhfdGltZSA9IHNhbi0+c3RhdHNbc2l6ZV9i
aW5dW2Jlc3Rfcml4XS5hdmVyYWdlX3R4X3RpbWU7CisJfSBlbHNlIHsKKwkJYXZlcmFnZV90eF90
aW1lID0gMDsKKwl9CisKKwkvKgorCSAqIExpbWl0IHRoZSB0aW1lIG1lYXN1cmluZyB0aGUgcGVy
Zm9ybWFuY2Ugb2Ygb3RoZXIgdHgKKwkgKiByYXRlcyB0byBzYW1wbGVfcmF0ZSUgb2YgdGhlIHRv
dGFsIHRyYW5zbWlzc2lvbiB0aW1lLgorCSAqLworCWlmIChzYW4tPnNhbXBsZV90dFtzaXplX2Jp
bl0gPCBhdmVyYWdlX3R4X3RpbWUgKiAoc2FuLT5wYWNrZXRzX3NpbmNlX3NhbXBsZVtzaXplX2Jp
bl0gKgorCQlzYW1wbGUtPnNhbXBsZV9yYXRlLzEwMCkpIHsKKwkJcml4ID0gcGlja19zYW1wbGVf
cmF0ZShuaSwgcnQsIHNpemVfYmluKTsKKwkJSUVFRTgwMjExX05PVEUodmFwLCBJRUVFODAyMTFf
TVNHX1JBVEVDVEwsCisJCSAgICAgJm5pLCAiYXR0ICVkIHNhbXBsZV90dCAlZCBzaXplICV1IHNh
bXBsZSByYXRlICVkICVzIGN1cnJlbnQgcmF0ZSAlZCAlcyIsCisJCSAgICAgYXZlcmFnZV90eF90
aW1lLAorCQkgICAgIHNhbi0+c2FtcGxlX3R0W3NpemVfYmluXSwKKwkJICAgICBiaW5fdG9fc2l6
ZShzaXplX2JpbiksCisJCSAgICAgZG90MTFyYXRlKHJ0LCByaXgpLAorCQkgICAgIGRvdDExcmF0
ZV9sYWJlbChydCwgcml4KSwKKwkJICAgICBkb3QxMXJhdGUocnQsIHNhbi0+Y3VycmVudF9yaXhb
c2l6ZV9iaW5dKSwKKwkJICAgICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+Y3VycmVudF9yaXhb
c2l6ZV9iaW5dKSk7CisJCWlmIChyaXggIT0gc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl0pIHsK
KwkJCXNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3NpemVfYmluXSA9IHJpeDsKKwkJfSBlbHNlIHsK
KwkJCXNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3NpemVfYmluXSA9IC0xOworCQl9CisJCXNhbi0+
cGFja2V0c19zaW5jZV9zYW1wbGVbc2l6ZV9iaW5dID0gMDsKKwl9IGVsc2UgeworCQljaGFuZ2Vf
cmF0ZXMgPSAwOworCQlpZiAoIXNhbi0+cGFja2V0c19zZW50W3NpemVfYmluXSB8fCBiZXN0X3Jp
eCA9PSAtMSkgeworCQkJLyogbm8gcGFja2V0IGhhcyBiZWVuIHNlbnQgc3VjY2Vzc2Z1bGx5IHll
dCAqLworCQkJY2hhbmdlX3JhdGVzID0gMTsKKwkJCWlmIChuaS0+bmlfZmxhZ3MgJiBJRUVFODAy
MTFfTk9ERV9IVCkKKwkJCQliZXN0X3JpeCA9IHNhbXBsZV9waWNrX3NlZWRfcmF0ZV9odChuaSwg
ZnJhbWVMZW4pOworCQkJZWxzZQorCQkJCWJlc3Rfcml4ID0gc2FtcGxlX3BpY2tfc2VlZF9yYXRl
X2xlZ2FjeShuaSwgZnJhbWVMZW4pOworCQl9IGVsc2UgaWYgKHNhbi0+cGFja2V0c19zZW50W3Np
emVfYmluXSA8IDIwKSB7CisJCQkvKiBsZXQgdGhlIGJpdC1yYXRlIHN3aXRjaCBxdWlja2x5IGR1
cmluZyB0aGUgZmlyc3QgZmV3IHBhY2tldHMgKi8KKwkJCUlFRUU4MDIxMV9OT1RFKHZhcCwKKwkJ
CSAgICBJRUVFODAyMTFfTVNHX1JBVEVDVEwsICZuaSwKKwkJCSAgICAiJXM6IHN3aXRjaGluZyBx
dWlja2x5Li4iLCBfX2Z1bmNfXyk7CisJCQljaGFuZ2VfcmF0ZXMgPSAxOworCQl9IGVsc2UgaWYg
KHRpY2tzIC0gc2FtcGxlLT5zYW1wbGVfbWluX3N3aXRjaCA+IHNhbi0+dGlja3Nfc2luY2Vfc3dp
dGNoW3NpemVfYmluXSkgeworCQkJLyogbWluX3N3aXRjaCBzZWNvbmRzIGhhdmUgZ29uZSBieSAq
LworCQkJSUVFRTgwMjExX05PVEUodmFwLAorCQkJICAgIElFRUU4MDIxMV9NU0dfUkFURUNUTCwg
Jm5pLAorCQkJICAgICIlczogbWluX3N3aXRjaCAlZCA+IHRpY2tzX3NpbmNlX3N3aXRjaCAlZC4u
IiwKKwkJCSAgICBfX2Z1bmNfXywgdGlja3MgLSBzYW1wbGUtPnNhbXBsZV9taW5fc3dpdGNoLCBz
YW4tPnRpY2tzX3NpbmNlX3N3aXRjaFtzaXplX2Jpbl0pOworCQkJY2hhbmdlX3JhdGVzID0gMTsK
KwkJfSBlbHNlIGlmICgoISAobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpKSAmJgor
CQkgICAgKDIqYXZlcmFnZV90eF90aW1lIDwgc2FuLT5zdGF0c1tzaXplX2Jpbl1bc2FuLT5jdXJy
ZW50X3JpeFtzaXplX2Jpbl1dLmF2ZXJhZ2VfdHhfdGltZSkpIHsKKwkJCS8qIHRoZSBjdXJyZW50
IGJpdC1yYXRlIGlzIHR3aWNlIGFzIHNsb3cgYXMgdGhlIGJlc3Qgb25lICovCisJCQlJRUVFODAy
MTFfTk9URSh2YXAsCisJCQkgICAgSUVFRTgwMjExX01TR19SQVRFQ1RMLCAmbmksCisJCQkgICAg
IiVzOiAyeCBhdHQgKD0gJWQpIDwgY3VyX3JpeCBhdHQgJWQiLAorCQkJICAgIF9fZnVuY19fLAor
CQkJICAgIDIgKiBhdmVyYWdlX3R4X3RpbWUsIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3Nhbi0+Y3Vy
cmVudF9yaXhbc2l6ZV9iaW5dXS5hdmVyYWdlX3R4X3RpbWUpOworCQkJY2hhbmdlX3JhdGVzID0g
MTsKKwkJfSBlbHNlIGlmICgobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpKSB7CisJ
CQlpbnQgY3VyX3JpeCA9IHNhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dOworCQkJaW50IGN1cl9h
dHQgPSBzYW4tPnN0YXRzW3NpemVfYmluXVtjdXJfcml4XS5hdmVyYWdlX3R4X3RpbWU7CisJCQkv
KgorCQkJICogSWYgdGhlIG5vZGUgaXMgSFQsIHVwZ3JhZGUgaXQgaWYgdGhlIE1DUyByYXRlIGlz
CisJCQkgKiBoaWdoZXIgYW5kIHRoZSBhdmVyYWdlIHR4IHRpbWUgaXMgd2l0aGluIDIwJSBvZgor
CQkJICogdGhlIGN1cnJlbnQgcmF0ZS4gSXQgY2FuIGZhaWwgYSBsaXR0bGUuCisJCQkgKgorCQkJ
ICogVGhpcyBpcyBsaWtlbHkgbm90IG9wdGltYWwhCisJCQkgKi8KKyNpZiAwCisJCQlwcmludGYo
ImN1ciByaXgvYXR0ICV4LyVkLCBiZXN0IHJpeC9hdHQgJXgvJWRcbiIsCisJCQkgICAgTUNTKGN1
cl9yaXgpLCBjdXJfYXR0LCBNQ1MoYmVzdF9yaXgpLCBhdmVyYWdlX3R4X3RpbWUpOworI2VuZGlm
CisJCQlpZiAoKE1DUyhiZXN0X3JpeCkgPiBNQ1MoY3VyX3JpeCkpICYmCisJCQkgICAgKGF2ZXJh
Z2VfdHhfdGltZSAqIDgpIDw9IChjdXJfYXR0ICogMTApKSB7CisJCQkJSUVFRTgwMjExX05PVEUo
dmFwLAorCQkJCSAgICBJRUVFODAyMTFfTVNHX1JBVEVDVEwsICZuaSwKKwkJCQkgICAgIiVzOiBI
VDogYmVzdF9yaXggMHglZCA+IGN1cl9yaXggMHgleCwgYXZlcmFnZV90eF90aW1lICVkLCBjdXJf
YXR0ICVkIiwKKwkJCQkgICAgX19mdW5jX18sCisJCQkJICAgIE1DUyhiZXN0X3JpeCksIE1DUyhj
dXJfcml4KSwgYXZlcmFnZV90eF90aW1lLCBjdXJfYXR0KTsKKwkJCQljaGFuZ2VfcmF0ZXMgPSAx
OworCQkJfQorCQl9CisKKwkJc2FuLT5wYWNrZXRzX3NpbmNlX3NhbXBsZVtzaXplX2Jpbl0rKzsK
KwkJCisJCWlmIChjaGFuZ2VfcmF0ZXMpIHsKKwkJCWlmIChiZXN0X3JpeCAhPSBzYW4tPmN1cnJl
bnRfcml4W3NpemVfYmluXSkgeworCQkJCUlFRUU4MDIxMV9OT1RFKHZhcCwKKwkJCQkgICAgSUVF
RTgwMjExX01TR19SQVRFQ1RMLAorCQkJCSAgICAmbmksCisiJXM6IHNpemUgJWQgc3dpdGNoIHJh
dGUgJWQgKCVkLyVkKSAtPiAlZCAoJWQvJWQpIGFmdGVyICVkIHBhY2tldHMgbXJyICVkIiwKKwkJ
CQkgICAgX19mdW5jX18sCisJCQkJICAgIGJpbl90b19zaXplKHNpemVfYmluKSwKKwkJCQkgICAg
UkFURShzYW4tPmN1cnJlbnRfcml4W3NpemVfYmluXSksCisJCQkJICAgIHNhbi0+c3RhdHNbc2l6
ZV9iaW5dW3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dXS5hdmVyYWdlX3R4X3RpbWUsCisJCQkJ
ICAgIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dXS5wZXJm
ZWN0X3R4X3RpbWUsCisJCQkJICAgIFJBVEUoYmVzdF9yaXgpLAorCQkJCSAgICBzYW4tPnN0YXRz
W3NpemVfYmluXVtiZXN0X3JpeF0uYXZlcmFnZV90eF90aW1lLAorCQkJCSAgICBzYW4tPnN0YXRz
W3NpemVfYmluXVtiZXN0X3JpeF0ucGVyZmVjdF90eF90aW1lLAorCQkJCSAgICBzYW4tPnBhY2tl
dHNfc2luY2Vfc3dpdGNoW3NpemVfYmluXSwKKwkJCQkgICAgbXJyKTsKKwkJCX0KKwkJCXNhbi0+
cGFja2V0c19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dID0gMDsKKwkJCXNhbi0+Y3VycmVudF9yaXhb
c2l6ZV9iaW5dID0gYmVzdF9yaXg7CisJCQlzYW4tPnRpY2tzX3NpbmNlX3N3aXRjaFtzaXplX2Jp
bl0gPSB0aWNrczsKKwkJCS8qIAorCQkJICogU2V0IHRoZSB2aXNpYmxlIHR4cmF0ZSBmb3IgdGhp
cyBub2RlLgorCQkJICovCisJCQluaS0+bmlfdHhyYXRlID0gZG90MTFyYXRlKHJ0LCBiZXN0X3Jp
eCk7CisJCX0KKwkJcml4ID0gc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl07CisJCXNhbi0+cGFj
a2V0c19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dKys7CisJfQorCS8vICp0cnkwID0gbXJyID8gc2Fu
LT5zY2hlZFtyaXhdLnQwIDogQVRIX1RYTUFYVFJZOworZG9uZToKKworCS8qCisJICogVGhpcyBi
dWcgdG90YWxseSBzdWNrcyBhbmQgc2hvdWxkIGJlIGZpeGVkLgorCSAqCisJICogRm9yIG5vdyB0
aG91Z2gsIGxldCdzIG5vdCBwYW5pYywgc28gd2UgY2FuIHN0YXJ0IHRvIGZpZ3VyZQorCSAqIG91
dCBob3cgdG8gYmV0dGVyIHJlcHJvZHVjZSBpdC4KKwkgKi8KKwlpZiAocml4IDwgMCB8fCByaXgg
Pj0gcnQtPnJhdGVDb3VudCkgeworCQlwcmludGYoIiVzOiBFUlJPUjogcml4ICVkIG91dCBvZiBi
b3VuZHMgKHJhdGVDb3VudD0lZClcbiIsCisJCSAgICBfX2Z1bmNfXywKKwkJICAgIHJpeCwKKwkJ
ICAgIHJ0LT5yYXRlQ291bnQpOworCQkgICAgcml4ID0gMDsJLyogWFhYIGp1c3QgZGVmYXVsdCBm
b3Igbm93ICovCisJfQorCUtBU1NFUlQocml4ID49IDAgJiYgcml4IDwgcnQtPnJhdGVDb3VudCwg
KCJyaXggaXMgJWQiLCByaXgpKTsKKworCS8vICpyaXgwID0gcml4OworCS8vICp0eHJhdGUgPSBy
dC0+aW5mb1tyaXhdLnJhdGVDb2RlCisJLy8gCXwgKHNob3J0UHJlYW1ibGUgPyBydC0+aW5mb1ty
aXhdLnNob3J0UHJlYW1ibGUgOiAwKTsKKwlzYW4tPnBhY2tldHNfc2VudFtzaXplX2Jpbl0rKzsK
KworCXJldHVybiByaXg7CisjdW5kZWYgRE9UMTFSQVRFCisjdW5kZWYgTUNTCisjdW5kZWYgUkFU
RQorfQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3JhdGVzKHN0cnVjdCBpZWVlODAyMTFfbm9kZSAq
bmksIHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqcmNfaW5mbykKK3sKKwlzdHJ1Y3QgaWVlZTgw
MjExX3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisJdWludDhfdCByaXgwID0gc2Ft
cGxlX3JhdGUobmksIE5VTEwsIDApOworCWNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlICpzY2hlZCA9
ICZzYW4tPnNjaGVkW3JpeDBdOworCXN0cnVjdCBpZWVlODAyMTFfcmNfc2VyaWVzICpyYyA9IHJj
X2luZm8tPmlyaV9yYzsKKworCUtBU1NFUlQocml4MCA9PSBzY2hlZC0+cjAsICgicml4MCAoJXgp
ICE9IHNjaGVkLT5yMCAoJXgpIVxuIiwKKwkgICAgcml4MCwgc2NoZWQtPnIwKSk7CisJLyogWFhY
ICovCisJcmNbMF0uZmxhZ3MgPSByY1sxXS5mbGFncyA9IHJjWzJdLmZsYWdzID0gcmNbM10uZmxh
Z3MgPSAwOworCisJcmNbMF0ucml4ID0gc2NoZWQtPnIwOworCXJjWzFdLnJpeCA9IHNjaGVkLT5y
MTsKKwlyY1syXS5yaXggPSBzY2hlZC0+cjI7CisJcmNbM10ucml4ID0gc2NoZWQtPnIzOworCisJ
cmNbMF0udHJpZXMgPSBzY2hlZC0+dDA7CisJcmNbMV0udHJpZXMgPSBzY2hlZC0+dDE7CisJcmNb
Ml0udHJpZXMgPSBzY2hlZC0+dDI7CisJcmNbM10udHJpZXMgPSBzY2hlZC0+dDM7Cit9CisKK3N0
YXRpYyB2b2lkCit1cGRhdGVfc3RhdHMoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAor
ICAgIAkgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksCisJCSAgaW50IGZyYW1lX3Np
emUsCisJCSAgaW50IHJpeDAsIGludCB0cmllczAsCisJCSAgaW50IHJpeDEsIGludCB0cmllczEs
CisJCSAgaW50IHJpeDIsIGludCB0cmllczIsCisJCSAgaW50IHJpeDMsIGludCB0cmllczMsCisJ
CSAgaW50IHNob3J0X3RyaWVzLCBpbnQgdHJpZXMsCisJCSAgaW50IG5mcmFtZXMsIGludCBuYmFk
KQoreworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNhbiA9IG5pLT5uaV9yY3RsczsK
KwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZSAqc2FtcGxlID0gc2FuLT5zYW5fc2FtcGxlOworCisJ
Y29uc3QgaW50IHNpemVfYmluID0gc2l6ZV90b19iaW4oZnJhbWVfc2l6ZSk7CisJY29uc3QgaW50
IHNpemUgPSBiaW5fdG9fc2l6ZShzaXplX2Jpbik7CisKKwlpbnQgaXNfaHQ0MCA9IGllZWU4MDIx
MV9yYXRlY3RsX2hhc2NhcF9jdzQwKHZhcCwgbmkpOworCWludCB0dCwgdHJpZXNfc29fZmFyOwor
CWludCBwY3Q7CisKKwlpZiAoIUlTX1JBVEVfREVGSU5FRChzYW4sIHJpeDApKQorCQlyZXR1cm47
CisJdHQgPSBjYWxjX3VzZWNzX3VuaWNhc3RfcGFja2V0KHZhcCwgc2l6ZSwgcml4MCwgc2hvcnRf
dHJpZXMsCisJCU1JTih0cmllczAsIHRyaWVzKSAtIDEsIGlzX2h0NDApOworCXRyaWVzX3NvX2Zh
ciA9IHRyaWVzMDsKKworCWlmICh0cmllczEgJiYgdHJpZXNfc29fZmFyIDwgdHJpZXMpIHsKKwkJ
aWYgKCFJU19SQVRFX0RFRklORUQoc2FuLCByaXgxKSkKKwkJCXJldHVybjsKKwkJdHQgKz0gY2Fs
Y191c2Vjc191bmljYXN0X3BhY2tldCh2YXAsIHNpemUsIHJpeDEsIHNob3J0X3RyaWVzLAorCQkJ
TUlOKHRyaWVzMSArIHRyaWVzX3NvX2ZhciwgdHJpZXMpIC0gdHJpZXNfc29fZmFyIC0gMSwgaXNf
aHQ0MCk7CisJCXRyaWVzX3NvX2ZhciArPSB0cmllczE7CisJfQorCisJaWYgKHRyaWVzMiAmJiB0
cmllc19zb19mYXIgPCB0cmllcykgeworCQlpZiAoIUlTX1JBVEVfREVGSU5FRChzYW4sIHJpeDIp
KQorCQkJcmV0dXJuOworCQl0dCArPSBjYWxjX3VzZWNzX3VuaWNhc3RfcGFja2V0KHZhcCwgc2l6
ZSwgcml4Miwgc2hvcnRfdHJpZXMsCisJCQlNSU4odHJpZXMyICsgdHJpZXNfc29fZmFyLCB0cmll
cykgLSB0cmllc19zb19mYXIgLSAxLCBpc19odDQwKTsKKwkJdHJpZXNfc29fZmFyICs9IHRyaWVz
MjsKKwl9CisKKwlpZiAodHJpZXMzICYmIHRyaWVzX3NvX2ZhciA8IHRyaWVzKSB7CisJCWlmICgh
SVNfUkFURV9ERUZJTkVEKHNhbiwgcml4MykpCisJCQlyZXR1cm47CisJCXR0ICs9IGNhbGNfdXNl
Y3NfdW5pY2FzdF9wYWNrZXQodmFwLCBzaXplLCByaXgzLCBzaG9ydF90cmllcywKKwkJCU1JTih0
cmllczMgKyB0cmllc19zb19mYXIsIHRyaWVzKSAtIHRyaWVzX3NvX2ZhciAtIDEsIGlzX2h0NDAp
OworCX0KKworCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50b3RhbF9wYWNrZXRzIDwg
c2FtcGxlLT5zYW5wbGVfc21vb3RoaW5nX21pbnBhY2tldHMpIHsKKwkJLyoganVzdCBhdmVyYWdl
IHRoZSBmaXJzdCBmZXcgcGFja2V0cyAqLworCQlpbnQgYXZnX3R4ID0gc2FuLT5zdGF0c1tzaXpl
X2Jpbl1bcml4MF0uYXZlcmFnZV90eF90aW1lOworCQlpbnQgcGFja2V0cyA9IHNhbi0+c3RhdHNb
c2l6ZV9iaW5dW3JpeDBdLnRvdGFsX3BhY2tldHM7CisJCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3Jp
eDBdLmF2ZXJhZ2VfdHhfdGltZSA9ICh0dCsoYXZnX3R4KnBhY2tldHMpKS8ocGFja2V0cytuZnJh
bWVzKTsKKwl9IGVsc2UgeworCQkvKiB1c2UgYSBld21hICovCisJCXNhbi0+c3RhdHNbc2l6ZV9i
aW5dW3JpeDBdLmF2ZXJhZ2VfdHhfdGltZSA9IAorCQkJKChzYW4tPnN0YXRzW3NpemVfYmluXVty
aXgwXS5hdmVyYWdlX3R4X3RpbWUgKiBzYW1wbGUtPnNhbnBsZV9zbW9vdGhpbmdfcmF0ZSkgKyAK
KwkJCSAodHQgKiAoMTAwIC0gc2FtcGxlLT5zYW5wbGVfc21vb3RoaW5nX3JhdGUpKSkgLyAxMDA7
CisJfQorCQorCS8qCisJICogWFhYIERvbid0IG1hcmsgdGhlIGhpZ2hlciBiaXQgcmF0ZXMgYXMg
YWxzbyBoYXZpbmcgZmFpbGVkOyBhcyB0aGlzCisJICogdW5mb3J0dW5hdGVseSBzdG9wcyB0aG9z
ZSByYXRlcyBmcm9tIGJlaW5nIHRhc3RlZCB3aGVuIHRyeWluZyB0bworCSAqIFRYLiBUaGlzIGhh
cHBlbnMgd2l0aCAxMW4gYWdncmVnYXRpb24uCisJICovCisJaWYgKG5mcmFtZXMgPT0gbmJhZCkg
eworCQlzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS5zdWNjZXNzaXZlX2ZhaWx1cmVzICs9IG5i
YWQ7CisKKwl9IGVsc2UgeworCQlzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS5wYWNrZXRzX2Fj
a2VkICs9IChuZnJhbWVzIC0gbmJhZCk7CisJCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnN1
Y2Nlc3NpdmVfZmFpbHVyZXMgPSAwOworCX0KKwlzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50
cmllcyArPSB0cmllczsKKwlzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS5sYXN0X3R4ID0gdGlj
a3M7CisJc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0udG90YWxfcGFja2V0cyArPSBuZnJhbWVz
OworCisJLyogdXBkYXRlIEVXTUEgZm9yIHRoaXMgcml4ICovCisKKwkvKiBDYWxjdWxhdGUgcGVy
Y2VudGFnZSBiYXNlZCBvbiBjdXJyZW50IHJhdGUgKi8KKwlpZiAobmZyYW1lcyA9PSAwKQorCQlu
ZnJhbWVzID0gbmJhZCA9IDE7CisJcGN0ID0gKChuZnJhbWVzIC0gbmJhZCkgKiAxMDAwKSAvIG5m
cmFtZXM7CisKKwlpZiAoc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0udG90YWxfcGFja2V0cyA8
CisJICAgIHNhbXBsZS0+c2FucGxlX3Ntb290aGluZ19taW5wYWNrZXRzKSB7CisJCS8qIGp1c3Qg
YXZlcmFnZSB0aGUgZmlyc3QgZmV3IHBhY2tldHMgKi8KKwkJaW50IGFfcGN0ID0gKHNhbi0+c3Rh
dHNbc2l6ZV9iaW5dW3JpeDBdLnBhY2tldHNfYWNrZWQgKiAxMDAwKSAvCisJCSAgICAoc2FuLT5z
dGF0c1tzaXplX2Jpbl1bcml4MF0udG90YWxfcGFja2V0cyk7CisJCXNhbi0+c3RhdHNbc2l6ZV9i
aW5dW3JpeDBdLmV3bWFfcGN0ID0gYV9wY3Q7CisJfSBlbHNlIHsKKwkJLyogdXNlIGEgZXdtYSAq
LworCQlzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS5ld21hX3BjdCA9CisJCQkoKHNhbi0+c3Rh
dHNbc2l6ZV9iaW5dW3JpeDBdLmV3bWFfcGN0ICogc2FtcGxlLT5zYW5wbGVfc21vb3RoaW5nX3Jh
dGUpICsKKwkJCSAocGN0ICogKDEwMCAtIHNhbXBsZS0+c2FucGxlX3Ntb290aGluZ19yYXRlKSkp
IC8gMTAwOworCX0KKworCWlmIChyaXgwID09IHNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3NpemVf
YmluXSkgeworCQlzYW4tPnNhbXBsZV90dFtzaXplX2Jpbl0gPSB0dDsKKwkJc2FuLT5jdXJyZW50
X3NhbXBsZV9yaXhbc2l6ZV9iaW5dID0gLTE7CisJfQorfQorCitzdGF0aWMgdm9pZAorc2FtcGxl
X3R4X2NvbXBsZXRlKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwKKyAgICBjb25zdCBz
dHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBpbnQgb2ssCisgICAgdm9pZCAqYXJnMSwgdm9pZCAq
YXJnMikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0
bHM7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9n
ZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCisJLyogWFhYIG5lZWQgdG8g
Y2hhbmdlIGFyZzIgdG8gcG9pbnRlciBvZiBpZWVlODAyMTFfcmNfaW5mbyAqLworCXN0cnVjdCBp
ZWVlODAyMTFfcmNfaW5mbyAqcmNfaW5mbyA9IChzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8qKWFy
ZzI7CisKKwlpbnQgZmluYWxfcml4LCBzaG9ydF90cmllcywgbG9uZ190cmllczsKKwlpbnQgbmZy
YW1lcywgbmJhZDsKKwlpbnQgZnJhbWVfc2l6ZSwgbXJyOworCisJLyogdXBkYXRlIHBlciB2YXAg
c3RhdGlzdGljcyAqLworCWllZWU4MDIxMV9yYXRlY3RsX3VwZGF0ZV9zdGF0KHZhcCwgcmNfaW5m
byk7CisKKwlmaW5hbF9yaXggPSBydC0+cmF0ZUNvZGVUb0luZGV4W3JjX2luZm8tPmlyaV90eHJh
dGVdOworCXNob3J0X3RyaWVzID0gcmNfaW5mby0+aXJpX3Nob3J0cmV0cnk7CisJLyogWFhYIHdo
eSBwbHVzIDEgaGVyZT8gKi8KKwlsb25nX3RyaWVzID0gcmNfaW5mby0+aXJpX2xvbmdyZXRyeSAr
IDE7CisKKwluZnJhbWVzID0gcmNfaW5mby0+aXJpX3R4Y250OworCW5iYWQgPSByY19pbmZvLT5p
cmlfZmFpbGNudDsKKworCWZyYW1lX3NpemUgPSByY19pbmZvLT5pcmlfZnJhbWVsZW47CisJbXJy
ID0gMDsKKworCWlmIChuZnJhbWVzID09IDApIHsKKwkJcmV0dXJuOworCX0KKworCWlmIChmcmFt
ZV9zaXplID09IDApCQkgICAgLyogTkI6IHNob3VsZCBub3QgaGFwcGVuICovCisJCWZyYW1lX3Np
emUgPSAxNTAwOworCisJaWYgKHNhbi0+cmF0ZW1hc2sgPT0gMCkgeworCQlyZXR1cm47CisJfQor
CQorCWlmIChJRUVFODAyMTFfUkFURUNUTF9IQVNDQVBfTVJSKHZhcCkpCisJCW1yciA9IDE7CisJ
LyogWFhYIGNoZWNrIEhUIHByb3Rtb2RlIHRvbyAqLworCWlmIChtcnIgJiYgIUlFRUU4MDIxMV9S
QVRFQ1RMX0hBU0NBUF9NUlJQUk9UKHZhcCkpCisJCW1yciA9IDA7CisJCisJaWYgKCFtcnIgfHwg
cmNfaW5mby0+aXJpX2ZpbmFsdHNpID09IDApIHsKKwkJaWYgKCFJU19SQVRFX0RFRklORUQoc2Fu
LCBmaW5hbF9yaXgpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJLyoKKwkJICogT25seSBvbmUgcmF0
ZSB3YXMgdXNlZDsgb3B0aW1pemUgd29yay4KKwkJICovCisJCXVwZGF0ZV9zdGF0cyh2YXAsIG5p
LCBmcmFtZV9zaXplLCAKKwkJCSAgICAgZmluYWxfcml4LCBsb25nX3RyaWVzLAorCQkJICAgICAw
LCAwLAorCQkJICAgICAwLCAwLAorCQkJICAgICAwLCAwLAorCQkJICAgICBzaG9ydF90cmllcywg
bG9uZ190cmllcywKKwkJCSAgICAgbmZyYW1lcywgbmJhZCk7CisKKwl9IGVsc2UgeworCQlpbnQg
ZmluYWxUU0lkeCA9IHJjX2luZm8tPmlyaV9maW5hbHRzaTsKKwkJaW50IGk7CisKKwkJLyoKKwkJ
ICogTkI6IHNlcmllcyA+IDAgYXJlIG5vdCBwZW5hbGl6ZWQgZm9yIGZhaWx1cmUKKwkJICogYmFz
ZWQgb24gdGhlIHRyeSBjb3VudHMgdW5kZXIgdGhlIGFzc3VtcHRpb24KKwkJICogdGhhdCBsb3Nz
ZXMgYXJlIG9mdGVuIGJ1cnN0eSBhbmQgc2luY2Ugd2UKKwkJICogc2FtcGxlIGhpZ2hlciByYXRl
cyAxIHRyeSBhdCBhIHRpbWUgZG9pbmcgc28KKwkJICogbWF5IHVuZmFpcmx5IHBlbmFsaXplIHRo
ZW0uCisJCSAqLworCQlpZiAocmNbMF0udHJpZXMpIHsKKwkJCXVwZGF0ZV9zdGF0cyh2YXAsIG5p
LCBmcmFtZV9zaXplLAorCQkJCSAgICAgcmNbMF0ucml4LCByY1swXS50cmllcywKKwkJCQkgICAg
IHJjWzFdLnJpeCwgcmNbMV0udHJpZXMsCisJCQkJICAgICByY1syXS5yaXgsIHJjWzJdLnRyaWVz
LAorCQkJCSAgICAgcmNbM10ucml4LCByY1szXS50cmllcywKKwkJCQkgICAgIHNob3J0X3RyaWVz
LCBsb25nX3RyaWVzLAorCQkJCSAgICAgbmZyYW1lcywgbmJhZCk7CisJCQlsb25nX3RyaWVzIC09
IHJjWzBdLnRyaWVzOworCQl9CisJCQorCQlpZiAocmNbMV0udHJpZXMgJiYgZmluYWxUU0lkeCA+
IDApIHsKKwkJCXVwZGF0ZV9zdGF0cyh2YXAsIG5pLCBmcmFtZV9zaXplLAorCQkJCSAgICAgcmNb
MV0ucml4LCByY1sxXS50cmllcywKKwkJCQkgICAgIHJjWzJdLnJpeCwgcmNbMl0udHJpZXMsCisJ
CQkJICAgICByY1szXS5yaXgsIHJjWzNdLnRyaWVzLAorCQkJCSAgICAgMCwgMCwKKwkJCQkgICAg
IHNob3J0X3RyaWVzLCBsb25nX3RyaWVzLAorCQkJCSAgICAgbmZyYW1lcywgbmJhZCk7CisJCQls
b25nX3RyaWVzIC09IHJjWzFdLnRyaWVzOworCQl9CisKKwkJaWYgKHJjWzJdLnRyaWVzICYmIGZp
bmFsVFNJZHggPiAxKSB7CisJCQl1cGRhdGVfc3RhdHModmFwLCBuaSwgZnJhbWVfc2l6ZSwKKwkJ
CQkgICAgIHJjWzJdLnJpeCwgcmNbMl0udHJpZXMsCisJCQkJICAgICByY1szXS5yaXgsIHJjWzNd
LnRyaWVzLAorCQkJCSAgICAgMCwgMCwKKwkJCQkgICAgIDAsIDAsCisJCQkJICAgICBzaG9ydF90
cmllcywgbG9uZ190cmllcywKKwkJCQkgICAgIG5mcmFtZXMsIG5iYWQpOworCQkJbG9uZ190cmll
cyAtPSByY1syXS50cmllczsKKwkJfQorCisJCWlmIChyY1szXS50cmllcyAmJiBmaW5hbFRTSWR4
ID4gMikgeworCQkJdXBkYXRlX3N0YXRzKHZhcCwgbmksIGZyYW1lX3NpemUsCisJCQkJICAgICBy
Y1szXS5yaXgsIHJjWzNdLnRyaWVzLAorCQkJCSAgICAgMCwgMCwKKwkJCQkgICAgIDAsIDAsCisJ
CQkJICAgICAwLCAwLAorCQkJCSAgICAgc2hvcnRfdHJpZXMsIGxvbmdfdHJpZXMsCisJCQkJICAg
ICBuZnJhbWVzLCBuYmFkKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV90eF91
cGRhdGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLCBjb25zdCBzdHJ1Y3QgaWVlZTgw
MjExX25vZGUgKm5pLAorICAgIHZvaWQgKmFyZzEsIHZvaWQgKmFyZzIsIHZvaWQgKmFyZzMpCit7
CisJLyogbm90aGluZyBoZXJlLiAqLworfQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3NldGludGVy
dmFsKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwgaW50IG1zZWNzKQoreworCXN0cnVj
dCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSB2YXAtPml2X3JzOworCWludCB0OworCisJaWYg
KG1zZWNzIDwgMTAwKQorCQltc2VjcyA9IDEwMDsKKwl0ID0gbXNlY3NfdG9fdGlja3MobXNlY3Mp
OworCS8qIGllZWU4MDIxMV9zYW1wbGUgZG9lc24ndCBoYXZlIHRoZSBzYW1wbGVfaW50ZXJ2YWwg
ZmllbGQgYnkgbm93ICovCisJLy8gc2FtcGxlLT5zYW1wbGVfaW50ZXJ2YWwgPSAodCA8IDEpID8g
MSA6IHQ7Cit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfc3RhdHModm9pZCAqYXJnLCBzdHJ1Y3Qg
aWVlZTgwMjExX25vZGUgKm5pKQoreworCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5u
aV92YXA7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxz
OworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQgPSBpZWVlODAyMTFfZ2V0
X3JhdGV0YWJsZSh2YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwl1aW50NjRfdCBtYXNrOworCWlu
dCByaXgsIHk7CisKKwlwcmludGYoIlxuWyVzXSByZWZjbnQgJWQgc3RhdGljX3JpeCAoJWQgJXMp
IHJhdGVtYXNrIDB4JWp4XG4iLAorCSAgICBldGhlcl9zcHJpbnRmKG5pLT5uaV9tYWNhZGRyKSwg
aWVlZTgwMjExX25vZGVfcmVmY250KG5pKSwKKwkgICAgZG90MTFyYXRlKHJ0LCBzYW4tPnN0YXRp
Y19yaXgpLAorCSAgICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+c3RhdGljX3JpeCksCisJICAg
ICh1aW50bWF4X3Qpc2FuLT5yYXRlbWFzayk7CisJZm9yICh5ID0gMDsgeSA8IE5VTV9QQUNLRVRf
U0laRV9CSU5TOyB5KyspIHsKKwkJcHJpbnRmKCJbJTR1XSBjdXIgcml4ICVkICglZCAlcykgc2lu
Y2Ugc3dpdGNoOiBwYWNrZXRzICVkIHRpY2tzICV1XG4iLAorCQkgICAgYmluX3RvX3NpemUoeSks
IHNhbi0+Y3VycmVudF9yaXhbeV0sCisJCSAgICBkb3QxMXJhdGUocnQsIHNhbi0+Y3VycmVudF9y
aXhbeV0pLAorCQkgICAgZG90MTFyYXRlX2xhYmVsKHJ0LCBzYW4tPmN1cnJlbnRfcml4W3ldKSwK
KwkJICAgIHNhbi0+cGFja2V0c19zaW5jZV9zd2l0Y2hbeV0sIHNhbi0+dGlja3Nfc2luY2Vfc3dp
dGNoW3ldKTsKKwkJcHJpbnRmKCJbJTR1XSBsYXN0IHNhbXBsZSAoJWQgJXMpIGN1ciBzYW1wbGUg
KCVkICVzKSBwYWNrZXRzIHNlbnQgJWRcbiIsCisJCSAgICBiaW5fdG9fc2l6ZSh5KSwKKwkJICAg
IGRvdDExcmF0ZShydCwgc2FuLT5sYXN0X3NhbXBsZV9yaXhbeV0pLAorCQkgICAgZG90MTFyYXRl
X2xhYmVsKHJ0LCBzYW4tPmxhc3Rfc2FtcGxlX3JpeFt5XSksCisJCSAgICBkb3QxMXJhdGUocnQs
IHNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3ldKSwKKwkJICAgIGRvdDExcmF0ZV9sYWJlbChydCwg
c2FuLT5jdXJyZW50X3NhbXBsZV9yaXhbeV0pLAorCQkgICAgc2FuLT5wYWNrZXRzX3NlbnRbeV0p
OworCQlwcmludGYoIlslNHVdIHBhY2tldHMgc2luY2Ugc2FtcGxlICVkIHNhbXBsZSB0dCAldVxu
IiwKKwkJICAgIGJpbl90b19zaXplKHkpLCBzYW4tPnBhY2tldHNfc2luY2Vfc2FtcGxlW3ldLAor
CQkgICAgc2FuLT5zYW1wbGVfdHRbeV0pOworCX0KKwlmb3IgKG1hc2sgPSBzYW4tPnJhdGVtYXNr
LCByaXggPSAwOyBtYXNrICE9IDA7IG1hc2sgPj49IDEsIHJpeCsrKSB7CisJCWlmICgobWFzayAm
IDEpID09IDApCisJCQkJY29udGludWU7CisJCWZvciAoeSA9IDA7IHkgPCBOVU1fUEFDS0VUX1NJ
WkVfQklOUzsgeSsrKSB7CisJCQlpZiAoc2FuLT5zdGF0c1t5XVtyaXhdLnRvdGFsX3BhY2tldHMg
PT0gMCkKKwkJCQljb250aW51ZTsKKwkJCXByaW50ZigiWyUydSAlczolNHVdICU4anU6JS04anUg
KCUzZCUlKSAoRVdNQSAlM2QuJTFkJSUpIFQgJThqdSBGICU0ZCBhdmcgJTV1IGxhc3QgJXVcbiIs
CisJCQkgICAgZG90MTFyYXRlKHJ0LCByaXgpLCBkb3QxMXJhdGVfbGFiZWwocnQsIHJpeCksCisJ
CQkgICAgYmluX3RvX3NpemUoeSksCisJCQkgICAgKHVpbnRtYXhfdCkgc2FuLT5zdGF0c1t5XVty
aXhdLnRvdGFsX3BhY2tldHMsCisJCQkgICAgKHVpbnRtYXhfdCkgc2FuLT5zdGF0c1t5XVtyaXhd
LnBhY2tldHNfYWNrZWQsCisJCQkgICAgKGludCkgKChzYW4tPnN0YXRzW3ldW3JpeF0ucGFja2V0
c19hY2tlZCAqIDEwMFVMTCkgLworCQkJICAgICBzYW4tPnN0YXRzW3ldW3JpeF0udG90YWxfcGFj
a2V0cyksCisJCQkgICAgc2FuLT5zdGF0c1t5XVtyaXhdLmV3bWFfcGN0IC8gMTAsCisJCQkgICAg
c2FuLT5zdGF0c1t5XVtyaXhdLmV3bWFfcGN0ICUgMTAsCisJCQkgICAgKHVpbnRtYXhfdCkgc2Fu
LT5zdGF0c1t5XVtyaXhdLnRyaWVzLAorCQkJICAgIHNhbi0+c3RhdHNbeV1bcml4XS5zdWNjZXNz
aXZlX2ZhaWx1cmVzLAorCQkJICAgIHNhbi0+c3RhdHNbeV1bcml4XS5hdmVyYWdlX3R4X3RpbWUs
CisJCQkgICAgdGlja3MgLSBzYW4tPnN0YXRzW3ldW3JpeF0ubGFzdF90eCk7CisJCX0KKwl9Cit9
CisKK3N0YXRpYyBpbnQKK3NhbXBsZV9zeXNjdGxfc3RhdHMoU1lTQ1RMX0hBTkRMRVJfQVJHUykK
K3sKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBhcmcxOworCXN0cnVjdCBpZWVlODAyMTFj
b20gKmljID0gdmFwLT5pdl9pZnAtPmlmX2wyY29tOworCWludCBlcnJvciwgdjsKKworCXYgPSAw
OworCWVycm9yID0gc3lzY3RsX2hhbmRsZV9pbnQob2lkcCwgJnYsIDAsIHJlcSk7CisJaWYgKGVy
cm9yIHx8ICFyZXEtPm5ld3B0cikKKwkJcmV0dXJuIGVycm9yOworCWllZWU4MDIxMV9pdGVyYXRl
X25vZGVzKCZpYy0+aWNfc3RhLCBzYW1wbGVfc3RhdHMsIE5VTEwpOworCXJldHVybiAwOworfQor
CitzdGF0aWMgaW50CitzYW1wbGVfc3lzY3RsX3Ntb290aGluZ19yYXRlKFNZU0NUTF9IQU5ETEVS
X0FSR1MpCit7CisJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gYXJnMTsKKwlzdHJ1Y3QgaWVl
ZTgwMjExX3NhbXBsZSAqc2FtcGxlID0gdmFwLT5pdl9yczsKKwlpbnQgcmF0ZSwgZXJyb3I7CisK
KwlyYXRlID0gc2FtcGxlLT5zYW1wbGVfc21vb3RoaW5nX3JhdGU7CisJZXJyb3IgPSBzeXNjdGxf
aGFuZGxlX2ludChvaWRwLCAmcmF0ZSwgMCwgcmVxKTsKKwlpZiAoZXJyb3IgfHwgIXJlcS0+bmV3
cHRyKQorCQlyZXR1cm4gZXJyb3I7CisJaWYgKCEoMCA8PSByYXRlICYmIHJhdGUgPCAxMDApKQor
CQlyZXR1cm4gRUlOVkFMOworCXNhbXBsZS0+c2FtcGxlX3Ntb290aGluZ19yYXRlID0gcmF0ZTsK
KwlzYW1wbGUtPnNhbXBsZV9zbW9vdGhpbmdfbWlucGFja2V0cyA9IDEwMCAvICgxMDAgLSByYXRl
KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2FtcGxlX3N5c2N0bF9zYW1wbGVfcmF0
ZShTWVNDVExfSEFORExFUl9BUkdTKQoreworCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IGFy
ZzE7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZSA9IHZhcC0+aXZfcnM7CisJaW50
IHJhdGUsIGVycm9yOworCisJcmF0ZSA9IHNhbXBsZS0+c2FtcGxlX3JhdGU7CisJZXJyb3IgPSBz
eXNjdGxfaGFuZGxlX2ludChvaWRwLCAmcmF0ZSwgMCwgcmVxKTsKKwlpZiAoZXJyb3IgfHwgIXJl
cS0+bmV3cHRyKQorCQlyZXR1cm4gZXJyb3I7CisJaWYgKCEoMiA8PSByYXRlICYmIHJhdGUgPD0g
MTAwKSkKKwkJcmV0dXJuIEVJTlZBTDsKKwlzYW1wbGUtPnNhbXBsZV9yYXRlID0gcmF0ZTsKKwly
ZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV9zeXNjdGxhdHRhY2goc3RydWN0IGll
ZWU4MDIxMXZhcCAqdmFwLAorICAgIHN0cnVjdCBzeXNjdGxfY3R4X2xpc3QgKmN0eCwgc3RydWN0
IHN5c2N0bF9vaWQgKnRyZWUpCit7CisJU1lTQ1RMX0FERF9QUk9DKGN0eCwgU1lTQ1RMX0NISUxE
UkVOKHRyZWUpLCBPSURfQVVUTywKKwkgICAgInNhbXBsZV9zbW9vdGhpbmdfcmF0ZSIsIENUTFRZ
UEVfSU5UIHwgQ1RMRkxBR19SVywgdmFwLCAwLAorCSAgICBzYW1wbGVfc3lzY3RsX3Ntb290aGlu
Z19yYXRlLCAiSSIsCisJICAgICJzYW1wbGU6IHNtb290aGluZyByYXRlIGZvciBhdmcgdHggdGlt
ZSAoJSUpIik7CisJU1lTQ1RMX0FERF9QUk9DKGN0eCwgU1lTQ1RMX0NISUxEUkVOKHRyZWUpLCBP
SURfQVVUTywKKwkgICAgInNhbXBsZV9yYXRlIiwgQ1RMVFlQRV9JTlQgfCBDVExGTEFHX1JXLCB2
YXAsIDAsCisJICAgIHNhbXBsZV9zeXNjdGxfc2FtcGxlX3JhdGUsICJJIiwKKwkgICAgInNhbXBs
ZTogcGVyY2VudCBhaXIgdGltZSBkZXZvdGVkIHRvIHNhbXBsaW5nIG5ldyByYXRlcyAoJSUpIik7
CisJLyogWFhYIG1heF9zdWNjZXNzaXZlX2ZhaWx1cmVzLCBzdGFsZV9mYWlsdXJlX3RpbWVvdXQs
IG1pbl9zd2l0Y2ggKi8KKwlTWVNDVExfQUREX1BST0MoY3R4LCBTWVNDVExfQ0hJTERSRU4odHJl
ZSksIE9JRF9BVVRPLAorCSAgICAic2FtcGxlX3N0YXRzIiwgQ1RMVFlQRV9JTlQgfCBDVExGTEFH
X1JXLCB2YXAsIDAsCisJICAgIHNhbXBsZV9zeXNjdGxfc3RhdHMsICJJIiwgInNhbXBsZTogcHJp
bnQgc3RhdGlzdGljcyIpOworfQpJbmRleDogc3lzL25ldDgwMjExL2llZWU4MDIxMV9yY19zYW1w
bGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBsZS5oCShy
ZXZpc2lvbiAwKQorKysgc3lzL25ldDgwMjExL2llZWU4MDIxMV9yY19zYW1wbGUuaAkocmV2aXNp
b24gMjU2NDc0KQpAQCAtMCwwICsxLDI4NyBAQAorLyogJEZyZWVCU0Q6IGhlYWQvc3lzL2Rldi9h
dGgvYXRoX3JhdGUvc2FtcGxlL3NhbXBsZS5oIDI0MDM4MiAyMDEyLTA4LTE1IDA3OjEwOjEwWiBh
ZHJpYW4gJCovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IEpvaG4gQmlja2V0CisgKiBD
b3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+CisgKiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0
aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFO
VFkiIGRpc2NsYWltZXIgYmVsb3cgKCJEaXNjbGFpbWVyIikgYW5kIGFueQorICogICAgcmVkaXN0
cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uIGluY2x1ZGluZyBhIHN1YnN0YW50aWFs
bHkKKyAqICAgIHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlciBiaW5h
cnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUt
bGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250
cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2
ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBi
ZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAq
IFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMK
KyAqIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
Tk9OSU5GUklOR0VNRU5ULCBNRVJDSEFOVElCSUxJVFkKKyAqIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRI
RSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFM
LCBFWEVNUExBUlksCisgKiBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUgorICogSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2lmbmRlZiBfTkVUODAyMTFf
SUVFRTgwMjExX1JBVEVDVExfU0FNUExFX0hfCisjZGVmaW5lIF9ORVQ4MDIxMV9JRUVFODAyMTFf
UkFURUNUTF9TQU1QTEVfSF8KKworI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9yYXRlY3Rs
Lmg+CisKKy8qCisgKiBmb3Igbm93LCB3ZSB0cmFjayBwZXJmb3JtYW5jZSBmb3IgdGhyZWUgZGlm
ZmVyZW50IHBhY2tldAorICogc2l6ZSBidWNrZXRzCisgKi8KKyNkZWZpbmUgTlVNX1BBQ0tFVF9T
SVpFX0JJTlMgMgorI2RlZmluZQlTQU1QTEVfTUFYUkFURVMJNjQJCS8qIE5COiBjb3JyZXNwb25k
cyB0byBoYWwgaW5mb1szMl0gKi8KKworLyoKKyAqIFJhdGUgY29udHJvbCBzZXR0aW5ncy4KKyAq
Lworc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgeworCXN0cnVjdCBpZWVlODAyMTFfcmNfc3RhdCBz
YW1wbGVfc3RhdDsKKwlpbnQJc2FtcGxlX3Ntb290aGluZ19yYXRlOwkJCS8qIGV3bWEgcGVyY2Vu
dGFnZSBbMC4uOTldICovCisJaW50CXNhbXBsZV9zbW9vdGhpbmdfbWlucGFja2V0czsKKwlpbnQJ
c2FtcGxlX3JhdGU7CQkJLyogJXRpbWUgdG8gdHJ5IGRpZmZlcmVudCB0eCByYXRlcyAqLworCWlu
dAlzYW1wbGVfbWF4X3N1Y2Nlc3NpdmVfZmFpbHVyZXM7CisJaW50CXNhbXBsZV9zdGFsZV9mYWls
dXJlX3RpbWVvdXQ7CS8qIGhvdyBsb25nIHRvIGhvbm9yIG1heF9zdWNjZXNzaXZlX2ZhaWx1cmVz
ICovCisJaW50CXNhbXBsZV9taW5fc3dpdGNoOwkJLyogbWluIHRpbWUgYmV0d2VlbiByYXRlIGNo
YW5nZXMgKi8KKwlpbnQJc2FtcGxlX21pbl9nb29kX3BjdDsJLyogbWluIGdvb2QgcGVyY2VudGFn
ZSBmb3IgYSByYXRlIHRvIGJlIGNvbnNpZGVyZWQgKi8KK307CisKK3N0cnVjdCByYXRlX3N0YXRz
IHsJCisJdW5zaWduZWQgYXZlcmFnZV90eF90aW1lOworCWludCBzdWNjZXNzaXZlX2ZhaWx1cmVz
OworCXVpbnQ2NF90IHRyaWVzOworCXVpbnQ2NF90IHRvdGFsX3BhY2tldHM7CS8qIHBrdHMgdG90
YWwgc2luY2UgYXNzb2MgKi8KKwl1aW50NjRfdCBwYWNrZXRzX2Fja2VkOwkvKiBwa3RzIGFja2Vk
IHNpbmNlIGFzc29jICovCisJaW50IGV3bWFfcGN0OwkvKiBFV01BIHBlcmNlbnRhZ2UgKi8KKwl1
bnNpZ25lZCBwZXJmZWN0X3R4X3RpbWU7IC8qIHRyYW5zbWl0IHRpbWUgZm9yIDAgcmV0cmllcyAq
LworCWludCBsYXN0X3R4OworfTsKKworc3RydWN0IHR4c2NoZWR1bGUgeworCXVpbnQ4X3QJdDAs
IHIwOwkJLyogc2VyaWVzIDA6IHRyaWVzLCByYXRlIGNvZGUgKi8KKwl1aW50OF90CXQxLCByMTsJ
CS8qIHNlcmllcyAxOiB0cmllcywgcmF0ZSBjb2RlICovCisJdWludDhfdAl0MiwgcjI7CQkvKiBz
ZXJpZXMgMjogdHJpZXMsIHJhdGUgY29kZSAqLworCXVpbnQ4X3QJdDMsIHIzOwkJLyogc2VyaWVz
IDM6IHRyaWVzLCByYXRlIGNvZGUgKi8KK307CisKKy8qCisgKiBSYXRlIGNvbnRyb2wgc3RhdGUg
Zm9yIGEgZ2l2ZW4gbm9kZS4KKyAqLworLyogWFhYIGNoYW5nZSBuYW1pbmcgY29udmVyc2lvbj8g
Ki8KK3N0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgeworCXN0cnVjdCBpZWVlODAyMTFfc2Ft
cGxlICpzYW5fc2FtcGxlOy8qIGJhY2twb2ludGVyICovCisJaW50IHN0YXRpY19yaXg7CQkJLyog
cmF0ZSBpbmRleCBvZiBmaXhlZCB0eCByYXRlICovCisJdWludDY0X3QgcmF0ZW1hc2s7CQkvKiBi
aXQgbWFzayBvZiB2YWxpZCByYXRlIGluZGljZXMgKi8KKwljb25zdCBzdHJ1Y3QgdHhzY2hlZHVs
ZSAqc2NoZWQ7CS8qIHR4IHNjaGVkdWxlIHRhYmxlICovCisKKwlzdHJ1Y3QgcmF0ZV9zdGF0cyBz
dGF0c1tOVU1fUEFDS0VUX1NJWkVfQklOU11bU0FNUExFX01BWFJBVEVTXTsKKwlpbnQgbGFzdF9z
YW1wbGVfcml4W05VTV9QQUNLRVRfU0laRV9CSU5TXTsKKworCWludCBjdXJyZW50X3NhbXBsZV9y
aXhbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOyAgICAgICAKKwlpbnQgcGFja2V0c19zZW50W05VTV9Q
QUNLRVRfU0laRV9CSU5TXTsKKworCWludCBjdXJyZW50X3JpeFtOVU1fUEFDS0VUX1NJWkVfQklO
U107CisJaW50IHBhY2tldHNfc2luY2Vfc3dpdGNoW05VTV9QQUNLRVRfU0laRV9CSU5TXTsKKwl1
bnNpZ25lZCB0aWNrc19zaW5jZV9zd2l0Y2hbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOworCisJaW50
IHBhY2tldHNfc2luY2Vfc2FtcGxlW05VTV9QQUNLRVRfU0laRV9CSU5TXTsKKwl1bnNpZ25lZCBz
YW1wbGVfdHRbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOworfTsKKworI2RlZmluZQlJU19SQVRFX0RF
RklORUQoc2FuLCByaXgpCSgoKHNhbiktPnJhdGVtYXNrICYgKDE8PChyaXgpKSkgIT0gMCkKKwor
I2lmbmRlZiBNSU4KKyNkZWZpbmUJTUlOKGEsYikJKChhKSA8IChiKSA/IChhKSA6IChiKSkKKyNl
bmRpZgorI2lmbmRlZiBNQVgKKyNkZWZpbmUJTUFYKGEsYikJKChhKSA+IChiKSA/IChhKSA6IChi
KSkKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgaW50IHBhY2tldF9zaXplX2JpbnNbTlVNX1BBQ0tF
VF9TSVpFX0JJTlNdICA9IHsgMjUwLCAxNjAwIH07CisKK3N0YXRpYyBpbmxpbmUgaW50CitiaW5f
dG9fc2l6ZShpbnQgaW5kZXgpCit7CisJcmV0dXJuIHBhY2tldF9zaXplX2JpbnNbaW5kZXhdOwor
fQorCitzdGF0aWMgaW5saW5lIGludAorc2l6ZV90b19iaW4oaW50IHNpemUpIAoreworI2lmIE5V
TV9QQUNLRVRfU0laRV9CSU5TID4gMQorCWlmIChzaXplIDw9IHBhY2tldF9zaXplX2JpbnNbMF0p
CisJCXJldHVybiAwOworI2VuZGlmCisjaWYgTlVNX1BBQ0tFVF9TSVpFX0JJTlMgPiAyCisJaWYg
KHNpemUgPD0gcGFja2V0X3NpemVfYmluc1sxXSkKKwkJcmV0dXJuIDE7CisjZW5kaWYKKyNpZiBO
VU1fUEFDS0VUX1NJWkVfQklOUyA+IDMKKwlpZiAoc2l6ZSA8PSBwYWNrZXRfc2l6ZV9iaW5zWzJd
KQorCQlyZXR1cm4gMjsKKyNlbmRpZgorI2lmIE5VTV9QQUNLRVRfU0laRV9CSU5TID4gNAorI2Vy
cm9yICJhZGQgc3VwcG9ydCBmb3IgbW9yZSBwYWNrZXQgc2l6ZXMiCisjZW5kaWYKKwlyZXR1cm4g
TlVNX1BBQ0tFVF9TSVpFX0JJTlMtMTsKK30KKworc3RhdGljIHVpbnQzMl90IHNhbXBsZV9wa3Rf
dHh0aW1lKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQsCisJdWludDMyX3Qg
ZnJhbWVMZW4sIHVpbnQxNl90IHJhdGVpeCwgaW50IGlzaHQ0MCwgaW50IGlzU2hvcnRQcmVhbWJs
ZSkKK3sKKwl1aW50OF90IHJjOworICAgIGludCBudW1TdHJlYW1zOworCisgICAgcmMgPSBydC0+
aW5mb1tyYXRlaXhdLnJhdGVDb2RlOworCisgICAgLyogTGVnYWN5IHJhdGU/IFJldHVybiB0aGUg
b2xkIHdheSAqLworICAgIGlmICghIElTX0hUX1JBVEUocmMpKQorICAgIAlyZXR1cm4gaWVlZTgw
MjExX2NvbXB1dGVfZHVyYXRpb24ocnQsIGZyYW1lTGVuLCByYXRlaXgsIGlzU2hvcnRQcmVhbWJs
ZSk7CisKKyAgICAvKiAxMW4gZnJhbWUgLSBleHRyYWN0IG91dCB0aGUgbnVtYmVyIG9mIHNwYXRp
YWwgc3RyZWFtcyAqLworICAgIG51bVN0cmVhbXMgPSBIVF9SQ18yX1NUUkVBTVMocmMpOworICAg
IEtBU1NFUlQobnVtU3RyZWFtcyA+IDAgJiYgbnVtU3RyZWFtcyA8PSA0LAorICAgICAgICAoIm51
bWJlciBvZiBzcGF0aWFsIHN0cmVhbXMgbmVlZHMgdG8gYmUgMS4uMzogTUNTIHJhdGUgMHgleCEi
LAorICAgICAgICByYXRlaXgpKTsKKworICAgIHJldHVybiBpZWVlODAyMTFfY29tcHV0ZV9kdXJh
dGlvbl9odChmcmFtZUxlbiwgcmMsIG51bVN0cmVhbXMsIGlzaHQ0MCwgaXNTaG9ydFByZWFtYmxl
KTsKK30KKworI2RlZmluZSBXSUZJX0NXX01JTiAzMQorI2RlZmluZSBXSUZJX0NXX01BWCAxMDIz
CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIHRyYW5zbWl0IGR1cmF0aW9uIG9mIGEgZnJhbWUuCisg
Ki8KK3N0YXRpYyB1bnNpZ25lZCBjYWxjX3VzZWNzX3VuaWNhc3RfcGFja2V0KGNvbnN0IHN0cnVj
dCBpZWVlODAyMTF2YXAgKnZhcCwKKwkJCQlpbnQgbGVuZ3RoLAorCQkJCWludCByaXgsIGludCBz
aG9ydF9yZXRyaWVzLAorCQkJCWludCBsb25nX3JldHJpZXMsIGludCBpc19odDQwKQoreworCWNv
bnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQgPSBpZWVlODAyMTFfZ2V0X3JhdGV0
YWJsZSh2YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwlzdHJ1Y3QgaWVlZTgwMjExY29tICppYyA9
IHZhcC0+aXZfaWM7CisJaW50IGN1cm1vZGUgPSBpZWVlODAyMTFfY2hhbjJtb2RlKHZhcC0+aXZf
aWMtPmljX2N1cmNoYW4pOworCQorCXVuc2lnbmVkIHRfc2xvdCwgdF9kaWZzLCB0X3NpZnM7IAor
CWludCBydHMsIGN0czsKKwlpbnQgdHQsIHgsIGN3LCBjaXg7CisKKwlpbnQgdHQgPSAwOworCWlu
dCB4ID0gMDsKKwlpbnQgY3cgPSBXSUZJX0NXX01JTjsKKworCUtBU1NFUlQocnQgIT0gTlVMTCwg
KCJubyByYXRlIHRhYmxlLCBtb2RlICV1IiwgY3VybW9kZSkpOworCisJaWYgKHJpeCA+PSBydC0+
cmF0ZUNvdW50KSB7CisJCXByaW50ZigiYm9ndXMgcml4ICVkLCBtYXggJXUsIG1vZGUgJXVcbiIs
CisJCSAgICAgICByaXgsIHJ0LT5yYXRlQ291bnQsIGN1cm1vZGUpOworCQlyZXR1cm4gMDsKKwl9
CisJY2l4ID0gcnQtPmluZm9bcml4XS5jb250cm9sUmF0ZTsKKwkvKiAKKwkgKiBYWFggZ2V0dGlu
ZyBtYWMvcGh5IGxldmVsIHRpbWluZ3Mgc2hvdWxkIGJlIGZpeGVkIGZvciB0dXJibworCSAqIHJh
dGVzLCBhbmQgdGhlcmUgaXMgcHJvYmFibHkgYSB3YXkgdG8gZ2V0IHRoaXMgZnJvbSB0aGUKKwkg
KiBoYWwuLi4KKwkgKi8KKwlzd2l0Y2ggKHJ0LT5pbmZvW3JpeF0ucGh5KSB7CisJY2FzZSBJRUVF
ODAyMTFfVF9PRkRNOgorCQl0X3Nsb3QgPSA5OworCQl0X3NpZnMgPSAxNjsKKwkJdF9kaWZzID0g
Mjg7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgSUVFRTgwMjExX1RfVFVSQk86CisJCXRf
c2xvdCA9IDk7CisJCXRfc2lmcyA9IDg7CisJCXRfZGlmcyA9IDI4OworCQlicmVhazsKKwljYXNl
IElFRUU4MDIxMV9UX0hUOgorCQl0X3Nsb3QgPSA5OworCQl0X3NpZnMgPSA4OworCQl0X2RpZnMg
PSAyODsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfVF9EUzoKKwkJLyogZmFsbCB0aHJvdWdo
IHRvIGRlZmF1bHQgKi8KKwlkZWZhdWx0OgorCQkvKiBwZyAyMDUgaWVlZS44MDIuMTEucGRmICov
CisJCXRfc2xvdCA9IDIwOworCQl0X2RpZnMgPSA1MDsKKwkJdF9zaWZzID0gMTA7CisJfQorCisJ
cnRzID0gY3RzID0gMDsKKworCWlmICgoaWMtPmljX2ZsYWdzICYgSUVFRTgwMjExX0ZfVVNFUFJP
VCkgJiYKKwkgICAgcnQtPmluZm9bcml4XS5waHkgPT0gSUVFRTgwMjExX1RfT0ZETSkgeworCQlp
ZiAoaWMtPmljX3Byb3Rtb2RlID09IElFRUU4MDIxMV9QUk9UX1JUU0NUUykKKwkJCXJ0cyA9IDE7
CisJCWVsc2UgaWYgKGljLT5pY19wcm90bW9kZSA9PSBJRUVFODAyMTFfUFJPVF9DVFNPTkxZKQor
CQkJY3RzID0gMTsKKworCQlpbnQgcHJvdHJpeDsKKyAgICAJaWYgKGN1cm1vZGUgPT0gSUVFRTgw
MjExX01PREVfMTFHKQorICAgIAkgICAgcHJvdHJpeCA9IHJ0LT5yYXRlQ29kZVRvSW5kZXhbMioy
XTsKKyAgICAJZWxzZSAKKyAgICAJICAgIHByb3RyaXggPSBydC0+cmF0ZUNvZGVUb0luZGV4WzIq
MV07CisgICAgCWlmICgweGZmID09IHByb3RyaXgpCisgICAgCQlwcm90cml4ID0gMDsKKworCQlj
aXggPSBydC0+aW5mb1twcm90cml4XS5jb250cm9sUmF0ZTsKKwl9CisKKwlpZiAoMCAvKmxlbmd0
aCA+IGljLT5pY19ydHN0aHJlc2hvbGQgKi8pIHsKKwkJcnRzID0gMTsKKwl9CisKKwlpZiAocnRz
IHx8IGN0cykgeworCQlpbnQgY3RzcmF0ZTsKKwkJaW50IGN0c2R1cmF0aW9uID0gMDsKKworCQkv
KiBOQjogdGhpcyBpcyBpbnRlbnRpb25hbGx5IG5vdCBhIHJ1bnRpbWUgY2hlY2sgKi8KKwkJS0FT
U0VSVChjaXggPCBydC0+cmF0ZUNvdW50LAorCQkgICAgKCJib2d1cyBjaXggJWQsIG1heCAldSwg
bW9kZSAldVxuIiwgY2l4LCBydC0+cmF0ZUNvdW50LAorCQkgICAgIGN1cm1vZGUpKTsKKworCQlj
dHNyYXRlID0gcnQtPmluZm9bY2l4XS5yYXRlQ29kZSB8IHJ0LT5pbmZvW2NpeF0uc2hvcnRQcmVh
bWJsZTsKKwkJaWYgKHJ0cykJCS8qIFNJRlMgKyBDVFMgKi8KKwkJCWN0c2R1cmF0aW9uICs9IHJ0
LT5pbmZvW2NpeF0uc3BBY2tEdXJhdGlvbjsKKworCQkvKiBYWFggYXNzdW1lcyBzaG9ydCBwcmVh
bWJsZSAqLworCQljdHNkdXJhdGlvbiArPSBzYW1wbGVfcGt0X3R4dGltZShydCwgbGVuZ3RoLCBy
aXgsIGlzX2h0NDAsIDApOworCisJCWlmIChjdHMpCS8qIFNJRlMgKyBBQ0sgKi8KKwkJCWN0c2R1
cmF0aW9uICs9IHJ0LT5pbmZvW2NpeF0uc3BBY2tEdXJhdGlvbjsKKworCQl0dCArPSAoc2hvcnRf
cmV0cmllcyArIDEpICogY3RzZHVyYXRpb247CisJfQorCXR0ICs9IHRfZGlmczsKKworCS8qIFhY
WCBhc3N1bWVzIHNob3J0IHByZWFtYmxlICovCisJdHQgKz0gKGxvbmdfcmV0cmllcysxKSpzYW1w
bGVfcGt0X3R4dGltZShydCwgbGVuZ3RoLCByaXgsIGlzX2h0NDAsIDApOworCisJdHQgKz0gKGxv
bmdfcmV0cmllcysxKSoodF9zaWZzICsgcnQtPmluZm9bcml4XS5zcEFja0R1cmF0aW9uKTsKKwor
CWZvciAoeCA9IDA7IHggPD0gc2hvcnRfcmV0cmllcyArIGxvbmdfcmV0cmllczsgeCsrKSB7CisJ
CWN3ID0gTUlOKFdJRklfQ1dfTUFYLCAoY3cgKyAxKSAqIDIpOworCQl0dCArPSAodF9zbG90ICog
Y3cvMik7CisJfQorCXJldHVybiB0dDsKK30KKworI2VuZGlmIC8qIF9ORVQ4MDIxMV9JRUVFODAy
MTFfUkFURUNUTF9TQU1QTEVfSF8gKi8KSW5kZXg6IHN5cy9uZXQ4MDIxMS9pZWVlODAyMTFfcmNf
c2FtcGxlX3R4c2NoZWQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbmV0ODAyMTEvaWVlZTgwMjExX3Jj
X3NhbXBsZV90eHNjaGVkLmgJKHJldmlzaW9uIDApCisrKyBzeXMvbmV0ODAyMTEvaWVlZTgwMjEx
X3JjX3NhbXBsZV90eHNjaGVkLmgJKHJldmlzaW9uIDI1NjQ5MSkKQEAgLTAsMCArMSwyNDEgQEAK
Ky8qICRGcmVlQlNEOiBoZWFkL3N5cy9kZXYvYXRoL2F0aF9yYXRlL3NhbXBsZS90eF9zY2hlZHVs
ZXMuaCAyNDAzODQgMjAxMi0wOC0xNSAwNzo1MDo0MlogYWRyaWFuICQqLworCisvKi0KKyAqIENv
cHlyaWdodCAoYykgMjAwNSBKb2huIEJpY2tldAorICogQ29weXJpZ2h0IChjKSAyMDEzIENoZW5j
aG9uZyBRaW4gPGNjcWluQEZyZWVCU0Qub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1l
cgorICogICAgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93ICgi
RGlzY2xhaW1lciIpIGFuZCBhbnkKKyAqICAgIHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0
aW9uZWQgdXBvbiBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5CisgKiAgICBzaW1pbGFyIERpc2Ns
YWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICog
My4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVy
cyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRv
IGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICog
QWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJz
aW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgor
ICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD
T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiBgYEFTIElTJycgQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTklORlJJTkdFTUVOVCwgTUVSQ0hB
TlRJQklMSVRZCisgKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1Ig
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLAorICogT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0VTLgorICoKKyAqLworI2lmbmRlZglfTkVUODAyMTFfSUVFRTgwMjExX1JBVEVDVExfU0FN
UExFX1RYU0NIRURVTEVTX0hfCisjZGVmaW5lCV9ORVQ4MDIxMV9JRUVFODAyMTFfUkFURUNUTF9T
QU1QTEVfVFhTQ0hFRFVMRVNfSF8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCisjZGVmaW5l
IEEoX3IpIFwKKyAgICAoKChfcikgPT0gNikgICA/IDAgOiAoKChfcikgPT0gOSkgICA/IDEgOiAo
KChfcikgPT0gMTIpICA/IDIgOiBcCisgICAgKCgoX3IpID09IDE4KSAgPyAzIDogKCgoX3IpID09
IDI0KSAgPyA0IDogKCgoX3IpID09IDM2KSAgPyA1IDogXAorICAgICgoKF9yKSA9PSA0OCkgID8g
NiA6ICgoKF9yKSA9PSA1NCkgID8gNyA6IDApKSkpKSkpKQorc3RhdGljIGNvbnN0IHN0cnVjdCB0
eHNjaGVkdWxlIHNlcmllc18xMWFbXSA9IHsKKwl7IDMsQSggNiksIDMsQSggIDYpLCAwLEEoICA2
KSwgMCxBKCA2KSB9LAkvKiAgIDZNYi9zICovCisJeyA0LEEoIDkpLCAzLEEoICA2KSwgNCxBKCAg
NiksIDAsQSggNikgfSwJLyogICA5TWIvcyAqLworCXsgNCxBKDEyKSwgMyxBKCAgNiksIDQsQSgg
IDYpLCAwLEEoIDYpIH0sCS8qICAxMk1iL3MgKi8KKwl7IDQsQSgxOCksIDMsQSggMTIpLCA0LEEo
ICA2KSwgMixBKCA2KSB9LAkvKiAgMThNYi9zICovCisJeyA0LEEoMjQpLCAzLEEoIDE4KSwgNCxB
KCAxMiksIDIsQSggNikgfSwJLyogIDI0TWIvcyAqLworCXsgNCxBKDM2KSwgMyxBKCAyNCksIDQs
QSggMTgpLCAyLEEoIDYpIH0sCS8qICAzNk1iL3MgKi8KKwl7IDQsQSg0OCksIDMsQSggMzYpLCA0
LEEoIDI0KSwgMixBKDEyKSB9LAkvKiAgNDhNYi9zICovCisJeyA0LEEoNTQpLCAzLEEoIDQ4KSwg
NCxBKCAzNiksIDIsQSgyNCkgfQkvKiAgNTRNYi9zICovCit9OworCisjZGVmaW5lIE5BMShfcikg
XAorCSgoKF9yKSA9PSA2LjUpICA/IDggOiAoKChfcikgPT0gMTMpICA/ICA5IDogKCgoX3IpID09
IDE5LjUpPyAxMCA6IFwKKwkoKChfcikgPT0gMjYpICA/IDExIDogKCgoX3IpID09IDM5KSAgPyAx
MiA6ICgoKF9yKSA9PSA1MikgID8gMTMgOiBcCisJKCgoX3IpID09IDU4LjUpPyAxNCA6ICgoKF9y
KSA9PSA2NSkgID8gMTUgOiAwKSkpKSkpKSkKKyNkZWZpbmUgTkEyKF9yKSBcCisJKCgoX3IpID09
IDEzKSA/IDE2IDogKCgoX3IpID09IDI2KSA/IDE3IDogKCgoX3IpID09IDM5KSA/IDE4IDogXAor
CSgoKF9yKSA9PSA1MikgPyAxOSA6ICgoKF9yKSA9PSA3OCkgPyAyMCA6ICgoKF9yKSA9PSAxMDQp
PyAyMSA6IFwKKwkoKChfcikgPT0gMTE3KT8gMjIgOiAoKChfcikgPT0gMTMwKT8gMjMgOiAwKSkp
KSkpKSkKKyNkZWZpbmUgTkEzKF9yKSBcCisJKCgoX3IpID09IDE5LjUpICA/IDI0IDogKCgoX3Ip
ID09IDM5KSA/IDI1IDogKCgoX3IpID09IDU4LjUpICA/IDI2IDogXAorCSgoKF9yKSA9PSA3OCkg
ID8gMjcgOiAoKChfcikgPT0gMTE3KSA/IDI4IDogKCgoX3IpID09IDE1NikgPyAyOSA6IFwKKwko
KChfcikgPT0gMTc1LjUpID8gMzAgOiAoKChfcikgPT0gMTk1KT8gMzEgOiAwKSkpKSkpKSkKK3N0
YXRpYyBjb25zdCBzdHJ1Y3QgdHhzY2hlZHVsZSBzZXJpZXNfMTFuYVtdID0geworCXsgMyxBKCA2
KSwgMyxBKCAgNiksIDAsQSggIDYpLCAwLEEoIDYpIH0sICAgICAgIC8qICAgNk1iL3MgKi8KKwl7
IDQsQSggOSksIDMsQSggIDYpLCA0LEEoICA2KSwgMCxBKCA2KSB9LCAgICAgICAvKiAgIDlNYi9z
ICovCisJeyA0LEEoMTIpLCAzLEEoICA2KSwgNCxBKCAgNiksIDAsQSggNikgfSwgICAgICAgLyog
IDEyTWIvcyAqLworCXsgNCxBKDE4KSwgMyxBKCAxMiksIDQsQSggIDYpLCAyLEEoIDYpIH0sICAg
ICAgIC8qICAxOE1iL3MgKi8KKwl7IDQsQSgyNCksIDMsQSggMTgpLCA0LEEoIDEyKSwgMixBKCA2
KSB9LCAgICAgICAvKiAgMjRNYi9zICovCisJeyA0LEEoMzYpLCAzLEEoIDI0KSwgNCxBKCAxOCks
IDIsQSggNikgfSwgICAgICAgLyogIDM2TWIvcyAqLworCXsgNCxBKDQ4KSwgMyxBKCAzNiksIDQs
QSggMjQpLCAyLEEoMTIpIH0sICAgICAgIC8qICA0OE1iL3MgKi8KKwl7IDQsQSg1NCksIDMsQSgg
NDgpLCA0LEEoIDM2KSwgMixBKDI0KSB9LCAgICAgICAvKiAgNTRNYi9zICovCisKKwkvKiAxIHN0
cmVhbSByYXRlcyAqLworCisJeyAzLE5BMSggNi41KSwgMyxOQTEoIDYuNSksIDAsTkExKCA2LjUp
LCAwLE5BMSg2LjUpIH0sICAvKiA2LjVNYi9zICovCisJeyA0LE5BMSggIDEzKSwgMyxOQTEoIDYu
NSksIDQsTkExKCA2LjUpLCAwLE5BMSg2LjUpIH0sICAvKiAgMTNNYi9zICovCisJeyA0LE5BMSgx
OS41KSwgMyxOQTEoIDYuNSksIDQsTkExKCA2LjUpLCAwLE5BMSg2LjUpIH0sICAvKjE5LjVNYi9z
ICovCisJeyA0LE5BMSggIDI2KSwgMyxOQTEoMTkuNSksIDQsTkExKCA2LjUpLCAyLE5BMSg2LjUp
IH0sICAvKiAgMjZNYi9zICovCisJeyA0LE5BMSggIDM5KSwgMyxOQTEoICAyNiksIDQsTkExKDE5
LjUpLCAyLE5BMSg2LjUpIH0sICAvKiAgMzlNYi9zICovCisJeyA0LE5BMSggIDUyKSwgMyxOQTEo
ICAzOSksIDQsTkExKCAgMjYpLCAyLE5BMSg2LjUpIH0sICAvKiAgNTJNYi9zICovCisJeyA0LE5B
MSg1OC41KSwgMyxOQTEoICA1MiksIDQsTkExKCAgMzkpLCAyLE5BMSggMTMpIH0sICAvKjU4LjVN
Yi9zICovCisJeyA0LE5BMSggIDY1KSwgMyxOQTEoNTguNSksIDQsTkExKCAgNTIpLCAyLE5BMSgg
MTMpIH0sICAvKiAgNjVNYi9zICovCisKKwkvKiAyIHN0cmVhbSByYXRlcyAqLworCisJeyAzLE5B
MiggIDEzKSwgMyxOQTIoICAxMyksIDAsTkEyKCAgMTMpLCAwLE5BMiggMTMpIH0sICAvKiAgMTNN
Yi9zICovCisJeyA0LE5BMiggIDI2KSwgMyxOQTIoICAxMyksIDQsTkEyKCAgMTMpLCAwLE5BMigg
MTMpIH0sICAvKiAgMjZNYi9zICovCisJeyA0LE5BMiggIDM5KSwgMyxOQTIoICAyNiksIDQsTkEy
KCAgMTMpLCAyLE5BMiggMTMpIH0sICAvKiAgMzlNYi9zICovCisJeyA0LE5BMiggIDUyKSwgMyxO
QTIoICAzOSksIDQsTkEyKCAgMjYpLCAyLE5BMiggMTMpIH0sICAvKiAgNTJNYi9zICovCisJeyA0
LE5BMiggIDc4KSwgMyxOQTIoICA1MiksIDQsTkEyKCAgMzkpLCAyLE5BMiggMTMpIH0sICAvKiAg
NzhNYi9zICovCisJeyA0LE5BMiggMTA0KSwgMyxOQTIoICA3OCksIDQsTkEyKCAgNTIpLCAyLE5B
MiggMTMpIH0sICAvKiAxMDRNYi9zICovCisJeyA0LE5BMiggMTE3KSwgMyxOQTIoIDEwNCksIDQs
TkEyKCAgNzgpLCAyLE5BMiggMjYpIH0sICAvKiAxMTdNYi9zICovCisJeyA0LE5BMiggMTMwKSwg
MyxOQTIoIDExNyksIDQsTkEyKCAxMDQpLCAyLE5BMiggMjYpIH0sICAgLyogMTMwTWIvcyAqLwor
CisJLyogMyBzdHJlYW0gcmF0ZXMgKi8KKworCXsgMyxOQTMoMTkuNSksIDMsTkEzKDE5LjUpLCAw
LE5BMygxOS41KSwgMCxOQTMoMTkuNSkgfSwgIC8qICAxOU1iL3MgKi8KKwl7IDMsTkEzKCAgMzkp
LCAzLE5BMygxOS41KSwgMCxOQTMoMTkuNSksIDAsTkEzKDE5LjUpIH0sICAvKiAgMzlNYi9zICov
CisJeyAzLE5BMyg1OC41KSwgMyxOQTMoICAzOSksIDAsTkEzKDE5LjUpLCAwLE5BMygxOS41KSB9
LCAgLyogIDU4TWIvcyAqLworCXsgMyxOQTMoICA3OCksIDMsTkEzKDU4LjUpLCAwLE5BMyggIDM5
KSwgMCxOQTMoMTkuNSkgfSwgIC8qICA3OE1iL3MgKi8KKwl7IDMsTkEzKCAxMTcpLCAzLE5BMygg
IDc4KSwgMCxOQTMoNTguNSksIDAsTkEzKDE5LjUpIH0sICAvKiAxMTdNYi9zICovCisJeyAzLE5B
MyggMTU2KSwgMyxOQTMoIDExNyksIDAsTkEzKCAgNzgpLCAwLE5BMygxOS41KSB9LCAgLyogIDE1
Nk1iL3MgKi8KKwl7IDMsTkEzKDE3NS41KSwgMyxOQTMoIDE1NiksIDAsTkEzKCAxMTcpLCAwLE5B
MyggIDM5KSB9LCAgLyogIDE3NU1iL3MgKi8KKwl7IDMsTkEzKCAxOTUpLCAzLE5BMyggMTk1KSwg
MCxOQTMoIDE1NiksIDAsTkEzKDU4LjUpIH0sICAvKiAxOTVNYi9zICovCit9OworI3VuZGVmIEEK
KyN1bmRlZiBOQTMKKyN1bmRlZiBOQTIKKyN1bmRlZiBOQTEKKworI2RlZmluZSBHKF9yKSBcCisg
ICAgKCgoX3IpID09IDEpICAgPyAwIDogKCgoX3IpID09IDIpICAgPyAxIDogKCgoX3IpID09IDUu
NSkgPyAyIDogXAorICAgICgoKF9yKSA9PSAxMSkgID8gMyA6ICgoKF9yKSA9PSA2KSAgID8gNCA6
ICgoKF9yKSA9PSA5KSAgID8gNSA6IFwKKyAgICAoKChfcikgPT0gMTIpICA/IDYgOiAoKChfcikg
PT0gMTgpICA/IDcgOiAoKChfcikgPT0gMjQpICA/IDggOiBcCisgICAgKCgoX3IpID09IDM2KSAg
PyA5IDogKCgoX3IpID09IDQ4KSAgPyAxMCA6ICgoKF9yKSA9PSA1NCkgID8gMTEgOiAwKSkpKSkp
KSkpKSkpCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1bGUgc2VyaWVzXzExZ1tdID0gewor
CXsgMyxHKCAxKSwgMyxHKCAgMSksIDAsRyggIDEpLCAwLEcoIDEpIH0sCS8qICAgMU1iL3MgKi8K
Kwl7IDQsRyggMiksIDMsRyggIDEpLCA0LEcoICAxKSwgMCxHKCAxKSB9LAkvKiAgIDJNYi9zICov
CisJeyA0LEcoNS41KSwzLEcoICAyKSwgNCxHKCAgMSksIDIsRyggMSkgfSwJLyogNS41TWIvcyAq
LworCXsgNCxHKDExKSwgMyxHKDUuNSksIDQsRyggIDIpLCAyLEcoIDEpIH0sCS8qICAxMU1iL3Mg
Ki8KKwl7IDQsRyggNiksIDMsRyg1LjUpLCA0LEcoICAyKSwgMixHKCAxKSB9LAkvKiAgIDZNYi9z
ICovCisJeyA0LEcoIDkpLCAzLEcoICA2KSwgNCxHKDUuNSksIDIsRyggMSkgfSwJLyogICA5TWIv
cyAqLworCXsgNCxHKDEyKSwgMyxHKCAxMSksIDQsRyg1LjUpLCAyLEcoIDEpIH0sCS8qICAxMk1i
L3MgKi8KKwl7IDQsRygxOCksIDMsRyggMTIpLCA0LEcoIDExKSwgMixHKCAxKSB9LAkvKiAgMThN
Yi9zICovCisJeyA0LEcoMjQpLCAzLEcoIDE4KSwgNCxHKCAxMiksIDIsRyggMSkgfSwJLyogIDI0
TWIvcyAqLworCXsgNCxHKDM2KSwgMyxHKCAyNCksIDQsRyggMTgpLCAyLEcoIDEpIH0sCS8qICAz
Nk1iL3MgKi8KKwl7IDQsRyg0OCksIDMsRyggMzYpLCA0LEcoIDI0KSwgMixHKCAxKSB9LAkvKiAg
NDhNYi9zICovCisJeyA0LEcoNTQpLCAzLEcoIDQ4KSwgNCxHKCAzNiksIDIsRyggMSkgfQkvKiAg
NTRNYi9zICovCit9OworCisjZGVmaW5lIE5HMShfcikgXAorCSgoKF9yKSA9PSA2LjUpID8gMTIg
OiAoKChfcikgPT0gMTMpID8gMTMgOiAoKChfcikgPT0gMTkuNSk/IDE0IDogXAorCSgoKF9yKSA9
PSAyNikgID8gMTUgOiAoKChfcikgPT0gMzkpID8gMTYgOiAoKChfcikgPT0gNTIpICA/IDE3IDog
XAorCSgoKF9yKSA9PSA1OC41KT8gMTggOiAoKChfcikgPT0gNjUpID8gMTkgOiAwKSkpKSkpKSkK
KyNkZWZpbmUgTkcyKF9yKSBcCisJKCgoX3IpID09IDEzKSAgPyAyMCA6ICgoKF9yKSA9PSAyNikg
PyAyMSA6ICgoKF9yKSA9PSAzOSkgID8gMjIgOiBcCisJKCgoX3IpID09IDUyKSAgPyAyMyA6ICgo
KF9yKSA9PSA3OCkgPyAyNCA6ICgoKF9yKSA9PSAxMDQpID8gMjUgOiBcCisJKCgoX3IpID09IDEx
NykgPyAyNiA6ICgoKF9yKSA9PSAxMzApPyAyNyA6IDApKSkpKSkpKQorI2RlZmluZSBORzMoX3Ip
IFwKKwkoKChfcikgPT0gMTkuNSkgID8gMjggOiAoKChfcikgPT0gMzkpID8gMjkgOiAoKChfcikg
PT0gNTguNSkgID8gMzAgOiBcCisJKCgoX3IpID09IDc4KSAgPyAzMSA6ICgoKF9yKSA9PSAxMTcp
ID8gMzIgOiAoKChfcikgPT0gMTU2KSA/IDMzIDogXAorCSgoKF9yKSA9PSAxNzUuNSkgPyAzNCA6
ICgoKF9yKSA9PSAxOTUpPyAzNSA6IDApKSkpKSkpKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4
c2NoZWR1bGUgc2VyaWVzXzExbmdbXSA9IHsKKwl7IDMsRyggMSksIDMsRyggIDEpLCAwLEcoICAx
KSwgMCxHKCAxKSB9LCAgICAgICAvKiAgIDFNYi9zICovCisJeyA0LEcoIDIpLCAzLEcoICAxKSwg
NCxHKCAgMSksIDAsRyggMSkgfSwgICAgICAgLyogICAyTWIvcyAqLworCXsgNCxHKDUuNSksMyxH
KCAgMiksIDQsRyggIDEpLCAyLEcoIDEpIH0sICAgICAgIC8qIDUuNU1iL3MgKi8KKwl7IDQsRygx
MSksIDMsRyg1LjUpLCA0LEcoICAyKSwgMixHKCAxKSB9LCAgICAgICAvKiAgMTFNYi9zICovCisJ
eyA0LEcoIDYpLCAzLEcoNS41KSwgNCxHKCAgMiksIDIsRyggMSkgfSwgICAgICAgLyogICA2TWIv
cyAqLworCXsgNCxHKCA5KSwgMyxHKCAgNiksIDQsRyg1LjUpLCAyLEcoIDEpIH0sICAgICAgIC8q
ICAgOU1iL3MgKi8KKwl7IDQsRygxMiksIDMsRyggMTEpLCA0LEcoNS41KSwgMixHKCAxKSB9LCAg
ICAgICAvKiAgMTJNYi9zICovCisJeyA0LEcoMTgpLCAzLEcoIDEyKSwgNCxHKCAxMSksIDIsRygg
MSkgfSwgICAgICAgLyogIDE4TWIvcyAqLworCXsgNCxHKDI0KSwgMyxHKCAxOCksIDQsRyggMTIp
LCAyLEcoIDEpIH0sICAgICAgIC8qICAyNE1iL3MgKi8KKwl7IDQsRygzNiksIDMsRyggMjQpLCA0
LEcoIDE4KSwgMixHKCAxKSB9LCAgICAgICAvKiAgMzZNYi9zICovCisJeyA0LEcoNDgpLCAzLEco
IDM2KSwgNCxHKCAyNCksIDIsRyggMSkgfSwgICAgICAgLyogIDQ4TWIvcyAqLworCXsgNCxHKDU0
KSwgMyxHKCA0OCksIDQsRyggMzYpLCAyLEcoIDEpIH0sICAgICAgIC8qICA1NE1iL3MgKi8KKwor
CS8qIDEgc3RyZWFtIHJhdGVzICovCisKKwl7IDMsTkcxKCA2LjUpLCAzLE5HMSggNi41KSwgMCxO
RzEoIDYuNSksIDAsTkcxKDYuNSkgfSwgIC8qIDYuNU1iL3MgKi8KKwl7IDQsTkcxKCAgMTMpLCAz
LE5HMSggNi41KSwgNCxORzEoIDYuNSksIDAsTkcxKDYuNSkgfSwgIC8qICAxM01iL3MgKi8KKwl7
IDQsTkcxKDE5LjUpLCAzLE5HMSggNi41KSwgNCxORzEoIDYuNSksIDAsTkcxKDYuNSkgfSwgIC8q
MTkuNU1iL3MgKi8KKwl7IDQsTkcxKCAgMjYpLCAzLE5HMSgxOS41KSwgNCxORzEoIDYuNSksIDIs
TkcxKDYuNSkgfSwgIC8qICAyNk1iL3MgKi8KKwl7IDQsTkcxKCAgMzkpLCAzLE5HMSggIDI2KSwg
NCxORzEoMTkuNSksIDIsTkcxKDYuNSkgfSwgIC8qICAzOU1iL3MgKi8KKwl7IDQsTkcxKCAgNTIp
LCAzLE5HMSggIDM5KSwgNCxORzEoICAyNiksIDIsTkcxKDYuNSkgfSwgIC8qICA1Mk1iL3MgKi8K
Kwl7IDQsTkcxKDU4LjUpLCAzLE5HMSggIDUyKSwgNCxORzEoICAzOSksIDIsTkcxKCAxMykgfSwg
IC8qNTguNU1iL3MgKi8KKwl7IDQsTkcxKCAgNjUpLCAzLE5HMSg1OC41KSwgNCxORzEoICA1Miks
IDIsTkcxKCAxMykgfSwgIC8qICA2NU1iL3MgKi8KKworCS8qIDIgc3RyZWFtIHJhdGVzICovCisK
Kwl7IDMsTkcyKCAgMTMpLCAzLE5HMiggIDEzKSwgMCxORzIoICAxMyksIDAsTkcyKCAxMykgfSwg
IC8qICAxM01iL3MgKi8KKwl7IDQsTkcyKCAgMjYpLCAzLE5HMiggIDEzKSwgNCxORzIoICAxMyks
IDAsTkcyKCAxMykgfSwgIC8qICAyNk1iL3MgKi8KKwl7IDQsTkcyKCAgMzkpLCAzLE5HMiggIDI2
KSwgNCxORzIoICAxMyksIDIsTkcyKCAxMykgfSwgIC8qICAzOU1iL3MgKi8KKwl7IDQsTkcyKCAg
NTIpLCAzLE5HMiggIDM5KSwgNCxORzIoICAyNiksIDIsTkcyKCAxMykgfSwgIC8qICA1Mk1iL3Mg
Ki8KKwl7IDQsTkcyKCAgNzgpLCAzLE5HMiggIDUyKSwgNCxORzIoICAzOSksIDIsTkcyKCAxMykg
fSwgIC8qICA3OE1iL3MgKi8KKwl7IDQsTkcyKCAxMDQpLCAzLE5HMiggIDc4KSwgNCxORzIoICA1
MiksIDIsTkcyKCAxMykgfSwgIC8qIDEwNE1iL3MgKi8KKwl7IDQsTkcyKCAxMTcpLCAzLE5HMigg
MTA0KSwgNCxORzIoICA3OCksIDIsTkcyKCAyNikgfSwgIC8qIDExN01iL3MgKi8KKwl7IDQsTkcy
KCAxMzApLCAzLE5HMiggMTE3KSwgNCxORzIoIDEwNCksIDIsTkcyKCAyNikgfSwgIC8qIDEzME1i
L3MgKi8KKworCS8qIDMgc3RyZWFtIHJhdGVzICovCisKKwl7IDMsTkczKDE5LjUpLCAzLE5HMygx
OS41KSwgMCxORzMoMTkuNSksIDAsTkczKDE5LjUpIH0sICAvKiAgMTlNYi9zICovCisJeyAzLE5H
MyggIDM5KSwgMyxORzMoMTkuNSksIDAsTkczKDE5LjUpLCAwLE5HMygxOS41KSB9LCAgLyogIDM5
TWIvcyAqLworCXsgMyxORzMoNTguNSksIDMsTkczKCAgMzkpLCAwLE5HMygxOS41KSwgMCxORzMo
MTkuNSkgfSwgIC8qICA1OE1iL3MgKi8KKwl7IDMsTkczKCAgNzgpLCAzLE5HMyg1OC41KSwgMCxO
RzMoICAzOSksIDAsTkczKDE5LjUpIH0sICAvKiAgNzhNYi9zICovCisJeyAzLE5HMyggMTE3KSwg
MyxORzMoICA3OCksIDAsTkczKDU4LjUpLCAwLE5HMygxOS41KSB9LCAgLyogMTE3TWIvcyAqLwor
CXsgMyxORzMoIDE1NiksIDMsTkczKCAxMTcpLCAwLE5HMyggIDc4KSwgMCxORzMoMTkuNSkgfSwg
IC8qICAxNTZNYi9zICovCisJeyAzLE5HMygxNzUuNSksIDMsTkczKCAxNTYpLCAwLE5HMyggMTE3
KSwgMCxORzMoICAzOSkgfSwgIC8qICAxNzVNYi9zICovCisJeyAzLE5HMyggMTk1KSwgMyxORzMo
IDE5NSksIDAsTkczKCAxNTYpLCAwLE5HMyg1OC41KSB9LCAgLyogMTk1TWIvcyAqLworCit9Owor
I3VuZGVmIEcKKyN1bmRlZiBORzMKKyN1bmRlZiBORzIKKyN1bmRlZiBORzEKKworI2RlZmluZSBI
KF9yKSBcCisgICAgKCgoX3IpID09IDMpICAgPyAwIDogKCgoX3IpID09IDQuNSkgPyAxIDogKCgo
X3IpID09IDYpICA/IDIgOiBcCisgICAgKCgoX3IpID09IDkpICAgPyAzIDogKCgoX3IpID09IDEy
KSAgPyA0IDogKCgoX3IpID09IDE4KSA/IDUgOiBcCisgICAgKCgoX3IpID09IDI0KSAgPyA2IDog
KCgoX3IpID09IDI3KSAgPyA3IDogMCkpKSkpKSkpCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2No
ZWR1bGUgc2VyaWVzX2hhbGZbXSA9IHsKKwl7IDMsSCggMyksIDMsSCggIDMpLCAwLEgoICAzKSwg
MCxIKCAzKSB9LAkvKiAgIDNNYi9zICovCisJeyA0LEgoNC41KSwzLEgoICAzKSwgNCxIKCAgMyks
IDAsSCggMykgfSwJLyogNC41TWIvcyAqLworCXsgNCxIKCA2KSwgMyxIKCAgMyksIDQsSCggIDMp
LCAwLEgoIDMpIH0sCS8qICAgNk1iL3MgKi8KKwl7IDQsSCggOSksIDMsSCggIDYpLCA0LEgoICAz
KSwgMixIKCAzKSB9LAkvKiAgIDlNYi9zICovCisJeyA0LEgoMTIpLCAzLEgoICA5KSwgNCxIKCAg
NiksIDIsSCggMykgfSwJLyogIDEyTWIvcyAqLworCXsgNCxIKDE4KSwgMyxIKCAxMiksIDQsSCgg
IDkpLCAyLEgoIDMpIH0sCS8qICAxOE1iL3MgKi8KKwl7IDQsSCgyNCksIDMsSCggMTgpLCA0LEgo
IDEyKSwgMixIKCA2KSB9LAkvKiAgMjRNYi9zICovCisJeyA0LEgoMjcpLCAzLEgoIDI0KSwgNCxI
KCAxOCksIDIsSCgxMikgfQkvKiAgMjdNYi9zICovCit9OworI3VuZGVmIEgKKworI2lmZGVmIFEK
KyN1bmRlZiBRCisjZW5kaWYKKyNkZWZpbmUgUShfcikgXAorICAgICgoKF9yKSA9PSAxLjUpID8g
MCA6ICgoKF9yKSA9PTIuMjUpID8gMSA6ICgoKF9yKSA9PSAzKSAgPyAyIDogXAorICAgICgoKF9y
KSA9PSA0LjUpID8gMyA6ICgoKF9yKSA9PSAgNikgID8gNCA6ICgoKF9yKSA9PSA5KSAgPyA1IDog
XAorICAgICgoKF9yKSA9PSAxMikgID8gNiA6ICgoKF9yKSA9PSAxMy41KT8gNyA6IDApKSkpKSkp
KQorc3RhdGljIGNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlIHNlcmllc19xdWFydGVyW10gPSB7CisJ
eyAzLFEoIDEuNSksMyxRKDEuNSksIDAsUSgxLjUpLCAwLFEoMS41KSB9LAkvKiAxLjVNYi9zICov
CisJeyA0LFEoMi4yNSksMyxRKDEuNSksIDQsUSgxLjUpLCAwLFEoMS41KSB9LAkvKjIuMjVNYi9z
ICovCisJeyA0LFEoICAgMyksMyxRKDEuNSksIDQsUSgxLjUpLCAwLFEoMS41KSB9LAkvKiAgIDNN
Yi9zICovCisJeyA0LFEoIDQuNSksMyxRKCAgMyksIDQsUSgxLjUpLCAyLFEoMS41KSB9LAkvKiA0
LjVNYi9zICovCisJeyA0LFEoICAgNiksMyxRKDQuNSksIDQsUSggIDMpLCAyLFEoMS41KSB9LAkv
KiAgIDZNYi9zICovCisJeyA0LFEoICAgOSksMyxRKCAgNiksIDQsUSg0LjUpLCAyLFEoMS41KSB9
LAkvKiAgIDlNYi9zICovCisJeyA0LFEoICAxMiksMyxRKCAgOSksIDQsUSggIDYpLCAyLFEoICAz
KSB9LAkvKiAgMTJNYi9zICovCisJeyA0LFEoMTMuNSksMyxRKCAxMiksIDQsUSggIDkpLCAyLFEo
ICA2KSB9CS8qMTMuNU1iL3MgKi8KK307CisjdW5kZWYgUQorCisjZW5kaWYgLyogX05FVDgwMjEx
X0lFRUU4MDIxMV9SQVRFQ1RMX1NBTVBMRV9UWFNDSEVEVUxFU19IXyAqLwo=
--20cf3071c88693e1e004e4c679b2--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAFnsE3eMrwpo=hcFb9XfpLL53Ppso%2B%2BXTBfpieP8FGejAKW1_w>