Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 15 Aug 2013 20:03:30 +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:  <CAFnsE3cS_2Ad1geQQ0UB4doEgqVfhNBMi6j4fCRpFgQqcu2kJw@mail.gmail.com>
In-Reply-To: <CAJ-VmokU=ZXysjZfAJ-REZL7kwg-_Z-LeAKca7AefONW_O1E5A@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>

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

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

--089e013cbc8c39586e04e3fb4374
Content-Type: application/octet-stream; 
	name="20130815-net80211-ratectl.diff"
Content-Disposition: attachment; filename="20130815-net80211-ratectl.diff"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_hkdwimbd0

SW5kZXg6IG5ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsX25vbmUuYwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBu
ZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bF9ub25lLmMJKHJldmlzaW9uIDI1NDgyNikKKysrIG5l
dDgwMjExL2llZWU4MDIxMV9yYXRlY3RsX25vbmUuYwkod29ya2luZyBjb3B5KQpAQCAtNTcsNyAr
NTcsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbm9uZV9ub2RlX2luaXQoc3RydWN0IGllZWU4MDIx
MV9ub2RlICpuaSkKK25vbmVfbm9kZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksIHVp
bnQzMl90IGNhcGFiaWxpdGllcykKIHsKIAluaS0+bmlfdHhyYXRlID0gbmktPm5pX3JhdGVzLnJz
X3JhdGVzWzBdICYgSUVFRTgwMjExX1JBVEVfVkFMOwogfQpJbmRleDogbmV0ODAyMTEvaWVlZTgw
MjExX3JhdGVjdGwuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBuZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5j
CShyZXZpc2lvbiAyNTQ4MjYpCisrKyBuZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5jCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDUgKzEsNiBAQAogLyotCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUnVp
IFBhdWxvIDxycGF1bG9ARnJlZUJTRC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNo
b25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoK
ICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dApAQCAtNDksNiArNTAsMzMgQEAKIAogTUFMTE9DX0RFRklORShNXzgwMjEx
X1JBVEVDVEwsICI4MDIxMXJhdGVjdGwiLCAiODAyLjExIHJhdGUgY29udHJvbCIpOwogCitpbnQg
bWF4XzRtc19mcmFtZWxlbls0XVszMl0gPSB7CisJW01DU19IVDIwXSA9IHsKKwkJMzIxMiwgIDY0
MzIsICA5NjQ4LCAgMTI4NjQsICAxOTMwMCwgIDI1NzM2LCAgMjg5NTIsICAzMjE3MiwKKwkJNjQy
NCwgIDEyODUyLCAxOTI4MCwgMjU3MDgsICAzODU2OCwgIDUxNDI0LCAgNTc4NTIsICA2NDI4MCwK
KwkJOTYyOCwgIDE5MjYwLCAyODg5NiwgMzg1MjgsICA1Nzc5MiwgIDY1NTMyLCAgNjU1MzIsICA2
NTUzMiwKKwkJMTI4MjgsIDI1NjU2LCAzODQ4OCwgNTEzMjAsICA2NTUzMiwgIDY1NTMyLCAgNjU1
MzIsICA2NTUzMiwKKwl9LAorCVtNQ1NfSFQyMF9TR0ldID0geworCQkzNTcyLCAgNzE0NCwgIDEw
NzIwLCAgMTQyOTYsICAyMTQ0NCwgIDI4NTk2LCAgMzIxNzIsICAzNTc0NCwKKwkJNzE0MCwgIDE0
Mjg0LCAyMTQyOCwgIDI4NTY4LCAgNDI4NTYsICA1NzE0NCwgIDY0Mjg4LCAgNjU1MzIsCisJCTEw
NzAwLCAyMTQwOCwgMzIxMTIsICA0MjgxNiwgIDY0MjI4LCAgNjU1MzIsICA2NTUzMiwgIDY1NTMy
LAorCQkxNDI1NiwgMjg1MTYsIDQyNzgwLCAgNTcwNDAsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIs
ICA2NTUzMiwKKwl9LAorCVtNQ1NfSFQ0MF0gPSB7CisJCTY2ODAsICAxMzM2MCwgIDIwMDQ0LCAg
MjY3MjQsICA0MDA5MiwgIDUzNDU2LCAgNjAxNDAsICA2NTUzMiwKKwkJMTMzNDgsIDI2NzAwLCAg
NDAwNTIsICA1MzQwMCwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAorCQkyMDAwNCwg
NDAwMDgsICA2MDAxNiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsCisJ
CTI2NjQ0LCA1MzI5MiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2
NTUzMiwKKwl9LAorCVtNQ1NfSFQ0MF9TR0ldID0geworCQk3NDIwLCAgMTQ4NDQsICAyMjI3Miwg
IDI5Njk2LCAgNDQ1NDQsICA1OTM5NiwgIDY1NTMyLCAgNjU1MzIsCisJCTE0ODMyLCAyOTY2OCwg
IDQ0NTA0LCAgNTkzNDAsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwKKwkJMjIyMzIs
IDQ0NDY0LCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAor
CQkyOTYxNiwgNTkyMzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAg
NjU1MzIsCisJfQorfTsKKwogdm9pZAogaWVlZTgwMjExX3JhdGVjdGxfcmVnaXN0ZXIoaW50IHR5
cGUsIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZWN0bCAqcmF0ZWN0bCkKIHsKQEAgLTkwLDMg
KzExOCwxMDIgQEAKIAl9CiAJdmFwLT5pdl9yYXRlID0gcmF0ZWN0bHNbdHlwZV07CiB9CisKK3Zv
aWQKK2llZWU4MDIxMV9yYXRlY3RsX2NvbXBsZXRlX3JjZmxhZ3Moc3RydWN0IGllZWU4MDIxMV9u
b2RlICpuaSwKKwkJc3RydWN0IGllZWU4MDIxMV9yY19pbmZvICpyY19pbmZvKQoreworCWNvbnN0
IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqIHJ0ID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgw
MjExX3JjX3NlcmllcyAqcmMgPSByY19pbmZvLT5yaV9yYzsKKwkvKiBpbnQgc2hvcnRQcmVhbWJs
ZSA9IHJjX2luZm8tPnJpX3Nob3J0UHJlYW1ibGU7ICovCisJdWludDhfdCByYXRlOworCWludCBp
OworCisJcnQgPSBpZWVlODAyMTFfZ2V0X3JhdGV0YWJsZShuaS0+bmlfaWMtPmljX2N1cmNoYW4p
OworCisJLyogTWFrZSBzdXJlIHRoYXQgcmF0ZSBjb250cm9sIGNvZGUgZG9lc24ndCBtZXNzIGl0
IHVwLgorCSAqIElmIGVuYWJsZSBydHMvY3RzIGFuZCBpcyBwcmUtODAyLjExbiwgYmxhbmsgdHJp
ZXMgMSwgMiwgMyAKKwkgKi8KKworCWlmICghIElFRUU4MDIxMV9SQVRFQ1RMX0hBU0NBUF9NUlJQ
Uk9UKG5pKSkKKwl7CisJCWZvciAoaSA9IDE7IGkgPCBJRUVFODAyMTFfUkFURUNUTF9OVU07IGkr
KykKKwkJeworCQkJaWYgKHJjWzBdLmZsYWdzICYgSUVFRTgwMjExX1JBVEVDVExfRkxBR19SVFND
VFMpCisJCQkJcmNbaV0udHJpZXMgPSAwOworCQkJcmNbaV0uZmxhZ3MgJj0gfklFRUU4MDIxMV9S
QVRFQ1RMX0ZMQUdfUlRTQ1RTOyAKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBJRUVFODAy
MTFfUkFURUNUTF9OVU07IGkrKykgeworCQkKKwkJaWYgKHJjW2ldLnRyaWVzID09IDApCisJCQlj
b250aW51ZTsKKworCQlyYXRlID0gcnQtPmluZm9bcmNbaV0ucml4XS5kb3QxMVJhdGU7CisKKwkJ
LyoKKwkJICogT25seSBlbmFibGUgc2hvcnQgcHJlYW1ibGUgZm9yIGxlZ2FjeSByYXRlcworCQkg
Ki8KKworCQkvKiBYWFggaG93IHdlIGdldCB0aGUgbm9uX2h0IHJhdGVjb2RlIGhlcmU/ICovCisK
KwkJI2lmIDAKKwkJaWYgKCghIElTX0hUX1JBVEUocmF0ZSkpICYmIHNob3J0UHJlYW1ibGUpCisJ
CQlyYXRlIHw9IHJ0LT5pbmZvW3JjW2ldLnJpeF0uc2hvcnRQcmVhbWJsZTsKKwkJI2VuZGlmCisK
KwkJLyoKKwkJICogU2F2ZSB0aGlzLCB1c2VkIGJ5IHRoZSBUWCBhbmQgY29tcGxldGlvbiBjb2Rl
CisJCSAqLworCQlyY1tpXS5yYXRlY29kZSA9IHJhdGU7CisKKwkJLyogT25seSBlbmFibGUgc2hv
cnRnaSwgMjA0MCwgZHVhbC1zdHJlYW0gaWYgSFQgaXMgc2V0ICovCisJCWlmIChJU19IVF9SQVRF
KHJhdGUpKSB7CisJCQlyY1tpXS5mbGFncyB8PSBJRUVFODAyMTFfUkFURUNUTF9GTEFHX0hUOwor
CisJCQkvKgorCQkJICogWFhYIFRPRE86IExEUEMKKwkJCSAqLworCisJCQkvKgorCQkJICogRHVh
bCAvIFRyaXBsZSBzdHJlYW0gcmF0ZT8KKwkJCSAqLworCQkJaWYgKEhUX1JDXzJfU1RSRUFNUyhy
YXRlKSA9PSAyKQorCQkJCXJjW2ldLmZsYWdzIHw9IElFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfRFM7
CisJCQllbHNlIGlmIChIVF9SQ18yX1NUUkVBTVMocmF0ZSkgPT0gMykKKwkJCQlyY1tpXS5mbGFn
cyB8PSBJRUVFODAyMTFfUkFURUNUTF9GTEFHX1RTOworCQl9CisKKwkJLyoKKwkJICogQ2FsY3Vs
YXRlIHRoZSBtYXhpbXVtIFRYIHBvd2VyIGNhcCBmb3IgdGhlIGN1cnJlbnQKKwkJICogbm9kZS4g
CisJCSAqIFJhdGUgY29udHJvbCBhbGdvIGNhbid0IGNvbnRyb2wgVFggcG93ZXIgYnkgbm93Lgor
CQkgKi8KKwkJcmNbaV0udHhfcG93ZXJfY2FwID0gaWVlZTgwMjExX2dldF9ub2RlX3R4cG93ZXIo
bmkpOworCQkKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIDRtcyBmcmFtZSBsZW5n
dGggYmFzZWQKKwkJICogb24gdGhlIE1DUyByYXRlLCBTR0kgYW5kIGNoYW5uZWwgd2lkdGggZmxh
Z3MuCisJCSAqLworCQlpZiAoKHJjW2ldLmZsYWdzICYgSUVFRTgwMjExX1JBVEVDVExfRkxBR19I
VCkgJiYKKwkJICAgIChIVF9SQ18yX01DUyhyYXRlKSA8IDMyKSkgeworCQkJaW50IGo7CisJCQlp
ZiAocmNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9GTEFHX0NXNDApIHsKKwkJCQlpZiAo
cmNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9GTEFHX1NHSSkKKwkJCQkJaiA9IE1DU19I
VDQwX1NHSTsKKwkJCQllbHNlCisJCQkJCWogPSBNQ1NfSFQ0MDsKKwkJCX0gZWxzZSB7CisJCQkJ
aWYgKHJjW2ldLmZsYWdzICYgSUVFRTgwMjExX1JBVEVDVExfRkxBR19TR0kpCisJCQkJCWogPSBN
Q1NfSFQyMF9TR0k7CisJCQkJZWxzZQorCQkJCQlqID0gTUNTX0hUMjA7CisJCQl9CisJCQlyY1tp
XS5tYXg0bXNmcmFtZWxlbiA9CisJCQkgICAgbWF4XzRtc19mcmFtZWxlbltqXVtIVF9SQ18yX01D
UyhyYXRlKV07CisJCX0gZWxzZQorCQkJcmNbaV0ubWF4NG1zZnJhbWVsZW4gPSAwOworCX0KK30K
KwpJbmRleDogbmV0ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBuZXQ4
MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5oCShyZXZpc2lvbiAyNTQ4MjYpCisrKyBuZXQ4MDIxMS9p
ZWVlODAyMTFfcmF0ZWN0bC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNiBAQAogLyotCiAg
KiBDb3B5cmlnaHQgKGMpIDIwMTAgUnVpIFBhdWxvIDxycGF1bG9ARnJlZUJTRC5vcmc+CisgKiBD
b3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+CiAgKiBB
bGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMjQsNiArMjUsOCBAQAog
ICoKICAqICRGcmVlQlNEJAogICovCisjaWZuZGVmIF9ORVQ4MDIxMV9JRUVFODAyMTFfUkFURUNU
TF9IXworI2RlZmluZSBfTkVUODAyMTFfSUVFRTgwMjExX1JBVEVDVExfSF8KIAogZW51bSBpZWVl
ODAyMTFfcmF0ZWFsZ3MgewogCUlFRUU4MDIxMV9SQVRFQ1RMX0FNUlIJCT0gMCwKQEAgLTM3LDYg
KzQwLDY1IEBACiAjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX1RYX1NVQ0NFU1MJMQogI2RlZmlu
ZQlJRUVFODAyMTFfUkFURUNUTF9UWF9GQUlMVVJFCTAKIAorI2RlZmluZQlJRUVFODAyMTFfUkFU
RUNUTF9UUlVFCQkxCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0ZBTFNFCQkwCisKKyNkZWZp
bmUJSUVFRTgwMjExX1JBVEVDVExfTlVNCQk0CisKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExf
RkxBR19EUwkJMHgwMQkvKiBkdWFsLXN0cmVhbSByYXRlICovCisjZGVmaW5lCUlFRUU4MDIxMV9S
QVRFQ1RMX0ZMQUdfQ1c0MAkJMHgwMgkvKiB1c2UgSFQ0MCAqLworI2RlZmluZQlJRUVFODAyMTFf
UkFURUNUTF9GTEFHX1NHSQkJMHgwNAkvKiB1c2Ugc2hvcnQtR0kgKi8KKyNkZWZpbmUJSUVFRTgw
MjExX1JBVEVDVExfRkxBR19IVAkJMHgwOAkvKiB1c2UgSFQgKi8KKyNkZWZpbmUJSUVFRTgwMjEx
X1JBVEVDVExfRkxBR19SVFNDVFMJMHgxMAkvKiBlbmFibGUgUlRTL0NUUyBwcm90ZWN0aW9uICov
CisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfU1RCQwkJMHgyMAkvKiBlbmFibGUgU1RC
QyAqLworI2RlZmluZQlJRUVFODAyMTFfUkFURUNUTF9GTEFHX1RTCQkweDQwCS8qIHRyaXBsZS1z
dHJlYW0gcmF0ZSAqLworCisvKiBIYXJkd2FyZSBDQVBzIG9mZmVyZWQgdG8gcmF0ZSBjb250cm9s
IGFsZ28gKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfQ0FQX01SUgkJCTB4MDEJLyogc3Vw
cG9ydCBNUlIgKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfQ0FQX01SUlBST1QJCTB4MDIJ
Lyogc3VwcG9ydCBNUlIgKyBwcm90ZWN0ICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0NB
UF9NVUxUWENIQUlOCTB4MDQJLyogaGFzIG1vcmUgdGhhbiAxIHR4Y2hhaW4gKi8KKworI2RlZmlu
ZSBJU19WQVBfSFQodmFwKQkoKHZhcCktPml2X2h0Y2FwcyAmIElFRUU4MDIxMV9IVENfSFQpCisj
ZGVmaW5lIElTX0hUX1JBVEUoX3JhdGUpICAgKChfcmF0ZSkgJiAweDgwKQorI2RlZmluZSBIVF9S
Q18yX01DUyhfcmMpICAgICgoX3JjKSAmIDB4N2YpCisjZGVmaW5lIEhUX1JDXzJfU1RSRUFNUyhf
cmMpICAgICgoKChfcmMpICYgMHg3OCkgPj4gMykgKyAxKQorCitlbnVtIHsKKwlNQ1NfSFQyMCwK
KwlNQ1NfSFQyMF9TR0ksCisJTUNTX0hUNDAsCisJTUNTX0hUNDBfU0dJLAorfTsKKworZXh0ZXJu
IGludCBtYXhfNG1zX2ZyYW1lbGVuWzRdWzMyXTsKKworc3RydWN0IGllZWU4MDIxMV9yY19zZXJp
ZXMgeworCXVpbnQ4X3Qgcml4OwkJLyogcmF0ZXRhYmxlIGluZGV4LCBub3QgcmF0ZSBjb2RlICov
CisJdWludDhfdCByYXRlY29kZTsJLyogaGFyZHdhcmUgcmF0ZSBjb2RlICovCisJdWludDhfdCB0
cmllczsKKwl1aW50OF90IHR4X3Bvd2VyX2NhcDsKKwl1aW50MTZfdCBmbGFnczsKKwl1aW50MTZf
dCBtYXg0bXNmcmFtZWxlbjsKK307CisKKy8qIG5ldDgwMjExIHJhdGUgY29udHJvbCBpbmZvbWF0
aW9uICovCitzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8geworCXN0cnVjdCBpZWVlODAyMTFfcmNf
c2VyaWVzIHJpX3JjW0lFRUU4MDIxMV9SQVRFQ1RMX05VTV07CisJaW50IHJpX2ZyYW1lbGVuOwor
CWludCByaV9zaG9ydFByZWFtYmxlOworCisJLyogVFggaW5mbyAqLworCWludCByaV9zdWNjZXNz
OwkJLyogVFggc3VjY2VzcyBvciBub3QgKi8KKwlpbnQgcmlfb2tjbnQ7CQkvKiBUWCBvayB3aXRo
IG9yIHdpdGhvdXQgcmV0cnkgKi8KKwlpbnQgcmlfZmFpbGNudDsJCS8qIFRYIHJldHJ5LWZhaWwg
Y291bnQgKi8KKwlpbnQgcmlfdHhjbnQ7CQkvKiBUWCBjb3VudCAqLworCWludCByaV9yZXRyeWNu
dDsJLyogVFggcmV0cnkgY291bnQgKi8KKwlpbnQgcmlfc2hvcnRyZXRyeTsKKwlpbnQgcmlfbG9u
Z3JldHJ5OworCWludCByaV9maW5hbHRzaTsKKwlpbnQgcmlfdHhyYXRlOwkJLyogaHcgdHggcmF0
ZSAqLworfTsKKwogc3RydWN0IGllZWU4MDIxMV9yYXRlY3RsIHsKIAljb25zdCBjaGFyICppcl9u
YW1lOwogCWludAkoKmlyX2F0dGFjaCkoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqKTsKQEAg
LTQzLDkgKzEwNSwxMCBAQAogCXZvaWQJKCppcl9kZXRhY2gpKGNvbnN0IHN0cnVjdCBpZWVlODAy
MTF2YXAgKik7CiAJdm9pZAkoKmlyX2luaXQpKHN0cnVjdCBpZWVlODAyMTF2YXAgKik7CiAJdm9p
ZAkoKmlyX2RlaW5pdCkoc3RydWN0IGllZWU4MDIxMXZhcCAqKTsKLQl2b2lkCSgqaXJfbm9kZV9p
bml0KShzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKik7CisJdm9pZAkoKmlyX25vZGVfaW5pdCkoc3Ry
dWN0IGllZWU4MDIxMV9ub2RlICosIHVpbnQzMl90KTsKIAl2b2lkCSgqaXJfbm9kZV9kZWluaXQp
KHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqKTsKIAlpbnQJKCppcl9yYXRlKShzdHJ1Y3QgaWVlZTgw
MjExX25vZGUgKiwgdm9pZCAqLCB1aW50MzJfdCk7CisJdm9pZAkoKmlyX3JhdGVzKShzdHJ1Y3Qg
aWVlZTgwMjExX25vZGUgKiwgc3RydWN0IGllZWU4MDIxMV9yY19pbmZvICopOwogCXZvaWQJKCpp
cl90eF9jb21wbGV0ZSkoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqLAogCSAgICAJCQkgIGNv
bnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCBpbnQsCiAJICAgIAkJCSAgdm9pZCAqLCB2b2lk
ICopOwpAQCAtNTUsMTAgKzExOCwyNyBAQAogCXZvaWQJKCppcl9zZXRpbnRlcnZhbCkoY29uc3Qg
c3RydWN0IGllZWU4MDIxMXZhcCAqLCBpbnQpOwogfTsKIAorLyogcGVyIHJhdGVjdGwgbm9kZSBt
dXN0IHN0YXJ0IHdpdGggdGhpcyBjb21tb24gc3RhdGUgKi8KK3N0cnVjdCBpZWVlODAyMTFfcmF0
ZWN0bF9ub2RlIHsKKwl1aW50MzJfdCBpcm5fY2FwYWJpbGl0aWVzOwkJLyogaGFyZHdhcmUgY2Fw
YWJpbGl0aWVzIG9mZmVyZWQgdG8gcmMgKi8KK307CisKKyNkZWZpbmUgSUVFRTgwMjExX1JBVEVD
VExfTk9ERShfbmkpIFwKKwkoKHN0cnVjdCBpZWVlODAyMTFfcmF0ZWN0bF9ub2RlICopKChfbmkp
LT5uaV9yY3RscykpCisKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQX01SUihfbmkp
IFwKKwkoSUVFRTgwMjExX1JBVEVDVExfTk9ERShfbmkpLT5pcm5fY2FwYWJpbGl0aWVzICYgSUVF
RTgwMjExX1JBVEVDVExfQ0FQX01SUikKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQ
X01SUlBST1QoX25pKSBcCisJKElFRUU4MDIxMV9SQVRFQ1RMX05PREUoX25pKS0+aXJuX2NhcGFi
aWxpdGllcyAmIElFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NUlJQUk9UKQorI2RlZmluZQlJRUVFODAy
MTFfUkFURUNUTF9IQVNDQVBfTVVMVFhDSEFJTihfbmkpIFwKKwkoSUVFRTgwMjExX1JBVEVDVExf
Tk9ERShfbmkpLT5pcm5fY2FwYWJpbGl0aWVzICYgSUVFRTgwMjExX1JBVEVDVExfQ0FQX01VTFRY
Q0hBSU4pCisKIHZvaWQJaWVlZTgwMjExX3JhdGVjdGxfcmVnaXN0ZXIoaW50LCBjb25zdCBzdHJ1
Y3QgaWVlZTgwMjExX3JhdGVjdGwgKik7CiB2b2lkCWllZWU4MDIxMV9yYXRlY3RsX3VucmVnaXN0
ZXIoaW50KTsKIHZvaWQJaWVlZTgwMjExX3JhdGVjdGxfaW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFw
ICopOwogdm9pZAlpZWVlODAyMTFfcmF0ZWN0bF9zZXQoc3RydWN0IGllZWU4MDIxMXZhcCAqLCBp
bnQpOwordm9pZAlpZWVlODAyMTFfcmF0ZWN0bF9jb21wbGV0ZV9yY2ZsYWdzKHN0cnVjdCBpZWVl
ODAyMTFfbm9kZSAqLCAKKwkJc3RydWN0IGllZWU4MDIxMV9yY19pbmZvKik7CiAKIE1BTExPQ19E
RUNMQVJFKE1fODAyMTFfUkFURUNUTCk7CiAKQEAgLTY5LDExICsxNDksMTEgQEAKIH0KIAogc3Rh
dGljIHZvaWQgX19pbmxpbmUKLWllZWU4MDIxMV9yYXRlY3RsX25vZGVfaW5pdChzdHJ1Y3QgaWVl
ZTgwMjExX25vZGUgKm5pKQoraWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0KHN0cnVjdCBpZWVl
ODAyMTFfbm9kZSAqbmksIHVpbnQzMl90IGNhcGFiaWxpdGllcykKIHsKIAljb25zdCBzdHJ1Y3Qg
aWVlZTgwMjExdmFwICp2YXAgPSBuaS0+bmlfdmFwOwogCi0JdmFwLT5pdl9yYXRlLT5pcl9ub2Rl
X2luaXQobmkpOworCXZhcC0+aXZfcmF0ZS0+aXJfbm9kZV9pbml0KG5pLCBjYXBhYmlsaXRpZXMp
OwogfQogCiBzdGF0aWMgdm9pZCBfX2lubGluZQpAQCAtOTMsNiArMTczLDE1IEBACiB9CiAKIHN0
YXRpYyB2b2lkIF9faW5saW5lCitpZWVlODAyMTFfcmF0ZWN0bF9yYXRlcyhzdHJ1Y3QgaWVlZTgw
MjExX25vZGUgKm5pLCBzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8gKnJjX2luZm8pCit7CisJY29u
c3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKKworCXZhcC0+aXZfcmF0
ZS0+aXJfcmF0ZXMobmksIHJjX2luZm8pOworCWllZWU4MDIxMV9yYXRlY3RsX2NvbXBsZXRlX3Jj
ZmxhZ3MobmksIHJjX2luZm8pOworfQorCitzdGF0aWMgdm9pZCBfX2lubGluZQogaWVlZTgwMjEx
X3JhdGVjdGxfdHhfY29tcGxldGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAogICAg
IGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksIGludCBzdGF0dXMsIHZvaWQgKmFyZzEs
IHZvaWQgKmFyZzIpCiB7CkBAIC0xMTUsMyArMjA0LDU5IEBACiAJCXJldHVybjsKIAl2YXAtPml2
X3JhdGUtPmlyX3NldGludGVydmFsKHZhcCwgbXNlY3MpOwogfQorCitzdGF0aWMgaW50IF9faW5s
aW5lCitpZWVlODAyMTFfcmF0ZWN0bF9oYXNjYXBfY3c0MChjb25zdCBzdHJ1Y3QgaWVlZTgwMjEx
dmFwICp2YXAsCisJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmkpCit7CisJcmV0dXJu
IElTX1ZBUF9IVCh2YXApICYmIChuaS0+bmlfY2h3ID09IDQwKTsKK30KKworc3RhdGljIGludCBf
X2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxfaGFzY2FwX3Nob3J0Z2koY29uc3Qgc3RydWN0IGll
ZWU4MDIxMXZhcCAqdmFwLAorCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQorewor
CWlmIChJU19WQVBfSFQodmFwKSkKKwl7CisJCWlmIChuaS0+bmlfY2h3ID09IDQwICYmCisJCQkJ
dmFwLT5pdl9odGNhcHMgJiBJRUVFODAyMTFfSFRDQVBfU0hPUlRHSTQwICYmCisJCQkJbmktPm5p
X2h0Y2FwICYgSUVFRTgwMjExX0hUQ0FQX1NIT1JUR0k0MCkKKwkJCXJldHVybiBJRUVFODAyMTFf
UkFURUNUTF9UUlVFOworCisJCWlmIChuaS0+bmlfY2h3ID09IDIwICYmCisJCQkJdmFwLT5pdl9o
dGNhcHMgJiBJRUVFODAyMTFfSFRDQVBfU0hPUlRHSTIwICYmCisJCQkJbmktPm5pX2h0Y2FwICYg
SUVFRTgwMjExX0hUQ0FQX1NIT1JUR0kyMCkKKwkJCXJldHVybiBJRUVFODAyMTFfUkFURUNUTF9U
UlVFOworCX0KKwlyZXR1cm4gSUVFRTgwMjExX1JBVEVDVExfRkFMU0U7Cit9CisKKworc3RhdGlj
IGludCBfX2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxfaGFzY2FwX3N0YmMoY29uc3Qgc3RydWN0
IGllZWU4MDIxMXZhcCAqdmFwLAorCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQor
eworICAgcmV0dXJuIElTX1ZBUF9IVCh2YXApICYmICh2YXAtPml2X2h0Y2FwcyAmIElFRUU4MDIx
MV9IVENBUF9UWFNUQkMpICYmCisJCQkgICAgKG5pLT5uaV9odGNhcCAmIElFRUU4MDIxMV9IVENB
UF9SWFNUQkNfMVNUUkVBTSkgJiYKKwkJCSAgICBJRUVFODAyMTFfUkFURUNUTF9IQVNDQVBfTVVM
VFhDSEFJTihuaSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbmxpbmUKK2llZWU4MDIxMV9yYXRlY3Rs
X25vZGVfaXMxMW4oY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sKKwlpZiAobmkt
Pm5pX2NoYW4gPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKwlpZiAobmktPm5pX2NoYW4gPT0gSUVF
RTgwMjExX0NIQU5fQU5ZQykKKwkJcmV0dXJuICgwKTsKKwlyZXR1cm4gKElFRUU4MDIxMV9JU19D
SEFOX0hUKG5pLT5uaV9jaGFuKSk7Cit9CisKK19faW5saW5lIHN0YXRpYyBjb25zdCBzdHJ1Y3Qg
aWVlZTgwMjExX3JhdGVzZXQgKgoraWVlZTgwMjExX3JhdGVjdGxfZ2V0X3JhdGVzZXQoY29uc3Qg
c3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sKKwlyZXR1cm4gaWVlZTgwMjExX3JhdGVjdGxf
bm9kZV9pczExbihuaSkgPyAKKwkJCQkoc3RydWN0IGllZWU4MDIxMV9yYXRlc2V0ICopICZuaS0+
bmlfaHRyYXRlcyA6CisJCQkJJm5pLT5uaV9yYXRlczsKK30KKworI2VuZGlmCkluZGV4OiBuZXQ4
MDIxMS9pZWVlODAyMTFfc3RhLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbmV0ODAyMTEvaWVlZTgwMjExX3N0
YS5jCShyZXZpc2lvbiAyNTQ4MjYpCisrKyBuZXQ4MDIxMS9pZWVlODAyMTFfc3RhLmMJKHdvcmtp
bmcgY29weSkKQEAgLTE2MzYsNyArMTYzNiw4IEBACiAJCQkgICAgIElFRUU4MDIxMV9GX0pPSU4g
fCBJRUVFODAyMTFfRl9ET0JSUyk7CiAJCQlpZWVlODAyMTFfc2V0dXBfYmFzaWNfaHRyYXRlcyhu
aSwgaHRpbmZvKTsKIAkJCWllZWU4MDIxMV9ub2RlX3NldHVwdHhwYXJtcyhuaSk7Ci0JCQlpZWVl
ODAyMTFfcmF0ZWN0bF9ub2RlX2luaXQobmkpOworCQkJLyogWFhYIFRPRE8gZmlsbCB0aGUgY2Fw
IGZpZWxkICovCisJCQlpZWVlODAyMTFfcmF0ZWN0bF9ub2RlX2luaXQobmksIDApOwogCQl9IGVs
c2UgewogI2lmZGVmIElFRUU4MDIxMV9TVVBQT1JUX1NVUEVSRwogCQkJaWYgKElFRUU4MDIxMV9B
VEhfQ0FQKHZhcCwgbmksIElFRUU4MDIxMV9OT0RFX0FUSCkpCkluZGV4OiBuZXQ4MDIxMS9pZWVl
ODAyMTFfYW1yci5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIG5ldDgwMjExL2llZWU4MDIxMV9hbXJyLmMJKHJl
dmlzaW9uIDI1NDgyNikKKysrIG5ldDgwMjExL2llZWU4MDIxMV9hbXJyLmMJKHdvcmtpbmcgY29w
eSkKQEAgLTQ3LDggKzQ3LDggQEAKIAogI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV92YXIu
aD4KICNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfaHQuaD4KKyNpbmNsdWRlIDxuZXQ4MDIx
MS9pZWVlODAyMTFfcmF0ZWN0bC5oPgogI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9hbXJy
Lmg+Ci0jaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaD4KIAogI2RlZmluZSBp
c19zdWNjZXNzKGFtbikJXAogCSgoYW1uKS0+YW1uX3JldHJ5Y250IDwgKGFtbiktPmFtbl90eGNu
dCAvIDEwKQpAQCAtNjAsNyArNjAsNyBAQAogc3RhdGljIHZvaWQJYW1ycl9zZXRpbnRlcnZhbChj
b25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICosIGludCk7CiBzdGF0aWMgdm9pZAlhbXJyX2luaXQo
c3RydWN0IGllZWU4MDIxMXZhcCAqKTsKIHN0YXRpYyB2b2lkCWFtcnJfZGVpbml0KHN0cnVjdCBp
ZWVlODAyMTF2YXAgKik7Ci1zdGF0aWMgdm9pZAlhbXJyX25vZGVfaW5pdChzdHJ1Y3QgaWVlZTgw
MjExX25vZGUgKik7CitzdGF0aWMgdm9pZAlhbXJyX25vZGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjEx
X25vZGUgKiwgdWludDMyX3QpOwogc3RhdGljIHZvaWQJYW1ycl9ub2RlX2RlaW5pdChzdHJ1Y3Qg
aWVlZTgwMjExX25vZGUgKik7CiBzdGF0aWMgaW50CWFtcnJfdXBkYXRlKHN0cnVjdCBpZWVlODAy
MTFfYW1yciAqLAogICAgIAkJCXN0cnVjdCBpZWVlODAyMTFfYW1ycl9ub2RlICosIHN0cnVjdCBp
ZWVlODAyMTFfbm9kZSAqKTsKQEAgLTEyOSwxOSArMTI5LDggQEAKIAlmcmVlKHZhcC0+aXZfcnMs
IE1fODAyMTFfUkFURUNUTCk7CiB9CiAKLXN0YXRpYyBpbnQKLWFtcnJfbm9kZV9pc18xMW4oc3Ry
dWN0IGllZWU4MDIxMV9ub2RlICpuaSkKLXsKLQotCWlmIChuaS0+bmlfY2hhbiA9PSBOVUxMKQot
CQlyZXR1cm4gKDApOwotCWlmIChuaS0+bmlfY2hhbiA9PSBJRUVFODAyMTFfQ0hBTl9BTllDKQot
CQlyZXR1cm4gKDApOwotCXJldHVybiAoSUVFRTgwMjExX0lTX0NIQU5fSFQobmktPm5pX2NoYW4p
KTsKLX0KLQogc3RhdGljIHZvaWQKLWFtcnJfbm9kZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfbm9k
ZSAqbmkpCithbXJyX25vZGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCB1aW50MzJf
dCBjYXBhYmlsaXRpZXMpCiB7CiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlc2V0ICpycyA9
IE5VTEw7CiAJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKQEAgLTE1OSw2
ICsxNDgsMTAgQEAKIAkJfQogCX0gZWxzZQogCQlhbW4gPSBuaS0+bmlfcmN0bHM7CisKKwlzdHJ1
Y3QgaWVlZTgwMjExX3JhdGVjdGxfbm9kZSAqaXJuID0gSUVFRTgwMjExX1JBVEVDVExfTk9ERShu
aSk7CisJaXJuLT5pcm5fY2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzOworCQogCWFtbi0+YW1u
X2FtcnIgPSBhbXJyOwogCWFtbi0+YW1uX3N1Y2Nlc3MgPSAwOwogCWFtbi0+YW1uX3JlY292ZXJ5
ID0gMDsKQEAgLTE2NSwyMyArMTU4LDEzIEBACiAJYW1uLT5hbW5fdHhjbnQgPSBhbW4tPmFtbl9y
ZXRyeWNudCA9IDA7CiAJYW1uLT5hbW5fc3VjY2Vzc190aHJlc2hvbGQgPSBhbXJyLT5hbXJyX21p
bl9zdWNjZXNzX3RocmVzaG9sZDsKIAotCS8qIDExbiBvciBub3Q/IFBpY2sgdGhlIHJpZ2h0IHJh
dGVzZXQgKi8KLQlpZiAoYW1ycl9ub2RlX2lzXzExbihuaSkpIHsKLQkJLyogWFhYIGV3ICovCi0J
CUlFRUU4MDIxMV9OT1RFKG5pLT5uaV92YXAsIElFRUU4MDIxMV9NU0dfUkFURUNUTCwgbmksCi0J
CSAgICAiJXM6IDExbiBub2RlIiwgX19mdW5jX18pOwotCQlycyA9IChzdHJ1Y3QgaWVlZTgwMjEx
X3JhdGVzZXQgKikgJm5pLT5uaV9odHJhdGVzOwotCX0gZWxzZSB7Ci0JCUlFRUU4MDIxMV9OT1RF
KG5pLT5uaV92YXAsIElFRUU4MDIxMV9NU0dfUkFURUNUTCwgbmksCi0JCSAgICAiJXM6IG5vbi0x
MW4gbm9kZSIsIF9fZnVuY19fKTsKLQkJcnMgPSAmbmktPm5pX3JhdGVzOwotCX0KKwlycyA9IGll
ZWU4MDIxMV9yYXRlY3RsX2dldF9yYXRlc2V0KG5pKTsKIAogCS8qIEluaXRpYWwgcmF0ZSAtIGxv
d2VzdCAqLwogCXJhdGUgPSBycy0+cnNfcmF0ZXNbMF07CiAKIAkvKiBYWFggY2xlYXIgdGhlIGJh
c2ljIHJhdGUgZmxhZyBpZiBpdCdzIG5vdCAxMW4gKi8KLQlpZiAoISBhbXJyX25vZGVfaXNfMTFu
KG5pKSkKKwlpZiAoISBpZWVlODAyMTFfcmF0ZWN0bF9ub2RlX2lzMTFuKG5pKSkKIAkJcmF0ZSAm
PSBJRUVFODAyMTFfUkFURV9WQUw7CiAKIAkvKiBwaWNrIGluaXRpYWwgcmF0ZSBmcm9tIHRoZSBy
YXRlc2V0IC0gSFQgb3Igb3RoZXJ3aXNlICovCkBAIC0xODksNyArMTcyLDcgQEAKIAkgICAgYW1u
LT5hbW5fcml4LS0pIHsKIAkJLyogbGVnYWN5IC0gYW55dGhpbmcgPCAzNm1iaXQsIHN0b3Agc2Vh
cmNoaW5nICovCiAJCS8qIDExbiAtIHN0b3AgYXQgTUNTNCAvIE1DUzEyIC8gTUNTMjggKi8KLQkJ
aWYgKGFtcnJfbm9kZV9pc18xMW4obmkpICYmCisJCWlmIChpZWVlODAyMTFfcmF0ZWN0bF9ub2Rl
X2lzMTFuKG5pKSAmJgogCQkgICAgKHJzLT5yc19yYXRlc1thbW4tPmFtbl9yaXhdICYgMHg3KSA8
IDQpCiAJCQlicmVhazsKIAkJZWxzZSBpZiAoKHJzLT5yc19yYXRlc1thbW4tPmFtbl9yaXhdICYg
SUVFRTgwMjExX1JBVEVfVkFMKSA8PSA3MikKQEAgLTE5OCw3ICsxODEsNyBAQAogCX0KIAogCS8q
IGlmIHRoZSByYXRlIGlzIGFuIDExbiByYXRlLCBlbnN1cmUgdGhlIE1DUyBiaXQgaXMgc2V0ICov
Ci0JaWYgKGFtcnJfbm9kZV9pc18xMW4obmkpKQorCWlmIChpZWVlODAyMTFfcmF0ZWN0bF9ub2Rl
X2lzMTFuKG5pKSkKIAkJcmF0ZSB8PSBJRUVFODAyMTFfUkFURV9NQ1M7CiAKIAkvKiBBc3NpZ24g
aW5pdGlhbCByYXRlIGZyb20gdGhlIHJhdGVzZXQgKi8KQEAgLTIyNiwxNCArMjA5LDkgQEAKIAog
CUtBU1NFUlQoaXNfZW5vdWdoKGFtbiksICgidHhjbnQgJWQiLCBhbW4tPmFtbl90eGNudCkpOwog
Ci0JLyogMTFuIG9yIG5vdD8gUGljayB0aGUgcmlnaHQgcmF0ZXNldCAqLwotCWlmIChhbXJyX25v
ZGVfaXNfMTFuKG5pKSkgewotCQkvKiBYWFggZXcgKi8KLQkJcnMgPSAoc3RydWN0IGllZWU4MDIx
MV9yYXRlc2V0ICopICZuaS0+bmlfaHRyYXRlczsKLQl9IGVsc2UgewotCQlycyA9ICZuaS0+bmlf
cmF0ZXM7Ci0JfQorCXJzID0gaWVlZTgwMjExX3JhdGVjdGxfZ2V0X3JhdGVzZXQobmkpOwogCisK
IAlJRUVFODAyMTFfTk9URShuaS0+bmlfdmFwLCBJRUVFODAyMTFfTVNHX1JBVEVDVEwsIG5pLAog
CSAgICAiQU1SUjogY3VycmVudCByYXRlICVkLCB0eGNudD0lZCwgcmV0cnljbnQ9JWQiLAogCSAg
ICBycy0+cnNfcmF0ZXNbcml4XSAmIElFRUU4MDIxMV9SQVRFX1ZBTCwKQEAgLTMwNCwxMyArMjgy
LDcgQEAKIAljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVzZXQgKnJzID0gTlVMTDsKIAlpbnQg
cml4OwogCi0JLyogMTFuIG9yIG5vdD8gUGljayB0aGUgcmlnaHQgcmF0ZXNldCAqLwotCWlmIChh
bXJyX25vZGVfaXNfMTFuKG5pKSkgewotCQkvKiBYWFggZXcgKi8KLQkJcnMgPSAoc3RydWN0IGll
ZWU4MDIxMV9yYXRlc2V0ICopICZuaS0+bmlfaHRyYXRlczsKLQl9IGVsc2UgewotCQlycyA9ICZu
aS0+bmlfcmF0ZXM7Ci0JfQorCXJzID0gaWVlZTgwMjExX3JhdGVjdGxfZ2V0X3JhdGVzZXQobmkp
OwogCiAJaWYgKGlzX2Vub3VnaChhbW4pICYmICh0aWNrcyAtIGFtbi0+YW1uX3RpY2tzKSA+IGFt
cnItPmFtcnJfaW50ZXJ2YWwpIHsKIAkJcml4ID0gYW1ycl91cGRhdGUoYW1yciwgYW1uLCBuaSk7
CkBAIC0zMTgsNyArMjkwLDcgQEAKIAkJCS8qIHVwZGF0ZSBwdWJsaWMgcmF0ZSAqLwogCQkJbmkt
Pm5pX3R4cmF0ZSA9IHJzLT5yc19yYXRlc1tyaXhdOwogCQkJLyogWFhYIHN0cmlwIGJhc2ljIHJh
dGUgZmxhZyBmcm9tIHR4cmF0ZSwgaWYgbm9uLTExbiAqLwotCQkJaWYgKGFtcnJfbm9kZV9pc18x
MW4obmkpKQorCQkJaWYgKGllZWU4MDIxMV9yYXRlY3RsX25vZGVfaXMxMW4obmkpKQogCQkJCW5p
LT5uaV90eHJhdGUgfD0gSUVFRTgwMjExX1JBVEVfTUNTOwogCQkJZWxzZQogCQkJCW5pLT5uaV90
eHJhdGUgJj0gSUVFRTgwMjExX1JBVEVfVkFMOwpJbmRleDogbmV0ODAyMTEvaWVlZTgwMjExX2Ft
cnIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBuZXQ4MDIxMS9pZWVlODAyMTFfYW1yci5oCShyZXZpc2lvbiAy
NTQ4MjYpCisrKyBuZXQ4MDIxMS9pZWVlODAyMTFfYW1yci5oCSh3b3JraW5nIGNvcHkpCkBAIC0y
MCw2ICsyMCw3IEBACiAjaWZuZGVmIF9ORVQ4MDIxMV9JRUVFODAyMTFfQU1SUl9IXwogI2RlZmlu
ZSBfTkVUODAyMTFfSUVFRTgwMjExX0FNUlJfSF8KIAorI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4
MDIxMV9yYXRlY3RsLmg+CiAvKi0KICAqIE5haXZlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBZGFw
dGl2ZSBNdWx0aSBSYXRlIFJldHJ5IGFsZ29yaXRobToKICAqCkBAIC00Nyw2ICs0OCw3IEBACiAg
KiBSYXRlIGNvbnRyb2wgc3RhdGUgZm9yIGEgZ2l2ZW4gbm9kZS4KICAqLwogc3RydWN0IGllZWU4
MDIxMV9hbXJyX25vZGUgeworCXN0cnVjdCBpZWVlODAyMTFfcmF0ZWN0bF9ub2RlIGFtbl9ub2Rl
OwogCXN0cnVjdCBpZWVlODAyMTFfYW1yciAqYW1uX2FtcnI7LyogYmFja3BvaW50ZXIgKi8KIAlp
bnQJYW1uX3JpeDsJCS8qIGN1cnJlbnQgcmF0ZSBpbmRleCAqLwogCWludAlhbW5fdGlja3M7CQkv
KiB0aW1lIG9mIGxhc3QgdXBkYXRlICovCkluZGV4OiBuZXQ4MDIxMS9pZWVlODAyMTFfbm9kZS5j
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIG5ldDgwMjExL2llZWU4MDIxMV9ub2RlLmMJKHJldmlzaW9uIDI1NDgy
NikKKysrIG5ldDgwMjExL2llZWU4MDIxMV9ub2RlLmMJKHdvcmtpbmcgY29weSkKQEAgLTg0Niw3
ICs4NDYsOCBAQAogCS8qIFhYWCBRb1M/IERpZmZpY3VsdCBnaXZlbiB0aGF0IFdNRSBjb25maWcg
aXMgc3BlY2lmaWMgdG8gYSBtYXN0ZXIgKi8KIAogCWllZWU4MDIxMV9ub2RlX3NldHVwdHhwYXJt
cyhuaSk7Ci0JaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0KG5pKTsKKwkvKiBYWFggVE9ETyBm
aWxsIHRoZSBjYXAgZmllbGQgKi8KKwlpZWVlODAyMTFfcmF0ZWN0bF9ub2RlX2luaXQobmksIDAp
OwogCiAJcmV0dXJuIGllZWU4MDIxMV9zdGFfam9pbjEoaWVlZTgwMjExX3JlZl9ub2RlKG5pKSk7
CiB9CkBAIC0xMTg4LDcgKzExODksOCBAQAogCUlFRUU4MDIxMV9OT1RFKHZhcCwgSUVFRTgwMjEx
X01TR19JTkFDVCwgbmksCiAJICAgICIlczogaW5hY3RfcmVsb2FkICV1IiwgX19mdW5jX18sIG5p
LT5uaV9pbmFjdF9yZWxvYWQpOwogCi0JaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0KG5pKTsK
KwkvKiBYWFggVE9ETyBmaWxsIHRoZSBjYXAgZmllbGQgKi8KKwlpZWVlODAyMTFfcmF0ZWN0bF9u
b2RlX2luaXQobmksIDApOwogCiAJcmV0dXJuIG5pOwogfQpAQCAtMTIyOCw3ICsxMjMwLDggQEAK
IAkJLyogWFhYIG9wdGltaXplIGF3YXkgKi8KIAkJaWVlZTgwMjExX3BzcV9pbml0KCZuaS0+bmlf
cHNxLCAidW5rbm93biIpOwogCi0JCWllZWU4MDIxMV9yYXRlY3RsX25vZGVfaW5pdChuaSk7CisJ
CS8qIFhYWCBUT0RPIGZpbGwgdGhlIGNhcCBmaWVsZCAqLworCQlpZWVlODAyMTFfcmF0ZWN0bF9u
b2RlX2luaXQobmksIDApOwogCX0gZWxzZSB7CiAJCS8qIFhYWCBtc2cgKi8KIAkJdmFwLT5pdl9z
dGF0cy5pc19yeF9ub2RlYWxsb2MrKzsKQEAgLTE0NTcsNyArMTQ2MCw4IEBACiAjZW5kaWYKIAkJ
fQogCQlpZWVlODAyMTFfbm9kZV9zZXR1cHR4cGFybXMobmkpOwotCQlpZWVlODAyMTFfcmF0ZWN0
bF9ub2RlX2luaXQobmkpOworCQkvKiBYWFggVE9ETyBmaWxsIHRoZSBjYXAgZmllbGQgKi8KKwkJ
aWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0KG5pLCAwKTsKIAkJaWYgKGljLT5pY19uZXdhc3Nv
YyAhPSBOVUxMKQogCQkJaWMtPmljX25ld2Fzc29jKG5pLCAxKTsKIAkJLyogWFhYIG5vdCByaWdo
dCBmb3IgODAyLjF4L1dQQSAqLwpAQCAtMTUzMSw3ICsxNTM1LDggQEAKIAkJaWVlZTgwMjExX3Nl
dHVwX2Jhc2ljX2h0cmF0ZXMobmksCiAJCSAgICBuaS0+bmlfaWVzLmh0aW5mb19pZSk7CiAJCWll
ZWU4MDIxMV9ub2RlX3NldHVwdHhwYXJtcyhuaSk7Ci0JCWllZWU4MDIxMV9yYXRlY3RsX25vZGVf
aW5pdChuaSk7CisJCS8qIFhYWCBUT0RPIGZpbGwgdGhlIGNhcCBmaWVsZCAqLworCQlpZWVlODAy
MTFfcmF0ZWN0bF9ub2RlX2luaXQobmksIDApOwogCX0KIH0KIApAQCAtMTU1OCw3ICsxNTYzLDgg
QEAKIAkJaWYgKGllZWU4MDIxMV9pc2VycF9yYXRlc2V0KCZuaS0+bmlfcmF0ZXMpKQogCQkJbmkt
Pm5pX2ZsYWdzIHw9IElFRUU4MDIxMV9OT0RFX0VSUDsKIAkJaWVlZTgwMjExX25vZGVfc2V0dXB0
eHBhcm1zKG5pKTsKLQkJaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0KG5pKTsKKwkJLyogWFhY
IFRPRE8gZmlsbCB0aGUgY2FwIGZpZWxkICovCisJCWllZWU4MDIxMV9yYXRlY3RsX25vZGVfaW5p
dChuaSwgMCk7CiAJCWlmIChpYy0+aWNfbmV3YXNzb2MgIT0gTlVMTCkKIAkJCWljLT5pY19uZXdh
c3NvYyhuaSwgMSk7CiAJCS8qIFhYWCBub3QgcmlnaHQgZm9yIDgwMi4xeC9XUEEgKi8KQEAgLTI1
MjgsNyArMjUzNCw4IEBACiAJKTsKIAogCWllZWU4MDIxMV9ub2RlX3NldHVwdHhwYXJtcyhuaSk7
Ci0JaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pbml0KG5pKTsKKwkvKiBYWFggVE9ETyBmaWxsIHRo
ZSBjYXAgZmllbGQgKi8KKwlpZWVlODAyMTFfcmF0ZWN0bF9ub2RlX2luaXQobmksIDApOwogCS8q
IGdpdmUgZHJpdmVyIGEgY2hhbmNlIHRvIHNldHVwIHN0YXRlIGxpa2UgbmlfdHhyYXRlICovCiAJ
aWYgKGljLT5pY19uZXdhc3NvYyAhPSBOVUxMKQogCQlpYy0+aWNfbmV3YXNzb2MobmksIG5ld2Fz
c29jKTsKSW5kZXg6IG5ldDgwMjExL2llZWU4MDIxMV9yY19zYW1wbGUuYwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBuZXQ4MDIxMS9pZWVlODAyMTFfcmNfc2FtcGxlLmMJKHJldmlzaW9uIDApCisrKyBuZXQ4MDIx
MS9pZWVlODAyMTFfcmNfc2FtcGxlLmMJKHJldmlzaW9uIDI1NTk3MCkKQEAgLTAsMCArMSwxMTM3
IEBACisvKiAkRnJlZUJTRDogaGVhZC9zeXMvZGV2L2F0aC9hdGhfcmF0ZS9zYW1wbGUvc2FtcGxl
LmMgMjQ4NTczIDIwMTMtMDItMjcgMDQ6MzM6MDZaIGFkcmlhbiAkKi8KKworLyotCisgKiBDb3B5
cmlnaHQgKGMpIDIwMDUgSm9obiBCaWNrZXQKKyAqIENvcHlyaWdodCAoYykgMjAxMyBDaGVuY2hv
bmcgUWluIDxjY3FpbkBGcmVlQlNELm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMg
SVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisg
KiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworI2luY2x1ZGUgIm9w
dF93bGFuLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMva2VybmVs
Lmg+CisjaW5jbHVkZSA8c3lzL21vZHVsZS5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNp
bmNsdWRlIDxzeXMvc3lzY3RsLmg+CisKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxu
ZXQvaWZfbWVkaWEuaD4KKworI2lmZGVmIElORVQKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Cisj
aW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxuZXQ4MDIx
MS9pZWVlODAyMTFfdmFyLmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX2h0Lmg+Cisj
aW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaD4KKyNpbmNsdWRlIDxuZXQ4MDIx
MS9pZWVlODAyMTFfcmNfc2FtcGxlLmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3Jj
X3NhbXBsZV90eHNjaGVkLmg+CisKK3N0YXRpYyB2b2lkCXNhbXBsZV9pbml0KHN0cnVjdCBpZWVl
ODAyMTF2YXAgKik7CitzdGF0aWMgdm9pZAlzYW1wbGVfZGVpbml0KHN0cnVjdCBpZWVlODAyMTF2
YXAgKik7CitzdGF0aWMgdm9pZAlzYW1wbGVfbm9kZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfbm9k
ZSAqKTsKK3N0YXRpYyB2b2lkCXNhbXBsZV9ub2RlX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX25v
ZGUgKik7CitzdGF0aWMgaW50CXNhbXBsZV9yYXRlKHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCB2
b2lkICosIHVpbnQzMl90KTsKK3N0YXRpYyB2b2lkCXNhbXBsZV90eF9jb21wbGV0ZShjb25zdCBz
dHJ1Y3QgaWVlZTgwMjExdmFwICosCisgICAgCQkJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2Rl
ICosIGludCwgCisJCQl2b2lkICosIHZvaWQgKik7CitzdGF0aWMgdm9pZAlzYW1wbGVfdHhfdXBk
YXRlKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCwKKwkJCWNvbnN0IHN0cnVjdCBpZWVl
ODAyMTFfbm9kZSAqLCB2b2lkICosIHZvaWQgKiwgdm9pZCAqKTsKK3N0YXRpYyB2b2lkCXNhbXBs
ZV9zZXRpbnRlcnZhbChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICosIGludCk7CisKKy8qIG51
bWJlciBvZiByZWZlcmVuY2VzIGZyb20gbmV0ODAyMTEgbGF5ZXIgKi8KK3N0YXRpYwlpbnQgbnJl
ZnMgPSAwOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlY3RsIHNhbXBsZSA9
IHsKKwkuaXJfbmFtZQk9ICJzYW1wbGUiLAorCS5pcl9hdHRhY2gJPSBOVUxMLAorCS5pcl9kZXRh
Y2gJPSBOVUxMLAorCS5pcl9pbml0CT0gc2FtcGxlX2luaXQsCisJLmlyX2RlaW5pdAk9IHNhbXBs
ZV9kZWluaXQsCisJLmlyX25vZGVfaW5pdAk9IHNhbXBsZV9ub2RlX2luaXQsCisJLmlyX25vZGVf
ZGVpbml0CT0gc2FtcGxlX25vZGVfZGVpbml0LAorCS5pcl9yYXRlCT0gc2FtcGxlX3JhdGUsCisJ
LmlyX3JhdGVzCT0gc2FtcGxlX3JhdGVzLAorCS5pcl90eF9jb21wbGV0ZQk9IHNhbXBsZV90eF9j
b21wbGV0ZSwKKwkuaXJfdHhfdXBkYXRlCT0gc2FtcGxlX3R4X3VwZGF0ZSwKKwkuaXJfc2V0aW50
ZXJ2YWwJPSBzYW1wbGVfc2V0aW50ZXJ2YWwsCit9OworSUVFRTgwMjExX1JBVEVDVExfTU9EVUxF
KHNhbXBsZSwgMSk7CitJRUVFODAyMTFfUkFURUNUTF9BTEcoc2FtcGxlLCBJRUVFODAyMTFfUkFU
RUNUTF9TQU1QTEUsIHNhbXBsZSk7CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfaW5pdChzdHJ1Y3Qg
aWVlZTgwMjExdmFwICp2YXApCit7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZTsK
KworCUtBU1NFUlQodmFwLT5pdl9ycyA9PSBOVUxMLCAoIiVzIGNhbGxlZCBtdWx0aXBsZSB0aW1l
cyIsIF9fZnVuY19fKSk7CisKKwlzYW1wbGUgPSB2YXAtPml2X3JzID0gbWFsbG9jKHNpemVvZihz
dHJ1Y3QgaWVlZTgwMjExX3NhbXBsZSksCisJICAgIE1fODAyMTFfUkFURUNUTCwgTV9OT1dBSVR8
TV9aRVJPKTsKKwlpZiAoc2FtcGxlID09IE5VTEwpIHsKKwkJaWZfcHJpbnRmKHZhcC0+aXZfaWZw
LCAiY291bGRuJ3QgYWxsb2MgcmF0ZWN0bCBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm47CisJfQor
CXNhbXBsZS0+c2FtcGxlX3Ntb290aGluZ19yYXRlID0gNzU7CQkvKiBld21hIHBlcmNlbnRhZ2Ug
KFswLi45OV0pICovCisJc2FtcGxlLT5zYW1wbGVfc21vb3RoaW5nX21pbnBhY2tldHMgPSAxMDAg
LyAoMTAwIC0gc2FtcGxlLT5zYW1wbGVfc21vb3RoaW5nX3JhdGUpOworCXNhbXBsZS0+c2FtcGxl
X3JhdGUgPSAxMDsJCQkvKiAldGltZSB0byB0cnkgZGlmZiB0eCByYXRlcyAqLworCXNhbXBsZS0+
c2FtcGxlX21heF9zdWNjZXNzaXZlX2ZhaWx1cmVzID0gMzsJLyogdGhyZXNob2xkIGZvciByYXRl
IHNhbXBsaW5nKi8KKwlzYW1wbGUtPnNhbXBsZV9zdGFsZV9mYWlsdXJlX3RpbWVvdXQgPSAxMCAq
IGh6OwkvKiAxMCBzZWNvbmRzICovCisJc2FtcGxlLT5zYW1wbGVfbWluX3N3aXRjaCA9IGh6OwkJ
CS8qIDEgc2Vjb25kICovCisJc2FtcGxlX3NldGludGVydmFsKHZhcCwgNTAwIC8qIG1zICovKTsg
CS8qIGFjdHVhbGx5IGRvIG5vdGhpbmcgKi8KKwlzYW1wbGVfc3lzY3RsYXR0YWNoKHZhcCwgdmFw
LT5pdl9zeXNjdGwsIHZhcC0+aXZfb2lkKTsKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV9kZWlu
aXQoc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwKQoreworCWZyZWUodmFwLT5pdl9ycywgTV84MDIx
MV9SQVRFQ1RMKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlICptcnJfc2No
ZWR1bGVzW0lFRUU4MDIxMV9NT0RFX01BWCsyXSA9IHsKKwlOVUxMLAkJLyogSUVFRTgwMjExX01P
REVfQVVUTyAqLworCXNlcmllc18xMWEsCS8qIElFRUU4MDIxMV9NT0RFXzExQSAqLworCXNlcmll
c18xMWcsCS8qIElFRUU4MDIxMV9NT0RFXzExQiAqLworCXNlcmllc18xMWcsCS8qIElFRUU4MDIx
MV9NT0RFXzExRyAqLworCU5VTEwsCQkvKiBJRUVFODAyMTFfTU9ERV9GSCAqLworCXNlcmllc18x
MWEsCS8qIElFRUU4MDIxMV9NT0RFX1RVUkJPX0EgKi8KKwlzZXJpZXNfMTFnLAkvKiBJRUVFODAy
MTFfTU9ERV9UVVJCT19HICovCisJc2VyaWVzXzExYSwJLyogSUVFRTgwMjExX01PREVfU1RVUkJP
X0EgKi8KKwlzZXJpZXNfMTFuYSwJLyogSUVFRTgwMjExX01PREVfMTFOQSAqLworCXNlcmllc18x
MW5nLAkvKiBJRUVFODAyMTFfTU9ERV8xMU5HICovCisJc2VyaWVzX2hhbGYsCS8qIElFRUU4MDIx
MV9NT0RFX0hBTEYgKi8KKwlzZXJpZXNfcXVhcnRlciwJLyogSUVFRTgwMjExX01PREVfUVVBUlRF
UiAqLworfTsKKworc3RhdGljIHZvaWQKK3NhbXBsZV9ub2RlX2luaXQoc3RydWN0IGllZWU4MDIx
MV9ub2RlICpuaSwgdWludDMyX3QgY2FwYWJpbGl0aWVzKQoreworI2RlZmluZQlSQVRFKF9peCkJ
KG5pLT5uaV9yYXRlcy5yc19yYXRlc1soX2l4KV0gJiBJRUVFODAyMTFfUkFURV9WQUwpCisjZGVm
aW5lCURPVDExUkFURShfaXgpCShydC0+aW5mb1soX2l4KV0uZG90MTFSYXRlICYgSUVFRTgwMjEx
X1JBVEVfVkFMKQorI2RlZmluZQlNQ1MoX2l4KQkobmktPm5pX2h0cmF0ZXMucnNfcmF0ZXNbX2l4
XSB8IElFRUU4MDIxMV9SQVRFX01DUykKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBuaS0+
bmlfdmFwOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSB2YXAtPml2X3JzOwor
CXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNhbiA9IE5VTEw7CisJY29uc3Qgc3RydWN0
IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+
aXZfaWMtPmljX2N1cmNoYW4pOworCWVudW0gaWVlZTgwMjExX3BoeW1vZGUgY3VybW9kZSA9IGll
ZWU4MDIxMV9jaGFuMm1vZGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisJaW50IHgsIHksIHJp
eDsKKworCWlmIChuaS0+bmlfcmN0bHMgPT0gTlVMTCkgeworCQluaS0+bmlfcmN0bHMgPSBzYW4g
PSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUpLAorCQkgICAgTV84
MDIxMV9SQVRFQ1RMLCBNX05PV0FJVHxNX1pFUk8pOworCQlpZiAoc2FuID09IE5VTEwpIHsKKwkJ
CWlmX3ByaW50Zih2YXAtPml2X2lmcCwgImNvdWxkbid0IGFsbG9jIHBlci1ub2RlIHJhdGVjdGwg
IgorCQkJICAgICJzdHJ1Y3R1cmVcbiIpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlCisJCXNh
biA9IG5pLT5uaV9yY3RsczsKKworCXN0cnVjdCBpZWVlODAyMTFfcmF0ZWN0bF9ub2RlICppcm4g
PSBJRUVFODAyMTFfUkFURUNUTF9OT0RFKG5pKTsKKwlpcm4tPmlybl9jYXBhYmlsaXRpZXMgPSBj
YXBhYmlsaXRpZXM7CisJCisJc2FuLT5zYW5fc2FtcGxlID0gc2FtcGxlOworCisJS0FTU0VSVChy
dCAhPSBOVUxMLCAoIm5vIHJhdGUgdGFibGUsIG1vZGUgJXUiLCBjdXJtb2RlKSk7CisKKwlzYW4t
PnNjaGVkID0gbXJyX3NjaGVkdWxlc1tjdXJtb2RlXTsKKwlLQVNTRVJUKHNhbi0+c2NoZWQgIT0g
TlVMTCwgKCJubyBtcnIgc2NoZWR1bGUgZm9yIG1vZGUgJXUiLCBjdXJtb2RlKSk7CisKKwlzYW4t
PnN0YXRpY19yaXggPSAtMTsKKwlzYW1wbGVfdXBkYXRlX3N0YXRpY19yaXgobmkpOworCisJLyoK
KwkgKiBDb25zdHJ1Y3QgYSBiaXRtYXNrIG9mIHVzYWJsZSByYXRlcy4gIFRoaXMgaGFzIGFsbAor
CSAqIG5lZ290aWF0ZWQgcmF0ZXMgbWludXMgdGhvc2UgbWFya2VkIGJ5IHRoZSBoYWwgYXMKKwkg
KiB0byBiZSBpZ25vcmVkIGZvciBkb2luZyByYXRlIGNvbnRyb2wuCisJICovCisJc2FuLT5yYXRl
bWFzayA9IDA7CisKKwkvKiBNQ1MgcmF0ZXMgKi8KKwlpZiAobmktPm5pX2ZsYWdzICYgSUVFRTgw
MjExX05PREVfSFQpIHsKKwkJZm9yICh4ID0gMDsgeCA8IG5pLT5uaV9odHJhdGVzLnJzX25yYXRl
czsgeCsrKSB7CisJCQlyaXggPSBydC0+cmF0ZUNvZGVUb0luZGV4W01DUyh4KV07CisJCQlpZiAo
cml4ID09IDB4ZmYpCisJCQkJY29udGludWU7CisJCQkvKiBza2lwIHJhdGVzIG1hcmtlZCBicm9r
ZW4gYnkgaGFsICovCisJCQlpZiAoIXJ0LT5pbmZvW3JpeF0udmFsaWQpCisJCQkJY29udGludWU7
CisJCQlLQVNTRVJUKHJpeCA8IFNBTVBMRV9NQVhSQVRFUywKKwkJCSAgICAoIm1jcyAldSBoYXMg
cml4ICVkIiwgTUNTKHgpLCByaXgpKTsKKwkJCXNhbi0+cmF0ZW1hc2sgfD0gKHVpbnQ2NF90KSAx
PDxyaXg7CisJCX0KKwl9CisKKwkvKiBMZWdhY3kgcmF0ZXMgKi8KKwlmb3IgKHggPSAwOyB4IDwg
bmktPm5pX3JhdGVzLnJzX25yYXRlczsgeCsrKSB7CisJCXJpeCA9IHJ0LT5yYXRlQ29kZVRvSW5k
ZXhbUkFURSh4KV07CisJCWlmIChyaXggPT0gMHhmZikKKwkJCWNvbnRpbnVlOworCQkvKiBza2lw
IHJhdGVzIG1hcmtlZCBicm9rZW4gYnkgaGFsICovCisJCWlmICghcnQtPmluZm9bcml4XS52YWxp
ZCkKKwkJCWNvbnRpbnVlOworCQlLQVNTRVJUKHJpeCA8IFNBTVBMRV9NQVhSQVRFUywKKwkJICAg
ICgicmF0ZSAldSBoYXMgcml4ICVkIiwgUkFURSh4KSwgcml4KSk7CisJCXNhbi0+cmF0ZW1hc2sg
fD0gKHVpbnQ2NF90KSAxPDxyaXg7CisJfQorCisJZm9yICh5ID0gMDsgeSA8IE5VTV9QQUNLRVRf
U0laRV9CSU5TOyB5KyspIHsKKwkJaW50IHNpemUgPSBiaW5fdG9fc2l6ZSh5KTsKKwkJdWludDY0
X3QgbWFzazsKKworCQlzYW4tPnBhY2tldHNfc2VudFt5XSA9IDA7CisJCXNhbi0+Y3VycmVudF9z
YW1wbGVfcml4W3ldID0gLTE7CisJCXNhbi0+bGFzdF9zYW1wbGVfcml4W3ldID0gMDsKKwkJLyog
WFhYIHN0YXJ0IHdpdGggZmlyc3QgdmFsaWQgcmF0ZSAqLworCQlzYW4tPmN1cnJlbnRfcml4W3ld
ID0gZmZzKHNhbi0+cmF0ZW1hc2spLTE7CisJCQorCQkvKgorCQkgKiBJbml0aWFsaXplIHRoZSBz
dGF0aXN0aWNzIGJ1Y2tldHM7IHRoZXNlIGFyZQorCQkgKiBpbmRleGVkIGJ5IHRoZSByYXRlIGNv
ZGUgaW5kZXguCisJCSAqLworCQlmb3IgKHJpeCA9IDAsIG1hc2sgPSBzYW4tPnJhdGVtYXNrOyBt
YXNrICE9IDA7IHJpeCsrLCBtYXNrID4+PSAxKSB7CisJCQlpZiAoKG1hc2sgJiAxKSA9PSAwKQkJ
Lyogbm90IGEgdmFsaWQgcmF0ZSAqLworCQkJCWNvbnRpbnVlOworCQkJc2FuLT5zdGF0c1t5XVty
aXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMgPSAwOworCQkJc2FuLT5zdGF0c1t5XVtyaXhdLnRyaWVz
ID0gMDsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS50b3RhbF9wYWNrZXRzID0gMDsKKwkJCXNhbi0+
c3RhdHNbeV1bcml4XS5wYWNrZXRzX2Fja2VkID0gMDsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS5s
YXN0X3R4ID0gMDsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS5ld21hX3BjdCA9IDA7CisJCQkKKwkJ
CXNhbi0+c3RhdHNbeV1bcml4XS5wZXJmZWN0X3R4X3RpbWUgPQorCQkJICAgIGNhbGNfdXNlY3Nf
dW5pY2FzdF9wYWNrZXQodmFwLCBzaXplLCByaXgsIDAsIDAsCisJCQkgICAgKG5pLT5uaV9jaHcg
PT0gNDApKTsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS5hdmVyYWdlX3R4X3RpbWUgPQorCQkJICAg
IHNhbi0+c3RhdHNbeV1bcml4XS5wZXJmZWN0X3R4X3RpbWU7CisJCX0KKwl9CisKKwkvKiBzZXQg
dGhlIHZpc2libGUgYml0LXJhdGUgKi8KKwlpZiAoc2FuLT5zdGF0aWNfcml4ICE9IC0xKQorCQlu
aS0+bmlfdHhyYXRlID0gRE9UMTFSQVRFKHNhbi0+c3RhdGljX3JpeCk7CisJZWxzZQorCQluaS0+
bmlfdHhyYXRlID0gUkFURSgwKTsKKyN1bmRlZiBSQVRFCisjdW5kZWYgRE9UMTFSQVRFCisjdW5k
ZWYgTUNTCit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfbm9kZV9kZWluaXQoc3RydWN0IGllZWU4
MDIxMV9ub2RlICpuaSkKK3sKKwlmcmVlKG5pLT5uaV9yY3RscywgTV84MDIxMV9SQVRFQ1RMKTsK
K30KKworc3RhdGljIGludAorZG90MTFyYXRlKGNvbnN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpy
dCwgaW50IHJpeCkKK3sKKwlpZiAocml4IDwgMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiBydC0+
aW5mb1tyaXhdLnBoeSA9PSBJRUVFODAyMTFfVF9IVCA/CisJICAgIHJ0LT5pbmZvW3JpeF0uZG90
MTFSYXRlIDogKHJ0LT5pbmZvW3JpeF0uZG90MTFSYXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKSAv
IDI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2RvdDExcmF0ZV9sYWJlbChjb25zdCBpZWVl
ODAyMTFfcmF0ZV90YWJsZSAqcnQsIGludCByaXgpCit7CisJaWYgKHJpeCA8IDApCisJCXJldHVy
biAiIjsKKwlyZXR1cm4gcnQtPmluZm9bcml4XS5waHkgPT0gSUVFRTgwMjExX1RfSFQgPyAiTUNT
IiA6ICJNYiAiOworfQorCisvKgorICogUmV0dXJuIHRoZSByaXggd2l0aCB0aGUgbG93ZXN0IGF2
ZXJhZ2VfdHhfdGltZSwKKyAqIG9yIC0xIGlmIGFsbCB0aGUgYXZlcmFnZV90eF90aW1lcyBhcmUg
MC4KKyAqLworc3RhdGljIF9faW5saW5lIGludAorcGlja19iZXN0X3JhdGUoY29uc3Qgc3RydWN0
IGllZWU4MDIxMV9ub2RlICpuaSwgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpy
dCwKKyAgICBpbnQgc2l6ZV9iaW4sIGludCByZXF1aXJlX2Fja2VkX2JlZm9yZSkKK3sKKwlzdHJ1
Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisgICAgaW50IGJl
c3RfcmF0ZV9yaXgsIGJlc3RfcmF0ZV90dCwgYmVzdF9yYXRlX3BjdDsKKwl1aW50NjRfdCBtYXNr
OworCWludCByaXgsIHR0LCBwY3Q7CisKKyAgICBiZXN0X3JhdGVfcml4ID0gMDsKKyAgICBiZXN0
X3JhdGVfdHQgPSAwOworCWJlc3RfcmF0ZV9wY3QgPSAwOworCisJZm9yIChtYXNrID0gc2FuLT5y
YXRlbWFzaywgcml4ID0gMDsgbWFzayAhPSAwOyBtYXNrID4+PSAxLCByaXgrKykgeworCQlpZiAo
KG1hc2sgJiAxKSA9PSAwKQkJLyogbm90IGEgc3VwcG9ydGVkIHJhdGUgKi8KKwkJCWNvbnRpbnVl
OworCisJCS8qIERvbid0IHBpY2sgYSBub24tSFQgcmF0ZSBmb3IgYSBIVCBub2RlICovCisJCWlm
ICgobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpICYmCisJCSAgICAocnQtPmluZm9b
cml4XS5waHkgIT0gSUVFRTgwMjExX1RfSFQpKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCXR0
ID0gc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5hdmVyYWdlX3R4X3RpbWU7CisJCWlmICh0dCA8
PSAwIHx8CisJCSAgICAocmVxdWlyZV9hY2tlZF9iZWZvcmUgJiYKKwkJICAgICAhc2FuLT5zdGF0
c1tzaXplX2Jpbl1bcml4XS5wYWNrZXRzX2Fja2VkKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIENh
bGN1bGF0ZSBwZXJjZW50YWdlIGlmIHBvc3NpYmxlICovCisJCWlmIChzYW4tPnN0YXRzW3NpemVf
YmluXVtyaXhdLnRvdGFsX3BhY2tldHMgPiAwKSB7CisJCQlwY3QgPSBzYW4tPnN0YXRzW3NpemVf
YmluXVtyaXhdLmV3bWFfcGN0OworCQl9IGVsc2UgeworCQkJLyogWFhYIGZvciBub3csIGFzc3Vt
ZSA5NSUgb2sgKi8KKwkJCXBjdCA9IDk1OworCQl9CisKKwkJLyogZG9uJ3QgdXNlIGEgYml0LXJh
dGUgdGhhdCBoYXMgYmVlbiBmYWlsaW5nICovCisJCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVty
aXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMgPiAzKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICog
Rm9yIEhULCBEb24ndCB1c2UgYSBiaXQgcmF0ZSB0aGF0IGlzIG11Y2ggbW9yZQorCQkgKiBsb3Nz
eSB0aGFuIHRoZSBiZXN0LgorCQkgKgorCQkgKiBYWFggdGhpcyBpc24ndCBvcHRpbWFsOyBpdCdz
IGp1c3QgZGVzaWduZWQgdG8KKwkJICogZWxpbWluYXRlIHJhdGVzIHRoYXQgYXJlIGdvaW5nIHRv
IGJlIG9idmlvdXNseQorCQkgKiB3b3JzZS4KKwkJICovCisJCWlmIChuaS0+bmlfZmxhZ3MgJiBJ
RUVFODAyMTFfTk9ERV9IVCkgeworCQkJaWYgKGJlc3RfcmF0ZV9wY3QgPiAocGN0ICsgNTApKQor
CQkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogRm9yIG5vbi1NQ1MgcmF0ZXMsIHVzZSB0
aGUgY3VycmVudCBhdmVyYWdlIHR4dGltZSBmb3IKKwkJICogY29tcGFyaXNvbi4KKwkJICovCisJ
CWlmICghIChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkpIHsKKwkJCWlmIChiZXN0
X3JhdGVfdHQgPT0gMCB8fCB0dCA8PSBiZXN0X3JhdGVfdHQpIHsKKwkJCQliZXN0X3JhdGVfdHQg
PSB0dDsKKwkJCQliZXN0X3JhdGVfcml4ID0gcml4OworCQkJCWJlc3RfcmF0ZV9wY3QgPSBwY3Q7
CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBTaW5jZSAyIHN0cmVhbSByYXRlcyBoYXZlIHNsaWdo
dGx5IGhpZ2hlciBUWCB0aW1lcywKKwkJICogYWxsb3cgYSBsaXR0bGUgYml0IG9mIGxlZXdheS4g
VGhpcyBzaG91bGQgbGF0ZXIKKwkJICogYmUgYWJzdHJhY3RlZCBvdXQgYW5kIHByb3Blcmx5IGhh
bmRsZWQuCisJCSAqLworCQlpZiAobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpIHsK
KwkJCWlmIChiZXN0X3JhdGVfdHQgPT0gMCB8fCAodHQgKiA4IDw9IGJlc3RfcmF0ZV90dCAqIDEw
KSkgeworCQkJCWJlc3RfcmF0ZV90dCA9IHR0OworCQkJCWJlc3RfcmF0ZV9yaXggPSByaXg7CisJ
CQkJYmVzdF9yYXRlX3BjdCA9IHBjdDsKKwkJCX0KKwkJfQorICAgICAgICB9CisgICAgICAgIHJl
dHVybiAoYmVzdF9yYXRlX3R0ID8gYmVzdF9yYXRlX3JpeCA6IC0xKTsKK30KKworLyoKKyAqIFBp
Y2sgYSBnb29kICJyYW5kb20iIGJpdC1yYXRlIHRvIHNhbXBsZSBvdGhlciB0aGFuIHRoZSBjdXJy
ZW50IG9uZS4KKyAqLworc3RhdGljIF9faW5saW5lIGludAorcGlja19zYW1wbGVfcmF0ZShjb25z
dCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBjb25zdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAq
cnQsIAorCWludCBzaXplX2JpbikKK3sKKyNkZWZpbmUJRE9UMTFSQVRFKGl4KQkocnQtPmluZm9b
aXhdLmRvdDExUmF0ZSAmIElFRUU4MDIxMV9SQVRFX1ZBTCkKKyNkZWZpbmUJTUNTKGl4KQkJKHJ0
LT5pbmZvW2l4XS5kb3QxMVJhdGUgfCBJRUVFODAyMTFfUkFURV9NQ1MpCisJc3RydWN0IGllZWU4
MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOworCXN0cnVjdCBpZWVlODAyMTFf
c2FtcGxlICpzYW1wbGUgPSBzYW4tPnNhbl9zYW1wbGU7CisJaW50IGN1cnJlbnRfcml4LCByaXg7
CisJdW5zaWduZWQgY3VycmVudF90dDsKKwl1aW50NjRfdCBtYXNrOworCQorCWN1cnJlbnRfcml4
ID0gc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl07CisJaWYgKGN1cnJlbnRfcml4IDwgMCkgewor
CQkvKiBubyBzdWNjZXNzZXMgeWV0LCBzZW5kIGF0IHRoZSBsb3dlc3QgYml0LXJhdGUgKi8KKwkJ
LyogWFhYIHNob3VsZCByZXR1cm4gTUNTMCBpZiBIVCAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlj
dXJyZW50X3R0ID0gc2FuLT5zdGF0c1tzaXplX2Jpbl1bY3VycmVudF9yaXhdLmF2ZXJhZ2VfdHhf
dGltZTsKKworCXJpeCA9IHNhbi0+bGFzdF9zYW1wbGVfcml4W3NpemVfYmluXSsxOwkvKiBuZXh0
IHNhbXBsZSByYXRlICovCisJbWFzayA9IHNhbi0+cmF0ZW1hc2sgJn4gKCh1aW50NjRfdCkgMTw8
Y3VycmVudF9yaXgpOy8qIGRvbid0IHNhbXBsZSBjdXJyZW50IHJhdGUgKi8KKwl3aGlsZSAobWFz
ayAhPSAwKSB7CisJCWlmICgobWFzayAmICgodWludDY0X3QpIDE8PHJpeCkpID09IDApIHsJLyog
bm90IGEgc3VwcG9ydGVkIHJhdGUgKi8KKwluZXh0cmF0ZToKKwkJCWlmICgrK3JpeCA+PSBydC0+
cmF0ZUNvdW50KQorCQkJCXJpeCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAq
IFRoZSBmb2xsb3dpbmcgY29kZSBzdG9wcyB0cnlpbmcgdG8gc2FtcGxlCisJCSAqIG5vbi1NQ1Mg
cmF0ZXMgd2hlbiBzcGVha2luZyB0byBhbiBNQ1Mgbm9kZS4KKwkJICogSG93ZXZlciwgYXQgbGVh
c3QgZm9yIENDSyByYXRlcyBpbiAyLjRHSHogbW9kZSwKKwkJICogdGhlIG5vbi1NQ1MgcmF0ZXMg
TUFZIGFjdHVhbGx5IHByb3ZpZGUgYmV0dGVyCisJCSAqIFBFUiBhdCB0aGUgdmVyeSBmYXIgZWRn
ZSBvZiByZWNlcHRpb24uCisJCSAqCisJCSAqIEhvd2V2ZXIhIFVudGlsIGF0aF9yYXRlX2Zvcm1f
YWdncigpIGdyb3dzCisJCSAqIHNvbWUgbG9naWMgdG8gbm90IGZvcm0gYWdncmVnYXRlcyBpZiB0
aGUKKwkJICogc2VsZWN0ZWQgcmF0ZSBpcyBub24tTUNTLCB0aGlzIHdvbid0IHdvcmsuCisJCSAq
CisJCSAqIFNvIGRvbid0IGRpc2FibGUgdGhpcyBjb2RlIHVudGlsIHlvdSd2ZSB0YXVnaHQKKwkJ
ICogYXRoX3JhdGVfZm9ybV9hZ2dyKCkgdG8gZHJvcCBvdXQgaWYgYW55IG9mCisJCSAqIHRoZSBz
ZWxlY3RlZCByYXRlcyBhcmUgbm9uLU1DUy4KKwkJICovCisjaWYgMQorCQkvKiBpZiB0aGUgbm9k
ZSBpcyBIVCBhbmQgdGhlIHJhdGUgaXNuJ3QgSFQsIGRvbid0IGJvdGhlciBzYW1wbGUgKi8KKwkJ
aWYgKChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkgJiYKKwkJICAgIChydC0+aW5m
b1tyaXhdLnBoeSAhPSBJRUVFODAyMTFfVF9IVCkpIHsKKwkJCW1hc2sgJj0gfigodWludDY0X3Qp
IDE8PHJpeCk7CisJCQlnb3RvIG5leHRyYXRlOworCQl9CisjZW5kaWYKKworCQkvKiB0aGlzIGJp
dC1yYXRlIGlzIGFsd2F5cyB3b3JzZSB0aGFuIHRoZSBjdXJyZW50IG9uZSAqLworCQlpZiAoc2Fu
LT5zdGF0c1tzaXplX2Jpbl1bcml4XS5wZXJmZWN0X3R4X3RpbWUgPiBjdXJyZW50X3R0KSB7CisJ
CQltYXNrICY9IH4oKHVpbnQ2NF90KSAxPDxyaXgpOworCQkJZ290byBuZXh0cmF0ZTsKKwkJfQor
CisJCS8qIHJhcmVseSBzYW1wbGUgYml0LXJhdGVzIHRoYXQgZmFpbCBhIGxvdCAqLworCQlpZiAo
c2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5zdWNjZXNzaXZlX2ZhaWx1cmVzID4gc2FtcGxlLT5z
YW1wbGVfbWF4X3N1Y2Nlc3NpdmVfZmFpbHVyZXMgJiYKKwkJICAgIHRpY2tzIC0gc2FuLT5zdGF0
c1tzaXplX2Jpbl1bcml4XS5sYXN0X3R4IDwgc2FtcGxlLT5zYW1wbGVfc3RhbGVfZmFpbHVyZV90
aW1lb3V0KSB7CisJCQltYXNrICY9IH4oKHVpbnQ2NF90KSAxPDxyaXgpOworCQkJZ290byBuZXh0
cmF0ZTsKKwkJfQorCisJCS8qCisJCSAqIEZvciBIVCwgb25seSBzYW1wbGUgYSBmZXcgcmF0ZXMg
b24gZWl0aGVyIHNpZGUgb2YgdGhlCisJCSAqIGN1cnJlbnQgcml4OyB0aGVyZSdzIHF1aXRlIGxp
a2VseSBhIGxvdCBvZiB0aGVtLgorCQkgKi8KKwkJaWYgKG5pLT5uaV9mbGFncyAmIElFRUU4MDIx
MV9OT0RFX0hUKSB7CisJCQlpZiAocml4IDwgKGN1cnJlbnRfcml4IC0gMykgfHwKKwkJCSAgICBy
aXggPiAoY3VycmVudF9yaXggKyAzKSkgeworCQkJCW1hc2sgJj0gfigodWludDY0X3QpIDE8PHJp
eCk7CisJCQkJZ290byBuZXh0cmF0ZTsKKwkJCX0KKwkJfQorCisJCS8qIERvbid0IHNhbXBsZSBt
b3JlIHRoYW4gMiByYXRlcyBoaWdoZXIgZm9yIHJhdGVzID4gMTFNIGZvciBub24tSFQgcmF0ZXMg
Ki8KKwkJaWYgKCEgKG5pLT5uaV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX0hUKSkgeworCQkJaWYg
KERPVDExUkFURShyaXgpID4gMioxMSAmJiByaXggPiBjdXJyZW50X3JpeCArIDIpIHsKKwkJCQlt
YXNrICY9IH4oKHVpbnQ2NF90KSAxPDxyaXgpOworCQkJCWdvdG8gbmV4dHJhdGU7CisJCQl9CisJ
CX0KKworCQlzYW4tPmxhc3Rfc2FtcGxlX3JpeFtzaXplX2Jpbl0gPSByaXg7CisJCXJldHVybiBy
aXg7CisJfQorCXJldHVybiBjdXJyZW50X3JpeDsKKyN1bmRlZiBET1QxMVJBVEUKKyN1bmRlZiBN
Q1MKK30KKworc3RhdGljIGludAorc2FtcGxlX2dldF9zdGF0aWNfcml4KGNvbnN0IHN0cnVjdCBp
ZWVlODAyMTFfbm9kZSAqbmkpCit7CisjZGVmaW5lCVJBVEUoX2l4KQkobmktPm5pX3JhdGVzLnJz
X3JhdGVzWyhfaXgpXSAmIElFRUU4MDIxMV9SQVRFX1ZBTCkKKyNkZWZpbmUJTUNTKF9peCkJKG5p
LT5uaV9odHJhdGVzLnJzX3JhdGVzW19peF0gfCBJRUVFODAyMTFfUkFURV9NQ1MpCisJc3RydWN0
IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjEx
X3JhdGVfdGFibGUgKnJ0ID0gaWVlZTgwMjExX2dldF9yYXRldGFibGUodmFwLT5pdl9pYy0+aWNf
Y3VyY2hhbik7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eHBhcmFtICp0cCA9IG5pLT5uaV90
eHBhcm1zOworCWludCBzcmF0ZTsKKworCS8qIENoZWNrIE1DUyByYXRlcyAqLworCWZvciAoc3Jh
dGUgPSBuaS0+bmlfaHRyYXRlcy5yc19ucmF0ZXMgLSAxOyBzcmF0ZSA+PSAwOyBzcmF0ZS0tKSB7
CisJCWlmIChNQ1Moc3JhdGUpID09IHRwLT51Y2FzdHJhdGUpCisJCQlyZXR1cm4gcnQtPnJhdGVD
b2RlVG9JbmRleFt0cC0+dWNhc3RyYXRlXTsKKwl9CisKKwkvKiBDaGVjayBsZWdhY3kgcmF0ZXMg
Ki8KKwlmb3IgKHNyYXRlID0gbmktPm5pX3JhdGVzLnJzX25yYXRlcyAtIDE7IHNyYXRlID49IDA7
IHNyYXRlLS0pIHsKKwkJaWYgKFJBVEUoc3JhdGUpID09IHRwLT51Y2FzdHJhdGUpCisJCQlyZXR1
cm4gcnQtPnJhdGVDb2RlVG9JbmRleFt0cC0+dWNhc3RyYXRlXTsKKwl9CisJcmV0dXJuIC0xOwor
I3VuZGVmCVJBVEUKKyN1bmRlZglNQ1MKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV91cGRhdGVf
c3RhdGljX3JpeChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCXN0cnVjdCBpZWVlODAy
MTFfc2FtcGxlX25vZGUgKnNhbiA9IG5pLT5uaV9yY3RsczsKKwljb25zdCBzdHJ1Y3QgaWVlZTgw
MjExX3R4cGFyYW0gKnRwID0gbmktPm5pX3R4cGFybXM7CisKKwlpZiAodHAgIT0gTlVMTCAmJiB0
cC0+dWNhc3RyYXRlICE9IElFRUU4MDIxMV9GSVhFRF9SQVRFX05PTkUpIHsKKwkJLyoKKwkJICog
QSBmaXhlZCByYXRlIGlzIHRvIGJlIHVzZWQ7IHVjYXN0cmF0ZSBpcyB0aGUgSUVFRSBjb2RlCisJ
CSAqIGZvciB0aGlzIHJhdGUgKHNhbnMgYmFzaWMgYml0KS4gIENoZWNrIHRoaXMgYWdhaW5zdCB0
aGUKKwkJICogbmVnb3RpYXRlZCByYXRlIHNldCBmb3IgdGhlIG5vZGUuICBOb3RlIHRoZSBmaXhl
ZCByYXRlCisJCSAqIG1heSBub3QgYmUgYXZhaWxhYmxlIGZvciB2YXJpb3VzIHJlYXNvbnMgc28g
d2Ugb25seQorCQkgKiBzZXR1cCB0aGUgc3RhdGljIHJhdGUgaW5kZXggaWYgdGhlIGxvb2t1cCBp
cyBzdWNjZXNzZnVsLgorCQkgKi8KKwkJc2FuLT5zdGF0aWNfcml4ID0gc2FtcGxlX2dldF9zdGF0
aWNfcml4KG5pKTsKKwl9IGVsc2UgeworCQlzYW4tPnN0YXRpY19yaXggPSAtMTsKKwl9Cit9CisK
Ky8qCisgKiBQaWNrIGEgbm9uLUhUIHJhdGUgdG8gYmVnaW4gdXNpbmcuCisgKi8KK3N0YXRpYyBp
bnQKK3NhbXBsZV9waWNrX3NlZWRfcmF0ZV9sZWdhY3koY29uc3Qgc3RydWN0IGllZWU4MDIxMV9u
b2RlICpuaSwgaW50IGZyYW1lTGVuKQoreworI2RlZmluZQlET1QxMVJBVEUoaXgpCShydC0+aW5m
b1tpeF0uZG90MTFSYXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKQorCXN0cnVjdCBpZWVlODAyMTF2
YXAgKnZhcCA9IG5pLT5uaV92YXA7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2Fu
ID0gbmktPm5pX3JjdGxzOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQg
PSBpZWVlODAyMTFfZ2V0X3JhdGV0YWJsZSh2YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwkKKwlj
b25zdCBpbnQgc2l6ZV9iaW4gPSBzaXplX3RvX2JpbihmcmFtZUxlbik7CisJaW50IHJpeCA9IC0x
OworCisJLyogbm8gcGFja2V0IGhhcyBiZWVuIHNlbnQgc3VjY2Vzc2Z1bGx5IHlldCAqLworCWZv
ciAocml4ID0gcnQtPnJhdGVDb3VudC0xOyByaXggPiAwOyByaXgtLSkgeworCQlpZiAoKHNhbi0+
cmF0ZW1hc2sgJiAoKHVpbnQ2NF90KSAxPDxyaXgpKSA9PSAwKQorCQkJY29udGludWU7CisKKwkJ
LyogU2tpcCBIVCByYXRlcyAqLworCQlpZiAocnQtPmluZm9bcml4XS5waHkgPT0gSUVFRTgwMjEx
X1RfSFQpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBQaWNrIHRoZSBoaWdoZXN0IHJhdGUg
PD0gMzYgTWJwcworCQkgKiB0aGF0IGhhc24ndCBmYWlsZWQuCisJCSAqLworCQlpZiAoRE9UMTFS
QVRFKHJpeCkgPD0gNzIgJiYKKwkJICAgIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeF0uc3VjY2Vz
c2l2ZV9mYWlsdXJlcyA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcml4Owor
I3VuZGVmIERPVDExUkFURQorfQorCisvKgorICogUGljayBhIEhUIHJhdGUgdG8gYmVnaW4gdXNp
bmcuCisgKgorICogRG9uJ3QgdXNlIGFueSBub24tSFQgcmF0ZXM7IG9ubHkgY29uc2lkZXIgSFQg
cmF0ZXMuCisgKi8KK3N0YXRpYyBpbnQKK3NhbXBsZV9waWNrX3NlZWRfcmF0ZV9odChjb25zdCBz
dHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBpbnQgZnJhbWVMZW4pCit7CisjZGVmaW5lCU1DUyhp
eCkJCShydC0+aW5mb1tpeF0uZG90MTFSYXRlIHwgSUVFRTgwMjExX1JBVEVfTUNTKQorCXN0cnVj
dCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92YXA7CisJc3RydWN0IGllZWU4MDIxMV9zYW1w
bGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0
ZV90YWJsZSAqcnQgPSBpZWVlODAyMTFfZ2V0X3JhdGV0YWJsZSh2YXAtPml2X2ljLT5pY19jdXJj
aGFuKTsKKwkKKwljb25zdCBpbnQgc2l6ZV9iaW4gPSBzaXplX3RvX2JpbihmcmFtZUxlbik7CisJ
aW50IHJpeCA9IC0xLCBodF9yaXggPSAtMTsKKworCS8qIG5vIHBhY2tldCBoYXMgYmVlbiBzZW50
IHN1Y2Nlc3NmdWxseSB5ZXQgKi8KKwlmb3IgKHJpeCA9IHJ0LT5yYXRlQ291bnQtMTsgcml4ID4g
MDsgcml4LS0pIHsKKwkJLyogU2tpcCByYXRlcyB3ZSBjYW4ndCB1c2UgKi8KKwkJaWYgKChzYW4t
PnJhdGVtYXNrICYgKCh1aW50NjRfdCkgMTw8cml4KSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJ
CS8qIEtlZXAgYSBjb3B5IG9mIHRoZSBsYXN0IHNlZW4gSFQgcmF0ZSBpbmRleCAqLworCQlpZiAo
cnQtPmluZm9bcml4XS5waHkgPT0gSUVFRTgwMjExX1RfSFQpCisJCQlodF9yaXggPSByaXg7CisK
KwkJLyogU2tpcCBub24tSFQgcmF0ZXMgKi8KKwkJaWYgKHJ0LT5pbmZvW3JpeF0ucGh5ICE9IElF
RUU4MDIxMV9UX0hUKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogUGljayBhIG1lZGl1bS1z
cGVlZCByYXRlIHJlZ2FyZGxlc3Mgb2Ygc3RyZWFtIGNvdW50CisJCSAqIHdoaWNoIGhhcyBub3Qg
c2VlbiBhbnkgZmFpbHVyZXMuIEhpZ2hlciByYXRlcyBtYXkgZmFpbDsKKwkJICogd2UnbGwgdHJ5
IHRoZW0gbGF0ZXIuCisJCSAqLworCQlpZiAoKChNQ1Mocml4KSAmIDB4NykgPD0gNCkgJiYKKwkJ
ICAgIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeF0uc3VjY2Vzc2l2ZV9mYWlsdXJlcyA9PSAwKSB7
CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogSWYgYWxsIHRoZSBNQ1MgcmF0ZXMgaGF2
ZSBzdWNjZXNzaXZlIGZhaWx1cmVzLCByaXggc2hvdWxkIGJlCisJICogPiAwOyBvdGhlcndpc2Ug
dXNlIHRoZSBsb3dlc3QgTUNTIHJpeCAoaG9wZWZ1bGx5IE1DUyAwLikKKwkgKi8KKwlyZXR1cm4g
TUFYKHJpeCwgaHRfcml4KTsKKyN1bmRlZiBNQ1MKK30KKworc3RhdGljIGludAorc2FtcGxlX3Jh
dGUoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgdm9pZCAqYXJnIF9fdW51c2VkLCB1aW50MzJf
dCBpYXJnIF9fdW51c2VkKQoreworI2RlZmluZQlET1QxMVJBVEUoaXgpCShydC0+aW5mb1tpeF0u
ZG90MTFSYXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKQorI2RlZmluZQlNQ1MoaXgpCQkocnQtPmlu
Zm9baXhdLmRvdDExUmF0ZSB8IElFRUU4MDIxMV9SQVRFX01DUykKKyNkZWZpbmUJUkFURShpeCkJ
KERPVDExUkFURShpeCkgLyAyKQorCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92
YXA7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOwor
CXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSBzYW4tPnNhbl9zYW1wbGU7CisJY29u
c3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRh
YmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCQorCWludCByaXgsIG1yciwgYmVzdF9yaXgs
IGNoYW5nZV9yYXRlczsKKwl1bnNpZ25lZCBhdmVyYWdlX3R4X3RpbWU7CisJCisJc2l6ZV90IGZy
YW1lTGVuID0gKHNpemVfdClpYXJnOworCWNvbnN0IGludCBzaXplX2JpbiA9IHNpemVfdG9fYmlu
KGZyYW1lTGVuKTsKKworCXNhbXBsZV91cGRhdGVfc3RhdGljX3JpeChuaSk7CisKKwlpZiAoc2Fu
LT5zdGF0aWNfcml4ICE9IC0xKSB7CisJCXJpeCA9IHNhbi0+c3RhdGljX3JpeDsKKwkJZ290byBk
b25lOworCX0KKworCWlmIChJRUVFODAyMTFfUkFURUNUTF9IQVNDQVBfTVJSKG5pKSkKKwkJbXJy
ID0gMTsKKwlpZiAoISBJRUVFODAyMTFfUkFURUNUTF9IQVNDQVBfTVJSUFJPVChuaSkpCisJCW1y
ciA9IDA7CisKKwliZXN0X3JpeCA9IHBpY2tfYmVzdF9yYXRlKG5pLCBydCwgc2l6ZV9iaW4sICFt
cnIpOworCWlmIChiZXN0X3JpeCA+PSAwKSB7CisJCWF2ZXJhZ2VfdHhfdGltZSA9IHNhbi0+c3Rh
dHNbc2l6ZV9iaW5dW2Jlc3Rfcml4XS5hdmVyYWdlX3R4X3RpbWU7CisJfSBlbHNlIHsKKwkJYXZl
cmFnZV90eF90aW1lID0gMDsKKwl9CisKKwkvKgorCSAqIExpbWl0IHRoZSB0aW1lIG1lYXN1cmlu
ZyB0aGUgcGVyZm9ybWFuY2Ugb2Ygb3RoZXIgdHgKKwkgKiByYXRlcyB0byBzYW1wbGVfcmF0ZSUg
b2YgdGhlIHRvdGFsIHRyYW5zbWlzc2lvbiB0aW1lLgorCSAqLworCWlmIChzYW4tPnNhbXBsZV90
dFtzaXplX2Jpbl0gPCBhdmVyYWdlX3R4X3RpbWUgKiAoc2FuLT5wYWNrZXRzX3NpbmNlX3NhbXBs
ZVtzaXplX2Jpbl0gKgorCQlzYW1wbGUtPnNhbXBsZV9yYXRlLzEwMCkpIHsKKwkJcml4ID0gcGlj
a19zYW1wbGVfcmF0ZShuaSwgcnQsIHNpemVfYmluKTsKKwkJSUVFRTgwMjExX05PVEUodmFwLCBJ
RUVFODAyMTFfTVNHX1JBVEVDVEwsCisJCSAgICAgJm5pLCAiYXR0ICVkIHNhbXBsZV90dCAlZCBz
aXplICV1IHNhbXBsZSByYXRlICVkICVzIGN1cnJlbnQgcmF0ZSAlZCAlcyIsCisJCSAgICAgYXZl
cmFnZV90eF90aW1lLAorCQkgICAgIHNhbi0+c2FtcGxlX3R0W3NpemVfYmluXSwKKwkJICAgICBi
aW5fdG9fc2l6ZShzaXplX2JpbiksCisJCSAgICAgZG90MTFyYXRlKHJ0LCByaXgpLAorCQkgICAg
IGRvdDExcmF0ZV9sYWJlbChydCwgcml4KSwKKwkJICAgICBkb3QxMXJhdGUocnQsIHNhbi0+Y3Vy
cmVudF9yaXhbc2l6ZV9iaW5dKSwKKwkJICAgICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+Y3Vy
cmVudF9yaXhbc2l6ZV9iaW5dKSk7CisJCWlmIChyaXggIT0gc2FuLT5jdXJyZW50X3JpeFtzaXpl
X2Jpbl0pIHsKKwkJCXNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3NpemVfYmluXSA9IHJpeDsKKwkJ
fSBlbHNlIHsKKwkJCXNhbi0+Y3VycmVudF9zYW1wbGVfcml4W3NpemVfYmluXSA9IC0xOworCQl9
CisJCXNhbi0+cGFja2V0c19zaW5jZV9zYW1wbGVbc2l6ZV9iaW5dID0gMDsKKwl9IGVsc2Ugewor
CQljaGFuZ2VfcmF0ZXMgPSAwOworCQlpZiAoIXNhbi0+cGFja2V0c19zZW50W3NpemVfYmluXSB8
fCBiZXN0X3JpeCA9PSAtMSkgeworCQkJLyogbm8gcGFja2V0IGhhcyBiZWVuIHNlbnQgc3VjY2Vz
c2Z1bGx5IHlldCAqLworCQkJY2hhbmdlX3JhdGVzID0gMTsKKwkJCWlmIChuaS0+bmlfZmxhZ3Mg
JiBJRUVFODAyMTFfTk9ERV9IVCkKKwkJCQliZXN0X3JpeCA9IHNhbXBsZV9waWNrX3NlZWRfcmF0
ZV9odChuaSwgZnJhbWVMZW4pOworCQkJZWxzZQorCQkJCWJlc3Rfcml4ID0gc2FtcGxlX3BpY2tf
c2VlZF9yYXRlX2xlZ2FjeShuaSwgZnJhbWVMZW4pOworCQl9IGVsc2UgaWYgKHNhbi0+cGFja2V0
c19zZW50W3NpemVfYmluXSA8IDIwKSB7CisJCQkvKiBsZXQgdGhlIGJpdC1yYXRlIHN3aXRjaCBx
dWlja2x5IGR1cmluZyB0aGUgZmlyc3QgZmV3IHBhY2tldHMgKi8KKwkJCUlFRUU4MDIxMV9OT1RF
KHZhcCwKKwkJCSAgICBJRUVFODAyMTFfTVNHX1JBVEVDVEwsICZuaSwKKwkJCSAgICAiJXM6IHN3
aXRjaGluZyBxdWlja2x5Li4iLCBfX2Z1bmNfXyk7CisJCQljaGFuZ2VfcmF0ZXMgPSAxOworCQl9
IGVsc2UgaWYgKHRpY2tzIC0gc2FtcGxlLT5zYW1wbGVfbWluX3N3aXRjaCA+IHNhbi0+dGlja3Nf
c2luY2Vfc3dpdGNoW3NpemVfYmluXSkgeworCQkJLyogbWluX3N3aXRjaCBzZWNvbmRzIGhhdmUg
Z29uZSBieSAqLworCQkJSUVFRTgwMjExX05PVEUodmFwLAorCQkJICAgIElFRUU4MDIxMV9NU0df
UkFURUNUTCwgJm5pLAorCQkJICAgICIlczogbWluX3N3aXRjaCAlZCA+IHRpY2tzX3NpbmNlX3N3
aXRjaCAlZC4uIiwKKwkJCSAgICBfX2Z1bmNfXywgdGlja3MgLSBzYW1wbGUtPnNhbXBsZV9taW5f
c3dpdGNoLCBzYW4tPnRpY2tzX3NpbmNlX3N3aXRjaFtzaXplX2Jpbl0pOworCQkJY2hhbmdlX3Jh
dGVzID0gMTsKKwkJfSBlbHNlIGlmICgoISAobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVf
SFQpKSAmJgorCQkgICAgKDIqYXZlcmFnZV90eF90aW1lIDwgc2FuLT5zdGF0c1tzaXplX2Jpbl1b
c2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl1dLmF2ZXJhZ2VfdHhfdGltZSkpIHsKKwkJCS8qIHRo
ZSBjdXJyZW50IGJpdC1yYXRlIGlzIHR3aWNlIGFzIHNsb3cgYXMgdGhlIGJlc3Qgb25lICovCisJ
CQlJRUVFODAyMTFfTk9URSh2YXAsCisJCQkgICAgSUVFRTgwMjExX01TR19SQVRFQ1RMLCAmbmks
CisJCQkgICAgIiVzOiAyeCBhdHQgKD0gJWQpIDwgY3VyX3JpeCBhdHQgJWQiLAorCQkJICAgIF9f
ZnVuY19fLAorCQkJICAgIDIgKiBhdmVyYWdlX3R4X3RpbWUsIHNhbi0+c3RhdHNbc2l6ZV9iaW5d
W3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dXS5hdmVyYWdlX3R4X3RpbWUpOworCQkJY2hhbmdl
X3JhdGVzID0gMTsKKwkJfSBlbHNlIGlmICgobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVf
SFQpKSB7CisJCQlpbnQgY3VyX3JpeCA9IHNhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dOworCQkJ
aW50IGN1cl9hdHQgPSBzYW4tPnN0YXRzW3NpemVfYmluXVtjdXJfcml4XS5hdmVyYWdlX3R4X3Rp
bWU7CisJCQkvKgorCQkJICogSWYgdGhlIG5vZGUgaXMgSFQsIHVwZ3JhZGUgaXQgaWYgdGhlIE1D
UyByYXRlIGlzCisJCQkgKiBoaWdoZXIgYW5kIHRoZSBhdmVyYWdlIHR4IHRpbWUgaXMgd2l0aGlu
IDIwJSBvZgorCQkJICogdGhlIGN1cnJlbnQgcmF0ZS4gSXQgY2FuIGZhaWwgYSBsaXR0bGUuCisJ
CQkgKgorCQkJICogVGhpcyBpcyBsaWtlbHkgbm90IG9wdGltYWwhCisJCQkgKi8KKyNpZiAwCisJ
CQlwcmludGYoImN1ciByaXgvYXR0ICV4LyVkLCBiZXN0IHJpeC9hdHQgJXgvJWRcbiIsCisJCQkg
ICAgTUNTKGN1cl9yaXgpLCBjdXJfYXR0LCBNQ1MoYmVzdF9yaXgpLCBhdmVyYWdlX3R4X3RpbWUp
OworI2VuZGlmCisJCQlpZiAoKE1DUyhiZXN0X3JpeCkgPiBNQ1MoY3VyX3JpeCkpICYmCisJCQkg
ICAgKGF2ZXJhZ2VfdHhfdGltZSAqIDgpIDw9IChjdXJfYXR0ICogMTApKSB7CisJCQkJSUVFRTgw
MjExX05PVEUodmFwLAorCQkJCSAgICBJRUVFODAyMTFfTVNHX1JBVEVDVEwsICZuaSwKKwkJCQkg
ICAgIiVzOiBIVDogYmVzdF9yaXggMHglZCA+IGN1cl9yaXggMHgleCwgYXZlcmFnZV90eF90aW1l
ICVkLCBjdXJfYXR0ICVkIiwKKwkJCQkgICAgX19mdW5jX18sCisJCQkJICAgIE1DUyhiZXN0X3Jp
eCksIE1DUyhjdXJfcml4KSwgYXZlcmFnZV90eF90aW1lLCBjdXJfYXR0KTsKKwkJCQljaGFuZ2Vf
cmF0ZXMgPSAxOworCQkJfQorCQl9CisKKwkJc2FuLT5wYWNrZXRzX3NpbmNlX3NhbXBsZVtzaXpl
X2Jpbl0rKzsKKwkJCisJCWlmIChjaGFuZ2VfcmF0ZXMpIHsKKwkJCWlmIChiZXN0X3JpeCAhPSBz
YW4tPmN1cnJlbnRfcml4W3NpemVfYmluXSkgeworCQkJCUlFRUU4MDIxMV9OT1RFKHZhcCwKKwkJ
CQkgICAgSUVFRTgwMjExX01TR19SQVRFQ1RMLAorCQkJCSAgICAmbmksCisiJXM6IHNpemUgJWQg
c3dpdGNoIHJhdGUgJWQgKCVkLyVkKSAtPiAlZCAoJWQvJWQpIGFmdGVyICVkIHBhY2tldHMgbXJy
ICVkIiwKKwkJCQkgICAgX19mdW5jX18sCisJCQkJICAgIGJpbl90b19zaXplKHNpemVfYmluKSwK
KwkJCQkgICAgUkFURShzYW4tPmN1cnJlbnRfcml4W3NpemVfYmluXSksCisJCQkJICAgIHNhbi0+
c3RhdHNbc2l6ZV9iaW5dW3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dXS5hdmVyYWdlX3R4X3Rp
bWUsCisJCQkJICAgIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3Nhbi0+Y3VycmVudF9yaXhbc2l6ZV9i
aW5dXS5wZXJmZWN0X3R4X3RpbWUsCisJCQkJICAgIFJBVEUoYmVzdF9yaXgpLAorCQkJCSAgICBz
YW4tPnN0YXRzW3NpemVfYmluXVtiZXN0X3JpeF0uYXZlcmFnZV90eF90aW1lLAorCQkJCSAgICBz
YW4tPnN0YXRzW3NpemVfYmluXVtiZXN0X3JpeF0ucGVyZmVjdF90eF90aW1lLAorCQkJCSAgICBz
YW4tPnBhY2tldHNfc2luY2Vfc3dpdGNoW3NpemVfYmluXSwKKwkJCQkgICAgbXJyKTsKKwkJCX0K
KwkJCXNhbi0+cGFja2V0c19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dID0gMDsKKwkJCXNhbi0+Y3Vy
cmVudF9yaXhbc2l6ZV9iaW5dID0gYmVzdF9yaXg7CisJCQlzYW4tPnRpY2tzX3NpbmNlX3N3aXRj
aFtzaXplX2Jpbl0gPSB0aWNrczsKKwkJCS8qIAorCQkJICogU2V0IHRoZSB2aXNpYmxlIHR4cmF0
ZSBmb3IgdGhpcyBub2RlLgorCQkJICovCisJCQluaS0+bmlfdHhyYXRlID0gZG90MTFyYXRlKHJ0
LCBiZXN0X3JpeCk7CisJCX0KKwkJcml4ID0gc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl07CisJ
CXNhbi0+cGFja2V0c19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dKys7CisJfQorCS8vICp0cnkwID0g
bXJyID8gc2FuLT5zY2hlZFtyaXhdLnQwIDogQVRIX1RYTUFYVFJZOworZG9uZToKKworCS8qCisJ
ICogVGhpcyBidWcgdG90YWxseSBzdWNrcyBhbmQgc2hvdWxkIGJlIGZpeGVkLgorCSAqCisJICog
Rm9yIG5vdyB0aG91Z2gsIGxldCdzIG5vdCBwYW5pYywgc28gd2UgY2FuIHN0YXJ0IHRvIGZpZ3Vy
ZQorCSAqIG91dCBob3cgdG8gYmV0dGVyIHJlcHJvZHVjZSBpdC4KKwkgKi8KKwlpZiAocml4IDwg
MCB8fCByaXggPj0gcnQtPnJhdGVDb3VudCkgeworCQlwcmludGYoIiVzOiBFUlJPUjogcml4ICVk
IG91dCBvZiBib3VuZHMgKHJhdGVDb3VudD0lZClcbiIsCisJCSAgICBfX2Z1bmNfXywKKwkJICAg
IHJpeCwKKwkJICAgIHJ0LT5yYXRlQ291bnQpOworCQkgICAgcml4ID0gMDsJLyogWFhYIGp1c3Qg
ZGVmYXVsdCBmb3Igbm93ICovCisJfQorCUtBU1NFUlQocml4ID49IDAgJiYgcml4IDwgcnQtPnJh
dGVDb3VudCwgKCJyaXggaXMgJWQiLCByaXgpKTsKKworCS8vICpyaXgwID0gcml4OworCS8vICp0
eHJhdGUgPSBydC0+aW5mb1tyaXhdLnJhdGVDb2RlCisJLy8gCXwgKHNob3J0UHJlYW1ibGUgPyBy
dC0+aW5mb1tyaXhdLnNob3J0UHJlYW1ibGUgOiAwKTsKKwlzYW4tPnBhY2tldHNfc2VudFtzaXpl
X2Jpbl0rKzsKKworCXJldHVybiByaXg7CisjdW5kZWYgRE9UMTFSQVRFCisjdW5kZWYgTUNTCisj
dW5kZWYgUkFURQorfQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3JhdGVzKHN0cnVjdCBpZWVlODAy
MTFfbm9kZSAqbmksIHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqcmNfaW5mbykKK3sKKwlzdHJ1
Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisJdWludDhfdCBy
aXgwID0gc2FtcGxlX3JhdGUobmksIE5VTEwsIDApOworCWNvbnN0IHN0cnVjdCB0eHNjaGVkdWxl
ICpzY2hlZCA9ICZzYW4tPnNjaGVkW3JpeDBdOworCXN0cnVjdCBpZWVlODAyMTFfcmNfc2VyaWVz
ICpyYyA9IHJjX2luZm8tPnJpX3JjOworCisJS0FTU0VSVChyaXgwID09IHNjaGVkLT5yMCwgKCJy
aXgwICgleCkgIT0gc2NoZWQtPnIwICgleCkhXG4iLAorCSAgICByaXgwLCBzY2hlZC0+cjApKTsK
KwkvKiBYWFggKi8KKwlyY1swXS5mbGFncyA9IHJjWzFdLmZsYWdzID0gcmNbMl0uZmxhZ3MgPSBy
Y1szXS5mbGFncyA9IDA7CisKKwlyY1swXS5yaXggPSBzY2hlZC0+cjA7CisJcmNbMV0ucml4ID0g
c2NoZWQtPnIxOworCXJjWzJdLnJpeCA9IHNjaGVkLT5yMjsKKwlyY1szXS5yaXggPSBzY2hlZC0+
cjM7CisKKwlyY1swXS50cmllcyA9IHNjaGVkLT50MDsKKwlyY1sxXS50cmllcyA9IHNjaGVkLT50
MTsKKwlyY1syXS50cmllcyA9IHNjaGVkLT50MjsKKwlyY1szXS50cmllcyA9IHNjaGVkLT50MzsK
K30KKworc3RhdGljIHZvaWQKK3VwZGF0ZV9zdGF0cyhjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFw
ICp2YXAsCisgICAgCSAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwKKwkJICBpbnQg
ZnJhbWVfc2l6ZSwKKwkJICBpbnQgcml4MCwgaW50IHRyaWVzMCwKKwkJICBpbnQgcml4MSwgaW50
IHRyaWVzMSwKKwkJICBpbnQgcml4MiwgaW50IHRyaWVzMiwKKwkJICBpbnQgcml4MywgaW50IHRy
aWVzMywKKwkJICBpbnQgc2hvcnRfdHJpZXMsIGludCB0cmllcywKKwkJICBpbnQgbmZyYW1lcywg
aW50IG5iYWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5p
X3JjdGxzOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSBzYW4tPnNhbl9zYW1w
bGU7CisKKwljb25zdCBpbnQgc2l6ZV9iaW4gPSBzaXplX3RvX2JpbihmcmFtZV9zaXplKTsKKwlj
b25zdCBpbnQgc2l6ZSA9IGJpbl90b19zaXplKHNpemVfYmluKTsKKworCWludCBpc19odDQwID0g
aWVlZTgwMjExX3JhdGVjdGxfaGFzY2FwX2N3NDAodmFwLCBuaSk7CisJaW50IHR0LCB0cmllc19z
b19mYXI7CisJaW50IHBjdDsKKworCWlmICghSVNfUkFURV9ERUZJTkVEKHNhbiwgcml4MCkpCisJ
CXJldHVybjsKKwl0dCA9IGNhbGNfdXNlY3NfdW5pY2FzdF9wYWNrZXQodmFwLCBzaXplLCByaXgw
LCBzaG9ydF90cmllcywKKwkJTUlOKHRyaWVzMCwgdHJpZXMpIC0gMSwgaXNfaHQ0MCk7CisJdHJp
ZXNfc29fZmFyID0gdHJpZXMwOworCisJaWYgKHRyaWVzMSAmJiB0cmllc19zb19mYXIgPCB0cmll
cykgeworCQlpZiAoIUlTX1JBVEVfREVGSU5FRChzYW4sIHJpeDEpKQorCQkJcmV0dXJuOworCQl0
dCArPSBjYWxjX3VzZWNzX3VuaWNhc3RfcGFja2V0KHZhcCwgc2l6ZSwgcml4MSwgc2hvcnRfdHJp
ZXMsCisJCQlNSU4odHJpZXMxICsgdHJpZXNfc29fZmFyLCB0cmllcykgLSB0cmllc19zb19mYXIg
LSAxLCBpc19odDQwKTsKKwkJdHJpZXNfc29fZmFyICs9IHRyaWVzMTsKKwl9CisKKwlpZiAodHJp
ZXMyICYmIHRyaWVzX3NvX2ZhciA8IHRyaWVzKSB7CisJCWlmICghSVNfUkFURV9ERUZJTkVEKHNh
biwgcml4MikpCisJCQlyZXR1cm47CisJCXR0ICs9IGNhbGNfdXNlY3NfdW5pY2FzdF9wYWNrZXQo
dmFwLCBzaXplLCByaXgyLCBzaG9ydF90cmllcywKKwkJCU1JTih0cmllczIgKyB0cmllc19zb19m
YXIsIHRyaWVzKSAtIHRyaWVzX3NvX2ZhciAtIDEsIGlzX2h0NDApOworCQl0cmllc19zb19mYXIg
Kz0gdHJpZXMyOworCX0KKworCWlmICh0cmllczMgJiYgdHJpZXNfc29fZmFyIDwgdHJpZXMpIHsK
KwkJaWYgKCFJU19SQVRFX0RFRklORUQoc2FuLCByaXgzKSkKKwkJCXJldHVybjsKKwkJdHQgKz0g
Y2FsY191c2Vjc191bmljYXN0X3BhY2tldCh2YXAsIHNpemUsIHJpeDMsIHNob3J0X3RyaWVzLAor
CQkJTUlOKHRyaWVzMyArIHRyaWVzX3NvX2ZhciwgdHJpZXMpIC0gdHJpZXNfc29fZmFyIC0gMSwg
aXNfaHQ0MCk7CisJfQorCisJaWYgKHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnRvdGFsX3Bh
Y2tldHMgPCBzYW1wbGUtPnNhbnBsZV9zbW9vdGhpbmdfbWlucGFja2V0cykgeworCQkvKiBqdXN0
IGF2ZXJhZ2UgdGhlIGZpcnN0IGZldyBwYWNrZXRzICovCisJCWludCBhdmdfdHggPSBzYW4tPnN0
YXRzW3NpemVfYmluXVtyaXgwXS5hdmVyYWdlX3R4X3RpbWU7CisJCWludCBwYWNrZXRzID0gc2Fu
LT5zdGF0c1tzaXplX2Jpbl1bcml4MF0udG90YWxfcGFja2V0czsKKwkJc2FuLT5zdGF0c1tzaXpl
X2Jpbl1bcml4MF0uYXZlcmFnZV90eF90aW1lID0gKHR0KyhhdmdfdHgqcGFja2V0cykpLyhwYWNr
ZXRzK25mcmFtZXMpOworCX0gZWxzZSB7CisJCS8qIHVzZSBhIGV3bWEgKi8KKwkJc2FuLT5zdGF0
c1tzaXplX2Jpbl1bcml4MF0uYXZlcmFnZV90eF90aW1lID0gCisJCQkoKHNhbi0+c3RhdHNbc2l6
ZV9iaW5dW3JpeDBdLmF2ZXJhZ2VfdHhfdGltZSAqIHNhbXBsZS0+c2FucGxlX3Ntb290aGluZ19y
YXRlKSArIAorCQkJICh0dCAqICgxMDAgLSBzYW1wbGUtPnNhbnBsZV9zbW9vdGhpbmdfcmF0ZSkp
KSAvIDEwMDsKKwl9CisJCisJLyoKKwkgKiBYWFggRG9uJ3QgbWFyayB0aGUgaGlnaGVyIGJpdCBy
YXRlcyBhcyBhbHNvIGhhdmluZyBmYWlsZWQ7IGFzIHRoaXMKKwkgKiB1bmZvcnR1bmF0ZWx5IHN0
b3BzIHRob3NlIHJhdGVzIGZyb20gYmVpbmcgdGFzdGVkIHdoZW4gdHJ5aW5nIHRvCisJICogVFgu
IFRoaXMgaGFwcGVucyB3aXRoIDExbiBhZ2dyZWdhdGlvbi4KKwkgKi8KKwlpZiAobmZyYW1lcyA9
PSBuYmFkKSB7CisJCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnN1Y2Nlc3NpdmVfZmFpbHVy
ZXMgKz0gbmJhZDsKKworCX0gZWxzZSB7CisJCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnBh
Y2tldHNfYWNrZWQgKz0gKG5mcmFtZXMgLSBuYmFkKTsKKwkJc2FuLT5zdGF0c1tzaXplX2Jpbl1b
cml4MF0uc3VjY2Vzc2l2ZV9mYWlsdXJlcyA9IDA7CisJfQorCXNhbi0+c3RhdHNbc2l6ZV9iaW5d
W3JpeDBdLnRyaWVzICs9IHRyaWVzOworCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLmxhc3Rf
dHggPSB0aWNrczsKKwlzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50b3RhbF9wYWNrZXRzICs9
IG5mcmFtZXM7CisKKwkvKiB1cGRhdGUgRVdNQSBmb3IgdGhpcyByaXggKi8KKworCS8qIENhbGN1
bGF0ZSBwZXJjZW50YWdlIGJhc2VkIG9uIGN1cnJlbnQgcmF0ZSAqLworCWlmIChuZnJhbWVzID09
IDApCisJCW5mcmFtZXMgPSBuYmFkID0gMTsKKwlwY3QgPSAoKG5mcmFtZXMgLSBuYmFkKSAqIDEw
MDApIC8gbmZyYW1lczsKKworCWlmIChzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50b3RhbF9w
YWNrZXRzIDwKKwkgICAgc2FtcGxlLT5zYW5wbGVfc21vb3RoaW5nX21pbnBhY2tldHMpIHsKKwkJ
LyoganVzdCBhdmVyYWdlIHRoZSBmaXJzdCBmZXcgcGFja2V0cyAqLworCQlpbnQgYV9wY3QgPSAo
c2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0ucGFja2V0c19hY2tlZCAqIDEwMDApIC8KKwkJICAg
IChzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50b3RhbF9wYWNrZXRzKTsKKwkJc2FuLT5zdGF0
c1tzaXplX2Jpbl1bcml4MF0uZXdtYV9wY3QgPSBhX3BjdDsKKwl9IGVsc2UgeworCQkvKiB1c2Ug
YSBld21hICovCisJCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLmV3bWFfcGN0ID0KKwkJCSgo
c2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0uZXdtYV9wY3QgKiBzYW1wbGUtPnNhbnBsZV9zbW9v
dGhpbmdfcmF0ZSkgKworCQkJIChwY3QgKiAoMTAwIC0gc2FtcGxlLT5zYW5wbGVfc21vb3RoaW5n
X3JhdGUpKSkgLyAxMDA7CisJfQorCisJaWYgKHJpeDAgPT0gc2FuLT5jdXJyZW50X3NhbXBsZV9y
aXhbc2l6ZV9iaW5dKSB7CisJCXNhbi0+c2FtcGxlX3R0W3NpemVfYmluXSA9IHR0OworCQlzYW4t
PmN1cnJlbnRfc2FtcGxlX3JpeFtzaXplX2Jpbl0gPSAtMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lk
CitzYW1wbGVfdHhfY29tcGxldGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAorICAg
IGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksIGludCBvaywKKyAgICB2b2lkICphcmcx
LCB2b2lkICphcmcyKQoreworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNhbiA9IG5p
LT5uaV9yY3RsczsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0ID0gaWVl
ZTgwMjExX2dldF9yYXRldGFibGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisKKwkvKiBYWFgg
bmVlZCB0byBjaGFuZ2UgYXJnMiB0byBwb2ludGVyIG9mIGllZWU4MDIxMV9yY19pbmZvICovCisJ
c3RydWN0IGllZWU4MDIxMV9yY19pbmZvICpyY19pbmZvID0gKHN0cnVjdCBpZWVlODAyMTFfcmNf
aW5mbyopYXJnMjsKKworCWludCBmaW5hbF9yaXgsIHNob3J0X3RyaWVzLCBsb25nX3RyaWVzOwor
CWludCBuZnJhbWVzLCBuYmFkOworCWludCBmcmFtZV9zaXplLCBtcnI7CisKKwlmaW5hbF9yaXgg
PSBydC0+cmF0ZUNvZGVUb0luZGV4W3JjX2luZm8tPnJpX3R4cmF0ZV07CisJc2hvcnRfdHJpZXMg
PSByY19pbmZvLT5yaV9zaG9ydHJldHJ5OworCS8qIFhYWCB3aHkgcGx1cyAxIGhlcmU/ICovCisJ
bG9uZ190cmllcyA9IHJjX2luZm8tPnJpX2xvbmdyZXRyeSArIDE7CisKKwluZnJhbWVzID0gcmNf
aW5mby0+cmlfdHhjbnQ7CisJbmJhZCA9IHJjX2luZm8tPnJpX2ZhaWxjbnQ7CisKKwlmcmFtZV9z
aXplID0gcmNfaW5mby0+cmlfZnJhbWVsZW47CisJbXJyID0gMDsKKworCWlmIChuZnJhbWVzID09
IDApIHsKKwkJcmV0dXJuOworCX0KKworCWlmIChmcmFtZV9zaXplID09IDApCQkgICAgLyogTkI6
IHNob3VsZCBub3QgaGFwcGVuICovCisJCWZyYW1lX3NpemUgPSAxNTAwOworCisJaWYgKHNhbi0+
cmF0ZW1hc2sgPT0gMCkgeworCQlyZXR1cm47CisJfQorCQorCWlmIChJRUVFODAyMTFfUkFURUNU
TF9IQVNDQVBfTVJSKG5pKSkKKwkJbXJyID0gMTsKKwkvKiBYWFggY2hlY2sgSFQgcHJvdG1vZGUg
dG9vICovCisJaWYgKG1yciAmJiAhSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQX01SUlBST1Qobmkp
KQorCQltcnIgPSAwOworCQorCWlmICghbXJyIHx8IHJjX2luZm8tPnJpX2ZpbmFsdHNpID09IDAp
IHsKKwkJaWYgKCFJU19SQVRFX0RFRklORUQoc2FuLCBmaW5hbF9yaXgpKSB7CisJCQlyZXR1cm47
CisJCX0KKwkJLyoKKwkJICogT25seSBvbmUgcmF0ZSB3YXMgdXNlZDsgb3B0aW1pemUgd29yay4K
KwkJICovCisJCXVwZGF0ZV9zdGF0cyh2YXAsIG5pLCBmcmFtZV9zaXplLCAKKwkJCSAgICAgZmlu
YWxfcml4LCBsb25nX3RyaWVzLAorCQkJICAgICAwLCAwLAorCQkJICAgICAwLCAwLAorCQkJICAg
ICAwLCAwLAorCQkJICAgICBzaG9ydF90cmllcywgbG9uZ190cmllcywKKwkJCSAgICAgbmZyYW1l
cywgbmJhZCk7CisKKwl9IGVsc2UgeworCQlpbnQgZmluYWxUU0lkeCA9IHJjX2luZm8tPnJpX2Zp
bmFsdHNpOworCQlpbnQgaTsKKworCQkvKgorCQkgKiBOQjogc2VyaWVzID4gMCBhcmUgbm90IHBl
bmFsaXplZCBmb3IgZmFpbHVyZQorCQkgKiBiYXNlZCBvbiB0aGUgdHJ5IGNvdW50cyB1bmRlciB0
aGUgYXNzdW1wdGlvbgorCQkgKiB0aGF0IGxvc3NlcyBhcmUgb2Z0ZW4gYnVyc3R5IGFuZCBzaW5j
ZSB3ZQorCQkgKiBzYW1wbGUgaGlnaGVyIHJhdGVzIDEgdHJ5IGF0IGEgdGltZSBkb2luZyBzbwor
CQkgKiBtYXkgdW5mYWlybHkgcGVuYWxpemUgdGhlbS4KKwkJICovCisJCWlmIChyY1swXS50cmll
cykgeworCQkJdXBkYXRlX3N0YXRzKHZhcCwgbmksIGZyYW1lX3NpemUsCisJCQkJICAgICByY1sw
XS5yaXgsIHJjWzBdLnRyaWVzLAorCQkJCSAgICAgcmNbMV0ucml4LCByY1sxXS50cmllcywKKwkJ
CQkgICAgIHJjWzJdLnJpeCwgcmNbMl0udHJpZXMsCisJCQkJICAgICByY1szXS5yaXgsIHJjWzNd
LnRyaWVzLAorCQkJCSAgICAgc2hvcnRfdHJpZXMsIGxvbmdfdHJpZXMsCisJCQkJICAgICBuZnJh
bWVzLCBuYmFkKTsKKwkJCWxvbmdfdHJpZXMgLT0gcmNbMF0udHJpZXM7CisJCX0KKwkJCisJCWlm
IChyY1sxXS50cmllcyAmJiBmaW5hbFRTSWR4ID4gMCkgeworCQkJdXBkYXRlX3N0YXRzKHZhcCwg
bmksIGZyYW1lX3NpemUsCisJCQkJICAgICByY1sxXS5yaXgsIHJjWzFdLnRyaWVzLAorCQkJCSAg
ICAgcmNbMl0ucml4LCByY1syXS50cmllcywKKwkJCQkgICAgIHJjWzNdLnJpeCwgcmNbM10udHJp
ZXMsCisJCQkJICAgICAwLCAwLAorCQkJCSAgICAgc2hvcnRfdHJpZXMsIGxvbmdfdHJpZXMsCisJ
CQkJICAgICBuZnJhbWVzLCBuYmFkKTsKKwkJCWxvbmdfdHJpZXMgLT0gcmNbMV0udHJpZXM7CisJ
CX0KKworCQlpZiAocmNbMl0udHJpZXMgJiYgZmluYWxUU0lkeCA+IDEpIHsKKwkJCXVwZGF0ZV9z
dGF0cyh2YXAsIG5pLCBmcmFtZV9zaXplLAorCQkJCSAgICAgcmNbMl0ucml4LCByY1syXS50cmll
cywKKwkJCQkgICAgIHJjWzNdLnJpeCwgcmNbM10udHJpZXMsCisJCQkJICAgICAwLCAwLAorCQkJ
CSAgICAgMCwgMCwKKwkJCQkgICAgIHNob3J0X3RyaWVzLCBsb25nX3RyaWVzLAorCQkJCSAgICAg
bmZyYW1lcywgbmJhZCk7CisJCQlsb25nX3RyaWVzIC09IHJjWzJdLnRyaWVzOworCQl9CisKKwkJ
aWYgKHJjWzNdLnRyaWVzICYmIGZpbmFsVFNJZHggPiAyKSB7CisJCQl1cGRhdGVfc3RhdHModmFw
LCBuaSwgZnJhbWVfc2l6ZSwKKwkJCQkgICAgIHJjWzNdLnJpeCwgcmNbM10udHJpZXMsCisJCQkJ
ICAgICAwLCAwLAorCQkJCSAgICAgMCwgMCwKKwkJCQkgICAgIDAsIDAsCisJCQkJICAgICBzaG9y
dF90cmllcywgbG9uZ190cmllcywKKwkJCQkgICAgIG5mcmFtZXMsIG5iYWQpOworCQl9CisJfQor
fQorCitzdGF0aWMgdm9pZAorc2FtcGxlX3R4X3VwZGF0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjEx
dmFwICp2YXAsIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksCisgICAgdm9pZCAqYXJn
MSwgdm9pZCAqYXJnMiwgdm9pZCAqYXJnMykKK3sKKwkvKiBub3RoaW5nIGhlcmUuICovCit9CisK
K3N0YXRpYyB2b2lkCitzYW1wbGVfc2V0aW50ZXJ2YWwoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZh
cCAqdmFwLCBpbnQgbXNlY3MpCit7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZSA9
IHZhcC0+aXZfcnM7CisJaW50IHQ7CisKKwlpZiAobXNlY3MgPCAxMDApCisJCW1zZWNzID0gMTAw
OworCXQgPSBtc2Vjc190b190aWNrcyhtc2Vjcyk7CisJLyogaWVlZTgwMjExX3NhbXBsZSBkb2Vz
bid0IGhhdmUgdGhlIHNhbXBsZV9pbnRlcnZhbCBmaWVsZCBieSBub3cgKi8KKwkvLyBzYW1wbGUt
PnNhbXBsZV9pbnRlcnZhbCA9ICh0IDwgMSkgPyAxIDogdDsKK30KKworc3RhdGljIHZvaWQKK3Nh
bXBsZV9zdGF0cyh2b2lkICphcmcsIHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmkpCit7CisJc3Ry
dWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Nh
bXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9y
YXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1
cmNoYW4pOworCXVpbnQ2NF90IG1hc2s7CisJaW50IHJpeCwgeTsKKworCXByaW50ZigiXG5bJXNd
IHJlZmNudCAlZCBzdGF0aWNfcml4ICglZCAlcykgcmF0ZW1hc2sgMHglanhcbiIsCisJICAgIGV0
aGVyX3NwcmludGYobmktPm5pX21hY2FkZHIpLCBpZWVlODAyMTFfbm9kZV9yZWZjbnQobmkpLAor
CSAgICBkb3QxMXJhdGUocnQsIHNhbi0+c3RhdGljX3JpeCksCisJICAgIGRvdDExcmF0ZV9sYWJl
bChydCwgc2FuLT5zdGF0aWNfcml4KSwKKwkgICAgKHVpbnRtYXhfdClzYW4tPnJhdGVtYXNrKTsK
Kwlmb3IgKHkgPSAwOyB5IDwgTlVNX1BBQ0tFVF9TSVpFX0JJTlM7IHkrKykgeworCQlwcmludGYo
IlslNHVdIGN1ciByaXggJWQgKCVkICVzKSBzaW5jZSBzd2l0Y2g6IHBhY2tldHMgJWQgdGlja3Mg
JXVcbiIsCisJCSAgICBiaW5fdG9fc2l6ZSh5KSwgc2FuLT5jdXJyZW50X3JpeFt5XSwKKwkJICAg
IGRvdDExcmF0ZShydCwgc2FuLT5jdXJyZW50X3JpeFt5XSksCisJCSAgICBkb3QxMXJhdGVfbGFi
ZWwocnQsIHNhbi0+Y3VycmVudF9yaXhbeV0pLAorCQkgICAgc2FuLT5wYWNrZXRzX3NpbmNlX3N3
aXRjaFt5XSwgc2FuLT50aWNrc19zaW5jZV9zd2l0Y2hbeV0pOworCQlwcmludGYoIlslNHVdIGxh
c3Qgc2FtcGxlICglZCAlcykgY3VyIHNhbXBsZSAoJWQgJXMpIHBhY2tldHMgc2VudCAlZFxuIiwK
KwkJICAgIGJpbl90b19zaXplKHkpLAorCQkgICAgZG90MTFyYXRlKHJ0LCBzYW4tPmxhc3Rfc2Ft
cGxlX3JpeFt5XSksCisJCSAgICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+bGFzdF9zYW1wbGVf
cml4W3ldKSwKKwkJICAgIGRvdDExcmF0ZShydCwgc2FuLT5jdXJyZW50X3NhbXBsZV9yaXhbeV0p
LAorCQkgICAgZG90MTFyYXRlX2xhYmVsKHJ0LCBzYW4tPmN1cnJlbnRfc2FtcGxlX3JpeFt5XSks
CisJCSAgICBzYW4tPnBhY2tldHNfc2VudFt5XSk7CisJCXByaW50ZigiWyU0dV0gcGFja2V0cyBz
aW5jZSBzYW1wbGUgJWQgc2FtcGxlIHR0ICV1XG4iLAorCQkgICAgYmluX3RvX3NpemUoeSksIHNh
bi0+cGFja2V0c19zaW5jZV9zYW1wbGVbeV0sCisJCSAgICBzYW4tPnNhbXBsZV90dFt5XSk7CisJ
fQorCWZvciAobWFzayA9IHNhbi0+cmF0ZW1hc2ssIHJpeCA9IDA7IG1hc2sgIT0gMDsgbWFzayA+
Pj0gMSwgcml4KyspIHsKKwkJaWYgKChtYXNrICYgMSkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJ
Zm9yICh5ID0gMDsgeSA8IE5VTV9QQUNLRVRfU0laRV9CSU5TOyB5KyspIHsKKwkJCWlmIChzYW4t
PnN0YXRzW3ldW3JpeF0udG90YWxfcGFja2V0cyA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJcHJp
bnRmKCJbJTJ1ICVzOiU0dV0gJThqdTolLThqdSAoJTNkJSUpIChFV01BICUzZC4lMWQlJSkgVCAl
OGp1IEYgJTRkIGF2ZyAlNXUgbGFzdCAldVxuIiwKKwkJCSAgICBkb3QxMXJhdGUocnQsIHJpeCks
IGRvdDExcmF0ZV9sYWJlbChydCwgcml4KSwKKwkJCSAgICBiaW5fdG9fc2l6ZSh5KSwKKwkJCSAg
ICAodWludG1heF90KSBzYW4tPnN0YXRzW3ldW3JpeF0udG90YWxfcGFja2V0cywKKwkJCSAgICAo
dWludG1heF90KSBzYW4tPnN0YXRzW3ldW3JpeF0ucGFja2V0c19hY2tlZCwKKwkJCSAgICAoaW50
KSAoKHNhbi0+c3RhdHNbeV1bcml4XS5wYWNrZXRzX2Fja2VkICogMTAwVUxMKSAvCisJCQkgICAg
IHNhbi0+c3RhdHNbeV1bcml4XS50b3RhbF9wYWNrZXRzKSwKKwkJCSAgICBzYW4tPnN0YXRzW3ld
W3JpeF0uZXdtYV9wY3QgLyAxMCwKKwkJCSAgICBzYW4tPnN0YXRzW3ldW3JpeF0uZXdtYV9wY3Qg
JSAxMCwKKwkJCSAgICAodWludG1heF90KSBzYW4tPnN0YXRzW3ldW3JpeF0udHJpZXMsCisJCQkg
ICAgc2FuLT5zdGF0c1t5XVtyaXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMsCisJCQkgICAgc2FuLT5z
dGF0c1t5XVtyaXhdLmF2ZXJhZ2VfdHhfdGltZSwKKwkJCSAgICB0aWNrcyAtIHNhbi0+c3RhdHNb
eV1bcml4XS5sYXN0X3R4KTsKKwkJfQorCX0KK30KKworc3RhdGljIGludAorc2FtcGxlX3N5c2N0
bF9zdGF0cyhTWVNDVExfSEFORExFUl9BUkdTKQoreworCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZh
cCA9IGFyZzE7CisJc3RydWN0IGllZWU4MDIxMWNvbSAqaWMgPSB2YXAtPml2X2lmcC0+aWZfbDJj
b207CisJaW50IGVycm9yLCB2OworCisJdiA9IDA7CisJZXJyb3IgPSBzeXNjdGxfaGFuZGxlX2lu
dChvaWRwLCAmdiwgMCwgcmVxKTsKKwlpZiAoZXJyb3IgfHwgIXJlcS0+bmV3cHRyKQorCQlyZXR1
cm4gZXJyb3I7CisJaWVlZTgwMjExX2l0ZXJhdGVfbm9kZXMoJmljLT5pY19zdGEsIHNhbXBsZV9z
dGF0cywgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NhbXBsZV9zeXNjdGxf
c21vb3RoaW5nX3JhdGUoU1lTQ1RMX0hBTkRMRVJfQVJHUykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjEx
dmFwICp2YXAgPSBhcmcxOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSB2YXAt
Pml2X3JzOworCWludCByYXRlLCBlcnJvcjsKKworCXJhdGUgPSBzYW1wbGUtPnNhbXBsZV9zbW9v
dGhpbmdfcmF0ZTsKKwllcnJvciA9IHN5c2N0bF9oYW5kbGVfaW50KG9pZHAsICZyYXRlLCAwLCBy
ZXEpOworCWlmIChlcnJvciB8fCAhcmVxLT5uZXdwdHIpCisJCXJldHVybiBlcnJvcjsKKwlpZiAo
ISgwIDw9IHJhdGUgJiYgcmF0ZSA8IDEwMCkpCisJCXJldHVybiBFSU5WQUw7CisJc2FtcGxlLT5z
YW1wbGVfc21vb3RoaW5nX3JhdGUgPSByYXRlOworCXNhbXBsZS0+c2FtcGxlX3Ntb290aGluZ19t
aW5wYWNrZXRzID0gMTAwIC8gKDEwMCAtIHJhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMg
aW50CitzYW1wbGVfc3lzY3RsX3NhbXBsZV9yYXRlKFNZU0NUTF9IQU5ETEVSX0FSR1MpCit7CisJ
c3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gYXJnMTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBs
ZSAqc2FtcGxlID0gdmFwLT5pdl9yczsKKwlpbnQgcmF0ZSwgZXJyb3I7CisKKwlyYXRlID0gc2Ft
cGxlLT5zYW1wbGVfcmF0ZTsKKwllcnJvciA9IHN5c2N0bF9oYW5kbGVfaW50KG9pZHAsICZyYXRl
LCAwLCByZXEpOworCWlmIChlcnJvciB8fCAhcmVxLT5uZXdwdHIpCisJCXJldHVybiBlcnJvcjsK
KwlpZiAoISgyIDw9IHJhdGUgJiYgcmF0ZSA8PSAxMDApKQorCQlyZXR1cm4gRUlOVkFMOworCXNh
bXBsZS0+c2FtcGxlX3JhdGUgPSByYXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAor
c2FtcGxlX3N5c2N0bGF0dGFjaChzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCisgICAgc3RydWN0
IHN5c2N0bF9jdHhfbGlzdCAqY3R4LCBzdHJ1Y3Qgc3lzY3RsX29pZCAqdHJlZSkKK3sKKwlTWVND
VExfQUREX1BST0MoY3R4LCBTWVNDVExfQ0hJTERSRU4odHJlZSksIE9JRF9BVVRPLAorCSAgICAi
c2FtcGxlX3Ntb290aGluZ19yYXRlIiwgQ1RMVFlQRV9JTlQgfCBDVExGTEFHX1JXLCB2YXAsIDAs
CisJICAgIHNhbXBsZV9zeXNjdGxfc21vb3RoaW5nX3JhdGUsICJJIiwKKwkgICAgInNhbXBsZTog
c21vb3RoaW5nIHJhdGUgZm9yIGF2ZyB0eCB0aW1lICglJSkiKTsKKwlTWVNDVExfQUREX1BST0Mo
Y3R4LCBTWVNDVExfQ0hJTERSRU4odHJlZSksIE9JRF9BVVRPLAorCSAgICAic2FtcGxlX3JhdGUi
LCBDVExUWVBFX0lOVCB8IENUTEZMQUdfUlcsIHZhcCwgMCwKKwkgICAgc2FtcGxlX3N5c2N0bF9z
YW1wbGVfcmF0ZSwgIkkiLAorCSAgICAic2FtcGxlOiBwZXJjZW50IGFpciB0aW1lIGRldm90ZWQg
dG8gc2FtcGxpbmcgbmV3IHJhdGVzICglJSkiKTsKKwkvKiBYWFggbWF4X3N1Y2Nlc3NpdmVfZmFp
bHVyZXMsIHN0YWxlX2ZhaWx1cmVfdGltZW91dCwgbWluX3N3aXRjaCAqLworCVNZU0NUTF9BRERf
UFJPQyhjdHgsIFNZU0NUTF9DSElMRFJFTih0cmVlKSwgT0lEX0FVVE8sCisJICAgICJzYW1wbGVf
c3RhdHMiLCBDVExUWVBFX0lOVCB8IENUTEZMQUdfUlcsIHZhcCwgMCwKKwkgICAgc2FtcGxlX3N5
c2N0bF9zdGF0cywgIkkiLCAic2FtcGxlOiBwcmludCBzdGF0aXN0aWNzIik7Cit9CkluZGV4OiBu
ZXQ4MDIxMS9pZWVlODAyMTFfcmNfc2FtcGxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbmV0ODAyMTEvaWVl
ZTgwMjExX3JjX3NhbXBsZS5oCShyZXZpc2lvbiAwKQorKysgbmV0ODAyMTEvaWVlZTgwMjExX3Jj
X3NhbXBsZS5oCShyZXZpc2lvbiAyNTU5NzApCkBAIC0wLDAgKzEsMjg3IEBACisvKiAkRnJlZUJT
RDogaGVhZC9zeXMvZGV2L2F0aC9hdGhfcmF0ZS9zYW1wbGUvc2FtcGxlLmggMjQwMzgyIDIwMTIt
MDgtMTUgMDc6MTA6MTBaIGFkcmlhbiAkKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUg
Sm9obiBCaWNrZXQKKyAqIENvcHlyaWdodCAoYykgMjAxMyBDaGVuY2hvbmcgUWluIDxjY3FpbkBG
cmVlQlNELm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAg
d2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHNpbWlsYXIg
dG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdyAoIkRpc2NsYWltZXIiKSBhbmQg
YW55CisgKiAgICByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24gaW5jbHVk
aW5nIGEgc3Vic3RhbnRpYWxseQorICogICAgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50
IGZvciBmdXJ0aGVyIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5h
bWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwor
ICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRo
aXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAq
IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5U
WQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMg
QU5EIENPTlRSSUJVVE9SUworICogYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBOT05JTkZSSU5HRU1FTlQsIE1FUkNIQU5USUJJTElUWQorICogQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyAqIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisj
aWZuZGVmIF9ORVQ4MDIxMV9JRUVFODAyMTFfUkFURUNUTF9TQU1QTEVfSF8KKyNkZWZpbmUgX05F
VDgwMjExX0lFRUU4MDIxMV9SQVRFQ1RMX1NBTVBMRV9IXworCisjaW5jbHVkZSA8bmV0ODAyMTEv
aWVlZTgwMjExX3JhdGVjdGwuaD4KKworLyoKKyAqIGZvciBub3csIHdlIHRyYWNrIHBlcmZvcm1h
bmNlIGZvciB0aHJlZSBkaWZmZXJlbnQgcGFja2V0CisgKiBzaXplIGJ1Y2tldHMKKyAqLworI2Rl
ZmluZSBOVU1fUEFDS0VUX1NJWkVfQklOUyAyCisjZGVmaW5lCVNBTVBMRV9NQVhSQVRFUwk2NAkJ
LyogTkI6IGNvcnJlc3BvbmRzIHRvIGhhbCBpbmZvWzMyXSAqLworCisvKgorICogUmF0ZSBjb250
cm9sIHNldHRpbmdzLgorICovCitzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZSB7CisJaW50CXNhbXBs
ZV9zbW9vdGhpbmdfcmF0ZTsJCQkvKiBld21hIHBlcmNlbnRhZ2UgWzAuLjk5XSAqLworCWludAlz
YW1wbGVfc21vb3RoaW5nX21pbnBhY2tldHM7CisJaW50CXNhbXBsZV9yYXRlOwkJCS8qICV0aW1l
IHRvIHRyeSBkaWZmZXJlbnQgdHggcmF0ZXMgKi8KKwlpbnQJc2FtcGxlX21heF9zdWNjZXNzaXZl
X2ZhaWx1cmVzOworCWludAlzYW1wbGVfc3RhbGVfZmFpbHVyZV90aW1lb3V0OwkvKiBob3cgbG9u
ZyB0byBob25vciBtYXhfc3VjY2Vzc2l2ZV9mYWlsdXJlcyAqLworCWludAlzYW1wbGVfbWluX3N3
aXRjaDsJCS8qIG1pbiB0aW1lIGJldHdlZW4gcmF0ZSBjaGFuZ2VzICovCisJaW50CXNhbXBsZV9t
aW5fZ29vZF9wY3Q7CS8qIG1pbiBnb29kIHBlcmNlbnRhZ2UgZm9yIGEgcmF0ZSB0byBiZSBjb25z
aWRlcmVkICovCit9OworCitzdHJ1Y3QgcmF0ZV9zdGF0cyB7CQorCXVuc2lnbmVkIGF2ZXJhZ2Vf
dHhfdGltZTsKKwlpbnQgc3VjY2Vzc2l2ZV9mYWlsdXJlczsKKwl1aW50NjRfdCB0cmllczsKKwl1
aW50NjRfdCB0b3RhbF9wYWNrZXRzOwkvKiBwa3RzIHRvdGFsIHNpbmNlIGFzc29jICovCisJdWlu
dDY0X3QgcGFja2V0c19hY2tlZDsJLyogcGt0cyBhY2tlZCBzaW5jZSBhc3NvYyAqLworCWludCBl
d21hX3BjdDsJLyogRVdNQSBwZXJjZW50YWdlICovCisJdW5zaWduZWQgcGVyZmVjdF90eF90aW1l
OyAvKiB0cmFuc21pdCB0aW1lIGZvciAwIHJldHJpZXMgKi8KKwlpbnQgbGFzdF90eDsKK307CisK
K3N0cnVjdCB0eHNjaGVkdWxlIHsKKwl1aW50OF90CXQwLCByMDsJCS8qIHNlcmllcyAwOiB0cmll
cywgcmF0ZSBjb2RlICovCisJdWludDhfdAl0MSwgcjE7CQkvKiBzZXJpZXMgMTogdHJpZXMsIHJh
dGUgY29kZSAqLworCXVpbnQ4X3QJdDIsIHIyOwkJLyogc2VyaWVzIDI6IHRyaWVzLCByYXRlIGNv
ZGUgKi8KKwl1aW50OF90CXQzLCByMzsJCS8qIHNlcmllcyAzOiB0cmllcywgcmF0ZSBjb2RlICov
Cit9OworCisvKgorICogUmF0ZSBjb250cm9sIHN0YXRlIGZvciBhIGdpdmVuIG5vZGUuCisgKi8K
Ky8qIFhYWCBjaGFuZ2UgbmFtaW5nIGNvbnZlcnNpb24/ICovCitzdHJ1Y3QgaWVlZTgwMjExX3Nh
bXBsZV9ub2RlIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGVjdGxfbm9kZSBzYW5fbm9kZTsJLyog
Y29tbW9uIHN0YXRlICovCisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbl9zYW1wbGU7Lyog
YmFja3BvaW50ZXIgKi8KKwlpbnQgc3RhdGljX3JpeDsJCQkvKiByYXRlIGluZGV4IG9mIGZpeGVk
IHR4IHJhdGUgKi8KKwl1aW50NjRfdCByYXRlbWFzazsJCS8qIGJpdCBtYXNrIG9mIHZhbGlkIHJh
dGUgaW5kaWNlcyAqLworCWNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlICpzY2hlZDsJLyogdHggc2No
ZWR1bGUgdGFibGUgKi8KKworCXN0cnVjdCByYXRlX3N0YXRzIHN0YXRzW05VTV9QQUNLRVRfU0la
RV9CSU5TXVtTQU1QTEVfTUFYUkFURVNdOworCWludCBsYXN0X3NhbXBsZV9yaXhbTlVNX1BBQ0tF
VF9TSVpFX0JJTlNdOworCisJaW50IGN1cnJlbnRfc2FtcGxlX3JpeFtOVU1fUEFDS0VUX1NJWkVf
QklOU107ICAgICAgIAorCWludCBwYWNrZXRzX3NlbnRbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOwor
CisJaW50IGN1cnJlbnRfcml4W05VTV9QQUNLRVRfU0laRV9CSU5TXTsKKwlpbnQgcGFja2V0c19z
aW5jZV9zd2l0Y2hbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOworCXVuc2lnbmVkIHRpY2tzX3NpbmNl
X3N3aXRjaFtOVU1fUEFDS0VUX1NJWkVfQklOU107CisKKwlpbnQgcGFja2V0c19zaW5jZV9zYW1w
bGVbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOworCXVuc2lnbmVkIHNhbXBsZV90dFtOVU1fUEFDS0VU
X1NJWkVfQklOU107Cit9OworCisjZGVmaW5lCUlTX1JBVEVfREVGSU5FRChzYW4sIHJpeCkJKCgo
c2FuKS0+cmF0ZW1hc2sgJiAoMTw8KHJpeCkpKSAhPSAwKQorCisjaWZuZGVmIE1JTgorI2RlZmlu
ZQlNSU4oYSxiKQkoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisjaWZuZGVmIE1BWAor
I2RlZmluZQlNQVgoYSxiKQkoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisKK3N0YXRp
YyBjb25zdCBpbnQgcGFja2V0X3NpemVfYmluc1tOVU1fUEFDS0VUX1NJWkVfQklOU10gID0geyAy
NTAsIDE2MDAgfTsKKworc3RhdGljIGlubGluZSBpbnQKK2Jpbl90b19zaXplKGludCBpbmRleCkK
K3sKKwlyZXR1cm4gcGFja2V0X3NpemVfYmluc1tpbmRleF07Cit9CisKK3N0YXRpYyBpbmxpbmUg
aW50CitzaXplX3RvX2JpbihpbnQgc2l6ZSkgCit7CisjaWYgTlVNX1BBQ0tFVF9TSVpFX0JJTlMg
PiAxCisJaWYgKHNpemUgPD0gcGFja2V0X3NpemVfYmluc1swXSkKKwkJcmV0dXJuIDA7CisjZW5k
aWYKKyNpZiBOVU1fUEFDS0VUX1NJWkVfQklOUyA+IDIKKwlpZiAoc2l6ZSA8PSBwYWNrZXRfc2l6
ZV9iaW5zWzFdKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorI2lmIE5VTV9QQUNLRVRfU0laRV9CSU5T
ID4gMworCWlmIChzaXplIDw9IHBhY2tldF9zaXplX2JpbnNbMl0pCisJCXJldHVybiAyOworI2Vu
ZGlmCisjaWYgTlVNX1BBQ0tFVF9TSVpFX0JJTlMgPiA0CisjZXJyb3IgImFkZCBzdXBwb3J0IGZv
ciBtb3JlIHBhY2tldCBzaXplcyIKKyNlbmRpZgorCXJldHVybiBOVU1fUEFDS0VUX1NJWkVfQklO
Uy0xOworfQorCitzdGF0aWMgdWludDMyX3Qgc2FtcGxlX3BrdF90eHRpbWUoY29uc3Qgc3RydWN0
IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCwKKwl1aW50MzJfdCBmcmFtZUxlbiwgdWludDE2X3Qg
cmF0ZWl4LCBpbnQgaXNodDQwLCBpbnQgaXNTaG9ydFByZWFtYmxlKQoreworCXVpbnQ4X3QgcmM7
CisgICAgaW50IG51bVN0cmVhbXM7CisKKyAgICByYyA9IHJ0LT5pbmZvW3JhdGVpeF0ucmF0ZUNv
ZGU7CisKKyAgICAvKiBMZWdhY3kgcmF0ZT8gUmV0dXJuIHRoZSBvbGQgd2F5ICovCisgICAgaWYg
KCEgSVNfSFRfUkFURShyYykpCisgICAgCXJldHVybiBpZWVlODAyMTFfY29tcHV0ZV9kdXJhdGlv
bihydCwgZnJhbWVMZW4sIHJhdGVpeCwgaXNTaG9ydFByZWFtYmxlKTsKKworICAgIC8qIDExbiBm
cmFtZSAtIGV4dHJhY3Qgb3V0IHRoZSBudW1iZXIgb2Ygc3BhdGlhbCBzdHJlYW1zICovCisgICAg
bnVtU3RyZWFtcyA9IEhUX1JDXzJfU1RSRUFNUyhyYyk7CisgICAgS0FTU0VSVChudW1TdHJlYW1z
ID4gMCAmJiBudW1TdHJlYW1zIDw9IDQsCisgICAgICAgICgibnVtYmVyIG9mIHNwYXRpYWwgc3Ry
ZWFtcyBuZWVkcyB0byBiZSAxLi4zOiBNQ1MgcmF0ZSAweCV4ISIsCisgICAgICAgIHJhdGVpeCkp
OworCisgICAgcmV0dXJuIGllZWU4MDIxMV9jb21wdXRlX2R1cmF0aW9uX2h0KGZyYW1lTGVuLCBy
YywgbnVtU3RyZWFtcywgaXNodDQwLCBpc1Nob3J0UHJlYW1ibGUpOworfQorCisjZGVmaW5lIFdJ
RklfQ1dfTUlOIDMxCisjZGVmaW5lIFdJRklfQ1dfTUFYIDEwMjMKKworLyoKKyAqIENhbGN1bGF0
ZSB0aGUgdHJhbnNtaXQgZHVyYXRpb24gb2YgYSBmcmFtZS4KKyAqLworc3RhdGljIHVuc2lnbmVk
IGNhbGNfdXNlY3NfdW5pY2FzdF9wYWNrZXQoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFw
LAorCQkJCWludCBsZW5ndGgsCisJCQkJaW50IHJpeCwgaW50IHNob3J0X3JldHJpZXMsCisJCQkJ
aW50IGxvbmdfcmV0cmllcywgaW50IGlzX2h0NDApCit7CisJY29uc3Qgc3RydWN0IGllZWU4MDIx
MV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmlj
X2N1cmNoYW4pOworCXN0cnVjdCBpZWVlODAyMTFjb20gKmljID0gdmFwLT5pdl9pYzsKKwlpbnQg
Y3VybW9kZSA9IGllZWU4MDIxMV9jaGFuMm1vZGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisJ
CisJdW5zaWduZWQgdF9zbG90LCB0X2RpZnMsIHRfc2lmczsgCisJaW50IHJ0cywgY3RzOworCWlu
dCB0dCwgeCwgY3csIGNpeDsKKworCWludCB0dCA9IDA7CisJaW50IHggPSAwOworCWludCBjdyA9
IFdJRklfQ1dfTUlOOworCisJS0FTU0VSVChydCAhPSBOVUxMLCAoIm5vIHJhdGUgdGFibGUsIG1v
ZGUgJXUiLCBjdXJtb2RlKSk7CisKKwlpZiAocml4ID49IHJ0LT5yYXRlQ291bnQpIHsKKwkJcHJp
bnRmKCJib2d1cyByaXggJWQsIG1heCAldSwgbW9kZSAldVxuIiwKKwkJICAgICAgIHJpeCwgcnQt
PnJhdGVDb3VudCwgY3VybW9kZSk7CisJCXJldHVybiAwOworCX0KKwljaXggPSBydC0+aW5mb1ty
aXhdLmNvbnRyb2xSYXRlOworCS8qIAorCSAqIFhYWCBnZXR0aW5nIG1hYy9waHkgbGV2ZWwgdGlt
aW5ncyBzaG91bGQgYmUgZml4ZWQgZm9yIHR1cmJvCisJICogcmF0ZXMsIGFuZCB0aGVyZSBpcyBw
cm9iYWJseSBhIHdheSB0byBnZXQgdGhpcyBmcm9tIHRoZQorCSAqIGhhbC4uLgorCSAqLworCXN3
aXRjaCAocnQtPmluZm9bcml4XS5waHkpIHsKKwljYXNlIElFRUU4MDIxMV9UX09GRE06CisJCXRf
c2xvdCA9IDk7CisJCXRfc2lmcyA9IDE2OworCQl0X2RpZnMgPSAyODsKKwkJLyogZmFsbCB0aHJv
dWdoICovCisJY2FzZSBJRUVFODAyMTFfVF9UVVJCTzoKKwkJdF9zbG90ID0gOTsKKwkJdF9zaWZz
ID0gODsKKwkJdF9kaWZzID0gMjg7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1RfSFQ6CisJ
CXRfc2xvdCA9IDk7CisJCXRfc2lmcyA9IDg7CisJCXRfZGlmcyA9IDI4OworCQlicmVhazsKKwlj
YXNlIElFRUU4MDIxMV9UX0RTOgorCQkvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCAqLworCWRl
ZmF1bHQ6CisJCS8qIHBnIDIwNSBpZWVlLjgwMi4xMS5wZGYgKi8KKwkJdF9zbG90ID0gMjA7CisJ
CXRfZGlmcyA9IDUwOworCQl0X3NpZnMgPSAxMDsKKwl9CisKKwlydHMgPSBjdHMgPSAwOworCisJ
aWYgKChpYy0+aWNfZmxhZ3MgJiBJRUVFODAyMTFfRl9VU0VQUk9UKSAmJgorCSAgICBydC0+aW5m
b1tyaXhdLnBoeSA9PSBJRUVFODAyMTFfVF9PRkRNKSB7CisJCWlmIChpYy0+aWNfcHJvdG1vZGUg
PT0gSUVFRTgwMjExX1BST1RfUlRTQ1RTKQorCQkJcnRzID0gMTsKKwkJZWxzZSBpZiAoaWMtPmlj
X3Byb3Rtb2RlID09IElFRUU4MDIxMV9QUk9UX0NUU09OTFkpCisJCQljdHMgPSAxOworCisJCWlu
dCBwcm90cml4OworICAgIAlpZiAoY3VybW9kZSA9PSBJRUVFODAyMTFfTU9ERV8xMUcpCisgICAg
CSAgICBwcm90cml4ID0gcnQtPnJhdGVDb2RlVG9JbmRleFsyKjJdOworICAgIAllbHNlIAorICAg
IAkgICAgcHJvdHJpeCA9IHJ0LT5yYXRlQ29kZVRvSW5kZXhbMioxXTsKKyAgICAJaWYgKDB4ZmYg
PT0gcHJvdHJpeCkKKyAgICAJCXByb3RyaXggPSAwOworCisJCWNpeCA9IHJ0LT5pbmZvW3Byb3Ry
aXhdLmNvbnRyb2xSYXRlOworCX0KKworCWlmICgwIC8qbGVuZ3RoID4gaWMtPmljX3J0c3RocmVz
aG9sZCAqLykgeworCQlydHMgPSAxOworCX0KKworCWlmIChydHMgfHwgY3RzKSB7CisJCWludCBj
dHNyYXRlOworCQlpbnQgY3RzZHVyYXRpb24gPSAwOworCisJCS8qIE5COiB0aGlzIGlzIGludGVu
dGlvbmFsbHkgbm90IGEgcnVudGltZSBjaGVjayAqLworCQlLQVNTRVJUKGNpeCA8IHJ0LT5yYXRl
Q291bnQsCisJCSAgICAoImJvZ3VzIGNpeCAlZCwgbWF4ICV1LCBtb2RlICV1XG4iLCBjaXgsIHJ0
LT5yYXRlQ291bnQsCisJCSAgICAgY3VybW9kZSkpOworCisJCWN0c3JhdGUgPSBydC0+aW5mb1tj
aXhdLnJhdGVDb2RlIHwgcnQtPmluZm9bY2l4XS5zaG9ydFByZWFtYmxlOworCQlpZiAocnRzKQkJ
LyogU0lGUyArIENUUyAqLworCQkJY3RzZHVyYXRpb24gKz0gcnQtPmluZm9bY2l4XS5zcEFja0R1
cmF0aW9uOworCisJCS8qIFhYWCBhc3N1bWVzIHNob3J0IHByZWFtYmxlICovCisJCWN0c2R1cmF0
aW9uICs9IHNhbXBsZV9wa3RfdHh0aW1lKHJ0LCBsZW5ndGgsIHJpeCwgaXNfaHQ0MCwgMCk7CisK
KwkJaWYgKGN0cykJLyogU0lGUyArIEFDSyAqLworCQkJY3RzZHVyYXRpb24gKz0gcnQtPmluZm9b
Y2l4XS5zcEFja0R1cmF0aW9uOworCisJCXR0ICs9IChzaG9ydF9yZXRyaWVzICsgMSkgKiBjdHNk
dXJhdGlvbjsKKwl9CisJdHQgKz0gdF9kaWZzOworCisJLyogWFhYIGFzc3VtZXMgc2hvcnQgcHJl
YW1ibGUgKi8KKwl0dCArPSAobG9uZ19yZXRyaWVzKzEpKnNhbXBsZV9wa3RfdHh0aW1lKHJ0LCBs
ZW5ndGgsIHJpeCwgaXNfaHQ0MCwgMCk7CisKKwl0dCArPSAobG9uZ19yZXRyaWVzKzEpKih0X3Np
ZnMgKyBydC0+aW5mb1tyaXhdLnNwQWNrRHVyYXRpb24pOworCisJZm9yICh4ID0gMDsgeCA8PSBz
aG9ydF9yZXRyaWVzICsgbG9uZ19yZXRyaWVzOyB4KyspIHsKKwkJY3cgPSBNSU4oV0lGSV9DV19N
QVgsIChjdyArIDEpICogMik7CisJCXR0ICs9ICh0X3Nsb3QgKiBjdy8yKTsKKwl9CisJcmV0dXJu
IHR0OworfQorCisjZW5kaWYgLyogX05FVDgwMjExX0lFRUU4MDIxMV9SQVRFQ1RMX1NBTVBMRV9I
XyAqLwpJbmRleDogbmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBsZV90eHNjaGVkLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gbmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBsZV90eHNjaGVkLmgJKHJldmlzaW9u
IDApCisrKyBuZXQ4MDIxMS9pZWVlODAyMTFfcmNfc2FtcGxlX3R4c2NoZWQuaAkocmV2aXNpb24g
MjU1OTcwKQpAQCAtMCwwICsxLDI0MSBAQAorLyogJEZyZWVCU0Q6IGhlYWQvc3lzL2Rldi9hdGgv
YXRoX3JhdGUvc2FtcGxlL3R4X3NjaGVkdWxlcy5oIDI0MDM4NCAyMDEyLTA4LTE1IDA3OjUwOjQy
WiBhZHJpYW4gJCovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA1IEpvaG4gQmlja2V0Cisg
KiBDb3B5cmlnaHQgKGMpIDIwMTMgQ2hlbmNob25nIFFpbiA8Y2NxaW5ARnJlZUJTRC5vcmc+Cisg
KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZp
Y2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzaW1pbGFyIHRvIHRoZSAiTk8gV0FS
UkFOVFkiIGRpc2NsYWltZXIgYmVsb3cgKCJEaXNjbGFpbWVyIikgYW5kIGFueQorICogICAgcmVk
aXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uIGluY2x1ZGluZyBhIHN1YnN0YW50
aWFsbHkKKyAqICAgIHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlciBi
aW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJv
dmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1h
eSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUK
KyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRP
UlMKKyAqIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTk9OSU5GUklOR0VNRU5ULCBNRVJDSEFOVElCSUxJVFkKKyAqIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAq
IFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVD
SUFMLCBFWEVNUExBUlksCisgKiBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisg
KiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUgorICogSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAq
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKgorICovCisjaWZuZGVmCV9fQVRI
X1JBVEVfU0FNUExFX1RYU0NIRURVTEVTX0hfXworI2RlZmluZQlfX0FUSF9SQVRFX1NBTVBMRV9U
WFNDSEVEVUxFU19IX18KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCisjZGVmaW5lIEEoX3Ip
IFwKKyAgICAoKChfcikgPT0gNikgICA/IDAgOiAoKChfcikgPT0gOSkgICA/IDEgOiAoKChfcikg
PT0gMTIpICA/IDIgOiBcCisgICAgKCgoX3IpID09IDE4KSAgPyAzIDogKCgoX3IpID09IDI0KSAg
PyA0IDogKCgoX3IpID09IDM2KSAgPyA1IDogXAorICAgICgoKF9yKSA9PSA0OCkgID8gNiA6ICgo
KF9yKSA9PSA1NCkgID8gNyA6IDApKSkpKSkpKQorc3RhdGljIGNvbnN0IHN0cnVjdCB0eHNjaGVk
dWxlIHNlcmllc18xMWFbXSA9IHsKKwl7IDMsQSggNiksIDMsQSggIDYpLCAwLEEoICA2KSwgMCxB
KCA2KSB9LAkvKiAgIDZNYi9zICovCisJeyA0LEEoIDkpLCAzLEEoICA2KSwgNCxBKCAgNiksIDAs
QSggNikgfSwJLyogICA5TWIvcyAqLworCXsgNCxBKDEyKSwgMyxBKCAgNiksIDQsQSggIDYpLCAw
LEEoIDYpIH0sCS8qICAxMk1iL3MgKi8KKwl7IDQsQSgxOCksIDMsQSggMTIpLCA0LEEoICA2KSwg
MixBKCA2KSB9LAkvKiAgMThNYi9zICovCisJeyA0LEEoMjQpLCAzLEEoIDE4KSwgNCxBKCAxMiks
IDIsQSggNikgfSwJLyogIDI0TWIvcyAqLworCXsgNCxBKDM2KSwgMyxBKCAyNCksIDQsQSggMTgp
LCAyLEEoIDYpIH0sCS8qICAzNk1iL3MgKi8KKwl7IDQsQSg0OCksIDMsQSggMzYpLCA0LEEoIDI0
KSwgMixBKDEyKSB9LAkvKiAgNDhNYi9zICovCisJeyA0LEEoNTQpLCAzLEEoIDQ4KSwgNCxBKCAz
NiksIDIsQSgyNCkgfQkvKiAgNTRNYi9zICovCit9OworCisjZGVmaW5lIE5BMShfcikgXAorCSgo
KF9yKSA9PSA2LjUpICA/IDggOiAoKChfcikgPT0gMTMpICA/ICA5IDogKCgoX3IpID09IDE5LjUp
PyAxMCA6IFwKKwkoKChfcikgPT0gMjYpICA/IDExIDogKCgoX3IpID09IDM5KSAgPyAxMiA6ICgo
KF9yKSA9PSA1MikgID8gMTMgOiBcCisJKCgoX3IpID09IDU4LjUpPyAxNCA6ICgoKF9yKSA9PSA2
NSkgID8gMTUgOiAwKSkpKSkpKSkKKyNkZWZpbmUgTkEyKF9yKSBcCisJKCgoX3IpID09IDEzKSA/
IDE2IDogKCgoX3IpID09IDI2KSA/IDE3IDogKCgoX3IpID09IDM5KSA/IDE4IDogXAorCSgoKF9y
KSA9PSA1MikgPyAxOSA6ICgoKF9yKSA9PSA3OCkgPyAyMCA6ICgoKF9yKSA9PSAxMDQpPyAyMSA6
IFwKKwkoKChfcikgPT0gMTE3KT8gMjIgOiAoKChfcikgPT0gMTMwKT8gMjMgOiAwKSkpKSkpKSkK
KyNkZWZpbmUgTkEzKF9yKSBcCisJKCgoX3IpID09IDE5LjUpICA/IDI0IDogKCgoX3IpID09IDM5
KSA/IDI1IDogKCgoX3IpID09IDU4LjUpICA/IDI2IDogXAorCSgoKF9yKSA9PSA3OCkgID8gMjcg
OiAoKChfcikgPT0gMTE3KSA/IDI4IDogKCgoX3IpID09IDE1NikgPyAyOSA6IFwKKwkoKChfcikg
PT0gMTc1LjUpID8gMzAgOiAoKChfcikgPT0gMTk1KT8gMzEgOiAwKSkpKSkpKSkKK3N0YXRpYyBj
b25zdCBzdHJ1Y3QgdHhzY2hlZHVsZSBzZXJpZXNfMTFuYVtdID0geworCXsgMyxBKCA2KSwgMyxB
KCAgNiksIDAsQSggIDYpLCAwLEEoIDYpIH0sICAgICAgIC8qICAgNk1iL3MgKi8KKwl7IDQsQSgg
OSksIDMsQSggIDYpLCA0LEEoICA2KSwgMCxBKCA2KSB9LCAgICAgICAvKiAgIDlNYi9zICovCisJ
eyA0LEEoMTIpLCAzLEEoICA2KSwgNCxBKCAgNiksIDAsQSggNikgfSwgICAgICAgLyogIDEyTWIv
cyAqLworCXsgNCxBKDE4KSwgMyxBKCAxMiksIDQsQSggIDYpLCAyLEEoIDYpIH0sICAgICAgIC8q
ICAxOE1iL3MgKi8KKwl7IDQsQSgyNCksIDMsQSggMTgpLCA0LEEoIDEyKSwgMixBKCA2KSB9LCAg
ICAgICAvKiAgMjRNYi9zICovCisJeyA0LEEoMzYpLCAzLEEoIDI0KSwgNCxBKCAxOCksIDIsQSgg
NikgfSwgICAgICAgLyogIDM2TWIvcyAqLworCXsgNCxBKDQ4KSwgMyxBKCAzNiksIDQsQSggMjQp
LCAyLEEoMTIpIH0sICAgICAgIC8qICA0OE1iL3MgKi8KKwl7IDQsQSg1NCksIDMsQSggNDgpLCA0
LEEoIDM2KSwgMixBKDI0KSB9LCAgICAgICAvKiAgNTRNYi9zICovCisKKwkvKiAxIHN0cmVhbSBy
YXRlcyAqLworCisJeyAzLE5BMSggNi41KSwgMyxOQTEoIDYuNSksIDAsTkExKCA2LjUpLCAwLE5B
MSg2LjUpIH0sICAvKiA2LjVNYi9zICovCisJeyA0LE5BMSggIDEzKSwgMyxOQTEoIDYuNSksIDQs
TkExKCA2LjUpLCAwLE5BMSg2LjUpIH0sICAvKiAgMTNNYi9zICovCisJeyA0LE5BMSgxOS41KSwg
MyxOQTEoIDYuNSksIDQsTkExKCA2LjUpLCAwLE5BMSg2LjUpIH0sICAvKjE5LjVNYi9zICovCisJ
eyA0LE5BMSggIDI2KSwgMyxOQTEoMTkuNSksIDQsTkExKCA2LjUpLCAyLE5BMSg2LjUpIH0sICAv
KiAgMjZNYi9zICovCisJeyA0LE5BMSggIDM5KSwgMyxOQTEoICAyNiksIDQsTkExKDE5LjUpLCAy
LE5BMSg2LjUpIH0sICAvKiAgMzlNYi9zICovCisJeyA0LE5BMSggIDUyKSwgMyxOQTEoICAzOSks
IDQsTkExKCAgMjYpLCAyLE5BMSg2LjUpIH0sICAvKiAgNTJNYi9zICovCisJeyA0LE5BMSg1OC41
KSwgMyxOQTEoICA1MiksIDQsTkExKCAgMzkpLCAyLE5BMSggMTMpIH0sICAvKjU4LjVNYi9zICov
CisJeyA0LE5BMSggIDY1KSwgMyxOQTEoNTguNSksIDQsTkExKCAgNTIpLCAyLE5BMSggMTMpIH0s
ICAvKiAgNjVNYi9zICovCisKKwkvKiAyIHN0cmVhbSByYXRlcyAqLworCisJeyAzLE5BMiggIDEz
KSwgMyxOQTIoICAxMyksIDAsTkEyKCAgMTMpLCAwLE5BMiggMTMpIH0sICAvKiAgMTNNYi9zICov
CisJeyA0LE5BMiggIDI2KSwgMyxOQTIoICAxMyksIDQsTkEyKCAgMTMpLCAwLE5BMiggMTMpIH0s
ICAvKiAgMjZNYi9zICovCisJeyA0LE5BMiggIDM5KSwgMyxOQTIoICAyNiksIDQsTkEyKCAgMTMp
LCAyLE5BMiggMTMpIH0sICAvKiAgMzlNYi9zICovCisJeyA0LE5BMiggIDUyKSwgMyxOQTIoICAz
OSksIDQsTkEyKCAgMjYpLCAyLE5BMiggMTMpIH0sICAvKiAgNTJNYi9zICovCisJeyA0LE5BMigg
IDc4KSwgMyxOQTIoICA1MiksIDQsTkEyKCAgMzkpLCAyLE5BMiggMTMpIH0sICAvKiAgNzhNYi9z
ICovCisJeyA0LE5BMiggMTA0KSwgMyxOQTIoICA3OCksIDQsTkEyKCAgNTIpLCAyLE5BMiggMTMp
IH0sICAvKiAxMDRNYi9zICovCisJeyA0LE5BMiggMTE3KSwgMyxOQTIoIDEwNCksIDQsTkEyKCAg
NzgpLCAyLE5BMiggMjYpIH0sICAvKiAxMTdNYi9zICovCisJeyA0LE5BMiggMTMwKSwgMyxOQTIo
IDExNyksIDQsTkEyKCAxMDQpLCAyLE5BMiggMjYpIH0sICAgLyogMTMwTWIvcyAqLworCisJLyog
MyBzdHJlYW0gcmF0ZXMgKi8KKworCXsgMyxOQTMoMTkuNSksIDMsTkEzKDE5LjUpLCAwLE5BMygx
OS41KSwgMCxOQTMoMTkuNSkgfSwgIC8qICAxOU1iL3MgKi8KKwl7IDMsTkEzKCAgMzkpLCAzLE5B
MygxOS41KSwgMCxOQTMoMTkuNSksIDAsTkEzKDE5LjUpIH0sICAvKiAgMzlNYi9zICovCisJeyAz
LE5BMyg1OC41KSwgMyxOQTMoICAzOSksIDAsTkEzKDE5LjUpLCAwLE5BMygxOS41KSB9LCAgLyog
IDU4TWIvcyAqLworCXsgMyxOQTMoICA3OCksIDMsTkEzKDU4LjUpLCAwLE5BMyggIDM5KSwgMCxO
QTMoMTkuNSkgfSwgIC8qICA3OE1iL3MgKi8KKwl7IDMsTkEzKCAxMTcpLCAzLE5BMyggIDc4KSwg
MCxOQTMoNTguNSksIDAsTkEzKDE5LjUpIH0sICAvKiAxMTdNYi9zICovCisJeyAzLE5BMyggMTU2
KSwgMyxOQTMoIDExNyksIDAsTkEzKCAgNzgpLCAwLE5BMygxOS41KSB9LCAgLyogIDE1Nk1iL3Mg
Ki8KKwl7IDMsTkEzKDE3NS41KSwgMyxOQTMoIDE1NiksIDAsTkEzKCAxMTcpLCAwLE5BMyggIDM5
KSB9LCAgLyogIDE3NU1iL3MgKi8KKwl7IDMsTkEzKCAxOTUpLCAzLE5BMyggMTk1KSwgMCxOQTMo
IDE1NiksIDAsTkEzKDU4LjUpIH0sICAvKiAxOTVNYi9zICovCit9OworI3VuZGVmIEEKKyN1bmRl
ZiBOQTMKKyN1bmRlZiBOQTIKKyN1bmRlZiBOQTEKKworI2RlZmluZSBHKF9yKSBcCisgICAgKCgo
X3IpID09IDEpICAgPyAwIDogKCgoX3IpID09IDIpICAgPyAxIDogKCgoX3IpID09IDUuNSkgPyAy
IDogXAorICAgICgoKF9yKSA9PSAxMSkgID8gMyA6ICgoKF9yKSA9PSA2KSAgID8gNCA6ICgoKF9y
KSA9PSA5KSAgID8gNSA6IFwKKyAgICAoKChfcikgPT0gMTIpICA/IDYgOiAoKChfcikgPT0gMTgp
ICA/IDcgOiAoKChfcikgPT0gMjQpICA/IDggOiBcCisgICAgKCgoX3IpID09IDM2KSAgPyA5IDog
KCgoX3IpID09IDQ4KSAgPyAxMCA6ICgoKF9yKSA9PSA1NCkgID8gMTEgOiAwKSkpKSkpKSkpKSkp
CitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1bGUgc2VyaWVzXzExZ1tdID0geworCXsgMyxH
KCAxKSwgMyxHKCAgMSksIDAsRyggIDEpLCAwLEcoIDEpIH0sCS8qICAgMU1iL3MgKi8KKwl7IDQs
RyggMiksIDMsRyggIDEpLCA0LEcoICAxKSwgMCxHKCAxKSB9LAkvKiAgIDJNYi9zICovCisJeyA0
LEcoNS41KSwzLEcoICAyKSwgNCxHKCAgMSksIDIsRyggMSkgfSwJLyogNS41TWIvcyAqLworCXsg
NCxHKDExKSwgMyxHKDUuNSksIDQsRyggIDIpLCAyLEcoIDEpIH0sCS8qICAxMU1iL3MgKi8KKwl7
IDQsRyggNiksIDMsRyg1LjUpLCA0LEcoICAyKSwgMixHKCAxKSB9LAkvKiAgIDZNYi9zICovCisJ
eyA0LEcoIDkpLCAzLEcoICA2KSwgNCxHKDUuNSksIDIsRyggMSkgfSwJLyogICA5TWIvcyAqLwor
CXsgNCxHKDEyKSwgMyxHKCAxMSksIDQsRyg1LjUpLCAyLEcoIDEpIH0sCS8qICAxMk1iL3MgKi8K
Kwl7IDQsRygxOCksIDMsRyggMTIpLCA0LEcoIDExKSwgMixHKCAxKSB9LAkvKiAgMThNYi9zICov
CisJeyA0LEcoMjQpLCAzLEcoIDE4KSwgNCxHKCAxMiksIDIsRyggMSkgfSwJLyogIDI0TWIvcyAq
LworCXsgNCxHKDM2KSwgMyxHKCAyNCksIDQsRyggMTgpLCAyLEcoIDEpIH0sCS8qICAzNk1iL3Mg
Ki8KKwl7IDQsRyg0OCksIDMsRyggMzYpLCA0LEcoIDI0KSwgMixHKCAxKSB9LAkvKiAgNDhNYi9z
ICovCisJeyA0LEcoNTQpLCAzLEcoIDQ4KSwgNCxHKCAzNiksIDIsRyggMSkgfQkvKiAgNTRNYi9z
ICovCit9OworCisjZGVmaW5lIE5HMShfcikgXAorCSgoKF9yKSA9PSA2LjUpID8gMTIgOiAoKChf
cikgPT0gMTMpID8gMTMgOiAoKChfcikgPT0gMTkuNSk/IDE0IDogXAorCSgoKF9yKSA9PSAyNikg
ID8gMTUgOiAoKChfcikgPT0gMzkpID8gMTYgOiAoKChfcikgPT0gNTIpICA/IDE3IDogXAorCSgo
KF9yKSA9PSA1OC41KT8gMTggOiAoKChfcikgPT0gNjUpID8gMTkgOiAwKSkpKSkpKSkKKyNkZWZp
bmUgTkcyKF9yKSBcCisJKCgoX3IpID09IDEzKSAgPyAyMCA6ICgoKF9yKSA9PSAyNikgPyAyMSA6
ICgoKF9yKSA9PSAzOSkgID8gMjIgOiBcCisJKCgoX3IpID09IDUyKSAgPyAyMyA6ICgoKF9yKSA9
PSA3OCkgPyAyNCA6ICgoKF9yKSA9PSAxMDQpID8gMjUgOiBcCisJKCgoX3IpID09IDExNykgPyAy
NiA6ICgoKF9yKSA9PSAxMzApPyAyNyA6IDApKSkpKSkpKQorI2RlZmluZSBORzMoX3IpIFwKKwko
KChfcikgPT0gMTkuNSkgID8gMjggOiAoKChfcikgPT0gMzkpID8gMjkgOiAoKChfcikgPT0gNTgu
NSkgID8gMzAgOiBcCisJKCgoX3IpID09IDc4KSAgPyAzMSA6ICgoKF9yKSA9PSAxMTcpID8gMzIg
OiAoKChfcikgPT0gMTU2KSA/IDMzIDogXAorCSgoKF9yKSA9PSAxNzUuNSkgPyAzNCA6ICgoKF9y
KSA9PSAxOTUpPyAzNSA6IDApKSkpKSkpKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1
bGUgc2VyaWVzXzExbmdbXSA9IHsKKwl7IDMsRyggMSksIDMsRyggIDEpLCAwLEcoICAxKSwgMCxH
KCAxKSB9LCAgICAgICAvKiAgIDFNYi9zICovCisJeyA0LEcoIDIpLCAzLEcoICAxKSwgNCxHKCAg
MSksIDAsRyggMSkgfSwgICAgICAgLyogICAyTWIvcyAqLworCXsgNCxHKDUuNSksMyxHKCAgMiks
IDQsRyggIDEpLCAyLEcoIDEpIH0sICAgICAgIC8qIDUuNU1iL3MgKi8KKwl7IDQsRygxMSksIDMs
Ryg1LjUpLCA0LEcoICAyKSwgMixHKCAxKSB9LCAgICAgICAvKiAgMTFNYi9zICovCisJeyA0LEco
IDYpLCAzLEcoNS41KSwgNCxHKCAgMiksIDIsRyggMSkgfSwgICAgICAgLyogICA2TWIvcyAqLwor
CXsgNCxHKCA5KSwgMyxHKCAgNiksIDQsRyg1LjUpLCAyLEcoIDEpIH0sICAgICAgIC8qICAgOU1i
L3MgKi8KKwl7IDQsRygxMiksIDMsRyggMTEpLCA0LEcoNS41KSwgMixHKCAxKSB9LCAgICAgICAv
KiAgMTJNYi9zICovCisJeyA0LEcoMTgpLCAzLEcoIDEyKSwgNCxHKCAxMSksIDIsRyggMSkgfSwg
ICAgICAgLyogIDE4TWIvcyAqLworCXsgNCxHKDI0KSwgMyxHKCAxOCksIDQsRyggMTIpLCAyLEco
IDEpIH0sICAgICAgIC8qICAyNE1iL3MgKi8KKwl7IDQsRygzNiksIDMsRyggMjQpLCA0LEcoIDE4
KSwgMixHKCAxKSB9LCAgICAgICAvKiAgMzZNYi9zICovCisJeyA0LEcoNDgpLCAzLEcoIDM2KSwg
NCxHKCAyNCksIDIsRyggMSkgfSwgICAgICAgLyogIDQ4TWIvcyAqLworCXsgNCxHKDU0KSwgMyxH
KCA0OCksIDQsRyggMzYpLCAyLEcoIDEpIH0sICAgICAgIC8qICA1NE1iL3MgKi8KKworCS8qIDEg
c3RyZWFtIHJhdGVzICovCisKKwl7IDMsTkcxKCA2LjUpLCAzLE5HMSggNi41KSwgMCxORzEoIDYu
NSksIDAsTkcxKDYuNSkgfSwgIC8qIDYuNU1iL3MgKi8KKwl7IDQsTkcxKCAgMTMpLCAzLE5HMSgg
Ni41KSwgNCxORzEoIDYuNSksIDAsTkcxKDYuNSkgfSwgIC8qICAxM01iL3MgKi8KKwl7IDQsTkcx
KDE5LjUpLCAzLE5HMSggNi41KSwgNCxORzEoIDYuNSksIDAsTkcxKDYuNSkgfSwgIC8qMTkuNU1i
L3MgKi8KKwl7IDQsTkcxKCAgMjYpLCAzLE5HMSgxOS41KSwgNCxORzEoIDYuNSksIDIsTkcxKDYu
NSkgfSwgIC8qICAyNk1iL3MgKi8KKwl7IDQsTkcxKCAgMzkpLCAzLE5HMSggIDI2KSwgNCxORzEo
MTkuNSksIDIsTkcxKDYuNSkgfSwgIC8qICAzOU1iL3MgKi8KKwl7IDQsTkcxKCAgNTIpLCAzLE5H
MSggIDM5KSwgNCxORzEoICAyNiksIDIsTkcxKDYuNSkgfSwgIC8qICA1Mk1iL3MgKi8KKwl7IDQs
TkcxKDU4LjUpLCAzLE5HMSggIDUyKSwgNCxORzEoICAzOSksIDIsTkcxKCAxMykgfSwgIC8qNTgu
NU1iL3MgKi8KKwl7IDQsTkcxKCAgNjUpLCAzLE5HMSg1OC41KSwgNCxORzEoICA1MiksIDIsTkcx
KCAxMykgfSwgIC8qICA2NU1iL3MgKi8KKworCS8qIDIgc3RyZWFtIHJhdGVzICovCisKKwl7IDMs
TkcyKCAgMTMpLCAzLE5HMiggIDEzKSwgMCxORzIoICAxMyksIDAsTkcyKCAxMykgfSwgIC8qICAx
M01iL3MgKi8KKwl7IDQsTkcyKCAgMjYpLCAzLE5HMiggIDEzKSwgNCxORzIoICAxMyksIDAsTkcy
KCAxMykgfSwgIC8qICAyNk1iL3MgKi8KKwl7IDQsTkcyKCAgMzkpLCAzLE5HMiggIDI2KSwgNCxO
RzIoICAxMyksIDIsTkcyKCAxMykgfSwgIC8qICAzOU1iL3MgKi8KKwl7IDQsTkcyKCAgNTIpLCAz
LE5HMiggIDM5KSwgNCxORzIoICAyNiksIDIsTkcyKCAxMykgfSwgIC8qICA1Mk1iL3MgKi8KKwl7
IDQsTkcyKCAgNzgpLCAzLE5HMiggIDUyKSwgNCxORzIoICAzOSksIDIsTkcyKCAxMykgfSwgIC8q
ICA3OE1iL3MgKi8KKwl7IDQsTkcyKCAxMDQpLCAzLE5HMiggIDc4KSwgNCxORzIoICA1MiksIDIs
TkcyKCAxMykgfSwgIC8qIDEwNE1iL3MgKi8KKwl7IDQsTkcyKCAxMTcpLCAzLE5HMiggMTA0KSwg
NCxORzIoICA3OCksIDIsTkcyKCAyNikgfSwgIC8qIDExN01iL3MgKi8KKwl7IDQsTkcyKCAxMzAp
LCAzLE5HMiggMTE3KSwgNCxORzIoIDEwNCksIDIsTkcyKCAyNikgfSwgIC8qIDEzME1iL3MgKi8K
KworCS8qIDMgc3RyZWFtIHJhdGVzICovCisKKwl7IDMsTkczKDE5LjUpLCAzLE5HMygxOS41KSwg
MCxORzMoMTkuNSksIDAsTkczKDE5LjUpIH0sICAvKiAgMTlNYi9zICovCisJeyAzLE5HMyggIDM5
KSwgMyxORzMoMTkuNSksIDAsTkczKDE5LjUpLCAwLE5HMygxOS41KSB9LCAgLyogIDM5TWIvcyAq
LworCXsgMyxORzMoNTguNSksIDMsTkczKCAgMzkpLCAwLE5HMygxOS41KSwgMCxORzMoMTkuNSkg
fSwgIC8qICA1OE1iL3MgKi8KKwl7IDMsTkczKCAgNzgpLCAzLE5HMyg1OC41KSwgMCxORzMoICAz
OSksIDAsTkczKDE5LjUpIH0sICAvKiAgNzhNYi9zICovCisJeyAzLE5HMyggMTE3KSwgMyxORzMo
ICA3OCksIDAsTkczKDU4LjUpLCAwLE5HMygxOS41KSB9LCAgLyogMTE3TWIvcyAqLworCXsgMyxO
RzMoIDE1NiksIDMsTkczKCAxMTcpLCAwLE5HMyggIDc4KSwgMCxORzMoMTkuNSkgfSwgIC8qICAx
NTZNYi9zICovCisJeyAzLE5HMygxNzUuNSksIDMsTkczKCAxNTYpLCAwLE5HMyggMTE3KSwgMCxO
RzMoICAzOSkgfSwgIC8qICAxNzVNYi9zICovCisJeyAzLE5HMyggMTk1KSwgMyxORzMoIDE5NSks
IDAsTkczKCAxNTYpLCAwLE5HMyg1OC41KSB9LCAgLyogMTk1TWIvcyAqLworCit9OworI3VuZGVm
IEcKKyN1bmRlZiBORzMKKyN1bmRlZiBORzIKKyN1bmRlZiBORzEKKworI2RlZmluZSBIKF9yKSBc
CisgICAgKCgoX3IpID09IDMpICAgPyAwIDogKCgoX3IpID09IDQuNSkgPyAxIDogKCgoX3IpID09
IDYpICA/IDIgOiBcCisgICAgKCgoX3IpID09IDkpICAgPyAzIDogKCgoX3IpID09IDEyKSAgPyA0
IDogKCgoX3IpID09IDE4KSA/IDUgOiBcCisgICAgKCgoX3IpID09IDI0KSAgPyA2IDogKCgoX3Ip
ID09IDI3KSAgPyA3IDogMCkpKSkpKSkpCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1bGUg
c2VyaWVzX2hhbGZbXSA9IHsKKwl7IDMsSCggMyksIDMsSCggIDMpLCAwLEgoICAzKSwgMCxIKCAz
KSB9LAkvKiAgIDNNYi9zICovCisJeyA0LEgoNC41KSwzLEgoICAzKSwgNCxIKCAgMyksIDAsSCgg
MykgfSwJLyogNC41TWIvcyAqLworCXsgNCxIKCA2KSwgMyxIKCAgMyksIDQsSCggIDMpLCAwLEgo
IDMpIH0sCS8qICAgNk1iL3MgKi8KKwl7IDQsSCggOSksIDMsSCggIDYpLCA0LEgoICAzKSwgMixI
KCAzKSB9LAkvKiAgIDlNYi9zICovCisJeyA0LEgoMTIpLCAzLEgoICA5KSwgNCxIKCAgNiksIDIs
SCggMykgfSwJLyogIDEyTWIvcyAqLworCXsgNCxIKDE4KSwgMyxIKCAxMiksIDQsSCggIDkpLCAy
LEgoIDMpIH0sCS8qICAxOE1iL3MgKi8KKwl7IDQsSCgyNCksIDMsSCggMTgpLCA0LEgoIDEyKSwg
MixIKCA2KSB9LAkvKiAgMjRNYi9zICovCisJeyA0LEgoMjcpLCAzLEgoIDI0KSwgNCxIKCAxOCks
IDIsSCgxMikgfQkvKiAgMjdNYi9zICovCit9OworI3VuZGVmIEgKKworI2lmZGVmIFEKKyN1bmRl
ZiBRCisjZW5kaWYKKyNkZWZpbmUgUShfcikgXAorICAgICgoKF9yKSA9PSAxLjUpID8gMCA6ICgo
KF9yKSA9PTIuMjUpID8gMSA6ICgoKF9yKSA9PSAzKSAgPyAyIDogXAorICAgICgoKF9yKSA9PSA0
LjUpID8gMyA6ICgoKF9yKSA9PSAgNikgID8gNCA6ICgoKF9yKSA9PSA5KSAgPyA1IDogXAorICAg
ICgoKF9yKSA9PSAxMikgID8gNiA6ICgoKF9yKSA9PSAxMy41KT8gNyA6IDApKSkpKSkpKQorc3Rh
dGljIGNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlIHNlcmllc19xdWFydGVyW10gPSB7CisJeyAzLFEo
IDEuNSksMyxRKDEuNSksIDAsUSgxLjUpLCAwLFEoMS41KSB9LAkvKiAxLjVNYi9zICovCisJeyA0
LFEoMi4yNSksMyxRKDEuNSksIDQsUSgxLjUpLCAwLFEoMS41KSB9LAkvKjIuMjVNYi9zICovCisJ
eyA0LFEoICAgMyksMyxRKDEuNSksIDQsUSgxLjUpLCAwLFEoMS41KSB9LAkvKiAgIDNNYi9zICov
CisJeyA0LFEoIDQuNSksMyxRKCAgMyksIDQsUSgxLjUpLCAyLFEoMS41KSB9LAkvKiA0LjVNYi9z
ICovCisJeyA0LFEoICAgNiksMyxRKDQuNSksIDQsUSggIDMpLCAyLFEoMS41KSB9LAkvKiAgIDZN
Yi9zICovCisJeyA0LFEoICAgOSksMyxRKCAgNiksIDQsUSg0LjUpLCAyLFEoMS41KSB9LAkvKiAg
IDlNYi9zICovCisJeyA0LFEoICAxMiksMyxRKCAgOSksIDQsUSggIDYpLCAyLFEoICAzKSB9LAkv
KiAgMTJNYi9zICovCisJeyA0LFEoMTMuNSksMyxRKCAxMiksIDQsUSggIDkpLCAyLFEoICA2KSB9
CS8qMTMuNU1iL3MgKi8KK307CisjdW5kZWYgUQorCisjZW5kaWYK
--089e013cbc8c39586e04e3fb4374--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAFnsE3cS_2Ad1geQQ0UB4doEgqVfhNBMi6j4fCRpFgQqcu2kJw>