Subject: pciide patches for HPT366
To: None <current-users@netbsd.org>
From: Roger Brooks <R.S.Brooks@liverpool.ac.uk>
List: current-users
Date: 03/15/2000 23:37:16
  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.

---559023410-758783491-953163436=:2874
Content-Type: TEXT/PLAIN; charset=US-ASCII

Here is a new version of my pciide patches for the HPT366 UDMA/66 chip.
This has taken longer than I expected because I hit a nasty problem.

I now have both channels working.  As I've mentioned before, the HPT366
requires a 32-bit tuning parameter for each drive which is dependent on
the PCI bus clock speed.  On i386, the BIOS sets these up for the bus
speed and current transfer mode (as in BIOS setup).  However, the
pciide driver needs to know the tuning parameters for all transfer
modes because:

1.  The driver will by default attach a drive at the best possible mode
    (even if it has been downgraded in BIOS setup), and

2.  If, as a result of I/O errors, the driver downgrades the transfer mode,
    it also needs to retune the chip for the new transfer mode.

On i386, the PCI bus clock can be determined from the next-to-lowest byte
of the 32-bit tuning parameter set up by the BIOS.  I'm afraid that
pciide.c has sprouted a piece of machine-dependent code which defaults
the PCI bus clock to 33 MHz on other architectures (although this can be
overridden in the kernel config file with

    options PCI_BUSCLOCK=nn

While testing this, I decided to see how bad things were using the "wrong"
tuning parameters.  Because I have speed-locked Celerons, I can't get
anything other than a 33 MHz PCI bus clock, so I tried using the 25 and
40 MHz tuning parameter sets.  On a UDMA mode 2 disk, the 40 MHz parameters
resulted in the driver reporting prolific errors.  The 25 MHz parameters
seemed to work at first, but while I was running 'ls -lR /mnt' I got a
ufs panic.

On rebooting I found that the filesystems on that disk were just about the
most completely FUBAR I've ever seen on a Unix system.  The fsck run from
/etc/rc reported that the superblock was corrupt.  When I ran 'fsck -y'
manually, I was eventually left with filesystems which had about one
third of their original contents remaining (about one third of the files
had been removed as partially-allocated inodes, and another third
ended up in lost+found).  I was also left with a /mnt/.cshrc which was
something like 1000 TB in size!

As far as I've been able to test, there is no problem with the combination
of a 33 MHz PCI bus clock and disks in UDMA modes 2 and 4 (which is likely
to cover most recent disks), but proceed with caution.  I suppose my
test of 'ls -lR' on a filesystem mounted R/W is as good as anything,
because it rewrites all the in-use inodes in order to update the access
times.  Just don't try it on a disk containing anything irreplaceable!
An 'fsck -f' (force check even if FS is clean) after unmounting would
be advisable if it seems to have worked.

For any PCI bus clock speed other than 25, 33 or 40 MHz, you will need
to determine the tuning parameters.  The procedure (which is rather tedious)
is described in pciide_hpt366_reg.h.  It would be advisable to do this even
for 25 and 40 MHz bus clock speeds, as when I checked the 33 MHz values as
set by the BIOS, I found some differences from what I'd got from the Linux
driver.




Roger

------------------------------------------------------------------------------
Roger Brooks (Systems Programmer),          |  Email: R.S.Brooks@liv.ac.uk
Computing Services Dept,                    |  Tel:   +44 151 794 4441
The University of Liverpool,                |  Fax:   +44 151 794 4442
PO Box 147, Liverpool L69 3BX, UK           | 
------------------------------------------------------------------------------

---559023410-758783491-953163436=:2874
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=HPT366-patch2
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.GSO.4.10.10003152337160.2874@uxf.liv.ac.uk>
Content-Description: HPT366 patch (version 2)
Content-Disposition: attachment; filename=HPT366-patch2

ZGlmZiAtYyAtLW5ldy1maWxlIGRldi9wY2kub2xkL3BjaWRldnMgZGV2L3Bj
aS9wY2lkZXZzDQoqKiogZGV2L3BjaS5vbGQvcGNpZGV2cwlXZWQgRmViIDE2
IDEyOjIyOjU4IDIwMDANCi0tLSBkZXYvcGNpL3BjaWRldnMJU2F0IEZlYiAy
NiAyMzo1Nzo1NSAyMDAwDQoqKioqKioqKioqKioqKioNCioqKiAxMzQ5LDEz
NTQgKioqKg0KLS0tIDEzNDksMTM1NyAtLS0tDQogIHByb2R1Y3QgVFJJREVO
VAlUR1VJXzk2ODAJMHg5NjgwCVRHVUkgOTY4MA0KICBwcm9kdWN0IFRSSURF
TlQJVEdVSV85NjgyCTB4OTY4MglUR1VJIDk2ODINCiAgDQorIC8qIFRyaW9u
ZXMgVGVjaG5vbG9naWVzIHByb2R1Y3RzICovDQorIHByb2R1Y3QgVFJJT05F
UyBIUFQzNjYgICAgICAgICAgMHgwMDA0ICBIUFQzNjYgVURNQS82NiBDb250
cm9sbGVyDQorIA0KICAvKiBUcmlUZWNoIE1pY3JvZWxlY3Ryb25pY3MgcHJv
ZHVjdHMqLw0KICBwcm9kdWN0IFRSSVRFQ0gJVFIyNTIwMgkJMHhmYzAyCVB5
cmFtaWQzRCBUUjI1MjAyDQogIA0KZGlmZiAtYyAtLW5ldy1maWxlIGRldi9w
Y2kub2xkL3BjaWlkZS5jIGRldi9wY2kvcGNpaWRlLmMNCioqKiBkZXYvcGNp
Lm9sZC9wY2lpZGUuYwlXZWQgSmFuIDE5IDEyOjMxOjQ5IDIwMDANCi0tLSBk
ZXYvcGNpL3BjaWlkZS5jCVdlZCBNYXIgMTUgMjM6MDY6NDIgMjAwMA0KKioq
KioqKioqKioqKioqDQoqKiogMTE1LDEyMCAqKioqDQotLS0gMTE1LDEyMyAt
LS0tDQogICNpbmNsdWRlIDxkZXYvcGNpL3BjaWlkZV9zaXNfcmVnLmg+DQog
ICNpbmNsdWRlIDxkZXYvcGNpL3BjaWlkZV9hY2VyX3JlZy5oPg0KICAjaW5j
bHVkZSA8ZGV2L3BjaS9wY2lpZGVfcGRjMjAyeHhfcmVnLmg+DQorICNpbmNs
dWRlIDxkZXYvcGNpL3BjaWlkZV9ocHQzNjZfcmVnLmg+DQorIA0KKyAjaW5j
bHVkZSAib3B0X3BjaV9idXNjbG9jay5oIg0KICANCiAgLyogaW5saW5lcyBm
b3IgcmVhZGluZy93cml0aW5nIDgtYml0IFBDSSByZWdpc3RlcnMgKi8NCiAg
c3RhdGljIF9faW5saW5lIHVfaW50OF90IHBjaWlkZV9wY2lfcmVhZCBfX1Ao
KHBjaV9jaGlwc2V0X3RhZ190LCBwY2l0YWdfdCwNCioqKioqKioqKioqKioq
Kg0KKioqIDE4MSwxODYgKioqKg0KLS0tIDE4NCwxOTUgLS0tLQ0KICB2b2lk
IHBkYzIwMnh4X3NldHVwX2NoYW5uZWwgX19QKChzdHJ1Y3QgY2hhbm5lbF9z
b2Z0YyopKTsNCiAgaW50ICBwZGMyMDJ4eF9wY2lfaW50ciBfX1AoKHZvaWQg
KikpOw0KICANCisgdm9pZCBocHQzNjZfY2hpcF9tYXAgX19QKChzdHJ1Y3Qg
cGNpaWRlX3NvZnRjKiwgc3RydWN0IHBjaV9hdHRhY2hfYXJncyopKTsNCisg
dm9pZCBocHQzNjZfc2V0dXBfY2hhbm5lbCBfX1AoKHN0cnVjdCBjaGFubmVs
X3NvZnRjKikpOw0KKyBpbnQgIGhwdDM2Nl9jbGFpbV9odyBfX1AoKHZvaWQg
KiwgaW50KSk7DQorIHZvaWQgaHB0MzY2X2ZyZWVfaHcgX19QKCh2b2lkICop
KTsNCisgaW50ICBocHQzNjZfcGNpX2ludHIgX19QKCh2b2lkICopKTsNCisg
DQogIHZvaWQgcGNpaWRlX2NoYW5uZWxfZG1hX3NldHVwIF9fUCgoc3RydWN0
IHBjaWlkZV9jaGFubmVsICopKTsNCiAgaW50ICBwY2lpZGVfZG1hX3RhYmxl
X3NldHVwIF9fUCgoc3RydWN0IHBjaWlkZV9zb2Z0YyosIGludCwgaW50KSk7
DQogIGludCAgcGNpaWRlX2RtYV9pbml0IF9fUCgodm9pZCosIGludCwgaW50
LCB2b2lkICosIHNpemVfdCwgaW50KSk7DQoqKioqKioqKioqKioqKioNCioq
KiAzMzYsMzQxICoqKioNCi0tLSAzNDUsMzYyIC0tLS0NCiAgCX0NCiAgfTsN
CiAgDQorIGNvbnN0IHN0cnVjdCBwY2lpZGVfcHJvZHVjdF9kZXNjIHBjaWlk
ZV90cmlvbmVzX3Byb2R1Y3RzW10gPSAgew0KKyAJeyBQQ0lfUFJPRFVDVF9U
UklPTkVTX0hQVDM2NiwNCisgCSAgSURFX1BDSV9DTEFTU19PVkVSUklERSwN
CisgCSAgIlRyaW9uZXMvSGlnaHBvaW50IEhQVDM2NiBVRE1BLzY2IElERSBD
b250cm9sbGVyIiwNCisgCSAgaHB0MzY2X2NoaXBfbWFwLA0KKyAJfSwNCisg
CXsgMCwNCisgCSAgMCwNCisgCSAgTlVMTCwNCisgCX0NCisgfTsNCisgDQog
IHN0cnVjdCBwY2lpZGVfdmVuZG9yX2Rlc2Mgew0KICAJdV9pbnQzMl90IGlk
ZV92ZW5kb3I7DQogIAljb25zdCBzdHJ1Y3QgcGNpaWRlX3Byb2R1Y3RfZGVz
YyAqaWRlX3Byb2R1Y3RzOw0KKioqKioqKioqKioqKioqDQoqKiogMzQ5LDM1
NCAqKioqDQotLS0gMzcwLDM3NiAtLS0tDQogIAl7IFBDSV9WRU5ET1JfU0lT
LCBwY2lpZGVfc2lzX3Byb2R1Y3RzIH0sDQogIAl7IFBDSV9WRU5ET1JfQUxJ
LCBwY2lpZGVfYWNlcl9wcm9kdWN0cyB9LA0KICAJeyBQQ0lfVkVORE9SX1BS
T01JU0UsIHBjaWlkZV9wcm9taXNlX3Byb2R1Y3RzIH0sDQorIAl7IFBDSV9W
RU5ET1JfVFJJT05FUywgcGNpaWRlX3RyaW9uZXNfcHJvZHVjdHMgfSwNCiAg
CXsgMCwgTlVMTCB9DQogIH07DQogIA0KKioqKioqKioqKioqKioqDQoqKiog
MzU2LDM2MSAqKioqDQotLS0gMzc4LDM4NCAtLS0tDQogIA0KICAvKiBvcHRp
b25zIHBhc3NlZCB2aWEgdGhlICdmbGFncycgY29uZmlnIGtleXdvcmQgKi8N
CiAgI2RlZmluZSBQQ0lJREVfT1BUSU9OU19ETUEJMHgwMQ0KKyAjZGVmaW5l
IFBDSUlERV9PUFRJT05TX0ZBU1RJUlEJMHgwMg0KICANCiAgaW50CXBjaWlk
ZV9tYXRjaCBfX1AoKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IGNmZGF0YSAq
LCB2b2lkICopKTsNCiAgdm9pZAlwY2lpZGVfYXR0YWNoIF9fUCgoc3RydWN0
IGRldmljZSAqLCBzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKikpOw0KKioqKioq
KioqKioqKioqDQoqKiogMjcwNCwyNzA2ICoqKioNCi0tLSAyNzI3LDI5MjUg
LS0tLQ0KICAJfQ0KICAJcmV0dXJuIHJ2Ow0KICB9DQorIA0KKyB2b2lkDQor
IGhwdDM2Nl9jaGlwX21hcChzYywgcGEpDQorICAgICAgICAgc3RydWN0IHBj
aWlkZV9zb2Z0YyAqc2M7DQorIAlzdHJ1Y3QgcGNpX2F0dGFjaF9hcmdzICpw
YTsNCisgew0KKyAJc3RydWN0IHBjaWlkZV9jaGFubmVsICpjcDsNCisgCXVf
aW50OF90IGNhYmxlLCBmYXN0aXJxOw0KKyAJcGNpcmVnX3QgaW50ZXJmYWNl
Ow0KKyAJYnVzX3NpemVfdCBjbWRzaXplLCBjdGxzaXplOw0KKyANCisgCWlm
IChwY2lpZGVfY2hpcGVuKHNjLCBwYSkgPT0gMCkNCisgCQlyZXR1cm47DQor
IA0KKyAJLyoNCisgCSAqIFBDSV9DTEFTU19SRUcgZG9lc24ndCBzZWVtIHRv
IGdpdmUgYSBzZW5zaWJsZSB2YWx1ZSwgc28gZmFrZSBpdC4NCisgCSAqLw0K
KyAJaW50ZXJmYWNlID0gUENJSURFX0lOVEVSRkFDRV9TRVRUQUJMRSgwKSB8
IFBDSUlERV9JTlRFUkZBQ0VfUENJKDApDQorIAkJfCBQQ0lJREVfSU5URVJG
QUNFX0JVU19NQVNURVJfRE1BOw0KKyANCisgCXByaW50ZigiJXM6IGJ1cy1t
YXN0ZXIgRE1BIHN1cHBvcnQgcHJlc2VudCIsDQorIAkJc2MtPnNjX3dkY2Rl
di5zY19kZXYuZHZfeG5hbWUpOw0KKyAJcGNpaWRlX21hcHJlZ19kbWEoc2Ms
IHBhKTsNCisgCXByaW50ZigiXG4iKTsNCisgCXNjLT5zY193ZGNkZXYuY2Fw
ID0gV0RDX0NBUEFCSUxJVFlfREFUQTE2IHwgV0RDX0NBUEFCSUxJVFlfREFU
QTMyIHwNCisgCSAgICBXRENfQ0FQQUJJTElUWV9NT0RFIHwgV0RDX0NBUEFC
SUxJVFlfRE1BIHwgV0RDX0NBUEFCSUxJVFlfVURNQTsNCisgCXNjLT5zY193
ZGNkZXYuUElPX2NhcCA9IDQ7DQorIAlzYy0+c2Nfd2RjZGV2LkRNQV9jYXAg
PSAyOw0KKyAJc2MtPnNjX3dkY2Rldi5VRE1BX2NhcCA9IDQ7DQorIA0KKyAJ
c2MtPnNjX3dkY2Rldi5zZXRfbW9kZXMgPSBocHQzNjZfc2V0dXBfY2hhbm5l
bDsNCisgCXNjLT5zY193ZGNkZXYuY2hhbm5lbHMgPSBzYy0+d2RjX2NoYW5h
cnJheTsNCisgCXNjLT5zY193ZGNkZXYubmNoYW5uZWxzID0gMTsNCisgDQor
IAkvKg0KKyAJICogIFR1cm4gZmFzdCBpbnRlcnJ1cHQgcHJlZGljdGlvbiBv
biBvciBvZmYgKHdoYXRldmVyIHRoYXQgZG9lcyEpLg0KKyAJICogIEFwcGFy
ZW50bHkgc29tZSBkcml2ZXMgcHJlZmVyIGl0LCBhbHRob3VnaCBpdCBzZWVt
cyB0byBiZQ0KKyAJICogIHBlci1jaGFubmVsLCBub3QgcGVyIGRyaXZlLg0K
KyAJICovDQorIAkgDQorIAlmYXN0aXJxID0gcGNpaWRlX3BjaV9yZWFkKCBz
Yy0+c2NfcGMsIHNjLT5zY190YWcsIEhQVDM2Nl9GQVNUSVJRICk7DQorIAlp
ZiAoc2MtPnNjX3dkY2Rldi5zY19kZXYuZHZfY2ZkYXRhLT5jZl9mbGFncyAm
IFBDSUlERV9PUFRJT05TX0ZBU1RJUlEpIHsNCisgCQlwY2lpZGVfcGNpX3dy
aXRlKCBzYy0+c2NfcGMsIHNjLT5zY190YWcsIEhQVDM2Nl9GQVNUSVJRLA0K
KyAJCQkJCQlmYXN0aXJxIHwgSFBUMzY2X0ZBU1RJUlFfRkxBRyApOw0KKyAJ
fSBlbHNlIHsNCisgCQlwY2lpZGVfcGNpX3dyaXRlKCBzYy0+c2NfcGMsIHNj
LT5zY190YWcsIEhQVDM2Nl9GQVNUSVJRLA0KKyAJCQkJCQlmYXN0aXJxICYg
fkhQVDM2Nl9GQVNUSVJRX0ZMQUcgKTsNCisgCX0NCisgDQorIAljYWJsZSA9
IHBjaWlkZV9wY2lfcmVhZChzYy0+c2NfcGMsIHNjLT5zY190YWcsIDB4NWEg
KTsNCisgCXByaW50ZiggIiVzOiBVRE1BLyVzIGNhYmxlIChyZWc1YWggPSAw
eCUwMngpIGZhc3QgaW50ZXJydXB0ICVzXG4iLCANCisgCQlzYy0+c2Nfd2Rj
ZGV2LnNjX2Rldi5kdl94bmFtZSwNCisgCQkoY2FibGUgJiBIUFQzNjZfQ0FC
TEVfVURNQTMzKSA/ICIzMyIgOiAiNjYiLCBjYWJsZSwNCisgCQkoc2MtPnNj
X3dkY2Rldi5zY19kZXYuZHZfY2ZkYXRhLT5jZl9mbGFncyAmIFBDSUlERV9P
UFRJT05TX0ZBU1RJUlEpDQorIAkJCT8gIk9OIiA6ICJPRkYiICk7DQorIAlj
cCA9ICZzYy0+cGNpaWRlX2NoYW5uZWxzWzBdOw0KKyANCisgCXNjLT53ZGNf
Y2hhbmFycmF5WzBdID0gJmNwLT53ZGNfY2hhbm5lbDsNCisgCWNwLT5uYW1l
ID0gUENJSURFX0NIQU5ORUxfTkFNRSgwKTsNCisgCWNwLT53ZGNfY2hhbm5l
bC5jaGFubmVsID0gMDsNCisgCWNwLT53ZGNfY2hhbm5lbC53ZGMgPSAmc2Mt
PnNjX3dkY2RldjsNCisgCWNwLT53ZGNfY2hhbm5lbC5jaF9xdWV1ZSA9IG1h
bGxvYyhzaXplb2Yoc3RydWN0IGNoYW5uZWxfcXVldWUpLCBNX0RFVkJVRiwg
TV9OT1dBSVQpOw0KKyAJaWYgKGNwLT53ZGNfY2hhbm5lbC5jaF9xdWV1ZSA9
PSBOVUxMKSB7DQorIAkJcHJpbnRmKCIlcyAlcyBjaGFubmVsOiAiDQorIAkg
ICAgCSAgICAiY2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjb21tYW5kIHF1
ZXVlIiwNCisgCQkgICAgc2MtPnNjX3dkY2Rldi5zY19kZXYuZHZfeG5hbWUs
IGNwLT5uYW1lKTsNCisgCQlyZXR1cm47DQorIAl9DQorIAlwcmludGYoIiVz
OiAlcyBjaGFubmVsIGNvbmZpZ3VyZWQgdG8gbmF0aXZlLVBDSSBtb2RlXG4i
LA0KKyAJICAgIAkgICAgc2MtPnNjX3dkY2Rldi5zY19kZXYuZHZfeG5hbWUs
IGNwLT5uYW1lKTsNCisgCQ0KKyAJcGNpaWRlX21hcGNoYW4ocGEsIGNwLCBp
bnRlcmZhY2UsICZjbWRzaXplLCAmY3Rsc2l6ZSwgaHB0MzY2X3BjaV9pbnRy
KTsNCisgCWlmIChjcC0+aHdfb2sgPT0gMCkNCisgCQlyZXR1cm47DQorIAlo
cHQzNjZfc2V0dXBfY2hhbm5lbCgmY3AtPndkY19jaGFubmVsKTsNCisgDQor
IAlyZXR1cm47DQorIH0NCisgDQorIA0KKyB2b2lkDQorIGhwdDM2Nl9zZXR1
cF9jaGFubmVsKGNocCkNCisgCXN0cnVjdCBjaGFubmVsX3NvZnRjICpjaHA7
DQorIHsNCisgICAgICAgICBzdHJ1Y3QgYXRhX2RyaXZlX2RhdGFzICpkcnZw
Ow0KKyAJaW50IGRyaXZlOw0KKyAJaW50IGk7DQorIAl1X2ludDhfdCBidXNj
bG9ja19yZWc7DQorIAlpbnQgYnVzY2xvY2s7DQorIAl1X2ludDMyX3QgYmVm
b3JlLCBhZnRlcjsNCisgCXVfaW50MzJfdCBpZGVkbWFfY3RsOw0KKyAJc3Ry
dWN0IHBjaWlkZV9jaGFubmVsICpjcCA9IChzdHJ1Y3QgcGNpaWRlX2NoYW5u
ZWwqKWNocDsNCisgCXN0cnVjdCBwY2lpZGVfc29mdGMgKnNjID0gKHN0cnVj
dCBwY2lpZGVfc29mdGMgKiljcC0+d2RjX2NoYW5uZWwud2RjOw0KKyANCisg
CWJ1c2Nsb2NrX3JlZyA9IHBjaWlkZV9wY2lfcmVhZChzYy0+c2NfcGMsIHNj
LT5zY190YWcsIEhQVDM2Nl9CVVNDTE9DSygwKSk7DQorIA0KKyAJLyogc2V0
dXAgRE1BIGlmIG5lZWRlZCAqLw0KKyAJcGNpaWRlX2NoYW5uZWxfZG1hX3Nl
dHVwKGNwKTsNCisgDQorIAlpZGVkbWFfY3RsID0gMDsNCisgDQorICNpZmRl
ZiBfX2kzODZfXw0KKyAJc3dpdGNoKCBidXNjbG9ja19yZWcgKSB7DQorIAkJ
Y2FzZSBIUFQzNjZfQlVTQ0xPQ0tfNDA6DQorIAkJCWJ1c2Nsb2NrID0gNDA7
DQorIAkJCWJyZWFrOw0KKyANCisgCQlkZWZhdWx0Og0KKyAJCWNhc2UgSFBU
MzY2X0JVU0NMT0NLXzMzOg0KKyAJCQlidXNjbG9jayA9IDMzOw0KKyAJCQli
cmVhazsNCisgCQkJCQ0KKyAJCWNhc2UgSFBUMzY2X0JVU0NMT0NLXzI1Og0K
KyAJCQlidXNjbG9jayA9IDI1Ow0KKyAJCQlicmVhazsNCisgCX0NCisgI2Vs
c2UNCisgI2lmZGVmIFBDSV9CVVNDTE9DSw0KKyAJYnVzY2xvY2sgPSBQQ0lf
QlVTQ0xPQ0s7DQorICNlbHNlDQorIAlidXNjbG9jayA9IERFRkFVTFRfUENJ
X0JVU0NMT0NLOw0KKyAjZW5kaWYNCisgI2VuZGlmDQorIA0KKyAJZm9yKCBp
ID0gMDsgaSA8IChOX0hQVDM2Nl9USU1JTkdTIC0gMSk7ICsraSApDQorIAkJ
aWYoIGhwdDM2Nl90aW1pbmdzW2ldLmJ1c2Nsb2NrID49IGJ1c2Nsb2NrICkN
CisgCQkJYnJlYWs7DQorIAlwcmludGYoICIlczogYnVzIGNsb2NrICVkIE1I
eiAoYnVzY2xvY2sgcmVnIDB4JTAyeCksIHVzaW5nICVkIE1IeiB0aW1pbmdz
XG4iLA0KKyAJCWNwLT53ZGNfY2hhbm5lbC53ZGMtPnNjX2Rldi5kdl94bmFt
ZSwgYnVzY2xvY2ssIGJ1c2Nsb2NrX3JlZywNCisgCQlocHQzNjZfdGltaW5n
c1tpXS5idXNjbG9jayApOw0KKyANCisgCQ0KKyAJLyogUGVyIGRyaXZlIHNl
dHRpbmdzICovDQorIAlmb3IgKGRyaXZlID0gMDsgZHJpdmUgPCAyOyBkcml2
ZSsrKSB7DQorIAkJZHJ2cCA9ICZjaHAtPmNoX2RyaXZlW2RyaXZlXTsNCisg
CQkvKiBJZiBubyBkcml2ZSwgc2tpcCAqLw0KKyAJCWlmICgoZHJ2cC0+ZHJp
dmVfZmxhZ3MgJiBEUklWRSkgPT0gMCkNCisgCQkJY29udGludWU7DQorIA0K
KyAJCWJlZm9yZSA9IHBjaV9jb25mX3JlYWQoc2MtPnNjX3BjLCBzYy0+c2Nf
dGFnLA0KKyAJCQkJCUhQVDM2Nl9EQVRBX1RJTShkcml2ZSkpOw0KKyANCisg
ICAgICAgICAgICAgICAgIC8qIGFkZCB0aW1pbmcgdmFsdWVzLCBzZXR1cCBE
TUEgaWYgbmVlZGVkICovDQorICAgICAgICAgICAgICAgICBhZnRlciA9IGhw
dDM2Nl90aW1pbmdzW2ldLlBJT190aW1bZHJ2cC0+UElPX21vZGVdOw0KKyAg
ICAgICAgICAgICAgICAgaWYgKGRydnAtPmRyaXZlX2ZsYWdzICYgRFJJVkVf
VURNQSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciA9IGhw
dDM2Nl90aW1pbmdzW2ldLlVETUFfdGltW2RydnAtPlVETUFfbW9kZV07DQor
ICAgICAgICAgICAgICAgICAgICAgICAgIGlkZWRtYV9jdGwgfD0gSURFRE1B
X0NUTF9EUlZfRE1BKGRyaXZlKTsNCisgICAgICAgICAgICAgICAgIH0gZWxz
ZSBpZiAoZHJ2cC0+ZHJpdmVfZmxhZ3MgJiBEUklWRV9ETUEpIHsNCisgICAg
ICAgICAgICAgICAgICAgICAgICAgLyoNCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICogdXNlIE11bHRpd29yZCBETUEuDQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAqIFRpbWluZ3Mgd2lsbCBiZSB1c2VkIGZvciBib3RoIFBJ
TyBhbmQgRE1BLCBzbyBhZGp1c3QNCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICogRE1BIG1vZGUgaWYgbmVlZGVkDQorICAgICAgICAgICAgICAgICAg
ICAgICAgICAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJ2
cC0+UElPX21vZGUgPj0gMyAmJg0KKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKGRydnAtPkRNQV9tb2RlICsgMikgPiBkcnZwLT5QSU9fbW9kZSkg
ew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRydnAtPkRN
QV9tb2RlID0gZHJ2cC0+UElPX21vZGUgLSAyOw0KKyAgICAgICAgICAgICAg
ICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVy
ID0gaHB0MzY2X3RpbWluZ3NbaV0uRE1BX3RpbVtkcnZwLT5ETUFfbW9kZV07
DQorICAgICAgICAgICAgICAgICAgICAgICAgIGlkZWRtYV9jdGwgfD0gSURF
RE1BX0NUTF9EUlZfRE1BKGRyaXZlKTsNCisgICAgICAgICAgICAgICAgIH0N
CisgCQlhZnRlciAmPSB+SFBUMzY2X0RBVEFfVElNX0ZJRk87DQorIAkJcGNp
X2NvbmZfd3JpdGUoc2MtPnNjX3BjLCBzYy0+c2NfdGFnLA0KKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgSFBUMzY2X0RBVEFfVElNKGRy
aXZlKSwgYWZ0ZXIpOw0KKyAJCXByaW50ZiggIiVzOiBidXMgc3BlZWQgcmVn
aXN0ZXIgc2V0IHRvIDB4JTA4eCAoQklPUyAweCUwOHgpXG4iLA0KKyAJCQlk
cnZwLT5kcnZfc29mdGMtPmR2X3huYW1lLCBhZnRlciwgYmVmb3JlICk7DQor
IAl9DQorIAlpZiAoaWRlZG1hX2N0bCAhPSAwKSB7DQorIAkJLyogQWRkIHNv
ZnR3YXJlIGJpdHMgaW4gc3RhdHVzIHJlZ2lzdGVyICovDQorIAkJYnVzX3Nw
YWNlX3dyaXRlXzEoc2MtPnNjX2RtYV9pb3QsIHNjLT5zY19kbWFfaW9oLA0K
KyAJCSAgICBJREVETUFfQ1RMLCBpZGVkbWFfY3RsKTsNCisgCX0NCisgCXBj
aWlkZV9wcmludF9tb2RlcyhjcCk7DQorIH0NCisgDQorIGludA0KKyBocHQz
NjZfcGNpX2ludHIoYXJnKQ0KKyAJdm9pZCAqYXJnOw0KKyB7DQorIAlzdHJ1
Y3QgcGNpaWRlX3NvZnRjICpzYyA9IGFyZzsNCisgCXN0cnVjdCBwY2lpZGVf
Y2hhbm5lbCAqY3AgPSAmc2MtPnBjaWlkZV9jaGFubmVsc1swXTsNCisgCXN0
cnVjdCBjaGFubmVsX3NvZnRjICp3ZGNfY3AgPSAmY3AtPndkY19jaGFubmVs
Ow0KKyAJaW50IHJ2ID0gMDsNCisgCXVfaW50OF90IGRtYXN0YXQ7DQorIA0K
KyAJLyoNCisgCSAqIENoZWNrIHRoZSBpbnRlcnJ1cHQgYmVsb25ncyB0byB0
aGlzIGNoYW5uZWwuDQorIAkgKi8NCisgCWRtYXN0YXQgPSBidXNfc3BhY2Vf
cmVhZF8xKHNjLT5zY19kbWFfaW90LCBzYy0+c2NfZG1hX2lvaCwgSURFRE1B
X0NUTCk7DQorIAlpZiggIShkbWFzdGF0ICYgSURFRE1BX0NUTF9JTlRSKSAp
DQorIAkJcmV0dXJuIDA7DQorIAlidXNfc3BhY2Vfd3JpdGVfMShzYy0+c2Nf
ZG1hX2lvdCwgc2MtPnNjX2RtYV9pb2gsIElERURNQV9DVEwsIGRtYXN0YXQp
Ow0KKyANCisgCXJ2ID0gd2RjaW50cih3ZGNfY3ApOw0KKyAJcmV0dXJuIChy
dik7DQorIH0NCisgDQpkaWZmIC1jIC0tbmV3LWZpbGUgZGV2L3BjaS5vbGQv
cGNpaWRlX2hwdDM2Nl9yZWcuaCBkZXYvcGNpL3BjaWlkZV9ocHQzNjZfcmVn
LmgNCioqKiBkZXYvcGNpLm9sZC9wY2lpZGVfaHB0MzY2X3JlZy5oCVRodSBK
YW4gIDEgMDE6MDA6MDAgMTk3MA0KLS0tIGRldi9wY2kvcGNpaWRlX2hwdDM2
Nl9yZWcuaAlXZWQgTWFyIDE1IDIyOjQ0OjEwIDIwMDANCioqKioqKioqKioq
KioqKg0KKioqIDAgKioqKg0KLS0tIDEsMTU5IC0tLS0NCisgLyoNCisgICog
Q29weXJpZ2h0IChjKSAyMDAwIFRoZSBOZXRCU0QgRm91bmRhdGlvbiwgSW5j
Lg0KKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKyAgKg0KKyAgKiBBdXRo
b3I6ICBSb2dlciBCcm9va3MgKHJzYkBsaXYuYWMudWspLg0KKyAgKg0KKyAg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisgICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zDQorICAqIGFyZSBtZXQ6DQorICAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0DQorICAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisgICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQNCisgICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQ0KKyAgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLg0KKyAgKiAzLiBB
bGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMg
b3IgdXNlIG9mIHRoaXMgc29mdHdhcmUNCisgICogICAgbXVzdCBkaXNwbGF5
IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50Og0KKyAgKiAgICAgICAg
VGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0
aGUgTmV0QlNEDQorICAqICAgICAgICBGb3VuZGF0aW9uLCBJbmMuIGFuZCBp
dHMgY29udHJpYnV0b3JzLg0KKyAgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9m
IFRoZSBOZXRCU0QgRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cw0K
KyAgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBv
ciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQNCisgICogICAgZnJvbSB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJt
aXNzaW9uLg0KKyAgKg0KKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIFRIRSBORVRCU0QgRk9VTkRBVElPTiwgSU5DLiBBTkQgQ09OVFJJQlVU
T1JTDQorICAqIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRA0KKyAg
KiBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUg0KKyAgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEZPVU5E
QVRJT04gT1IgQ09OVFJJQlVUT1JTDQorICAqIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1INCisgICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YNCisgICog
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTDQorICAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElODQorICAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpDQorICAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFDQorICAq
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKyAgKg0KKyAgKi8NCisg
DQorIC8qDQorICAqIFJlZ2lzdGVyIGRlZmluaXRpb25zIGZvciB0aGUgSGln
aHBvaW50L1RyaW9uZXMgSFBUMzY2IFVETUEvNjYgUENJIElERQ0KKyAgKiBj
b250cm9sbGVyLiAgDQorICAqDQorICAqIFRoaXMgY2hpcCBoYXMgMiBQQ0kg
SURFIGZ1bmN0aW9ucywgZWFjaCBvZiB3aXRoIG9ubHkgb25lIChwcmltYXJ5
KQ0KKyAgKiBjaGFubmVsLiAgVGhlIHRpbWluZyBpbmZvcm1hdGlvbiBmb3Ig
MzMgTUh6IGJ1cyBzcGVlZHMgd2VyZSBvYnRhaW5lZCBmcm9tDQorICAqIHRo
ZSBCSU9TIChBYml0IEJQNiB2ZXIgTkopLCBhcyBkZXNjcmliZWQgYmVsb3cu
ICBUaW1pbmcgaW5mb3JtYXRpb24gZm9yDQorICAqIDI1IGFuZCA0MCBNSHog
d2FzIHRha2VuIGZyb20gdGhlIExpbnV4IGRyaXZlciBwYXRjaGVzIGJ5IEFu
ZHJlIEhlZHJpY2sNCisgICogKGFuZHJlQHN1c2UuY29tKS4NCisgICoNCisg
ICogQmVjYXVzZSBteSBzeXN0ZW0gaGFzIGNsb2NrLWxvY2tlZCBDZWxlcm9u
cywgSSB3YXMgdW5hYmxlIHRvIG9idGFpbiB0aW1pbmdzDQorICAqIGZvciBv
dGhlciBidXMgc3BlZWRzLiAgSG93ZXZlciwgdGVzdGluZyBhIDMzIE1IeiBQ
Q0kgYnVzIHdpdGggdGltaW5ncyBmb3INCisgICogNDAgTUh6IHJlc3VsdGVk
IGluIHByb2xpZmljIGRpc2sgSS9PIGVycm9ycywgd2hpbGUgdXNpbmcgdGhl
IDI1IE1IeiB0aW1pbmdzDQorICAqIHdhcyBldmVuIHdvcnNlOyBubyBJL08g
ZXJyb3JzLCBidXQgYSB1ZnMgcGFuaWMgd2hpbGUgcnVubmluZyAnbHMgLWxS
Jw0KKyAgKiBhbmQgdG90YWxseSB0cmFzaGVkIGZpbGVzeXN0ZW1zLg0KKyAg
Kg0KKyAgKiBQTEVBU0UgUFJPQ0VFRCBXSVRIIENBVVRJT04gSUYgWU9VIEhB
VkUgQSAyNSBPUiA0MCBNSHogUENJIEJVUywgQVMgSSBIQVZFDQorICAqIE5P
VCBCRUVOIEFCTEUgVE8gVEVTVCBUSEUgVFVOSU5HIFBBUkFNRVRFUlMuICBJ
IHdvdWxkIGFkdmlzZSB5b3UgdG8gdmVyaWZ5DQorICAqIHRoZW0gZm9yIHlv
dXJzZWxmIChkb24ndCBiZSBzdXJwcmlzZWQgaWYgeW91IGdldCBzb21lIGRp
ZmZlcmVudCB2YWx1ZXMgZnJvbQ0KKyAgKiB0aG9zZSB3aGljaCBjYW1lIGZy
b20gdGhlIExpbnV4IGRyaXZlciAtIEkgZGlkIGZvciAzMyBNSHopLg0KKyAg
Kg0KKyAgKiBJZiB5b3UgaGF2ZSBhIHN5c3RlbSB3aXRoIGEgYnVzIHNwZWVk
IG90aGVyIHRoYW4gMjUsIDMzIG9yIDQwIE1IeiB5b3Ugd2lsbA0KKyAgKiBh
bHNvIG5lZWQgdG8gZ2V0IHRoZSB0dW5pbmcgcGFyYW1ldGVycy4NCisgICoN
CisgICogWW91IHdpbGwgbmVlZCBhbiBpMzg2IG1hY2hpbmUgd2hpY2ggaXMg
c2V0IHRvIHRoZSByZXF1aXJlZCBidXMgc3BlZWQuDQorICAqIElmIHlvdSBh
cmUgdXNpbmcgYSBIUFQzNjYgUENJIGNhcmQgdGhlIEJJT1MgbXVzdCBiZSBl
bmFibGVkLiAgQ29ubmVjdCBhDQorICAqIFVETUEgbW9kZSA0IGRpc2sgYW5k
IGJvb3QgbmV0YnNkIGZyb20gYW5vdGhlciBkaXNrIChub3Qgb24gdGhlIEhQ
VDM2NikuDQorICAqIFNlYXJjaGluZyB0aGUgbWVzc2FnZSBsb2cgd2lsbCBn
aXZlIHlvdSB0aGUgdHVuaW5nIHBhcmFtZXRlciBmb3IgdGhpcyBtb2RlDQor
ICAqIGFuZCBidXMgc3BlZWQgKHRoZSB2YWx1ZSBzZXQgYnkgdGhlIEJJT1Mg
aXMgaW4gYnJhY2tldHMpLg0KKyAgKg0KKyAgKiAgICB3ZDI6IGJ1cyBzcGVl
ZCByZWdpc3RlciBzZXQgdG8gMHgxMGM5YTczMSAoQklPUyAweDEwYzlhNzMx
KQ0KKyAgKg0KKyAgKiBSZWJvb3QsIGFuZCB3aGVuIHRoZSBtYWNoaW5lIHJl
c2V0cywgZ28gaW50byB0aGUgSGlnaHBvaW50IEJJT1MgKHR5cGUgXkgpDQor
ICAqIGFuZCByZWR1Y2UgdGhlIGRpc2sgdG8gVURNQSBtb2RlIDMuICBMZXQg
dGhlIHN5c3RlbSBib290IGFuZCBnZXQgdGhlIG5leHQNCisgICogdHVuaW5n
IHBhcmFtZXRlciBmcm9tIHRoZSBtZXNzYWdlIGxvZy4gIFJlcGVhdCB0aGlz
IHByb2Nlc3MgZm9yIGFsbCBVRE1BLA0KKyAgKiBETUEgYW5kIFBJTyBtb2Rl
cywgYW5kIHlvdSB3aWxsIGhhdmUgYWxsIHRoZSB2YWx1ZXMgdG8gYWRkIGFu
b3RoZXIgZWxlbWVudA0KKyAgKiB0byBocHQzNjZfdGltaW5nc1tdLiAgSWYg
dGhlIEhpZ2hwb2ludCBCSU9TIGRvZXNuJ3QgZ2l2ZSBhIHNldHVwIHNjcmVl
bg0KKyAgKiB3aGVuIHlvdSB0eXBlIF5ILCB5b3UgbWF5IG5lZWQgYSBCSU9T
IHVwZ3JhZGUuDQorICAqDQorICAqIERvbid0IG1vdW50IGFueXRoaW5nIG9m
ZiB0aGUgSFBUMzY2IFIvVyB1bnRpbCB5b3UgaGF2ZSBidWlsdCBhIG5ldyBr
ZXJuZWwNCisgICogaW5jb3Jwb3JhdGluZyB0aGUgY29ycmVjdCB0dW5pbmcg
cGFyYW1ldGVycy4NCisgICoNCisgICogKioqIElNUE9SVEFOVCBOT1RFIGZv
ciBub24taTM4NiBtYWNoaW5lcyAqKioNCisgICoNCisgICogVGhlIEhQVDM2
NiBjb2RlIGlzIG5vdCBxdWl0ZSBtYWNoaW5lLWluZGVwZW5kZW50LiAgVGhl
IHBhcnQgd2hpY2ggaXMNCisgICogbWlzc2luZyBpcyBhIG1lYW5zIHRvIGRl
dGVybWluZSB0aGUgUENJIGJ1cyBjbG9jayBzcGVlZC4gIE9uIHRoZSBpMzg2
LA0KKyAgKiB0aGUgYnVzIGNsb2NrIGlzIG9idGFpbmVkIGJ5IHJlYWRpbmcg
SFBUMzY2X0RBVEFfVElNKGRyaXZlKSwgYnV0IEkgc3VzcGVjdA0KKyAgKiB0
aGlzIGhhcyBiZWVuIHNldCB1cCBieSB0aGUgQklPUy4gIElmIHlvdSBhcmUg
dXNpbmcgYSBQQ0kgY2FyZCAoZS5nLiBBYml0DQorICAqIEhvdC1Sb2QgNjYp
IGluIGEgbm9uLWkzODYgbWFjaGluZSwgeW91J2xsIHByb2JhYmx5IG5lZWQg
dG8gZmluZCBhIHdheSBvZg0KKyAgKiBkZXRlcm1pbmluZyB0aGUgYnVzIHNw
ZWVkLiAgSSd2ZSBhcnJhbmdlZCB0aGF0IG5vbi1pMzg2IGFyY2hpdGVjdHVy
ZXMgdXNlDQorICAqIGEgZGVmYXVsdCBvZiAzMyBNSHosIGJ1dCBpZiB5b3Ug
bmVlZCBhIGRpZmZlcmVudCB2YWx1ZSB5b3UgY2FuIHNwZWNpZnkgaXQNCisg
ICogaW4gdGhlIGtlcm5lbCBjb25maWcgZmlsZSB3aXRoDQorICAqDQorICAq
ICAgICAgb3B0aW9ucyBQQ0lfQlVTQ0xPQ0s9bm4NCisgICoNCisgICogVGhl
IGlkZWFsIHNvbHV0aW9uIHRvIHRoaXMgd291bGQgYmUgZm9yIHRoZSBtYWNo
aW5lLWRlcGVuZGVudCBQQ0kgY29kZSB0bw0KKyAgKiBwcm92aWRlIGEgZnVu
Y3Rpb24gd2hpY2ggcmV0dXJucyB0aGUgYnVzIHNwZWVkIChpdCBzaG91bGQg
dGFrZSBhbiBhcmcgb2YNCisgICogdHlwZSBwY2l0YWdfdCwgaW4gY2FzZSB0
aGVyZSBhcmUgdHdvIG9yIG1vcmUgYnVzZXMgd2l0aCBkaWZmZXJlbnQgc3Bl
ZWRzKS4NCisgICogDQorICAqLw0KKyAgDQorIA0KKyAjZGVmaW5lIEhQVDM2
Nl9GQVNUSVJRCQkweDUxDQorICNkZWZpbmUgSFBUMzY2X0ZBU1RJUlFfRkxB
RwkweDgwDQorIA0KKyAjZGVmaW5lIEhQVDM2Nl9DQUJMRQkJMHg1YQ0KKyAj
ZGVmaW5lIEhQVDM2Nl9DQUJMRV9VRE1BMzMJMHgwMg0KKyANCisgI2RlZmlu
ZSBIUFQzNjZfREFUQV9USU0oZHJpdmUpICgoZHJpdmUpID09IDAgPyAweDQw
IDogMHg0NCApDQorIA0KKyAjZGVmaW5lIEhQVDM2Nl9EQVRBX1RJTV9GSUZP
CTB4ODAwMDAwMDANCisgDQorIC8qIEJ1c2Nsb2NrIHNwZWVkIGluIHJlZyAw
eDQxLzB4NDUgKGJ5dGUgcmVnaXN0ZXIpICovDQorIA0KKyAjZGVmaW5lIEhQ
VDM2Nl9CVVNDTE9DSyhkcml2ZSkgKChkcml2ZSkgPT0gMCA/IDB4NDEgOiAw
eDQ1ICkNCisgDQorICNkZWZpbmUgSFBUMzY2X0JVU0NMT0NLXzQwCTB4ZDkN
CisgI2RlZmluZSBIUFQzNjZfQlVTQ0xPQ0tfMzMJMHhhNw0KKyAjZGVmaW5l
IEhQVDM2Nl9CVVNDTE9DS18yNQkweDg1DQorIA0KKyAjZGVmaW5lIERFRkFV
TFRfUENJX0JVU0NMT0NLIDMzDQorIA0KKyAvKg0KKyAgKiBUdW5pbmcgZm9y
IGJ1cyBjbG9jayBzcGVlZC4gIE9uIGkzODYgbWFjaGluZXMgdGhlIEhQVDM2
NiBCSU9TIGFwcGVhcnMgdG8NCisgICogaGF2ZSBzZXQgdGhlc2UgdXAsIGFs
dGhvdWdoIGhwdDM2Nl9zZXR1cF9jaGFubmVsKCkgc2V0cyB0aGVtIGZvciB0
aGUNCisgICogdHJhbnNmZXIgbW9kZSBhY3R1YWxseSBpbiB1c2UuDQorICAq
Lw0KKyANCisgI2RlZmluZSBOX1VETUEgNQ0KKyAjZGVmaW5lIE5fRE1BIDMN
CisgI2RlZmluZSBOX1BJTyA1DQorICANCisgc3RydWN0IGhwdDM2Nl90dW5l
IHsNCisgCWludCBidXNjbG9jazsNCisgCXVfaW50MzJfdCBVRE1BX3RpbVtO
X1VETUFdOw0KKyAJdV9pbnQzMl90IERNQV90aW1bTl9ETUFdOw0KKyAJdV9p
bnQzMl90IFBJT190aW1bTl9QSU9dOw0KKyB9Ow0KKyANCisgDQorIHN0YXRp
YyBzdHJ1Y3QgaHB0MzY2X3R1bmUgaHB0MzY2X3RpbWluZ3NbXSA9DQorIHsN
CisgCXsNCisgCSAgICAyNSwNCisgICAgICAgICAgICAgeyAweDkwY2I4NTIx
LCAweDkwY2I4NTIxLCAweDkwY2Y4NTIxLCAweDkwY2Y4NTIxLCAweDkwYzk4
NTIxIH0sDQorIAkgICAgeyAweGEwY2E4NTc1LCAweGEwY2E4NTMyLCAweGEw
Y2E4NTIxIH0sDQorICAgICAgICAgICAgIHsgMHhjMGQwODU4NSwgMHhjMGQw
ODU3MiwgMHhjMGNhODU0MiwgMHhjMGNhODUzMiwgMHhjMGNhODUyMSB9DQor
ICAgICAgICAgfSwNCisgICAgICAgICB7DQorICAgICAgICAgICAgIDMzLA0K
KyAgICAgICAgICAgICB7IDB4OTBjOGE3NTMsIDB4OTBjYmE3NDIsIDB4OTBj
YWE3MzEsIDB4OTBjZmE3MzEsIDB4OTBjOWE3MzEgfSwNCisgCSAgICB7IDB4
YTBjOGE3OTcsIDB4YTBjOGE3MzIsIDB4YTBjOGE3MzEgfSwNCisgICAgICAg
ICAgICAgeyAweDgwZDBhN2FhLCAweDgwZDBhN2EzLCAweDgwYzhhNzUzLCAw
eDgwYzhhNzQyLCAweDgwYzhhNzMxIH0NCisgICAgICAgICB9LA0KKyAJew0K
KyAJICAgIDQwLA0KKyAJICAgIHsgMHg5MDA4ZDk0MywgMHg5MDA4ZDk0Mywg
MHg5MDBiZDk0MywgMHg5MDBhZDk0MywgMHg5MDBmZDk0MyB9LA0KKyAJICAg
IHsgMHhhMDEwZDlmYywgMHhhMDEwZDk1NSwgMHhhMDA4ZDk0MyB9LA0KKyAg
ICAgICAgICAgICB7IDB4YzAxOGQ5ZDksIDB4YzAxMGQ5YzcsIDB4YzAxMGQ5
OTcsIDB4YzAxMGQ5NzQsIDB4YzAwOGQ5NjMgfQ0KKyAgICAgICAgIH0NCisg
fTsNCisgDQorICNkZWZpbmUgTl9IUFQzNjZfVElNSU5HUyAoIHNpemVvZiho
cHQzNjZfdGltaW5ncykgLyBzaXplb2Yoc3RydWN0IGhwdDM2Nl90dW5lKSkN
CioqKiBjb25mLm9sZC9maWxlcwlGcmkgRmViIDI1IDEyOjUyOjA3IDIwMDAN
Ci0tLSBjb25mL2ZpbGVzCVR1ZSBNYXIgMTQgMjI6NTA6MzYgMjAwMA0KKioq
KioqKioqKioqKioqDQoqKiogMzEsMzYgKioqKg0KLS0tIDMxLDM4IC0tLS0N
CiAgDQogIGRlZm9wdAlvcHRfZXhlY2ZtdC5oCUVYRUNfQU9VVCBFWEVDX0NP
RkYgRVhFQ19FQ09GRiBFWEVDX0VMRjMyIEVYRUNfRUxGNjQgRVhFQ19TQ1JJ
UFQNCiAgDQorIGRlZm9wdAlvcHRfcGNpX2J1c2Nsb2NrLmgJUENJX0JVU0NM
T0NLDQorIA0KICAjIGNvbXBhdGliaWxpdHkgb3B0aW9ucw0KICBkZWZvcHQJ
Q09NUEFUX0ZSRUVCU0QNCiAgZGVmb3B0CUNPTVBBVF9IUFVYDQo=
---559023410-758783491-953163436=:2874--