[patch] io-apic-2.1.98-B

MOLNAR Ingo (mingo@chiara.csoma.elte.hu)
Sun, 26 Apr 1998 23:56:08 +0200 (CEST)


This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.
Send mail to mime@docserver.cac.washington.edu for more info.

---1247997369-587030873-893627768=:26648
Content-Type: TEXT/PLAIN; charset=US-ASCII

On Sun, 26 Apr 1998, David Woodhouse wrote:

> torvalds@transmeta.com said:
> > How about this version? [...]
>
> It seems fine here. I can "make -j bzImage", fork bomb it, grab video to AVI,
> view said video again, and all is well. Even the floppy driver works again.

here it breaks the NE2000 driver. (flood pinging causes interface hang,
this is because IRQs are lost with the counter-less approach)

I've attached a patch against vanilla-2.1.98 that works even on insane
hardware like NE2000 cards and shared PCI devices, survives 30 minutes
heavy flood pinging / disk-IO and other IRQ bombardment practices. It goes
the previous 'counter' way and fixes the send_IPI stuff and completes the
'event model', fixing a few bugs along the way. It works pretty well here,
floppy works too, etc. With the NE2000 driver i've logged situations where
there are several (>2) pending IPIs, mixed with heavy usage of
dis/enable_irq(), and still it all works just fine. [performance is also
ok]

[i've also attached a full irq.c, for those who have hacked their irq.c,
this why i have MIME-attached them]

I've added various comments to key pieces of the code. Probably we dont
need _that_ many counters, but i wanted to have stability first. With this
patch i claim that the IO-APIC code is correct, anything left to be done?
Comments, reports welcome.

-- mingo

---1247997369-587030873-893627768=:26648
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="io-apic-patch-2.1.98-B"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.3.96.980426235608.26648C@chiara.csoma.elte.hu>
Content-Description:

LS0tIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvaXJxLmMub3JpZwlTYXQgTWF5
ICAyIDA3OjU2OjA0IDE5OTgNCisrKyBsaW51eC9hcmNoL2kzODYva2VybmVs
L2lycS5jCVNhdCBNYXkgIDIgMTE6NDU6NTQgMTk5OA0KQEAgLTcxLDcgKzcx
LDEzIEBADQogc3RhdGljIHVuc2lnbmVkIGludCBpcnFfZXZlbnRzIFtOUl9J
UlFTXSA9IHsgLTEsIH07DQogc3RhdGljIGludCBkaXNhYmxlZF9pcnEgW05S
X0lSUVNdID0geyAwLCB9Ow0KICNpZmRlZiBfX1NNUF9fDQotc3RhdGljIGlu
dCBpcGlfcGVuZGluZyBbTlJfSVJRU10gPSB7IDAsIH07DQorLyoNCisgKiB0
aGlzIHdheSB3ZSAnc2h1ZmZsZScgcGVuZGluZyBJUElzIGludG8gdGhlIElS
USBoYW5kbGluZyBwYXRoLg0KKyAqIGNhcmUgaGFzIHRvIGJlIHRha2VuIGFz
IG9ubHkgb25lIENQVSBpcyBhbGxvd2VkIHRvIGJlIGhhbmRsaW5nDQorICog
b25lIHNwZWNpZmljIElSUSBzb3VyY2UuIChvdGhlciBDUFVzIG1pZ2h0IGlu
Y3JlYXNlIHRoZSBldmVudA0KKyAqIGNvdW50ZXIsIGJ1dCBvbmx5IG9uZSBp
cyBhbGxvd2VkIHRvIGhhbmRsZSB0aGVtKQ0KKyAqLw0KK3N0YXRpYyBpbnQg
aXBpc19wZW5kaW5nIFtOUl9JUlFTXSA9IHsgMCwgfTsNCiAjZW5kaWYNCiAN
CiAvKg0KQEAgLTY2OSw2ICs2NzUsNyBAQA0KICAqLw0KIHN0YXRpYyB2b2lk
IGRpc2FibGVfODI1OUFfaXJxKHVuc2lnbmVkIGludCBpcnEpDQogew0KKwlk
aXNhYmxlZF9pcnFbaXJxXSsrOw0KIAljYWNoZWRfaXJxX21hc2sgfD0gMSA8
PCBpcnE7DQogCXNldF84MjU5QV9pcnFfbWFzayhpcnEpOw0KIH0NCkBAIC02
NzYsNyArNjgzLDcgQEANCiAjaWZkZWYgX19TTVBfXw0KIHN0YXRpYyB2b2lk
IGRpc2FibGVfaW9hcGljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQ0KIHsNCi0J
ZGlzYWJsZWRfaXJxW2lycV0gPSAxOw0KKwlkaXNhYmxlZF9pcnFbaXJxXSsr
Ow0KIAkvKg0KIAkgKiBXZSBkbyBub3QgZGlzYWJsZSBJTy1BUElDIGlycXMg
aW4gaGFyZHdhcmUgLi4uDQogCSAqLw0KQEAgLTY4Nyw2ICs2OTQsMTIgQEAN
CiB7DQogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7DQogCXNwaW5fbG9ja19pcnFz
YXZlKCZpcnFfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7DQorCWlmIChkaXNh
YmxlZF9pcnFbaXJxXSkNCisJCWRpc2FibGVkX2lycVtpcnFdLS07DQorCWVs
c2Ugew0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2NvbnRyb2xs
ZXJfbG9jaywgZmxhZ3MpOw0KKwkJcmV0dXJuOw0KKwl9DQogCWNhY2hlZF9p
cnFfbWFzayAmPSB+KDEgPDwgaXJxKTsNCiAJc2V0XzgyNTlBX2lycV9tYXNr
KGlycSk7DQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9jb250cm9s
bGVyX2xvY2ssIGZsYWdzKTsNCkBAIC02OTUsMjQgKzcwOCwzNyBAQA0KICNp
ZmRlZiBfX1NNUF9fDQogdm9pZCBlbmFibGVfaW9hcGljX2lycSAodW5zaWdu
ZWQgaW50IGlycSkNCiB7DQotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHNob3Vs
ZF9oYW5kbGVfaXJxOw0KLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgp
Ow0KKwl1bnNpZ25lZCBsb25nIGZsYWdzOw0KIA0KIAlzcGluX2xvY2tfaXJx
c2F2ZSgmaXJxX2NvbnRyb2xsZXJfbG9jaywgZmxhZ3MpOw0KLQlkaXNhYmxl
ZF9pcnFbaXJxXSA9IDA7DQotDQorCWlmIChkaXNhYmxlZF9pcnFbaXJxXSkN
CisJCWRpc2FibGVkX2lycVtpcnFdLS07DQorCWVsc2Ugew0KKwkJLyoNCisJ
CSAqIHByaW50IGEgd2FybmluZyBoZXJlPw0KKwkJICovDQorCQlzcGluX3Vu
bG9ja19pcnFyZXN0b3JlKCZpcnFfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7
DQorCQlyZXR1cm47DQorCX0NCiAJLyoNCiAJICogSW4gdGhlIFNNUCtJT0FQ
SUMgY2FzZSBpdCBtaWdodCBoYXBwZW4gdGhhdCB0aGVyZSBhcmUgYW4gdW5z
cGVjaWZpZWQNCi0JICogbnVtYmVyIG9mIHBlbmRpbmcgSVJRIGV2ZW50cyB1
bmhhbmRsZWQuIFRoZXNlIGNhc2VzIGFyZSB2ZXJ5IHJhcmUsDQorCSAqIG51
bWJlciBvZiBwZW5kaW5nIElSUSBldmVudHMgdW5oYW5kbGVkLiBUaGVzZSBj
YXNlcyBhcmUgcXVpdGUgcmFyZSwNCiAJICogc28gd2UgJ3Jlc2VuZCcgdGhl
c2UgSVJRcyB2aWEgSVBJcywgdG8gdGhlIHNhbWUgQ1BVLiBJdCdzIG11Y2gN
CiAJICogYmV0dGVyIHRvIGRvIGl0IHRoaXMgd2F5IGFzIHRodXMgd2UgZG9u
dCBoYXZlIHRvIGJlIGF3YXJlIG9mDQotCSAqICdwZW5kaW5nJyBpbnRlcnJ1
cHRzIGluIHRoZSBJUlEgcGF0aCwgZXhjZXB0IGF0IHRoaXMgcG9pbnQuDQor
CSAqICdwZW5kaW5nJyBpbnRlcnJ1cHRzIGluIHRoZSBjbGkvc3RpIHBhdGgu
DQogCSAqLw0KLQlpZiAoaXJxX2V2ZW50c1tpcnFdKSB7DQotCQlpZiAoIWlw
aV9wZW5kaW5nW2lycV0pIHsNCi0JCQlpcGlfcGVuZGluZ1tpcnFdID0gMTsN
Ci0JCQktLWlycV9ldmVudHNbaXJxXTsNCi0JCQlzZW5kX0lQSShjcHUsSU9f
QVBJQ19WRUNUT1IoaXJxKSk7DQorCWlmICghZGlzYWJsZWRfaXJxW2lycV0g
JiYgaXJxX2V2ZW50c1tpcnFdKSB7DQorCQlpZiAoIWlwaXNfcGVuZGluZ1tp
cnFdKSB7DQorCQkJaXBpc19wZW5kaW5nW2lycV0gPSBpcnFfZXZlbnRzW2ly
cV07DQorCQkJaXJxX2V2ZW50c1tpcnFdID0gMDsNCisJCQlzZW5kX0lQSShB
UElDX0RFU1RfU0VMRixJT19BUElDX1ZFQ1RPUihpcnEpKTsNCisJCX0gZWxz
ZSB7DQorCQkJLyoNCisJCQkgKiBzaG91bGQgbmV2ZXIgaGFwcGVuIChhbmQg
aXQgZG9lc250IGhhcHBlbiBmb3IgbWUsDQorCQkJICogZXZlbiB1bmRlciBp
bnNhbmUgbG9hZCB3aXRoIGluc2FuZSBkZXZpY2VzLCBvbiBvbGQNCisJCQkg
KiBoYXJkd2FyZSksIHJlbW92ZSBpbiAyLjINCisJCQkgKi8NCisJCQlwcmlu
dGsoIklQSSAlZCBhbHJlYWR5IHNlbnQ/P1xuIiwgaXJxKTsNCiAJCX0NCiAJ
fQ0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfY29udHJvbGxlcl9s
b2NrLCBmbGFncyk7DQpAQCAtNzc4LDExICs4MDQsMjQgQEANCiAJYWNrX0FQ
SUNfaXJxKCk7DQogDQogCXNwaW5fbG9jaygmaXJxX2NvbnRyb2xsZXJfbG9j
ayk7DQotCWlmIChpcGlfcGVuZGluZ1tpcnFdKQ0KLQkJaXBpX3BlbmRpbmdb
aXJxXSA9IDA7DQotDQotCWlmICghaXJxX2V2ZW50c1tpcnFdKysgJiYgIWRp
c2FibGVkX2lycVtpcnFdKQ0KLQkJc2hvdWxkX2hhbmRsZV9pcnEgPSAxOw0K
KwlpZiAoaXBpc19wZW5kaW5nW2lycV0pIHsNCisJCS8qDQorCQkgKiBzcGVj
aWFsIHNlbGYtZ2VuZXJhdGVkIElQSSwgcGVuZGluZyBldmVudHMgaGF2ZSB0
byBiZQ0KKwkJICogYWRkZWQgdG8gdGhlIGN1cnJlbnQgZXZlbnQgY291bnRl
ciwgYW5kIHdlIHNob3VsZCBzdGFydA0KKwkJICogaGFuZGxpbmcgZXZlbnRz
IGlmIG5vIG90aGVyIENQVSBkb2VzLg0KKwkJICovDQorCQlpZiAoIWlycV9l
dmVudHNbaXJxXSAmJiAhZGlzYWJsZWRfaXJxW2lycV0pDQorCQkJc2hvdWxk
X2hhbmRsZV9pcnEgPSAxOw0KKwkJaXJxX2V2ZW50c1tpcnFdICs9IGlwaXNf
cGVuZGluZ1tpcnFdOw0KKwkJaXBpc19wZW5kaW5nW2lycV0gPSAwOw0KKwl9
IGVsc2Ugew0KKwkJLyoNCisJCSAqIGRldmljZS1nZW5lcmF0ZWQgJ3JlYWwn
IElQSSwgc3RhcnQgZXZlbnQtaGFuZGxpbmcgaWYNCisJCSAqIG5lY2Vzc2Fy
eS4NCisJCSAqLw0KKwkJaWYgKCFpcnFfZXZlbnRzW2lycV0rKyAmJiAhZGlz
YWJsZWRfaXJxW2lycV0pDQorCQkJc2hvdWxkX2hhbmRsZV9pcnEgPSAxOw0K
Kwl9DQogCWhhcmRpcnFfZW50ZXIoY3B1KTsNCiAJc3Bpbl91bmxvY2soJmly
cV9jb250cm9sbGVyX2xvY2spOw0KIA0K
---1247997369-587030873-893627768=:26648
Content-Type: TEXT/plain; name="irq.c"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.3.96.980426235608.26648D@chiara.csoma.elte.hu>
Content-Description:

LyoNCiAqCWxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvaXJxLmMNCiAqDQogKglD
b3B5cmlnaHQgKEMpIDE5OTIsIDE5OTggTGludXMgVG9ydmFsZHMsIEluZ28g
TW9sbmFyDQogKg0KICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHVz
ZWQgYnkgdmFyaW91cyBJUlEgaGFuZGxpbmcgcm91dGluZXM6DQogKiBhc2tp
bmcgZm9yIGRpZmZlcmVudCBJUlEncyBzaG91bGQgYmUgZG9uZSB0aHJvdWdo
IHRoZXNlIHJvdXRpbmVzDQogKiBpbnN0ZWFkIG9mIGp1c3QgZ3JhYmJpbmcg
dGhlbS4gVGh1cyBzZXR1cHMgd2l0aCBkaWZmZXJlbnQgSVJRIG51bWJlcnMN
CiAqIHNob3VsZG4ndCByZXN1bHQgaW4gYW55IHdlaXJkIHN1cnByaXNlcywg
YW5kIGluc3RhbGxpbmcgbmV3IGhhbmRsZXJzDQogKiBzaG91bGQgYmUgZWFz
aWVyLg0KICovDQoNCi8qDQogKiBJUlEncyBhcmUgaW4gZmFjdCBpbXBsZW1l
bnRlZCBhIGJpdCBsaWtlIHNpZ25hbCBoYW5kbGVycyBmb3IgdGhlIGtlcm5l
bC4NCiAqIE5hdHVyYWxseSBpdCdzIG5vdCBhIDE6MSByZWxhdGlvbiwgYnV0
IHRoZXJlIGFyZSBzaW1pbGFyaXRpZXMuDQogKi8NCg0KI2luY2x1ZGUgPGxp
bnV4L3B0cmFjZS5oPg0KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+DQojaW5j
bHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4NCiNpbmNsdWRlIDxsaW51eC9z
aWduYWwuaD4NCiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPg0KI2luY2x1ZGUg
PGxpbnV4L2lvcG9ydC5oPg0KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5o
Pg0KI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+DQojaW5jbHVkZSA8bGludXgv
bWFsbG9jLmg+DQojaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+DQojaW5jbHVk
ZSA8bGludXgvc21wLmg+DQojaW5jbHVkZSA8bGludXgvdGFza3MuaD4NCiNp
bmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPg0KI2luY2x1ZGUgPGxpbnV4L2lu
aXQuaD4NCg0KI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4NCiNpbmNsdWRlIDxh
c20vaW8uaD4NCiNpbmNsdWRlIDxhc20vaXJxLmg+DQojaW5jbHVkZSA8YXNt
L2JpdG9wcy5oPg0KI2luY2x1ZGUgPGFzbS9zbXAuaD4NCiNpbmNsdWRlIDxh
c20vcGd0YWJsZS5oPg0KI2luY2x1ZGUgPGFzbS9kZWxheS5oPg0KDQojaW5j
bHVkZSAiaXJxLmgiDQoNCnVuc2lnbmVkIGludCBsb2NhbF9iaF9jb3VudFtO
Ul9DUFVTXTsNCnVuc2lnbmVkIGludCBsb2NhbF9pcnFfY291bnRbTlJfQ1BV
U107DQoNCmF0b21pY190IG5taV9jb3VudGVyOw0KDQovKg0KICogQWJvdXQg
dGhlIElPLUFQSUMsIHRoZSBhcmNoaXRlY3R1cmUgaXMgJ21lcmdlZCcgaW50
byBvdXINCiAqIGN1cnJlbnQgaXJxIGFyY2hpdGVjdHVyZSwgc2VlbWxlc3Ns
eS4gKGkgaG9wZSkuIEl0IGlzIG9ubHkNCiAqIHZpc2libGUgdGhyb3VnaCA4
IG1vcmUgaGFyZHdhcmUgaW50ZXJydXB0IGxpbmVzLCBidXQgb3RoZXJ3aXNl
DQogKiBkcml2ZXJzIGFyZSB1bmFmZmVjdGVkLiBUaGUgbWFpbiBjb2RlIGlz
IGJlbGlldmVkIHRvIGJlDQogKiBOUl9JUlFTLXNhZmUgKG5vdGhpbmcgYW55
bW9yZSB0aGlua3Mgd2UgaGF2ZSAxNg0KICogaXJxIGxpbmVzIG9ubHkpLCBi
dXQgdGhlcmUgbWlnaHQgYmUgc29tZSBwbGFjZXMgbGVmdCAuLi4NCiAqLw0K
DQovKg0KICogVGhpcyBjb250YWlucyB0aGUgaXJxIG1hc2sgZm9yIGJvdGgg
ODI1OUEgaXJxIGNvbnRyb2xsZXJzLA0KICogYW5kIG9uIFNNUCB0aGUgZXh0
ZW5kZWQgSU8tQVBJQyBJUlFzIDE2LTIzLiBUaGUgSU8tQVBJQw0KICogdXNl
cyB0aGlzIG1hc2sgdG9vLCBpbiBwcm9iZV9pcnEqKCkuDQogKg0KICogKDB4
MDAwMGZmZmYgZm9yIE5SX0lSUVM9PTE2LCAweDAwZmZmZmZmIGZvciBOUl9J
UlFTPTI0KQ0KICovDQpzdGF0aWMgdW5zaWduZWQgaW50IGNhY2hlZF9pcnFf
bWFzayA9ICgxPDxOUl9JUlFTKS0xOw0KDQojZGVmaW5lIGNhY2hlZF8yMQko
KGNhY2hlZF9pcnFfbWFzayB8IGlvX2FwaWNfaXJxcykgJiAweGZmKQ0KI2Rl
ZmluZSBjYWNoZWRfQTEJKCgoY2FjaGVkX2lycV9tYXNrIHwgaW9fYXBpY19p
cnFzKSA+PiA4KSAmIDB4ZmYpDQoNCnNwaW5sb2NrX3QgaXJxX2NvbnRyb2xs
ZXJfbG9jazsNCg0Kc3RhdGljIHVuc2lnbmVkIGludCBpcnFfZXZlbnRzIFtO
Ul9JUlFTXSA9IHsgLTEsIH07DQpzdGF0aWMgaW50IGRpc2FibGVkX2lycSBb
TlJfSVJRU10gPSB7IDAsIH07DQojaWZkZWYgX19TTVBfXw0KLyoNCiAqIHRo
aXMgd2F5IHdlICdzaHVmZmxlJyBwZW5kaW5nIElQSXMgaW50byB0aGUgSVJR
IGhhbmRsaW5nIHBhdGguDQogKiBjYXJlIGhhcyB0byBiZSB0YWtlbiBhcyBv
bmx5IG9uZSBDUFUgaXMgYWxsb3dlZCB0byBiZSBoYW5kbGluZw0KICogb25l
IHNwZWNpZmljIElSUSBzb3VyY2UuIChvdGhlciBDUFVzIG1pZ2h0IGluY3Jl
YXNlIHRoZSBldmVudA0KICogY291bnRlciwgYnV0IG9ubHkgb25lIGlzIGFs
bG93ZWQgdG8gaGFuZGxlIHRoZW0pDQogKi8NCnN0YXRpYyBpbnQgaXBpc19w
ZW5kaW5nIFtOUl9JUlFTXSA9IHsgMCwgfTsNCiNlbmRpZg0KDQovKg0KICog
Tm90IGFsbCBJUlFzIGNhbiBiZSByb3V0ZWQgdGhyb3VnaCB0aGUgSU8tQVBJ
QywgZWcuIG9uIGNlcnRhaW4gKG9sZGVyKQ0KICogYm9hcmRzIHRoZSB0aW1l
ciBpbnRlcnJ1cHQgYW5kIHNvbWV0aW1lcyB0aGUga2V5Ym9hcmQgaW50ZXJy
dXB0IGlzDQogKiBub3QgY29ubmVjdGVkIHRvIGFueSBJTy1BUElDIHBpbiwg
aXQncyBmZWQgdG8gdGhlIENQVSBFeHRJbnQgSVJRIGxpbmUNCiAqIGRpcmVj
dGx5Lg0KICoNCiAqIEFueSAnMScgYml0IGluIHRoaXMgbWFzayBtZWFucyB0
aGUgSVJRIGlzIHJvdXRlZCB0aHJvdWdoIHRoZSBJTy1BUElDLg0KICogdGhp
cyAnbWl4ZWQgbW9kZScgSVJRIGhhbmRsaW5nIGNvc3RzIHVzIG9uZSBtb3Jl
IGJyYW5jaCBpbiBkb19JUlEsDQogKiBidXQgd2UgaGF2ZSBfbXVjaF8gaGln
aGVyIGNvbXBhdGliaWxpdHkgYW5kIHJvYnVzdG5lc3MgdGhpcyB3YXkuDQog
Ki8NCg0KLyoNCiAqIERlZmF1bHQgdG8gYWxsIG5vcm1hbCBJUlEncyBfbm90
XyB1c2luZyB0aGUgSU8gQVBJQy4NCiAqDQogKiBUbyBnZXQgSU8tQVBJQyBp
bnRlcnJ1cHRzIHlvdSBzaG91bGQgZWl0aGVyOg0KICogIC0gdHVybiBzb21l
IG9mIHRoZW0gaW50byBJTy1BUElDIGludGVycnVwdHMgYXQgcnVudGltZQ0K
ICogICAgd2l0aCBzb21lIG1hZ2ljIHN5c3RlbSBjYWxsIGludGVyZmFjZS4N
CiAqICAtIGV4cGxpY2l0bHkgdXNlIGlycSAxNi0xOSBkZXBlbmRpbmcgb24g
d2hpY2ggUENJIGlycQ0KICogICAgbGluZSB5b3VyIFBDSSBjb250cm9sbGVy
IHVzZXMuDQogKi8NCnVuc2lnbmVkIGludCBpb19hcGljX2lycXMgPSAwOw0K
DQpzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgew0KCXZvaWQgKCpoYW5kbGUp
KHVuc2lnbmVkIGludCBpcnEsIGludCBjcHUsIHN0cnVjdCBwdF9yZWdzICog
cmVncyk7DQoJdm9pZCAoKmVuYWJsZSkodW5zaWduZWQgaW50IGlycSk7DQoJ
dm9pZCAoKmRpc2FibGUpKHVuc2lnbmVkIGludCBpcnEpOw0KfTsNCg0KDQpz
dGF0aWMgdm9pZCBkb184MjU5QV9JUlEgKHVuc2lnbmVkIGludCBpcnEsIGlu
dCBjcHUsIHN0cnVjdCBwdF9yZWdzICogcmVncyk7DQpzdGF0aWMgdm9pZCBl
bmFibGVfODI1OUFfaXJxICh1bnNpZ25lZCBpbnQgaXJxKTsNCnN0YXRpYyB2
b2lkIGRpc2FibGVfODI1OUFfaXJxICh1bnNpZ25lZCBpbnQgaXJxKTsNCg0K
c3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpODI1OUFfaXJxX3R5
cGUgPSB7DQoJZG9fODI1OUFfSVJRLA0KCWVuYWJsZV84MjU5QV9pcnEsDQoJ
ZGlzYWJsZV84MjU5QV9pcnENCn07DQoNCg0KI2lmZGVmIF9fU01QX18NCnN0
YXRpYyB2b2lkIGRvX2lvYXBpY19JUlEgKHVuc2lnbmVkIGludCBpcnEsIGlu
dCBjcHUsIHN0cnVjdCBwdF9yZWdzICogcmVncyk7DQpzdGF0aWMgdm9pZCBl
bmFibGVfaW9hcGljX2lycSAodW5zaWduZWQgaW50IGlycSk7DQpzdGF0aWMg
dm9pZCBkaXNhYmxlX2lvYXBpY19pcnEgKHVuc2lnbmVkIGludCBpcnEpOw0K
DQpzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlvYXBpY19pcnFf
dHlwZSA9IHsNCglkb19pb2FwaWNfSVJRLA0KCWVuYWJsZV9pb2FwaWNfaXJx
LA0KCWRpc2FibGVfaW9hcGljX2lycQ0KfTsNCiNlbmRpZg0KDQpzdHJ1Y3Qg
aHdfaW50ZXJydXB0X3R5cGUgKmlycV9oYW5kbGVzW05SX0lSUVNdID0NCnsN
CglbMCAuLi4gMTVdID0gJmk4MjU5QV9pcnFfdHlwZQkJCS8qIHN0YW5kYXJk
IElTQSBJUlFzICovDQojaWZkZWYgX19TTVBfXw0KCSwgWzE2IC4uLiBOUl9J
UlFTLTFdID0gJmlvYXBpY19pcnFfdHlwZQkJLyogJ2hpZ2gnIFBDSSBJUlFz
ICovDQojZW5kaWYNCn07DQoNCg0KLyoNCiAqIFRoZXNlIGhhdmUgdG8gYmUg
cHJvdGVjdGVkIGJ5IHRoZSBpcnEgY29udHJvbGxlciBzcGlubG9jaw0KICog
YmVmb3JlIGJlaW5nIGNhbGxlZC4NCiAqLw0KDQpzdGF0aWMgaW5saW5lIHZv
aWQgbWFza184MjU5QSh1bnNpZ25lZCBpbnQgaXJxKQ0Kew0KCWNhY2hlZF9p
cnFfbWFzayB8PSAxIDw8IGlycTsNCglpZiAoaXJxICYgOCkgew0KCQlvdXRi
KGNhY2hlZF9BMSwweEExKTsNCgl9IGVsc2Ugew0KCQlvdXRiKGNhY2hlZF8y
MSwweDIxKTsNCgl9DQp9DQoNCnN0YXRpYyBpbmxpbmUgdm9pZCB1bm1hc2tf
ODI1OUEodW5zaWduZWQgaW50IGlycSkNCnsNCgljYWNoZWRfaXJxX21hc2sg
Jj0gfigxIDw8IGlycSk7DQoJaWYgKGlycSAmIDgpIHsNCgkJb3V0YihjYWNo
ZWRfQTEsMHhBMSk7DQoJfSBlbHNlIHsNCgkJb3V0YihjYWNoZWRfMjEsMHgy
MSk7DQoJfQ0KfQ0KDQp2b2lkIHNldF84MjU5QV9pcnFfbWFzayh1bnNpZ25l
ZCBpbnQgaXJxKQ0Kew0KCS8qDQoJICogKGl0IG1pZ2h0IGhhcHBlbiB0aGF0
IHdlIHNlZSBJUlE+MTUgb24gYSBVUCBib3gsIHdpdGggU01QDQoJICogZW11
bGF0aW9uKQ0KCSAqLw0KCWlmIChpcnEgPCAxNikgew0KCQlpZiAoaXJxICYg
OCkgew0KCQkJb3V0YihjYWNoZWRfQTEsMHhBMSk7DQoJCX0gZWxzZSB7DQoJ
CQlvdXRiKGNhY2hlZF8yMSwweDIxKTsNCgkJfQ0KCX0NCn0NCg0Kdm9pZCB1
bm1hc2tfZ2VuZXJpY19pcnEodW5zaWduZWQgaW50IGlycSkNCnsNCglpZiAo
SU9fQVBJQ19JUlEoaXJxKSkNCgkJZW5hYmxlX0lPX0FQSUNfaXJxKGlycSk7
DQoJZWxzZSB7DQoJCWNhY2hlZF9pcnFfbWFzayAmPSB+KDEgPDwgaXJxKTsN
CgkJc2V0XzgyNTlBX2lycV9tYXNrKGlycSk7DQoJfQ0KfQ0KDQovKg0KICog
VGhpcyBidWlsZHMgdXAgdGhlIElSUSBoYW5kbGVyIHN0dWJzIHVzaW5nIHNv
bWUgdWdseSBtYWNyb3MgaW4gaXJxLmgNCiAqDQogKiBUaGVzZSBtYWNyb3Mg
Y3JlYXRlIHRoZSBsb3ctbGV2ZWwgYXNzZW1ibHkgSVJRIHJvdXRpbmVzIHRo
YXQgc2F2ZQ0KICogcmVnaXN0ZXIgY29udGV4dCBhbmQgY2FsbCBkb19JUlEo
KS4gZG9fSVJRKCkgdGhlbiBkb2VzIGFsbCB0aGUNCiAqIG9wZXJhdGlvbnMg
dGhhdCBhcmUgbmVlZGVkIHRvIGtlZXAgdGhlIEFUIChvciBTTVAgSU9BUElD
KQ0KICogaW50ZXJydXB0LWNvbnRyb2xsZXIgaGFwcHkuDQogKi8NCg0KDQpC
VUlMRF9DT01NT05fSVJRKCkNCi8qDQogKiBJU0EgUElDIG9yIElPLUFQSUMg
dHJpZ2dlcmVkIChJTlRBLWN5Y2xlIG9yIEFQSUMpIGludGVycnVwdHM6DQog
Ki8NCkJVSUxEX0lSUSgwKSBCVUlMRF9JUlEoMSkgQlVJTERfSVJRKDIpIEJV
SUxEX0lSUSgzKQ0KQlVJTERfSVJRKDQpIEJVSUxEX0lSUSg1KSBCVUlMRF9J
UlEoNikgQlVJTERfSVJRKDcpDQpCVUlMRF9JUlEoOCkgQlVJTERfSVJRKDkp
IEJVSUxEX0lSUSgxMCkgQlVJTERfSVJRKDExKQ0KQlVJTERfSVJRKDEyKSBC
VUlMRF9JUlEoMTMpIEJVSUxEX0lSUSgxNCkgQlVJTERfSVJRKDE1KQ0KDQoj
aWZkZWYgX19TTVBfXw0KDQovKg0KICogVGhlIElPLUFQSUMgKHByZXNlbnQg
b25seSBpbiBTTVAgYm9hcmRzKSBoYXMgOCBtb3JlIGhhcmR3YXJlDQogKiBp
bnRlcnJ1cHQgcGlucywgZm9yIGFsbCBvZiB0aGVtIHdlIGRlZmluZSBhbiBJ
UlEgdmVjdG9yOg0KICoNCiAqIHJhdyBQQ0kgaW50ZXJydXB0cyAwLTMsIGJh
c2ljYWxseSB0aGVzZSBhcmUgdGhlIG9uZXMgdXNlZA0KICogaGVhdmlseToN
CiAqLw0KQlVJTERfSVJRKDE2KSBCVUlMRF9JUlEoMTcpIEJVSUxEX0lSUSgx
OCkgQlVJTERfSVJRKDE5KQ0KDQovKg0KICogW0ZJWE1FOiBhbnlvbmUgd2l0
aCAyIHNlcGFyYXRlIFBDSSBidXNlcyBhbmQgMiBJTy1BUElDcywgcGxlYXNl
DQogKgkgICBzcGVhayB1cCBpZiBwcm9ibGVtcyBhbmQgcmVxdWVzdCBleHBl
cmltZW50YWwgcGF0Y2hlcy4NCiAqICAgICAgICAgLS1taW5nbyBdDQogKi8N
Cg0KLyoNCiAqIE1JUlEgKG1vdGhlcmJvYXJkIElSUSkgaW50ZXJydXB0cyAw
LTE6DQogKi8NCkJVSUxEX0lSUSgyMCkgQlVJTERfSVJRKDIxKQ0KDQovKg0K
ICogJ25vbmRlZmluZWQgZ2VuZXJhbCBwdXJwb3NlIGludGVycnVwdCcuDQog
Ki8NCkJVSUxEX0lSUSgyMikNCi8qDQogKiBvcHRpb25hbGx5IHJlcm91dGVk
IFNNSSBpbnRlcnJ1cHQ6DQogKi8NCkJVSUxEX0lSUSgyMykNCg0KLyoNCiAq
IFRoZSBmb2xsb3dpbmcgdmVjdG9ycyBhcmUgcGFydCBvZiB0aGUgTGludXgg
YXJjaGl0ZWN0dXJlLCB0aGVyZQ0KICogaXMgbm8gaGFyZHdhcmUgSVJRIHBp
biBlcXVpdmFsZW50IGZvciB0aGVtLCB0aGV5IGFyZSB0cmlnZ2VyZWQNCiAq
IHRocm91Z2ggdGhlIElDQyBieSB1cyAoSVBJcyksIHZpYSBzbXBfbWVzc2Fn
ZV9wYXNzKCk6DQogKi8NCkJVSUxEX1NNUF9JTlRFUlJVUFQocmVzY2hlZHVs
ZV9pbnRlcnJ1cHQpDQpCVUlMRF9TTVBfSU5URVJSVVBUKGludmFsaWRhdGVf
aW50ZXJydXB0KQ0KQlVJTERfU01QX0lOVEVSUlVQVChzdG9wX2NwdV9pbnRl
cnJ1cHQpDQoNCi8qDQogKiBldmVyeSBwZW50aXVtIGxvY2FsIEFQSUMgaGFz
IHR3byAnbG9jYWwgaW50ZXJydXB0cycsIHdpdGggYQ0KICogc29mdC1kZWZp
bmFibGUgdmVjdG9yIGF0dGFjaGVkIHRvIGJvdGggaW50ZXJydXB0cywgb25l
IG9mDQogKiB3aGljaCBpcyBhIHRpbWVyIGludGVycnVwdCwgdGhlIG90aGVy
IG9uZSBpcyBlcnJvciBjb3VudGVyDQogKiBvdmVyZmxvdy4gTGludXggdXNl
cyB0aGUgbG9jYWwgQVBJQyB0aW1lciBpbnRlcnJ1cHQgdG8gZ2V0DQogKiBh
IG11Y2ggc2ltcGxlciBTTVAgdGltZSBhcmNoaXRlY3R1cmU6DQogKi8NCkJV
SUxEX1NNUF9USU1FUl9JTlRFUlJVUFQoYXBpY190aW1lcl9pbnRlcnJ1cHQp
DQoNCiNlbmRpZg0KDQpzdGF0aWMgdm9pZCAoKmludGVycnVwdFtOUl9JUlFT
XSkodm9pZCkgPSB7DQoJSVJRMF9pbnRlcnJ1cHQsIElSUTFfaW50ZXJydXB0
LCBJUlEyX2ludGVycnVwdCwgSVJRM19pbnRlcnJ1cHQsDQoJSVJRNF9pbnRl
cnJ1cHQsIElSUTVfaW50ZXJydXB0LCBJUlE2X2ludGVycnVwdCwgSVJRN19p
bnRlcnJ1cHQsDQoJSVJROF9pbnRlcnJ1cHQsIElSUTlfaW50ZXJydXB0LCBJ
UlExMF9pbnRlcnJ1cHQsIElSUTExX2ludGVycnVwdCwNCglJUlExMl9pbnRl
cnJ1cHQsIElSUTEzX2ludGVycnVwdCwgSVJRMTRfaW50ZXJydXB0LCBJUlEx
NV9pbnRlcnJ1cHQNCiNpZmRlZiBfX1NNUF9fDQoJLElSUTE2X2ludGVycnVw
dCwgSVJRMTdfaW50ZXJydXB0LCBJUlExOF9pbnRlcnJ1cHQsIElSUTE5X2lu
dGVycnVwdCwNCglJUlEyMF9pbnRlcnJ1cHQsIElSUTIxX2ludGVycnVwdCwg
SVJRMjJfaW50ZXJydXB0LCBJUlEyM19pbnRlcnJ1cHQNCiNlbmRpZg0KfTsN
Cg0KLyoNCiAqIEluaXRpYWwgaXJxIGhhbmRsZXJzLg0KICovDQoNCnN0YXRp
YyB2b2lkIG5vX2FjdGlvbihpbnQgY3BsLCB2b2lkICpkZXZfaWQsIHN0cnVj
dCBwdF9yZWdzICpyZWdzKSB7IH0NCg0KLyoNCiAqIE5vdGUgdGhhdCBvbiBh
IDQ4Niwgd2UgZG9uJ3Qgd2FudCB0byBkbyBhIFNJR0ZQRSBvbiBhbiBpcnEx
Mw0KICogYXMgdGhlIGlycSBpcyB1bnJlbGlhYmxlLCBhbmQgZXhjZXB0aW9u
IDE2IHdvcmtzIGNvcnJlY3RseQ0KICogKGllIGFzIGV4cGxhaW5lZCBpbiB0
aGUgaW50ZWwgbGl0ZXJhdHVyZSkuIE9uIGEgMzg2LCB5b3UNCiAqIGNhbid0
IHVzZSBleGNlcHRpb24gMTYgZHVlIHRvIGJhZCBJQk0gZGVzaWduLCBzbyB3
ZSBoYXZlIHRvDQogKiByZWx5IG9uIHRoZSBsZXNzIGV4YWN0IGlycTEzLg0K
ICoNCiAqIENhcmVmdWwuLiBOb3Qgb25seSBpcyBJUlExMyB1bnJlbGlhYmxl
LCBidXQgaXQgaXMgYWxzbw0KICogbGVhZHMgdG8gcmFjZXMuIElCTSBkZXNp
Z25lcnMgd2hvIGNhbWUgdXAgd2l0aCBpdCBzaG91bGQNCiAqIGJlIHNob3Qu
DQogKi8NCiANCnN0YXRpYyB2b2lkIG1hdGhfZXJyb3JfaXJxKGludCBjcGws
IHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpDQp7DQoJb3V0
YigwLDB4RjApOw0KCWlmIChpZ25vcmVfaXJxMTMgfHwgIWJvb3RfY3B1X2Rh
dGEuaGFyZF9tYXRoKQ0KCQlyZXR1cm47DQoJbWF0aF9lcnJvcigpOw0KfQ0K
DQpzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpcnExMyA9IHsgbWF0aF9lcnJv
cl9pcnEsIDAsIDAsICJmcHUiLCBOVUxMLCBOVUxMIH07DQoNCi8qDQogKiBJ
UlEyIGlzIGNhc2NhZGUgaW50ZXJydXB0IHRvIHNlY29uZCBpbnRlcnJ1cHQg
Y29udHJvbGxlcg0KICovDQpzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpcnEy
ICA9IHsgbm9fYWN0aW9uLCAwLCAwLCAiY2FzY2FkZSIsIE5VTEwsIE5VTEx9
Ow0KDQpzdGF0aWMgc3RydWN0IGlycWFjdGlvbiAqaXJxX2FjdGlvbltOUl9J
UlFTXSA9IHsNCglOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLA0KCU5VTEwsIE5V
TEwsIE5VTEwsIE5VTEwsDQoJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwNCglO
VUxMLCBOVUxMLCBOVUxMLCBOVUxMDQojaWZkZWYgX19TTVBfXw0KCSxOVUxM
LCBOVUxMLCBOVUxMLCBOVUxMLA0KCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwN
CiNlbmRpZg0KfTsNCg0KaW50IGdldF9pcnFfbGlzdChjaGFyICpidWYpDQp7
DQoJaW50IGksIGo7DQoJc3RydWN0IGlycWFjdGlvbiAqIGFjdGlvbjsNCglj
aGFyICpwID0gYnVmOw0KDQoJcCArPSBzcHJpbnRmKHAsICIgICAgICAgICAg
ICIpOw0KCWZvciAoaj0wOyBqPHNtcF9udW1fY3B1czsgaisrKQ0KCQlwICs9
IHNwcmludGYocCwgIkNQVSVkICAgICAgICIsaik7DQoJKnArKyA9ICdcbic7
DQoNCglmb3IgKGkgPSAwIDsgaSA8IE5SX0lSUVMgOyBpKyspIHsNCgkJYWN0
aW9uID0gaXJxX2FjdGlvbltpXTsNCgkJaWYgKCFhY3Rpb24pIA0KCQkJY29u
dGludWU7DQoJCXAgKz0gc3ByaW50ZihwLCAiJTNkOiAiLGkpOw0KI2lmbmRl
ZiBfX1NNUF9fDQoJCXAgKz0gc3ByaW50ZihwLCAiJTEwdSAiLCBrc3RhdF9p
cnFzKGkpKTsNCiNlbHNlDQoJCWZvciAoaj0wOyBqPHNtcF9udW1fY3B1czsg
aisrKQ0KCQkJcCArPSBzcHJpbnRmKHAsICIlMTB1ICIsDQoJCQkJa3N0YXQu
aXJxc1tjcHVfbG9naWNhbF9tYXAoaildW2ldKTsNCiNlbmRpZg0KDQoJCWlm
IChJT19BUElDX0lSUShpKSkNCgkJCXAgKz0gc3ByaW50ZihwLCAiIElPLUFQ
SUMgIik7DQoJCWVsc2UNCgkJCXAgKz0gc3ByaW50ZihwLCAiICBYVC1QSUMg
Iik7DQoJCXAgKz0gc3ByaW50ZihwLCAiICAlcyIsIGFjdGlvbi0+bmFtZSk7
DQoNCgkJZm9yIChhY3Rpb249YWN0aW9uLT5uZXh0OyBhY3Rpb247IGFjdGlv
biA9IGFjdGlvbi0+bmV4dCkgew0KCQkJcCArPSBzcHJpbnRmKHAsICIsICVz
IiwgYWN0aW9uLT5uYW1lKTsNCgkJfQ0KCQkqcCsrID0gJ1xuJzsNCgl9DQoJ
cCArPSBzcHJpbnRmKHAsICJOTUk6ICUxMHVcbiIsIGF0b21pY19yZWFkKCZu
bWlfY291bnRlcikpOw0KI2lmZGVmIF9fU01QX18NCglwICs9IHNwcmludGYo
cCwgIklQSTogJTEwbHVcbiIsIGlwaV9jb3VudCk7DQojZW5kaWYJCQ0KCXJl
dHVybiBwIC0gYnVmOw0KfQ0KDQovKg0KICogR2xvYmFsIGludGVycnVwdCBs
b2NrcyBmb3IgU01QLiBBbGxvdyBpbnRlcnJ1cHRzIHRvIGNvbWUgaW4gb24g
YW55DQogKiBDUFUsIHlldCBtYWtlIGNsaS9zdGkgYWN0IGdsb2JhbGx5IHRv
IHByb3RlY3QgY3JpdGljYWwgcmVnaW9ucy4uDQogKi8NCiNpZmRlZiBfX1NN
UF9fDQp1bnNpZ25lZCBjaGFyIGdsb2JhbF9pcnFfaG9sZGVyID0gTk9fUFJP
Q19JRDsNCnVuc2lnbmVkIHZvbGF0aWxlIGludCBnbG9iYWxfaXJxX2xvY2s7
DQphdG9taWNfdCBnbG9iYWxfaXJxX2NvdW50Ow0KDQphdG9taWNfdCBnbG9i
YWxfYmhfY291bnQ7DQphdG9taWNfdCBnbG9iYWxfYmhfbG9jazsNCg0KLyoN
CiAqICJnbG9iYWxfY2xpKCkiIGlzIGEgc3BlY2lhbCBjYXNlLCBpbiB0aGF0
IGl0IGNhbiBob2xkIHRoZQ0KICogaW50ZXJydXB0cyBkaXNhYmxlZCBmb3Ig
YSBsb25naXNoIHRpbWUsIGFuZCBhbHNvIGJlY2F1c2UNCiAqIHdlIG1heSBi
ZSBkb2luZyBUTEIgaW52YWxpZGF0ZXMgd2hlbiBob2xkaW5nIHRoZSBnbG9i
YWwNCiAqIElSUSBsb2NrIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuIFRodXMg
d2UgbWF5IG5lZWQgdG8gY2hlY2sNCiAqIFNNUCBpbnZhbGlkYXRlIGV2ZW50
cyBzcGVjaWFsbHkgYnkgaGFuZCBoZXJlIChidXQgbm90IGluDQogKiBhbnkg
bm9ybWFsIHNwaW5sb2NrcykNCiAqLw0Kc3RhdGljIGlubGluZSB2b2lkIGNo
ZWNrX3NtcF9pbnZhbGlkYXRlKGludCBjcHUpDQp7DQoJaWYgKHRlc3RfYml0
KGNwdSwgJnNtcF9pbnZhbGlkYXRlX25lZWRlZCkpIHsNCgkJY2xlYXJfYml0
KGNwdSwgJnNtcF9pbnZhbGlkYXRlX25lZWRlZCk7DQoJCWxvY2FsX2ZsdXNo
X3RsYigpOw0KCX0NCn0NCg0Kc3RhdGljIHZvaWQgc2hvdyhjaGFyICogc3Ry
KQ0Kew0KCWludCBpOw0KCXVuc2lnbmVkIGxvbmcgKnN0YWNrOw0KCWludCBj
cHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7DQoNCglwcmludGsoIlxuJXMsIENQ
VSAlZDpcbiIsIHN0ciwgY3B1KTsNCglwcmludGsoImlycTogICVkIFslZCAl
ZF1cbiIsDQoJCWF0b21pY19yZWFkKCZnbG9iYWxfaXJxX2NvdW50KSwgbG9j
YWxfaXJxX2NvdW50WzBdLCBsb2NhbF9pcnFfY291bnRbMV0pOw0KCXByaW50
aygiYmg6ICAgJWQgWyVkICVkXVxuIiwNCgkJYXRvbWljX3JlYWQoJmdsb2Jh
bF9iaF9jb3VudCksIGxvY2FsX2JoX2NvdW50WzBdLCBsb2NhbF9iaF9jb3Vu
dFsxXSk7DQoJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKSAmc3RyOw0KCWZv
ciAoaSA9IDQwOyBpIDsgaS0tKSB7DQoJCXVuc2lnbmVkIGxvbmcgeCA9ICor
K3N0YWNrOw0KCQlpZiAoeCA+ICh1bnNpZ25lZCBsb25nKSAmaW5pdF90YXNr
X3VuaW9uICYmIHggPCAodW5zaWduZWQgbG9uZykgJnZzcHJpbnRmKSB7DQoJ
CQlwcmludGsoIjxbJTA4bHhdPiAiLCB4KTsNCgkJfQ0KCX0NCn0NCgkNCg0K
I2RlZmluZSBNQVhDT1VOVCAxMDAwMDAwMDANCg0Kc3RhdGljIGlubGluZSB2
b2lkIHdhaXRfb25fYmgodm9pZCkNCnsNCglpbnQgY291bnQgPSBNQVhDT1VO
VDsNCglkbyB7DQoJCWlmICghLS1jb3VudCkgew0KCQkJc2hvdygid2FpdF9v
bl9iaCIpOw0KCQkJY291bnQgPSB+MDsNCgkJfQ0KCQkvKiBub3RoaW5nIC4u
IHdhaXQgZm9yIHRoZSBvdGhlciBiaCdzIHRvIGdvIGF3YXkgKi8NCgl9IHdo
aWxlIChhdG9taWNfcmVhZCgmZ2xvYmFsX2JoX2NvdW50KSAhPSAwKTsNCn0N
Cg0KLyoNCiAqIEkgaGFkIGEgbG9ja3VwIHNjZW5hcmlvIHdoZXJlIGEgdGln
aHQgbG9vcCBkb2luZw0KICogc3Bpbl91bmxvY2soKS9zcGluX2xvY2soKSBv
biBDUFUjMSB3YXMgcmFjaW5nIHdpdGgNCiAqIHNwaW5fbG9jaygpIG9uIENQ
VSMwLiBDUFUjMCBzaG91bGQgaGF2ZSBub3RpY2VkIHNwaW5fdW5sb2NrKCks
IGJ1dA0KICogYXBwYXJlbnRseSB0aGUgc3Bpbl91bmxvY2soKSBpbmZvcm1h
dGlvbiBkaWQgbm90IG1ha2UgaXQNCiAqIHRocm91Z2ggdG8gQ1BVIzAgLi4u
IG5hc3R5LCBpcyB0aGlzIGJ5IGRlc2lnbiwgZG8gd2UgaGF2ZSB0byBsaW1p
dA0KICogJ21lbW9yeSB1cGRhdGUgb3NjaWxsYXRpb24gZnJlcXVlbmN5JyBh
cnRpZmljaWFsbHkgbGlrZSBoZXJlPw0KICoNCiAqIFN1Y2ggJ2hpZ2ggZnJl
cXVlbmN5IHVwZGF0ZScgcmFjZXMgY2FuIGJlIGF2b2lkZWQgYnkgY2FyZWZ1
bCBkZXNpZ24sIGJ1dA0KICogc29tZSBvZiBvdXIgbWFqb3IgY29uc3RydWN0
cyBsaWtlIHNwaW5sb2NrcyB1c2Ugc2ltaWxhciB0ZWNobmlxdWVzLA0KICog
aXQgd291bGQgYmUgbmljZSB0byBjbGFyaWZ5IHRoaXMgaXNzdWUuIFNldCB0
aGlzIGRlZmluZSB0byAwIGlmIHlvdQ0KICogd2FudCB0byBjaGVjayB3ZXRo
ZXIgeW91ciBzeXN0ZW0gZnJlZXplcy4gSSBzdXNwZWN0IHRoZSBkZWxheSBk
b25lDQogKiBieSBTWU5DX09USEVSX0NPUkVTKCkgaXMgaW4gY29ycmVsYXRp
b24gd2l0aCAnc25vb3BpbmcgbGF0ZW5jeScsIGJ1dA0KICogaSB0aG91Z2h0
IHRoYXQgc3VjaCB0aGluZ3MgYXJlIGd1YXJhbnRlZWQgYnkgZGVzaWduLCBz
aW5jZSB3ZSB1c2UNCiAqIHRoZSAnTE9DSycgcHJlZml4Lg0KICovDQojZGVm
aW5lIFNVU1BFQ1RFRF9DUFVfT1JfQ0hJUFNFVF9CVUdfV09SS0FST1VORCAx
DQoNCiNpZiBTVVNQRUNURURfQ1BVX09SX0NISVBTRVRfQlVHX1dPUktBUk9V
TkQNCiMgZGVmaW5lIFNZTkNfT1RIRVJfQ09SRVMoeCkgdWRlbGF5KHgrMSkN
CiNlbHNlDQovKg0KICogV2UgaGF2ZSB0byBhbGxvdyBpcnFzIHRvIGFycml2
ZSBiZXR3ZWVuIF9fc3RpIGFuZCBfX2NsaQ0KICovDQojIGRlZmluZSBTWU5D
X09USEVSX0NPUkVTKHgpIF9fYXNtX18gX192b2xhdGlsZV9fICgibm9wIikN
CiNlbmRpZg0KDQpzdGF0aWMgaW5saW5lIHZvaWQgd2FpdF9vbl9pcnEoaW50
IGNwdSkNCnsNCglpbnQgY291bnQgPSBNQVhDT1VOVDsNCg0KCWZvciAoOzsp
IHsNCg0KCQkvKg0KCQkgKiBXYWl0IHVudGlsIGFsbCBpbnRlcnJ1cHRzIGFy
ZSBnb25lLiBXYWl0DQoJCSAqIGZvciBib3R0b20gaGFsZiBoYW5kbGVycyB1
bmxlc3Mgd2UncmUNCgkJICogYWxyZWFkeSBleGVjdXRpbmcgaW4gb25lLi4N
CgkJICovDQoJCWlmICghYXRvbWljX3JlYWQoJmdsb2JhbF9pcnFfY291bnQp
KSB7DQoJCQlpZiAobG9jYWxfYmhfY291bnRbY3B1XSB8fCAhYXRvbWljX3Jl
YWQoJmdsb2JhbF9iaF9jb3VudCkpDQoJCQkJYnJlYWs7DQoJCX0NCg0KCQkv
KiBEdWgsIHdlIGhhdmUgdG8gbG9vcC4gUmVsZWFzZSB0aGUgbG9jayB0byBh
dm9pZCBkZWFkbG9ja3MgKi8NCgkJY2xlYXJfYml0KDAsJmdsb2JhbF9pcnFf
bG9jayk7DQoNCgkJZm9yICg7Oykgew0KCQkJaWYgKCEtLWNvdW50KSB7DQoJ
CQkJc2hvdygid2FpdF9vbl9pcnEiKTsNCgkJCQljb3VudCA9IH4wOw0KCQkJ
fQ0KCQkJX19zdGkoKTsNCgkJCVNZTkNfT1RIRVJfQ09SRVMoY3B1KTsNCgkJ
CV9fY2xpKCk7DQoJCQljaGVja19zbXBfaW52YWxpZGF0ZShjcHUpOw0KCQkJ
aWYgKGF0b21pY19yZWFkKCZnbG9iYWxfaXJxX2NvdW50KSkNCgkJCQljb250
aW51ZTsNCgkJCWlmIChnbG9iYWxfaXJxX2xvY2spDQoJCQkJY29udGludWU7
DQoJCQlpZiAoIWxvY2FsX2JoX2NvdW50W2NwdV0gJiYgYXRvbWljX3JlYWQo
Jmdsb2JhbF9iaF9jb3VudCkpDQoJCQkJY29udGludWU7DQoJCQlpZiAoIXRl
c3RfYW5kX3NldF9iaXQoMCwmZ2xvYmFsX2lycV9sb2NrKSkNCgkJCQlicmVh
azsNCgkJfQ0KCX0NCn0NCg0KLyoNCiAqIFRoaXMgaXMgY2FsbGVkIHdoZW4g
d2Ugd2FudCB0byBzeW5jaHJvbml6ZSB3aXRoDQogKiBib3R0b20gaGFsZiBo
YW5kbGVycy4gV2UgbmVlZCB0byB3YWl0IHVudGlsDQogKiBubyBvdGhlciBD
UFUgaXMgZXhlY3V0aW5nIGFueSBib3R0b20gaGFsZiBoYW5kbGVyLg0KICoN
CiAqIERvbid0IHdhaXQgaWYgd2UncmUgYWxyZWFkeSBydW5uaW5nIGluIGFu
IGludGVycnVwdA0KICogY29udGV4dCBvciBhcmUgaW5zaWRlIGEgYmggaGFu
ZGxlci4NCiAqLw0Kdm9pZCBzeW5jaHJvbml6ZV9iaCh2b2lkKQ0Kew0KCWlm
IChhdG9taWNfcmVhZCgmZ2xvYmFsX2JoX2NvdW50KSAmJiAhaW5faW50ZXJy
dXB0KCkpDQoJCQl3YWl0X29uX2JoKCk7DQp9DQoNCi8qDQogKiBUaGlzIGlz
IGNhbGxlZCB3aGVuIHdlIHdhbnQgdG8gc3luY2hyb25pemUgd2l0aA0KICog
aW50ZXJydXB0cy4gV2UgbWF5IGZvciBleGFtcGxlIHRlbGwgYSBkZXZpY2Ug
dG8NCiAqIHN0b3Agc2VuZGluZyBpbnRlcnJ1cHRzOiBidXQgdG8gbWFrZSBz
dXJlIHRoZXJlDQogKiBhcmUgbm8gaW50ZXJydXB0cyB0aGF0IGFyZSBleGVj
dXRpbmcgb24gYW5vdGhlcg0KICogQ1BVIHdlIG5lZWQgdG8gY2FsbCB0aGlz
IGZ1bmN0aW9uLg0KICovDQp2b2lkIHN5bmNocm9uaXplX2lycSh2b2lkKQ0K
ew0KCWlmIChhdG9taWNfcmVhZCgmZ2xvYmFsX2lycV9jb3VudCkpIHsNCgkJ
LyogU3R1cGlkIGFwcHJvYWNoICovDQoJCWNsaSgpOw0KCQlzdGkoKTsNCgl9
DQp9DQoNCnN0YXRpYyBpbmxpbmUgdm9pZCBnZXRfaXJxbG9jayhpbnQgY3B1
KQ0Kew0KCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsJmdsb2JhbF9pcnFfbG9j
aykpIHsNCgkJLyogZG8gd2UgYWxyZWFkeSBob2xkIHRoZSBsb2NrPyAqLw0K
CQlpZiAoKHVuc2lnbmVkIGNoYXIpIGNwdSA9PSBnbG9iYWxfaXJxX2hvbGRl
cikNCgkJCXJldHVybjsNCgkJLyogVWhodWguLiBTb21lYm9keSBlbHNlIGdv
dCBpdC4gV2FpdC4uICovDQoJCWRvIHsNCgkJCWRvIHsNCgkJCQljaGVja19z
bXBfaW52YWxpZGF0ZShjcHUpOw0KCQkJfSB3aGlsZSAodGVzdF9iaXQoMCwm
Z2xvYmFsX2lycV9sb2NrKSk7DQoJCX0gd2hpbGUgKHRlc3RfYW5kX3NldF9i
aXQoMCwmZ2xvYmFsX2lycV9sb2NrKSk7CQkNCgl9DQoJLyogDQoJICogV2Ug
YWxzbyB0byBtYWtlIHN1cmUgdGhhdCBub2JvZHkgZWxzZSBpcyBydW5uaW5n
DQoJICogaW4gYW4gaW50ZXJydXB0IGNvbnRleHQuIA0KCSAqLw0KCXdhaXRf
b25faXJxKGNwdSk7DQoNCgkvKg0KCSAqIE9rLCBmaW5hbGx5Li4NCgkgKi8N
CglnbG9iYWxfaXJxX2hvbGRlciA9IGNwdTsNCn0NCg0KI2RlZmluZSBFRkxB
R1NfSUZfU0hJRlQgOQ0KDQovKg0KICogQSBnbG9iYWwgImNsaSgpIiB3aGls
ZSBpbiBhbiBpbnRlcnJ1cHQgY29udGV4dA0KICogdHVybnMgaW50byBqdXN0
IGEgbG9jYWwgY2xpKCkuIEludGVycnVwdHMNCiAqIHNob3VsZCB1c2Ugc3Bp
bmxvY2tzIGZvciB0aGUgKHZlcnkgdW5saWtlbHkpDQogKiBjYXNlIHRoYXQg
dGhleSBldmVyIHdhbnQgdG8gcHJvdGVjdCBhZ2FpbnN0DQogKiBlYWNoIG90
aGVyLg0KICoNCiAqIElmIHdlIGFscmVhZHkgaGF2ZSBsb2NhbCBpbnRlcnJ1
cHRzIGRpc2FibGVkLA0KICogdGhpcyB3aWxsIG5vdCB0dXJuIGEgbG9jYWwg
ZGlzYWJsZSBpbnRvIGENCiAqIGdsb2JhbCBvbmUgKHByb2JsZW1zIHdpdGgg
c3BpbmxvY2tzOiB0aGlzIG1ha2VzDQogKiBzYXZlX2ZsYWdzK2NsaStzdGkg
dXNhYmxlIGluc2lkZSBhIHNwaW5sb2NrKS4NCiAqLw0Kdm9pZCBfX2dsb2Jh
bF9jbGkodm9pZCkNCnsNCgl1bnNpZ25lZCBpbnQgZmxhZ3M7DQoNCglfX3Nh
dmVfZmxhZ3MoZmxhZ3MpOw0KCWlmIChmbGFncyAmICgxIDw8IEVGTEFHU19J
Rl9TSElGVCkpIHsNCgkJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsN
CgkJX19jbGkoKTsNCgkJaWYgKCFsb2NhbF9pcnFfY291bnRbY3B1XSkNCgkJ
CWdldF9pcnFsb2NrKGNwdSk7DQoJfQ0KfQ0KDQp2b2lkIF9fZ2xvYmFsX3N0
aSh2b2lkKQ0Kew0KCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7DQoN
CglpZiAoIWxvY2FsX2lycV9jb3VudFtjcHVdKQ0KCQlyZWxlYXNlX2lycWxv
Y2soY3B1KTsNCglfX3N0aSgpOw0KfQ0KDQovKg0KICogU01QIGZsYWdzIHZh
bHVlIHRvIHJlc3RvcmUgdG86DQogKiAwIC0gZ2xvYmFsIGNsaQ0KICogMSAt
IGdsb2JhbCBzdGkNCiAqIDIgLSBsb2NhbCBjbGkNCiAqIDMgLSBsb2NhbCBz
dGkNCiAqLw0KdW5zaWduZWQgbG9uZyBfX2dsb2JhbF9zYXZlX2ZsYWdzKHZv
aWQpDQp7DQoJaW50IHJldHZhbDsNCglpbnQgbG9jYWxfZW5hYmxlZDsNCgl1
bnNpZ25lZCBsb25nIGZsYWdzOw0KDQoJX19zYXZlX2ZsYWdzKGZsYWdzKTsN
Cglsb2NhbF9lbmFibGVkID0gKGZsYWdzID4+IEVGTEFHU19JRl9TSElGVCkg
JiAxOw0KCS8qIGRlZmF1bHQgdG8gbG9jYWwgKi8NCglyZXR2YWwgPSAyICsg
bG9jYWxfZW5hYmxlZDsNCg0KCS8qIGNoZWNrIGZvciBnbG9iYWwgZmxhZ3Mg
aWYgd2UncmUgbm90IGluIGFuIGludGVycnVwdCAqLw0KCWlmICghbG9jYWxf
aXJxX2NvdW50W3NtcF9wcm9jZXNzb3JfaWQoKV0pIHsNCgkJaWYgKGxvY2Fs
X2VuYWJsZWQpDQoJCQlyZXR2YWwgPSAxOw0KCQlpZiAoZ2xvYmFsX2lycV9o
b2xkZXIgPT0gKHVuc2lnbmVkIGNoYXIpIHNtcF9wcm9jZXNzb3JfaWQoKSkN
CgkJCXJldHZhbCA9IDA7DQoJfQ0KCXJldHVybiByZXR2YWw7DQp9DQoNCnZv
aWQgX19nbG9iYWxfcmVzdG9yZV9mbGFncyh1bnNpZ25lZCBsb25nIGZsYWdz
KQ0Kew0KCXN3aXRjaCAoZmxhZ3MpIHsNCgljYXNlIDA6DQoJCV9fZ2xvYmFs
X2NsaSgpOw0KCQlicmVhazsNCgljYXNlIDE6DQoJCV9fZ2xvYmFsX3N0aSgp
Ow0KCQlicmVhazsNCgljYXNlIDI6DQoJCV9fY2xpKCk7DQoJCWJyZWFrOw0K
CWNhc2UgMzoNCgkJX19zdGkoKTsNCgkJYnJlYWs7DQoJZGVmYXVsdDoNCgkJ
cHJpbnRrKCJnbG9iYWxfcmVzdG9yZV9mbGFnczogJTA4bHggKCUwOGx4KVxu
IiwNCgkJCWZsYWdzLCAoJmZsYWdzKVstMV0pOw0KCX0NCn0NCg0KI2VuZGlm
DQoNCnN0YXRpYyBpbnQgaGFuZGxlX0lSUV9ldmVudCh1bnNpZ25lZCBpbnQg
aXJxLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpDQp7DQoJc3RydWN0IGlycWFj
dGlvbiAqIGFjdGlvbjsNCglpbnQgc3RhdHVzOw0KDQoJc3RhdHVzID0gMDsN
CglhY3Rpb24gPSAqKGlycSArIGlycV9hY3Rpb24pOw0KDQoJaWYgKGFjdGlv
bikgew0KCQlzdGF0dXMgfD0gMTsNCg0KCQlpZiAoIShhY3Rpb24tPmZsYWdz
ICYgU0FfSU5URVJSVVBUKSkNCgkJCV9fc3RpKCk7DQoNCgkJZG8gew0KCQkJ
c3RhdHVzIHw9IGFjdGlvbi0+ZmxhZ3M7DQoJCQlhY3Rpb24tPmhhbmRsZXIo
aXJxLCBhY3Rpb24tPmRldl9pZCwgcmVncyk7DQoJCQlhY3Rpb24gPSBhY3Rp
b24tPm5leHQ7DQoJCX0gd2hpbGUgKGFjdGlvbik7DQoJCWlmIChzdGF0dXMg
JiBTQV9TQU1QTEVfUkFORE9NKQ0KCQkJYWRkX2ludGVycnVwdF9yYW5kb21u
ZXNzKGlycSk7DQoJCV9fY2xpKCk7DQoJfQ0KDQoJcmV0dXJuIHN0YXR1czsN
Cn0NCg0KDQp2b2lkIGRpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpDQp7
DQoJdW5zaWduZWQgbG9uZyBmbGFnczsNCg0KCXNwaW5fbG9ja19pcnFzYXZl
KCZpcnFfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7DQoJaXJxX2hhbmRsZXNb
aXJxXS0+ZGlzYWJsZShpcnEpOw0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo
JmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsNCg0KLyoJc3luY2hyb25p
emVfaXJxKCk7Ki8NCn0NCg0KLyoNCiAqIGRpc2FibGUvZW5hYmxlX2lycSgp
IHdhaXQgZm9yIGFsbCBpcnEgY29udGV4dHMgdG8gZmluaXNoDQogKiBleGVj
dXRpbmcuIEFsc28gaXQncyByZWN1cnNpdmUuDQogKi8NCnN0YXRpYyB2b2lk
IGRpc2FibGVfODI1OUFfaXJxKHVuc2lnbmVkIGludCBpcnEpDQp7DQoJZGlz
YWJsZWRfaXJxW2lycV0rKzsNCgljYWNoZWRfaXJxX21hc2sgfD0gMSA8PCBp
cnE7DQoJc2V0XzgyNTlBX2lycV9tYXNrKGlycSk7DQp9DQoNCiNpZmRlZiBf
X1NNUF9fDQpzdGF0aWMgdm9pZCBkaXNhYmxlX2lvYXBpY19pcnEodW5zaWdu
ZWQgaW50IGlycSkNCnsNCglkaXNhYmxlZF9pcnFbaXJxXSsrOw0KCS8qDQoJ
ICogV2UgZG8gbm90IGRpc2FibGUgSU8tQVBJQyBpcnFzIGluIGhhcmR3YXJl
IC4uLg0KCSAqLw0KfQ0KI2VuZGlmDQoNCnZvaWQgZW5hYmxlXzgyNTlBX2ly
cSAodW5zaWduZWQgaW50IGlycSkNCnsNCgl1bnNpZ25lZCBsb25nIGZsYWdz
Ow0KCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFfY29udHJvbGxlcl9sb2NrLCBm
bGFncyk7DQoJaWYgKGRpc2FibGVkX2lycVtpcnFdKQ0KCQlkaXNhYmxlZF9p
cnFbaXJxXS0tOw0KCWVsc2Ugew0KCQlzcGluX3VubG9ja19pcnFyZXN0b3Jl
KCZpcnFfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7DQoJCXJldHVybjsNCgl9
DQoJY2FjaGVkX2lycV9tYXNrICY9IH4oMSA8PCBpcnEpOw0KCXNldF84MjU5
QV9pcnFfbWFzayhpcnEpOw0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmly
cV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsNCn0NCg0KI2lmZGVmIF9fU01Q
X18NCnZvaWQgZW5hYmxlX2lvYXBpY19pcnEgKHVuc2lnbmVkIGludCBpcnEp
DQp7DQoJdW5zaWduZWQgbG9uZyBmbGFnczsNCg0KCXNwaW5fbG9ja19pcnFz
YXZlKCZpcnFfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7DQoJaWYgKGRpc2Fi
bGVkX2lycVtpcnFdKQ0KCQlkaXNhYmxlZF9pcnFbaXJxXS0tOw0KCWVsc2Ug
ew0KCQkvKg0KCQkgKiBwcmludCBhIHdhcm5pbmcgaGVyZT8NCgkJICovDQoJ
CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9jb250cm9sbGVyX2xvY2ss
IGZsYWdzKTsNCgkJcmV0dXJuOw0KCX0NCgkvKg0KCSAqIEluIHRoZSBTTVAr
SU9BUElDIGNhc2UgaXQgbWlnaHQgaGFwcGVuIHRoYXQgdGhlcmUgYXJlIGFu
IHVuc3BlY2lmaWVkDQoJICogbnVtYmVyIG9mIHBlbmRpbmcgSVJRIGV2ZW50
cyB1bmhhbmRsZWQuIFRoZXNlIGNhc2VzIGFyZSBxdWl0ZSByYXJlLA0KCSAq
IHNvIHdlICdyZXNlbmQnIHRoZXNlIElSUXMgdmlhIElQSXMsIHRvIHRoZSBz
YW1lIENQVS4gSXQncyBtdWNoDQoJICogYmV0dGVyIHRvIGRvIGl0IHRoaXMg
d2F5IGFzIHRodXMgd2UgZG9udCBoYXZlIHRvIGJlIGF3YXJlIG9mDQoJICog
J3BlbmRpbmcnIGludGVycnVwdHMgaW4gdGhlIGNsaS9zdGkgcGF0aC4NCgkg
Ki8NCglpZiAoIWRpc2FibGVkX2lycVtpcnFdICYmIGlycV9ldmVudHNbaXJx
XSkgew0KCQlpZiAoIWlwaXNfcGVuZGluZ1tpcnFdKSB7DQoJCQlpcGlzX3Bl
bmRpbmdbaXJxXSA9IGlycV9ldmVudHNbaXJxXTsNCgkJCWlycV9ldmVudHNb
aXJxXSA9IDA7DQoJCQlzZW5kX0lQSShBUElDX0RFU1RfU0VMRixJT19BUElD
X1ZFQ1RPUihpcnEpKTsNCgkJfSBlbHNlIHsNCgkJCS8qDQoJCQkgKiBzaG91
bGQgbmV2ZXIgaGFwcGVuIChhbmQgaXQgZG9lc250IGhhcHBlbiBmb3IgbWUs
DQoJCQkgKiBldmVuIHVuZGVyIGluc2FuZSBsb2FkIHdpdGggaW5zYW5lIGRl
dmljZXMsIG9uIG9sZA0KCQkJICogaGFyZHdhcmUpLCByZW1vdmUgaW4gMi4y
DQoJCQkgKi8NCgkJCXByaW50aygiSVBJICVkIGFscmVhZHkgc2VudD8/XG4i
LCBpcnEpOw0KCQl9DQoJfQ0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmly
cV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsNCn0NCiNlbmRpZg0KDQp2b2lk
IGVuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkNCnsNCglpcnFfaGFuZGxl
c1tpcnFdLT5lbmFibGUoaXJxKTsNCn0NCg0Kdm9pZCBtYWtlXzgyNTlBX2ly
cSAodW5zaWduZWQgaW50IGlycSkNCnsNCglpb19hcGljX2lycXMgJj0gfigx
PDxpcnEpOw0KCWlycV9oYW5kbGVzW2lycV0gPSAmaTgyNTlBX2lycV90eXBl
Ow0KCWRpc2FibGVfaXJxKGlycSk7DQoJZW5hYmxlX2lycShpcnEpOw0KfQ0K
DQovKg0KICogQ2FyZWZ1bCEgVGhlIDgyNTlBIGlzIGEgZnJhZ2lsZSBiZWFz
dCwgaXQgcHJldHR5DQogKiBtdWNoIF9oYXNfIHRvIGJlIGRvbmUgZXhhY3Rs
eSBsaWtlIHRoaXMgKG1hc2sgaXQNCiAqIGZpcnN0LCBfdGhlbl8gc2VuZCB0
aGUgRU9JLCBhbmQgdGhlIG9yZGVyIG9mIEVPSQ0KICogdG8gdGhlIHR3byA4
MjU5cyBpcyBpbXBvcnRhbnQhDQogKi8NCnN0YXRpYyBpbmxpbmUgdm9pZCBt
YXNrX2FuZF9hY2tfODI1OUEodW5zaWduZWQgaW50IGlycSkNCnsNCglzcGlu
X2xvY2soJmlycV9jb250cm9sbGVyX2xvY2spOw0KCWNhY2hlZF9pcnFfbWFz
ayB8PSAxIDw8IGlycTsNCglpZiAoaXJxICYgOCkgew0KCQlpbmIoMHhBMSk7
CS8qIERVTU1ZICovDQoJCW91dGIoY2FjaGVkX0ExLDB4QTEpOw0KCQlvdXRi
KDB4NjIsMHgyMCk7CS8qIFNwZWNpZmljIEVPSSB0byBjYXNjYWRlICovDQoJ
CW91dGIoMHgyMCwweEEwKTsNCgl9IGVsc2Ugew0KCQlpbmIoMHgyMSk7CS8q
IERVTU1ZICovDQoJCW91dGIoY2FjaGVkXzIxLDB4MjEpOw0KCQlvdXRiKDB4
MjAsMHgyMCk7DQoJfQ0KCXNwaW5fdW5sb2NrKCZpcnFfY29udHJvbGxlcl9s
b2NrKTsNCn0NCg0Kc3RhdGljIHZvaWQgZG9fODI1OUFfSVJRKHVuc2lnbmVk
IGludCBpcnEsIGludCBjcHUsIHN0cnVjdCBwdF9yZWdzICogcmVncykNCnsN
CgltYXNrX2FuZF9hY2tfODI1OUEoaXJxKTsNCg0KCWlycV9lbnRlcihjcHUs
IGlycSk7DQoNCglpZiAoaGFuZGxlX0lSUV9ldmVudChpcnEsIHJlZ3MpKSB7
DQoJCXNwaW5fbG9jaygmaXJxX2NvbnRyb2xsZXJfbG9jayk7DQoJCXVubWFz
a184MjU5QShpcnEpOw0KCQlzcGluX3VubG9jaygmaXJxX2NvbnRyb2xsZXJf
bG9jayk7DQoJfQ0KDQoJaXJxX2V4aXQoY3B1LCBpcnEpOw0KfQ0KDQojaWZk
ZWYgX19TTVBfXw0Kc3RhdGljIHZvaWQgZG9faW9hcGljX0lSUSh1bnNpZ25l
ZCBpbnQgaXJxLCBpbnQgY3B1LCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpDQp7
DQoJaW50IHNob3VsZF9oYW5kbGVfaXJxID0gMDsNCg0KCWFja19BUElDX2ly
cSgpOw0KDQoJc3Bpbl9sb2NrKCZpcnFfY29udHJvbGxlcl9sb2NrKTsNCglp
ZiAoaXBpc19wZW5kaW5nW2lycV0pIHsNCgkJLyoNCgkJICogc3BlY2lhbCBz
ZWxmLWdlbmVyYXRlZCBJUEksIHBlbmRpbmcgZXZlbnRzIGhhdmUgdG8gYmUN
CgkJICogYWRkZWQgdG8gdGhlIGN1cnJlbnQgZXZlbnQgY291bnRlciwgYW5k
IHdlIHNob3VsZCBzdGFydA0KCQkgKiBoYW5kbGluZyBldmVudHMgaWYgbm8g
b3RoZXIgQ1BVIGRvZXMuDQoJCSAqLw0KCQlpZiAoIWlycV9ldmVudHNbaXJx
XSAmJiAhZGlzYWJsZWRfaXJxW2lycV0pDQoJCQlzaG91bGRfaGFuZGxlX2ly
cSA9IDE7DQoJCWlycV9ldmVudHNbaXJxXSArPSBpcGlzX3BlbmRpbmdbaXJx
XTsNCgkJaXBpc19wZW5kaW5nW2lycV0gPSAwOw0KCX0gZWxzZSB7DQoJCS8q
DQoJCSAqIGRldmljZS1nZW5lcmF0ZWQgJ3JlYWwnIElQSSwgc3RhcnQgZXZl
bnQtaGFuZGxpbmcgaWYNCgkJICogbmVjZXNzYXJ5Lg0KCQkgKi8NCgkJaWYg
KCFpcnFfZXZlbnRzW2lycV0rKyAmJiAhZGlzYWJsZWRfaXJxW2lycV0pDQoJ
CQlzaG91bGRfaGFuZGxlX2lycSA9IDE7DQoJfQ0KCWhhcmRpcnFfZW50ZXIo
Y3B1KTsNCglzcGluX3VubG9jaygmaXJxX2NvbnRyb2xsZXJfbG9jayk7DQoN
CglpZiAoc2hvdWxkX2hhbmRsZV9pcnEpIHsNCgkJd2hpbGUgKHRlc3RfYml0
KDAsJmdsb2JhbF9pcnFfbG9jaykpIG1iKCk7DQphZ2FpbjoNCgkJaGFuZGxl
X0lSUV9ldmVudChpcnEsIHJlZ3MpOw0KDQoJCXNwaW5fbG9jaygmaXJxX2Nv
bnRyb2xsZXJfbG9jayk7DQoJCXNob3VsZF9oYW5kbGVfaXJxPTA7DQoJCWlm
ICgtLWlycV9ldmVudHNbaXJxXSAmJiAhZGlzYWJsZWRfaXJxW2lycV0pDQoJ
CQlzaG91bGRfaGFuZGxlX2lycT0xOw0KCQlzcGluX3VubG9jaygmaXJxX2Nv
bnRyb2xsZXJfbG9jayk7DQoNCgkJaWYgKHNob3VsZF9oYW5kbGVfaXJxKQ0K
CQkJZ290byBhZ2FpbjsNCgl9DQoNCgloYXJkaXJxX2V4aXQoY3B1KTsNCgly
ZWxlYXNlX2lycWxvY2soY3B1KTsNCn0NCiNlbmRpZg0KDQovKg0KICogZG9f
SVJRIGhhbmRsZXMgYWxsIG5vcm1hbCBkZXZpY2UgSVJRJ3MgKHRoZSBzcGVj
aWFsDQogKiBTTVAgY3Jvc3MtQ1BVIGludGVycnVwdHMgaGF2ZSB0aGVpciBv
d24gc3BlY2lmaWMNCiAqIGhhbmRsZXJzKS4NCiAqDQogKiB0aGUgYmlnZ2Vz
dCBjaGFuZ2Ugb24gU01QIGlzIHRoZSBmYWN0IHRoYXQgd2Ugbm8gbW9yZSBt
YXNrDQogKiBpbnRlcnJ1cHRzIGluIGhhcmR3YXJlLCBwbGVhc2UgYmVsaWV2
ZSBtZSwgdGhpcyBpcyB1bmF2b2lkYWJsZSwNCiAqIHRoZSBoYXJkd2FyZSBp
cyBsYXJnZWx5IG1lc3NhZ2Utb3JpZW50ZWQsIGkgdHJpZWQgdG8gZm9yY2Ug
b3VyDQogKiBzdGF0ZS1kcml2ZW4gaXJxIGhhbmRsaW5nIHNjaGVtZSBvbnRv
IHRoZSBJTy1BUElDLCBidXQgbm8gYXZhaWwuDQogKg0KICogc28gd2Ugc29m
dC1kaXNhYmxlIGludGVycnVwdHMgdmlhICdldmVudCBjb3VudGVycycsIHRo
ZSBmaXJzdCAnaW5jbCcNCiAqIHdpbGwgZG8gdGhlIElSUSBoYW5kbGluZy4g
VGhpcyBhbHNvIGhhcyB0aGUgbmljZSBzaWRlIGVmZmVjdCBvZiBpbmNyZWFz
ZWQNCiAqIG92ZXJsYXBwaW5nIC4uLiBpIHNhdyBubyBkcml2ZXIgcHJvYmxl
bSBzbyBmYXIuDQogKi8NCmFzbWxpbmthZ2Ugdm9pZCBkb19JUlEoc3RydWN0
IHB0X3JlZ3MgcmVncykNCnsJDQoJLyogDQoJICogV2UgYWNrIHF1aWNrbHks
IHdlIGRvbid0IHdhbnQgdGhlIGlycSBjb250cm9sbGVyDQoJICogdGhpbmtp
bmcgd2UncmUgc25vYnMganVzdCBiZWNhdXNlIHNvbWUgb3RoZXIgQ1BVIGhh
cw0KCSAqIGRpc2FibGVkIGdsb2JhbCBpbnRlcnJ1cHRzICh3ZSBoYXZlIGFs
cmVhZHkgZG9uZSB0aGUNCgkgKiBJTlRfQUNLIGN5Y2xlcywgaXQncyB0b28g
bGF0ZSB0byB0cnkgdG8gcHJldGVuZCB0byB0aGUNCgkgKiBjb250cm9sbGVy
IHRoYXQgd2UgYXJlbid0IHRha2luZyB0aGUgaW50ZXJydXB0KS4NCgkgKg0K
CSAqIDAgcmV0dXJuIHZhbHVlIG1lYW5zIHRoYXQgdGhpcyBpcnEgaXMgYWxy
ZWFkeSBiZWluZw0KCSAqIGhhbmRsZWQgYnkgc29tZSBvdGhlciBDUFUuIChv
ciBpcyBkaXNhYmxlZCkNCgkgKi8NCgl1bnNpZ25lZCBpbnQgaXJxID0gcmVn
cy5vcmlnX2VheCAmIDB4ZmY7DQoJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3Jf
aWQoKTsNCg0KCWtzdGF0LmlycXNbY3B1XVtpcnFdKys7DQoJaXJxX2hhbmRs
ZXNbaXJxXS0+aGFuZGxlKGlycSwgY3B1LCAmcmVncyk7DQoNCgkvKg0KCSAq
IFRoaXMgc2hvdWxkIGJlIGNvbmRpdGlvbmFsOiB3ZSBzaG91bGQgcmVhbGx5
IGdldA0KCSAqIGEgcmV0dXJuIGNvZGUgZnJvbSB0aGUgaXJxIGhhbmRsZXIg
dG8gdGVsbCB1cw0KCSAqIHdoZXRoZXIgdGhlIGhhbmRsZXIgd2FudHMgdXMg
dG8gZG8gc29mdHdhcmUgYm90dG9tDQoJICogaGFsZiBoYW5kbGluZyBvciBu
b3QuLg0KCSAqLw0KCWlmICgxKSB7DQoJCWlmIChiaF9hY3RpdmUgJiBiaF9t
YXNrKQ0KCQkJZG9fYm90dG9tX2hhbGYoKTsNCgl9DQp9DQoNCmludCBzZXR1
cF94ODZfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFhY3Rpb24g
KiBuZXcpDQp7DQoJaW50IHNoYXJlZCA9IDA7DQoJc3RydWN0IGlycWFjdGlv
biAqb2xkLCAqKnA7DQoJdW5zaWduZWQgbG9uZyBmbGFnczsNCg0KCXAgPSBp
cnFfYWN0aW9uICsgaXJxOw0KCWlmICgob2xkID0gKnApICE9IE5VTEwpIHsN
CgkJLyogQ2FuJ3Qgc2hhcmUgaW50ZXJydXB0cyB1bmxlc3MgYm90aCBhZ3Jl
ZSB0byAqLw0KCQlpZiAoIShvbGQtPmZsYWdzICYgbmV3LT5mbGFncyAmIFNB
X1NISVJRKSkNCgkJCXJldHVybiAtRUJVU1k7DQoNCgkJLyogYWRkIG5ldyBp
bnRlcnJ1cHQgYXQgZW5kIG9mIGlycSBxdWV1ZSAqLw0KCQlkbyB7DQoJCQlw
ID0gJm9sZC0+bmV4dDsNCgkJCW9sZCA9ICpwOw0KCQl9IHdoaWxlIChvbGQp
Ow0KCQlzaGFyZWQgPSAxOw0KCX0NCg0KCWlmIChuZXctPmZsYWdzICYgU0Ff
U0FNUExFX1JBTkRPTSkNCgkJcmFuZF9pbml0aWFsaXplX2lycShpcnEpOw0K
DQoJc2F2ZV9mbGFncyhmbGFncyk7DQoJY2xpKCk7DQoJKnAgPSBuZXc7DQoN
CglpZiAoIXNoYXJlZCkgew0KCQlzcGluX2xvY2soJmlycV9jb250cm9sbGVy
X2xvY2spOw0KI2lmZGVmIF9fU01QX18NCgkJaWYgKElPX0FQSUNfSVJRKGly
cSkpIHsNCgkJCWlycV9oYW5kbGVzW2lycV0gPSAmaW9hcGljX2lycV90eXBl
Ow0KCQkJLyoNCgkJCSAqIEZpcnN0IGRpc2FibGUgaXQgaW4gdGhlIDgyNTlB
Og0KCQkJICovDQoJCQljYWNoZWRfaXJxX21hc2sgfD0gMSA8PCBpcnE7DQoJ
CQlpZiAoaXJxIDwgMTYpDQoJCQkJc2V0XzgyNTlBX2lycV9tYXNrKGlycSk7
DQoJCX0NCiNlbmRpZg0KCQl1bm1hc2tfZ2VuZXJpY19pcnEoaXJxKTsNCgkJ
c3Bpbl91bmxvY2soJmlycV9jb250cm9sbGVyX2xvY2spOw0KCX0NCglyZXN0
b3JlX2ZsYWdzKGZsYWdzKTsNCglyZXR1cm4gMDsNCn0NCg0KaW50IHJlcXVl
c3RfaXJxKHVuc2lnbmVkIGludCBpcnEsIA0KCQl2b2lkICgqaGFuZGxlciko
aW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLA0KCQl1bnNpZ25lZCBs
b25nIGlycWZsYWdzLCANCgkJY29uc3QgY2hhciAqIGRldm5hbWUsDQoJCXZv
aWQgKmRldl9pZCkNCnsNCglpbnQgcmV0dmFsOw0KCXN0cnVjdCBpcnFhY3Rp
b24gKiBhY3Rpb247DQoNCglpZiAoaXJxID49IE5SX0lSUVMpDQoJCXJldHVy
biAtRUlOVkFMOw0KCWlmICghaGFuZGxlcikNCgkJcmV0dXJuIC1FSU5WQUw7
DQoNCglhY3Rpb24gPSAoc3RydWN0IGlycWFjdGlvbiAqKQ0KCQkJa21hbGxv
YyhzaXplb2Yoc3RydWN0IGlycWFjdGlvbiksIEdGUF9LRVJORUwpOw0KCWlm
ICghYWN0aW9uKQ0KCQlyZXR1cm4gLUVOT01FTTsNCg0KCWFjdGlvbi0+aGFu
ZGxlciA9IGhhbmRsZXI7DQoJYWN0aW9uLT5mbGFncyA9IGlycWZsYWdzOw0K
CWFjdGlvbi0+bWFzayA9IDA7DQoJYWN0aW9uLT5uYW1lID0gZGV2bmFtZTsN
CglhY3Rpb24tPm5leHQgPSBOVUxMOw0KCWFjdGlvbi0+ZGV2X2lkID0gZGV2
X2lkOw0KDQoJcmV0dmFsID0gc2V0dXBfeDg2X2lycShpcnEsIGFjdGlvbik7
DQoNCglpZiAocmV0dmFsKQ0KCQlrZnJlZShhY3Rpb24pOw0KCXJldHVybiBy
ZXR2YWw7DQp9DQoJCQ0Kdm9pZCBmcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJx
LCB2b2lkICpkZXZfaWQpDQp7DQoJc3RydWN0IGlycWFjdGlvbiAqIGFjdGlv
biwgKipwOw0KCXVuc2lnbmVkIGxvbmcgZmxhZ3M7DQoNCglpZiAoaXJxID49
IE5SX0lSUVMpIHsNCgkJcHJpbnRrKCJUcnlpbmcgdG8gZnJlZSBJUlElZFxu
IixpcnEpOw0KCQlyZXR1cm47DQoJfQ0KCWZvciAocCA9IGlycSArIGlycV9h
Y3Rpb247IChhY3Rpb24gPSAqcCkgIT0gTlVMTDsgcCA9ICZhY3Rpb24tPm5l
eHQpIHsNCgkJaWYgKGFjdGlvbi0+ZGV2X2lkICE9IGRldl9pZCkNCgkJCWNv
bnRpbnVlOw0KDQoJCS8qIEZvdW5kIGl0IC0gbm93IGZyZWUgaXQgKi8NCgkJ
c2F2ZV9mbGFncyhmbGFncyk7DQoJCWNsaSgpOw0KCQkqcCA9IGFjdGlvbi0+
bmV4dDsNCgkJcmVzdG9yZV9mbGFncyhmbGFncyk7DQoJCWtmcmVlKGFjdGlv
bik7DQoJCXJldHVybjsNCgl9DQoJcHJpbnRrKCJUcnlpbmcgdG8gZnJlZSBm
cmVlIElSUSVkXG4iLGlycSk7DQp9DQoNCi8qDQogKiBwcm9iaW5nIGlzIGFs
d2F5cyBzaW5nbGUgdGhyZWFkZWQgW0ZJWE1FOiBpcyB0aGlzIHRydWU/XQ0K
ICovDQpzdGF0aWMgdW5zaWduZWQgaW50IHByb2JlX2lycXNbTlJfQ1BVU11b
TlJfSVJRU107DQoNCnVuc2lnbmVkIGxvbmcgcHJvYmVfaXJxX29uICh2b2lk
KQ0Kew0KCXVuc2lnbmVkIGludCBpLCBqLCBpcnFzID0gMDsNCgl1bnNpZ25l
ZCBsb25nIGRlbGF5Ow0KDQoJLyoNCgkgKiBzYXZlIGN1cnJlbnQgaXJxIGNv
dW50cw0KCSAqLw0KCW1lbWNweShwcm9iZV9pcnFzLGtzdGF0LmlycXMsTlJf
Q1BVUypOUl9JUlFTKnNpemVvZihpbnQpKTsNCg0KCS8qDQoJICogZmlyc3Qs
IGVuYWJsZSBhbnkgdW5hc3NpZ25lZCBpcnFzDQoJICovDQoJZm9yIChpID0g
TlJfSVJRUy0xOyBpID4gMDsgaS0tKSB7DQoJCWlmICghaXJxX2FjdGlvbltp
XSkgew0KCQkJdW5zaWduZWQgbG9uZyBmbGFnczsNCgkJCXNwaW5fbG9ja19p
cnFzYXZlKCZpcnFfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7DQoJCQl1bm1h
c2tfZ2VuZXJpY19pcnEoaSk7DQoJCQlpcnFzIHw9ICgxIDw8IGkpOw0KCQkJ
c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2NvbnRyb2xsZXJfbG9jaywg
ZmxhZ3MpOw0KCQl9DQoJfQ0KDQoJLyoNCgkgKiB3YWl0IGZvciBzcHVyaW91
cyBpbnRlcnJ1cHRzIHRvIGluY3JlYXNlIGNvdW50ZXJzDQoJICovDQoJZm9y
IChkZWxheSA9IGppZmZpZXMgKyBIWi8xMDsgZGVsYXkgPiBqaWZmaWVzOyAp
DQoJCS8qIGFib3V0IDEwMG1zIGRlbGF5ICovIHN5bmNocm9uaXplX2lycSgp
Ow0KDQoJLyoNCgkgKiBub3cgZmlsdGVyIG91dCBhbnkgb2J2aW91c2x5IHNw
dXJpb3VzIGludGVycnVwdHMNCgkgKi8NCglmb3IgKGk9MDsgaTxOUl9JUlFT
OyBpKyspDQoJCWZvciAoaj0wOyBqPE5SX0NQVVM7IGorKykNCgkJCWlmIChr
c3RhdC5pcnFzW2pdW2ldICE9IHByb2JlX2lycXNbal1baV0pDQoJCQkJaXJx
cyAmPSB+KDFVTCA8PCBpKTsNCg0KCXJldHVybiBpcnFzOw0KfQ0KDQppbnQg
cHJvYmVfaXJxX29mZiAodW5zaWduZWQgbG9uZyBpcnFzKQ0Kew0KCWludCBp
LGosIGlycV9mb3VuZCA9IC0xOw0KDQoJZm9yIChpPTA7IGk8TlJfSVJRUzsg
aSsrKSB7DQoJCWludCBzdW0gPSAwOw0KCQlmb3IgKGo9MDsgajxOUl9DUFVT
OyBqKyspIHsNCgkJCXN1bSArPSBrc3RhdC5pcnFzW2pdW2ldOw0KCQkJc3Vt
IC09IHByb2JlX2lycXNbal1baV07DQoJCX0NCgkJaWYgKHN1bSAmJiAoaXJx
cyAmICgxVUwgPDwgaSkpKSB7DQoJCQlpZiAoaXJxX2ZvdW5kICE9IC0xKSB7
DQoJCQkJaXJxX2ZvdW5kID0gLWlycV9mb3VuZDsNCgkJCQlnb3RvIG91dDsN
CgkJCX0gZWxzZQ0KCQkJCWlycV9mb3VuZCA9IGk7DQoJCX0NCgl9DQoJaWYg
KGlycV9mb3VuZCA9PSAtMSkNCgkJaXJxX2ZvdW5kID0gMDsNCm91dDoNCgly
ZXR1cm4gaXJxX2ZvdW5kOw0KfQ0KDQojaWZkZWYgX19TTVBfXw0Kdm9pZCBp
bml0X0lPX0FQSUNfdHJhcHModm9pZCkNCnsNCglpbnQgaTsNCgkvKg0KCSAq
IE5PVEUhIFRoZSBsb2NhbCBBUElDIGlzbid0IHZlcnkgZ29vZCBhdCBoYW5k
bGluZw0KCSAqIG11bHRpcGxlIGludGVycnVwdHMgYXQgdGhlIHNhbWUgaW50
ZXJydXB0IGxldmVsLg0KCSAqIEFzIHRoZSBpbnRlcnJ1cHQgbGV2ZWwgaXMg
ZGV0ZXJtaW5lZCBieSB0YWtpbmcgdGhlDQoJICogdmVjdG9yIG51bWJlciBh
bmQgc2hpZnRpbmcgdGhhdCByaWdodCBieSA0LCB3ZQ0KCSAqIHdhbnQgdG8g
c3ByZWFkIHRoZXNlIG91dCBhIGJpdCBzbyB0aGF0IHRoZXkgZG9uJ3QNCgkg
KiBhbGwgZmFsbCBpbiB0aGUgc2FtZSBpbnRlcnJ1cHQgbGV2ZWwNCgkgKg0K
CSAqIGFsc28sIHdlJ3ZlIGdvdCB0byBiZSBjYXJlZnVsIG5vdCB0byB0cmFz
aCBnYXRlDQoJICogMHg4MCwgYmVjYXVzZSBpbnQgMHg4MCBpcyBobSwga2lu
ZG9mIGltcG9ydGFudGlzaCA7KQ0KCSAqLw0KCWZvciAoaSA9IDA7IGkgPCBO
Ul9JUlFTIDsgaSsrKQ0KCQlpZiAoSU9fQVBJQ19WRUNUT1IoaSkgPD0gMHhm
ZSkgIC8qIEhBQ0sgKi8gew0KCQkJaWYgKElPX0FQSUNfSVJRKGkpKSB7DQoJ
CQkJaXJxX2hhbmRsZXNbaV0gPSAmaW9hcGljX2lycV90eXBlOw0KCQkJCS8q
DQoJCQkJICogRmlyc3QgZGlzYWJsZSBpdCBpbiB0aGUgODI1OUE6DQoJCQkJ
ICovDQoJCQkJY2FjaGVkX2lycV9tYXNrIHw9IDEgPDwgaTsNCgkJCQlpZiAo
aSA8IDE2KQ0KCQkJCQlzZXRfODI1OUFfaXJxX21hc2soaSk7DQoJCQl9DQoJ
CX0NCn0NCiNlbmRpZg0KDQpfX2luaXRmdW5jKHZvaWQgaW5pdF9JUlEodm9p
ZCkpDQp7DQoJaW50IGk7DQoNCgkvKiBzZXQgdGhlIGNsb2NrIHRvIDEwMCBI
eiAqLw0KCW91dGJfcCgweDM0LDB4NDMpOwkJLyogYmluYXJ5LCBtb2RlIDIs
IExTQi9NU0IsIGNoIDAgKi8NCglvdXRiX3AoTEFUQ0ggJiAweGZmICwgMHg0
MCk7CS8qIExTQiAqLw0KCW91dGIoTEFUQ0ggPj4gOCAsIDB4NDApOwkvKiBN
U0IgKi8NCg0KCWZvciAoaT0wOyBpPE5SX0lSUVM7IGkrKykgew0KCQlpcnFf
ZXZlbnRzW2ldID0gMDsNCgkJZGlzYWJsZWRfaXJxW2ldID0gMDsNCgl9DQoJ
LyoNCgkgKiAxNiBvbGQtc3R5bGUgSU5UQS1jeWNsZSBpbnRlcnJ1cHQgZ2F0
ZXM6DQoJICovDQoJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspDQoJCXNldF9p
bnRyX2dhdGUoMHgyMCtpLGludGVycnVwdFtpXSk7DQoNCiNpZmRlZiBfX1NN
UF9fCQ0KDQoJZm9yIChpID0gMDsgaSA8IE5SX0lSUVMgOyBpKyspDQoJCWlm
IChJT19BUElDX1ZFQ1RPUihpKSA8PSAweGZlKSAgLyogaGFjayAtLSBtaW5n
byAqLw0KCQkJc2V0X2ludHJfZ2F0ZShJT19BUElDX1ZFQ1RPUihpKSxpbnRl
cnJ1cHRbaV0pOw0KDQoJLyoNCgkgKiBUaGUgcmVzY2hlZHVsZSBpbnRlcnJ1
cHQgc2xvd2x5IGNoYW5nZXMgaXQncyBmdW5jdGlvbmFsaXR5LA0KCSAqIHdo
aWxlIHNvIGZhciBpdCB3YXMgYSBraW5kIG9mIGJyb2FkY2FzdGVkIHRpbWVy
IGludGVycnVwdCwNCgkgKiBpbiB0aGUgZnV0dXJlIGl0IHNob3VsZCBiZWNv
bWUgYSBDUFUtdG8tQ1BVIHJlc2NoZWR1bGluZyBJUEksDQoJICogZHJpdmVu
IGJ5IHNjaGVkdWxlKCkgPw0KCSAqDQoJICogWyBJdCBoYXMgdG8gYmUgaGVy
ZSAuLiBpdCBkb2Vzbid0IHdvcmsgaWYgeW91IHB1dA0KCSAqICAgaXQgZG93
biB0aGUgYm90dG9tIC0gYXNzZW1ibGVyIGV4cGxvZGVzIDgpIF0NCgkgKi8N
Cg0KCS8qIElQSSBmb3IgcmVzY2hlZHVsaW5nICovDQoJc2V0X2ludHJfZ2F0
ZSgweDMwLCByZXNjaGVkdWxlX2ludGVycnVwdCk7DQoNCgkvKiBJUEkgZm9y
IGludmFsaWRhdGlvbiAqLw0KCXNldF9pbnRyX2dhdGUoMHgzMSwgaW52YWxp
ZGF0ZV9pbnRlcnJ1cHQpOw0KDQoJLyogSVBJIGZvciBDUFUgaGFsdCAqLw0K
CXNldF9pbnRyX2dhdGUoMHg0MCwgc3RvcF9jcHVfaW50ZXJydXB0KTsNCg0K
CS8qIHNlbGYgZ2VuZXJhdGVkIElQSSBmb3IgbG9jYWwgQVBJQyB0aW1lciAq
Lw0KCXNldF9pbnRyX2dhdGUoMHg0MSwgYXBpY190aW1lcl9pbnRlcnJ1cHQp
Ow0KDQojZW5kaWYJDQoJcmVxdWVzdF9yZWdpb24oMHgyMCwweDIwLCJwaWMx
Iik7DQoJcmVxdWVzdF9yZWdpb24oMHhhMCwweDIwLCJwaWMyIik7DQoJc2V0
dXBfeDg2X2lycSgyLCAmaXJxMik7DQoJc2V0dXBfeDg2X2lycSgxMywgJmly
cTEzKTsNCn0gDQoNCg==
---1247997369-587030873-893627768=:26648--

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu