From mboxrd@z Thu Jan 1 00:00:00 1970
From: Philipp Zabel
Subject: [PATCH v2 2/5] gpu: ipu-v3: Add mem2mem image conversion support to IC
Date: Wed, 18 Mar 2015 11:22:50 +0100
Message-ID: <1426674173-17088-3-git-send-email-p.zabel@pengutronix.de>
References: <1426674173-17088-1-git-send-email-p.zabel@pengutronix.de>
Mime-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Return-path:
Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de
[92.198.50.35])
by gabe.freedesktop.org (Postfix) with ESMTP id 113426E7F6
for ; Wed, 18 Mar 2015 03:23:01 -0700 (PDT)
In-Reply-To: <1426674173-17088-1-git-send-email-p.zabel@pengutronix.de>
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
Errors-To: dri-devel-bounces@lists.freedesktop.org
Sender: "dri-devel"
To: linux-media@vger.kernel.org
Cc: Mauro Carvalho Chehab , dri-devel@lists.freedesktop.org, Hans Verkuil , kernel@pengutronix.de, Steve Longerbeam , Jean-Michel Hautbois
List-Id: dri-devel@lists.freedesktop.org
VGhpcyBwYXRjaCBhZGRzIHN1cHBvcnQgZm9yIG1lbTJtZW0gc2NhbGluZyBhbmQgY29sb3JzcGFj
ZSBjb252ZXJzaW9uCnVzaW5nIHRoZSBJQyBtb2R1bGUncyBwb3N0LXByb2Nlc3NpbmcgdGFzay4K
ClNjYWxpbmcgaW1hZ2VzIGxhcmdlciB0aGFuIDEwMjR4MTAyNCBpcyBzdXBwb3J0ZWQgYnkgdGls
aW5nIG92ZXIgbXVsdGlwbGUKSUMgc2NhbGluZyBydW5zLiBTaW5jZSB0aGUgSURNQUMgYW5kIElD
IHVuaXRzIGhhdmUgaW50ZXJlc3RpbmcgYW5kIGRpZmZlcmVudAphbGlnbm1lbnQgbGltaXRhdGlv
bnMgZm9yIGJ1ZmZlciBiYXNlIGFkZHJlc3NlcyAobGVmdCBlZGdlcykgYW5kIGJ1cnN0IHNpemUK
KHJvdyBsZW5ndGhzKSwgZGVwZW5kaW5nIG9uIGlucHV0IGFuZCBvdXRwdXQgcGl4ZWwgZm9ybWF0
cywgdGhlIHRpbGUgcmVjdGFuZ2xlcwphbmQgc2NhbGluZyBjb2VmZmljaWVudHMgYXJlIGNob3Nl
biB0byBtaW5pbWl6ZSBkaXN0b3J0aW9uLiBEdWUgdG8gcG9zc2libGUKb3ZlcmxhcCwgdGhlIHRp
bGVzIGhhdmUgdG8gYmUgcmVuZGVyZWQgcmlnaHQgdG8gbGVmdCBhbmQgYm90dG9tIHRvIHRvcC4K
VXAgdG8gNyBwaXhlbHMgKGRlcGVuZGluZyBvbiBmcmFtZSBzaXplcyBhbmQgc2NhbGluZyBmYWN0
b3IpIGhhdmUgdG8gYmUKYXZhaWxhYmxlIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGZyYW1lIGlmIHRo
ZSB3aWR0aCBpcyBub3QgYnVyc3Qgc2l6ZSBhbGlnbmVkLgpUaGUgdGlsaW5nIGNvZGUgaGFzIGEg
cGFyYW1ldGVyIHRvIG9wdGlvbmFsbHkgcm91bmQgZnJhbWUgc2l6ZXMgdXAgb3IgZG93bgphbmQg
YXZvaWQgb3ZlcmRyYXcgaW4gY29tcG9zaXRpbmcgc2NlbmFyaW9zLgoKU2lnbmVkLW9mZi1ieTog
U2FzY2hhIEhhdWVyIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPgpTaWduZWQtb2ZmLWJ5OiBMdWNh
cyBTdGFjaCA8bC5zdGFjaEBwZW5ndXRyb25peC5kZT4KU2lnbmVkLW9mZi1ieTogUGhpbGlwcCBa
YWJlbCA8cC56YWJlbEBwZW5ndXRyb25peC5kZT4KLS0tCkNoYW5nZXMgc2luY2UgdjE6CiAtIFJl
bW92ZWQgZGVpbnRlcmxhY2VyIHN1cHBvcnQgbGVmdC1vdmVycwotLS0KIGRyaXZlcnMvZ3B1L2lw
dS12My9pcHUtaWMuYyB8IDc4NyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr
KysrKysrLQogaW5jbHVkZS92aWRlby9pbXgtaXB1LXYzLmggIHwgIDM0ICstCiAyIGZpbGVzIGNo
YW5nZWQsIDgwNCBpbnNlcnRpb25zKCspLCAxNyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9k
cml2ZXJzL2dwdS9pcHUtdjMvaXB1LWljLmMgYi9kcml2ZXJzL2dwdS9pcHUtdjMvaXB1LWljLmMK
aW5kZXggYWQ3NTU4OC4uOTg0ZjY4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvaXB1LXYzL2lw
dS1pYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2lwdS12My9pcHUtaWMuYwpAQCAtMTUsNiArMTUsNyBA
QAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4K
ICNpbmNsdWRlIDxsaW51eC9iaXRyZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4K
ICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUg
ImlwdS1wcnYuaCIKQEAgLTk2LDYgKzk3LDE1IEBAIHN0cnVjdCBpY190YXNrX2JpdGZpZWxkcyB7
CiAJdTMyIGljX2NtYl9nYWxwaGFfYml0OwogfTsKIAorc3RydWN0IGljX3Rhc2tfY2hhbm5lbHMg
eworCXU4IGluOworCXU4IG91dDsKKwl1OCByb3RfaW47CisJdTggcm90X291dDsKKwl1OCBpbl9w
cmV2OworCXU4IGluX25leHQ7Cit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGljX3Rhc2tfcmVn
b2ZmcyBpY190YXNrX3JlZ1tJQ19OVU1fVEFTS1NdID0gewogCVtJQ19UQVNLX0VOQ09ERVJdID0g
ewogCQkucnNjID0gSUNfUFJQX0VOQ19SU0MsCkBAIC0xMzgsMTIgKzE0OCw1MyBAQCBzdGF0aWMg
Y29uc3Qgc3RydWN0IGljX3Rhc2tfYml0ZmllbGRzIGljX3Rhc2tfYml0W0lDX05VTV9UQVNLU10g
PSB7CiAJfSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWNfdGFza19jaGFubmVscyBpY190
YXNrX2NoW0lDX05VTV9UQVNLU10gPSB7CisJW0lDX1RBU0tfRU5DT0RFUl0gPSB7CisJCS5pbiA9
IElQVVYzX0NIQU5ORUxfTUVNX0lDX1BSUF9WRiwKKwkJLm91dCA9IElQVVYzX0NIQU5ORUxfSUNf
UFJQX0VOQ19NRU0sCisJCS5yb3RfaW4gPSBJUFVWM19DSEFOTkVMX01FTV9ST1RfRU5DLAorCQku
cm90X291dCA9IElQVVYzX0NIQU5ORUxfUk9UX0VOQ19NRU0sCisJfSwKKwlbSUNfVEFTS19WSUVX
RklOREVSXSA9IHsKKwkJLmluID0gSVBVVjNfQ0hBTk5FTF9NRU1fVkRJX0NVUiwKKwkJLm91dCA9
IElQVVYzX0NIQU5ORUxfSUNfUFJQX1ZGX01FTSwKKwkJLnJvdF9pbiA9IElQVVYzX0NIQU5ORUxf
TUVNX1JPVF9WRiwKKwkJLnJvdF9vdXQgPSBJUFVWM19DSEFOTkVMX1JPVF9WRl9NRU0sCisJCS5p
bl9wcmV2ID0gSVBVVjNfQ0hBTk5FTF9NRU1fVkRJX1BSRVYsCisJCS5pbl9uZXh0ID0gSVBVVjNf
Q0hBTk5FTF9NRU1fVkRJX05FWFQsCisJfSwKKwlbSUNfVEFTS19QT1NUX1BST0NFU1NPUl0gPSB7
CisJCS5pbiA9IElQVVYzX0NIQU5ORUxfTUVNX0lDX1BQLAorCQkub3V0ID0gSVBVVjNfQ0hBTk5F
TF9JQ19QUF9NRU0sCisJCS5yb3RfaW4gPSBJUFVWM19DSEFOTkVMX01FTV9ST1RfUFAsCisJCS5y
b3Rfb3V0ID0gSVBVVjNfQ0hBTk5FTF9ST1RfUFBfTUVNLAorCX0sCit9OworCitzdHJ1Y3QgaW1h
Z2VfY29udmVydF9jdHggeworCXZvaWQgKCpjb21wbGV0ZSkodm9pZCAqY3R4LCBpbnQgZXJyKTsK
Kwl2b2lkICpjb21wbGV0ZV9jb250ZXh0OworCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0
cnVjdCBpcHVfaW1hZ2UgaW47CisJc3RydWN0IGlwdV9pbWFnZSBpbl9uOworCXN0cnVjdCBpcHVf
aW1hZ2UgaW5fcDsKKwlzdHJ1Y3QgaXB1X2ltYWdlIG91dDsKKworCXZvaWQgKmZyZWVwOworCisJ
Ym9vbCByb3RhdGU6MTsKKworCXUzMiByc2M7Cit9OworCiBzdHJ1Y3QgaXB1X2ljX3ByaXY7CiAK
IHN0cnVjdCBpcHVfaWMgewogCWVudW0gaXB1X2ljX3Rhc2sgdGFzazsKIAljb25zdCBzdHJ1Y3Qg
aWNfdGFza19yZWdvZmZzICpyZWc7CiAJY29uc3Qgc3RydWN0IGljX3Rhc2tfYml0ZmllbGRzICpi
aXQ7CisJY29uc3Qgc3RydWN0IGljX3Rhc2tfY2hhbm5lbHMgKmNoOwogCiAJZW51bSBpcHVfY29s
b3Jfc3BhY2UgaW5fY3MsIGdfaW5fY3M7CiAJZW51bSBpcHVfY29sb3Jfc3BhY2Ugb3V0X2NzOwpA
QCAtMTUyLDYgKzIwMywxOSBAQCBzdHJ1Y3QgaXB1X2ljIHsKIAlib29sIGluX3VzZTsKIAogCXN0
cnVjdCBpcHVfaWNfcHJpdiAqcHJpdjsKKworCXN0cnVjdCBpcHV2M19jaGFubmVsICppbnB1dF9j
aGFubmVsX3A7CisJc3RydWN0IGlwdXYzX2NoYW5uZWwgKmlucHV0X2NoYW5uZWw7CisJc3RydWN0
IGlwdXYzX2NoYW5uZWwgKmlucHV0X2NoYW5uZWxfbjsKKwlzdHJ1Y3QgaXB1djNfY2hhbm5lbCAq
b3V0cHV0X2NoYW5uZWw7CisJc3RydWN0IGlwdXYzX2NoYW5uZWwgKnJvdGF0aW9uX2lucHV0X2No
YW5uZWw7CisJc3RydWN0IGlwdXYzX2NoYW5uZWwgKnJvdGF0aW9uX291dHB1dF9jaGFubmVsOwor
CisJc3RydWN0IGxpc3RfaGVhZCBpbWFnZV9saXN0OworCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1
Y3QgKndvcmtxdWV1ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgY29tcGxl
dGlvbiBjb21wbGV0ZTsKIH07CiAKIHN0cnVjdCBpcHVfaWNfcHJpdiB7CkBAIC0xNjgsNyArMjMy
LDggQEAgc3RhdGljIGlubGluZSB1MzIgaXB1X2ljX3JlYWQoc3RydWN0IGlwdV9pYyAqaWMsIHVu
c2lnbmVkIG9mZnNldCkKIAlyZXR1cm4gcmVhZGwoaWMtPnByaXYtPmJhc2UgKyBvZmZzZXQpOwog
fQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXB1X2ljX3dyaXRlKHN0cnVjdCBpcHVfaWMgKmljLCB1
MzIgdmFsdWUsIHVuc2lnbmVkIG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHVfaWNfd3Jp
dGUoc3RydWN0IGlwdV9pYyAqaWMsIHUzMiB2YWx1ZSwKKwkJCQl1bnNpZ25lZCBvZmZzZXQpCiB7
CiAJd3JpdGVsKHZhbHVlLCBpYy0+cHJpdi0+YmFzZSArIG9mZnNldCk7CiB9CkBAIC00NDYsMzIg
KzUxMSwzNSBAQCBpbnQgaXB1X2ljX3Rhc2tfaW5pdChzdHJ1Y3QgaXB1X2ljICppYywKIAkJICAg
ICBpbnQgaW5fd2lkdGgsIGludCBpbl9oZWlnaHQsCiAJCSAgICAgaW50IG91dF93aWR0aCwgaW50
IG91dF9oZWlnaHQsCiAJCSAgICAgZW51bSBpcHVfY29sb3Jfc3BhY2UgaW5fY3MsCi0JCSAgICAg
ZW51bSBpcHVfY29sb3Jfc3BhY2Ugb3V0X2NzKQorCQkgICAgIGVudW0gaXB1X2NvbG9yX3NwYWNl
IG91dF9jcywKKwkJICAgICB1MzIgcnNjKQogewogCXN0cnVjdCBpcHVfaWNfcHJpdiAqcHJpdiA9
IGljLT5wcml2OwotCXUzMiByZWcsIGRvd25zaXplX2NvZWZmLCByZXNpemVfY29lZmY7CisJdTMy
IGRvd25zaXplX2NvZWZmLCByZXNpemVfY29lZmY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlp
bnQgcmV0ID0gMDsKIAotCS8qIFNldHVwIHZlcnRpY2FsIHJlc2l6aW5nICovCi0JcmV0ID0gY2Fs
Y19yZXNpemVfY29lZmZzKGljLCBpbl9oZWlnaHQsIG91dF9oZWlnaHQsCi0JCQkJICZyZXNpemVf
Y29lZmYsICZkb3duc2l6ZV9jb2VmZik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlpZiAo
IXJzYykgeworCQkvKiBTZXR1cCB2ZXJ0aWNhbCByZXNpemluZyAqLworCQlyZXQgPSBjYWxjX3Jl
c2l6ZV9jb2VmZnMoaWMsIGluX2hlaWdodCwgb3V0X2hlaWdodCwKKwkJCQkJICZyZXNpemVfY29l
ZmYsICZkb3duc2l6ZV9jb2VmZik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCi0JcmVn
ID0gKGRvd25zaXplX2NvZWZmIDw8IDMwKSB8IChyZXNpemVfY29lZmYgPDwgMTYpOworCQlyc2Mg
PSAoZG93bnNpemVfY29lZmYgPDwgMzApIHwgKHJlc2l6ZV9jb2VmZiA8PCAxNik7CiAKLQkvKiBT
ZXR1cCBob3Jpem9udGFsIHJlc2l6aW5nICovCi0JcmV0ID0gY2FsY19yZXNpemVfY29lZmZzKGlj
LCBpbl93aWR0aCwgb3V0X3dpZHRoLAotCQkJCSAmcmVzaXplX2NvZWZmLCAmZG93bnNpemVfY29l
ZmYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCS8qIFNldHVwIGhvcml6b250YWwgcmVz
aXppbmcgKi8KKwkJcmV0ID0gY2FsY19yZXNpemVfY29lZmZzKGljLCBpbl93aWR0aCwgb3V0X3dp
ZHRoLAorCQkJCQkgJnJlc2l6ZV9jb2VmZiwgJmRvd25zaXplX2NvZWZmKTsKKwkJaWYgKHJldCkK
KwkJCXJldHVybiByZXQ7CiAKLQlyZWcgfD0gKGRvd25zaXplX2NvZWZmIDw8IDE0KSB8IHJlc2l6
ZV9jb2VmZjsKKwkJcnNjIHw9IChkb3duc2l6ZV9jb2VmZiA8PCAxNCkgfCByZXNpemVfY29lZmY7
CisJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCWlwdV9p
Y193cml0ZShpYywgcmVnLCBpYy0+cmVnLT5yc2MpOworCWlwdV9pY193cml0ZShpYywgcnNjLCBp
Yy0+cmVnLT5yc2MpOwogCiAJLyogU2V0dXAgY29sb3Igc3BhY2UgY29udmVyc2lvbiAqLwogCWlj
LT5pbl9jcyA9IGluX2NzOwpAQCAtNjI5LDYgKzY5Nyw2NzUgQEAgdW5sb2NrOgogfQogRVhQT1JU
X1NZTUJPTF9HUEwoaXB1X2ljX3Rhc2tfaWRtYV9pbml0KTsKIAorc3RhdGljIHN0cnVjdCBpbWFn
ZV9jb252ZXJ0X2N0eCAqaXB1X2ltYWdlX2NvbnZlcnRfbmV4dChzdHJ1Y3QgaXB1X2ljICppYykK
K3sKKwlzdHJ1Y3QgaXB1X2ljX3ByaXYgKnByaXYgPSBpYy0+cHJpdjsKKwlzdHJ1Y3QgaXB1djNf
Y2hhbm5lbCAqY2hfaW4gPSBpYy0+aW5wdXRfY2hhbm5lbDsKKwlzdHJ1Y3QgaXB1djNfY2hhbm5l
bCAqY2hfb3V0ID0gaWMtPm91dHB1dF9jaGFubmVsOworCXN0cnVjdCBpbWFnZV9jb252ZXJ0X2N0
eCAqY3R4OworCXN0cnVjdCBpcHVfaW1hZ2UgKmluX3AsICppbiwgKmluX247CisJc3RydWN0IGlw
dV9pbWFnZSAqb3V0OworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25l
ZCBpbnQgaW5idXJzdCwgb3V0YnVyc3Q7CisJdW5zaWduZWQgaW50IGluX2hlaWdodDsKKworCXNw
aW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlpZiAobGlzdF9lbXB0eSgm
aWMtPmltYWdlX2xpc3QpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ss
IGZsYWdzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY3R4ID0gbGlzdF9maXJzdF9lbnRyeSgm
aWMtPmltYWdlX2xpc3QsIHN0cnVjdCBpbWFnZV9jb252ZXJ0X2N0eCwgbGlzdCk7CisKKwlsaXN0
X2RlbCgmY3R4LT5saXN0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ss
IGZsYWdzKTsKKworCWluX3AgPSAmY3R4LT5pbl9wOworCWluID0gJmN0eC0+aW47CisJaW5fbiA9
ICZjdHgtPmluX247CisJb3V0ID0gJmN0eC0+b3V0OworCisJaXB1X2NwbWVtX3plcm8oY2hfaW4p
OworCWlwdV9jcG1lbV96ZXJvKGNoX291dCk7CisKKwlpbmJ1cnN0ID0gaW4tPnJlY3Qud2lkdGgg
JiAweGYgPyA4IDogMTY7CisJb3V0YnVyc3QgPSBvdXQtPnJlY3Qud2lkdGggJiAweGYgPyA4IDog
MTY7CisKKwlpcHVfaWNfZW5hYmxlKGljKTsKKworCWlwdV9pY190YXNrX2lkbWFfaW5pdChpYywg
aWMtPmlucHV0X2NoYW5uZWwsIGluLT5yZWN0LndpZHRoLAorCQkJICAgICAgaW4tPnJlY3QuaGVp
Z2h0LCBpbmJ1cnN0LCBJUFVfUk9UQVRFX05PTkUpOworCWlwdV9pY190YXNrX2lkbWFfaW5pdChp
YywgaWMtPm91dHB1dF9jaGFubmVsLCBvdXQtPnJlY3Qud2lkdGgsCisJCQkgICAgICBvdXQtPnJl
Y3QuaGVpZ2h0LCBvdXRidXJzdCwgSVBVX1JPVEFURV9OT05FKTsKKworCWlwdV9jcG1lbV9zZXRf
aW1hZ2UoY2hfaW4sICZjdHgtPmluKTsKKwlpcHVfY3BtZW1fc2V0X2ltYWdlKGNoX291dCwgJmN0
eC0+b3V0KTsKKworCWlwdV9jcG1lbV9zZXRfYnVyc3RzaXplKGNoX2luLCBpbmJ1cnN0KTsKKwlp
cHVfY3BtZW1fc2V0X2J1cnN0c2l6ZShjaF9vdXQsIG91dGJ1cnN0KTsKKworCWluX2hlaWdodCA9
IGluLT5yZWN0LmhlaWdodDsKKworCWRldl9kYmcocHJpdi0+aXB1LT5kZXYsICIlczogJWR4JWQo
JWR4JWRAJWQsJWQpIC0+ICVkeCVkKCVkeCVkQCVkLCVkKVxuIiwKKwkJX19mdW5jX18sIGluLT5w
aXgud2lkdGgsIGluLT5waXguaGVpZ2h0LAorCQlpbi0+cmVjdC53aWR0aCwgaW4tPnJlY3QuaGVp
Z2h0LCBpbi0+cmVjdC5sZWZ0LCBpbi0+cmVjdC50b3AsCisJCW91dC0+cGl4LndpZHRoLCBvdXQt
PnBpeC5oZWlnaHQsCisJCW91dC0+cmVjdC53aWR0aCwgb3V0LT5yZWN0LmhlaWdodCwKKwkJb3V0
LT5yZWN0LmxlZnQsIG91dC0+cmVjdC50b3ApOworCisJZGV2X2RiZyhwcml2LT5pcHUtPmRldiwK
KwkJIiVzOiBoc2NhbGU6ID4+JWQsICo4MTkyLyVkIHZzY2FsZTogPj4lZCwgKjgxOTIvJWRcbiIs
CisJCV9fZnVuY19fLCAoY3R4LT5yc2MgPj4gMTQpICYgMHgzLCAoY3R4LT5yc2MgJiAweDNmZmYp
LAorCQljdHgtPnJzYyA+PiAzMCwgKGN0eC0+cnNjID4+IDE2KSAmIDB4M2ZmZik7CisKKwlyZXQg
PSBpcHVfaWNfdGFza19pbml0KGljLCBpbi0+cmVjdC53aWR0aCwgaW5faGVpZ2h0LAorCQkJb3V0
LT5yZWN0LndpZHRoLCBvdXQtPnJlY3QuaGVpZ2h0LAorCQkJaXB1X3BpeGVsZm9ybWF0X3RvX2Nv
bG9yc3BhY2UoaW4tPnBpeC5waXhlbGZvcm1hdCksCisJCQlpcHVfcGl4ZWxmb3JtYXRfdG9fY29s
b3JzcGFjZShvdXQtPnBpeC5waXhlbGZvcm1hdCksCisJCQljdHgtPnJzYyk7CisJaWYgKHJldCkg
eworCQlpcHVfaWNfZGlzYWJsZShpYyk7CisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJfQorCisJ
aXB1X2lkbWFjX2VuYWJsZV9jaGFubmVsKGljLT5pbnB1dF9jaGFubmVsKTsKKwlpcHVfaWRtYWNf
ZW5hYmxlX2NoYW5uZWwoaWMtPm91dHB1dF9jaGFubmVsKTsKKworCWlwdV9pY190YXNrX2VuYWJs
ZShpYyk7CisKKwlpcHVfaWRtYWNfc2VsZWN0X2J1ZmZlcihpYy0+aW5wdXRfY2hhbm5lbCwgMCk7
CisJaXB1X2lkbWFjX3NlbGVjdF9idWZmZXIoaWMtPm91dHB1dF9jaGFubmVsLCAwKTsKKworCXJl
dHVybiBjdHg7Cit9CisKK3N0YXRpYyB2b2lkIGlwdV9pbWFnZV9jb252ZXJ0X3dvcmsoc3RydWN0
IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpcHVfaWMgKmljID0gY29udGFpbmVyX29m
KHdvcmssIHN0cnVjdCBpcHVfaWMsIHdvcmspOworCXN0cnVjdCBpbWFnZV9jb252ZXJ0X2N0eCAq
Y3R4OworCWludCByZXQ7CisKKwl3aGlsZSAoMSkgeworCQlpbnQgdGFza19lcnJvciA9IDA7CisK
KwkJY3R4ID0gaXB1X2ltYWdlX2NvbnZlcnRfbmV4dChpYyk7CisJCWlmICghY3R4KQorCQkJcmV0
dXJuOworCisJCWlmIChJU19FUlIoY3R4KSkgeworCQkJdGFza19lcnJvciA9IFBUUl9FUlIoY3R4
KTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJs
ZV90aW1lb3V0KAorCQkJCQkJJmljLT5jb21wbGV0ZSwgMTAwICogSFopOworCQkJaWYgKCFyZXQp
CisJCQkJdGFza19lcnJvciA9IC1FVElNRURPVVQ7CisJCX0KKworCQlpcHVfaWNfdGFza19kaXNh
YmxlKGljKTsKKwkJaXB1X2ljX2Rpc2FibGUoaWMpOworCisJCWlmIChjdHgtPmNvbXBsZXRlKQor
CQkJY3R4LT5jb21wbGV0ZShjdHgtPmNvbXBsZXRlX2NvbnRleHQsIHRhc2tfZXJyb3IpOworCQlr
ZnJlZShjdHgtPmZyZWVwKTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpcHVfaW1hZ2Vf
Y29udmVydF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGlwdV9p
YyAqaWMgPSBjb250ZXh0OworCisJY29tcGxldGUoJmljLT5jb21wbGV0ZSk7CisKKwlyZXR1cm4g
SVJRX0hBTkRMRUQ7Cit9CisKKworLyoKKyAqIElETUFDIGJhc2UgYWRkcmVzc2VzIGFyZSA4LWJ5
dGUgYWxpZ25lZAorICovCitzdGF0aWMgaW50IGlwdV9pbWFnZV9oYWxpZ24odTMyIHBpeGZtdCkK
K3sKKwlzd2l0Y2ggKHBpeGZtdCkgeworCS8qIDIgUkdCMzIgcGl4ZWxzIGNvcnJlc3BvbmQgdG8g
OCBieXRlcyAqLworCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjMyOgorCWNhc2UgVjRMMl9QSVhfRk1U
X0JHUjMyOgorCQlyZXR1cm4gMjsKKwkvKiA0IFJHQjU2NSBvciBZVVlWIHBpeGVscyBjb3JyZXNw
b25kIHRvIDggYnl0ZXMgKi8KKwljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjU6CisJY2FzZSBWNEwy
X1BJWF9GTVRfVVlWWToKKwljYXNlIFY0TDJfUElYX0ZNVF9ZVVlWOgorCQlyZXR1cm4gNDsKKwkv
KgorCSAqIDggUkdCMjQgcGl4ZWxzIGNvcnJlc3BvbmQgdG8gMjQgYnl0ZXMsCisJICogOCBOVjEy
IHBpeGVscyBjb3JyZXNwb25kIHRvIDggYnl0ZXMsIGJvdGggaW4gbHVtYSBhbmQgY2hyb21hCisJ
ICovCisJY2FzZSBWNEwyX1BJWF9GTVRfUkdCMjQ6CisJY2FzZSBWNEwyX1BJWF9GTVRfQkdSMjQ6
CisJY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjoKKwkJcmV0dXJuIDg7CisJLyogMTYgWVVWNDIwIHBp
eGVscyBjb3JyZXNwb25kIHRvIDE2IGJ5dGVzIGluIGx1bWEsIDggYnl0ZXMgaW4gY2hyb21hICov
CisJY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIwOgorCWNhc2UgVjRMMl9QSVhfRk1UX1lWVTQyMDoK
KwljYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjJQOgorCQlyZXR1cm4gMTY7CisJZGVmYXVsdDoKKwkJ
cmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisvKgorICogVmVydGljYWxseSBjaHJvbWEtc3Vic2Ft
cGxlZCBmb3JtYXRzIGFyZSBsaW1pdGVkIHRvIGV2ZW4gaGVpZ2h0cyBhbmQgdmVydGljYWwKKyAq
IHBvc2l0aW9ucworICovCitzdGF0aWMgaW50IGlwdV9pbWFnZV92YWxpZ24odTMyIHBpeGZtdCkK
K3sKKwlzd2l0Y2ggKHBpeGZtdCkgeworCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjI0OgorCWNhc2Ug
VjRMMl9QSVhfRk1UX0JHUjI0OgorCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjMyOgorCWNhc2UgVjRM
Ml9QSVhfRk1UX0JHUjMyOgorCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NToKKwljYXNlIFY0TDJf
UElYX0ZNVF9VWVZZOgorCWNhc2UgVjRMMl9QSVhfRk1UX1lVWVY6CisJY2FzZSBWNEwyX1BJWF9G
TVRfWVVWNDIyUDoKKwkJcmV0dXJuIDE7CisJY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjoKKwljYXNl
IFY0TDJfUElYX0ZNVF9ZVVY0MjA6CisJY2FzZSBWNEwyX1BJWF9GTVRfWVZVNDIwOgorCQlyZXR1
cm4gMjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKyNkZWZpbmUgcm91
bmRfY2xvc2VzdCh4LCB5KSByb3VuZF9kb3duKCh4KSArICh5KS8yLCAoeSkpCisKK3N0cnVjdCBp
bWFnZV9jb252ZXJ0X2N0eCAqaXB1X2ltYWdlX2NvbnZlcnRfcHJlcGFyZShzdHJ1Y3QgaXB1X3Nv
YyAqaXB1LAorCQlzdHJ1Y3QgaXB1X2ltYWdlICppbiwgc3RydWN0IGlwdV9pbWFnZSAqb3V0LAor
CQllbnVtIGlwdV9pbWFnZV9zY2FsZV9jdHJsIGN0cmwsIGludCAqbnVtX3RpbGVzKQoreworCXN0
cnVjdCBpbWFnZV9jb252ZXJ0X2N0eCAqY3R4LCAqYzsKKwlpbnQgaHRpbGVzLCB2dGlsZXM7CisJ
aW50IGluX3ZhbGlnbiwgaW5faGFsaWduLCBpbl9idXJzdCwgb3V0X3ZhbGlnbiwgb3V0X2hhbGln
biwgb3V0X2J1cnN0OworCWludCBsZWZ0LCB0b3A7CisJaW50IHgsIHk7CisJaW50IGhfcmVzaXpl
X29wdCwgdl9yZXNpemVfb3B0OworCXUzMiB2X2Rvd25zaXplX2NvZWZmID0gMCwgaF9kb3duc2l6
ZV9jb2VmZiA9IDA7CisJdTMyIHZfcmVzaXplX2NvZWZmLCBoX3Jlc2l6ZV9jb2VmZjsKKworCS8q
IHZhbGlkYXRlIGlucHV0ICovCisJaWYgKGluLT5yZWN0LndpZHRoIDwgMTYgfHwgb3V0LT5yZWN0
LndpZHRoIDwgMTYgfHwKKwkgICAgKGluLT5yZWN0LndpZHRoIC8gOCkgPiBvdXQtPnJlY3Qud2lk
dGgpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJLyogdGlsZSBzZXR1cCAqLworCWh0
aWxlcyA9IERJVl9ST1VORF9VUChvdXQtPnJlY3Qud2lkdGgsIDEwMjQpOworCXZ0aWxlcyA9IERJ
Vl9ST1VORF9VUChvdXQtPnJlY3QuaGVpZ2h0LCAxMDI0KTsKKworCWluX3ZhbGlnbiA9IGlwdV9p
bWFnZV92YWxpZ24oaW4tPnBpeC5waXhlbGZvcm1hdCk7CisJaW5faGFsaWduID0gaXB1X2ltYWdl
X2hhbGlnbihpbi0+cGl4LnBpeGVsZm9ybWF0KTsKKwlvdXRfdmFsaWduID0gaXB1X2ltYWdlX3Zh
bGlnbihvdXQtPnBpeC5waXhlbGZvcm1hdCk7CisJb3V0X2hhbGlnbiA9IGlwdV9pbWFnZV9oYWxp
Z24ob3V0LT5waXgucGl4ZWxmb3JtYXQpOworCisJLyogSUMgYnVyc3RzIGFyZSBsaW1pdGVkIHRv
IGVpdGhlciA4IG9yIDE2IHBpeGVscyAqLworCWluX2J1cnN0ID0gODsKKwlvdXRfYnVyc3QgPSA4
OworCisJaWYgKGluX3ZhbGlnbiA8IDAgfHwgaW5faGFsaWduIDwgMCB8fAorCSAgICBvdXRfdmFs
aWduIDwgMCB8fCBvdXRfaGFsaWduIDwgMCkgeworCQlkZXZfZXJyKGlwdS0+ZGV2LCAidW5zdXBw
b3J0ZWQgaW4vb3V0IGZvcm1hdFxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0K
KworCS8qIGNvbXB1dGUgc3RhdGljIGRlY2ltYXRvciBjb2VmZmljaWVudHMgKi8KKwl3aGlsZSAo
KGluLT5yZWN0LndpZHRoID4+IGhfZG93bnNpemVfY29lZmYpID4gb3V0LT5yZWN0LndpZHRoKQor
CQloX2Rvd25zaXplX2NvZWZmKys7CisJd2hpbGUgKChpbi0+cmVjdC5oZWlnaHQgPj4gdl9kb3du
c2l6ZV9jb2VmZikgPiBvdXQtPnJlY3QuaGVpZ2h0KQorCQl2X2Rvd25zaXplX2NvZWZmKys7CisK
KwkvKiBtb3ZlIGFuZCBjcm9wIHRoZSBvdXRwdXQgaW1hZ2UgYWNjb3JkaW5nIHRvIElETUFDIGxp
bWl0YXRpb25zICovCisJc3dpdGNoIChjdHJsKSB7CisJY2FzZSBJUFVfSU1BR0VfU0NBTEVfUk9V
TkRfRE9XTjoKKwkJbGVmdCA9IHJvdW5kX3VwKGluLT5yZWN0LmxlZnQsIGluX2hhbGlnbik7CisJ
CXRvcCA9IHJvdW5kX3VwKGluLT5yZWN0LnRvcCwgaW5fdmFsaWduKTsKKwkJaW4tPnJlY3Qud2lk
dGggPSBpbi0+cmVjdC53aWR0aCAtIChsZWZ0IC0gaW4tPnJlY3QubGVmdCk7CisJCWluLT5yZWN0
LmhlaWdodCA9IGluLT5yZWN0LmhlaWdodCAtICh0b3AgLSBpbi0+cmVjdC50b3ApOworCQlpbi0+
cmVjdC5sZWZ0ID0gbGVmdDsKKwkJaW4tPnJlY3QudG9wID0gdG9wOworCQlsZWZ0ID0gcm91bmRf
dXAob3V0LT5yZWN0LmxlZnQsIG91dF9oYWxpZ24pOworCQl0b3AgPSByb3VuZF91cChvdXQtPnJl
Y3QudG9wLCBvdXRfdmFsaWduKTsKKwkJb3V0LT5yZWN0LndpZHRoID0gcm91bmRfZG93bihvdXQt
PnJlY3Qud2lkdGggLSAobGVmdCAtCisJCQkJCSAgICAgb3V0LT5yZWN0LmxlZnQpLCBvdXRfYnVy
c3QpOworCQlvdXQtPnJlY3QuaGVpZ2h0ID0gcm91bmRfZG93bihvdXQtPnJlY3QuaGVpZ2h0IC0g
KHRvcCAtCisJCQkJCSAgICAgIG91dC0+cmVjdC50b3ApLCBvdXRfdmFsaWduKTsKKwkJYnJlYWs7
CisJY2FzZSBJUFVfSU1BR0VfU0NBTEVfUk9VTkRfVVA6CisJCWxlZnQgPSByb3VuZF9kb3duKGlu
LT5yZWN0LmxlZnQsIGluX2hhbGlnbik7CisJCXRvcCA9IHJvdW5kX2Rvd24oaW4tPnJlY3QudG9w
LCBpbl92YWxpZ24pOworCQlpbi0+cmVjdC53aWR0aCA9IGluLT5yZWN0LndpZHRoICsgaW4tPnJl
Y3QubGVmdCAtIGxlZnQ7CisJCWluLT5yZWN0LmhlaWdodCA9IGluLT5yZWN0LmhlaWdodCArIGlu
LT5yZWN0LnRvcCAtIHRvcDsKKwkJaW4tPnJlY3QubGVmdCA9IGxlZnQ7CisJCWluLT5yZWN0LnRv
cCA9IHRvcDsKKwkJbGVmdCA9IHJvdW5kX2Rvd24ob3V0LT5yZWN0LmxlZnQsIG91dF9oYWxpZ24p
OworCQl0b3AgPSByb3VuZF9kb3duKG91dC0+cmVjdC50b3AsIG91dF92YWxpZ24pOworCQlvdXQt
PnJlY3Qud2lkdGggPSByb3VuZF91cChvdXQtPnJlY3Qud2lkdGggKyBvdXQtPnJlY3QubGVmdCAt
CisJCQkJCSAgIGxlZnQsIG91dF9idXJzdCk7CisJCW91dC0+cmVjdC5oZWlnaHQgPSByb3VuZF91
cChvdXQtPnJlY3QuaGVpZ2h0ICsgb3V0LT5yZWN0LnRvcCAtCisJCQkJCSAgICB0b3AsIG91dF92
YWxpZ24pOworCQlicmVhazsKKwljYXNlIElQVV9JTUFHRV9TQ0FMRV9QSVhFTFBFUkZFQ1Q6CisJ
CWxlZnQgPSByb3VuZF9kb3duKGluLT5yZWN0LmxlZnQsIGluX2hhbGlnbik7CisJCXRvcCA9IHJv
dW5kX2Rvd24oaW4tPnJlY3QudG9wLCBpbl92YWxpZ24pOworCQlpbi0+cmVjdC53aWR0aCA9IGlu
LT5yZWN0LndpZHRoICsgaW4tPnJlY3QubGVmdCAtIGxlZnQ7CisJCWluLT5yZWN0LmhlaWdodCA9
IGluLT5yZWN0LmhlaWdodCArIGluLT5yZWN0LnRvcCAtIHRvcDsKKwkJaW4tPnJlY3QubGVmdCA9
IGxlZnQ7CisJCWluLT5yZWN0LnRvcCA9IHRvcDsKKwkJbGVmdCA9IHJvdW5kX2Rvd24ob3V0LT5y
ZWN0LmxlZnQgKyBvdXRfaGFsaWduIC8gMiwgb3V0X2hhbGlnbik7CisJCXRvcCA9IHJvdW5kX2Rv
d24ob3V0LT5yZWN0LnRvcCArIG91dF92YWxpZ24gLyAyLCBvdXRfdmFsaWduKTsKKwkJLyoKKwkJ
ICogZG9uJ3Qgcm91bmQgd2lkdGggYW5kIGhlaWdodCB0byBidXJzdCBzaXplIC8gcGl4ZWwgZm9y
bWF0CisJCSAqIGxpbWl0YXRpb25zIHlldCwgd2UgZG8gaXQgYWZ0ZXIgZGV0ZXJtaW5pbmcgdGhl
IHNjYWxpbmcKKwkJICogY29lZmZpY2llbnRzCisJCSAqLworCQlvdXQtPnJlY3Qud2lkdGggPSBv
dXQtPnJlY3Qud2lkdGggKyBvdXQtPnJlY3QubGVmdCAtIGxlZnQ7CisJCW91dC0+cmVjdC5oZWln
aHQgPSBvdXQtPnJlY3QuaGVpZ2h0ICsgb3V0LT5yZWN0LnRvcCAtIHRvcDsKKwkJYnJlYWs7CisJ
ZGVmYXVsdDoKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCW91dC0+cmVjdC5sZWZ0
ID0gbGVmdDsKKwlvdXQtPnJlY3QudG9wID0gdG9wOworCisJLyogUm91bmQgaW5wdXQgd2lkdGgg
YW5kIGhlaWdodCBhY2NvcmRpbmcgdG8gZGVjaW1hdGlvbiAqLworCWluLT5yZWN0LndpZHRoID0g
cm91bmRfZG93bihpbi0+cmVjdC53aWR0aCwgMSA8PCBoX2Rvd25zaXplX2NvZWZmKTsKKwlpbi0+
cmVjdC5oZWlnaHQgPSByb3VuZF9kb3duKGluLT5yZWN0LmhlaWdodCwgMSA8PCB2X2Rvd25zaXpl
X2NvZWZmKTsKKworCWRldl9kYmcoaXB1LT5kZXYsCisJCSIlczogaW46ICVkeCVkKCVkeCVkQCVk
LCVkKSAtPiBvdXQ6ICVkeCVkKCVkeCVkQCVkLCVkKVxuIiwKKwkJX19mdW5jX18sIGluLT5waXgu
d2lkdGgsIGluLT5waXguaGVpZ2h0LCBpbi0+cmVjdC53aWR0aCwKKwkJaW4tPnJlY3QuaGVpZ2h0
LCBpbi0+cmVjdC5sZWZ0LCBpbi0+cmVjdC50b3AsIG91dC0+cGl4LndpZHRoLAorCQlvdXQtPnBp
eC5oZWlnaHQsIG91dC0+cmVjdC53aWR0aCwgb3V0LT5yZWN0LmhlaWdodCwKKwkJb3V0LT5yZWN0
LmxlZnQsIG91dC0+cmVjdC50b3ApOworCisJLyoKKwkgKiBDb21wdXRlIHRoZSBiaWxpbmVhciBy
ZXNpemluZyBjb2VmZmljaWVudHMgdGhhdCBjYW4vY291bGQgYmUgdXNlZCBpZgorCSAqIHNjYWxp
bmcgdXNpbmcgYSBzaW5nbGUgdGlsZS4gVGhlIGJvdHRvbSByaWdodCBwaXhlbCBzaG91bGQgc2Ft
cGxlIHRoZQorCSAqIGlucHV0IGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIGJ1dCBub3QgYmV5b25k
IHRoZSBib3R0b20gcmlnaHQgaW5wdXQKKwkgKiBwaXhlbCBvdXQgb2YgdGhlIGRlY2ltYXRvcjoK
KwkgKgorCSAqIChvdXQtPnJlY3Qud2lkdGggLSAxKSAqIGhfcmVzaXplIC8gODE5Mi4wIDw9IChp
bi0+cmVjdC53aWR0aCA+PgorCSAqCQkJCQkJIGhfZG93bnNpemVfY29lZmYpIC0gMQorCSAqIChv
dXQtPnJlY3QuaGVpZ2h0IC0gMSkgKiB2X3Jlc2l6ZSAvIDgxOTIuMCA8PSAoaW4tPnJlY3QuaGVp
Z2h0ID4+CisJICoJCQkJCQkgIHZfZG93bnNpemVfY29lZmYpIC0gMQorCSAqLworCWhfcmVzaXpl
X29wdCA9IDgxOTIgKiAoKGluLT5yZWN0LndpZHRoID4+IGhfZG93bnNpemVfY29lZmYpIC0gMSkg
LworCQkgICAgICAgKG91dC0+cmVjdC53aWR0aCAtIDEpOworCXZfcmVzaXplX29wdCA9IDgxOTIg
KiAoKGluLT5yZWN0LmhlaWdodCA+PiB2X2Rvd25zaXplX2NvZWZmKSAtIDEpIC8KKwkJICAgICAg
IChvdXQtPnJlY3QuaGVpZ2h0IC0gMSk7CisKKwlkZXZfZGJnKGlwdS0+ZGV2LAorCQkiJXM6IGhz
Y2FsZTogPj4lZCwgKjgxOTIvJWQgdnNjYWxlOiA+PiVkLCAqODE5Mi8lZCwgJWR4JWQgdGlsZXNc
biIsCisJCV9fZnVuY19fLCBoX2Rvd25zaXplX2NvZWZmLCBoX3Jlc2l6ZV9vcHQsIHZfZG93bnNp
emVfY29lZmYsCisJCXZfcmVzaXplX29wdCwgaHRpbGVzLCB2dGlsZXMpOworCisJY3R4ID0ga2Nh
bGxvYyhodGlsZXMgKiB2dGlsZXMsIHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFj
dHgpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJYyA9IGN0eDsKKworCWZvciAoeCA9
IGh0aWxlcyAtIDE7IHggPj0gMDsgeC0tKSB7CisJCWludCBpbl9yaWdodCwgb3V0X3JpZ2h0Owor
CisJCS8qCisJCSAqIFNpbmNlIHdlIHJlbmRlciB0aWxlcyByaWdodCB0byBsZWZ0LCB0aGUgcmln
aHQgZWRnZQorCQkgKiBpcyBhbHJlYWR5IGtub3duLiBEZXBlbmRpbmcgb24gdGlsZSBwb3NpdGlv
biBhbmQKKwkJICogc2NhbGluZyBtb2RlLCB3ZSBtYXkgb3ZlcnNob290IGl0LgorCQkgKi8KKwkJ
aWYgKHggPT0gaHRpbGVzIC0gMSkgeworCQkJb3V0X3JpZ2h0ID0gb3V0LT5yZWN0LmxlZnQgKyBv
dXQtPnJlY3Qud2lkdGg7CisJCQlpbl9yaWdodCA9IGluLT5yZWN0LmxlZnQgKyBpbi0+cmVjdC53
aWR0aDsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBpbWFnZV9jb252ZXJ0X2N0eCAqY19yaWdodCA9
IGMgLSB2dGlsZXM7CisKKwkJCW91dF9yaWdodCA9IGNfcmlnaHQtPm91dC5yZWN0LmxlZnQ7CisJ
CQlpbl9yaWdodCA9IGNfcmlnaHQtPmluLnJlY3QubGVmdDsKKwkJfQorCisJCS8qIE5vdyBkZXRl
cm1pbmUgdGhlIGxlZnQgZWRnZSBvZiB0aGlzIHRpbGUgY29sdW1uICovCisJCWlmICh4ID09IDAp
IHsKKwkJCS8qIEZvciB0aGUgbGVmdG1vc3QgY29sdW1uIHRoaXMgaXMgdHJpdmlhbCAqLworCQkJ
Yy0+b3V0LnJlY3QubGVmdCA9IG91dC0+cmVjdC5sZWZ0OworCQkJYy0+aW4ucmVjdC5sZWZ0ID0g
aW4tPnJlY3QubGVmdDsKKwkJfSBlbHNlIHsKKwkJCWludCBiZXN0X2xlZnQsIGJlc3RfaW5fbGVm
dDsKKwkJCWludCBtaW5fbGVmdCwgbWF4X2xlZnQ7CisJCQlpbnQgbWluX2RpZmYgPSBJTlRfTUFY
OworCisJCQkvKgorCQkJICogRmluZCB0aGUgYmVzdCBwb3NzaWJsZSBsZWZ0IGVkZ2UuIEl0IG11
c3QgYmUgYWRqdXN0ZWQKKwkJCSAqIGFjY29yZGluZyB0byBJRE1BQyBsaW1pdGF0aW9ucywgYW5k
IHNob3VsZCBiZQorCQkJICogY2hvc2VuIHNvIHRoYXQKKwkJCSAqIChpbi0+cmVjdC5sZWZ0ICsg
KGMtPm91dC5yZWN0LmxlZnQgLSBvdXQtPnJlY3QubGVmdCkKKwkJCSAqICAqIGhfcmVzaXplX29w
dCAvICg4MTkyID4+IGhfZG93bnNpemVfY29lZmYpKQorCQkJICogaXMgYXMgY2xvc2UgYXMgcG9z
c2libGUgdG8gYSB2YWxpZCBsZWZ0IGVkZ2UgaW4gdGhlCisJCQkgKiBpbnB1dC4KKwkJCSAqLwor
CQkJbWluX2xlZnQgPSBtYXgoMCwKKwkJCQkgICAgICAgcm91bmRfdXAob3V0X3JpZ2h0IC0gMTAy
NCwgb3V0X2hhbGlnbikpOworCQkJbWF4X2xlZnQgPSBtaW4ocm91bmRfZG93bihvdXRfcmlnaHQs
IG91dF9oYWxpZ24pLAorCQkJCSAgICAgICB4ICogMTAyNCk7CisJCQliZXN0X2xlZnQgPSBtaW5f
bGVmdDsKKwkJCWJlc3RfaW5fbGVmdCA9IChiZXN0X2xlZnQgLSBvdXQtPnJlY3QubGVmdCkgKgor
CQkJCSAgICAgICBoX3Jlc2l6ZV9vcHQ7CisJCQlmb3IgKGxlZnQgPSBtaW5fbGVmdDsgbGVmdCA8
IG1heF9sZWZ0OworCQkJICAgICBsZWZ0ICs9IG91dF9oYWxpZ24pIHsKKwkJCQlpbnQgZGlmZiwg
aW5fbGVmdDsKKworCQkJCS8qCisJCQkJICogSW4gUk9VTkRfVVAgYW5kIFJPVU5EX0RPV04gbW9k
ZXMsIGZvciB0aGUKKwkJCQkgKiByaWdodG1vc3QgY29sdW1uLCBvbmx5IGNvbnNpZGVyIGxlZnQg
ZWRnZXMKKwkJCQkgKiB0aGF0IGFyZSBhIG11bHRpcGxlIG9mIHRoZSBidXJzdCBzaXplIGF3YXkK
KwkJCQkgKiBmcm9tIHRoZSByaWdodCBlZGdlLgorCQkJCSAqLworCQkJCWlmICgoY3RybCAhPSBJ
UFVfSU1BR0VfU0NBTEVfUElYRUxQRVJGRUNUKSAmJgorCQkJCSAgICAoeCA9PSBodGlsZXMgLSAx
KSAmJgorCQkJCSAgICAoKG91dF9yaWdodCAtIGxlZnQpICUgb3V0X2J1cnN0KSkKKwkJCQkJY29u
dGludWU7CisJCQkJaW5fbGVmdCA9IGluLT5yZWN0LmxlZnQgKworCQkJCQkgICgoKGxlZnQgLSBv
dXQtPnJlY3QubGVmdCkgKgorCQkJCQkgICAgaF9yZXNpemVfb3B0KSA8PCBoX2Rvd25zaXplX2Nv
ZWZmKTsKKwkJCQlkaWZmID0gYWJzKGluX2xlZnQgLQorCQkJCQkgICByb3VuZF9jbG9zZXN0KGlu
X2xlZnQsCisJCQkJCQkJIDgxOTIgKiBpbl9oYWxpZ24pKTsKKworCQkJCWlmIChkaWZmIDwgbWlu
X2RpZmYpIHsKKwkJCQkJbWluX2RpZmYgPSBkaWZmOworCQkJCQliZXN0X2xlZnQgPSBsZWZ0Owor
CQkJCQliZXN0X2luX2xlZnQgPSBpbl9sZWZ0OworCQkJCX0KKwkJCX0KKworCQkJYy0+b3V0LnJl
Y3QubGVmdCA9IGJlc3RfbGVmdDsKKwkJCWMtPmluLnJlY3QubGVmdCA9IERJVl9ST1VORF9DTE9T
RVNUKGJlc3RfaW5fbGVmdCwgODE5Mik7CisKKwkJCWRldl9kYmcoaXB1LT5kZXYsCisJCQkJIiVz
OiB0aWxlKCVkLHkpOlx0bGVmdDogJWQgLT4gJWQgKGluc3RlYWQgb2YgJWQuJTA0ZCAtPiAlZCki
LAorCQkJCV9fZnVuY19fLCB4LCBjLT5pbi5yZWN0LmxlZnQsCisJCQkJYy0+b3V0LnJlY3QubGVm
dCwgYmVzdF9pbl9sZWZ0IC8gODE5MiwKKwkJCQkoYmVzdF9pbl9sZWZ0ICUgODE5MikgKiAxMDAw
MCAvIDgxOTIsCisJCQkJb3V0LT5yZWN0LmxlZnQgKworCQkJCURJVl9ST1VORF9DTE9TRVNUKChj
LT5pbi5yZWN0LmxlZnQgLQorCQkJCQkJICAgaW4tPnJlY3QubGVmdCkgKgorCQkJCQkJICAoODE5
MiA+PiBoX2Rvd25zaXplX2NvZWZmKSwKKwkJCQkJCSAgaF9yZXNpemVfb3B0KSk7CisJCX0KKwor
CQkvKiBEZXRlcm1pbmUgdGlsZSB3aWR0aCBmcm9tIGxlZnQgYW5kIHJpZ2h0IGVkZ2VzICovCisJ
CWMtPm91dC5yZWN0LndpZHRoID0gb3V0X3JpZ2h0IC0gYy0+b3V0LnJlY3QubGVmdDsKKwkJYy0+
aW4ucmVjdC53aWR0aCA9IGluX3JpZ2h0IC0gYy0+aW4ucmVjdC5sZWZ0OworCisJCS8qIE5vdyB3
ZSBjYW4gZGV0ZXJtaW5lIHRoZSBhY3R1YWwgcGVyLXRpbGUgc2NhbGluZyBmYWN0b3IgKi8KKwkJ
aWYgKHggPT0gaHRpbGVzIC0gMSkgeworCQkJLyoKKwkJCSAqIFJvdW5kIGRvd24gZm9yIHRoZSBy
aWdodCBjb2x1bW4sIHNpbmNlIHdlCisJCQkgKiBkb24ndCB3YW50IHRvIHJlYWQgYmV5b25kIHRo
ZSByaWdodCBlZGdlLgorCQkJICovCisJCQloX3Jlc2l6ZV9jb2VmZiA9IDgxOTIgKiAoKGMtPmlu
LnJlY3Qud2lkdGggPj4KKwkJCQkJCSBoX2Rvd25zaXplX2NvZWZmKSAtIDEpIC8KKwkJCQkJIChj
LT5vdXQucmVjdC53aWR0aCAtIDEpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFJvdW5kIHRv
IGNsb3Nlc3QgZm9yIHNlYW1zIGJldHdlZW4gdGlsZXMgZm9yCisJCQkgKiBtaW5pbWFsIGRpc3Rv
cnRpb24uCisJCQkgKi8KKwkJCWhfcmVzaXplX2NvZWZmID0gRElWX1JPVU5EX0NMT1NFU1QoODE5
MiAqCisJCQkJCQkJICAgKGMtPmluLnJlY3Qud2lkdGggPj4KKwkJCQkJCQkgICAgaF9kb3duc2l6
ZV9jb2VmZiksCisJCQkJCQkJICAgYy0+b3V0LnJlY3Qud2lkdGgpOworCQl9CisKKwkJLyoKKwkJ
ICogV2l0aCB0aGUgc2NhbGluZyBmYWN0b3Iga25vd24sIHJvdW5kIHVwIG91dHB1dCB3aWR0aAor
CQkgKiB0byBidXJzdCBzaXplLiBJbiBST1VORF9VUCBhbmQgUk9VTkRfRE9XTiBzY2FsaW5nIG1v
ZGUKKwkJICogdGhpcyBpcyBhIG5vLW9wIGZvciB0aGUgcmlnaHQgY29sdW1uLgorCQkgKi8KKwkJ
Yy0+b3V0LnJlY3Qud2lkdGggPSByb3VuZF91cChjLT5vdXQucmVjdC53aWR0aCwgb3V0X2J1cnN0
KTsKKworCQkvKgorCQkgKiBDYWxjdWxhdGUgaW5wdXQgd2lkdGggZnJvbSB0aGUgbGFzdCBhY2Nl
c3NlZCBpbnB1dCBwaXhlbAorCQkgKiBnaXZlbiBvdXRwdXQgd2lkdGggYW5kIHNjYWxpbmcgY29l
ZmZpY2llbnRzLiBSb3VuZCB0bworCQkgKiBidXJzdCBzaXplLgorCQkgKi8KKwkJYy0+aW4ucmVj
dC53aWR0aCA9IChESVZfUk9VTkRfVVAoKGMtPm91dC5yZWN0LndpZHRoIC0gMSkgKgorCQkJCQkJ
IGhfcmVzaXplX2NvZWZmLCA4MTkyKSArIDEpCisJCQkJICAgPDwgaF9kb3duc2l6ZV9jb2VmZjsK
KwkJYy0+aW4ucmVjdC53aWR0aCA9IHJvdW5kX3VwKGMtPmluLnJlY3Qud2lkdGgsIGluX2J1cnN0
KTsKKworCQlmb3IgKHkgPSB2dGlsZXMgLSAxOyB5ID49IDA7IHktLSkgeworCQkJaW50IGluX2Jv
dHRvbSwgb3V0X2JvdHRvbTsKKworCQkJbWVtY3B5KCZjLT5pbi5waXgsICZpbi0+cGl4LAorCQkJ
ICAgICAgc2l6ZW9mKHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQpKTsKKworCQkJaWYgKHkgPT0gdnRp
bGVzIC0gMSkgeworCQkJCW91dF9ib3R0b20gPSBvdXQtPnJlY3QudG9wICsgb3V0LT5yZWN0Lmhl
aWdodDsKKwkJCQlpbl9ib3R0b20gPSBpbi0+cmVjdC50b3AgKyBpbi0+cmVjdC5oZWlnaHQ7CisJ
CQl9IGVsc2UgeworCQkJCXN0cnVjdCBpbWFnZV9jb252ZXJ0X2N0eCAqY19iZWxvdyA9IGMgLSAx
OworCisJCQkJb3V0X2JvdHRvbSA9IGNfYmVsb3ctPm91dC5yZWN0LnRvcDsKKwkJCQlpbl9ib3R0
b20gPSBjX2JlbG93LT5pbi5yZWN0LnRvcDsKKworCQkJCS8qCisJCQkJICogQ29weSBob3Jpem9u
dGFsIHBhcmFtZXRlcnMgZnJvbSB0aGUgdGlsZQorCQkJCSAqIGJlbG93CisJCQkJICovCisJCQkJ
Yy0+b3V0LnJlY3QubGVmdCA9IGNfYmVsb3ctPm91dC5yZWN0LmxlZnQ7CisJCQkJYy0+b3V0LnJl
Y3Qud2lkdGggPSBjX2JlbG93LT5vdXQucmVjdC53aWR0aDsKKwkJCQljLT5pbi5yZWN0LmxlZnQg
PSBjX2JlbG93LT5pbi5yZWN0LmxlZnQ7CisJCQkJYy0+aW4ucmVjdC53aWR0aCA9IGNfYmVsb3ct
PmluLnJlY3Qud2lkdGg7CisJCQl9CisKKwkJCWlmICh5ID09IDApIHsKKwkJCQljLT5vdXQucmVj
dC50b3AgPSBvdXQtPnJlY3QudG9wOworCQkJCWMtPmluLnJlY3QudG9wID0gaW4tPnJlY3QudG9w
OworCQkJfSBlbHNlIHsKKwkJCQlpbnQgYmVzdF90b3AsIGJlc3RfaW5fdG9wOworCQkJCWludCBt
aW5fdG9wLCBtYXhfdG9wOworCQkJCWludCBtaW5fZGlmZiA9IElOVF9NQVg7CisKKwkJCQkvKgor
CQkJCSAqIEZpbmQgdGhlIGJlc3QgcG9zc2libGUgdG9wIGVkZ2UuIEl0IG11c3QgYmUKKwkJCQkg
KiBhZGp1c3RlZCBhY2NvcmRpbmcgdG8gSURNQUMgbGltaXRhdGlvbnMsIGFuZAorCQkJCSAqIHNo
b3VsZCBiZSBjaG9zZW4gc28gdGhhdAorCQkJCSAqIChpbi0+cmVjdC50b3AgKyAoYy0+b3V0LnJl
Y3QudG9wIC0KKwkJCQkgKiAgb3V0LT5yZWN0LnRvcCkgKiB2X3Jlc2l6ZV9vcHQgLworCQkJCSAq
ICg4MTkyID4+IHZfZG93bnNpemVfY29lZmYpKQorCQkJCSAqIGlzIGFzIGNsb3NlIGFzIHBvc3Np
YmxlIHRvIGEgdmFsaWQgdG9wIGVkZ2UKKwkJCQkgKiBpbiB0aGUgaW5wdXQuCisJCQkJICovCisJ
CQkJbWluX3RvcCA9IG1heCgwLAorCQkJCQkgICAgICByb3VuZF91cChvdXRfYm90dG9tIC0gMTAy
NCwKKwkJCQkJCSAgICAgICBvdXRfdmFsaWduKSk7CisJCQkJbWF4X3RvcCA9IG1pbihyb3VuZF9k
b3duKG91dF9ib3R0b20sCisJCQkJCQkJIG91dF9oYWxpZ24pLCB5ICogMTAyNCk7CisJCQkJYmVz
dF90b3AgPSBtaW5fdG9wOworCQkJCWJlc3RfaW5fdG9wID0gKGJlc3RfdG9wIC0gb3V0LT5yZWN0
LnRvcCkgKgorCQkJCQkgICAgICAgdl9yZXNpemVfb3B0OworCQkJCWZvciAodG9wID0gbWluX3Rv
cDsgdG9wIDwgbWF4X3RvcDsKKwkJCQkgICAgIHRvcCArPSBvdXRfdmFsaWduKSB7CisJCQkJCWlu
dCBkaWZmLCBpbl90b3A7CisKKwkJCQkJaW5fdG9wID0gaW4tPnJlY3QudG9wICsKKwkJCQkJCSAo
KCh0b3AgLSBvdXQtPnJlY3QudG9wKSAqCisJCQkJCQkgICB2X3Jlc2l6ZV9vcHQpIDw8CisJCQkJ
CQkgIHZfZG93bnNpemVfY29lZmYpOworCQkJCQlkaWZmID0gYWJzKGluX3RvcCAtCisJCQkJCQkg
ICByb3VuZF9jbG9zZXN0KGluX3RvcCwgODE5MiAqCisJCQkJCQkJCSBpbl92YWxpZ24pKTsKKwor
CQkJCQlpZiAoZGlmZiA8IG1pbl9kaWZmKSB7CisJCQkJCQltaW5fZGlmZiA9IGRpZmY7CisJCQkJ
CQliZXN0X3RvcCA9IHRvcDsKKwkJCQkJCWJlc3RfaW5fdG9wID0gaW5fdG9wOworCQkJCQl9CisJ
CQkJfQorCisJCQkJYy0+b3V0LnJlY3QudG9wID0gYmVzdF90b3A7CisJCQkJYy0+aW4ucmVjdC50
b3AgPSBESVZfUk9VTkRfQ0xPU0VTVChiZXN0X2luX3RvcCwKKwkJCQkJCQkJICAgODE5Mik7CisK
KwkJCQlkZXZfZGJnKGlwdS0+ZGV2LAorCQkJCQkiJXM6IHRpbGUoJWQsJWQpOlx0dG9wOiAlZCAt
PiAlZCAoaW5zdGVhZCBvZiAlZC4lMDRkIC0+ICVkKSIsCisJCQkJCV9fZnVuY19fLCB4LCB5LCBj
LT5pbi5yZWN0LnRvcCwKKwkJCQkJYy0+b3V0LnJlY3QudG9wLCBiZXN0X2luX3RvcCAvIDgxOTIs
CisJCQkJCShiZXN0X2luX3RvcCAlIDgxOTIpICogMTAwMDAgLyA4MTkyLAorCQkJCQlvdXQtPnJl
Y3QudG9wICsKKwkJCQkJRElWX1JPVU5EX0NMT1NFU1QoKGMtPmluLnJlY3QudG9wIC0KKwkJCQkJ
CQkgICBpbi0+cmVjdC50b3ApICogKDgxOTIKKwkJCQkJCQkgID4+IHZfZG93bnNpemVfY29lZmYp
LAorCQkJCQkJCSAgdl9yZXNpemVfb3B0KSk7CisJCQl9CisKKwkJCS8qIERldGVybWluZSB0aWxl
IGhlaWdodCBmcm9tIHRvcCBhbmQgYm90dG9tIGVkZ2VzICovCisJCQljLT5vdXQucmVjdC5oZWln
aHQgPSBvdXRfYm90dG9tIC0gYy0+b3V0LnJlY3QudG9wOworCQkJYy0+aW4ucmVjdC5oZWlnaHQg
PSBpbl9ib3R0b20gLSBjLT5pbi5yZWN0LnRvcDsKKworCQkJLyoKKwkJCSAqIE5vdyB3ZSBjYW4g
ZGV0ZXJtaW5lIHRoZSBhY3R1YWwgdmVydGljYWwgcGVyLXRpbGUKKwkJCSAqIHNjYWxpbmcgZmFj
dG9yCisJCQkgKi8KKwkJCWlmICh5ID09IHZ0aWxlcyAtIDEpIHsKKwkJCQkvKgorCQkJCSAqIFJv
dW5kIGRvd24gZm9yIHRoZSBib3R0b20gcm93LCBzaW5jZSB3ZQorCQkJCSAqIGRvbid0IHdhbnQg
dG8gcmVhZCBiZXlvbmQgdGhlIGxvd2VyIGJvcmRlci4KKwkJCQkgKi8KKwkJCQl2X3Jlc2l6ZV9j
b2VmZiA9IDgxOTIgKiAoKGMtPmluLnJlY3QuaGVpZ2h0ID4+CisJCQkJCQkJIHZfZG93bnNpemVf
Y29lZmYpIC0gMSkKKwkJCQkJCSAvIChjLT5vdXQucmVjdC5oZWlnaHQgLSAxKTsKKwkJCX0gZWxz
ZSB7CisJCQkJLyoKKwkJCQkgKiBSb3VuZCB0byBjbG9zZXN0IGZvciBzZWFtcyBiZXR3ZWVuIHRp
bGVzIGZvcgorCQkJCSAqIG1pbmltYWwgZGlzdG9ydGlvbi4KKwkJCQkgKi8KKwkJCQl2X3Jlc2l6
ZV9jb2VmZiA9IERJVl9ST1VORF9DTE9TRVNUKDgxOTIgKgorCQkJCQkJCShjLT5pbi5yZWN0Lmhl
aWdodCA+PgorCQkJCQkJCSB2X2Rvd25zaXplX2NvZWZmKSwKKwkJCQkJCQljLT5vdXQucmVjdC5o
ZWlnaHQpOworCQkJfQorCisJCQkvKgorCQkJICogV2l0aCB0aGUgc2NhbGluZyBmYWN0b3Iga25v
d24sIHJvdW5kIHVwIG91dHB1dCBoZWlnaHQKKwkJCSAqIHRvIElETUFDIGxpbWl0YXRpb25zCisJ
CQkgKi8KKwkJCWMtPm91dC5yZWN0LmhlaWdodCA9IHJvdW5kX3VwKGMtPm91dC5yZWN0LmhlaWdo
dCwKKwkJCQkJCSAgICAgIG91dF92YWxpZ24pOworCisJCQkvKgorCQkJICogQ2FsY3VsYXRlIGlu
cHV0IGhlaWdodCBmcm9tIHRoZSBsYXN0IGFjY2Vzc2VkIGlucHV0CisJCQkgKiBsaW5lIGdpdmVu
IG91dHB1dCBoZWlnaHQgYW5kIHNjYWxpbmcgY29lZmZpY2llbnRzLgorCQkJICovCisJCQljLT5p
bi5yZWN0LmhlaWdodCA9IChESVZfUk9VTkRfVVAoCisJCQkJCQkoYy0+b3V0LnJlY3QuaGVpZ2h0
IC0gMSkgKgorCQkJCQkJdl9yZXNpemVfY29lZmYsIDgxOTIpICsgMSkKKwkJCQkJICAgIDw8IHZf
ZG93bnNpemVfY29lZmY7CisKKwkJCS8qIGFsaWduIGhlaWdodCBhY2NvcmRpbmcgdG8gSURNQUMg
cmVzdHJpY3Rpb25zICovCisJCQljLT5pbi5yZWN0LmhlaWdodCA9IHJvdW5kX3VwKGMtPmluLnJl
Y3QuaGVpZ2h0LAorCQkJCWluX3ZhbGlnbik7CisKKwkJCW1lbWNweSgmYy0+b3V0LnBpeCwgJm91
dC0+cGl4LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0KSk7CisKKwkJ
CWRldl9kYmcoaXB1LT5kZXYsCisJCQkJIiVzOiB0aWxlKCVkLCVkKTogJWR4JWQoJWR4JWRAJWQs
JWQpIC0+ICVkeCVkKCVkeCVkQCVkLCVkKSwgcmVzaXplOiAlZHglZFxuIiwKKwkJCQlfX2Z1bmNf
XywgeCwgeSwKKwkJCQljLT5pbi5waXgud2lkdGgsIGMtPmluLnBpeC5oZWlnaHQsCisJCQkJYy0+
aW4ucmVjdC53aWR0aCwgYy0+aW4ucmVjdC5oZWlnaHQsCisJCQkJYy0+aW4ucmVjdC5sZWZ0LCBj
LT5pbi5yZWN0LnRvcCwKKwkJCQljLT5vdXQucGl4LndpZHRoLCBjLT5vdXQucGl4LmhlaWdodCwK
KwkJCQljLT5vdXQucmVjdC53aWR0aCwgYy0+b3V0LnJlY3QuaGVpZ2h0LAorCQkJCWMtPm91dC5y
ZWN0LmxlZnQsIGMtPm91dC5yZWN0LnRvcCwKKwkJCQloX3Jlc2l6ZV9jb2VmZiwgdl9yZXNpemVf
Y29lZmYpOworCisJCQljLT5yc2MgPSAodl9kb3duc2l6ZV9jb2VmZiA8PCAzMCkgfAorCQkJCSAo
dl9yZXNpemVfY29lZmYgPDwgMTYpIHwKKwkJCQkgKGhfZG93bnNpemVfY29lZmYgPDwgMTQpIHwK
KwkJCQkgaF9yZXNpemVfY29lZmY7CisKKwkJCWMrKzsKKwkJfQorCX0KKworCSpudW1fdGlsZXMg
PSBodGlsZXMgKiB2dGlsZXM7CisKKwlyZXR1cm4gY3R4OworfQorRVhQT1JUX1NZTUJPTF9HUEwo
aXB1X2ltYWdlX2NvbnZlcnRfcHJlcGFyZSk7CisKK2ludCBpcHVfaW1hZ2VfY29udmVydF9ydW4o
c3RydWN0IGlwdV9zb2MgKmlwdSwgc3RydWN0IGlwdV9pbWFnZSAqaW4sCisJCQkgIHN0cnVjdCBp
cHVfaW1hZ2UgKm91dCwgc3RydWN0IGltYWdlX2NvbnZlcnRfY3R4ICpjdHgsCisJCQkgIGludCBu
dW1fdGlsZXMsIHZvaWQgKCpjb21wbGV0ZSkodm9pZCAqY3R4LCBpbnQgZXJyKSwKKwkJCSAgdm9p
ZCAqY29tcGxldGVfY29udGV4dCwgYm9vbCBmcmVlX2N0eCkKK3sKKwlzdHJ1Y3QgaXB1X2ljX3By
aXYgKnByaXYgPSBpcHUtPmljX3ByaXY7CisJc3RydWN0IGlwdV9pYyAqaWMgPSAmcHJpdi0+dGFz
a1tJQ19UQVNLX1BPU1RfUFJPQ0VTU09SXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBp
OworCisJZm9yIChpID0gMDsgaSA8IG51bV90aWxlczsgaSsrKSB7CisJCWN0eFtpXS5pbi5waHlz
MCA9IGluLT5waHlzMDsKKwkJY3R4W2ldLm91dC5waHlzMCA9IG91dC0+cGh5czA7CisJfQorCWN0
eFtudW1fdGlsZXMgLSAxXS5jb21wbGV0ZSA9IGNvbXBsZXRlOworCWN0eFtudW1fdGlsZXMgLSAx
XS5jb21wbGV0ZV9jb250ZXh0ID0gY29tcGxldGVfY29udGV4dDsKKwlpZiAoZnJlZV9jdHgpCisJ
CWN0eFtudW1fdGlsZXMgLSAxXS5mcmVlcCA9IGN0eDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZw
cml2LT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3RpbGVzOyBpKyspCisJ
CWxpc3RfYWRkX3RhaWwoJmN0eFtpXS5saXN0LCAmaWMtPmltYWdlX2xpc3QpOworCisJcXVldWVf
d29yayhpYy0+d29ya3F1ZXVlLCAmaWMtPndvcmspOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9y
ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQ
TChpcHVfaW1hZ2VfY29udmVydF9ydW4pOworCitzdGF0aWMgaW50IGlwdV9pbWFnZV9jb252ZXJ0
X2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaXB1X3NvYyAqaXB1LAorCQlzdHJ1Y3Qg
aXB1X2ljX3ByaXYgKnByaXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaXB1X2ljICppYyA9IGlw
dV9pY19nZXQoaXB1LCBJQ19UQVNLX1BPU1RfUFJPQ0VTU09SKTsKKwlpbnQgaXJxID0gaXB1X2lk
bWFjX2NoYW5uZWxfaXJxKGlwdSwgaWMtPm91dHB1dF9jaGFubmVsLAorCQkJCQlJUFVfSVJRX0VP
Rik7CisKKwlpYy0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoZGV2
X25hbWUoaXB1LT5kZXYpKTsKKwlpZiAoIWljLT53b3JrcXVldWUpCisJCXJldHVybiAtRU5PTUVN
OworCisJSU5JVF9XT1JLKCZpYy0+d29yaywgaXB1X2ltYWdlX2NvbnZlcnRfd29yayk7CisJaW5p
dF9jb21wbGV0aW9uKCZpYy0+Y29tcGxldGUpOworCisJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVh
ZGVkX2lycShkZXYsIGlycSwgTlVMTCwKKwkJCQlpcHVfaW1hZ2VfY29udmVydF9oYW5kbGVyLAor
CQkJCUlSUUZfT05FU0hPVCwgIklDIFBQIiwgaWMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOwor
CisJcmV0dXJuIDA7CitlcnI6CisJZGVzdHJveV93b3JrcXVldWUoaWMtPndvcmtxdWV1ZSk7CisJ
cmV0dXJuIHJldDsKK30KKwogaW50IGlwdV9pY19lbmFibGUoc3RydWN0IGlwdV9pYyAqaWMpCiB7
CiAJc3RydWN0IGlwdV9pY19wcml2ICpwcml2ID0gaWMtPnByaXY7CkBAIC03MzYsMTIgKzE0NzMs
MzAgQEAgaW50IGlwdV9pY19pbml0KHN0cnVjdCBpcHVfc29jICppcHUsIHN0cnVjdCBkZXZpY2Ug
KmRldiwKIAlwcml2LT5pcHUgPSBpcHU7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSUNfTlVNX1RBU0tT
OyBpKyspIHsKKwkJSU5JVF9MSVNUX0hFQUQoJnByaXYtPnRhc2tbaV0uaW1hZ2VfbGlzdCk7CiAJ
CXByaXYtPnRhc2tbaV0udGFzayA9IGk7CiAJCXByaXYtPnRhc2tbaV0ucHJpdiA9IHByaXY7CiAJ
CXByaXYtPnRhc2tbaV0ucmVnID0gJmljX3Rhc2tfcmVnW2ldOwogCQlwcml2LT50YXNrW2ldLmJp
dCA9ICZpY190YXNrX2JpdFtpXTsKKworCQlwcml2LT50YXNrW2ldLmlucHV0X2NoYW5uZWwgPSBp
cHVfaWRtYWNfZ2V0KGlwdSwKKwkJCQkJCQlpY190YXNrX2NoW2ldLmluKTsKKwkJcHJpdi0+dGFz
a1tpXS5vdXRwdXRfY2hhbm5lbCA9IGlwdV9pZG1hY19nZXQoaXB1LAorCQkJCQkJCWljX3Rhc2tf
Y2hbaV0ub3V0KTsKKwkJcHJpdi0+dGFza1tpXS5yb3RhdGlvbl9pbnB1dF9jaGFubmVsID0gaXB1
X2lkbWFjX2dldChpcHUsCisJCQkJCQkJaWNfdGFza19jaFtpXS5yb3RfaW4pOworCQlwcml2LT50
YXNrW2ldLnJvdGF0aW9uX291dHB1dF9jaGFubmVsID0gaXB1X2lkbWFjX2dldChpcHUsCisJCQkJ
CQkJaWNfdGFza19jaFtpXS5yb3Rfb3V0KTsKKwkJaWYgKGljX3Rhc2tfY2hbaV0uaW5fcHJldikg
eworCQkJcHJpdi0+dGFza1tpXS5pbnB1dF9jaGFubmVsX3AgPSBpcHVfaWRtYWNfZ2V0KGlwdSwK
KwkJCQkJCQlpY190YXNrX2NoW2ldLmluX3ByZXYpOworCQkJcHJpdi0+dGFza1tpXS5pbnB1dF9j
aGFubmVsX24gPSBpcHVfaWRtYWNfZ2V0KGlwdSwKKwkJCQkJCQlpY190YXNrX2NoW2ldLmluX25l
eHQpOworCQl9CiAJfQogCisJaXB1X2ltYWdlX2NvbnZlcnRfaW5pdChkZXYsIGlwdSwgcHJpdik7
CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS92aWRlby9pbXgtaXB1LXYz
LmggYi9pbmNsdWRlL3ZpZGVvL2lteC1pcHUtdjMuaAppbmRleCA0NTk1MDhlLi42ZDk4YTM4IDEw
MDY0NAotLS0gYS9pbmNsdWRlL3ZpZGVvL2lteC1pcHUtdjMuaAorKysgYi9pbmNsdWRlL3ZpZGVv
L2lteC1pcHUtdjMuaApAQCAtMzE2LDcgKzMxNiw4IEBAIGludCBpcHVfaWNfdGFza19pbml0KHN0
cnVjdCBpcHVfaWMgKmljLAogCQkgICAgIGludCBpbl93aWR0aCwgaW50IGluX2hlaWdodCwKIAkJ
ICAgICBpbnQgb3V0X3dpZHRoLCBpbnQgb3V0X2hlaWdodCwKIAkJICAgICBlbnVtIGlwdV9jb2xv
cl9zcGFjZSBpbl9jcywKLQkJICAgICBlbnVtIGlwdV9jb2xvcl9zcGFjZSBvdXRfY3MpOworCQkg
ICAgIGVudW0gaXB1X2NvbG9yX3NwYWNlIG91dF9jcywKKwkJICAgICB1MzIgcnNjKTsKIGludCBp
cHVfaWNfdGFza19ncmFwaGljc19pbml0KHN0cnVjdCBpcHVfaWMgKmljLAogCQkJICAgICAgZW51
bSBpcHVfY29sb3Jfc3BhY2UgaW5fZ19jcywKIAkJCSAgICAgIGJvb2wgZ2FscGhhX2VuLCB1MzIg
Z2FscGhhLApAQCAtMzYyLDQgKzM2MywzNSBAQCBzdHJ1Y3QgaXB1X2NsaWVudF9wbGF0Zm9ybWRh
dGEgewogCWludCBkbWFbMl07CiB9OwogCitlbnVtIGlwdV9pbWFnZV9zY2FsZV9jdHJsIHsKKwlJ
UFVfSU1BR0VfU0NBTEVfUk9VTkRfRE9XTiwKKwlJUFVfSU1BR0VfU0NBTEVfUElYRUxQRVJGRUNU
LAorCUlQVV9JTUFHRV9TQ0FMRV9ST1VORF9VUCwKK307CisKK3N0cnVjdCBpbWFnZV9jb252ZXJ0
X2N0eDsKKworc3RydWN0IGltYWdlX2NvbnZlcnRfY3R4ICppcHVfaW1hZ2VfY29udmVydF9wcmVw
YXJlKHN0cnVjdCBpcHVfc29jICppcHUsCisJCXN0cnVjdCBpcHVfaW1hZ2UgKmluLCBzdHJ1Y3Qg
aXB1X2ltYWdlICpvdXQsCisJCWVudW0gaXB1X2ltYWdlX3NjYWxlX2N0cmwgY3RybCwgaW50ICpu
dW1fdGlsZXMpOworaW50IGlwdV9pbWFnZV9jb252ZXJ0X3J1bihzdHJ1Y3QgaXB1X3NvYyAqaXB1
LCBzdHJ1Y3QgaXB1X2ltYWdlICppbiwKKwkJc3RydWN0IGlwdV9pbWFnZSAqb3V0LCBzdHJ1Y3Qg
aW1hZ2VfY29udmVydF9jdHggKmN0eCwKKwkJaW50IG51bV90aWxlcywgdm9pZCAoKmNvbXBsZXRl
KSh2b2lkICpjdHgsIGludCBlcnIpLAorCQl2b2lkICpjb21wbGV0ZV9jb250ZXh0LCBib29sIGZy
ZWVfY3R4KTsKKworc3RhdGljIGlubGluZSBpbnQgaXB1X2ltYWdlX2NvbnZlcnQoc3RydWN0IGlw
dV9zb2MgKmlwdSwgc3RydWN0IGlwdV9pbWFnZSAqaW4sCisJCXN0cnVjdCBpcHVfaW1hZ2UgKm91
dCwgdm9pZCAoKmNvbXBsZXRlKSh2b2lkICpjdHgsIGludCBlcnIpLAorCQl2b2lkICpjb21wbGV0
ZV9jb250ZXh0LCBlbnVtIGlwdV9pbWFnZV9zY2FsZV9jdHJsIGN0cmwpCit7CisJc3RydWN0IGlt
YWdlX2NvbnZlcnRfY3R4ICpjdHg7CisJaW50IG51bV90aWxlczsKKworCWN0eCA9IGlwdV9pbWFn
ZV9jb252ZXJ0X3ByZXBhcmUoaXB1LCBpbiwgb3V0LCBjdHJsLCAmbnVtX3RpbGVzKTsKKwlpZiAo
SVNfRVJSKGN0eCkpCisJCXJldHVybiBQVFJfRVJSKGN0eCk7CisKKwlyZXR1cm4gaXB1X2ltYWdl
X2NvbnZlcnRfcnVuKGlwdSwgaW4sIG91dCwgY3R4LCBudW1fdGlsZXMsIGNvbXBsZXRlLAorCQkJ
CSAgICAgY29tcGxldGVfY29udGV4dCwgdHJ1ZSk7Cit9CisKICNlbmRpZiAvKiBfX0RSTV9JUFVf
SF9fICovCi0tIAoyLjEuNAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0
b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmkt
ZGV2ZWwK