Date: Wed, 28 Jul 2010 02:04:14 +0530 From: "Jayachandran C." <c.jayachandran@gmail.com> To: freebsd-mips@freebsd.org Subject: Support for 64bit userspace. Message-ID: <AANLkTikAjRTMn0m1DemdmUXKMydmyQPxij%2BN=1d9L2=y@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
--0016e64757dcd58fd3048c646c04 Content-Type: text/plain; charset=ISO-8859-1 Here's my initial work to get 64bit user space. With this set of changes, I can boot to the single user shell with n64 /sbin/init and /bin/sh. There are still issues to fix, and the dynamic loader is still not working, but I think this would be a good time to get some initial feedback. The changes mainly add a 3 level page table for both userspace and kernel. The PTE entries are 32bit still (this will be changed to 64bit once I get the current code more stable) and the PDE entries are 64 bit, which would give us 40bit (9+9+10+12) virtual address space. Managing a both 32bit and 64 bit pagetables in one pmap.c was tough, so I have moved all the 64bit pmap code to a new file pmap64.c, and added a config option for 64bit. But otherwise the 32bit code is almost completely untouched. But once things are stable, we can see if some part of pmap.c and pmap64.c can be move to a common file. The changes have been grouped into (files are also at http://people.freebsd.org/~jchandra/mips-n64/ ) mips-n64-other.patch - header file and other minor changes - param.h - add PDRSHIFT/MASK for mid-level, rename SEGOFSET to SEGMASK for consistency. - _stdint.h/profile.h - 64 bit defs I missed in the last pass - vm_machdep.c/pm_machdep.c - add UX bit to status register where needed. mips-n64-asm.patch - changes for assembly files - exception.S - add second level page table lookup - excption.S/locore.S - enable UX in status - exception.S - the kernel stack is in XKSEG, so we need to set KX before saving registers - support.S - fuword should be 64bit in n64 - swtch.S kstack in XKSEG mips-n64-pmap.patch - move 64bit code to pmap64.c - revert the 64bit additions to pmap.c - create pmap64.c which will be used in 64 bit compilation, (this has some debugging code still in there, and there are still a few issues I'm looking at) mips-n64-config.patch - add config option for 64bit compile, so that we pick pmap.c in 32bit and pmap64.c in 64bit compile. I'm not sure if there is a better way to do this,. - options.mips, mips/conf/DEFAULTS - adds options KERNEL_32 and KERNEL_64, make KERNEL_32 default option - files.mips - use pmap.c or pmap64.c depending on kernel_32 or kernel_64 rmi-n64-rge.patch - support for 64 bit in RMI gmac driver. Let me know your comments (buildworld needs -DWITHOUT_DYNAMICROOT -DWITHOUT_CDDL -DWITHOUT_USB -DWITHOUT_BLUETOOTH, for now) Thanks, JC. --0016e64757dcd58fd3048c646c04 Content-Type: application/octet-stream; name="mips-n64-other.patch" Content-Disposition: attachment; filename="mips-n64-other.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gc55slvs0 SW5kZXg6IHN5cy9taXBzL2luY2x1ZGUvcGFyYW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9p bmNsdWRlL3BhcmFtLmgJKHJldmlzaW9uIDIxMDUzNCkKKysrIHN5cy9taXBzL2luY2x1ZGUvcGFy YW0uaAkod29ya2luZyBjb3B5KQpAQCAtMTAzLDkgKzEwMywyMiBAQAogI2RlZmluZQlQQUdFX1NI SUZUCTEyCQkvKiBMT0cyKFBBR0VfU0laRSkgKi8KICNkZWZpbmUJUEFHRV9TSVpFCSgxPDxQQUdF X1NISUZUKSAvKiBieXRlcy9wYWdlICovCiAjZGVmaW5lCVBBR0VfTUFTSwkoUEFHRV9TSVpFLTEp CisKICNkZWZpbmUJTlBURVBHCQkoUEFHRV9TSVpFLyhzaXplb2YgKHB0X2VudHJ5X3QpKSkKICNk ZWZpbmUJTlBERVBHCQkoUEFHRV9TSVpFLyhzaXplb2YgKHBkX2VudHJ5X3QpKSkKIAorI2lmIGRl ZmluZWQoX19taXBzX242NCkKKyNkZWZpbmUJU0VHU0hJRlQJMzEJCS8qIExPRzIoTkJTRUcpICov CisjZGVmaW5lCU5CU0VHCQkoMXVsIDw8IFNFR1NISUZUKQkvKiBieXRlcy9zZWdtZW50ICovCisj ZWxzZQorI2RlZmluZQlTRUdTSElGVAkyMgkJLyogTE9HMihOQlNFRykgKi8KKyNkZWZpbmUJTkJT RUcJCSgxIDw8IFNFR1NISUZUKQkvKiBieXRlcy9zZWdtZW50ICovCisjZW5kaWYKKyNkZWZpbmUJ UERSU0hJRlQJMjIgICAgICAgICAgICAgIC8qIG9ubHkgdXNlZCBpbiBuNjQgKi8KKyNkZWZpbmUJ UERSTUFTSwkJKCgxIDw8IFBEUlNISUZUKSAtIDEpCisjZGVmaW5lCU5CUERSCQkoMSA8PCBQRFJT SElGVCkJLyogYnl0ZXMvcGFnZWRpciAqLworI2RlZmluZQlTRUdNQVNLCQkoTkJTRUctMSkJLyog Ynl0ZSBvZmZzZXQgaW50byBzZWdtZW50ICovCisKICNkZWZpbmUJTUFYUEFHRVNJWkVTCTEJCS8q IG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBwYWdlIHNpemVzICovCiAKICNkZWZpbmUJQkxL REVWX0lPU0laRQkyMDQ4CQkvKiB4eHg6IFdoeSBpcyB0aGlzIDEvMiBwYWdlPyAqLwpJbmRleDog c3lzL21pcHMvaW5jbHVkZS9fc3RkaW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL21pcHMvaW5jbHVk ZS9fc3RkaW50LmgJKHJldmlzaW9uIDIxMDUzNCkKKysrIHN5cy9taXBzL2luY2x1ZGUvX3N0ZGlu dC5oCSh3b3JraW5nIGNvcHkpCkBAIC00NiwxNSArNDYsMjggQEAKICNkZWZpbmUJSU5UOF9DKGMp CQkoYykKICNkZWZpbmUJSU5UMTZfQyhjKQkJKGMpCiAjZGVmaW5lCUlOVDMyX0MoYykJCShjKQor I2lmIGRlZmluZWQoX19taXBzX242NCkKKyNkZWZpbmUJSU5UNjRfQyhjKQkJKGMgIyMgTCkKKyNl bHNlCiAjZGVmaW5lCUlOVDY0X0MoYykJCShjICMjIExMKQorI2VuZGlmCiAKICNkZWZpbmUJVUlO VDhfQyhjKQkJKGMpCiAjZGVmaW5lCVVJTlQxNl9DKGMpCQkoYykKICNkZWZpbmUJVUlOVDMyX0Mo YykJCShjICMjIFUpCisjaWYgZGVmaW5lZChfX21pcHNfbjY0KQorI2RlZmluZQlVSU5UNjRfQyhj KQkJKGMgIyMgVUwpCisjZWxzZQogI2RlZmluZQlVSU5UNjRfQyhjKQkJKGMgIyMgVUxMKQorI2Vu ZGlmCiAKKyNpZiBkZWZpbmVkKF9fbWlwc19uNjQpCisjZGVmaW5lCUlOVE1BWF9DKGMpCQkoYyAj IyBMKQorI2RlZmluZQlVSU5UTUFYX0MoYykJCShjICMjIFVMKQorI2Vsc2UKICNkZWZpbmUJSU5U TUFYX0MoYykJCShjICMjIExMKQogI2RlZmluZQlVSU5UTUFYX0MoYykJCShjICMjIFVMTCkKKyNl bmRpZgogCiAjZW5kaWYgLyogIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoX19TVERD X0NPTlNUQU5UX01BQ1JPUykgKi8KIApJbmRleDogc3lzL21pcHMvaW5jbHVkZS9wcm9maWxlLmgK PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQotLS0gc3lzL21pcHMvaW5jbHVkZS9wcm9maWxlLmgJKHJldmlzaW9uIDIxMDUz NCkKKysrIHN5cy9taXBzL2luY2x1ZGUvcHJvZmlsZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTUs NyArMTE1LDExIEBACiAKICNkZWZpbmUJRlVOQ1RJT05fQUxJR05NRU5UCTQKIAorI2lmZGVmIF9f bWlwc19uNjQKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwl1aW50ZnB0cl90OworI2Vsc2UKIHR5cGVk ZWYgdW5zaWduZWQgaW50CXVpbnRmcHRyX3Q7CisjZW5kaWYKIAogI2VuZGlmIC8qIF9LRVJORUwg Ki8KIApAQCAtMTIzLDcgKzEyNywxMSBAQAogICogQW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSB0 aGF0IGNhbiBob2xkIG5vbi1uZWdhdGl2ZSBkaWZmZXJlbmNlIGJldHdlZW4KICAqIGZ1bmN0aW9u IHBvaW50ZXJzLgogICovCisjaWZkZWYgX19taXBzX242NAordHlwZWRlZiB1X2xvbmcJZnB0cmRp ZmZfdDsKKyNlbHNlCiB0eXBlZGVmIHVfaW50CWZwdHJkaWZmX3Q7CisjZW5kaWYKIAogI2lmZGVm IF9LRVJORUwKIApJbmRleDogc3lzL21pcHMvaW5jbHVkZS9ydW5xLmgKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g c3lzL21pcHMvaW5jbHVkZS9ydW5xLmgJKHJldmlzaW9uIDIxMDUzNCkKKysrIHN5cy9taXBzL2lu Y2x1ZGUvcnVucS5oCSh3b3JraW5nIGNvcHkpCkBAIC00Miw3ICs0MiwxMSBAQAogI2RlZmluZQlS UUJfQklUKHByaSkJKDF1bCA8PCAoKHByaSkgJiAoUlFCX0JQVyAtIDEpKSkKICNkZWZpbmUJUlFC X1dPUkQocHJpKQkoKHByaSkgPj4gUlFCX0wyQlBXKQogCisjaWYgZGVmaW5lZChfX21pcHNfbjY0 KQorI2RlZmluZQlSUUJfRkZTKHdvcmQpCShmZnNsKHdvcmQpIC0gMSkKKyNlbHNlCiAjZGVmaW5l CVJRQl9GRlMod29yZCkJKGZmcyh3b3JkKSAtIDEpCisjZW5kaWYKIAogLyoKICAqIFR5cGUgb2Yg cnVuIHF1ZXVlIHN0YXR1cyB3b3JkLgpJbmRleDogc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQotLS0gc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgJKHJldmlzaW9uIDIxMDUzNCkKKysr IHN5cy9taXBzL2luY2x1ZGUvcG1hcC5oCSh3b3JraW5nIGNvcHkpCkBAIC00OSw3ICs0OSw4IEBA CiAjaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+CiAjaW5jbHVkZSA8bWFjaGluZS9wdGUuaD4K IAotI2RlZmluZQlOS1BUCQkxMjAJLyogYWN0dWFsIG51bWJlciBvZiBrZXJuZWwgcGFnZSB0YWJs ZXMgKi8KKyNkZWZpbmUJTktQVAkJMTIwCQkvKiBhY3R1YWwgbnVtYmVyIG9mIGtlcm5lbCBwYWdl IHRhYmxlcyAqLworI2RlZmluZQlOVVBERQkJKE5QREVQRyAqIE5QREVQRykgLyogIyBvZiB1c2Vy c3BhY2UgcGFnZSB0YWJsZSBwYWdlcyAqLwogCiAjaWZuZGVmIExPQ09SRQogCkluZGV4OiBzeXMv bWlwcy9pbmNsdWRlL3ZtcGFyYW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9pbmNsdWRlL3Zt cGFyYW0uaAkocmV2aXNpb24gMjEwNTM0KQorKysgc3lzL21pcHMvaW5jbHVkZS92bXBhcmFtLmgJ KHdvcmtpbmcgY29weSkKQEAgLTUxLDEyICs1MSw2IEBACiAgKiBpcyB0aGUgdG9wIChlbmQpIG9m IHRoZSB1c2VyIHN0YWNrLgogICovCiAjZGVmaW5lCVVTUlRFWFQJCSgxKlBBR0VfU0laRSkKLS8q Ci0gKiBVU1JTVEFDSyBuZWVkcyB0byBzdGFydCBhIGxpdHRsZSBiZWxvdyAweDgwMDAwMDAgYmVj YXVzZSB0aGUgUjgwMDAKLSAqIGFuZCBzb21lIFFFRCBDUFVzIHBlcmZvcm0gc29tZSB2aXJ0dWFs IGFkZHJlc3MgY2hlY2tzIGJlZm9yZSB0aGUKLSAqIG9mZnNldCBpcyBjYWxjdWxhdGVkLgotICov Ci0jZGVmaW5lCVVTUlNUQUNLCTB4N2ZmZmYwMDAJLyogU3RhcnQgb2YgdXNlciBzdGFjayAqLwog CiAvKgogICogVmlydHVhbCBtZW1vcnkgcmVsYXRlZCBjb25zdGFudHMsIGFsbCBpbiBieXRlcwpA QCAtMTAzLDE5ICs5NywyMiBAQAogI2RlZmluZQlWTV9NQVhfTU1BUF9BRERSCVZNX01BWFVTRVJf QUREUkVTUwogCiAjaWYgZGVmaW5lZChfX21pcHNfbjY0KQotI2RlZmluZQlWTV9NQVhVU0VSX0FE RFJFU1MJKFZNX01JTlVTRVJfQUREUkVTUyArIChOUERFUEcgKiBOUFRFUEcgKiBQQUdFX1NJWkUp KQorI2RlZmluZQlWTV9NQVhVU0VSX0FERFJFU1MJKFZNX01JTlVTRVJfQUREUkVTUyArIChOUERF UEcgKiBOUERFUEcgKiBOUFRFUEcgKiBQQUdFX1NJWkUpKQogI2RlZmluZQlWTV9NSU5fS0VSTkVM X0FERFJFU1MJKCh2bV9vZmZzZXRfdCkweGMwMDAwMDAwMDAwMDAwMDApCi0jZGVmaW5lCVZNX01B WF9LRVJORUxfQUREUkVTUwkoVk1fTUlOX0tFUk5FTF9BRERSRVNTICsgKE5QREVQRyAqIE5QVEVQ RyAqIFBBR0VfU0laRSkpCisjZGVmaW5lCVZNX01BWF9LRVJORUxfQUREUkVTUwkoVk1fTUlOX0tF Uk5FTF9BRERSRVNTICsgKE5QREVQRyAqIE5QREVQRyAqIE5QVEVQRyAqIFBBR0VfU0laRSkpCiAj ZWxzZQogI2RlZmluZQlWTV9NQVhVU0VSX0FERFJFU1MJKCh2bV9vZmZzZXRfdCkweDgwMDAwMDAw KQogI2RlZmluZQlWTV9NSU5fS0VSTkVMX0FERFJFU1MJKCh2bV9vZmZzZXRfdCkweEMwMDAwMDAw KQogI2RlZmluZQlWTV9NQVhfS0VSTkVMX0FERFJFU1MJKCh2bV9vZmZzZXRfdCkweEZGRkZDMDAw KQogI2VuZGlmCi0jaWYgMAotI2RlZmluZQlLRVJOQkFTRQkJKFZNX01JTl9LRVJORUxfQUREUkVT UykKLSNlbHNlCisKICNkZWZpbmUJS0VSTkJBU0UJCSgodm1fb2Zmc2V0X3QpKGludHB0cl90KShp bnQzMl90KTB4ODAwMDAwMDApCi0jZW5kaWYKKy8qCisgKiBVU1JTVEFDSyBuZWVkcyB0byBzdGFy dCBhIGxpdHRsZSBiZWxvdyAweDgwMDAwMDAgYmVjYXVzZSB0aGUgUjgwMDAKKyAqIGFuZCBzb21l IFFFRCBDUFVzIHBlcmZvcm0gc29tZSB2aXJ0dWFsIGFkZHJlc3MgY2hlY2tzIGJlZm9yZSB0aGUK KyAqIG9mZnNldCBpcyBjYWxjdWxhdGVkLgorICovCisjZGVmaW5lCVVTUlNUQUNLCQkoVk1fTUFY VVNFUl9BRERSRVNTIC0gUEFHRV9TSVpFKSAvKiBTdGFydCBvZiB1c2VyIHN0YWNrICovCiAKIC8q CiAgKiBEaXNhYmxlIHN1cGVycGFnZSByZXNlcnZhdGlvbnMuIChub3Qgc3VyZSBpZiB0aGlzIGlz IHJpZ2h0CkBAIC0xOTgsOCArMTk1LDQgQEAKICAqLwogI2RlZmluZQlWTV9ORlJFRU9SREVSCQk5 CiAKLSNkZWZpbmUgU0VHU0hJRlQJMjIJCS8qIExPRzIoTkJTRUcpICovCi0jZGVmaW5lIE5CU0VH CQkoMSA8PCBTRUdTSElGVCkJLyogYnl0ZXMvc2VnbWVudCAqLwotI2RlZmluZSBTRUdPRlNFVAko TkJTRUctMSkJLyogYnl0ZSBvZmZzZXQgaW50byBzZWdtZW50ICovCi0KICNlbmRpZiAvKiAhX01B Q0hJTkVfVk1QQVJBTV9IXyAqLwpJbmRleDogc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQotLS0gc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMJKHJldmlzaW9uIDIxMDUzNCkK KysrIHN5cy9taXBzL21pcHMvdm1fbWFjaGRlcC5jCSh3b3JraW5nIGNvcHkpCkBAIC0xNDgsOCAr MTQ4LDggQEAKIAlwY2IyLT5wY2JfY29udGV4dFtQQ0JfUkVHX1MwXSA9IChyZWdpc3Rlcl90KShp bnRwdHJfdClmb3JrX3JldHVybjsKIAlwY2IyLT5wY2JfY29udGV4dFtQQ0JfUkVHX1MxXSA9IChy ZWdpc3Rlcl90KShpbnRwdHJfdCl0ZDI7CiAJcGNiMi0+cGNiX2NvbnRleHRbUENCX1JFR19TMl0g PSAocmVnaXN0ZXJfdCkoaW50cHRyX3QpdGQyLT50ZF9mcmFtZTsKLQlwY2IyLT5wY2JfY29udGV4 dFtQQ0JfUkVHX1NSXSA9IChNSVBTX1NSX0tYIHwgTUlQU19TUl9JTlRfTUFTSykgJgotCSAgICBt aXBzX3JkX3N0YXR1cygpOworCXBjYjItPnBjYl9jb250ZXh0W1BDQl9SRUdfU1JdID0gbWlwc19y ZF9zdGF0dXMoKSAmCisJICAgIChNSVBTX1NSX0tYIHwgTUlQU19TUl9VWCB8IE1JUFNfU1JfSU5U X01BU0spOwogCS8qCiAJICogRlJFRUJTRF9ERVZFTE9QRVJTX0ZJWE1FOgogCSAqIFNldHVwIGFu eSBvdGhlciBDUFUtU3BlY2lmaWMgcmVnaXN0ZXJzIChOb3QgTUlQUyBTdGFuZGFyZCkKQEAgLTM1 MSw4ICszNTEsOCBAQAogCXBjYjItPnBjYl9jb250ZXh0W1BDQl9SRUdfUzFdID0gKHJlZ2lzdGVy X3QpKGludHB0cl90KXRkOwogCXBjYjItPnBjYl9jb250ZXh0W1BDQl9SRUdfUzJdID0gKHJlZ2lz dGVyX3QpKGludHB0cl90KXRkLT50ZF9mcmFtZTsKIAkvKiBEb250IHNldCBJRSBiaXQgaW4gU1Iu IHNjaGVkIGxvY2sgcmVsZWFzZSB3aWxsIHRha2UgY2FyZSBvZiBpdCAqLwotCXBjYjItPnBjYl9j b250ZXh0W1BDQl9SRUdfU1JdID0gKE1JUFNfU1JfS1ggfCBNSVBTX1NSX0lOVF9NQVNLKSAmCi0J ICAgIG1pcHNfcmRfc3RhdHVzKCk7CisJcGNiMi0+cGNiX2NvbnRleHRbUENCX1JFR19TUl0gPSBt aXBzX3JkX3N0YXR1cygpICYKKwkgICAgKE1JUFNfU1JfS1ggfCBNSVBTX1NSX1VYIHwgTUlQU19T Ul9JTlRfTUFTSyk7CiAKICNpZmRlZiBDUFVfQ05NSVBTCiAJcGNiMi0+cGNiX2NvbnRleHRbUENC X1JFR19TUl0gfD0gTUlQU19TUl9DT1BfMl9CSVQgfCBNSVBTX1NSX0NPUF8wX0JJVCB8CkluZGV4 OiBzeXMvbWlwcy9taXBzL3BtX21hY2hkZXAuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9taXBz L3BtX21hY2hkZXAuYwkocmV2aXNpb24gMjEwNTM0KQorKysgc3lzL21pcHMvbWlwcy9wbV9tYWNo ZGVwLmMJKHdvcmtpbmcgY29weSkKQEAgLTQ4Niw4ICs0ODYsMTAgQEAKIAl0ZC0+dGRfZnJhbWUt PnQ5ID0gaW1ncC0+ZW50cnlfYWRkciAmIH4zOyAvKiBhYmljYWxsIHJlcSAqLwogCXRkLT50ZF9m cmFtZS0+c3IgPSBNSVBTX1NSX0tTVV9VU0VSIHwgTUlQU19TUl9FWEwgfCBNSVBTX1NSX0lOVF9J RSB8CiAJICAgIChtaXBzX3JkX3N0YXR1cygpICYgTUlQU19TUl9JTlRfTUFTSyk7Ci0jaWYgZGVm aW5lZChfX21pcHNfbjMyKSB8fCBkZWZpbmVkKF9fbWlwc19uNjQpCisjaWYgZGVmaW5lZChfX21p cHNfbjMyKSAKIAl0ZC0+dGRfZnJhbWUtPnNyIHw9IE1JUFNfU1JfUFg7CisjZWxpZiAgZGVmaW5l ZChfX21pcHNfbjY0KQorCXRkLT50ZF9mcmFtZS0+c3IgfD0gTUlQU19TUl9QWCB8IE1JUFNfU1Jf VVg7CiAjZW5kaWYKICNpZmRlZiBDUFVfQ05NSVBTCiAJdGQtPnRkX2ZyYW1lLT5zciB8PSBNSVBT X1NSX0NPUF8yX0JJVCB8IE1JUFNfU1JfUFggfCBNSVBTX1NSX1VYIHwK --0016e64757dcd58fd3048c646c04 Content-Type: application/octet-stream; name="mips-n64-asm.patch" Content-Disposition: attachment; filename="mips-n64-asm.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gc572v7t1 SW5kZXg6IHN5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL21pcHMv bWlwcy9leGNlcHRpb24uUwkocmV2aXNpb24gMjEwNTM0KQorKysgc3lzL21pcHMvbWlwcy9leGNl cHRpb24uUwkod29ya2luZyBjb3B5KQpAQCAtMTM3LDcgKzEzNywxNSBAQAogCVBUUl9MCQlrMSwg MChrMSkJCQkjMDg6IGsxPXNlZyBlbnRyeQogCU1GQzAJCWswLCBNSVBTX0NPUF8wX0JBRF9WQURE UgkjMDk6IGswPWJhZCBhZGRyZXNzIChhZ2FpbikKIAliZXEJCWsxLCB6ZXJvLCAyZgkJCSMwYTog PT0wIC0tIG5vIHBhZ2UgdGFibGUKLQlzcmwJCWswLCBQQUdFX1NISUZUIC0gMgkJIzBiOiBrMD1W UE4gKGFrYSB2YT4+MTApCisjaWZkZWYgX19taXBzX242NAorCVBUUl9TUkwJCWswLCBQRFJTSElG VCAtIFBUUlNISUZUCQkjIGswPVZQTgorCWFuZGkJCWswLCBrMCwgUFRSTUFTSwkJCSMgazA9cGRl IG9mZnNldAorCVBUUl9BRERVCWsxLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRyZXNzCisJ UFRSX0wJCWsxLCAwKGsxKQkJCSMgazE9cGRlIGVudHJ5CisJTUZDMAkJazAsIE1JUFNfQ09QXzBf QkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQorCWJlcQkJazEsIHplcm8sIDJmCQkJ IyA9PTAgLS0gbm8gcGFnZSB0YWJsZQorI2VuZGlmCisJUFRSX1NSTAkJazAsIFBBR0VfU0hJRlQg LSAyCQkjMGI6IGswPVZQTiAoYWthIHZhPj4xMCkKIAlhbmRpCQlrMCwgazAsIDB4ZmY4CQkJIzBj OiBrMD1wYWdlIHRhYiBvZmZzZXQKIAlQVFJfQUREVQlrMSwgazEsIGswCQkJIzBkOiBrMT1wdGUg YWRkcmVzcwogCWx3CQlrMCwgMChrMSkJCQkjMGU6IGswPWxvMCBwdGUKQEAgLTIzOCw3ICsyNDYs NyBAQAogI2VsaWYgZGVmaW5lZChUQVJHRVRfWExSX1hMUykKICNkZWZpbmUgQ0xFQVJfU1RBVFVT IFwKIAltZmMwICAgIGEwLCBNSVBTX0NPUF8wX1NUQVRVUyAgIDtcCi0JbGkgICAgICBhMiwgKE1J UFNfU1JfS1ggfCBNSVBTX1NSX0NPUF8yX0JJVCkgOyBcCisJbGkgICAgICBhMiwgKE1JUFNfU1Jf S1ggfCBNSVBTX1NSX1VYIHwgTUlQU19TUl9DT1BfMl9CSVQpIDsgXAogCW9yICAgICAgYTAsIGEw LCBhMgkgICAgICAgIDsgXAogCWxpICAgICAgYTIsIH4oTUlQU19TUl9JTlRfSUUgfCBNSVBTX1NS X0VYTCB8IFNSX0tTVV9VU0VSKSAgIDsgXAogCWFuZCAgICAgYTAsIGEwLCBhMiAgICAgICAgICAg ICAgOyBcCkBAIC00MjYsNiArNDM0LDEyIEBACiAvKgogICogU2F2ZSBhbGwgb2YgdGhlIHJlZ2lz dGVycyBleGNlcHQgZm9yIHRoZSBrZXJuZWwgdGVtcG9yYXJpZXMgaW4gdS51X3BjYi4KICAqLwor CW1mYzAJazAsIE1JUFNfQ09QXzBfU1RBVFVTCisJSEFaQVJEX0RFTEFZCisjaWZkZWYgX19taXBz X242NAorCW9yaQlrMSwgazAsIE1JUFNfU1JfS1gKKwltdGMwCWsxLCBNSVBTX0NPUF8wX1NUQVRV UworI2VuZGlmCiAJR0VUX0NQVV9QQ1BVKGsxKQogCVBUUl9MCWsxLCBQQ19DVVJQQ0IoazEpCiAJ U0FWRV9VX1BDQl9SRUcoQVQsIEFTVCwgazEpCkBAIC00NDMsNyArNDU3LDcgQEAKIAlTQVZFX1Vf UENCX1JFRyh0MiwgVDIsIGsxKQogCVNBVkVfVV9QQ0JfUkVHKHQzLCBUMywgazEpCiAJU0FWRV9V X1BDQl9SRUcodGEwLCBUQTAsIGsxKQotCW1mYzAJYTAsIE1JUFNfQ09QXzBfU1RBVFVTCQkjIEZp cnN0IGFyZyBpcyB0aGUgc3RhdHVzIHJlZy4KKwltb3ZlCWEwLCBrMAkJCQkjIEZpcnN0IGFyZyBp cyB0aGUgc3RhdHVzIHJlZy4KIAlTQVZFX1VfUENCX1JFRyh0YTEsIFRBMSwgazEpCiAJU0FWRV9V X1BDQl9SRUcodGEyLCBUQTIsIGsxKQogCVNBVkVfVV9QQ0JfUkVHKHRhMywgVEEzLCBrMSkKQEAg LTQ3OCw3ICs0OTIsNyBAQAogI2lmIGRlZmluZWQoQ1BVX0NOTUlQUykKIAlvciAgICAgIHQwLCB0 MCwgKE1JUFNfU1JfS1ggfCBNSVBTX1NSX1NYIHwgTUlQU19TUl9VWCB8IE1JUFNfU1JfUFgpCiAj ZWxpZiBkZWZpbmVkKFRBUkdFVF9YTFJfWExTKQkKLQlvciAgICAgIHQwLCB0MCwgKE1JUFNfU1Jf S1ggfCBNSVBTX1NSX0NPUF8yX0JJVCkKKwlvciAgICAgIHQwLCB0MCwgKE1JUFNfU1JfS1ggfCBN SVBTX1NSX1VYIHwgTUlQU19TUl9DT1BfMl9CSVQpCiAjZW5kaWYJCiAJbXRjMAl0MCwgTUlQU19D T1BfMF9TVEFUVVMKIAlQVFJfQUREVSBhMCwgazEsIFVfUENCX1JFR1MKQEAgLTY0Miw2ICs2NTYs MTIgQEAKICAqIFNhdmUgdGhlIHJlbGV2YW50IHVzZXIgcmVnaXN0ZXJzIGludG8gdGhlIHUudV9w Y2Igc3RydWN0LgogICogV2UgZG9uJ3QgbmVlZCB0byBzYXZlIHMwIC0gczggYmVjYXVzZSB0aGUg Y29tcGlsZXIgZG9lcyBpdCBmb3IgdXMuCiAgKi8KKwltZmMwCWswLCBNSVBTX0NPUF8wX1NUQVRV UworCUhBWkFSRF9ERUxBWQorI2lmZGVmIF9fbWlwc19uNjQKKwlvcmkJazEsIGswLCBNSVBTX1NS X0tYCisJbXRjMAlrMSwgTUlQU19DT1BfMF9TVEFUVVMKKyNlbmRpZgogCUdFVF9DUFVfUENQVShr MSkKIAlQVFJfTAlrMSwgUENfQ1VSUENCKGsxKQogCVNBVkVfVV9QQ0JfUkVHKEFULCBBU1QsIGsx KQpAQCAtNjgwLDcgKzcwMCw3IEBACiAKIAltZmxvCXYwCQkJIyBnZXQgbG8vaGkgbGF0ZSB0byBh dm9pZCBzdGFsbAogCW1maGkJdjEKLQltZmMwCWEwLCBNSVBTX0NPUF8wX1NUQVRVUworCW1vdmUJ YTAsIGswCiAJbWZjMAlhMSwgTUlQU19DT1BfMF9DQVVTRQogCU1GQzAJYTMsIE1JUFNfQ09QXzBf RVhDX1BDCiAJU0FWRV9VX1BDQl9SRUcodjAsIE1VTExPLCBrMSkKQEAgLTY5Niw3ICs3MTYsNyBA QAogI2lmZGVmIENQVV9DTk1JUFMKIAlvciAgICAgIHQwLCB0MCwgKE1JUFNfU1JfS1ggfCBNSVBT X1NSX1NYIHwgTUlQU19TUl9VWCB8IE1JUFNfU1JfUFgpCiAjZWxpZiBkZWZpbmVkKFRBUkdFVF9Y TFJfWExTKQkKLQlvciAgICAgIHQwLCB0MCwgKE1JUFNfU1JfS1ggfCBNSVBTX1NSX0NPUF8yX0JJ VCkKKwlvciAgICAgIHQwLCB0MCwgKE1JUFNfU1JfS1ggfCBNSVBTX1NSX1VYIHwgTUlQU19TUl9D T1BfMl9CSVQpCiAjZW5kaWYJCiAJbXRjMAl0MCwgTUlQU19DT1BfMF9TVEFUVVMKIAlJVExCTk9Q RklYCkBAIC04MjQsNiArODQ0LDE4IEBACiAJYmVxegkJazEsIDNmCiAJbm9wCiAKKyNpZmRlZiBf X21pcHNfbjY0CisJTUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCisJUFRSX1NSTAkJazAs IFBEUlNISUZUIC0gUFRSU0hJRlQJCSMgazA9cGRlIG9mZnNldCAoYWxtb3N0KQorCWJlcQkJazEs IHplcm8sIE1pcHNLZXJuR2VuRXhjZXB0aW9uCSMgPT0wIC0tIG5vIHBkZSB0YWIKKwlhbmRpCQlr MCwgazAsIFBUUk1BU0sJCQkjIGswPXBkZSBvZmZzZXQKKwlQVFJfQUREVQlrMSwgazAsIGsxCQkJ IyBrMT1wZGUgZW50cnkgYWRkcmVzcworCVBUUl9MCQlrMSwgMChrMSkJCQkjIGsxPXBkZSBlbnRy eQorCisJLyogVmFsaWRhdGUgcGRlIHRhYmxlIHBvaW50ZXIuICAqLworCWJlcXoJCWsxLCAzZgor CW5vcAorI2VuZGlmCiAJTUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFk ZHJlc3MgKGFnYWluKQogCVBUUl9TUkwJCWswLCBQQUdFX1NISUZUIC0gMgkJIyBrMD1WUE4KIAlh bmRpCQlrMCwgazAsIDB4ZmZjCQkJIyBrMD1wYWdlIHRhYiBvZmZzZXQKQEAgLTk4NCw2ICsxMDE2 LDE0IEBACiAJUFRSX0wJCWsxLCAwKGsxKQkJCSMgazE9c2VnIGVudHJ5CiAJTUZDMAkJazAsIE1J UFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQogCWJlcQkJazEsIHpl cm8sIE1pcHNLZXJuR2VuRXhjZXB0aW9uCSMgPT0wIC0tIG5vIHBhZ2UgdGFibGUKKyNpZmRlZiBf X21pcHNfbjY0CisJUFRSX1NSTAkJazAsIFBEUlNISUZUIC0gUFRSU0hJRlQJCSMgazA9VlBOCisJ YW5kaQkJazAsIGswLCBQVFJNQVNLCQkJIyBrMD1wZGUgb2Zmc2V0CisJUFRSX0FERFUJazEsIGsw LCBrMQkJCSMgazE9cGRlIGVudHJ5IGFkZHJlc3MKKwlQVFJfTAkJazEsIDAoazEpCQkJIyBrMT1w ZGUgZW50cnkKKwlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFERFIJIyBrMD1iYWQgYWRkcmVz cyAoYWdhaW4pCisgIAliZXEJCWsxLCB6ZXJvLCBNaXBzS2VybkdlbkV4Y2VwdGlvbgkjID09MCAt LSBubyBwYWdlIHRhYmxlCisjZW5kaWYKIAlQVFJfU1JMCQlrMCwgUEFHRV9TSElGVCAtIDIJCSMg azA9VlBOCiAJYW5kaQkJazAsIGswLCAweGZmOAkJCSMgazA9cGFnZSB0YWIgb2Zmc2V0CiAJUFRS X0FERFUJazEsIGsxLCBrMAkJCSMgazE9cHRlIGFkZHJlc3MKSW5kZXg6IHN5cy9taXBzL21pcHMv Z2VuYXNzeW0uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9taXBzL2dlbmFzc3ltLmMJKHJldmlz aW9uIDIxMDUzNCkKKysrIHN5cy9taXBzL21pcHMvZ2VuYXNzeW0uYwkod29ya2luZyBjb3B5KQpA QCAtOTQsNiArOTQsNyBAQAogQVNTWU0oUEFHRV9TSVpFLCBQQUdFX1NJWkUpOwogQVNTWU0oUEFH RV9NQVNLLCBQQUdFX01BU0spOwogQVNTWU0oU0VHU0hJRlQsIFNFR1NISUZUKTsKK0FTU1lNKFBE UlNISUZULCBQRFJTSElGVCk7CiBBU1NZTShOUFRFUEcsIE5QVEVQRyk7CiBBU1NZTShUREZfTkVF RFJFU0NIRUQsIFRERl9ORUVEUkVTQ0hFRCk7CiBBU1NZTShUREZfQVNUUEVORElORywgVERGX0FT VFBFTkRJTkcpOwpAQCAtMTAzLDMgKzEwNCw0IEBACiBBU1NZTShNSVBTX0tTRUcwX1NUQVJULCBN SVBTX0tTRUcwX1NUQVJUKTsKIEFTU1lNKE1JUFNfS1NFRzFfU1RBUlQsIE1JUFNfS1NFRzFfU1RB UlQpOwogQVNTWU0oTUlQU19LU0VHMl9TVEFSVCwgTUlQU19LU0VHMl9TVEFSVCk7CitBU1NZTShN SVBTX1hLU0VHX1NUQVJULCBNSVBTX1hLU0VHX1NUQVJUKTsKSW5kZXg6IHN5cy9taXBzL21pcHMv bG9jb3JlLlMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL21pcHMvbWlwcy9sb2NvcmUuUwkocmV2aXNpb24g MjEwNTM0KQorKysgc3lzL21pcHMvbWlwcy9sb2NvcmUuUwkod29ya2luZyBjb3B5KQpAQCAtMTAx LDcgKzEwMSw3IEBACiAgICAgICAgIGxpCXQwLCB+KE1JUFNfU1JfREUgfCBNSVBTX1NSX1NPRlRf UkVTRVQgfCBNSVBTX1NSX0VSTCB8IE1JUFNfU1JfRVhMIHwgTUlQU19TUl9JTlRfSUUpCiAjZWxp ZiBkZWZpbmVkIChUQVJHRVRfWExSX1hMUykKIAkvKiBTZXQgdGhlc2UgYml0cyAqLwotICAgICAg ICBsaQl0MSwgKE1JUFNfU1JfQ09QXzJfQklUIHwgTUlQU19TUl9DT1BfMF9CSVQgfCBNSVBTX1NS X0tYKQorICAgICAgICBsaQl0MSwgKE1JUFNfU1JfQ09QXzJfQklUIHwgTUlQU19TUl9DT1BfMF9C SVQgfCBNSVBTX1NSX0tYIHwgTUlQU19TUl9VWCApCiAKIAkvKiBSZXNldCB0aGVzZSBiaXRzICov CiAgICAgICAgIGxpCXQwLCB+KE1JUFNfU1JfQkVWIHwgTUlQU19TUl9TT0ZUX1JFU0VUIHwgTUlQ U19TUl9JTlRfSUUpCkluZGV4OiBzeXMvbWlwcy9taXBzL3N3dGNoLlMKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g c3lzL21pcHMvbWlwcy9zd3RjaC5TCShyZXZpc2lvbiAyMTA1MzQpCisrKyBzeXMvbWlwcy9taXBz L3N3dGNoLlMJKHdvcmtpbmcgY29weSkKQEAgLTI3OCwxMCArMjc4LDEyIEBACiAJUFRSX0wJYTIs IFREX1BDQihhMSkKIAlQVFJfUwlhMiwgUENfQ1VSUENCKGEzKQogCVBUUl9MCXYwLCBURF9LU1RB Q0soYTEpCi0jaWYgIWRlZmluZWQoX19taXBzX242NCkKKyNpZiBkZWZpbmVkKF9fbWlwc19uNjQp CisJUFRSX0xJCXMwLCBNSVBTX1hLU0VHX1NUQVJUCisjZWxzZQogCVBUUl9MSQlzMCwgTUlQU19L U0VHMl9TVEFSVAkJIyBJZiBVYXJlYSBhZGRyIGlzIGJlbG93IGtzZWcyLAorI2VuZGlmCiAJYmx0 dQl2MCwgczAsIHN3MgkJCSMgbm8gbmVlZCB0byBpbnNlcnQgaW4gVExCLgotI2VuZGlmCiAJbHcJ YTEsIFREX1VQVEUgKyAwKHM3KQkJIyBhMSA9IHUuIHB0ZSAjMAogCWx3CWEyLCBURF9VUFRFICsg NChzNykJCSMgYTIgPSB1LiBwdGUgIzEKIC8qCkluZGV4OiBzeXMvbWlwcy9taXBzL3N1cHBvcnQu Uwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9taXBzL3N1cHBvcnQuUwkocmV2aXNpb24gMjEwNTM0 KQorKysgc3lzL21pcHMvbWlwcy9zdXBwb3J0LlMJKHdvcmtpbmcgY29weSkKQEAgLTQyOSw4ICs0 MjksOSBAQAogICoge2Z1LHN1fSx7Ynl0ZSxzd29yZCx3b3JkfSwgZmV0Y2ggb3Igc3RvcmUgYSBi eXRlLCBzaG9ydCBvciB3b3JkIHRvCiAgKiB1c2VyIGRhdGEgc3BhY2UuCiAgKi8KLUxFQUYoZnV3 b3JkKQotQUxFQUYoZnV3b3JkMzIpCisjaWYgZGVmaW5lZChfX21pcHNfbjY0KQorTEVBRihmdXdv cmQ2NCkKK0FMRUFGKGZ1d29yZCkKIEFMRUFGKGZ1aXdvcmQpCiAJUFRSX0xBCXYwLCBmc3diZXJy CiAJYmx0CWEwLCB6ZXJvLCBmc3diZXJyCSMgbWFrZSBzdXJlIGFkZHJlc3MgaXMgaW4gdXNlciBz cGFjZQpAQCAtNDM4LDEwICs0MzksMjYgQEAKIAlHRVRfQ1BVX1BDUFUodjEpCiAJUFRSX0wJdjEs IFBDX0NVUlBDQih2MSkKIAlQVFJfUwl2MCwgVV9QQ0JfT05GQVVMVCh2MSkKKwlsZAl2MCwgMChh MCkJCSMgZmV0Y2ggd29yZAorCWoJcmEKKwlQVFJfUwl6ZXJvLCBVX1BDQl9PTkZBVUxUKHYxKQor RU5EKGZ1d29yZDY0KQorI2VuZGlmCisKK0xFQUYoZnV3b3JkMzIpCisjaWYgIWRlZmluZWQoX19t aXBzX242NCkKK0FMRUFGKGZ1d29yZCkKKyNlbmRpZgorCVBUUl9MQQl2MCwgZnN3YmVycgorCWJs dAlhMCwgemVybywgZnN3YmVycgkjIG1ha2Ugc3VyZSBhZGRyZXNzIGlzIGluIHVzZXIgc3BhY2UK Kwlub3AKKwlHRVRfQ1BVX1BDUFUodjEpCisJUFRSX0wJdjEsIFBDX0NVUlBDQih2MSkKKwlQVFJf Uwl2MCwgVV9QQ0JfT05GQVVMVCh2MSkKIAlsdwl2MCwgMChhMCkJCSMgZmV0Y2ggd29yZAogCWoJ cmEKIAlQVFJfUwl6ZXJvLCBVX1BDQl9PTkZBVUxUKHYxKQotRU5EKGZ1d29yZCkKK0VORChmdXdv cmQzMikKIAogTEVBRihmdXN3b3JkKQogQUxFQUYoZnVpc3dvcmQpCg== --0016e64757dcd58fd3048c646c04 Content-Type: application/octet-stream; name="mips-n64-pmap.patch" Content-Disposition: attachment; filename="mips-n64-pmap.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gc572w172 SW5kZXg6IHN5cy9taXBzL21pcHMvcG1hcDY0LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL21pcHMvbWlw cy9wbWFwNjQuYwkocmV2aXNpb24gMCkKKysrIHN5cy9taXBzL21pcHMvcG1hcDY0LmMJKHJldmlz aW9uIDApCkBAIC0wLDAgKzEsMzAwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MSBSZWdl bnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2Vy dmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk0IEpvaG4gUy4gRHlzb24KKyAqIEFsbCByaWdodHMg cmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgRGF2aWQgR3JlZW5tYW4KKyAqIEFsbCBy aWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2Fy ZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogdGhlIFN5c3RlbXMgUHJvZ3JhbW1pbmcg R3JvdXAgb2YgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCBDb21wdXRlcgorICogU2NpZW5jZSBEZXBh cnRtZW50IGFuZCBXaWxsaWFtIEpvbGl0eiBvZiBVVU5FVCBUZWNobm9sb2dpZXMgSW5jLgorICoK KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0 aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5h bWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91 dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FS RSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBB TkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJ TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJ QUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJW SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ VElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQg T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ QklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglmcm9tOglAKCMpcG1hcC5jCTcuNyAo QmVya2VsZXkpCTUvMTIvOTEKKyAqCWZyb206IHNyYy9zeXMvaTM4Ni9pMzg2L3BtYXAuYyx2IDEu MjUwLjIuOCAyMDAwLzExLzIxIDAwOjA5OjE0IHBzCisgKglKTlBSOiBwbWFwLmMsdiAxLjExLjIu MSAyMDA3LzA4LzE2IDExOjUxOjA2IGdpcmlzaAorICovCisKKy8qCisgKglNYW5hZ2VzIHBoeXNp Y2FsIGFkZHJlc3MgbWFwcy4KKyAqCisgKglJbiBhZGRpdGlvbiB0byBoYXJkd2FyZSBhZGRyZXNz IG1hcHMsIHRoaXMKKyAqCW1vZHVsZSBpcyBjYWxsZWQgdXBvbiB0byBwcm92aWRlIHNvZnR3YXJl LXVzZS1vbmx5CisgKgltYXBzIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIHN0b3JlZCBpbiB0aGUg c2FtZQorICoJZm9ybSBhcyBoYXJkd2FyZSBtYXBzLglUaGVzZSBwc2V1ZG8tbWFwcyBhcmUKKyAq CXVzZWQgdG8gc3RvcmUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgZnJvbSBjb3B5CisgKglvcGVyYXRp b25zIHRvIGFuZCBmcm9tIGFkZHJlc3Mgc3BhY2VzLgorICoKKyAqCVNpbmNlIHRoZSBpbmZvcm1h dGlvbiBtYW5hZ2VkIGJ5IHRoaXMgbW9kdWxlIGlzCisgKglhbHNvIHN0b3JlZCBieSB0aGUgbG9n aWNhbCBhZGRyZXNzIG1hcHBpbmcgbW9kdWxlLAorICoJdGhpcyBtb2R1bGUgbWF5IHRocm93IGF3 YXkgdmFsaWQgdmlydHVhbC10by1waHlzaWNhbAorICoJbWFwcGluZ3MgYXQgYWxtb3N0IGFueSB0 aW1lLiAgSG93ZXZlciwgaW52YWxpZGF0aW9ucworICoJb2YgdmlydHVhbC10by1waHlzaWNhbCBt YXBwaW5ncyBtdXN0IGJlIGRvbmUgYXMKKyAqCXJlcXVlc3RlZC4KKyAqCisgKglJbiBvcmRlciB0 byBjb3BlIHdpdGggaGFyZHdhcmUgYXJjaGl0ZWN0dXJlcyB3aGljaAorICoJbWFrZSB2aXJ0dWFs LXRvLXBoeXNpY2FsIG1hcCBpbnZhbGlkYXRlcyBleHBlbnNpdmUsCisgKgl0aGlzIG1vZHVsZSBt YXkgZGVsYXkgaW52YWxpZGF0ZSBvciByZWR1Y2VkIHByb3RlY3Rpb24KKyAqCW9wZXJhdGlvbnMg dW50aWwgc3VjaCB0aW1lIGFzIHRoZXkgYXJlIGFjdHVhbGx5CisgKgluZWNlc3NhcnkuICBUaGlz IG1vZHVsZSBpcyBnaXZlbiBmdWxsIGluZm9ybWF0aW9uIGFzCisgKgl0byB3aGljaCBwcm9jZXNz b3JzIGFyZSBjdXJyZW50bHkgdXNpbmcgd2hpY2ggbWFwcywKKyAqCWFuZCB0byB3aGVuIHBoeXNp Y2FsIG1hcHMgbXVzdCBiZSBtYWRlIGNvcnJlY3QuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVm cy5oPgorX19GQlNESUQoIiRGcmVlQlNEOiBoZWFkL3N5cy9taXBzL21pcHMvcG1hcC5jIDIxMDMy NyAyMDEwLTA3LTIxIDA5OjI3OjAwWiBqY2hhbmRyYSAkIik7CisKKyNpbmNsdWRlICJvcHRfbXNn YnVmLmgiCisjaW5jbHVkZSAib3B0X2RkYi5oIgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+Cisj aW5jbHVkZSA8c3lzL3N5c3RtLmg+CisjaW5jbHVkZSA8c3lzL3Byb2MuaD4KKyNpbmNsdWRlIDxz eXMvbXNnYnVmLmg+CisjaW5jbHVkZSA8c3lzL3ZtbWV0ZXIuaD4KKyNpbmNsdWRlIDxzeXMvbW1h bi5oPgorI2luY2x1ZGUgPHN5cy9zbXAuaD4KKyNpZmRlZiBEREIKKyNpbmNsdWRlIDxkZGIvZGRi Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHZtL3ZtLmg+CisjaW5jbHVkZSA8dm0vdm1fcGFyYW0u aD4KKyNpbmNsdWRlIDx2bS92bV9waHlzLmg+CisjaW5jbHVkZSA8c3lzL2xvY2suaD4KKyNpbmNs dWRlIDxzeXMvbXV0ZXguaD4KKyNpbmNsdWRlIDx2bS92bV9rZXJuLmg+CisjaW5jbHVkZSA8dm0v dm1fcGFnZS5oPgorI2luY2x1ZGUgPHZtL3ZtX21hcC5oPgorI2luY2x1ZGUgPHZtL3ZtX29iamVj dC5oPgorI2luY2x1ZGUgPHZtL3ZtX2V4dGVybi5oPgorI2luY2x1ZGUgPHZtL3ZtX3BhZ2VvdXQu aD4KKyNpbmNsdWRlIDx2bS92bV9wYWdlci5oPgorI2luY2x1ZGUgPHZtL3VtYS5oPgorI2luY2x1 ZGUgPHN5cy9wY3B1Lmg+CisjaW5jbHVkZSA8c3lzL3NjaGVkLmg+CisjaWZkZWYgU01QCisjaW5j bHVkZSA8c3lzL3NtcC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxtYWNoaW5lL2NhY2hlLmg+Cisj aW5jbHVkZSA8bWFjaGluZS9tZF92YXIuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3RsYi5oPgorCisj aWYgZGVmaW5lZChESUFHTk9TVElDKQorI2RlZmluZQlQTUFQX0RJQUdOT1NUSUMKKyNlbmRpZgor CisjdW5kZWYgUE1BUF9ERUJVRworCisjaWZuZGVmIFBNQVBfU0hQR1BFUlBST0MKKyNkZWZpbmUJ UE1BUF9TSFBHUEVSUFJPQyAyMDAKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUE1BUF9ESUFHTk9T VElDKQorI2RlZmluZQlQTUFQX0lOTElORSBfX2lubGluZQorI2Vsc2UKKyNkZWZpbmUJUE1BUF9J TkxJTkUKKyNlbmRpZgorCisvKgorICogR2V0IFBERXMgYW5kIFBURXMgZm9yIHVzZXIva2VybmVs IGFkZHJlc3Mgc3BhY2UKKyAqCisgKiBYWFggVGhlICYgZm9yIHBtYXBfc2Vnc2hpZnQoKSBpcyB3 cm9uZywgYXMgaXMgdGhlIGZhY3QgdGhhdCBpdCBkb2Vzbid0CisgKiAgICAgdHJpbSBvZmYgZ3Jh dHVpdG91cyBiaXRzIG9mIHRoZSBhZGRyZXNzIHNwYWNlLiAgQnkgaGF2aW5nIHRoZSAmCisgKiAg ICAgdGhlcmUsIHdlIGJyZWFrIGRlZmluaW5nIE5VU0VSUEdUQkxTIGJlbG93IGJlY2F1c2UgdGhl IGFkZHJlc3Mgc3BhY2UKKyAqICAgICBpcyBkZWZpbmVkIHN1Y2ggdGhhdCBpdCBlbmRzIGltbWVk aWF0ZWx5IGFmdGVyIE5QREVQRypOUFRFUEcqUEFHRV9TSVpFLAorICogICAgIHNvIHdlIGVuZCB1 cCBnZXR0aW5nIE5VU0VSUEdUQkxTIG9mIDAuCisgKi8KKworI2RlZmluZQlwbWFwX3NlZ19pbmRl eCh2KQkoKCh2KSA+PiBTRUdTSElGVCkgJiAoTlBERVBHIC0gMSkpCisjZGVmaW5lCXBtYXBfcGRl X2luZGV4KHYpCSgoKHYpID4+IFBEUlNISUZUKSAmIChOUERFUEcgLSAxKSkKKyNkZWZpbmUJcG1h cF9wdGVfaW5kZXgodikJKCgodikgPj4gUEFHRV9TSElGVCkgJiAoTlBURVBHIC0gMSkpCisjZGVm aW5lIHBtYXBfcGRlX3BpbmRleCh2KSAgICAgICgodikgPj4gUERSU0hJRlQpCisgIAorI2RlZmlu ZQlOVVNFUlBHVEJMUwkJKHBtYXBfcGRlX3BpbmRleChWTV9NQVhVU0VSX0FERFJFU1MpKQorI2Rl ZmluZQlpc19rZXJuZWxfcG1hcCh4KQkoKHgpID09IGtlcm5lbF9wbWFwKQorCitzdHJ1Y3QgcG1h cCBrZXJuZWxfcG1hcF9zdG9yZTsKK3BkX2VudHJ5X3QgKmtlcm5lbF9zZWdtYXA7CisKK3ZtX29m ZnNldF90IHZpcnR1YWxfYXZhaWw7CS8qIFZBIG9mIGZpcnN0IGF2YWlsIHBhZ2UgKGFmdGVyIGtl cm5lbCBic3MpICovCit2bV9vZmZzZXRfdCB2aXJ0dWFsX2VuZDsJLyogVkEgb2YgbGFzdCBhdmFp bCBwYWdlIChlbmQgb2Yga2VybmVsIEFTKSAqLworCitzdGF0aWMgaW50IG5rcHQ7Cit1bnNpZ25l ZCBwbWFwX21heF9hc2lkOwkJLyogbWF4IEFTSUQgc3VwcG9ydGVkIGJ5IHRoZSBzeXN0ZW0gKi8K KworI2RlZmluZQlQTUFQX0FTSURfUkVTRVJWRUQJMAorCit2bV9vZmZzZXRfdCBrZXJuZWxfdm1f ZW5kID0gVk1fTUlOX0tFUk5FTF9BRERSRVNTOworCitzdGF0aWMgdm9pZCBwbWFwX2FzaWRfYWxs b2MocG1hcF90IHBtYXApOworCisvKgorICogRGF0YSBmb3IgdGhlIHB2IGVudHJ5IGFsbG9jYXRp b24gbWVjaGFuaXNtCisgKi8KK3N0YXRpYyB1bWFfem9uZV90IHB2em9uZTsKK3N0YXRpYyBzdHJ1 Y3Qgdm1fb2JqZWN0IHB2em9uZV9vYmo7CitzdGF0aWMgaW50IHB2X2VudHJ5X2NvdW50ID0gMCwg cHZfZW50cnlfbWF4ID0gMCwgcHZfZW50cnlfaGlnaF93YXRlciA9IDA7CisKK3N0YXRpYyBQTUFQ X0lOTElORSB2b2lkIGZyZWVfcHZfZW50cnkocHZfZW50cnlfdCBwdik7CitzdGF0aWMgcHZfZW50 cnlfdCBnZXRfcHZfZW50cnkocG1hcF90IGxvY2tlZF9wbWFwKTsKK3N0YXRpYyB2b2lkIHBtYXBf cHZoX2ZyZWUoc3RydWN0IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZh KTsKK3N0YXRpYyBwdl9lbnRyeV90IHBtYXBfcHZoX3JlbW92ZShzdHJ1Y3QgbWRfcGFnZSAqcHZo LCBwbWFwX3QgcG1hcCwKKyAgICB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgX19pbmxpbmUgdm9p ZCBwbWFwX2NoYW5nZWJpdCh2bV9wYWdlX3QgbSwgaW50IGJpdCwgYm9vbGVhbl90IHNldGVtKTsK Kworc3RhdGljIHZtX3BhZ2VfdCBwbWFwX2VudGVyX3F1aWNrX2xvY2tlZChwbWFwX3QgcG1hcCwg dm1fb2Zmc2V0X3QgdmEsCisgICAgdm1fcGFnZV90IG0sIHZtX3Byb3RfdCBwcm90LCB2bV9wYWdl X3QgbXB0ZSk7CitzdGF0aWMgaW50IHBtYXBfcmVtb3ZlX3B0ZShzdHJ1Y3QgcG1hcCAqcG1hcCwg cHRfZW50cnlfdCAqcHRxLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm9pZCBwbWFwX3JlbW92 ZV9wYWdlKHN0cnVjdCBwbWFwICpwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm9pZCBw bWFwX3JlbW92ZV9lbnRyeShzdHJ1Y3QgcG1hcCAqcG1hcCwgdm1fcGFnZV90IG0sIHZtX29mZnNl dF90IHZhKTsKK3N0YXRpYyBib29sZWFuX3QgcG1hcF90cnlfaW5zZXJ0X3B2X2VudHJ5KHBtYXBf dCBwbWFwLCB2bV9wYWdlX3QgbXB0ZSwKKyAgICB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0p Oworc3RhdGljIF9faW5saW5lIHZvaWQgcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcF90IHBtYXAs IHZtX29mZnNldF90IHZhKTsKK3N0YXRpYyBpbnQgX3BtYXBfdW53aXJlX3B0ZV9ob2xkKHBtYXBf dCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0pOworCitzdGF0aWMgdm1fcGFnZV90 IHBtYXBfYWxsb2NwdGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCBpbnQgZmxhZ3MpOwor c3RhdGljIHZtX3BhZ2VfdCBfcG1hcF9hbGxvY3B0ZShwbWFwX3QgcG1hcCwgdW5zaWduZWQgcHRl cGluZGV4LCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBwbWFwX3VudXNlX3B0KHBtYXBfdCwgdm1f b2Zmc2V0X3QsIHZtX3BhZ2VfdCk7CitzdGF0aWMgaW50IGluaXRfcHRlX3Byb3Qodm1fb2Zmc2V0 X3QgdmEsIHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgcHJvdCk7CitzdGF0aWMgdm1fcGFnZV90IHBt YXBfYWxsb2NfcHRlX3BhZ2UodW5zaWduZWQgaW50IGluZGV4LCBpbnQgcmVxKTsKK3N0YXRpYyB2 b2lkIHBtYXBfZ3Jvd19wdGVfcGFnZV9jYWNoZSh2b2lkKTsKKworI2lmZGVmIFNNUAorc3RhdGlj IHZvaWQgcG1hcF9pbnZhbGlkYXRlX3BhZ2VfYWN0aW9uKHZvaWQgKmFyZyk7CitzdGF0aWMgdm9p ZCBwbWFwX2ludmFsaWRhdGVfYWxsX2FjdGlvbih2b2lkICphcmcpOworc3RhdGljIHZvaWQgcG1h cF91cGRhdGVfcGFnZV9hY3Rpb24odm9pZCAqYXJnKTsKKyNlbmRpZgorCisvKgorICogVG9wIGxl dmVsIHBhZ2UgdGFibGUgZW50cnkgZm9yIGEgdmEKKyAqLworc3RhdGljIGlubGluZSBwZF9lbnRy eV90ICoKK3BtYXBfc2VnbWFwKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlyZXR1 cm4gKCZwbWFwLT5wbV9zZWd0YWJbcG1hcF9zZWdfaW5kZXgodmEpXSk7Cit9CisKK3N0YXRpYyBp bmxpbmUgcGRfZW50cnlfdCAqCitwbWFwX3BkcGVfdG9fcGRlKHBkX2VudHJ5X3QgKnBkcGUsIHZt X29mZnNldF90IHZhKQoreworCXBkX2VudHJ5X3QgKnBkZTsKKworCXBkZSA9IChwZF9lbnRyeV90 ICopKnBkcGU7CisJcmV0dXJuICgmcGRlW3BtYXBfcGRlX2luZGV4KHZhKV0pOworfQorCisvKgor ICogUmV0dXJuIHBhZ2UgZGlyZWN0b3J5IGVudHJ5IGZvciBhIHZhCisgKi8KK3N0YXRpYyBfX2lu bGluZSBwZF9lbnRyeV90ICoKK3BtYXBfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSkK K3sKKwlwZF9lbnRyeV90ICpwZHBlLCAqcGRlOworCisJcGRwZSA9IHBtYXBfc2VnbWFwKHBtYXAs IHZhKTsKKwlpZiAocGRwZSA9PSBOVUxMIHx8ICpwZHBlID09IE5VTEwpCisJCXJldHVybiAoTlVM TCk7CisKKwlwZGUgPSAocGRfZW50cnlfdCAqKSpwZHBlOworCXJldHVybiAoJnBkZVtwbWFwX3Bk ZV9pbmRleCh2YSldKTsKK30KKworc3RhdGljIGlubGluZSBwdF9lbnRyeV90ICoKK3BtYXBfcGRl X3RvX3B0ZShwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHZhKQoreworCXB0X2VudHJ5X3Qg KnB0ZTsKKworCXB0ZSA9IChwdF9lbnRyeV90ICopKnBkZTsKKwlyZXR1cm4gKCZwdGVbcG1hcF9w dGVfaW5kZXgodmEpXSk7Cit9CisKKy8qCisgKglSb3V0aW5lOglwbWFwX3B0ZQorICoJRnVuY3Rp b246CisgKgkJRXh0cmFjdCB0aGUgcGFnZSB0YWJsZSBlbnRyeSBhc3NvY2lhdGVkCisgKgkJd2l0 aCB0aGUgZ2l2ZW4gbWFwL3ZpcnR1YWxfYWRkcmVzcyBwYWlyLgorICovCitwdF9lbnRyeV90ICoK K3BtYXBfcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlwZF9lbnRyeV90ICpw ZGU7CisJcHRfZW50cnlfdCAqcHRlOworCisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCWlm IChwZGUgPT0gTlVMTCB8fCAqcGRlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlwdGUg PSAocHRfZW50cnlfdCAqKSpwZGU7CisJcmV0dXJuICgmcHRlW3BtYXBfcHRlX2luZGV4KHZhKV0p OworfQorCisKK3ZtX29mZnNldF90CitwbWFwX3N0ZWFsX21lbW9yeSh2bV9zaXplX3Qgc2l6ZSkK K3sKKwl2bV9zaXplX3QgYmFua19zaXplOworCXZtX29mZnNldF90IHBhLCB2YTsKKworCXNpemUg PSByb3VuZF9wYWdlKHNpemUpOworCisJYmFua19zaXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNf YXZhaWxbMF07CisJd2hpbGUgKHNpemUgPiBiYW5rX3NpemUpIHsKKwkJaW50IGk7CisKKwkJZm9y IChpID0gMDsgcGh5c19hdmFpbFtpICsgMl07IGkgKz0gMikgeworCQkJcGh5c19hdmFpbFtpXSA9 IHBoeXNfYXZhaWxbaSArIDJdOworCQkJcGh5c19hdmFpbFtpICsgMV0gPSBwaHlzX2F2YWlsW2kg KyAzXTsKKwkJfQorCQlwaHlzX2F2YWlsW2ldID0gMDsKKwkJcGh5c19hdmFpbFtpICsgMV0gPSAw OworCQlpZiAoIXBoeXNfYXZhaWxbMF0pCisJCQlwYW5pYygicG1hcF9zdGVhbF9tZW1vcnk6IG91 dCBvZiBtZW1vcnkiKTsKKwkJYmFua19zaXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNfYXZhaWxb MF07CisJfQorCisJcGEgPSBwaHlzX2F2YWlsWzBdOworCXBoeXNfYXZhaWxbMF0gKz0gc2l6ZTsK KwlpZiAocGEgPj0gTUlQU19LU0VHMF9MQVJHRVNUX1BIWVMpIHsKKwkJcGFuaWMoIk91dCBvZiBt ZW1vcnkgYmVsb3cgNTEyTWVnPyIpOworCX0KKwl2YSA9IE1JUFNfUEhZU19UT19LU0VHMChwYSk7 CisJYnplcm8oKGNhZGRyX3QpdmEsIHNpemUpOworCXJldHVybiB2YTsKK30KKworLyoKKyAqIEJv b3RzdHJhcCB0aGUgc3lzdGVtIGVub3VnaCB0byBydW4gd2l0aCB2aXJ0dWFsIG1lbW9yeS4gIFRo aXMKKyAqIGFzc3VtZXMgdGhhdCB0aGUgcGh5c19hdmFpbCBhcnJheSBoYXMgYmVlbiBpbml0aWFs aXplZC4KKyAqLworc3RhdGljIHZvaWQgCitjcmVhdGVfa2Vybl9wYWdlX3RhYmxlKHZvaWQpCit7 CisJaW50IG5wZGU7CisJaW50IGksIGosIG5wdDsKKwl2bV9vZmZzZXRfdCBwZGFkZHIsIHB0YWRk cjsKKwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOworCisJa2VybmVsX3NlZ21h cCA9IChwZF9lbnRyeV90ICopcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFKTsKKworCS8qCisJ ICogQWxsb2NhdGUgc2Vjb25kIGxldmVsIHBhZ2UgdGFibGVzIGZvciB0aGUga2VybmVsCisJICov CisJbnBkZSA9IGhvd21hbnkoTktQVCwgTlBERVBHKTsKKwlua3B0ID0gTktQVDsKKwlwZGFkZHIg PSBwbWFwX3N0ZWFsX21lbW9yeShQQUdFX1NJWkUgKiBucGRlKTsKKwlwdGFkZHIgPSBwbWFwX3N0 ZWFsX21lbW9yeShQQUdFX1NJWkUgKiBua3B0KTsKKwlwcmludGYoIk5QREUgJWx4IE5QS1BUICVs eCBcbiIsICh1X2xvbmcpbnBkZSwgKHVfbG9uZylua3B0KTsKKwkvKgorCSAqIFRoZSBSWzQtN10/ MDAgc3RvcmVzIG9ubHkgb25lIGNvcHkgb2YgdGhlIEdsb2JhbCBiaXQgaW4gdGhlCisJICogdHJh bnNsYXRpb24gbG9va2FzaWRlIGJ1ZmZlciBmb3IgZWFjaCAyIHBhZ2UgZW50cnkuIFRodXMgaW52 YWxpZAorCSAqIGVudHJ5cyBtdXN0IGhhdmUgdGhlIEdsb2JhbCBiaXQgc2V0IHNvIHdoZW4gRW50 cnkgTE8gYW5kIEVudHJ5IEhJCisJICogRyBiaXRzIGFyZSBhbmRlZCB0b2dldGhlciB0aGV5IHdp bGwgcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3RvcmUKKwkgKiBpbiB0aGUgdGxiLgorCSAqLwor CWZvciAoaSA9IDAsIHB0ZSA9IChwdF9lbnRyeV90ICopcHRhZGRyOyBpIDwgKG5rcHQgKiBOUFRF UEcpOyBpKyssIHB0ZSsrKQorCQkqcHRlID0gUFRFX0c7CisKKwlmb3IgKGkgPSAwLCAgbnB0ID0g bmtwdDsgbnB0ID4gMDsgaSsrKSB7CisJCWtlcm5lbF9zZWdtYXBbaV0gPSAocGRfZW50cnlfdCko cGRhZGRyICsgaSAqIFBBR0VfU0laRSk7CisJCXBkZSA9IChwZF9lbnRyeV90ICopa2VybmVsX3Nl Z21hcFtpXTsKKworCQlmb3IgKGogPSAwOyBqIDwgTlBERVBHICYmIG5wdCA+IDA7IGorKywgbnB0 LS0pCisJCQlwZGVbal0gPSAocGRfZW50cnlfdCkocHRhZGRyICsgKGkgKiBOUERFUEcgKyBqKSAq IFBBR0VfU0laRSk7CisJfQorCisJUE1BUF9MT0NLX0lOSVQoa2VybmVsX3BtYXApOworCWtlcm5l bF9wbWFwLT5wbV9zZWd0YWIgPSBrZXJuZWxfc2VnbWFwOworCWtlcm5lbF9wbWFwLT5wbV9hY3Rp dmUgPSB+MDsKKwlUQUlMUV9JTklUKCZrZXJuZWxfcG1hcC0+cG1fcHZsaXN0KTsKKwlrZXJuZWxf cG1hcC0+cG1fYXNpZFswXS5hc2lkID0gUE1BUF9BU0lEX1JFU0VSVkVEOworCWtlcm5lbF9wbWFw LT5wbV9hc2lkWzBdLmdlbiA9IDA7Cit9CisKK3ZvaWQKK3BtYXBfYm9vdHN0cmFwKHZvaWQpCit7 CisJaW50IGk7CisKKwkvKiBTb3J0LiAqLworYWdhaW46CisJZm9yIChpID0gMDsgcGh5c19hdmFp bFtpICsgMV0gIT0gMDsgaSArPSAyKSB7CisJCS8qCisJCSAqIEtlZXAgdGhlIG1lbW9yeSBhbGln bmVkIG9uIHBhZ2UgYm91bmRhcnkuCisJCSAqLworCQlwaHlzX2F2YWlsW2ldID0gcm91bmRfcGFn ZShwaHlzX2F2YWlsW2ldKTsKKwkJcGh5c19hdmFpbFtpICsgMV0gPSB0cnVuY19wYWdlKHBoeXNf YXZhaWxbaSArIDFdKTsKKworCQlpZiAoaSA8IDIpCisJCQljb250aW51ZTsKKwkJaWYgKHBoeXNf YXZhaWxbaSAtIDJdID4gcGh5c19hdmFpbFtpXSkgeworCQkJdm1fcGFkZHJfdCBwdGVtcFsyXTsK KworCQkJcHRlbXBbMF0gPSBwaHlzX2F2YWlsW2kgKyAwXTsKKwkJCXB0ZW1wWzFdID0gcGh5c19h dmFpbFtpICsgMV07CisKKwkJCXBoeXNfYXZhaWxbaSArIDBdID0gcGh5c19hdmFpbFtpIC0gMl07 CisJCQlwaHlzX2F2YWlsW2kgKyAxXSA9IHBoeXNfYXZhaWxbaSAtIDFdOworCisJCQlwaHlzX2F2 YWlsW2kgLSAyXSA9IHB0ZW1wWzBdOworCQkJcGh5c19hdmFpbFtpIC0gMV0gPSBwdGVtcFsxXTsK KwkJCWdvdG8gYWdhaW47CisJCX0KKwl9CisKKwkvKgorCSAqIENvcHkgdGhlIHBoeXNfYXZhaWxb XSBhcnJheSBiZWZvcmUgd2Ugc3RhcnQgc3RlYWxpbmcgbWVtb3J5IGZyb20gaXQuCisJICovCisJ Zm9yIChpID0gMDsgcGh5c19hdmFpbFtpICsgMV0gIT0gMDsgaSArPSAyKSB7CisJCXBoeXNtZW1f ZGVzY1tpXSA9IHBoeXNfYXZhaWxbaV07CisJCXBoeXNtZW1fZGVzY1tpICsgMV0gPSBwaHlzX2F2 YWlsW2kgKyAxXTsKKwl9CisKKwlNYXhtZW0gPSBhdG9wKHBoeXNfYXZhaWxbaSAtIDFdKTsKKwor CWlmIChib290dmVyYm9zZSkgeworCQlwcmludGYoIlBoeXNpY2FsIG1lbW9yeSBjaHVuayhzKTpc biIpOworCQlmb3IgKGkgPSAwOyBwaHlzX2F2YWlsW2kgKyAxXSAhPSAwOyBpICs9IDIpIHsKKwkJ CXZtX3BhZGRyX3Qgc2l6ZTsKKworCQkJc2l6ZSA9IHBoeXNfYXZhaWxbaSArIDFdIC0gcGh5c19h dmFpbFtpXTsKKwkJCXByaW50ZigiJSMwOGp4IC0gJSMwOGp4LCAlanUgYnl0ZXMgKCVqdSBwYWdl cylcbiIsCisJCQkgICAgKHVpbnRtYXhfdCkgcGh5c19hdmFpbFtpXSwKKwkJCSAgICAodWludG1h eF90KSBwaHlzX2F2YWlsW2kgKyAxXSAtIDEsCisJCQkgICAgKHVpbnRtYXhfdCkgc2l6ZSwgKHVp bnRtYXhfdCkgc2l6ZSAvIFBBR0VfU0laRSk7CisJCX0KKwkJcHJpbnRmKCJNYXhtZW0gaXMgMHgl MGx4XG4iLCBwdG9hKE1heG1lbSkpOworCX0KKwkvKgorCSAqIFN0ZWFsIHRoZSBtZXNzYWdlIGJ1 ZmZlciBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgbWVtb3J5LgorCSAqLworCW1zZ2J1ZnAgPSAoc3Ry dWN0IG1zZ2J1ZiAqKXBtYXBfc3RlYWxfbWVtb3J5KE1TR0JVRl9TSVpFKTsKKwltc2didWZpbml0 KG1zZ2J1ZnAsIE1TR0JVRl9TSVpFKTsKKworCS8qCisJICogU3RlYWwgdGhyZWFkMCBrc3RhY2su CisJICovCisJa3N0YWNrMCA9IHBtYXBfc3RlYWxfbWVtb3J5KEtTVEFDS19QQUdFUyA8PCBQQUdF X1NISUZUKTsKKworCXZpcnR1YWxfYXZhaWwgPSBWTV9NSU5fS0VSTkVMX0FERFJFU1M7CisJdmly dHVhbF9lbmQgPSBWTV9NQVhfS0VSTkVMX0FERFJFU1M7CisKKyNpZmRlZiBTTVAKKwkvKgorCSAq IFN0ZWFsIHNvbWUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIHRvIG1hcCB0aGUgcGNwdSBhcmVhLgor CSAqLworCXZpcnR1YWxfYXZhaWwgPSByb3VuZHVwMih2aXJ0dWFsX2F2YWlsLCBQQUdFX1NJWkUg KiAyKTsKKwlwY3B1cCA9IChzdHJ1Y3QgcGNwdSAqKXZpcnR1YWxfYXZhaWw7CisJdmlydHVhbF9h dmFpbCArPSBQQUdFX1NJWkUgKiAyOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSB3aXJlZCBU TEIgZW50cnkgbWFwcGluZyB0aGUgcGNwdSByZWdpb24gZm9yCisJICogdGhlIEJTUCBhdCAncGNw dXAnLiBVcCB1bnRpbCB0aGlzIHBvaW50IHdlIHdlcmUgb3BlcmF0aW5nCisJICogd2l0aCB0aGUg J3BjcHVwJyBmb3IgdGhlIEJTUCBwb2ludGluZyB0byBhIHZpcnR1YWwgYWRkcmVzcworCSAqIGlu IEtTRUcwIHNvIHRoZXJlIHdhcyBubyBuZWVkIGZvciBhIFRMQiBtYXBwaW5nLgorCSAqLworCW1p cHNfcGNwdV90bGJfaW5pdChQQ1BVX0FERFIoMCkpOworCisJaWYgKGJvb3R2ZXJib3NlKQorCQlw cmludGYoInBjcHUgaXMgYXZhaWxhYmxlIGF0IHZpcnR1YWwgYWRkcmVzcyAlcC5cbiIsIHBjcHVw KTsKKyNlbmRpZgorCisJLyoKKwkgKiBBbGxvY2F0ZSBzZWdtZW50IHRhYmxlIGZvciB0aGUga2Vy bmVsCisJICovCisJY3JlYXRlX2tlcm5fcGFnZV90YWJsZSgpOworCXBtYXBfbWF4X2FzaWQgPSBW TU5VTV9QSURTOworCW1pcHNfd3JfZW50cnloaSgwKTsKKwltaXBzX3dyX3BhZ2VtYXNrKDApOwor fQorCisvKgorICogSW5pdGlhbGl6ZSBhIHZtX3BhZ2UncyBtYWNoaW5lLWRlcGVuZGVudCBmaWVs ZHMuCisgKi8KK3ZvaWQKK3BtYXBfcGFnZV9pbml0KHZtX3BhZ2VfdCBtKQoreworCisJVEFJTFFf SU5JVCgmbS0+bWQucHZfbGlzdCk7CisJbS0+bWQucHZfbGlzdF9jb3VudCA9IDA7CisJbS0+bWQu cHZfZmxhZ3MgPSAwOworfQorCisvKgorICoJSW5pdGlhbGl6ZSB0aGUgcG1hcCBtb2R1bGUuCisg KglDYWxsZWQgYnkgdm1faW5pdCwgdG8gaW5pdGlhbGl6ZSBhbnkgc3RydWN0dXJlcyB0aGF0IHRo ZSBwbWFwCisgKglzeXN0ZW0gbmVlZHMgdG8gbWFwIHZpcnR1YWwgbWVtb3J5LgorICoJcG1hcF9p bml0IGhhcyBiZWVuIGVuaGFuY2VkIHRvIHN1cHBvcnQgaW4gYSBmYWlybHkgY29uc2lzdGFudAor ICoJd2F5LCBkaXNjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeS4KKyAqLwordm9pZAorcG1hcF9p bml0KHZvaWQpCit7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGFkZHJlc3Mgc3BhY2UgKHpv bmUpIGZvciB0aGUgcHYgZW50cmllcy4gIFNldCBhCisJICogaGlnaCB3YXRlciBtYXJrIHNvIHRo YXQgdGhlIHN5c3RlbSBjYW4gcmVjb3ZlciBmcm9tIGV4Y2Vzc2l2ZQorCSAqIG51bWJlcnMgb2Yg cHYgZW50cmllcy4KKwkgKi8KKwlwdnpvbmUgPSB1bWFfemNyZWF0ZSgiUFYgRU5UUlkiLCBzaXpl b2Yoc3RydWN0IHB2X2VudHJ5KSwgTlVMTCwgTlVMTCwKKwkgICAgTlVMTCwgTlVMTCwgVU1BX0FM SUdOX1BUUiwgVU1BX1pPTkVfVk0gfCBVTUFfWk9ORV9OT0ZSRUUpOworCXB2X2VudHJ5X21heCA9 IFBNQVBfU0hQR1BFUlBST0MgKiBtYXhwcm9jICsgY250LnZfcGFnZV9jb3VudDsKKwlwdl9lbnRy eV9oaWdoX3dhdGVyID0gOSAqIChwdl9lbnRyeV9tYXggLyAxMCk7CisJdW1hX3pvbmVfc2V0X29i aihwdnpvbmUsICZwdnpvbmVfb2JqLCBwdl9lbnRyeV9tYXgpOworfQorCisvKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMb3cgbGV2ZWwgaGVs cGVyIHJvdXRpbmVzLi4uLi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKFBNQVBfRElBR05PU1RJQykKKworLyoKKyAq IFRoaXMgY29kZSBjaGVja3MgZm9yIG5vbi13cml0ZWFibGUvbW9kaWZpZWQgcGFnZXMuCisgKiBU aGlzIHNob3VsZCBiZSBhbiBpbnZhbGlkIGNvbmRpdGlvbi4KKyAqLworc3RhdGljIGludAorcG1h cF9ud19tb2RpZmllZChwdF9lbnRyeV90IHB0ZSkKK3sKKwlpZiAoKHB0ZSAmIChQVEVfRCB8IFBU RV9STykpID09IChQVEVfRCB8IFBURV9STykpCisJCXJldHVybiAoMSk7CisJZWxzZQorCQlyZXR1 cm4gKDApOworfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQKK3BtYXBfaW52YWxpZGF0ZV9hbGwo cG1hcF90IHBtYXApCit7CisjaWZkZWYgU01QCisJc21wX3JlbmRlenZvdXMoMCwgcG1hcF9pbnZh bGlkYXRlX2FsbF9hY3Rpb24sIDAsICh2b2lkICopcG1hcCk7Cit9CisKK3N0YXRpYyB2b2lkCitw bWFwX2ludmFsaWRhdGVfYWxsX2FjdGlvbih2b2lkICphcmcpCit7CisJcG1hcF90IHBtYXAgPSAo cG1hcF90KWFyZzsKKworI2VuZGlmCisKKwlpZiAocG1hcCA9PSBrZXJuZWxfcG1hcCkgeworCQl0 bGJfaW52YWxpZGF0ZV9hbGwoKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwbWFwLT5wbV9hY3Rp dmUgJiBQQ1BVX0dFVChjcHVtYXNrKSkKKwkJdGxiX2ludmFsaWRhdGVfYWxsX3VzZXIocG1hcCk7 CisJZWxzZQorCQlwbWFwLT5wbV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uZ2VuID0gMDsKK30KKwor c3RydWN0IHBtYXBfaW52YWxpZGF0ZV9wYWdlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJdm1fb2Zm c2V0X3QgdmE7Cit9OworCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9pbnZhbGlkYXRlX3Bh Z2UocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworI2lmZGVmIFNNUAorCXN0cnVjdCBw bWFwX2ludmFsaWRhdGVfcGFnZV9hcmcgYXJnOworCisJYXJnLnBtYXAgPSBwbWFwOworCWFyZy52 YSA9IHZhOworCisJc21wX3JlbmRlenZvdXMoMCwgcG1hcF9pbnZhbGlkYXRlX3BhZ2VfYWN0aW9u LCAwLCAodm9pZCAqKSZhcmcpOworfQorCitzdGF0aWMgdm9pZAorcG1hcF9pbnZhbGlkYXRlX3Bh Z2VfYWN0aW9uKHZvaWQgKmFyZykKK3sKKwlwbWFwX3QgcG1hcCA9ICgoc3RydWN0IHBtYXBfaW52 YWxpZGF0ZV9wYWdlX2FyZyAqKWFyZyktPnBtYXA7CisJdm1fb2Zmc2V0X3QgdmEgPSAoKHN0cnVj dCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hcmcgKilhcmcpLT52YTsKKworI2VuZGlmCisKKwlpZiAo aXNfa2VybmVsX3BtYXAocG1hcCkpIHsKKwkJdGxiX2ludmFsaWRhdGVfYWRkcmVzcyhwbWFwLCB2 YSk7CisJCXJldHVybjsKKwl9CisJaWYgKHBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQpXS5n ZW4gIT0gUENQVV9HRVQoYXNpZF9nZW5lcmF0aW9uKSkKKwkJcmV0dXJuOworCWVsc2UgaWYgKCEo cG1hcC0+cG1fYWN0aXZlICYgUENQVV9HRVQoY3B1bWFzaykpKSB7CisJCXBtYXAtPnBtX2FzaWRb UENQVV9HRVQoY3B1aWQpXS5nZW4gPSAwOworCQlyZXR1cm47CisJfQorCXRsYl9pbnZhbGlkYXRl X2FkZHJlc3MocG1hcCwgdmEpOworfQorCitzdHJ1Y3QgcG1hcF91cGRhdGVfcGFnZV9hcmcgewor CXBtYXBfdCBwbWFwOworCXZtX29mZnNldF90IHZhOworCXB0X2VudHJ5X3QgcHRlOworfTsKKwor dm9pZAorcG1hcF91cGRhdGVfcGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHB0X2Vu dHJ5X3QgcHRlKQoreworI2lmZGVmIFNNUAorCXN0cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2FyZyBh cmc7CisKKwlhcmcucG1hcCA9IHBtYXA7CisJYXJnLnZhID0gdmE7CisJYXJnLnB0ZSA9IHB0ZTsK KworCXNtcF9yZW5kZXp2b3VzKDAsIHBtYXBfdXBkYXRlX3BhZ2VfYWN0aW9uLCAwLCAodm9pZCAq KSZhcmcpOworfQorCitzdGF0aWMgdm9pZAorcG1hcF91cGRhdGVfcGFnZV9hY3Rpb24odm9pZCAq YXJnKQoreworCXBtYXBfdCBwbWFwID0gKChzdHJ1Y3QgcG1hcF91cGRhdGVfcGFnZV9hcmcgKilh cmcpLT5wbWFwOworCXZtX29mZnNldF90IHZhID0gKChzdHJ1Y3QgcG1hcF91cGRhdGVfcGFnZV9h cmcgKilhcmcpLT52YTsKKwlwdF9lbnRyeV90IHB0ZSA9ICgoc3RydWN0IHBtYXBfdXBkYXRlX3Bh Z2VfYXJnICopYXJnKS0+cHRlOworCisjZW5kaWYKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkp IHsKKwkJdGxiX3VwZGF0ZShwbWFwLCB2YSwgcHRlKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocG1h cC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmdlbiAhPSBQQ1BVX0dFVChhc2lkX2dlbmVyYXRp b24pKQorCQlyZXR1cm47CisJZWxzZSBpZiAoIShwbWFwLT5wbV9hY3RpdmUgJiBQQ1BVX0dFVChj cHVtYXNrKSkpIHsKKwkJcG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmdlbiA9IDA7CisJ CXJldHVybjsKKwl9CisJdGxiX3VwZGF0ZShwbWFwLCB2YSwgcHRlKTsKK30KKworLyoKKyAqCVJv dXRpbmU6CXBtYXBfZXh0cmFjdAorICoJRnVuY3Rpb246CisgKgkJRXh0cmFjdCB0aGUgcGh5c2lj YWwgcGFnZSBhZGRyZXNzIGFzc29jaWF0ZWQKKyAqCQl3aXRoIHRoZSBnaXZlbiBtYXAvdmlydHVh bF9hZGRyZXNzIHBhaXIuCisgKi8KK3ZtX3BhZGRyX3QKK3BtYXBfZXh0cmFjdChwbWFwX3QgcG1h cCwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcHRfZW50cnlfdCAqcHRlOworCXZtX29mZnNldF90IHJl dHZhbCA9IDA7CisKKwlQTUFQX0xPQ0socG1hcCk7CisJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEp OworCWlmIChwdGUpIHsKKwkJcmV0dmFsID0gVExCTE9fUFRFX1RPX1BBKCpwdGUpIHwgKHZhICYg UEFHRV9NQVNLKTsKKwl9CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcmV0dXJuIHJldHZhbDsKK30K KworLyoKKyAqCVJvdXRpbmU6CXBtYXBfZXh0cmFjdF9hbmRfaG9sZAorICoJRnVuY3Rpb246Cisg KgkJQXRvbWljYWxseSBleHRyYWN0IGFuZCBob2xkIHRoZSBwaHlzaWNhbCBwYWdlCisgKgkJd2l0 aCB0aGUgZ2l2ZW4gcG1hcCBhbmQgdmlydHVhbCBhZGRyZXNzIHBhaXIKKyAqCQlpZiB0aGF0IG1h cHBpbmcgcGVybWl0cyB0aGUgZ2l2ZW4gcHJvdGVjdGlvbi4KKyAqLwordm1fcGFnZV90CitwbWFw X2V4dHJhY3RfYW5kX2hvbGQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wcm90X3Qg cHJvdCkKK3sKKwlwdF9lbnRyeV90IHB0ZTsKKwl2bV9wYWdlX3QgbTsKKwl2bV9wYWRkcl90IHBh OworCisJbSA9IE5VTEw7CisJcGEgPSAwOworCVBNQVBfTE9DSyhwbWFwKTsKK3JldHJ5OgorCXB0 ZSA9ICpwbWFwX3B0ZShwbWFwLCB2YSk7CisJaWYgKHB0ZSAhPSAwICYmIHB0ZV90ZXN0KCZwdGUs IFBURV9WKSAmJgorCSAgICAocHRlX3Rlc3QoJnB0ZSwgUFRFX0QpIHx8IChwcm90ICYgVk1fUFJP VF9XUklURSkgPT0gMCkpIHsKKwkJaWYgKHZtX3BhZ2VfcGFfdHJ5cmVsb2NrKHBtYXAsIFRMQkxP X1BURV9UT19QQShwdGUpLCAmcGEpKQorCQkJZ290byByZXRyeTsKKworCQltID0gUEhZU19UT19W TV9QQUdFKFRMQkxPX1BURV9UT19QQShwdGUpKTsKKwkJdm1fcGFnZV9ob2xkKG0pOworCX0KKwlQ QV9VTkxPQ0tfQ09ORChwYSk7CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcmV0dXJuIChtKTsKK30K KworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgor ICogTG93IGxldmVsIG1hcHBpbmcgcm91dGluZXMuLi4uLgorICoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIGFkZCBhIHdpcmVkIHBh Z2UgdG8gdGhlIGt2YQorICovCisgLyogUE1BUF9JTkxJTkUgKi8gdm9pZAorcG1hcF9rZW50ZXIo dm1fb2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEpCit7CisJcHRfZW50cnlfdCAqcHRlOworCXB0 X2VudHJ5X3Qgb3B0ZSwgbnB0ZTsKKworI2lmZGVmIFBNQVBfREVCVUcKKwlwcmludGYoInBtYXBf a2VudGVyOiAgdmE6ICVwIC0+IHBhOiAlcFxuIiwgKHZvaWQgKil2YSwgKHZvaWQgKilwYSk7Cisj ZW5kaWYKKwlucHRlID0gVExCTE9fUEFfVE9fUEZOKHBhKSB8IFBURV9EIHwgUFRFX1YgfCBQVEVf RyB8IFBURV9XOworCisJaWYgKGlzX2NhY2hlYWJsZV9tZW0ocGEpKQorCQlucHRlIHw9IFBURV9D X0NBQ0hFOworCWVsc2UKKwkJbnB0ZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKworCXB0ZSA9IHBtYXBf cHRlKGtlcm5lbF9wbWFwLCB2YSk7CisJb3B0ZSA9ICpwdGU7CisJKnB0ZSA9IG5wdGU7CisKKwlw bWFwX3VwZGF0ZV9wYWdlKGtlcm5lbF9wbWFwLCB2YSwgbnB0ZSk7Cit9CisKKy8qCisgKiByZW1v dmUgYSBwYWdlIGZyb20gdGhlIGtlcm5lbCBwYWdldGFibGVzCisgKi8KKyAvKiBQTUFQX0lOTElO RSAqLyB2b2lkCitwbWFwX2tyZW1vdmUodm1fb2Zmc2V0X3QgdmEpCit7CisJcHRfZW50cnlfdCAq cHRlOworCisJLyoKKwkgKiBXcml0ZSBiYWNrIGFsbCBjYWNoZXMgZnJvbSB0aGUgcGFnZSBiZWlu ZyBkZXN0cm95ZWQKKwkgKi8KKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleCh2YSwgUEFH RV9TSVpFKTsKKworCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CisJKnB0ZSA9IFBU RV9HOworCXBtYXBfaW52YWxpZGF0ZV9wYWdlKGtlcm5lbF9wbWFwLCB2YSk7Cit9CisKKy8qCisg KglVc2VkIHRvIG1hcCBhIHJhbmdlIG9mIHBoeXNpY2FsIGFkZHJlc3NlcyBpbnRvIGtlcm5lbAor ICoJdmlydHVhbCBhZGRyZXNzIHNwYWNlLgorICoKKyAqCVRoZSB2YWx1ZSBwYXNzZWQgaW4gJyp2 aXJ0JyBpcyBhIHN1Z2dlc3RlZCB2aXJ0dWFsIGFkZHJlc3MgZm9yCisgKgl0aGUgbWFwcGluZy4g QXJjaGl0ZWN0dXJlcyB3aGljaCBjYW4gc3VwcG9ydCBhIGRpcmVjdC1tYXBwZWQKKyAqCXBoeXNp Y2FsIHRvIHZpcnR1YWwgcmVnaW9uIGNhbiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGFkZHJlc3MK KyAqCXdpdGhpbiB0aGF0IHJlZ2lvbiwgbGVhdmluZyAnKnZpcnQnIHVuY2hhbmdlZC4gT3RoZXIK KyAqCWFyY2hpdGVjdHVyZXMgc2hvdWxkIG1hcCB0aGUgcGFnZXMgc3RhcnRpbmcgYXQgJyp2aXJ0 JyBhbmQKKyAqCXVwZGF0ZSAnKnZpcnQnIHdpdGggdGhlIGZpcnN0IHVzYWJsZSBhZGRyZXNzIGFm dGVyIHRoZSBtYXBwZWQKKyAqCXJlZ2lvbi4KKyAqCisgKglVc2UgWEtQSFlTIGZvciA2NCBiaXQs IGFuZCBLU0VHMCB3aGVyZSBwb3NzaWJsZSBmb3IgMzIgYml0LgorICovCit2bV9vZmZzZXRfdAor cG1hcF9tYXAodm1fb2Zmc2V0X3QgKnZpcnQsIHZtX29mZnNldF90IHN0YXJ0LCB2bV9vZmZzZXRf dCBlbmQsIGludCBwcm90KQoreworCXJldHVybiAoTUlQU19QSFlTX1RPX1hLUEhZU19DQUNIRUQo c3RhcnQpKTsKK30KKworLyoKKyAqIEFkZCBhIGxpc3Qgb2Ygd2lyZWQgcGFnZXMgdG8gdGhlIGt2 YQorICogdGhpcyByb3V0aW5lIGlzIG9ubHkgdXNlZCBmb3IgdGVtcG9yYXJ5CisgKiBrZXJuZWwg bWFwcGluZ3MgdGhhdCBkbyBub3QgbmVlZCB0byBoYXZlCisgKiBwYWdlIG1vZGlmaWNhdGlvbiBv ciByZWZlcmVuY2VzIHJlY29yZGVkLgorICogTm90ZSB0aGF0IG9sZCBtYXBwaW5ncyBhcmUgc2lt cGx5IHdyaXR0ZW4KKyAqIG92ZXIuICBUaGUgcGFnZSAqbXVzdCogYmUgd2lyZWQuCisgKi8KK3Zv aWQKK3BtYXBfcWVudGVyKHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgKm0sIGludCBjb3VudCkK K3sKKwlpbnQgaTsKKwl2bV9vZmZzZXRfdCBvcmlndmEgPSB2YTsKKworCWZvciAoaSA9IDA7IGkg PCBjb3VudDsgaSsrKSB7CisJCXBtYXBfZmx1c2hfcHZjYWNoZShtW2ldKTsKKwkJcG1hcF9rZW50 ZXIodmEsIFZNX1BBR0VfVE9fUEhZUyhtW2ldKSk7CisJCXZhICs9IFBBR0VfU0laRTsKKwl9CisK KwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleChvcmlndmEsIFBBR0VfU0laRSpjb3VudCk7 Cit9CisKKy8qCisgKiB0aGlzIHJvdXRpbmUgamVya3MgcGFnZSBtYXBwaW5ncyBmcm9tIHRoZQor ICoga2VybmVsIC0tIGl0IGlzIG1lYW50IG9ubHkgZm9yIHRlbXBvcmFyeSBtYXBwaW5ncy4KKyAq Lwordm9pZAorcG1hcF9xcmVtb3ZlKHZtX29mZnNldF90IHZhLCBpbnQgY291bnQpCit7CisJLyoK KwkgKiBObyBuZWVkIHRvIHdiL2ludiBjYWNoZXMgaGVyZSwgCisJICogICBwbWFwX2tyZW1vdmUg d2lsbCBkbyBpdCBmb3IgdXMKKwkgKi8KKworCXdoaWxlIChjb3VudC0tID4gMCkgeworCQlwbWFw X2tyZW1vdmUodmEpOworCQl2YSArPSBQQUdFX1NJWkU7CisJfQorfQorCisvKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQYWdlIHRhYmxlIHBh Z2UgbWFuYWdlbWVudCByb3V0aW5lcy4uLi4uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAgUmV2aXNpb24gMS41MDcKKyAqCisgKiBT aW1wbGlmeSB0aGUgcmVmZXJlbmNlIGNvdW50aW5nIG9mIHBhZ2UgdGFibGUgcGFnZXMuCSBTcGVj aWZpY2FsbHksIHVzZQorICogdGhlIHBhZ2UgdGFibGUgcGFnZSdzIHdpcmVkIGNvdW50IHJhdGhl ciB0aGFuIGl0cyBob2xkIGNvdW50IHRvIGNvbnRhaW4KKyAqIHRoZSByZWZlcmVuY2UgY291bnQu CisgKi8KKworLyoKKyAqIFRoaXMgcm91dGluZSB1bmhvbGRzIHBhZ2UgdGFibGUgcGFnZXMsIGFu ZCBpZiB0aGUgaG9sZCBjb3VudAorICogZHJvcHMgdG8gemVybywgdGhlbiBpdCBkZWNyZW1lbnRz IHRoZSB3aXJlIGNvdW50LgorICovCitzdGF0aWMgUE1BUF9JTkxJTkUgaW50CitwbWFwX3Vud2ly ZV9wdGVfaG9sZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtKQorewor CS0tbS0+d2lyZV9jb3VudDsKKwlpZiAobS0+d2lyZV9jb3VudCA9PSAwKQorCQlyZXR1cm4gKF9w bWFwX3Vud2lyZV9wdGVfaG9sZChwbWFwLCB2YSwgbSkpOworCWVsc2UKKwkJcmV0dXJuICgwKTsK K30KKworc3RhdGljIGludAorX3BtYXBfdW53aXJlX3B0ZV9ob2xkKHBtYXBfdCBwbWFwLCB2bV9v ZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0pCit7CisJcGRfZW50cnlfdCAqcGRlLCAqcGRwOworCXZt X3BhZ2VfdCBwZHBnOworCisgICAgICAgIFBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQp OworCS8qCisJICogdW5tYXAgdGhlIHBhZ2UgdGFibGUgcGFnZQorCSAqLworCisJaWYgKG0tPnBp bmRleCA8IE5VUERFKSB7CisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwkJKnBkZSA9IDA7 CisJfSBlbHNlIHsKKwkJcGRlID0gcG1hcF9zZWdtYXAocG1hcCwgdmEpOworCQkqcGRlID0gMDsK Kwl9CisKKyAgICAgICAgcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQtLTsKKworCWlmICht LT5waW5kZXggPCBOVVBERSkgeworCQkvKgorCQkgKiBSZWN1cnNpdmVseSBkZWNyZW1lbnQgbmV4 dCBsZXZlbCBwYWdldGFibGUgcmVmY291bnQKKwkJICovCisJCWlmIChwbWFwLT5wbV9wdHBoaW50 ID09IG0pCisJCQlwbWFwLT5wbV9wdHBoaW50ID0gTlVMTDsKKworCQlwZHAgPSAocGRfZW50cnlf dCAqKSpwbWFwX3NlZ21hcChwbWFwLCB2YSk7CisJCXBkcGcgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQ U19LU0VHMF9UT19QSFlTKHBkcCkpOworCQlwbWFwX3Vud2lyZV9wdGVfaG9sZChwbWFwLCB2YSwg cGRwZyk7CisJfQorCS8qCisJICogSWYgdGhlIHBhZ2UgaXMgZmluYWxseSB1bndpcmVkLCBzaW1w bHkgZnJlZSBpdC4KKwkgKi8KKwlwcmludGYoIlslZF0gZnJlZSBwaW5kZXhbJXhdIG0gJXAsIHZh ICVwXG4iLAorCQljdXJ0aHJlYWQtPnRkX3Byb2MtPnBfcGlkLCAoaW50KW0tPnBpbmRleCwgbSwg KHZvaWQgKil2YSk7CisKKwl2bV9wYWdlX2ZyZWVfemVybyhtKTsKKwlhdG9taWNfc3VidHJhY3Rf aW50KCZjbnQudl93aXJlX2NvdW50LCAxKTsKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogQWZ0 ZXIgcmVtb3ZpbmcgYSBwYWdlIHRhYmxlIGVudHJ5LCB0aGlzIHJvdXRpbmUgaXMgdXNlZCB0bwor ICogY29uZGl0aW9uYWxseSBmcmVlIHRoZSBwYWdlLCBhbmQgbWFuYWdlIHRoZSBob2xkL3dpcmUg Y291bnRzLgorICovCitzdGF0aWMgaW50CitwbWFwX3VudXNlX3B0KHBtYXBfdCBwbWFwLCB2bV9v ZmZzZXRfdCB2YSwgdm1fcGFnZV90IG1wdGUpCit7CisJdW5zaWduZWQgcHRlcGluZGV4OworCXBk X2VudHJ5X3QgcHRldmE7CisKKwlpZiAodmEgPj0gVk1fTUFYVVNFUl9BRERSRVNTKQorCQlyZXR1 cm4gKDApOworCisJaWYgKG1wdGUgPT0gTlVMTCkgeworCQlwdGVwaW5kZXggPSBwbWFwX3BkZV9w aW5kZXgodmEpOworCQlpZiAocG1hcC0+cG1fcHRwaGludCAmJgorCQkgICAgKHBtYXAtPnBtX3B0 cGhpbnQtPnBpbmRleCA9PSBwdGVwaW5kZXgpKSB7CisJCQltcHRlID0gcG1hcC0+cG1fcHRwaGlu dDsKKwkJfSBlbHNlIHsKKwkJCXB0ZXZhID0gKnBtYXBfcGRlKHBtYXAsIHZhKTsKKwkJCW1wdGUg PSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19LU0VHMF9UT19QSFlTKHB0ZXZhKSk7CisJCQlwbWFwLT5w bV9wdHBoaW50ID0gbXB0ZTsKKwkJfQorCX0KKwlyZXR1cm4gcG1hcF91bndpcmVfcHRlX2hvbGQo cG1hcCwgdmEsIG1wdGUpOworfQorCit2b2lkCitwbWFwX3Bpbml0MChwbWFwX3QgcG1hcCkKK3sK KwlpbnQgaTsKKworCVBNQVBfTE9DS19JTklUKHBtYXApOworCXBtYXAtPnBtX3NlZ3RhYiA9IGtl cm5lbF9zZWdtYXA7CisJcG1hcC0+cG1fYWN0aXZlID0gMDsKKwlwbWFwLT5wbV9wdHBoaW50ID0g TlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYQ1BVOyBpKyspIHsKKwkJcG1hcC0+cG1fYXNpZFtp XS5hc2lkID0gUE1BUF9BU0lEX1JFU0VSVkVEOworCQlwbWFwLT5wbV9hc2lkW2ldLmdlbiA9IDA7 CisJfQorCVBDUFVfU0VUKGN1cnBtYXAsIHBtYXApOworCVRBSUxRX0lOSVQoJnBtYXAtPnBtX3B2 bGlzdCk7CisJYnplcm8oJnBtYXAtPnBtX3N0YXRzLCBzaXplb2YgcG1hcC0+cG1fc3RhdHMpOwor fQorCitzdGF0aWMgdm9pZAorcG1hcF9ncm93X3B0ZV9wYWdlX2NhY2hlKCkKK3sKKworCXZtX2Nv bnRpZ19ncm93X2NhY2hlKDMsIDAsIE1JUFNfS1NFRzBfTEFSR0VTVF9QSFlTKTsKK30KKworc3Rh dGljIHZtX3BhZ2VfdAorcG1hcF9hbGxvY19wdGVfcGFnZSh1bnNpZ25lZCBpbnQgaW5kZXgsIGlu dCByZXEpCit7CisJdm1fcGFnZV90IG07CisKKwltID0gdm1fcGFnZV9hbGxvY19mcmVlbGlzdChW TV9GUkVFTElTVF9ESVJFQ1QsIDAsIHJlcSk7CisJaWYgKG0gPT0gTlVMTCkKKwkJcmV0dXJuIChO VUxMKTsKKworCWlmICgobS0+ZmxhZ3MgJiBQR19aRVJPKSA9PSAwKQorCQlwbWFwX3plcm9fcGFn ZShtKTsKKworCW0tPnBpbmRleCA9IGluZGV4OworCWF0b21pY19hZGRfaW50KCZjbnQudl93aXJl X2NvdW50LCAxKTsKKwltLT53aXJlX2NvdW50ID0gMTsKKwlyZXR1cm4gKG0pOworfQorCisvKgor ICogSW5pdGlhbGl6ZSBhIHByZWFsbG9jYXRlZCBhbmQgemVyb2VkIHBtYXAgc3RydWN0dXJlLAor ICogc3VjaCBhcyBvbmUgaW4gYSB2bXNwYWNlIHN0cnVjdHVyZS4KKyAqLworaW50CitwbWFwX3Bp bml0KHBtYXBfdCBwbWFwKQoreworCXZtX29mZnNldF90IHB0ZHZhOworCXZtX3BhZ2VfdCBwdGRw ZzsKKwlpbnQgaTsKKworCVBNQVBfTE9DS19JTklUKHBtYXApOworCisJLyoKKwkgKiBhbGxvY2F0 ZSB0aGUgcGFnZSBkaXJlY3RvcnkgcGFnZQorCSAqLworCXdoaWxlICgocHRkcGcgPSBwbWFwX2Fs bG9jX3B0ZV9wYWdlKE5VU0VSUEdUQkxTLCBWTV9BTExPQ19OT1JNQUwpKSA9PSBOVUxMKQorCSAg ICAgICBwbWFwX2dyb3dfcHRlX3BhZ2VfY2FjaGUoKTsKKworCXB0ZHZhID0gTUlQU19QSFlTX1RP X0tTRUcwKFZNX1BBR0VfVE9fUEhZUyhwdGRwZykpOworCXBtYXAtPnBtX3NlZ3RhYiA9IChwZF9l bnRyeV90ICopcHRkdmE7CisJcG1hcC0+cG1fYWN0aXZlID0gMDsKKwlwbWFwLT5wbV9wdHBoaW50 ID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYQ1BVOyBpKyspIHsKKwkJcG1hcC0+cG1fYXNp ZFtpXS5hc2lkID0gUE1BUF9BU0lEX1JFU0VSVkVEOworCQlwbWFwLT5wbV9hc2lkW2ldLmdlbiA9 IDA7CisJfQorCVRBSUxRX0lOSVQoJnBtYXAtPnBtX3B2bGlzdCk7CisJYnplcm8oJnBtYXAtPnBt X3N0YXRzLCBzaXplb2YgcG1hcC0+cG1fc3RhdHMpOworCisJcmV0dXJuICgxKTsKK30KKworLyoK KyAqIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgaWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBpcyBub3QK KyAqIG1hcHBlZCBjb3JyZWN0bHkuCisgKi8KK3N0YXRpYyB2bV9wYWdlX3QKK19wbWFwX2FsbG9j cHRlKHBtYXBfdCBwbWFwLCB1bnNpZ25lZCBwdGVwaW5kZXgsIGludCBmbGFncykKK3sKKwl2bV9v ZmZzZXRfdCBwYWdldmE7CisJdm1fcGFnZV90IG07CisJaW50IHBpZCA9IGN1cnRocmVhZC0+dGRf cHJvYy0+cF9waWQ7CisKKwlLQVNTRVJUKChmbGFncyAmIChNX05PV0FJVCB8IE1fV0FJVE9LKSkg PT0gTV9OT1dBSVQgfHwKKwkgICAgKGZsYWdzICYgKE1fTk9XQUlUIHwgTV9XQUlUT0spKSA9PSBN X1dBSVRPSywKKwkgICAgKCJfcG1hcF9hbGxvY3B0ZTogZmxhZ3MgaXMgbmVpdGhlciBNX05PV0FJ VCBub3IgTV9XQUlUT0siKSk7CisKKwkvKgorCSAqIEZpbmQgb3IgZmFicmljYXRlIGEgbmV3IHBh Z2V0YWJsZSBwYWdlCisJICovCisJaWYgKChtID0gcG1hcF9hbGxvY19wdGVfcGFnZShwdGVwaW5k ZXgsIFZNX0FMTE9DX05PUk1BTCkpID09IE5VTEwpIHsKKwkJaWYgKGZsYWdzICYgTV9XQUlUT0sp IHsKKwkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJdm1fcGFnZV91bmxvY2tfcXVldWVzKCk7CisJ CQlwbWFwX2dyb3dfcHRlX3BhZ2VfY2FjaGUoKTsKKwkJCXZtX3BhZ2VfbG9ja19xdWV1ZXMoKTsK KwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJfQorCisJCS8qCisJCSAqIEluZGljYXRlIHRoZSBuZWVk IHRvIHJldHJ5LglXaGlsZSB3YWl0aW5nLCB0aGUgcGFnZQorCQkgKiB0YWJsZSBwYWdlIG1heSBo YXZlIGJlZW4gYWxsb2NhdGVkLgorCQkgKi8KKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwlwYWdl dmEgPSBNSVBTX1BIWVNfVE9fS1NFRzAoVk1fUEFHRV9UT19QSFlTKG0pKTsKKwlwcmludGYoIl9w bWFwX2FsbG9jcHRlOiBpbmRleCAleCAoJWx4KSwgZmxhZ3MgJXggcGFnZXZhICVseFxuIiwKKwkJ CXB0ZXBpbmRleCwgTlVQREUsIGZsYWdzLCAodV9sb25nKXBhZ2V2YSk7CisJLyoKKwkgKiBNYXAg dGhlIHBhZ2V0YWJsZSBwYWdlIGludG8gdGhlIHByb2Nlc3MgYWRkcmVzcyBzcGFjZSwgaWYgaXQK KwkgKiBpc24ndCBhbHJlYWR5IHRoZXJlLgorCSAqLworCWlmIChwdGVwaW5kZXggPj0gTlVQREUp IHsKKwkJcG1hcC0+cG1fc2VndGFiW3B0ZXBpbmRleCAtIE5VUERFXSA9IChwZF9lbnRyeV90KXBh Z2V2YTsKKwkJaWYoMClwcmludGYoIlslZF1zZWd0YWJbJWx1XSA9ICVwXG4iLCBwaWQsIHB0ZXBp bmRleCAtIE5VUERFLCAodm9pZCAqKXBhZ2V2YSk7CisJfSBlbHNlIHsKKwkJcGRfZW50cnlfdCAq cGRlcCwgKnBkZTsKKwkJaW50IHNlZ2luZGV4ID0gcHRlcGluZGV4ID4+IChTRUdTSElGVCAtIFBE UlNISUZUKTsKKwkJaW50IHBkZWluZGV4ID0gcHRlcGluZGV4ICYgKE5QREVQRyAtIDEpOworCQl2 bV9wYWdlX3QgcGc7CisJCQorCQlwZGVwID0gJnBtYXAtPnBtX3NlZ3RhYltzZWdpbmRleF07CisJ CWlmICgqcGRlcCA9PSBOVUxMKSB7IAorCQkJLyogcmVjdXJzZSBmb3IgYWxsb2NhdGluZyBwYWdl IGRpciAqLworCQkJaWYgKF9wbWFwX2FsbG9jcHRlKHBtYXAsIE5VUERFICsgc2VnaW5kZXgsIAor CQkJICAgIGZsYWdzKSA9PSBOVUxMKSB7CisJCQkJLyogYWxsb2MgZmFpbGVkLCByZWxlYXNlIGN1 cnJlbnQgKi8KKwkJCQktLW0tPndpcmVfY291bnQ7CisJCQkJYXRvbWljX3N1YnRyYWN0X2ludCgm Y250LnZfd2lyZV9jb3VudCwgMSk7CisJCQkJdm1fcGFnZV9mcmVlX3plcm8obSk7CisJCQkJcmV0 dXJuIChOVUxMKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBnID0gUEhZU19UT19WTV9QQUdFKE1J UFNfS1NFRzBfVE9fUEhZUygqcGRlcCkpOworCQkJcGctPndpcmVfY291bnQrKzsKKwkJfQorCQkv KiBOZXh0IGxldmVsIGVudHJ5ICovCisJCXBkZSA9IChwZF9lbnRyeV90ICopKnBkZXA7CisJCXBk ZVtwZGVpbmRleF0gPSAocGRfZW50cnlfdClwYWdldmE7CisJCXBtYXAtPnBtX3B0cGhpbnQgPSBt OworCQlpZigwKXByaW50ZigiWyVkXSBwZGUoJXApWyVkXSA9ICVwXG4iLCBwaWQsIHBkZSwgcGRl aW5kZXgsICh2b2lkICopcGFnZXZhKTsKKwl9CisJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291 bnQrKzsKKworCS8qCisJICogU2V0IHRoZSBwYWdlIHRhYmxlIGhpbnQKKwkgKi8KKwlwbWFwLT5w bV9wdHBoaW50ID0gbTsKKwlyZXR1cm4gKG0pOworfQorCitzdGF0aWMgdm1fcGFnZV90CitwbWFw X2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgaW50IGZsYWdzKQoreworCXVu c2lnbmVkIHB0ZXBpbmRleDsKKwlwZF9lbnRyeV90ICpwZGU7CisJdm1fcGFnZV90IG07CisKKwlL QVNTRVJUKChmbGFncyAmIChNX05PV0FJVCB8IE1fV0FJVE9LKSkgPT0gTV9OT1dBSVQgfHwKKwkg ICAgKGZsYWdzICYgKE1fTk9XQUlUIHwgTV9XQUlUT0spKSA9PSBNX1dBSVRPSywKKwkgICAgKCJw bWFwX2FsbG9jcHRlOiBmbGFncyBpcyBuZWl0aGVyIE1fTk9XQUlUIG5vciBNX1dBSVRPSyIpKTsK KworCS8qCisJICogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4CisJICovCisJcHRlcGlu ZGV4ID0gcG1hcF9wZGVfcGluZGV4KHZhKTsKK3JldHJ5OgorCS8qCisJICogR2V0IHRoZSBwYWdl IGRpcmVjdG9yeSBlbnRyeQorCSAqLworCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKworCS8q CisJICogSWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBpcyBtYXBwZWQsIHdlIGp1c3QgaW5jcmVtZW50 IHRoZSBob2xkCisJICogY291bnQsIGFuZCBhY3RpdmF0ZSBpdC4KKwkgKi8KKwlpZiAocGRlICE9 IE5VTEwgJiYgKnBkZSAhPSBOVUxMKSB7CisJCS8qCisJCSAqIEluIG9yZGVyIHRvIGdldCB0aGUg cGFnZSB0YWJsZSBwYWdlLCB0cnkgdGhlIGhpbnQgZmlyc3QuCisJCSAqLworCQlpZiAocG1hcC0+ cG1fcHRwaGludCAmJgorCQkgICAgKHBtYXAtPnBtX3B0cGhpbnQtPnBpbmRleCA9PSBwdGVwaW5k ZXgpKSB7CisJCQltID0gcG1hcC0+cG1fcHRwaGludDsKKwkJfSBlbHNlIHsKKwkJCW0gPSBQSFlT X1RPX1ZNX1BBR0UoTUlQU19LU0VHMF9UT19QSFlTKCpwZGUpKTsKKwkJCXBtYXAtPnBtX3B0cGhp bnQgPSBtOworCQl9CisJCW0tPndpcmVfY291bnQrKzsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBI ZXJlIGlmIHRoZSBwdGUgcGFnZSBpc24ndCBtYXBwZWQsIG9yIGlmIGl0IGhhcyBiZWVuCisJCSAq IGRlYWxsb2NhdGVkLgorCQkgKi8KKwkJbSA9IF9wbWFwX2FsbG9jcHRlKHBtYXAsIHB0ZXBpbmRl eCwgZmxhZ3MpOworCQlpZiAobSA9PSBOVUxMICYmIChmbGFncyAmIE1fV0FJVE9LKSkKKwkJCWdv dG8gcmV0cnk7CisJfQorCXJldHVybiAobSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBQbWFwIGFsbG9jYXRpb24vZGVhbGxv Y2F0aW9uIHJvdXRpbmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKi8KKy8qCisgKiAgUmV2aXNpb24gMS4zOTcKKyAqICAtIE1lcmdlZCBwbWFw X3JlbGVhc2UgYW5kIHBtYXBfcmVsZWFzZV9mcmVlX3BhZ2UuICBXaGVuIHBtYXBfcmVsZWFzZSBp cworICogICAgY2FsbGVkIG9ubHkgdGhlIHBhZ2UgZGlyZWN0b3J5IHBhZ2UocykgY2FuIGJlIGxl ZnQgaW4gdGhlIHBtYXAgcHRlCisgKiAgICBvYmplY3QsIHNpbmNlIGFsbCBwYWdlIHRhYmxlIHBh Z2VzIHdpbGwgaGF2ZSBiZWVuIGZyZWVkIGJ5CisgKiAgICBwbWFwX3JlbW92ZV9wYWdlcyBhbmQg cG1hcF9yZW1vdmUuICBJbiBhZGRpdGlvbiwgdGhlcmUgY2FuIG9ubHkgYmUgb25lCisgKiAgICBy ZWZlcmVuY2UgdG8gdGhlIHBtYXAgYW5kIHRoZSBwYWdlIGRpcmVjdG9yeSBpcyB3aXJlZCwgc28g dGhlIHBhZ2UocykKKyAqICAgIGNhbiBuZXZlciBiZSBidXN5LiAgU28gYWxsIHRoZXJlIGlzIHRv IGRvIGlzIGNsZWFyIHRoZSBtYWdpYyBtYXBwaW5ncworICogICAgZnJvbSB0aGUgcGFnZSBkaXJl Y3RvcnkgYW5kIGZyZWUgdGhlIHBhZ2UocykuCisgKi8KKworCisvKgorICogUmVsZWFzZSBhbnkg cmVzb3VyY2VzIGhlbGQgYnkgdGhlIGdpdmVuIHBoeXNpY2FsIG1hcC4KKyAqIENhbGxlZCB3aGVu IGEgcG1hcCBpbml0aWFsaXplZCBieSBwbWFwX3Bpbml0IGlzIGJlaW5nIHJlbGVhc2VkLgorICog U2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBtYXAgY29udGFpbnMgbm8gdmFsaWQgbWFwcGlu Z3MuCisgKi8KK3ZvaWQKK3BtYXBfcmVsZWFzZShwbWFwX3QgcG1hcCkKK3sKKwl2bV9vZmZzZXRf dCBwdGR2YTsKKwl2bV9wYWdlX3QgcHRkcGc7CisKKwlLQVNTRVJUKHBtYXAtPnBtX3N0YXRzLnJl c2lkZW50X2NvdW50ID09IDAsCisJICAgICgicG1hcF9yZWxlYXNlOiBwbWFwIHJlc2lkZW50IGNv dW50ICVsZCAhPSAwIiwKKwkgICAgcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQpKTsKKwor CXB0ZHZhID0gKHZtX29mZnNldF90KXBtYXAtPnBtX3NlZ3RhYjsKKwlwdGRwZyA9IFBIWVNfVE9f Vk1fUEFHRShNSVBTX0tTRUcwX1RPX1BIWVMocHRkdmEpKTsKKworCXB0ZHBnLT53aXJlX2NvdW50 LS07CisJYXRvbWljX3N1YnRyYWN0X2ludCgmY250LnZfd2lyZV9jb3VudCwgMSk7CisJdm1fcGFn ZV9mcmVlX3plcm8ocHRkcGcpOworCVBNQVBfTE9DS19ERVNUUk9ZKHBtYXApOworfQorCisvKgor ICogZ3JvdyB0aGUgbnVtYmVyIG9mIGtlcm5lbCBwYWdlIHRhYmxlIGVudHJpZXMsIGlmIG5lZWRl ZAorICovCit2b2lkCitwbWFwX2dyb3drZXJuZWwodm1fb2Zmc2V0X3QgYWRkcikKK3sKKwl2bV9w YWdlX3QgbmtwZzsKKwlwdF9lbnRyeV90ICpwdGU7CisJcGRfZW50cnlfdCAqcGRwZSwgKnBkZTsK KwlpbnQgaTsKKworCWlmICgwKSBwcmludGYoInBtYXBfZ3Jvd2tlcm5lbCwgYWRkciAlbHggbWF4 X29mZnNldCAlbHgsIGtlcm5lbF92bV9lbmQgJWx4LCBua3B0ICVkXG4iLAorCSAgICAgICAodV9s b25nKWFkZHIsICh1X2xvbmcpa2VybmVsX21hcC0+bWF4X29mZnNldCwgKHVfbG9uZylrZXJuZWxf dm1fZW5kLCBua3B0KTsKKwltdHhfYXNzZXJ0KCZrZXJuZWxfbWFwLT5zeXN0ZW1fbXR4LCBNQV9P V05FRCk7CisJYWRkciA9IHJvdW5kdXAyKGFkZHIsIFBBR0VfU0laRSAqIE5QVEVQRyk7CisJaWYg KGFkZHIgLSAxID49IGtlcm5lbF9tYXAtPm1heF9vZmZzZXQpCisJCWFkZHIgPSBrZXJuZWxfbWFw LT5tYXhfb2Zmc2V0OworCXdoaWxlIChrZXJuZWxfdm1fZW5kIDwgYWRkcikgeworCQlwZHBlID0g cG1hcF9zZWdtYXAoa2VybmVsX3BtYXAsIGtlcm5lbF92bV9lbmQpOworCQlpZiAoKnBkcGUgPT0g MCkgeworCQkJLyogbmV3IGludGVybWVkaWF0ZSBwYWdlIHRhYmxlIGVudHJ5ICovCisJCQlua3Bn ID0gcG1hcF9hbGxvY19wdGVfcGFnZShua3B0LCBWTV9BTExPQ19JTlRFUlJVUFQpOworCQkJaWYg KG5rcGcgPT0gTlVMTCkKKwkJCQlwYW5pYygicG1hcF9ncm93a2VybmVsOiBubyBtZW1vcnkgdG8g Z3JvdyBrZXJuZWwiKTsKKwkJCSpwZHBlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0tTRUcw KFZNX1BBR0VfVE9fUEhZUyhua3BnKSk7CisJCQljb250aW51ZTsgLyogdHJ5IGFnYWluICovCisJ CX0KKworCQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIGtlcm5lbF92bV9lbmQpOworCQlp ZiAoKnBkZSAhPSAwKSB7CisJCQlrZXJuZWxfdm1fZW5kID0gKGtlcm5lbF92bV9lbmQgKyBOQlBE UikgJiB+UERSTUFTSzsKKwkJCWlmIChrZXJuZWxfdm1fZW5kIC0gMSA+PSBrZXJuZWxfbWFwLT5t YXhfb2Zmc2V0KSB7CisJCQkJa2VybmVsX3ZtX2VuZCA9IGtlcm5lbF9tYXAtPm1heF9vZmZzZXQ7 CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFRoaXMg aW5kZXggaXMgYm9ndXMsIGJ1dCBvdXQgb2YgdGhlIHdheQorCQkqLworCQlua3BnID0gcG1hcF9h bGxvY19wdGVfcGFnZShua3B0LCBWTV9BTExPQ19JTlRFUlJVUFQpOworCQlpZiAoIW5rcGcpCisJ CQlwYW5pYygicG1hcF9ncm93a2VybmVsOiBubyBtZW1vcnkgdG8gZ3JvdyBrZXJuZWwiKTsKKwkJ bmtwdCsrOworCQkqcGRlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0tTRUcwKFZNX1BBR0Vf VE9fUEhZUyhua3BnKSk7CisKKwkJLyoKKwkJICogVGhlIFJbNC03XT8wMCBzdG9yZXMgb25seSBv bmUgY29weSBvZiB0aGUgR2xvYmFsIGJpdCBpbgorCQkgKiB0aGUgdHJhbnNsYXRpb24gbG9va2Fz aWRlIGJ1ZmZlciBmb3IgZWFjaCAyIHBhZ2UgZW50cnkuCisJCSAqIFRodXMgaW52YWxpZCBlbnRy eXMgbXVzdCBoYXZlIHRoZSBHbG9iYWwgYml0IHNldCBzbyB3aGVuCisJCSAqIEVudHJ5IExPIGFu ZCBFbnRyeSBISSBHIGJpdHMgYXJlIGFuZGVkIHRvZ2V0aGVyIHRoZXkgd2lsbAorCQkgKiBwcm9k dWNlIGEgZ2xvYmFsIGJpdCB0byBzdG9yZSBpbiB0aGUgdGxiLgorCQkgKi8KKwkJcHRlID0gKHB0 X2VudHJ5X3QgKikqcGRlOworCQlmb3IgKGkgPSAwOyBpIDwgTlBURVBHOyBpKyspCisJCQlwdGVb aV0gPSBQVEVfRzsKKworCQlrZXJuZWxfdm1fZW5kID0gKGtlcm5lbF92bV9lbmQgKyBOQlBEUikg JiB+UERSTUFTSzsKKwkJaWYgKGtlcm5lbF92bV9lbmQgLSAxID49IGtlcm5lbF9tYXAtPm1heF9v ZmZzZXQpIHsKKwkJCWtlcm5lbF92bV9lbmQgPSBrZXJuZWxfbWFwLT5tYXhfb2Zmc2V0OworCQkJ YnJlYWs7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioKKyogcGFnZSBtYW5hZ2VtZW50IHJvdXRpbmVzLgorICoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIGZy ZWUgdGhlIHB2X2VudHJ5IGJhY2sgdG8gdGhlIGZyZWUgbGlzdAorICovCitzdGF0aWMgUE1BUF9J TkxJTkUgdm9pZAorZnJlZV9wdl9lbnRyeShwdl9lbnRyeV90IHB2KQoreworCisJcHZfZW50cnlf Y291bnQtLTsKKwl1bWFfemZyZWUocHZ6b25lLCBwdik7Cit9CisKKy8qCisgKiBnZXQgYSBuZXcg cHZfZW50cnksIGFsbG9jYXRpbmcgYSBibG9jayBmcm9tIHRoZSBzeXN0ZW0KKyAqIHdoZW4gbmVl ZGVkLgorICogdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGlzIHBlcmZvcm1lZCBieXBhc3NpbmcgdGhl IG1hbGxvYyBjb2RlCisgKiBiZWNhdXNlIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBhbGxvY2F0aW9u cyBhdCBpbnRlcnJ1cHQgdGltZS4KKyAqLworc3RhdGljIHB2X2VudHJ5X3QKK2dldF9wdl9lbnRy eShwbWFwX3QgbG9ja2VkX3BtYXApCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCB0aW1ldmFsIHBy aW50aW50ZXJ2YWwgPSB7IDYwLCAwIH07CisJc3RhdGljIHN0cnVjdCB0aW1ldmFsIGxhc3Rwcmlu dDsKKwlzdHJ1Y3QgdnBncXVldWVzICp2cHE7CisJcHRfZW50cnlfdCAqcHRlLCBvbGRwdGU7CisJ cG1hcF90IHBtYXA7CisJcHZfZW50cnlfdCBhbGxvY2F0ZWRfcHYsIG5leHRfcHYsIHB2OworCXZt X29mZnNldF90IHZhOworCXZtX3BhZ2VfdCBtOworCisJUE1BUF9MT0NLX0FTU0VSVChsb2NrZWRf cG1hcCwgTUFfT1dORUQpOworCW10eF9hc3NlcnQoJnZtX3BhZ2VfcXVldWVfbXR4LCBNQV9PV05F RCk7CisJYWxsb2NhdGVkX3B2ID0gdW1hX3phbGxvYyhwdnpvbmUsIE1fTk9XQUlUKTsKKwlpZiAo YWxsb2NhdGVkX3B2ICE9IE5VTEwpIHsKKwkJcHZfZW50cnlfY291bnQrKzsKKwkJaWYgKHB2X2Vu dHJ5X2NvdW50ID4gcHZfZW50cnlfaGlnaF93YXRlcikKKwkJCXBhZ2VkYWVtb25fd2FrZXVwKCk7 CisJCWVsc2UKKwkJCXJldHVybiAoYWxsb2NhdGVkX3B2KTsKKwl9CisJLyoKKwkgKiBSZWNsYWlt IHB2IGVudHJpZXM6IEF0IGZpcnN0LCBkZXN0cm95IG1hcHBpbmdzIHRvIGluYWN0aXZlCisJICog cGFnZXMuICBBZnRlciB0aGF0LCBpZiBhIHB2IGVudHJ5IGlzIHN0aWxsIG5lZWRlZCwgZGVzdHJv eQorCSAqIG1hcHBpbmdzIHRvIGFjdGl2ZSBwYWdlcy4KKwkgKi8KKwlpZiAocmF0ZWNoZWNrKCZs YXN0cHJpbnQsICZwcmludGludGVydmFsKSkKKwkJcHJpbnRmKCJBcHByb2FjaGluZyB0aGUgbGlt aXQgb24gUFYgZW50cmllcywgIgorCQkgICAgImluY3JlYXNlIHRoZSB2bS5wbWFwLnNocGdwZXJw cm9jIHR1bmFibGUuXG4iKTsKKwl2cHEgPSAmdm1fcGFnZV9xdWV1ZXNbUFFfSU5BQ1RJVkVdOwor cmV0cnk6CisJVEFJTFFfRk9SRUFDSChtLCAmdnBxLT5wbCwgcGFnZXEpIHsKKwkJaWYgKG0tPmhv bGRfY291bnQgfHwgbS0+YnVzeSkKKwkJCWNvbnRpbnVlOworCQlUQUlMUV9GT1JFQUNIX1NBRkUo cHYsICZtLT5tZC5wdl9saXN0LCBwdl9saXN0LCBuZXh0X3B2KSB7CisJCQl2YSA9IHB2LT5wdl92 YTsKKwkJCXBtYXAgPSBwdi0+cHZfcG1hcDsKKwkJCS8qIEF2b2lkIGRlYWRsb2NrIGFuZCBsb2Nr IHJlY3Vyc2lvbi4gKi8KKwkJCWlmIChwbWFwID4gbG9ja2VkX3BtYXApCisJCQkJUE1BUF9MT0NL KHBtYXApOworCQkJZWxzZSBpZiAocG1hcCAhPSBsb2NrZWRfcG1hcCAmJiAhUE1BUF9UUllMT0NL KHBtYXApKQorCQkJCWNvbnRpbnVlOworCQkJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQt LTsKKwkJCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHZhKTsKKwkJCUtBU1NFUlQocHRlICE9IE5VTEws ICgicHRlIikpOworCQkJb2xkcHRlID0gbG9hZGFuZGNsZWFyKCh1X2ludCAqKXB0ZSk7CisJCQlp ZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpCisJCQkJKnB0ZSA9IFBURV9HOworCQkJS0FTU0VSVCgh cHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpLAorCQkJICAgICgid2lyZWQgcHRlIGZvciB1bndpcmVk IHBhZ2UiKSk7CisJCQlpZiAobS0+bWQucHZfZmxhZ3MgJiBQVl9UQUJMRV9SRUYpCisJCQkJdm1f cGFnZV9mbGFnX3NldChtLCBQR19SRUZFUkVOQ0VEKTsKKwkJCWlmIChwdGVfdGVzdCgmb2xkcHRl LCBQVEVfRCkpCisJCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJCXBtYXBfaW52YWxpZGF0ZV9wYWdl KHBtYXAsIHZhKTsKKwkJCVRBSUxRX1JFTU9WRSgmcG1hcC0+cG1fcHZsaXN0LCBwdiwgcHZfcGxp c3QpOworCQkJbS0+bWQucHZfbGlzdF9jb3VudC0tOworCQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5w dl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCQlwbWFwX3VudXNlX3B0KHBtYXAsIHZhLCBwdi0+cHZf cHRlbSk7CisJCQlpZiAocG1hcCAhPSBsb2NrZWRfcG1hcCkKKwkJCQlQTUFQX1VOTE9DSyhwbWFw KTsKKwkJCWlmIChhbGxvY2F0ZWRfcHYgPT0gTlVMTCkKKwkJCQlhbGxvY2F0ZWRfcHYgPSBwdjsK KwkJCWVsc2UKKwkJCQlmcmVlX3B2X2VudHJ5KHB2KTsKKwkJfQorCQlpZiAoVEFJTFFfRU1QVFko Jm0tPm1kLnB2X2xpc3QpKSB7CisJCQl2bV9wYWdlX2ZsYWdfY2xlYXIobSwgUEdfV1JJVEVBQkxF KTsKKwkJCW0tPm1kLnB2X2ZsYWdzICY9IH4oUFZfVEFCTEVfUkVGIHwgUFZfVEFCTEVfTU9EKTsK KwkJfQorCX0KKwlpZiAoYWxsb2NhdGVkX3B2ID09IE5VTEwpIHsKKwkJaWYgKHZwcSA9PSAmdm1f cGFnZV9xdWV1ZXNbUFFfSU5BQ1RJVkVdKSB7CisJCQl2cHEgPSAmdm1fcGFnZV9xdWV1ZXNbUFFf QUNUSVZFXTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwkJcGFuaWMoImdldF9wdl9lbnRyeTogaW5j cmVhc2UgdGhlIHZtLnBtYXAuc2hwZ3BlcnByb2MgdHVuYWJsZSIpOworCX0KKwlyZXR1cm4gKGFs bG9jYXRlZF9wdik7Cit9CisKKy8qCisgKiAgUmV2aXNpb24gMS4zNzAKKyAqCisgKiAgTW92ZSBw bWFwX2NvbGxlY3QoKSBvdXQgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGNvZGUsIHJlbmFtZSBp dAorICogIHRvIHJlZmxlY3QgaXRzIG5ldyBsb2NhdGlvbiwgYW5kIGFkZCBwYWdlIHF1ZXVlIGFu ZCBmbGFnIGxvY2tpbmcuCisgKgorICogIE5vdGVzOiAoMSkgYWxwaGEsIGkzODYsIGFuZCBpYTY0 IGhhZCBpZGVudGljYWwgaW1wbGVtZW50YXRpb25zCisgKiAgb2YgcG1hcF9jb2xsZWN0KCkgaW4g dGVybXMgb2YgbWFjaGluZS1pbmRlcGVuZGVudCBpbnRlcmZhY2VzOworICogICgyKSBzcGFyYzY0 IGRvZXNuJ3QgcmVxdWlyZSBpdDsgKDMpIHBvd2VycGMgaGFkIGl0IGFzIGEgVE9ETy4KKyAqCisg KiAgTUlQUyBpbXBsZW1lbnRhdGlvbiB3YXMgaWRlbnRpY2FsIHRvIGFscGhhIFtKdW5vcyA4LjJd CisgKi8KKworLyoKKyAqIElmIGl0IGlzIHRoZSBmaXJzdCBlbnRyeSBvbiB0aGUgbGlzdCwgaXQg aXMgYWN0dWFsbHkKKyAqIGluIHRoZSBoZWFkZXIgYW5kIHdlIG11c3QgY29weSB0aGUgZm9sbG93 aW5nIGVudHJ5IHVwCisgKiB0byB0aGUgaGVhZGVyLiAgT3RoZXJ3aXNlIHdlIG11c3Qgc2VhcmNo IHRoZSBsaXN0IGZvcgorICogdGhlIGVudHJ5LiAgSW4gZWl0aGVyIGNhc2Ugd2UgZnJlZSB0aGUg bm93IHVudXNlZCBlbnRyeS4KKyAqLworCitzdGF0aWMgcHZfZW50cnlfdAorcG1hcF9wdmhfcmVt b3ZlKHN0cnVjdCBtZF9wYWdlICpwdmgsIHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sK Kwlwdl9lbnRyeV90IHB2OworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJ bXR4X2Fzc2VydCgmdm1fcGFnZV9xdWV1ZV9tdHgsIE1BX09XTkVEKTsKKwlpZiAocHZoLT5wdl9s aXN0X2NvdW50IDwgcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQpIHsKKwkJVEFJTFFfRk9S RUFDSChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbGlzdCkgeworCQkJaWYgKHBtYXAgPT0gcHYtPnB2 X3BtYXAgJiYgdmEgPT0gcHYtPnB2X3ZhKQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJ VEFJTFFfRk9SRUFDSChwdiwgJnBtYXAtPnBtX3B2bGlzdCwgcHZfcGxpc3QpIHsKKwkJCWlmICh2 YSA9PSBwdi0+cHZfdmEpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHB2ICE9IE5VTEwpIHsK KwkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9saXN0KTsKKwkJcHZoLT5wdl9s aXN0X2NvdW50LS07CisJCVRBSUxRX1JFTU9WRSgmcG1hcC0+cG1fcHZsaXN0LCBwdiwgcHZfcGxp c3QpOworCX0KKwlyZXR1cm4gKHB2KTsKK30KKworc3RhdGljIHZvaWQKK3BtYXBfcHZoX2ZyZWUo c3RydWN0IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXB2 X2VudHJ5X3QgcHY7CisKKwlwdiA9IHBtYXBfcHZoX3JlbW92ZShwdmgsIHBtYXAsIHZhKTsKKwlL QVNTRVJUKHB2ICE9IE5VTEwsICgicG1hcF9wdmhfZnJlZTogcHYgbm90IGZvdW5kLCBwYSAlbHgg dmEgJWx4IiwKKwkgICAgICh1X2xvbmcpVk1fUEFHRV9UT19QSFlTKG1lbWJlcjJzdHJ1Y3Qodm1f cGFnZSwgbWQsIHB2aCkpLAorCSAgICAgKHVfbG9uZyl2YSkpOworCWZyZWVfcHZfZW50cnkocHYp OworfQorCitzdGF0aWMgdm9pZAorcG1hcF9yZW1vdmVfZW50cnkocG1hcF90IHBtYXAsIHZtX3Bh Z2VfdCBtLCB2bV9vZmZzZXRfdCB2YSkKK3sKKworCW10eF9hc3NlcnQoJnZtX3BhZ2VfcXVldWVf bXR4LCBNQV9PV05FRCk7CisJcG1hcF9wdmhfZnJlZSgmbS0+bWQsIHBtYXAsIHZhKTsKKwlpZiAo VEFJTFFfRU1QVFkoJm0tPm1kLnB2X2xpc3QpKQorCQl2bV9wYWdlX2ZsYWdfY2xlYXIobSwgUEdf V1JJVEVBQkxFKTsKK30KKworLyoKKyAqIENvbmRpdGlvbmFsbHkgY3JlYXRlIGEgcHYgZW50cnku CisgKi8KK3N0YXRpYyBib29sZWFuX3QKK3BtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShwbWFwX3Qg cG1hcCwgdm1fcGFnZV90IG1wdGUsIHZtX29mZnNldF90IHZhLAorICAgIHZtX3BhZ2VfdCBtKQor eworCXB2X2VudHJ5X3QgcHY7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsK KwltdHhfYXNzZXJ0KCZ2bV9wYWdlX3F1ZXVlX210eCwgTUFfT1dORUQpOworCWlmIChwdl9lbnRy eV9jb3VudCA8IHB2X2VudHJ5X2hpZ2hfd2F0ZXIgJiYgCisJICAgIChwdiA9IHVtYV96YWxsb2Mo cHZ6b25lLCBNX05PV0FJVCkpICE9IE5VTEwpIHsKKwkJcHZfZW50cnlfY291bnQrKzsKKwkJcHYt PnB2X3ZhID0gdmE7CisJCXB2LT5wdl9wbWFwID0gcG1hcDsKKwkJcHYtPnB2X3B0ZW0gPSBtcHRl OworCQlwdi0+cHZfd2lyZWQgPSBGQUxTRTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBt X3B2bGlzdCwgcHYsIHB2X3BsaXN0KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJm0tPm1kLnB2X2xp c3QsIHB2LCBwdl9saXN0KTsKKwkJbS0+bWQucHZfbGlzdF9jb3VudCsrOworCQlyZXR1cm4gKFRS VUUpOworCX0gZWxzZQorCQlyZXR1cm4gKEZBTFNFKTsKK30KKworLyoKKyAqIHBtYXBfcmVtb3Zl X3B0ZTogZG8gdGhlIHRoaW5ncyB0byB1bm1hcCBhIHBhZ2UgaW4gYSBwcm9jZXNzCisgKi8KK3N0 YXRpYyBpbnQKK3BtYXBfcmVtb3ZlX3B0ZShzdHJ1Y3QgcG1hcCAqcG1hcCwgcHRfZW50cnlfdCAq cHRxLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlwdF9lbnRyeV90IG9sZHB0ZTsKKwl2bV9wYWdlX3Qg bTsKKwl2bV9vZmZzZXRfdCBwYTsKKworCW10eF9hc3NlcnQoJnZtX3BhZ2VfcXVldWVfbXR4LCBN QV9PV05FRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisKKwlvbGRwdGUg PSBsb2FkYW5kY2xlYXIoKHVfaW50ICopcHRxKTsKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkp CisJCSpwdHEgPSBQVEVfRzsKKworCWlmIChwdGVfdGVzdCgmb2xkcHRlLCBQVEVfVykpCisJCXBt YXAtPnBtX3N0YXRzLndpcmVkX2NvdW50IC09IDE7CisKKwlwbWFwLT5wbV9zdGF0cy5yZXNpZGVu dF9jb3VudCAtPSAxOworCXBhID0gVExCTE9fUFRFX1RPX1BBKG9sZHB0ZSk7CisKKwlpZiAocGFn ZV9pc19tYW5hZ2VkKHBhKSkgeworCQltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKKwkJaWYgKHB0 ZV90ZXN0KCZvbGRwdGUsIFBURV9EKSkgeworI2lmIGRlZmluZWQoUE1BUF9ESUFHTk9TVElDKQor CQkJaWYgKHBtYXBfbndfbW9kaWZpZWQob2xkcHRlKSkgeworCQkJCXByaW50ZigKKwkJCQkgICAg InBtYXBfcmVtb3ZlOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZTogdmE6IDB4JXgsIHB0ZTog MHgleFxuIiwKKwkJCQkgICAgdmEsIG9sZHB0ZSk7CisJCQl9CisjZW5kaWYKKwkJCXZtX3BhZ2Vf ZGlydHkobSk7CisJCX0KKwkJaWYgKG0tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfUkVGKQorCQkJ dm1fcGFnZV9mbGFnX3NldChtLCBQR19SRUZFUkVOQ0VEKTsKKwkJbS0+bWQucHZfZmxhZ3MgJj0g fihQVl9UQUJMRV9SRUYgfCBQVl9UQUJMRV9NT0QpOworCisJCXBtYXBfcmVtb3ZlX2VudHJ5KHBt YXAsIG0sIHZhKTsKKwl9CisJcmV0dXJuIHBtYXBfdW51c2VfcHQocG1hcCwgdmEsIE5VTEwpOwor fQorCisvKgorICogUmVtb3ZlIGEgc2luZ2xlIHBhZ2UgZnJvbSBhIHByb2Nlc3MgYWRkcmVzcyBz cGFjZQorICovCitzdGF0aWMgdm9pZAorcG1hcF9yZW1vdmVfcGFnZShzdHJ1Y3QgcG1hcCAqcG1h cCwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcHRfZW50cnlfdCAqcHRxOworCisJbXR4X2Fzc2VydCgm dm1fcGFnZV9xdWV1ZV9tdHgsIE1BX09XTkVEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1B X09XTkVEKTsKKwlwdHEgPSBwbWFwX3B0ZShwbWFwLCB2YSk7CisKKwkvKgorCSAqIGlmIHRoZXJl IGlzIG5vIHB0ZSBmb3IgdGhpcyBhZGRyZXNzLCBqdXN0IHNraXAgaXQhISEKKwkgKi8KKwlpZiAo IXB0cSB8fCAhcHRlX3Rlc3QocHRxLCBQVEVfVikpIHsKKwkJcmV0dXJuOworCX0KKworCS8qCisJ ICogV3JpdGUgYmFjayBhbGwgY2FjaGVzIGZyb20gdGhlIHBhZ2UgYmVpbmcgZGVzdHJveWVkCisJ ICovCisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgodmEsIFBBR0VfU0laRSk7CisKKwkv KgorCSAqIGdldCBhIGxvY2FsIHZhIGZvciBtYXBwaW5ncyBmb3IgdGhpcyBwbWFwLgorCSAqLwor CSh2b2lkKXBtYXBfcmVtb3ZlX3B0ZShwbWFwLCBwdHEsIHZhKTsKKwlwbWFwX2ludmFsaWRhdGVf cGFnZShwbWFwLCB2YSk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKglSZW1vdmUgdGhlIGdpdmVu IHJhbmdlIG9mIGFkZHJlc3NlcyBmcm9tIHRoZSBzcGVjaWZpZWQgbWFwLgorICoKKyAqCUl0IGlz IGFzc3VtZWQgdGhhdCB0aGUgc3RhcnQgYW5kIGVuZCBhcmUgcHJvcGVybHkKKyAqCXJvdW5kZWQg dG8gdGhlIHBhZ2Ugc2l6ZS4KKyAqLwordm9pZAorcG1hcF9yZW1vdmUoc3RydWN0IHBtYXAgKnBt YXAsIHZtX29mZnNldF90IHN2YSwgdm1fb2Zmc2V0X3QgZXZhKQoreworCXZtX29mZnNldF90IHZh LCB2YV9uZXh0OworCXBkX2VudHJ5X3QgKnBkcGUsICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOwor CisJaWYgKHBtYXAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKHBtYXAtPnBtX3N0YXRzLnJl c2lkZW50X2NvdW50ID09IDApCisJCXJldHVybjsKKworCXZtX3BhZ2VfbG9ja19xdWV1ZXMoKTsK KwlQTUFQX0xPQ0socG1hcCk7CisKKwkvKgorCSAqIHNwZWNpYWwgaGFuZGxpbmcgb2YgcmVtb3Zp bmcgb25lIHBhZ2UuICBhIHZlcnkgY29tbW9uIG9wZXJhdGlvbgorCSAqIGFuZCBlYXN5IHRvIHNo b3J0IGNpcmN1aXQgc29tZSBjb2RlLgorCSAqLworCWlmICgoc3ZhICsgUEFHRV9TSVpFKSA9PSBl dmEpIHsKKwkJcG1hcF9yZW1vdmVfcGFnZShwbWFwLCBzdmEpOworCQlnb3RvIG91dDsKKwl9CisJ Zm9yICh2YSA9IHN2YTsgdmEgPCBldmE7IHZhID0gdmFfbmV4dCkgeworCQlwZHBlID0gcG1hcF9z ZWdtYXAocG1hcCwgc3ZhKTsKKwkJaWYgKCpwZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoc3Zh ICsgTkJTRUcpICYgflNFR01BU0s7CisJCQlpZiAodmFfbmV4dCA8IHN2YSkKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgdmFfbmV4dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9Cisg CisJCXZhX25leHQgPSAoc3ZhICsgTkJQRFIpICYgflBEUk1BU0s7CisJCWlmICh2YV9uZXh0IDwg c3ZhKQorCQkJdmFfbmV4dCA9IGV2YTsKKworCQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUs IHN2YSk7CisJCWlmICgqcGRlID09IDApCisJCQljb250aW51ZTsKKwkJcHRlID0gcG1hcF9wZGVf dG9fcHRlKHBkZSwgc3ZhKTsKKworCQlmb3IgKDsgc3ZhICE9IHZhX25leHQ7IHB0ZSsrLCBzdmEg Kz0gUEFHRV9TSVpFKSB7CisJCSAgICAgICBpZiAoKnB0ZSA9PSAwKQorCQkJICAgICAgIGNvbnRp bnVlOworCQkgICAgICAgcG1hcF9yZW1vdmVfcGFnZShwbWFwLCBzdmEpOworCX0KKworICAgICAg ICB9CitvdXQ6CisJdm1fcGFnZV91bmxvY2tfcXVldWVzKCk7CisJUE1BUF9VTkxPQ0socG1hcCk7 Cit9CisKKy8qCisgKglSb3V0aW5lOglwbWFwX3JlbW92ZV9hbGwKKyAqCUZ1bmN0aW9uOgorICoJ CVJlbW92ZXMgdGhpcyBwaHlzaWNhbCBwYWdlIGZyb20KKyAqCQlhbGwgcGh5c2ljYWwgbWFwcyBp biB3aGljaCBpdCByZXNpZGVzLgorICoJCVJlZmxlY3RzIGJhY2sgbW9kaWZ5IGJpdHMgdG8gdGhl IHBhZ2VyLgorICoKKyAqCU5vdGVzOgorICoJCU9yaWdpbmFsIHZlcnNpb25zIG9mIHRoaXMgcm91 dGluZSB3ZXJlIHZlcnkKKyAqCQlpbmVmZmljaWVudCBiZWNhdXNlIHRoZXkgaXRlcmF0aXZlbHkg Y2FsbGVkCisgKgkJcG1hcF9yZW1vdmUgKHNsb3cuLi4pCisgKi8KKwordm9pZAorcG1hcF9yZW1v dmVfYWxsKHZtX3BhZ2VfdCBtKQoreworCXB2X2VudHJ5X3QgcHY7CisJcHRfZW50cnlfdCAqcHRl LCB0cHRlOworCisJS0FTU0VSVCgobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSA9PSAwLAorCSAg ICAoInBtYXBfcmVtb3ZlX2FsbDogcGFnZSAlcCBpcyBmaWN0aXRpb3VzIiwgbSkpOworCXZtX3Bh Z2VfbG9ja19xdWV1ZXMoKTsKKworCWlmIChtLT5tZC5wdl9mbGFncyAmIFBWX1RBQkxFX1JFRikK KwkJdm1fcGFnZV9mbGFnX3NldChtLCBQR19SRUZFUkVOQ0VEKTsKKworCXdoaWxlICgocHYgPSBU QUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCkpICE9IE5VTEwpIHsKKwkJUE1BUF9MT0NLKHB2LT5w dl9wbWFwKTsKKworCQkvKgorCQkgKiBJZiBpdCdzIGxhc3QgbWFwcGluZyB3cml0ZWJhY2sgYWxs IGNhY2hlcyBmcm9tIAorCQkgKiB0aGUgcGFnZSBiZWluZyBkZXN0cm95ZWQKKwkgCSAqLworCQlp ZiAobS0+bWQucHZfbGlzdF9jb3VudCA9PSAxKSAKKwkJCW1pcHNfZGNhY2hlX3diaW52X3Jhbmdl X2luZGV4KHB2LT5wdl92YSwgUEFHRV9TSVpFKTsKKworCQlwdi0+cHZfcG1hcC0+cG1fc3RhdHMu cmVzaWRlbnRfY291bnQtLTsKKworCQlwdGUgPSBwbWFwX3B0ZShwdi0+cHZfcG1hcCwgcHYtPnB2 X3ZhKTsKKworCQl0cHRlID0gbG9hZGFuZGNsZWFyKCh1X2ludCAqKXB0ZSk7CisJCWlmIChpc19r ZXJuZWxfcG1hcChwdi0+cHZfcG1hcCkpCisJCQkqcHRlID0gUFRFX0c7CisKKwkJaWYgKHB0ZV90 ZXN0KCZ0cHRlLCBQVEVfVykpCisJCQlwdi0+cHZfcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQt LTsKKworCQkvKgorCQkgKiBVcGRhdGUgdGhlIHZtX3BhZ2VfdCBjbGVhbiBhbmQgcmVmZXJlbmNl IGJpdHMuCisJCSAqLworCQlpZiAocHRlX3Rlc3QoJnRwdGUsIFBURV9EKSkgeworI2lmIGRlZmlu ZWQoUE1BUF9ESUFHTk9TVElDKQorCQkJaWYgKHBtYXBfbndfbW9kaWZpZWQodHB0ZSkpIHsKKwkJ CQlwcmludGYoCisJCQkJICAgICJwbWFwX3JlbW92ZV9hbGw6IG1vZGlmaWVkIHBhZ2Ugbm90IHdy aXRhYmxlOiB2YTogMHgleCwgcHRlOiAweCV4XG4iLAorCQkJCSAgICBwdi0+cHZfdmEsIHRwdGUp OworCQkJfQorI2VuZGlmCisJCQl2bV9wYWdlX2RpcnR5KG0pOworCQl9CisJCXBtYXBfaW52YWxp ZGF0ZV9wYWdlKHB2LT5wdl9wbWFwLCBwdi0+cHZfdmEpOworCisJCVRBSUxRX1JFTU9WRSgmcHYt PnB2X3BtYXAtPnBtX3B2bGlzdCwgcHYsIHB2X3BsaXN0KTsKKwkJVEFJTFFfUkVNT1ZFKCZtLT5t ZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCW0tPm1kLnB2X2xpc3RfY291bnQtLTsKKwkJcG1h cF91bnVzZV9wdChwdi0+cHZfcG1hcCwgcHYtPnB2X3ZhLCBwdi0+cHZfcHRlbSk7CisJCVBNQVBf VU5MT0NLKHB2LT5wdl9wbWFwKTsKKwkJZnJlZV9wdl9lbnRyeShwdik7CisJfQorCisJdm1fcGFn ZV9mbGFnX2NsZWFyKG0sIFBHX1dSSVRFQUJMRSk7CisJbS0+bWQucHZfZmxhZ3MgJj0gfihQVl9U QUJMRV9SRUYgfCBQVl9UQUJMRV9NT0QpOworCXZtX3BhZ2VfdW5sb2NrX3F1ZXVlcygpOworfQor CisvKgorICoJU2V0IHRoZSBwaHlzaWNhbCBwcm90ZWN0aW9uIG9uIHRoZQorICoJc3BlY2lmaWVk IHJhbmdlIG9mIHRoaXMgbWFwIGFzIHJlcXVlc3RlZC4KKyAqLwordm9pZAorcG1hcF9wcm90ZWN0 KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29mZnNldF90IGV2YSwgdm1fcHJvdF90 IHByb3QpCit7CisJcHRfZW50cnlfdCAqcHRwYWRkciwgKnB0ZTsKKwlwZF9lbnRyeV90ICpwZHBl LCAqcGRlOworCXZtX29mZnNldF90IHZhX25leHQ7CisKKwlpZiAocG1hcCA9PSBOVUxMKQorCQly ZXR1cm47CisKKwlwcmludGYoIlBNQVAgcHJvdCBzdmEgJXAgZXZhICVwICV4XG4iLCh2b2lkICop c3ZhLCh2b2lkICopZXZhLCAoaW50KXByb3QpOworCWlmICgocHJvdCAmIFZNX1BST1RfUkVBRCkg PT0gVk1fUFJPVF9OT05FKSB7CisJCXBtYXBfcmVtb3ZlKHBtYXAsIHN2YSwgZXZhKTsKKwkJcmV0 dXJuOworCX0KKwlpZiAocHJvdCAmIFZNX1BST1RfV1JJVEUpCisJCXJldHVybjsKKworCXZtX3Bh Z2VfbG9ja19xdWV1ZXMoKTsKKwlQTUFQX0xPQ0socG1hcCk7CisJd2hpbGUgKHN2YSA8IGV2YSkg eworCQkvKgorCQkgKiBJZiBzZWdtZW50IHRhYmxlIGVudHJ5IGlzIGVtcHR5LCBza2lwIHRoaXMg c2VnbWVudC4KKwkJICovCisJCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFwLCBzdmEpOworCQlpZiAo KnBkcGUgPT0gMCkgeworCQkJdmFfbmV4dCA9IChzdmEgKyBOQlNFRykgJiB+U0VHTUFTSzsKKwkJ CWlmICh2YV9uZXh0IDwgc3ZhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9u ZXh0ID0gZXZhOworCQkJY29udGludWU7CisJCX0KKworCQl2YV9uZXh0ID0gKHN2YSArIE5CUERS KSAmIH5QRFJNQVNLOworICAgICAgICAgICAgICAgIGlmICh2YV9uZXh0IDwgc3ZhKQorICAgICAg ICAgICAgICAgICAgICAgICAgdmFfbmV4dCA9IGV2YTsKKworICAgICAgICAgICAgICAgIHBkZSA9 IHBtYXBfcGRwZV90b19wZGUocGRwZSwgc3ZhKTsKKyAgICAgICAgICAgICAgICBwdHBhZGRyID0g KnBkZTsKKworCQkvKgorICAgICAgICAgICAgICAgICAqIFdlZWQgb3V0IGludmFsaWQgbWFwcGlu Z3MuCisJCSAqLworICAgICAgICAgICAgICAgIGlmIChwdHBhZGRyID09IDApCisJCQljb250aW51 ZTsKKworICAgICAgICAgICAgICAgIGlmICh2YV9uZXh0ID4gZXZhKQorICAgICAgICAgICAgICAg ICAgICAgICAgdmFfbmV4dCA9IGV2YTsKKworICAgICAgICAgICAgICAgIGZvciAocHRlID0gcHRw YWRkcjsgc3ZhICE9IHZhX25leHQ7IHB0ZSsrLAorCQkJICAgICBzdmEgKz0gUEFHRV9TSVpFKSB7 CisgICAgICAgICAgICAgICAgICAgICAgICBwdF9lbnRyeV90IG9iaXRzLCBwYml0czsKKyAgICAg ICAgICAgICAgICAgICAgICAgIHZtX3BhZ2VfdCBtOworCQkJdm1fcGFkZHJfdCBwYTsKKwkJCQor cmV0cnk6CisJCW9iaXRzID0gcGJpdHMgPSAqcHRlOworCQlwYSA9IFRMQkxPX1BURV9UT19QQShw Yml0cyk7CisKKwkJaWYgKHBhZ2VfaXNfbWFuYWdlZChwYSkgJiYgcHRlX3Rlc3QoJnBiaXRzLCBQ VEVfRCkpIHsKKwkJCW0gPSBQSFlTX1RPX1ZNX1BBR0UocGEpOworCQkJdm1fcGFnZV9kaXJ0eSht KTsKKwkJCW0tPm1kLnB2X2ZsYWdzICY9IH5QVl9UQUJMRV9NT0Q7CisJCX0KKwkJcHRlX2NsZWFy KCZwYml0cywgUFRFX0QpOworCQlwdGVfc2V0KCZwYml0cywgUFRFX1JPKTsKKworCQlpZiAocGJp dHMgIT0gKnB0ZSkgeworCQkJaWYgKCFhdG9taWNfY21wc2V0X2ludCgodV9pbnQgKilwdGUsIG9i aXRzLCBwYml0cykpCisJCQkJZ290byByZXRyeTsKKwkJCXBtYXBfdXBkYXRlX3BhZ2UocG1hcCwg c3ZhLCBwYml0cyk7CisJCX0KKwkJfQorCX0KKwl2bV9wYWdlX3VubG9ja19xdWV1ZXMoKTsKKwlQ TUFQX1VOTE9DSyhwbWFwKTsKK30KKworLyoKKyAqCUluc2VydCB0aGUgZ2l2ZW4gcGh5c2ljYWwg cGFnZSAocCkgYXQKKyAqCXRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzICh2KSBpbiB0aGUK KyAqCXRhcmdldCBwaHlzaWNhbCBtYXAgd2l0aCB0aGUgcHJvdGVjdGlvbiByZXF1ZXN0ZWQuCisg KgorICoJSWYgc3BlY2lmaWVkLCB0aGUgcGFnZSB3aWxsIGJlIHdpcmVkIGRvd24sIG1lYW5pbmcK KyAqCXRoYXQgdGhlIHJlbGF0ZWQgcHRlIGNhbiBub3QgYmUgcmVjbGFpbWVkLgorICoKKyAqCU5C OiAgVGhpcyBpcyB0aGUgb25seSByb3V0aW5lIHdoaWNoIE1BWSBOT1QgbGF6eS1ldmFsdWF0ZQor ICoJb3IgbG9zZSBpbmZvcm1hdGlvbi4gIFRoYXQgaXMsIHRoaXMgcm91dGluZSBtdXN0IGFjdHVh bGx5CisgKglpbnNlcnQgdGhpcyBwYWdlIGludG8gdGhlIGdpdmVuIG1hcCBOT1cuCisgKi8KK3Zv aWQKK3BtYXBfZW50ZXIocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wcm90X3QgYWNj ZXNzLCB2bV9wYWdlX3QgbSwKKyAgICB2bV9wcm90X3QgcHJvdCwgYm9vbGVhbl90IHdpcmVkKQor eworCXZtX29mZnNldF90IHBhLCBvcGE7CisJcHRfZW50cnlfdCAqcHRlOworCXB0X2VudHJ5X3Qg b3JpZ3B0ZSwgbmV3cHRlOworCXB2X2VudHJ5X3QgcHY7CisJdm1fcGFnZV90IG1wdGUsIG9tOwor CWludCBydyA9IDA7CisJaW50IGRlYnVnID0gMDsgLyp2YSA8IFZNX01BWFVTRVJfQUREUkVTUzsq LworCWludCBwaWQgPSBjdXJ0aHJlYWQtPnRkX3Byb2MtPnBfcGlkOworCisJaWYgKHBtYXAgPT0g TlVMTCkgeworCQlwcmludGYoIk51bGwgcG1wXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZGVi dWcpCisJCXByaW50ZigiWyVkXVZBICVseCBwYWdlICVwXG4iLCBwaWQsICh1X2xvbmcpdmEsIG0p OworCisJdmEgJj0gflBBR0VfTUFTSzsKKyAJS0FTU0VSVCh2YSA8PSBWTV9NQVhfS0VSTkVMX0FE RFJFU1MsICgicG1hcF9lbnRlcjogdG9vYmlnIikpOworCUtBU1NFUlQoKG0tPmZsYWdzICYgKFBH X0ZJQ1RJVElPVVMgfCBQR19VTk1BTkFHRUQpKSAhPSAwIHx8CisJICAgIChtLT5vZmxhZ3MgJiBW UE9fQlVTWSkgIT0gMCwKKwkgICAgKCJwbWFwX2VudGVyOiBwYWdlICVwIGlzIG5vdCBidXN5Iiwg bSkpOworCisJbXB0ZSA9IE5VTEw7CisKKwl2bV9wYWdlX2xvY2tfcXVldWVzKCk7CisJUE1BUF9M T0NLKHBtYXApOworCisJLyoKKwkgKiBJbiB0aGUgY2FzZSB0aGF0IGEgcGFnZSB0YWJsZSBwYWdl IGlzIG5vdCByZXNpZGVudCwgd2UgYXJlCisJICogY3JlYXRpbmcgaXQgaGVyZS4KKwkgKi8KKwlp ZiAodmEgPCBWTV9NQVhVU0VSX0FERFJFU1MpIHsKKwkJbXB0ZSA9IHBtYXBfYWxsb2NwdGUocG1h cCwgdmEsIE1fV0FJVE9LKTsKKwl9CisJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEpOworCisJLyoK KwkgKiBQYWdlIERpcmVjdG9yeSB0YWJsZSBlbnRyeSBub3QgdmFsaWQsIHdlIG5lZWQgYSBuZXcg UFQgcGFnZQorCSAqLworCWlmIChwdGUgPT0gTlVMTCkgeworCQlwYW5pYygicG1hcF9lbnRlcjog aW52YWxpZCBwYWdlIGRpcmVjdG9yeSwgcGRpcj0lcCwgdmE9JXBcbiIsCisJCSAgICAodm9pZCAq KXBtYXAtPnBtX3NlZ3RhYiwgKHZvaWQgKil2YSk7CisJfQorCXBhID0gVk1fUEFHRV9UT19QSFlT KG0pOworCW9tID0gTlVMTDsKKwlvcmlncHRlID0gKnB0ZTsKKwlvcGEgPSBUTEJMT19QVEVfVE9f UEEob3JpZ3B0ZSk7CisKKwkvKgorCSAqIE1hcHBpbmcgaGFzIG5vdCBjaGFuZ2VkLCBtdXN0IGJl IHByb3RlY3Rpb24gb3Igd2lyaW5nIGNoYW5nZS4KKwkgKi8KKwlpZiAocHRlX3Rlc3QoJm9yaWdw dGUsIFBURV9WKSAmJiBvcGEgPT0gcGEpIHsKKwkJLyoKKwkJICogV2lyaW5nIGNoYW5nZSwganVz dCB1cGRhdGUgc3RhdHMuIFdlIGRvbid0IHdvcnJ5IGFib3V0CisJCSAqIHdpcmluZyBQVCBwYWdl cyBhcyB0aGV5IHJlbWFpbiByZXNpZGVudCBhcyBsb25nIGFzIHRoZXJlCisJCSAqIGFyZSB2YWxp ZCBtYXBwaW5ncyBpbiB0aGVtLiBIZW5jZSwgaWYgYSB1c2VyIHBhZ2UgaXMKKwkJICogd2lyZWQs IHRoZSBQVCBwYWdlIHdpbGwgYmUgYWxzby4KKwkJICovCisJCWlmICh3aXJlZCAmJiAhcHRlX3Rl c3QoJm9yaWdwdGUsIFBURV9XKSkKKwkJCXBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50Kys7CisJ CWVsc2UgaWYgKCF3aXJlZCAmJiBwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1cpKQorCQkJcG1hcC0+ cG1fc3RhdHMud2lyZWRfY291bnQtLTsKKworI2lmIGRlZmluZWQoUE1BUF9ESUFHTk9TVElDKQor CQlpZiAocG1hcF9ud19tb2RpZmllZChvcmlncHRlKSkgeworCQkJcHJpbnRmKAorCQkJICAgICJw bWFwX2VudGVyOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZTogdmE6IDB4JXgsIHB0ZTogMHgl eFxuIiwKKwkJCSAgICB2YSwgb3JpZ3B0ZSk7CisJCX0KKyNlbmRpZgorCQkvKgorCQkgKiBSZW1v dmUgZXh0cmEgcHRlIHJlZmVyZW5jZQorCQkgKi8KKwkJaWYgKG1wdGUpCisJCQltcHRlLT53aXJl X2NvdW50LS07CisKKwkJaWYgKHBhZ2VfaXNfbWFuYWdlZChvcGEpKSB7CisJCQlvbSA9IG07CisJ CX0KKwkJZ290byB2YWxpZGF0ZTsKKwl9CisKKwlwdiA9IE5VTEw7CisKKwkvKgorCSAqIE1hcHBp bmcgaGFzIGNoYW5nZWQsIGludmFsaWRhdGUgb2xkIHJhbmdlIGFuZCBmYWxsIHRocm91Z2ggdG8K KwkgKiBoYW5kbGUgdmFsaWRhdGluZyBuZXcgbWFwcGluZy4KKwkgKi8KKwlpZiAob3BhKSB7CisJ CWlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1cpKQorCQkJcG1hcC0+cG1fc3RhdHMud2lyZWRf Y291bnQtLTsKKworCQlpZiAocGFnZV9pc19tYW5hZ2VkKG9wYSkpIHsKKwkJCW9tID0gUEhZU19U T19WTV9QQUdFKG9wYSk7CisJCQlwdiA9IHBtYXBfcHZoX3JlbW92ZSgmb20tPm1kLCBwbWFwLCB2 YSk7CisJCX0KKwkJaWYgKG1wdGUgIT0gTlVMTCkgeworCQkJbXB0ZS0+d2lyZV9jb3VudC0tOwor CQkJS0FTU0VSVChtcHRlLT53aXJlX2NvdW50ID4gMCwKKwkJCSAgICAoInBtYXBfZW50ZXI6IG1p c3NpbmcgcmVmZXJlbmNlIHRvIHBhZ2UgdGFibGUgcGFnZSwiCisJCQkgICAgIiB2YTogJXAiLCAo dm9pZCAqKXZhKSk7CisJCX0KKwl9IGVsc2UKKwkJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291 bnQrKzsKKworCS8qCisJICogRW50ZXIgb24gdGhlIFBWIGxpc3QgaWYgcGFydCBvZiBvdXIgbWFu YWdlZCBtZW1vcnkuIE5vdGUgdGhhdCB3ZQorCSAqIHJhaXNlIElQTCB3aGlsZSBtYW5pcHVsYXRp bmcgcHZfdGFibGUgc2luY2UgcG1hcF9lbnRlciBjYW4gYmUKKwkgKiBjYWxsZWQgYXQgaW50ZXJy dXB0IHRpbWUuCisJICovCisJaWYgKChtLT5mbGFncyAmIChQR19GSUNUSVRJT1VTIHwgUEdfVU5N QU5BR0VEKSkgPT0gMCkgeworCQlLQVNTRVJUKHZhIDwga21pLmNsZWFuX3N2YSB8fCB2YSA+PSBr bWkuY2xlYW5fZXZhLAorCQkgICAgKCJwbWFwX2VudGVyOiBtYW5hZ2VkIG1hcHBpbmcgd2l0aGlu IHRoZSBjbGVhbiBzdWJtYXAiKSk7CisJCWlmIChwdiA9PSBOVUxMKQorCQkJcHYgPSBnZXRfcHZf ZW50cnkocG1hcCk7CisJCXB2LT5wdl92YSA9IHZhOworCQlwdi0+cHZfcG1hcCA9IHBtYXA7CisJ CXB2LT5wdl9wdGVtID0gbXB0ZTsKKwkJcHYtPnB2X3dpcmVkID0gd2lyZWQ7CisJCVRBSUxRX0lO U0VSVF9UQUlMKCZwbWFwLT5wbV9wdmxpc3QsIHB2LCBwdl9wbGlzdCk7CisJCVRBSUxRX0lOU0VS VF9UQUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCW0tPm1kLnB2X2xpc3RfY291 bnQrKzsKKwl9IGVsc2UgaWYgKHB2ICE9IE5VTEwpCisJCWZyZWVfcHZfZW50cnkocHYpOworCisJ LyoKKwkgKiBJbmNyZW1lbnQgY291bnRlcnMKKwkgKi8KKwlpZiAod2lyZWQpCisJCXBtYXAtPnBt X3N0YXRzLndpcmVkX2NvdW50Kys7CisKK3ZhbGlkYXRlOgorCWlmICgoYWNjZXNzICYgVk1fUFJP VF9XUklURSkgIT0gMCkKKwkJbS0+bWQucHZfZmxhZ3MgfD0gUFZfVEFCTEVfTU9EIHwgUFZfVEFC TEVfUkVGOworCXJ3ID0gaW5pdF9wdGVfcHJvdCh2YSwgbSwgcHJvdCk7CisKKyNpZmRlZiBQTUFQ X0RFQlVHCisJcHJpbnRmKCJbJWRdIHBtYXBfZW50ZXI6ICB2YTogJXAgLT4gcGE6ICVwXG4iLCBw aWQsICh2b2lkICopdmEsICh2b2lkICopcGEpOworI2VuZGlmCisJLyoKKwkgKiBOb3cgdmFsaWRh dGUgbWFwcGluZyB3aXRoIGRlc2lyZWQgcHJvdGVjdGlvbi93aXJpbmcuCisJICovCisJbmV3cHRl ID0gVExCTE9fUEFfVE9fUEZOKHBhKSB8IHJ3IHwgUFRFX1Y7CisKKwlpZiAoaXNfY2FjaGVhYmxl X21lbShwYSkpCisJCW5ld3B0ZSB8PSBQVEVfQ19DQUNIRTsKKwllbHNlCisJCW5ld3B0ZSB8PSBQ VEVfQ19VTkNBQ0hFRDsKKworCWlmICh3aXJlZCkKKwkJbmV3cHRlIHw9IFBURV9XOworCisJaWYg KGlzX2tlcm5lbF9wbWFwKHBtYXApKQorCSAgICAgICAgIG5ld3B0ZSB8PSBQVEVfRzsKKworCS8q CisJICogaWYgdGhlIG1hcHBpbmcgb3IgcGVybWlzc2lvbiBiaXRzIGFyZSBkaWZmZXJlbnQsIHdl IG5lZWQgdG8KKwkgKiB1cGRhdGUgdGhlIHB0ZS4KKwkgKi8KKwlpZiAob3JpZ3B0ZSAhPSBuZXdw dGUpIHsKKwkJaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVikpIHsKKwkJCSpwdGUgPSBuZXdw dGU7CisJCQlpZiAocGFnZV9pc19tYW5hZ2VkKG9wYSkgJiYgKG9wYSAhPSBwYSkpIHsKKwkJCQlp ZiAob20tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfUkVGKQorCQkJCQl2bV9wYWdlX2ZsYWdfc2V0 KG9tLCBQR19SRUZFUkVOQ0VEKTsKKwkJCQlvbS0+bWQucHZfZmxhZ3MgJj0KKwkJCQkgICAgfihQ Vl9UQUJMRV9SRUYgfCBQVl9UQUJMRV9NT0QpOworCQkJfQorCQkJaWYgKHB0ZV90ZXN0KCZvcmln cHRlLCBQVEVfRCkpIHsKKwkJCQlLQVNTRVJUKCFwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1JPKSwK KwkJCQkgICAgKCJwbWFwX2VudGVyOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZToiCisJCQkJ ICAgICIgdmE6ICVwLCBwdGU6IDB4JXgiLCAodm9pZCAqKXZhLCBvcmlncHRlKSk7CisJCQkJaWYg KHBhZ2VfaXNfbWFuYWdlZChvcGEpKQorCQkJCQl2bV9wYWdlX2RpcnR5KG9tKTsKKwkJCX0KKwkJ CWlmIChwYWdlX2lzX21hbmFnZWQob3BhKSAmJgorCQkJICAgIFRBSUxRX0VNUFRZKCZvbS0+bWQu cHZfbGlzdCkpCisJCQkJdm1fcGFnZV9mbGFnX2NsZWFyKG9tLCBQR19XUklURUFCTEUpOworCQl9 IGVsc2UgeworCQkJKnB0ZSA9IG5ld3B0ZTsKKwkJfQorCX0KKwlwbWFwX3VwZGF0ZV9wYWdlKHBt YXAsIHZhLCBuZXdwdGUpOworCisJLyoKKwkgKiBTeW5jIEkgJiBEIGNhY2hlcyBmb3IgZXhlY3V0 YWJsZSBwYWdlcy4gIERvIHRoaXMgb25seSBpZiB0aGUgdGhlCisJICogdGFyZ2V0IHBtYXAgYmVs b25ncyB0byB0aGUgY3VycmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCBhbgorCSAqIHVucmVzb2x2 YWJsZSBUTEIgbWlzcyBtYXkgb2NjdXIuCisJICovCisJaWYgKCFpc19rZXJuZWxfcG1hcChwbWFw KSAmJiAocG1hcCA9PSAmY3VycHJvYy0+cF92bXNwYWNlLT52bV9wbWFwKSAmJgorCSAgICAocHJv dCAmIFZNX1BST1RfRVhFQ1VURSkpIHsKKwkJbWlwc19pY2FjaGVfc3luY19yYW5nZSh2YSwgUEFH RV9TSVpFKTsKKwkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7CisJfQor CXZtX3BhZ2VfdW5sb2NrX3F1ZXVlcygpOworCVBNQVBfVU5MT0NLKHBtYXApOworCWlmIChkZWJ1 ZykgeworCQlpbnQgaSwgaiwgazsKKwkJcGRfZW50cnlfdCAqcDE7CisJICAgICAgIAlwdF9lbnRy eV90ICpwMjsKKworCQlpID0gcG1hcF9zZWdfaW5kZXgodmEpOworCQlwMSA9IChwZF9lbnRyeV90 ICopcG1hcC0+cG1fc2VndGFiW2ldOworCQlqID0gcG1hcF9wZGVfaW5kZXgodmEpOworCQlwMiA9 IChwdF9lbnRyeV90ICopcDFbal07CisJCWsgPSBwbWFwX3B0ZV9pbmRleCh2YSk7CisKKwkJcHJp bnRmKCJzZWdtYXBbJWRdID0gJXAsIHBkZVslZF0gPSAlcCBwdGVbJWRdID0gJXhcbiIsCisJCQlp LCBwMSwgaiwgcDIsIGsgLCBwMltrXSk7CisJCXByaW50ZigicG1hcCBlbnRlciAtICVwICV4IC0+ ICV4IGRvbmVcbiIsIHB0ZSwgb3JpZ3B0ZSwgbmV3cHRlKTsKKwl9Cit9CisKKy8qCisgKiB0aGlz IGNvZGUgbWFrZXMgc29tZSAqTUFKT1IqIGFzc3VtcHRpb25zOgorICogMS4gQ3VycmVudCBwbWFw ICYgcG1hcCBleGlzdHMuCisgKiAyLiBOb3Qgd2lyZWQuCisgKiAzLiBSZWFkIGFjY2Vzcy4KKyAq IDQuIE5vIHBhZ2UgdGFibGUgcGFnZXMuCisgKiBidXQgaXMgKk1VQ0gqIGZhc3RlciB0aGFuIHBt YXBfZW50ZXIuLi4KKyAqLworCit2b2lkCitwbWFwX2VudGVyX3F1aWNrKHBtYXBfdCBwbWFwLCB2 bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sIHZtX3Byb3RfdCBwcm90KQoreworCisJdm1fcGFn ZV9sb2NrX3F1ZXVlcygpOworCVBNQVBfTE9DSyhwbWFwKTsKKwkodm9pZClwbWFwX2VudGVyX3F1 aWNrX2xvY2tlZChwbWFwLCB2YSwgbSwgcHJvdCwgTlVMTCk7CisJdm1fcGFnZV91bmxvY2tfcXVl dWVzKCk7CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisKK3N0YXRpYyB2bV9wYWdlX3QKK3BtYXBf ZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90 IG0sCisgICAgdm1fcHJvdF90IHByb3QsIHZtX3BhZ2VfdCBtcHRlKQoreworCXB0X2VudHJ5X3Qg KnB0ZTsKKwl2bV9vZmZzZXRfdCBwYTsKKworCUtBU1NFUlQodmEgPCBrbWkuY2xlYW5fc3ZhIHx8 IHZhID49IGttaS5jbGVhbl9ldmEgfHwKKwkgICAgKG0tPmZsYWdzICYgKFBHX0ZJQ1RJVElPVVMg fCBQR19VTk1BTkFHRUQpKSAhPSAwLAorCSAgICAoInBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkOiBt YW5hZ2VkIG1hcHBpbmcgd2l0aGluIHRoZSBjbGVhbiBzdWJtYXAiKSk7CisJbXR4X2Fzc2VydCgm dm1fcGFnZV9xdWV1ZV9tdHgsIE1BX09XTkVEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1B X09XTkVEKTsKKworCS8qCisJICogSW4gdGhlIGNhc2UgdGhhdCBhIHBhZ2UgdGFibGUgcGFnZSBp cyBub3QgcmVzaWRlbnQsIHdlIGFyZQorCSAqIGNyZWF0aW5nIGl0IGhlcmUuCisJICovCisJaWYg KHZhIDwgVk1fTUFYVVNFUl9BRERSRVNTKSB7CisJCXBkX2VudHJ5X3QgKnBkZTsKKwkJdW5zaWdu ZWQgcHRlcGluZGV4OworCisJCS8qCisJCSAqIENhbGN1bGF0ZSBwYWdldGFibGUgcGFnZSBpbmRl eAorCQkgKi8KKwkJcHRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KHZhKTsKKwkJaWYgKDApIHBy aW50ZigicG1hcF9lbnRlcl9xdWljazogbSAlcCBpbmRleCAleCB2YTogJXAgXG4iLCBtLCAoaW50 KXB0ZXBpbmRleCwgKHZvaWQgKil2YSk7CisJCWlmIChtcHRlICYmIChtcHRlLT5waW5kZXggPT0g cHRlcGluZGV4KSkgeworCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJLyoK KwkJCSAqIEdldCB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkKKwkJCSAqLworCQkJcGRlID0gcG1h cF9wZGUocG1hcCwgdmEpOworCisJCQkvKgorCQkJICogSWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBp cyBtYXBwZWQsIHdlIGp1c3QKKwkJCSAqIGluY3JlbWVudCB0aGUgaG9sZCBjb3VudCwgYW5kIGFj dGl2YXRlIGl0LgorCQkJICovCisJCQlpZiAocGRlICYmICpwZGUgIT0gMCkgeworCQkJCWlmIChw bWFwLT5wbV9wdHBoaW50ICYmCisJCQkJICAgIChwbWFwLT5wbV9wdHBoaW50LT5waW5kZXggPT0g cHRlcGluZGV4KSkgeworCQkJCQltcHRlID0gcG1hcC0+cG1fcHRwaGludDsKKwkJCQl9IGVsc2Ug eworCQkJCQltcHRlID0gUEhZU19UT19WTV9QQUdFKAorCQkJCQkJTUlQU19LU0VHMF9UT19QSFlT KCpwZGUpKTsKKwkJCQkJcG1hcC0+cG1fcHRwaGludCA9IG1wdGU7CisJCQkJfQorCQkJCW1wdGUt PndpcmVfY291bnQrKzsKKwkJCX0gZWxzZSB7CisJCQkJbXB0ZSA9IF9wbWFwX2FsbG9jcHRlKHBt YXAsIHB0ZXBpbmRleCwKKwkJCQkgICAgTV9OT1dBSVQpOworCQkJCWlmIChtcHRlID09IE5VTEwp CisJCQkJCXJldHVybiAobXB0ZSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQltcHRlID0gTlVM TDsKKwl9CisKKwlwdGUgPSBwbWFwX3B0ZShwbWFwLCB2YSk7CisJaWYgKHB0ZV90ZXN0KHB0ZSwg UFRFX1YpKSB7CisJCWlmIChtcHRlICE9IE5VTEwpIHsKKwkJCW1wdGUtPndpcmVfY291bnQtLTsK KwkJCW1wdGUgPSBOVUxMOworCQl9CisJCXJldHVybiAobXB0ZSk7CisJfQorCisJLyoKKwkgKiBF bnRlciBvbiB0aGUgUFYgbGlzdCBpZiBwYXJ0IG9mIG91ciBtYW5hZ2VkIG1lbW9yeS4KKwkgKi8K KwlpZiAoKG0tPmZsYWdzICYgKFBHX0ZJQ1RJVElPVVMgfCBQR19VTk1BTkFHRUQpKSA9PSAwICYm CisJICAgICFwbWFwX3RyeV9pbnNlcnRfcHZfZW50cnkocG1hcCwgbXB0ZSwgdmEsIG0pKSB7CisJ CWlmIChtcHRlICE9IE5VTEwpIHsKKwkJCXBtYXBfdW53aXJlX3B0ZV9ob2xkKHBtYXAsIHZhLCBt cHRlKTsKKwkJCW1wdGUgPSBOVUxMOworCQl9CisJCXJldHVybiAobXB0ZSk7CisJfQorCisJLyoK KwkgKiBJbmNyZW1lbnQgY291bnRlcnMKKwkgKi8KKwlwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9j b3VudCsrOworCisJcGEgPSBWTV9QQUdFX1RPX1BIWVMobSk7CisKKwkvKgorCSAqIE5vdyB2YWxp ZGF0ZSBtYXBwaW5nIHdpdGggUk8gcHJvdGVjdGlvbgorCSAqLworCSpwdGUgPSBUTEJMT19QQV9U T19QRk4ocGEpIHwgUFRFX1Y7CisKKwlpZiAoaXNfY2FjaGVhYmxlX21lbShwYSkpCisJCSpwdGUg fD0gUFRFX0NfQ0FDSEU7CisJZWxzZQorCQkqcHRlIHw9IFBURV9DX1VOQ0FDSEVEOworCisJaWYg KGlzX2tlcm5lbF9wbWFwKHBtYXApKQorCQkqcHRlIHw9IFBURV9HOworCWVsc2UgeworCQkqcHRl IHw9IFBURV9STzsKKwkJLyoKKwkJICogU3luYyBJICYgRCBjYWNoZXMuICBEbyB0aGlzIG9ubHkg aWYgdGhlIHRoZSB0YXJnZXQgcG1hcAorCQkgKiBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IHByb2Nl c3MuICBPdGhlcndpc2UsIGFuCisJCSAqIHVucmVzb2x2YWJsZSBUTEIgbWlzcyBtYXkgb2NjdXIu ICovCisJCWlmIChwbWFwID09ICZjdXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXApIHsKKwkJCXZh ICY9IH5QQUdFX01BU0s7CisJCQltaXBzX2ljYWNoZV9zeW5jX3JhbmdlKHZhLCBQQUdFX1NJWkUp OworCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7CisJCX0KKwl9CisJ cmV0dXJuIChtcHRlKTsKK30KKworLyoKKyAqIE1ha2UgYSB0ZW1wb3JhcnkgbWFwcGluZyBmb3Ig YSBwaHlzaWNhbCBhZGRyZXNzLiAgVGhpcyBpcyBvbmx5IGludGVuZGVkCisgKiB0byBiZSB1c2Vk IGZvciBwYW5pYyBkdW1wcy4KKyAqCisgKiBVc2UgWEtQSFlTIGZvciA2NCBiaXQsIGFuZCBLU0VH MCB3aGVyZSBwb3NzaWJsZSBmb3IgMzIgYml0LgorICovCit2b2lkICoKK3BtYXBfa2VudGVyX3Rl bXBvcmFyeSh2bV9wYWRkcl90IHBhLCBpbnQgaSkKK3sKKwlyZXR1cm4gKCh2b2lkICopTUlQU19Q SFlTX1RPX1hLUEhZU19DQUNIRUQocGEpKTsKK30KK3ZvaWQKK3BtYXBfa2VudGVyX3RlbXBvcmFy eV9mcmVlKHZtX3BhZGRyX3QgcGEpCit7Cit9CisKKy8qCisgKiBNb3ZlZCB0aGUgY29kZSB0byBN YWNoaW5lIEluZGVwZW5kZW50CisgKgkgdm1fbWFwX3BtYXBfZW50ZXIoKQorICovCisKKy8qCisg KiBNYXBzIGEgc2VxdWVuY2Ugb2YgcmVzaWRlbnQgcGFnZXMgYmVsb25naW5nIHRvIHRoZSBzYW1l IG9iamVjdC4KKyAqIFRoZSBzZXF1ZW5jZSBiZWdpbnMgd2l0aCB0aGUgZ2l2ZW4gcGFnZSBtX3N0 YXJ0LiAgVGhpcyBwYWdlIGlzCisgKiBtYXBwZWQgYXQgdGhlIGdpdmVuIHZpcnR1YWwgYWRkcmVz cyBzdGFydC4gIEVhY2ggc3Vic2VxdWVudCBwYWdlIGlzCisgKiBtYXBwZWQgYXQgYSB2aXJ0dWFs IGFkZHJlc3MgdGhhdCBpcyBvZmZzZXQgZnJvbSBzdGFydCBieSB0aGUgc2FtZQorICogYW1vdW50 IGFzIHRoZSBwYWdlIGlzIG9mZnNldCBmcm9tIG1fc3RhcnQgd2l0aGluIHRoZSBvYmplY3QuICBU aGUKKyAqIGxhc3QgcGFnZSBpbiB0aGUgc2VxdWVuY2UgaXMgdGhlIHBhZ2Ugd2l0aCB0aGUgbGFy Z2VzdCBvZmZzZXQgZnJvbQorICogbV9zdGFydCB0aGF0IGNhbiBiZSBtYXBwZWQgYXQgYSB2aXJ0 dWFsIGFkZHJlc3MgbGVzcyB0aGFuIHRoZSBnaXZlbgorICogdmlydHVhbCBhZGRyZXNzIGVuZC4g IE5vdCBldmVyeSB2aXJ0dWFsIHBhZ2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kCisgKiBpcyBtYXBw ZWQ7IG9ubHkgdGhvc2UgZm9yIHdoaWNoIGEgcmVzaWRlbnQgcGFnZSBleGlzdHMgd2l0aCB0aGUK KyAqIGNvcnJlc3BvbmRpbmcgb2Zmc2V0IGZyb20gbV9zdGFydCBhcmUgbWFwcGVkLgorICovCit2 b2lkCitwbWFwX2VudGVyX29iamVjdChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qgc3RhcnQsIHZt X29mZnNldF90IGVuZCwKKyAgICB2bV9wYWdlX3QgbV9zdGFydCwgdm1fcHJvdF90IHByb3QpCit7 CisJdm1fcGFnZV90IG0sIG1wdGU7CisJdm1fcGluZGV4X3QgZGlmZiwgcHNpemU7CisKKwlWTV9P QkpFQ1RfTE9DS19BU1NFUlQobV9zdGFydC0+b2JqZWN0LCBNQV9PV05FRCk7CisJcHNpemUgPSBh dG9wKGVuZCAtIHN0YXJ0KTsKKwltcHRlID0gTlVMTDsKKwltID0gbV9zdGFydDsKKwl2bV9wYWdl X2xvY2tfcXVldWVzKCk7CisJUE1BUF9MT0NLKHBtYXApOworCXdoaWxlIChtICE9IE5VTEwgJiYg KGRpZmYgPSBtLT5waW5kZXggLSBtX3N0YXJ0LT5waW5kZXgpIDwgcHNpemUpIHsKKwkJbXB0ZSA9 IHBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAsIHN0YXJ0ICsgcHRvYShkaWZmKSwgbSwKKwkJ ICAgIHByb3QsIG1wdGUpOworCQltID0gVEFJTFFfTkVYVChtLCBsaXN0cSk7CisJfQorCXZtX3Bh Z2VfdW5sb2NrX3F1ZXVlcygpOworIAlQTUFQX1VOTE9DSyhwbWFwKTsKK30KKworLyoKKyAqIHBt YXBfb2JqZWN0X2luaXRfcHQgcHJlbG9hZHMgdGhlIHB0ZXMgZm9yIGEgZ2l2ZW4gb2JqZWN0Cisg KiBpbnRvIHRoZSBzcGVjaWZpZWQgcG1hcC4gIFRoaXMgZWxpbWluYXRlcyB0aGUgYmxhc3Qgb2Yg c29mdAorICogZmF1bHRzIG9uIHByb2Nlc3Mgc3RhcnR1cCBhbmQgaW1tZWRpYXRlbHkgYWZ0ZXIg YW4gbW1hcC4KKyAqLwordm9pZAorcG1hcF9vYmplY3RfaW5pdF9wdChwbWFwX3QgcG1hcCwgdm1f b2Zmc2V0X3QgYWRkciwKKyAgICB2bV9vYmplY3RfdCBvYmplY3QsIHZtX3BpbmRleF90IHBpbmRl eCwgdm1fc2l6ZV90IHNpemUpCit7CisJVk1fT0JKRUNUX0xPQ0tfQVNTRVJUKG9iamVjdCwgTUFf T1dORUQpOworCUtBU1NFUlQob2JqZWN0LT50eXBlID09IE9CSlRfREVWSUNFIHx8IG9iamVjdC0+ dHlwZSA9PSBPQkpUX1NHLAorCSAgICAoInBtYXBfb2JqZWN0X2luaXRfcHQ6IG5vbi1kZXZpY2Ug b2JqZWN0IikpOworfQorCisvKgorICoJUm91dGluZToJcG1hcF9jaGFuZ2Vfd2lyaW5nCisgKglG dW5jdGlvbjoJQ2hhbmdlIHRoZSB3aXJpbmcgYXR0cmlidXRlIGZvciBhIG1hcC92aXJ0dWFsLWFk ZHJlc3MKKyAqCQkJcGFpci4KKyAqCUluL291dCBjb25kaXRpb25zOgorICoJCQlUaGUgbWFwcGlu ZyBtdXN0IGFscmVhZHkgZXhpc3QgaW4gdGhlIHBtYXAuCisgKi8KK3ZvaWQKK3BtYXBfY2hhbmdl X3dpcmluZyhwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIGJvb2xlYW5fdCB3aXJlZCkKK3sK KwlwdF9lbnRyeV90ICpwdGU7CisKKwlpZiAocG1hcCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlQ TUFQX0xPQ0socG1hcCk7CisJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEpOworCisJaWYgKHdpcmVk ICYmICFwdGVfdGVzdChwdGUsIFBURV9XKSkKKwkJcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQr KzsKKwllbHNlIGlmICghd2lyZWQgJiYgcHRlX3Rlc3QocHRlLCBQVEVfVykpCisJCXBtYXAtPnBt X3N0YXRzLndpcmVkX2NvdW50LS07CisKKwkvKgorCSAqIFdpcmluZyBpcyBub3QgYSBoYXJkd2Fy ZSBjaGFyYWN0ZXJpc3RpYyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvCisJICogaW52YWxpZGF0ZSBU TEIuCisJICovCisJaWYgKHdpcmVkKQorCQlwdGVfc2V0KHB0ZSwgUFRFX1cpOworCWVsc2UKKwkJ cHRlX2NsZWFyKHB0ZSwgUFRFX1cpOworCVBNQVBfVU5MT0NLKHBtYXApOworfQorCisvKgorICoJ Q29weSB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5IHNyY19hZGRyL2xlbgorICoJZnJvbSB0aGUgc291 cmNlIG1hcCB0byB0aGUgcmFuZ2UgZHN0X2FkZHIvbGVuCisgKglpbiB0aGUgZGVzdGluYXRpb24g bWFwLgorICoKKyAqCVRoaXMgcm91dGluZSBpcyBvbmx5IGFkdmlzb3J5IGFuZCBuZWVkIG5vdCBk byBhbnl0aGluZy4KKyAqLworCit2b2lkCitwbWFwX2NvcHkocG1hcF90IGRzdF9wbWFwLCBwbWFw X3Qgc3JjX3BtYXAsIHZtX29mZnNldF90IGRzdF9hZGRyLAorICAgIHZtX3NpemVfdCBsZW4sIHZt X29mZnNldF90IHNyY19hZGRyKQoreworfQorCisvKgorICoJcG1hcF96ZXJvX3BhZ2UgemVyb3Mg dGhlIHNwZWNpZmllZCBoYXJkd2FyZSBwYWdlIGJ5IG1hcHBpbmcKKyAqCXRoZSBwYWdlIGludG8g S1ZNIGFuZCB1c2luZyBiemVybyB0byBjbGVhciBpdHMgY29udGVudHMuCisgKgorICogCVVzZSBY S1BIWVMgZm9yIDY0IGJpdCwgYW5kIEtTRUcwIHdoZXJlIHBvc3NpYmxlIGZvciAzMiBiaXQuCisg Ki8KK3ZvaWQKK3BtYXBfemVyb19wYWdlKHZtX3BhZ2VfdCBtKQoreworCXZtX29mZnNldF90IHZh OworCXZtX3BhZGRyX3QgcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKworCXZhID0gTUlQU19Q SFlTX1RPX1hLUEhZU19DQUNIRUQocGh5cyk7CisJYnplcm8oKGNhZGRyX3QpdmEsIFBBR0VfU0la RSk7CisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7Cit9CisKKy8qCisg KglwbWFwX3plcm9fcGFnZV9hcmVhIHplcm9zIHRoZSBzcGVjaWZpZWQgaGFyZHdhcmUgcGFnZSBi eSBtYXBwaW5nCisgKgl0aGUgcGFnZSBpbnRvIEtWTSBhbmQgdXNpbmcgYnplcm8gdG8gY2xlYXIg aXRzIGNvbnRlbnRzLgorICoKKyAqCW9mZiBhbmQgc2l6ZSBtYXkgbm90IGNvdmVyIGFuIGFyZWEg YmV5b25kIGEgc2luZ2xlIGhhcmR3YXJlIHBhZ2UuCisgKi8KK3ZvaWQKK3BtYXBfemVyb19wYWdl X2FyZWEodm1fcGFnZV90IG0sIGludCBvZmYsIGludCBzaXplKQoreworCXZtX29mZnNldF90IHZh OworCXZtX3BhZGRyX3QgcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKworCXZhID0gTUlQU19Q SFlTX1RPX1hLUEhZU19DQUNIRUQocGh5cyk7CisJYnplcm8oKGNoYXIgKikoY2FkZHJfdCl2YSAr IG9mZiwgc2l6ZSk7CisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEgKyBvZmYsIHNpemUpOwor fQorCit2b2lkCitwbWFwX3plcm9fcGFnZV9pZGxlKHZtX3BhZ2VfdCBtKQoreworCXZtX29mZnNl dF90IHZhOworCXZtX3BhZGRyX3QgcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKworCXZhID0g TUlQU19QSFlTX1RPX1hLUEhZU19DQUNIRUQocGh5cyk7CisJYnplcm8oKGNhZGRyX3QpdmEsIFBB R0VfU0laRSk7CisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7Cit9CisK Ky8qCisgKglwbWFwX2NvcHlfcGFnZSBjb3BpZXMgdGhlIHNwZWNpZmllZCAobWFjaGluZSBpbmRl cGVuZGVudCkKKyAqCXBhZ2UgYnkgbWFwcGluZyB0aGUgcGFnZSBpbnRvIHZpcnR1YWwgbWVtb3J5 IGFuZCB1c2luZworICoJYmNvcHkgdG8gY29weSB0aGUgcGFnZSwgb25lIG1hY2hpbmUgZGVwZW5k ZW50IHBhZ2UgYXQgYQorICoJdGltZS4KKyAqCisgKiAJVXNlIFhLUEhZUyBmb3IgNjQgYml0LCBh bmQgS1NFRzAgd2hlcmUgcG9zc2libGUgZm9yIDMyIGJpdC4KKyAqLwordm9pZAorcG1hcF9jb3B5 X3BhZ2Uodm1fcGFnZV90IHNyYywgdm1fcGFnZV90IGRzdCkKK3sKKwl2bV9vZmZzZXRfdCB2YV9z cmMsIHZhX2RzdDsKKwl2bV9wYWRkcl90IHBoeV9zcmMgPSBWTV9QQUdFX1RPX1BIWVMoc3JjKTsK Kwl2bV9wYWRkcl90IHBoeV9kc3QgPSBWTV9QQUdFX1RPX1BIWVMoZHN0KTsKKworCXBtYXBfZmx1 c2hfcHZjYWNoZShzcmMpOworCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KE1JUFNfUEhZ U19UT19YS1BIWVNfQ0FDSEVEKHBoeV9kc3QpLCBQQUdFX1NJWkUpOworCXZhX3NyYyA9IE1JUFNf UEhZU19UT19YS1BIWVNfQ0FDSEVEKHBoeV9zcmMpOworCXZhX2RzdCA9IE1JUFNfUEhZU19UT19Y S1BIWVNfQ0FDSEVEKHBoeV9kc3QpOworCWJjb3B5KChjYWRkcl90KXZhX3NyYywgKGNhZGRyX3Qp dmFfZHN0LCBQQUdFX1NJWkUpOworCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlKHZhX2RzdCwgUEFH RV9TSVpFKTsKK30KKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcG1hcCdzIHB2IGlzIG9u ZSBvZiB0aGUgZmlyc3QKKyAqIDE2IHB2cyBsaW5rZWQgdG8gZnJvbSB0aGlzIHBhZ2UuICBUaGlz IGNvdW50IG1heQorICogYmUgY2hhbmdlZCB1cHdhcmRzIG9yIGRvd253YXJkcyBpbiB0aGUgZnV0 dXJlOyBpdAorICogaXMgb25seSBuZWNlc3NhcnkgdGhhdCB0cnVlIGJlIHJldHVybmVkIGZvciBh IHNtYWxsCisgKiBzdWJzZXQgb2YgcG1hcHMgZm9yIHByb3BlciBwYWdlIGFnaW5nLgorICovCiti b29sZWFuX3QKK3BtYXBfcGFnZV9leGlzdHNfcXVpY2socG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBt KQoreworCXB2X2VudHJ5X3QgcHY7CisJaW50IGxvb3BzID0gMDsKKwlib29sZWFuX3QgcnY7CisK KwlLQVNTRVJUKChtLT5mbGFncyAmIChQR19GSUNUSVRJT1VTIHwgUEdfVU5NQU5BR0VEKSkgPT0g MCwKKwkgICAgKCJwbWFwX3BhZ2VfZXhpc3RzX3F1aWNrOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2Vk IiwgbSkpOworCXJ2ID0gRkFMU0U7CisJdm1fcGFnZV9sb2NrX3F1ZXVlcygpOworCVRBSUxRX0ZP UkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9saXN0KSB7CisJCWlmIChwdi0+cHZfcG1hcCA9 PSBwbWFwKSB7CisJCQlydiA9IFRSVUU7CisJCQlicmVhazsKKwkJfQorCQlsb29wcysrOworCQlp ZiAobG9vcHMgPj0gMTYpCisJCQlicmVhazsKKwl9CisJdm1fcGFnZV91bmxvY2tfcXVldWVzKCk7 CisJcmV0dXJuIChydik7Cit9CisKKy8qCisgKiBSZW1vdmUgYWxsIHBhZ2VzIGZyb20gc3BlY2lm aWVkIGFkZHJlc3Mgc3BhY2UKKyAqIHRoaXMgYWlkcyBwcm9jZXNzIGV4aXQgc3BlZWRzLiAgQWxz bywgdGhpcyBjb2RlCisgKiBpcyBzcGVjaWFsIGNhc2VkIGZvciBjdXJyZW50IHByb2Nlc3Mgb25s eSwgYnV0CisgKiBjYW4gaGF2ZSB0aGUgbW9yZSBnZW5lcmljIChhbmQgc2xpZ2h0bHkgc2xvd2Vy KQorICogbW9kZSBlbmFibGVkLiAgVGhpcyBpcyBtdWNoIGZhc3RlciB0aGFuIHBtYXBfcmVtb3Zl CisgKiBpbiB0aGUgY2FzZSBvZiBydW5uaW5nIGRvd24gYW4gZW50aXJlIGFkZHJlc3Mgc3BhY2Uu CisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2VzKHBtYXBfdCBwbWFwKQoreworCXB0X2VudHJ5 X3QgKnB0ZSwgdHB0ZTsKKwlwdl9lbnRyeV90IHB2LCBucHY7CisJdm1fcGFnZV90IG07CisKKwlp ZiAocG1hcCAhPSB2bXNwYWNlX3BtYXAoY3VydGhyZWFkLT50ZF9wcm9jLT5wX3Ztc3BhY2UpKSB7 CisJCXByaW50Zigid2FybmluZzogcG1hcF9yZW1vdmVfcGFnZXMgY2FsbGVkIHdpdGggbm9uLWN1 cnJlbnQgcG1hcFxuIik7CisJCXJldHVybjsKKwl9CisJdm1fcGFnZV9sb2NrX3F1ZXVlcygpOwor CVBNQVBfTE9DSyhwbWFwKTsKKwlzY2hlZF9waW4oKTsKKwkvL1hYWCBuZWVkIHRvIGJlIFRBSUxR X0ZPUkVBQ0hfU0FGRSA/CisJZm9yIChwdiA9IFRBSUxRX0ZJUlNUKCZwbWFwLT5wbV9wdmxpc3Qp OyBwdjsgcHYgPSBucHYpIHsKKwkJcHRlID0gcG1hcF9wdGUocHYtPnB2X3BtYXAsIHB2LT5wdl92 YSk7CisJCWlmIChwdGUgPT1OVUxMKQorCQkJcHJpbnRmKCJwdGUgZmFpbCAtICVwIHZhICVwXG4i LAorCQkJCQlwdi0+cHZfcG1hcCwgKHZvaWQgKilwdi0+cHZfdmEpOworCQlpZiAoIXB0ZV90ZXN0 KHB0ZSwgUFRFX1YpKQorCQkJcGFuaWMoInBtYXBfcmVtb3ZlX3BhZ2VzOiBwYWdlIG9uIHBtX3B2 bGlzdCBoYXMgbm8gcHRlXG4iKTsKKwkJdHB0ZSA9ICpwdGU7CisKKy8qCisgKiBXZSBjYW5ub3Qg cmVtb3ZlIHdpcmVkIHBhZ2VzIGZyb20gYSBwcm9jZXNzJyBtYXBwaW5nIGF0IHRoaXMgdGltZQor ICovCisJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX1cpKSB7CisJCQlucHYgPSBUQUlMUV9ORVhU KHB2LCBwdl9wbGlzdCk7CisJCQljb250aW51ZTsKKwkJfQorCQkqcHRlID0gaXNfa2VybmVsX3Bt YXAocG1hcCkgPyBQVEVfRyA6IDA7CisKKwkJbSA9IFBIWVNfVE9fVk1fUEFHRShUTEJMT19QVEVf VE9fUEEodHB0ZSkpOworCQlLQVNTRVJUKG0gIT0gTlVMTCwKKwkJICAgICgicG1hcF9yZW1vdmVf cGFnZXM6IGJhZCB0cHRlICV4IiwgdHB0ZSkpOworCisJCXB2LT5wdl9wbWFwLT5wbV9zdGF0cy5y ZXNpZGVudF9jb3VudC0tOworCisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgdm1fcGFnZV90IGNsZWFu IGFuZCByZWZlcmVuY2UgYml0cy4KKwkJICovCisJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX0Qp KSB7CisJCQl2bV9wYWdlX2RpcnR5KG0pOworCQl9CisJCW5wdiA9IFRBSUxRX05FWFQocHYsIHB2 X3BsaXN0KTsKKwkJVEFJTFFfUkVNT1ZFKCZwdi0+cHZfcG1hcC0+cG1fcHZsaXN0LCBwdiwgcHZf cGxpc3QpOworCisJCW0tPm1kLnB2X2xpc3RfY291bnQtLTsKKwkJVEFJTFFfUkVNT1ZFKCZtLT5t ZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCWlmIChUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlz dCkgPT0gTlVMTCkgeworCQkJdm1fcGFnZV9mbGFnX2NsZWFyKG0sIFBHX1dSSVRFQUJMRSk7CisJ CX0KKwkJcG1hcF91bnVzZV9wdChwdi0+cHZfcG1hcCwgcHYtPnB2X3ZhLCBwdi0+cHZfcHRlbSk7 CisJCWZyZWVfcHZfZW50cnkocHYpOworCX0KKwlzY2hlZF91bnBpbigpOworCXBtYXBfaW52YWxp ZGF0ZV9hbGwocG1hcCk7CisJUE1BUF9VTkxPQ0socG1hcCk7CisJdm1fcGFnZV91bmxvY2tfcXVl dWVzKCk7Cit9CisKKy8qCisgKiBwbWFwX3Rlc3RiaXQgdGVzdHMgYml0cyBpbiBwdGUncworICog bm90ZSB0aGF0IHRoZSB0ZXN0Yml0L2NoYW5nZWJpdCByb3V0aW5lcyBhcmUgaW5saW5lLAorICog YW5kIGEgbG90IG9mIHRoaW5ncyBjb21waWxlLXRpbWUgZXZhbHVhdGUuCisgKi8KK3N0YXRpYyBi b29sZWFuX3QKK3BtYXBfdGVzdGJpdCh2bV9wYWdlX3QgbSwgaW50IGJpdCkKK3sKKwlwdl9lbnRy eV90IHB2OworCXB0X2VudHJ5X3QgKnB0ZTsKKwlib29sZWFuX3QgcnYgPSBGQUxTRTsKKworCWlm IChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpCisJCXJldHVybiBydjsKKworCWlmIChUQUlMUV9G SVJTVCgmbS0+bWQucHZfbGlzdCkgPT0gTlVMTCkKKwkJcmV0dXJuIHJ2OworCisJbXR4X2Fzc2Vy dCgmdm1fcGFnZV9xdWV1ZV9tdHgsIE1BX09XTkVEKTsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+ bWQucHZfbGlzdCwgcHZfbGlzdCkgeworI2lmIGRlZmluZWQoUE1BUF9ESUFHTk9TVElDKQorCQlp ZiAoIXB2LT5wdl9wbWFwKSB7CisJCQlwcmludGYoIk51bGwgcG1hcCAodGIpIGF0IHZhOiAweCV4 XG4iLCBwdi0+cHZfdmEpOworCQkJY29udGludWU7CisJCX0KKyNlbmRpZgorCQlQTUFQX0xPQ0so cHYtPnB2X3BtYXApOworCQlwdGUgPSBwbWFwX3B0ZShwdi0+cHZfcG1hcCwgcHYtPnB2X3ZhKTsK KwkJcnYgPSBwdGVfdGVzdChwdGUsIGJpdCk7CisJCVBNQVBfVU5MT0NLKHB2LT5wdl9wbWFwKTsK KwkJaWYgKHJ2KQorCQkJYnJlYWs7CisJfQorCXJldHVybiAocnYpOworfQorCisvKgorICogdGhp cyByb3V0aW5lIGlzIHVzZWQgdG8gY2xlYXIgZGlydHkgYml0cyBpbiBwdGVzCisgKi8KK3N0YXRp YyBfX2lubGluZSB2b2lkCitwbWFwX2NoYW5nZWJpdCh2bV9wYWdlX3QgbSwgaW50IGJpdCwgYm9v bGVhbl90IHNldGVtKQoreworCXB2X2VudHJ5X3QgcHY7CisJcHRfZW50cnlfdCAqcHRlOworCisJ aWYgKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykKKwkJcmV0dXJuOworCisJbXR4X2Fzc2VydCgm dm1fcGFnZV9xdWV1ZV9tdHgsIE1BX09XTkVEKTsKKwkvKgorCSAqIExvb3Agb3ZlciBhbGwgY3Vy cmVudCBtYXBwaW5ncyBzZXR0aW5nL2NsZWFyaW5nIGFzIGFwcHJvcG9zIElmCisJICogc2V0dGlu ZyBSTyBkbyB3ZSBuZWVkIHRvIGNsZWFyIHRoZSBWQUM/CisJICovCisJVEFJTFFfRk9SRUFDSChw diwgJm0tPm1kLnB2X2xpc3QsIHB2X2xpc3QpIHsKKyNpZiBkZWZpbmVkKFBNQVBfRElBR05PU1RJ QykKKwkJaWYgKCFwdi0+cHZfcG1hcCkgeworCQkJcHJpbnRmKCJOdWxsIHBtYXAgKGNiKSBhdCB2 YTogMHgleFxuIiwgcHYtPnB2X3ZhKTsKKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYKKworCQlQ TUFQX0xPQ0socHYtPnB2X3BtYXApOworCQlwdGUgPSBwbWFwX3B0ZShwdi0+cHZfcG1hcCwgcHYt PnB2X3ZhKTsKKwkJaWYgKHNldGVtKSB7CisJCQkqcHRlIHw9IGJpdDsKKwkJCXBtYXBfdXBkYXRl X3BhZ2UocHYtPnB2X3BtYXAsIHB2LT5wdl92YSwgKnB0ZSk7CisJCX0gZWxzZSB7CisJCQlwdF9l bnRyeV90ICBwYml0cyA9ICpwdGU7CisKKwkJCWlmIChwYml0cyAmIGJpdCkgeworCQkJCWlmIChi aXQgPT0gUFRFX0QpIHsKKwkJCQkJaWYgKHBiaXRzICYgUFRFX0QpIHsKKwkJCQkJCXZtX3BhZ2Vf ZGlydHkobSk7CisJCQkJCX0KKwkJCQkJKnB0ZSA9IChwYml0cyAmIH5QVEVfRCkgfCBQVEVfUk87 CisJCQkJfSBlbHNlIHsKKwkJCQkJKnB0ZSA9IHBiaXRzICYgfmJpdDsKKwkJCQl9CisJCQkJcG1h cF91cGRhdGVfcGFnZShwdi0+cHZfcG1hcCwgcHYtPnB2X3ZhLCAqcHRlKTsKKwkJCX0KKwkJfQor CQlQTUFQX1VOTE9DSyhwdi0+cHZfcG1hcCk7CisJfQorCWlmICghc2V0ZW0gJiYgYml0ID09IFBU RV9EKQorCQl2bV9wYWdlX2ZsYWdfY2xlYXIobSwgUEdfV1JJVEVBQkxFKTsKK30KKworLyoKKyAq CXBtYXBfcGFnZV93aXJlZF9tYXBwaW5nczoKKyAqCisgKglSZXR1cm4gdGhlIG51bWJlciBvZiBt YW5hZ2VkIG1hcHBpbmdzIHRvIHRoZSBnaXZlbiBwaHlzaWNhbCBwYWdlCisgKgl0aGF0IGFyZSB3 aXJlZC4KKyAqLworaW50CitwbWFwX3BhZ2Vfd2lyZWRfbWFwcGluZ3Modm1fcGFnZV90IG0pCit7 CisJcHZfZW50cnlfdCBwdjsKKwlpbnQgY291bnQ7CisKKwljb3VudCA9IDA7CisJaWYgKChtLT5m bGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDApCisJCXJldHVybiAoY291bnQpOworCXZtX3BhZ2Vf bG9ja19xdWV1ZXMoKTsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbGlz dCkKKwkgICAgaWYgKHB2LT5wdl93aXJlZCkKKwkJY291bnQrKzsKKwl2bV9wYWdlX3VubG9ja19x dWV1ZXMoKTsKKwlyZXR1cm4gKGNvdW50KTsKK30KKworLyoKKyAqIENsZWFyIHRoZSB3cml0ZSBh bmQgbW9kaWZpZWQgYml0cyBpbiBlYWNoIG9mIHRoZSBnaXZlbiBwYWdlJ3MgbWFwcGluZ3MuCisg Ki8KK3ZvaWQKK3BtYXBfcmVtb3ZlX3dyaXRlKHZtX3BhZ2VfdCBtKQoreworCXB2X2VudHJ5X3Qg cHYsIG5wdjsKKwl2bV9vZmZzZXRfdCB2YTsKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlLQVNTRVJU KChtLT5mbGFncyAmIChQR19GSUNUSVRJT1VTIHwgUEdfVU5NQU5BR0VEKSkgPT0gMCwKKwkgICAg KCJwbWFwX3JlbW92ZV93cml0ZTogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKworCS8q CisJICogSWYgdGhlIHBhZ2UgaXMgbm90IFZQT19CVVNZLCB0aGVuIFBHX1dSSVRFQUJMRSBjYW5u b3QgYmUgc2V0IGJ5CisJICogYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhlIG9iamVjdCBpcyBsb2Nr ZWQuICBUaHVzLCBpZiBQR19XUklURUFCTEUKKwkgKiBpcyBjbGVhciwgbm8gcGFnZSB0YWJsZSBl bnRyaWVzIG5lZWQgdXBkYXRpbmcuCisJICovCisJVk1fT0JKRUNUX0xPQ0tfQVNTRVJUKG0tPm9i amVjdCwgTUFfT1dORUQpOworCWlmICgobS0+b2ZsYWdzICYgVlBPX0JVU1kpID09IDAgJiYKKwkg ICAgKG0tPmZsYWdzICYgUEdfV1JJVEVBQkxFKSA9PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAq IExvb3Agb3ZlciBhbGwgY3VycmVudCBtYXBwaW5ncyBzZXR0aW5nL2NsZWFyaW5nIGFzIGFwcHJv cG9zLgorCSAqLworCXZtX3BhZ2VfbG9ja19xdWV1ZXMoKTsKKwlmb3IgKHB2ID0gVEFJTFFfRklS U1QoJm0tPm1kLnB2X2xpc3QpOyBwdjsgcHYgPSBucHYpIHsKKwkJbnB2ID0gVEFJTFFfTkVYVChw diwgcHZfcGxpc3QpOworCQlwdGUgPSBwbWFwX3B0ZShwdi0+cHZfcG1hcCwgcHYtPnB2X3ZhKTsK KwkJaWYgKHB0ZSA9PSBOVUxMIHx8ICFwdGVfdGVzdChwdGUsIFBURV9WKSkKKwkJCXBhbmljKCJw YWdlIG9uIHBtX3B2bGlzdCBoYXMgbm8gcHRlXG4iKTsKKworCQl2YSA9IHB2LT5wdl92YTsKKwkJ cG1hcF9wcm90ZWN0KHB2LT5wdl9wbWFwLCB2YSwgdmEgKyBQQUdFX1NJWkUsCisJCSAgICBWTV9Q Uk9UX1JFQUQgfCBWTV9QUk9UX0VYRUNVVEUpOworCX0KKwl2bV9wYWdlX2ZsYWdfY2xlYXIobSwg UEdfV1JJVEVBQkxFKTsKKwl2bV9wYWdlX3VubG9ja19xdWV1ZXMoKTsKK30KKworLyoKKyAqCXBt YXBfdHNfcmVmZXJlbmNlZDoKKyAqCisgKglSZXR1cm4gdGhlIGNvdW50IG9mIHJlZmVyZW5jZSBi aXRzIGZvciBhIHBhZ2UsIGNsZWFyaW5nIGFsbCBvZiB0aGVtLgorICovCitpbnQKK3BtYXBfdHNf cmVmZXJlbmNlZCh2bV9wYWdlX3QgbSkKK3sKKworCUtBU1NFUlQoKG0tPmZsYWdzICYgKFBHX0ZJ Q1RJVElPVVMgfCBQR19VTk1BTkFHRUQpKSA9PSAwLAorCSAgICAoInBtYXBfdHNfcmVmZXJlbmNl ZDogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKwlpZiAobS0+bWQucHZfZmxhZ3MgJiBQ Vl9UQUJMRV9SRUYpIHsKKwkJdm1fcGFnZV9sb2NrX3F1ZXVlcygpOworCQltLT5tZC5wdl9mbGFn cyAmPSB+UFZfVEFCTEVfUkVGOworCQl2bV9wYWdlX3VubG9ja19xdWV1ZXMoKTsKKwkJcmV0dXJu ICgxKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqCXBtYXBfaXNfbW9kaWZpZWQ6Cisg KgorICoJUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcGFnZSB3 YXMgbW9kaWZpZWQKKyAqCWluIGFueSBwaHlzaWNhbCBtYXBzLgorICovCitib29sZWFuX3QKK3Bt YXBfaXNfbW9kaWZpZWQodm1fcGFnZV90IG0pCit7CisJYm9vbGVhbl90IHJ2OworCisJS0FTU0VS VCgobS0+ZmxhZ3MgJiAoUEdfRklDVElUSU9VUyB8IFBHX1VOTUFOQUdFRCkpID09IDAsCisJICAg ICgicG1hcF9pc19tb2RpZmllZDogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKworCS8q CisJICogSWYgdGhlIHBhZ2UgaXMgbm90IFZQT19CVVNZLCB0aGVuIFBHX1dSSVRFQUJMRSBjYW5u b3QgYmUKKwkgKiBjb25jdXJyZW50bHkgc2V0IHdoaWxlIHRoZSBvYmplY3QgaXMgbG9ja2VkLiAg VGh1cywgaWYgUEdfV1JJVEVBQkxFCisJICogaXMgY2xlYXIsIG5vIFBURXMgY2FuIGhhdmUgUFRF X0Qgc2V0LgorCSAqLworCVZNX09CSkVDVF9MT0NLX0FTU0VSVChtLT5vYmplY3QsIE1BX09XTkVE KTsKKwlpZiAoKG0tPm9mbGFncyAmIFZQT19CVVNZKSA9PSAwICYmCisJICAgIChtLT5mbGFncyAm IFBHX1dSSVRFQUJMRSkgPT0gMCkKKwkJcmV0dXJuIChGQUxTRSk7CisJdm1fcGFnZV9sb2NrX3F1 ZXVlcygpOworCWlmIChtLT5tZC5wdl9mbGFncyAmIFBWX1RBQkxFX01PRCkKKwkJcnYgPSBUUlVF OworCWVsc2UKKwkJcnYgPSBwbWFwX3Rlc3RiaXQobSwgUFRFX0QpOworCXZtX3BhZ2VfdW5sb2Nr X3F1ZXVlcygpOworCXJldHVybiAocnYpOworfQorCisvKiBOL0MgKi8KKworLyoKKyAqCXBtYXBf aXNfcHJlZmF1bHRhYmxlOgorICoKKyAqCVJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lm aWVkIHZpcnR1YWwgYWRkcmVzcyBpcyBlbGdpYmxlCisgKglmb3IgcHJlZmF1bHQuCisgKi8KK2Jv b2xlYW5fdAorcG1hcF9pc19wcmVmYXVsdGFibGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFk ZHIpCit7CisJcHRfZW50cnlfdCAqcHRlOworCWJvb2xlYW5fdCBydjsKKworCXJ2ID0gRkFMU0U7 CisJUE1BUF9MT0NLKHBtYXApOworCWlmIChwbWFwX3NlZ21hcChwbWFwLCBhZGRyKSAhPSBOVUxM KSB7CisJCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIGFkZHIpOworCQlydiA9ICgqcHRlID09IDApOwor CX0KKwlQTUFQX1VOTE9DSyhwbWFwKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyoKKyAqCUNsZWFy IHRoZSBtb2RpZnkgYml0cyBvbiB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIHBhZ2UuCisgKi8KK3Zv aWQKK3BtYXBfY2xlYXJfbW9kaWZ5KHZtX3BhZ2VfdCBtKQoreworCisJS0FTU0VSVCgobS0+Zmxh Z3MgJiAoUEdfRklDVElUSU9VUyB8IFBHX1VOTUFOQUdFRCkpID09IDAsCisJICAgICgicG1hcF9j bGVhcl9tb2RpZnk6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisJVk1fT0JKRUNUX0xP Q0tfQVNTRVJUKG0tPm9iamVjdCwgTUFfT1dORUQpOworCUtBU1NFUlQoKG0tPm9mbGFncyAmIFZQ T19CVVNZKSA9PSAwLAorCSAgICAoInBtYXBfY2xlYXJfbW9kaWZ5OiBwYWdlICVwIGlzIGJ1c3ki LCBtKSk7CisKKwkvKgorCSAqIElmIHRoZSBwYWdlIGlzIG5vdCBQR19XUklURUFCTEUsIHRoZW4g bm8gUFRFcyBjYW4gaGF2ZSBQVEVfRCBzZXQuCisJICogSWYgdGhlIG9iamVjdCBjb250YWluaW5n IHRoZSBwYWdlIGlzIGxvY2tlZCBhbmQgdGhlIHBhZ2UgaXMgbm90CisJICogVlBPX0JVU1ksIHRo ZW4gUEdfV1JJVEVBQkxFIGNhbm5vdCBiZSBjb25jdXJyZW50bHkgc2V0LgorCSAqLworCWlmICgo bS0+ZmxhZ3MgJiBQR19XUklURUFCTEUpID09IDApCisJCXJldHVybjsKKwl2bV9wYWdlX2xvY2tf cXVldWVzKCk7CisJaWYgKG0tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfTU9EKSB7CisJCXBtYXBf Y2hhbmdlYml0KG0sIFBURV9ELCBGQUxTRSk7CisJCW0tPm1kLnB2X2ZsYWdzICY9IH5QVl9UQUJM RV9NT0Q7CisJfQorCXZtX3BhZ2VfdW5sb2NrX3F1ZXVlcygpOworfQorCisvKgorICoJcG1hcF9p c19yZWZlcmVuY2VkOgorICoKKyAqCVJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVk IHBoeXNpY2FsIHBhZ2Ugd2FzIHJlZmVyZW5jZWQKKyAqCWluIGFueSBwaHlzaWNhbCBtYXBzLgor ICovCitib29sZWFuX3QKK3BtYXBfaXNfcmVmZXJlbmNlZCh2bV9wYWdlX3QgbSkKK3sKKworCUtB U1NFUlQoKG0tPmZsYWdzICYgKFBHX0ZJQ1RJVElPVVMgfCBQR19VTk1BTkFHRUQpKSA9PSAwLAor CSAgICAoInBtYXBfaXNfcmVmZXJlbmNlZDogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsK KwlyZXR1cm4gKChtLT5tZC5wdl9mbGFncyAmIFBWX1RBQkxFX1JFRikgIT0gMCk7Cit9CisKKy8q CisgKglwbWFwX2NsZWFyX3JlZmVyZW5jZToKKyAqCisgKglDbGVhciB0aGUgcmVmZXJlbmNlIGJp dCBvbiB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIHBhZ2UuCisgKi8KK3ZvaWQKK3BtYXBfY2xlYXJf cmVmZXJlbmNlKHZtX3BhZ2VfdCBtKQoreworCisJS0FTU0VSVCgobS0+ZmxhZ3MgJiAoUEdfRklD VElUSU9VUyB8IFBHX1VOTUFOQUdFRCkpID09IDAsCisJICAgICgicG1hcF9jbGVhcl9yZWZlcmVu Y2U6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisJdm1fcGFnZV9sb2NrX3F1ZXVlcygp OworCWlmIChtLT5tZC5wdl9mbGFncyAmIFBWX1RBQkxFX1JFRikgeworCQltLT5tZC5wdl9mbGFn cyAmPSB+UFZfVEFCTEVfUkVGOworCX0KKwl2bV9wYWdlX3VubG9ja19xdWV1ZXMoKTsKK30KKwor LyoKKyAqIE1pc2NlbGxhbmVvdXMgc3VwcG9ydCByb3V0aW5lcyBmb2xsb3cKKyAqLworCisvKgor ICogTWFwIGEgc2V0IG9mIHBoeXNpY2FsIG1lbW9yeSBwYWdlcyBpbnRvIHRoZSBrZXJuZWwgdmly dHVhbAorICogYWRkcmVzcyBzcGFjZS4gUmV0dXJuIGEgcG9pbnRlciB0byB3aGVyZSBpdCBpcyBt YXBwZWQuIFRoaXMKKyAqIHJvdXRpbmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgbWFwcGlu ZyBkZXZpY2UgbWVtb3J5LAorICogTk9UIHJlYWwgbWVtb3J5LgorICovCisKKy8qCisgKiBNYXAg YSBzZXQgb2YgcGh5c2ljYWwgbWVtb3J5IHBhZ2VzIGludG8gdGhlIGtlcm5lbCB2aXJ0dWFsCisg KiBhZGRyZXNzIHNwYWNlLiBSZXR1cm4gYSBwb2ludGVyIHRvIHdoZXJlIGl0IGlzIG1hcHBlZC4g VGhpcworICogcm91dGluZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBtYXBwaW5nIGRldmlj ZSBtZW1vcnksCisgKiBOT1QgcmVhbCBtZW1vcnkuCisgKgorICogVXNlIFhLUEhZUyB1bmNhY2hl ZCBmb3IgNjQgYml0LCBhbmQgS1NFRzEgd2hlcmUgcG9zc2libGUgZm9yIDMyIGJpdC4KKyAqLwor dm9pZCAqCitwbWFwX21hcGRldih2bV9vZmZzZXRfdCBwYSwgdm1fc2l6ZV90IHNpemUpCit7CisJ cmV0dXJuICgodm9pZCAqKU1JUFNfUEhZU19UT19YS1BIWVNfVU5DQUNIRUQocGEpKTsKK30KKwor dm9pZAorcG1hcF91bm1hcGRldih2bV9vZmZzZXRfdCB2YSwgdm1fc2l6ZV90IHNpemUpCit7Cit9 CisKKy8qCisgKiBwZXJmb3JtIHRoZSBwbWFwIHdvcmsgZm9yIG1pbmNvcmUKKyAqLworaW50Citw bWFwX21pbmNvcmUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFkZHIsIHZtX3BhZGRyX3QgKmxv Y2tlZF9wYSkKK3sKKwlwdF9lbnRyeV90ICpwdGVwLCBwdGU7CisJdm1fb2Zmc2V0X3QgcGE7CisJ dm1fcGFnZV90IG07CisJaW50IHZhbDsKKwlib29sZWFuX3QgbWFuYWdlZDsKKworCVBNQVBfTE9D SyhwbWFwKTsKK3JldHJ5OgorCXB0ZXAgPSBwbWFwX3B0ZShwbWFwLCBhZGRyKTsKKwlwdGUgPSAo cHRlcCAhPSBOVUxMKSA/ICpwdGVwIDogMDsKKwlpZiAoIXB0ZV90ZXN0KCZwdGUsIFBURV9WKSkg eworCQl2YWwgPSAwOworCQlnb3RvIG91dDsKKwl9CisJdmFsID0gTUlOQ09SRV9JTkNPUkU7CisJ aWYgKHB0ZV90ZXN0KCZwdGUsIFBURV9EKSkKKwkJdmFsIHw9IE1JTkNPUkVfTU9ESUZJRUQgfCBN SU5DT1JFX01PRElGSUVEX09USEVSOworCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0ZSk7CisJbWFu YWdlZCA9IHBhZ2VfaXNfbWFuYWdlZChwYSk7CisJaWYgKG1hbmFnZWQpIHsKKwkJLyoKKwkJICog VGhpcyBtYXkgZmFsc2VseSByZXBvcnQgdGhlIGdpdmVuIGFkZHJlc3MgYXMKKwkJICogTUlOQ09S RV9SRUZFUkVOQ0VELiAgVW5mb3J0dW5hdGVseSwgZHVlIHRvIHRoZSBsYWNrIG9mCisJCSAqIHBl ci1QVEUgcmVmZXJlbmNlIGluZm9ybWF0aW9uLCBpdCBpcyBpbXBvc3NpYmxlIHRvCisJCSAqIGRl dGVybWluZSBpZiB0aGUgYWRkcmVzcyBpcyBNSU5DT1JFX1JFRkVSRU5DRUQuICAKKwkJICovCisJ CW0gPSBQSFlTX1RPX1ZNX1BBR0UocGEpOworCQlpZiAoKG0tPmZsYWdzICYgUEdfUkVGRVJFTkNF RCkgIT0gMCkKKwkJCXZhbCB8PSBNSU5DT1JFX1JFRkVSRU5DRUQgfCBNSU5DT1JFX1JFRkVSRU5D RURfT1RIRVI7CisJfQorCWlmICgodmFsICYgKE1JTkNPUkVfTU9ESUZJRURfT1RIRVIgfCBNSU5D T1JFX1JFRkVSRU5DRURfT1RIRVIpKSAhPQorCSAgICAoTUlOQ09SRV9NT0RJRklFRF9PVEhFUiB8 IE1JTkNPUkVfUkVGRVJFTkNFRF9PVEhFUikgJiYgbWFuYWdlZCkgeworCQkvKiBFbnN1cmUgdGhh dCAiUEhZU19UT19WTV9QQUdFKHBhKS0+b2JqZWN0IiBkb2Vzbid0IGNoYW5nZS4gKi8KKwkJaWYg KHZtX3BhZ2VfcGFfdHJ5cmVsb2NrKHBtYXAsIHBhLCBsb2NrZWRfcGEpKQorCQkJZ290byByZXRy eTsKKwl9IGVsc2UKK291dDoKKwkJUEFfVU5MT0NLX0NPTkQoKmxvY2tlZF9wYSk7CisJUE1BUF9V TkxPQ0socG1hcCk7CisJcmV0dXJuICh2YWwpOworfQorCit2b2lkCitwbWFwX2FjdGl2YXRlKHN0 cnVjdCB0aHJlYWQgKnRkKQoreworCXBtYXBfdCBwbWFwLCBvbGRwbWFwOworCXN0cnVjdCBwcm9j ICpwID0gdGQtPnRkX3Byb2M7CisKKwljcml0aWNhbF9lbnRlcigpOworCisJcG1hcCA9IHZtc3Bh Y2VfcG1hcChwLT5wX3Ztc3BhY2UpOworCW9sZHBtYXAgPSBQQ1BVX0dFVChjdXJwbWFwKTsKKwor CWlmIChvbGRwbWFwKQorCQlhdG9taWNfY2xlYXJfMzIoJm9sZHBtYXAtPnBtX2FjdGl2ZSwgUENQ VV9HRVQoY3B1bWFzaykpOworCWF0b21pY19zZXRfMzIoJnBtYXAtPnBtX2FjdGl2ZSwgUENQVV9H RVQoY3B1bWFzaykpOworCXBtYXBfYXNpZF9hbGxvYyhwbWFwKTsKKwlpZiAodGQgPT0gY3VydGhy ZWFkKSB7CisJCVBDUFVfU0VUKHNlZ2Jhc2UsIHBtYXAtPnBtX3NlZ3RhYik7CisJCW1pcHNfd3Jf ZW50cnloaShwbWFwLT5wbV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uYXNpZCk7CisJfQorCisJUENQ VV9TRVQoY3VycG1hcCwgcG1hcCk7CisJY3JpdGljYWxfZXhpdCgpOworfQorCit2b2lkCitwbWFw X3N5bmNfaWNhY2hlKHBtYXBfdCBwbSwgdm1fb2Zmc2V0X3QgdmEsIHZtX3NpemVfdCBzeikKK3sK K30KKworLyoKKyAqCUluY3JlYXNlIHRoZSBzdGFydGluZyB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhl IGdpdmVuIG1hcHBpbmcgaWYgYQorICoJZGlmZmVyZW50IGFsaWdubWVudCBtaWdodCByZXN1bHQg aW4gbW9yZSBzdXBlcnBhZ2UgbWFwcGluZ3MuCisgKi8KK3ZvaWQKK3BtYXBfYWxpZ25fc3VwZXJw YWdlKHZtX29iamVjdF90IG9iamVjdCwgdm1fb29mZnNldF90IG9mZnNldCwKKyAgICB2bV9vZmZz ZXRfdCAqYWRkciwgdm1fc2l6ZV90IHNpemUpCit7CisJdm1fb2Zmc2V0X3Qgc3VwZXJwYWdlX29m ZnNldDsKKworCWlmIChzaXplIDwgTkJTRUcpCisJCXJldHVybjsKKwlpZiAob2JqZWN0ICE9IE5V TEwgJiYgKG9iamVjdC0+ZmxhZ3MgJiBPQkpfQ09MT1JFRCkgIT0gMCkKKwkJb2Zmc2V0ICs9IHB0 b2Eob2JqZWN0LT5wZ19jb2xvcik7CisJc3VwZXJwYWdlX29mZnNldCA9IG9mZnNldCAmIFNFR01B U0s7CisJaWYgKHNpemUgLSAoKE5CU0VHIC0gc3VwZXJwYWdlX29mZnNldCkgJiBTRUdNQVNLKSA8 IE5CU0VHIHx8CisJICAgICgqYWRkciAmIFNFR01BU0spID09IHN1cGVycGFnZV9vZmZzZXQpCisJ CXJldHVybjsKKwlpZiAoKCphZGRyICYgU0VHTUFTSykgPCBzdXBlcnBhZ2Vfb2Zmc2V0KQorCQkq YWRkciA9ICgqYWRkciAmIH5TRUdNQVNLKSArIHN1cGVycGFnZV9vZmZzZXQ7CisJZWxzZQorCQkq YWRkciA9ICgoKmFkZHIgKyBTRUdNQVNLKSAmIH5TRUdNQVNLKSArIHN1cGVycGFnZV9vZmZzZXQ7 Cit9CisKKy8qCisgKiAJSW5jcmVhc2UgdGhlIHN0YXJ0aW5nIHZpcnR1YWwgYWRkcmVzcyBvZiB0 aGUgZ2l2ZW4gbWFwcGluZyBzbworICogCXRoYXQgaXQgaXMgYWxpZ25lZCB0byBub3QgYmUgdGhl IHNlY29uZCBwYWdlIGluIGEgVExCIGVudHJ5LgorICogCVRoaXMgcm91dGluZSBhc3N1bWVzIHRo YXQgdGhlIGxlbmd0aCBpcyBhcHByb3ByaWF0ZWx5LXNpemVkIHNvCisgKiAJdGhhdCB0aGUgYWxs b2NhdGlvbiBkb2VzIG5vdCBzaGFyZSBhIFRMQiBlbnRyeSBhdCBhbGwgaWYgcmVxdWlyZWQuCisg Ki8KK3ZvaWQKK3BtYXBfYWxpZ25fdGxiKHZtX29mZnNldF90ICphZGRyKQoreworCWlmICgoKmFk ZHIgJiBQQUdFX1NJWkUpID09IDApCisJCXJldHVybjsKKwkqYWRkciArPSBQQUdFX1NJWkU7CisJ cmV0dXJuOworfQorCitEQl9TSE9XX0NPTU1BTkQocHRhYmxlLCBkZGJfcGlkX2R1bXApCit7CisJ cG1hcF90IHBtYXA7CisJc3RydWN0IHRocmVhZCAqdGQgPSBOVUxMOworCXN0cnVjdCBwcm9jICpw OworCWludCBpLCBqLCBrOworCXZtX3BhZGRyX3QgcGE7CisJdm1fb2Zmc2V0X3QgdmE7CisKKwlp ZiAoaGF2ZV9hZGRyKSB7CisJCXRkID0gZGJfbG9va3VwX3RocmVhZChhZGRyLCBUUlVFKTsKKwkJ aWYgKHRkID09IE5VTEwpIHsKKwkJCWRiX3ByaW50ZigiSW52YWxpZCBwaWQgb3IgdGlkIik7CisJ CQlyZXR1cm47CisJCX0KKwkJcCA9IHRkLT50ZF9wcm9jOworCQlpZiAocC0+cF92bXNwYWNlID09 IE5VTEwpIHsKKwkJCWRiX3ByaW50ZigiTm8gdm1zcGFjZSBmb3IgcHJvY2VzcyIpOworCQkJcmV0 dXJuOworCQl9CisJCQlwbWFwID0gdm1zcGFjZV9wbWFwKHAtPnBfdm1zcGFjZSk7CisJfSBlbHNl CisJCXBtYXAgPSBrZXJuZWxfcG1hcDsKKworCXByaW50ZigicG1hcDolcCBzZWd0YWI6JXAgYXNp ZDoleCBnZW5lcmF0aW9uOiV4XG4iLAorCSAgICBwbWFwLCBwbWFwLT5wbV9zZWd0YWIsCisJCQkg ICAgICAgcG1hcC0+cG1fYXNpZFswXS5hc2lkLAorCQkJICAgICAgIHBtYXAtPnBtX2FzaWRbMF0u Z2VuKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlBERVBHOyBpKyspIHsKKwkJcGRfZW50cnlfdCAqcGRw ZTsKKwkJcHRfZW50cnlfdCAqcGRlOworCQlwdF9lbnRyeV90IHB0ZTsKKworCQlwZHBlID0gKHBk X2VudHJ5X3QgKilwbWFwLT5wbV9zZWd0YWJbaV07CisJCWlmIChwZHBlID09IE5VTEwpCisJCQlj b250aW51ZTsKKwkJZGJfcHJpbnRmKCJbJTRkXSAlcFxuIiwgaSwgcGRwZSk7CisJCWZvciAoaiA9 IDA7IGogPCBOUERFUEc7IGorKykgeworCQkJcGRlID0gKHB0X2VudHJ5X3QgKilwZHBlW2pdOwor CQkJaWYgKHBkZSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJZGJfcHJpbnRmKCJcdFslNGRd ICVwXG4iLCBqLCBwZGUpOworCQkJZm9yIChrID0gMDsgayA8IE5QVEVQRzsgaysrKSB7CisJCQkJ cHRlID0gcGRlW2tdOworCQkJCWlmIChwdGUgPT0gMCB8fCAhcHRlX3Rlc3QoJnB0ZSwgUFRFX1Yp KQorCQkJCQljb250aW51ZTsKKwkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwdGUpOworCQkJCXZh ID0gKCh1X2xvbmcpaSA8PCBTRUdTSElGVCkgfCAoaiA8PCBQRFJTSElGVCkgfCAoayA8PCBQQUdF X1NISUZUKTsKKwkJCQlwcmludGYoIlx0XHRbJTA0ZF0gdmE6ICVwIHB0ZTogJTh4IHBhOiVseFxu IiwKKwkJCQkJCWssICh2b2lkICopdmEsIHB0ZSwgKHVfbG9uZylwYSk7CisKKyNpZiAwCisJCQkJ CQkJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJCQkJcHJpbnRmKCJcdFx0WyUwNGRdIHZhOiAl cCwgcHQ6ICVwLCBoOiAlZCwgdzogJWQsIGY6IDB4JXhcbiIsCisJCQkJICAgICAgIGssICh2b2lk ICopdmEsICh2b2lkICopcGEsICBtLT5ob2xkX2NvdW50LAorCQkJCQkJCSAgICBtLT53aXJlX2Nv dW50LAorCQkJCQkJCSAgICBtLT5mbGFncyk7CisjZW5kaWYKKwkJCX0KKwkJfQorCX0KK30KKwor CisjaWYgZGVmaW5lZChERUJVRykKKworc3RhdGljIHZvaWQgcGFkcyhwbWFwX3QgcG0pOwordm9p ZCBwbWFwX3B2ZHVtcCh2bV9vZmZzZXRfdCBwYSk7CisKKy8qIHByaW50IGFkZHJlc3Mgc3BhY2Ug b2YgcG1hcCovCitzdGF0aWMgdm9pZAorcGFkcyhwbWFwX3QgcG0pCit7CisJdW5zaWduZWQgdmEs IGksIGo7CisJcHRfZW50cnlfdCAqcHRlcDsKKworCWlmIChwbSA9PSBrZXJuZWxfcG1hcCkKKwkJ cmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCBOUFRFUEc7IGkrKykKKwkJaWYgKHBtLT5wbV9zZWd0 YWJbaV0pCisJCQlmb3IgKGogPSAwOyBqIDwgTlBURVBHOyBqKyspIHsKKwkJCQl2YSA9IChpIDw8 IFNFR1NISUZUKSArIChqIDw8IFBBR0VfU0hJRlQpOworCQkJCWlmIChwbSA9PSBrZXJuZWxfcG1h cCAmJiB2YSA8IEtFUk5CQVNFKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAocG0gIT0ga2VybmVs X3BtYXAgJiYKKwkJCQkgICAgdmEgPj0gVk1fTUFYVVNFUl9BRERSRVNTKQorCQkJCQljb250aW51 ZTsKKwkJCQlwdGVwID0gcG1hcF9wdGUocG0sIHZhKTsKKwkJCQlpZiAocG1hcF9wdGVfdihwdGVw KSkKKwkJCQkJcHJpbnRmKCIleDoleCAiLCB2YSwgKihpbnQgKilwdGVwKTsKKwkJCX0KKworfQor Cit2b2lkCitwbWFwX3B2ZHVtcCh2bV9vZmZzZXRfdCBwYSkKK3sKKwlyZWdpc3RlciBwdl9lbnRy eV90IHB2OworCXZtX3BhZ2VfdCBtOworCisJcHJpbnRmKCJwYSAleCIsIHBhKTsKKwltID0gUEhZ U19UT19WTV9QQUdFKHBhKTsKKwlmb3IgKHB2ID0gVEFJTFFfRklSU1QoJm0tPm1kLnB2X2xpc3Qp OyBwdjsKKwkgICAgcHYgPSBUQUlMUV9ORVhUKHB2LCBwdl9saXN0KSkgeworCQlwcmludGYoIiAt PiBwbWFwICVwLCB2YSAleCIsICh2b2lkICopcHYtPnB2X3BtYXAsIHB2LT5wdl92YSk7CisJCXBh ZHMocHYtPnB2X3BtYXApOworCX0KKwlwcmludGYoIiAiKTsKK30KKworLyogTi9DICovCisjZW5k aWYKKworCisvKgorICogQWxsb2NhdGUgVExCIGFkZHJlc3Mgc3BhY2UgdGFnIChjYWxsZWQgQVNJ RCBvciBUTEJQSUQpIGFuZCByZXR1cm4gaXQuCisgKiBJdCB0YWtlcyBhbG1vc3QgYXMgbXVjaCBv ciBtb3JlIHRpbWUgdG8gc2VhcmNoIHRoZSBUTEIgZm9yIGEKKyAqIHNwZWNpZmljIEFTSUQgYW5k IGZsdXNoIHRob3NlIGVudHJpZXMgYXMgaXQgZG9lcyB0byBmbHVzaCB0aGUgZW50aXJlIFRMQi4K KyAqIFRoZXJlZm9yZSwgd2hlbiB3ZSBhbGxvY2F0ZSBhIG5ldyBBU0lELCB3ZSBqdXN0IHRha2Ug dGhlIG5leHQgbnVtYmVyLiBXaGVuCisgKiB3ZSBydW4gb3V0IG9mIG51bWJlcnMsIHdlIGZsdXNo IHRoZSBUTEIsIGluY3JlbWVudCB0aGUgZ2VuZXJhdGlvbiBjb3VudAorICogYW5kIHN0YXJ0IG92 ZXIuIEFTSUQgemVybyBpcyByZXNlcnZlZCBmb3Iga2VybmVsIHVzZS4KKyAqLworc3RhdGljIHZv aWQKK3BtYXBfYXNpZF9hbGxvYyhwbWFwKQorCXBtYXBfdCBwbWFwOworeworCWlmIChwbWFwLT5w bV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uYXNpZCAhPSBQTUFQX0FTSURfUkVTRVJWRUQgJiYKKwkg ICAgcG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmdlbiA9PSBQQ1BVX0dFVChhc2lkX2dl bmVyYXRpb24pKTsKKwllbHNlIHsKKwkJaWYgKFBDUFVfR0VUKG5leHRfYXNpZCkgPT0gcG1hcF9t YXhfYXNpZCkgeworCQkJdGxiX2ludmFsaWRhdGVfYWxsX3VzZXIoTlVMTCk7CisJCQlQQ1BVX1NF VChhc2lkX2dlbmVyYXRpb24sCisJCQkgICAgKFBDUFVfR0VUKGFzaWRfZ2VuZXJhdGlvbikgKyAx KSAmIEFTSURHRU5fTUFTSyk7CisJCQlpZiAoUENQVV9HRVQoYXNpZF9nZW5lcmF0aW9uKSA9PSAw KSB7CisJCQkJUENQVV9TRVQoYXNpZF9nZW5lcmF0aW9uLCAxKTsKKwkJCX0KKwkJCVBDUFVfU0VU KG5leHRfYXNpZCwgMSk7CS8qIDAgbWVhbnMgaW52YWxpZCAqLworCQl9CisJCXBtYXAtPnBtX2Fz aWRbUENQVV9HRVQoY3B1aWQpXS5hc2lkID0gUENQVV9HRVQobmV4dF9hc2lkKTsKKwkJcG1hcC0+ cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmdlbiA9IFBDUFVfR0VUKGFzaWRfZ2VuZXJhdGlvbik7 CisJCVBDUFVfU0VUKG5leHRfYXNpZCwgUENQVV9HRVQobmV4dF9hc2lkKSArIDEpOworCX0KK30K KworaW50CitwYWdlX2lzX21hbmFnZWQodm1fb2Zmc2V0X3QgcGEpCit7CisJdm1fb2Zmc2V0X3Qg cGdudW0gPSBtaXBzX2J0b3AocGEpOworCisJaWYgKHBnbnVtID49IGZpcnN0X3BhZ2UpIHsKKwkJ dm1fcGFnZV90IG07CisKKwkJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJCWlmIChtID09IE5V TEwpCisJCQlyZXR1cm4gMDsKKwkJaWYgKChtLT5mbGFncyAmIChQR19GSUNUSVRJT1VTIHwgUEdf VU5NQU5BR0VEKSkgPT0gMCkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIGludAoraW5pdF9wdGVfcHJvdCh2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sIHZtX3By b3RfdCBwcm90KQoreworCWludCBydzsKKworCWlmICghKHByb3QgJiBWTV9QUk9UX1dSSVRFKSkK KwkJcncgPSAgUFRFX1YgfCBQVEVfUk8gfCBQVEVfQ19DQUNIRTsKKwllbHNlIGlmICgobS0+Zmxh Z3MgJiAoUEdfRklDVElUSU9VUyB8IFBHX1VOTUFOQUdFRCkpID09IDApIHsKKwkJaWYgKChtLT5t ZC5wdl9mbGFncyAmIFBWX1RBQkxFX01PRCkgIT0gMCkKKwkJCXJ3ID0gIFBURV9WIHwgUFRFX0Qg fCBQVEVfQ19DQUNIRTsKKwkJZWxzZQorCQkJcncgPSBQVEVfViB8IFBURV9DX0NBQ0hFOworCQl2 bV9wYWdlX2ZsYWdfc2V0KG0sIFBHX1dSSVRFQUJMRSk7CisJfSBlbHNlCisJCS8qIE5lZWRuJ3Qg ZW11bGF0ZSBhIG1vZGlmaWVkIGJpdCBmb3IgdW5tYW5hZ2VkIHBhZ2VzLiAqLworCQlydyA9ICBQ VEVfViB8IFBURV9EIHwgUFRFX0NfQ0FDSEU7CisJcmV0dXJuIChydyk7Cit9CisKKy8qCisgKglw bWFwX3NldF9tb2RpZmllZDoKKyAqCisgKglTZXRzIHRoZSBwYWdlIG1vZGlmaWVkIGFuZCByZWZl cmVuY2UgYml0cyBmb3IgdGhlIHNwZWNpZmllZCBwYWdlLgorICovCit2b2lkCitwbWFwX3NldF9t b2RpZmllZCh2bV9vZmZzZXRfdCBwYSkKK3sKKworCVBIWVNfVE9fVk1fUEFHRShwYSktPm1kLnB2 X2ZsYWdzIHw9IChQVl9UQUJMRV9SRUYgfCBQVl9UQUJMRV9NT0QpOworfQorCisKKy8qCisgKglS b3V0aW5lOglwbWFwX2tleHRyYWN0CisgKglGdW5jdGlvbjoKKyAqCQlFeHRyYWN0IHRoZSBwaHlz aWNhbCBwYWdlIGFkZHJlc3MgYXNzb2NpYXRlZAorICoJCXZpcnR1YWwgYWRkcmVzcy4KKyAqLwor IC8qIFBNQVBfSU5MSU5FICovIHZtX29mZnNldF90CitwbWFwX2tleHRyYWN0KHZtX29mZnNldF90 IHZhKQoreworCWludCBtYXBwZWQ7CisKKwkvKgorCSAqIEZpcnN0LCB0aGUgZGlyZWN0LW1hcHBl ZCByZWdpb25zLgorCSAqLworCWlmICh2YSA+PSBNSVBTX1hLUEhZU19TVEFSVCAmJiB2YSA8IE1J UFNfWEtQSFlTX0VORCkKKwkJcmV0dXJuIChNSVBTX1hLUEhZU19UT19QSFlTKHZhKSk7CisKKwlp ZiAodmEgPj0gTUlQU19LU0VHMF9TVEFSVCAmJiB2YSA8IE1JUFNfS1NFRzBfRU5EKQorCQlyZXR1 cm4gKE1JUFNfS1NFRzBfVE9fUEhZUyh2YSkpOworCisJaWYgKHZhID49IE1JUFNfS1NFRzFfU1RB UlQgJiYgdmEgPCBNSVBTX0tTRUcxX0VORCkKKwkJcmV0dXJuIChNSVBTX0tTRUcxX1RPX1BIWVMo dmEpKTsKKworCS8qCisJICogVXNlciB2aXJ0dWFsIGFkZHJlc3Nlcy4KKwkgKi8KKwlpZiAodmEg PCBWTV9NQVhVU0VSX0FERFJFU1MpIHsKKwkJcHRfZW50cnlfdCAqcHRlcDsKKworCQlpZiAoY3Vy cHJvYyAmJiBjdXJwcm9jLT5wX3Ztc3BhY2UpIHsKKwkJCXB0ZXAgPSBwbWFwX3B0ZSgmY3VycHJv Yy0+cF92bXNwYWNlLT52bV9wbWFwLCB2YSk7CisJCQlpZiAocHRlcCkgeworCQkJCXJldHVybiAo VExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJICAgICh2YSAmIFBBR0VfTUFTSykpOworCQkJ fQorCQkJcmV0dXJuICgwKTsKKwkJfQorCX0KKworCS8qCisJICogU2hvdWxkIGJlIGtlcm5lbCB2 aXJ0dWFsIGhlcmUsIG90aGVyd2lzZSBmYWlsCisJICovCisJbWFwcGVkID0gKHZhID49IE1JUFNf S1NFRzJfU1RBUlQgfHwgdmEgPCBNSVBTX0tTRUcyX0VORCk7CisJbWFwcGVkID0gbWFwcGVkIHx8 ICh2YSA+PSBNSVBTX1hLU0VHX1NUQVJUIHx8IHZhIDwgTUlQU19YS1NFR19FTkQpOworCS8qCisJ ICogS2VybmVsIHZpcnR1YWwuCisJICovCisKKwlpZiAobWFwcGVkKSB7CisJCXB0X2VudHJ5X3Qg KnB0ZXA7CisKKwkJLyogSXMgdGhlIGtlcm5lbCBwbWFwIGluaXRpYWxpemVkPyAqLworCQlpZiAo a2VybmVsX3BtYXAtPnBtX2FjdGl2ZSkgeworCQkJLyogSXQncyBpbnNpZGUgdGhlIHZpcnR1YWwg YWRkcmVzcyByYW5nZSAqLworCQkJcHRlcCA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CisJ CQlpZiAocHRlcCkgeworCQkJCXJldHVybiAoVExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJ ICAgICh2YSAmIFBBR0VfTUFTSykpOworCQkJfQorCQl9CisJCXJldHVybiAoMCk7CisJfQorCisJ cGFuaWMoIiVzIGZvciB1bmtub3duIGFkZHJlc3Mgc3BhY2UgJXAuIiwgX19mdW5jX18sICh2b2lk ICopdmEpOworfQorCisKK3ZvaWQgCitwbWFwX2ZsdXNoX3B2Y2FjaGUodm1fcGFnZV90IG0pCit7 CisJcHZfZW50cnlfdCBwdjsKKworCWlmIChtICE9IE5VTEwpIHsKKwkJZm9yIChwdiA9IFRBSUxR X0ZJUlNUKCZtLT5tZC5wdl9saXN0KTsgcHY7CisJICAgIAkgICAgcHYgPSBUQUlMUV9ORVhUKHB2 LCBwdl9saXN0KSkgeworCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgocHYtPnB2X3Zh LCBQQUdFX1NJWkUpOworCQl9CisJfQorfQpJbmRleDogc3lzL21pcHMvbWlwcy9wbWFwLmMKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQotLS0gc3lzL21pcHMvbWlwcy9wbWFwLmMJKHJldmlzaW9uIDIxMDUzNCkKKysrIHN5 cy9taXBzL21pcHMvcG1hcC5jCSh3b3JraW5nIGNvcHkpCkBAIC0xMjgsMTIgKzEyOCw4IEBACiAj ZGVmaW5lCXBtYXBfc2Vnc2hpZnQodikJKCgodikgPj4gU0VHU0hJRlQpICYgKE5QREVQRyAtIDEp KQogI2RlZmluZQlzZWd0YWJfcGRlKG0sIHYpCSgobSlbcG1hcF9zZWdzaGlmdCgodikpXSkKIAot I2lmIGRlZmluZWQoX19taXBzX242NCkKLSNkZWZpbmUJTlVTRVJQR1RCTFMJCShOUERFUEcpCi0j ZWxzZQogI2RlZmluZQlOVVNFUlBHVEJMUwkJKHBtYXBfc2Vnc2hpZnQoVk1fTUFYVVNFUl9BRERS RVNTKSkKLSNlbmRpZgotI2RlZmluZQltaXBzX3NlZ3RydW5jKHZhKQkoKHZhKSAmIH5TRUdPRlNF VCkKKyNkZWZpbmUJbWlwc19zZWd0cnVuYyh2YSkJKCh2YSkgJiB+U0VHTUFTSykKICNkZWZpbmUJ aXNfa2VybmVsX3BtYXAoeCkJKCh4KSA9PSBrZXJuZWxfcG1hcCkKIAogLyoKQEAgLTE5Niw3ICsx OTIsNiBAQAogc3RhdGljIHZvaWQgcG1hcF91cGRhdGVfcGFnZV9hY3Rpb24odm9pZCAqYXJnKTsK ICNlbmRpZgogCi0jaWYgIWRlZmluZWQoX19taXBzX242NCkKIHN0cnVjdCBsb2NhbF9zeXNtYXBz IHsKIAl2bV9vZmZzZXRfdCBiYXNlOwogCXVpbnQxNl90IHZhbGlkMSwgdmFsaWQyOwpAQCAtMjU3 LDcgKzI1Miw2IEBACiAJdGxiX2ludmFsaWRhdGVfYWRkcmVzcyhrZXJuZWxfcG1hcCwgc3lzbS0+ YmFzZSArIFBBR0VfU0laRSk7CVwKIAlzeXNtLT52YWxpZDIgPSAwOwkJCQkJCVwKIAlpbnRyX3Jl c3RvcmUoaW50cikKLSNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHB0X2VudHJ5X3QgKgogcG1hcF9z ZWdtYXAocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQpAQCAtMzMyLDkgKzMyNiw3IEBACiAJ cHRfZW50cnlfdCAqcGd0YWI7CiAJcHRfZW50cnlfdCAqcHRlOwogCWludCBpLCBqOwotI2lmICFk ZWZpbmVkKF9fbWlwc19uNjQpCiAJaW50IG1lbW9yeV9sYXJnZXJfdGhhbl81MTJtZWcgPSAwOwot I2VuZGlmCiAKIAkvKiBTb3J0LiAqLwogYWdhaW46CkBAIC0zNjIsMTAgKzM1NCw4IEBACiAJCX0K IAl9CiAKLSNpZiAhZGVmaW5lZChfX21pcHNfbjY0KQogCWlmIChwaHlzX2F2YWlsW2kgLSAxXSA+ PSBNSVBTX0tTRUcwX0xBUkdFU1RfUEhZUykKIAkJbWVtb3J5X2xhcmdlcl90aGFuXzUxMm1lZyA9 IDE7Ci0jZW5kaWYKIAogCS8qCiAJICogQ29weSB0aGUgcGh5c19hdmFpbFtdIGFycmF5IGJlZm9y ZSB3ZSBzdGFydCBzdGVhbGluZyBtZW1vcnkgZnJvbSBpdC4KQEAgLTQyNCw3ICs0MTQsNiBAQAog CQlwcmludGYoInBjcHUgaXMgYXZhaWxhYmxlIGF0IHZpcnR1YWwgYWRkcmVzcyAlcC5cbiIsIHBj cHVwKTsKICNlbmRpZgogCi0jaWYgIWRlZmluZWQoX19taXBzX242NCkKIAkvKgogCSAqIFN0ZWFs IHNvbWUgdmlydHVhbCBzcGFjZSB0aGF0IHdpbGwgbm90IGJlIGluIGtlcm5lbF9zZWdtYXAuIFRo aXMKIAkgKiB2YSBtZW1vcnkgc3BhY2Ugd2lsbCBiZSB1c2VkIHRvIG1hcCBpbiBrZXJuZWwgcGFn ZXMgdGhhdCBhcmUKQEAgLTQzOSw3ICs0MjgsNiBAQAogCQkJc3lzbWFwX2xtZW1baV0udmFsaWQx ID0gc3lzbWFwX2xtZW1baV0udmFsaWQyID0gMDsKIAkJfQogCX0KLSNlbmRpZgogCiAJLyoKIAkg KiBBbGxvY2F0ZSBzZWdtZW50IHRhYmxlIGZvciB0aGUga2VybmVsCkBAIC00NTAsNyArNDM4LDYg QEAKIAkgKiBBbGxvY2F0ZSBzZWNvbmQgbGV2ZWwgcGFnZSB0YWJsZXMgZm9yIHRoZSBrZXJuZWwK IAkgKi8KIAlua3B0ID0gTktQVDsKLSNpZiAhZGVmaW5lZChfX21pcHNfbjY0KQogCWlmIChtZW1v cnlfbGFyZ2VyX3RoYW5fNTEybWVnKSB7CiAJCS8qCiAJCSAqIElmIHdlIGhhdmUgYSBsYXJnZSBt ZW1vcnkgc3lzdGVtIHdlIENBTk5PVCBhZmZvcmQgdG8gaGl0CkBAIC00NjcsNyArNDU0LDYgQEAK IAkJICovCiAJCW5rcHQgPSAoUEFHRV9TSVpFIC8gc2l6ZW9mKHBkX2VudHJ5X3QpKSAtICh2aXJ0 dWFsX2F2YWlsID4+IFNFR1NISUZUKTsKIAl9Ci0jZW5kaWYKIAlwZ3RhYiA9IChwdF9lbnRyeV90 ICopcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbmtwdCk7CiAKIAkvKgpAQCAtNzc2LDE2 ICs3NjIsOSBAQAogICoKICAqCVVzZSBYS1BIWVMgZm9yIDY0IGJpdCwgYW5kIEtTRUcwIHdoZXJl IHBvc3NpYmxlIGZvciAzMiBiaXQuCiAgKi8KLSNpZiBkZWZpbmVkKF9fbWlwc19uNjQpCiB2bV9v ZmZzZXRfdAogcG1hcF9tYXAodm1fb2Zmc2V0X3QgKnZpcnQsIHZtX29mZnNldF90IHN0YXJ0LCB2 bV9vZmZzZXRfdCBlbmQsIGludCBwcm90KQogewotCXJldHVybiAoTUlQU19QSFlTX1RPX1hLUEhZ U19DQUNIRUQoc3RhcnQpKTsKLX0KLSNlbHNlCi12bV9vZmZzZXRfdAotcG1hcF9tYXAodm1fb2Zm c2V0X3QgKnZpcnQsIHZtX29mZnNldF90IHN0YXJ0LCB2bV9vZmZzZXRfdCBlbmQsIGludCBwcm90 KQotewogCXZtX29mZnNldF90IHZhLCBzdmE7CiAKIAlpZiAoZW5kIDw9IE1JUFNfS1NFRzBfTEFS R0VTVF9QSFlTKQpAQCAtODAwLDcgKzc3OSw2IEBACiAJKnZpcnQgPSB2YTsKIAlyZXR1cm4gKHN2 YSk7CiB9Ci0jZW5kaWYKIAogLyoKICAqIEFkZCBhIGxpc3Qgb2Ygd2lyZWQgcGFnZXMgdG8gdGhl IGt2YQpAQCAtMjAwMCwyMCArMTk3OCw5IEBACiAgKgogICogVXNlIFhLUEhZUyBmb3IgNjQgYml0 LCBhbmQgS1NFRzAgd2hlcmUgcG9zc2libGUgZm9yIDMyIGJpdC4KICAqLwotI2lmIGRlZmluZWQo X19taXBzX242NCkKIHZvaWQgKgogcG1hcF9rZW50ZXJfdGVtcG9yYXJ5KHZtX3BhZGRyX3QgcGEs IGludCBpKQogewotCXJldHVybiAoKHZvaWQgKilNSVBTX1BIWVNfVE9fWEtQSFlTX0NBQ0hFRChw YSkpOwotfQotdm9pZAotcG1hcF9rZW50ZXJfdGVtcG9yYXJ5X2ZyZWUodm1fcGFkZHJfdCBwYSkK LXsKLX0KLSNlbHNlCi12b2lkICoKLXBtYXBfa2VudGVyX3RlbXBvcmFyeSh2bV9wYWRkcl90IHBh LCBpbnQgaSkKLXsKIAl2bV9vZmZzZXRfdCB2YTsKIAlyZWdpc3Rlcl90IGludHI7CiAJaWYgKGkg IT0gMCkKQEAgLTIwNzEsNyArMjAzOCw2IEBACiAJCXN5c20tPnZhbGlkMSA9IDA7CiAJfQogfQot I2VuZGlmCiAKIC8qCiAgKiBNb3ZlZCB0aGUgY29kZSB0byBNYWNoaW5lIEluZGVwZW5kZW50CkBA IC0yMTc3LDI2ICsyMTQzLDEyIEBACiAvKgogICoJcG1hcF96ZXJvX3BhZ2UgemVyb3MgdGhlIHNw ZWNpZmllZCBoYXJkd2FyZSBwYWdlIGJ5IG1hcHBpbmcKICAqCXRoZSBwYWdlIGludG8gS1ZNIGFu ZCB1c2luZyBiemVybyB0byBjbGVhciBpdHMgY29udGVudHMuCi0gKgotICogCVVzZSBYS1BIWVMg Zm9yIDY0IGJpdCwgYW5kIEtTRUcwIHdoZXJlIHBvc3NpYmxlIGZvciAzMiBiaXQuCiAgKi8KLSNp ZiBkZWZpbmVkIChfX21pcHNfbjY0KQogdm9pZAogcG1hcF96ZXJvX3BhZ2Uodm1fcGFnZV90IG0p CiB7CiAJdm1fb2Zmc2V0X3QgdmE7CiAJdm1fcGFkZHJfdCBwaHlzID0gVk1fUEFHRV9UT19QSFlT KG0pOwotCi0JdmEgPSBNSVBTX1BIWVNfVE9fWEtQSFlTX0NBQ0hFRChwaHlzKTsKLQliemVybygo Y2FkZHJfdCl2YSwgUEFHRV9TSVpFKTsKLQltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwgUEFH RV9TSVpFKTsKLX0KLSNlbHNlCi12b2lkCi1wbWFwX3plcm9fcGFnZSh2bV9wYWdlX3QgbSkKLXsK LQl2bV9vZmZzZXRfdCB2YTsKLQl2bV9wYWRkcl90IHBoeXMgPSBWTV9QQUdFX1RPX1BIWVMobSk7 CiAJcmVnaXN0ZXJfdCBpbnRyOwogCiAJaWYgKHBoeXMgPCBNSVBTX0tTRUcwX0xBUkdFU1RfUEhZ UykgewpAQCAtMjIxMywzMCArMjE2NSwxOCBAQAogCQlQTUFQX0xNRU1fVU5NQVAoKTsKIAl9CiB9 Ci0jZW5kaWYKKwogLyoKICAqCXBtYXBfemVyb19wYWdlX2FyZWEgemVyb3MgdGhlIHNwZWNpZmll ZCBoYXJkd2FyZSBwYWdlIGJ5IG1hcHBpbmcKICAqCXRoZSBwYWdlIGludG8gS1ZNIGFuZCB1c2lu ZyBiemVybyB0byBjbGVhciBpdHMgY29udGVudHMuCiAgKgogICoJb2ZmIGFuZCBzaXplIG1heSBu b3QgY292ZXIgYW4gYXJlYSBiZXlvbmQgYSBzaW5nbGUgaGFyZHdhcmUgcGFnZS4KICAqLwotI2lm IGRlZmluZWQgKF9fbWlwc19uNjQpCiB2b2lkCiBwbWFwX3plcm9fcGFnZV9hcmVhKHZtX3BhZ2Vf dCBtLCBpbnQgb2ZmLCBpbnQgc2l6ZSkKIHsKIAl2bV9vZmZzZXRfdCB2YTsKIAl2bV9wYWRkcl90 IHBoeXMgPSBWTV9QQUdFX1RPX1BIWVMobSk7Ci0KLQl2YSA9IE1JUFNfUEhZU19UT19YS1BIWVNf Q0FDSEVEKHBoeXMpOwotCWJ6ZXJvKChjaGFyICopKGNhZGRyX3QpdmEgKyBvZmYsIHNpemUpOwot CW1pcHNfZGNhY2hlX3diaW52X3JhbmdlKHZhICsgb2ZmLCBzaXplKTsKLX0KLSNlbHNlCi12b2lk Ci1wbWFwX3plcm9fcGFnZV9hcmVhKHZtX3BhZ2VfdCBtLCBpbnQgb2ZmLCBpbnQgc2l6ZSkKLXsK LQl2bV9vZmZzZXRfdCB2YTsKLQl2bV9wYWRkcl90IHBoeXMgPSBWTV9QQUdFX1RPX1BIWVMobSk7 CiAJcmVnaXN0ZXJfdCBpbnRyOwogCiAJaWYgKHBoeXMgPCBNSVBTX0tTRUcwX0xBUkdFU1RfUEhZ UykgewpAQCAtMjI1MiwyNSArMjE5MiwxMiBAQAogCQlQTUFQX0xNRU1fVU5NQVAoKTsKIAl9CiB9 Ci0jZW5kaWYKIAotI2lmIGRlZmluZWQgKF9fbWlwc19uNjQpCiB2b2lkCiBwbWFwX3plcm9fcGFn ZV9pZGxlKHZtX3BhZ2VfdCBtKQogewogCXZtX29mZnNldF90IHZhOwogCXZtX3BhZGRyX3QgcGh5 cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKLQotCXZhID0gTUlQU19QSFlTX1RPX1hLUEhZU19DQUNI RUQocGh5cyk7Ci0JYnplcm8oKGNhZGRyX3QpdmEsIFBBR0VfU0laRSk7Ci0JbWlwc19kY2FjaGVf d2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7Ci19Ci0jZWxzZQotdm9pZAotcG1hcF96ZXJvX3Bh Z2VfaWRsZSh2bV9wYWdlX3QgbSkKLXsKLQl2bV9vZmZzZXRfdCB2YTsKLQl2bV9wYWRkcl90IHBo eXMgPSBWTV9QQUdFX1RPX1BIWVMobSk7CiAJcmVnaXN0ZXJfdCBpbnRyOwogCiAJaWYgKHBoeXMg PCBNSVBTX0tTRUcwX0xBUkdFU1RfUEhZUykgewpAQCAtMjI4NiwzOCArMjIxMywxOSBAQAogCQlQ TUFQX0xNRU1fVU5NQVAoKTsKIAl9CiB9Ci0jZW5kaWYKIAogLyoKICAqCXBtYXBfY29weV9wYWdl IGNvcGllcyB0aGUgc3BlY2lmaWVkIChtYWNoaW5lIGluZGVwZW5kZW50KQogICoJcGFnZSBieSBt YXBwaW5nIHRoZSBwYWdlIGludG8gdmlydHVhbCBtZW1vcnkgYW5kIHVzaW5nCiAgKgliY29weSB0 byBjb3B5IHRoZSBwYWdlLCBvbmUgbWFjaGluZSBkZXBlbmRlbnQgcGFnZSBhdCBhCiAgKgl0aW1l LgotICoKLSAqIAlVc2UgWEtQSFlTIGZvciA2NCBiaXQsIGFuZCBLU0VHMCB3aGVyZSBwb3NzaWJs ZSBmb3IgMzIgYml0LgogICovCi0jaWYgZGVmaW5lZCAoX19taXBzX242NCkKIHZvaWQKIHBtYXBf Y29weV9wYWdlKHZtX3BhZ2VfdCBzcmMsIHZtX3BhZ2VfdCBkc3QpCiB7CiAJdm1fb2Zmc2V0X3Qg dmFfc3JjLCB2YV9kc3Q7CiAJdm1fcGFkZHJfdCBwaHlfc3JjID0gVk1fUEFHRV9UT19QSFlTKHNy Yyk7CiAJdm1fcGFkZHJfdCBwaHlfZHN0ID0gVk1fUEFHRV9UT19QSFlTKGRzdCk7Ci0KLQlwbWFw X2ZsdXNoX3B2Y2FjaGUoc3JjKTsKLQltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleChNSVBT X1BIWVNfVE9fWEtQSFlTX0NBQ0hFRChwaHlfZHN0KSwgUEFHRV9TSVpFKTsKLQl2YV9zcmMgPSBN SVBTX1BIWVNfVE9fWEtQSFlTX0NBQ0hFRChwaHlfc3JjKTsKLQl2YV9kc3QgPSBNSVBTX1BIWVNf VE9fWEtQSFlTX0NBQ0hFRChwaHlfZHN0KTsKLQliY29weSgoY2FkZHJfdCl2YV9zcmMsIChjYWRk cl90KXZhX2RzdCwgUEFHRV9TSVpFKTsKLQltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YV9kc3Qs IFBBR0VfU0laRSk7Ci19Ci0jZWxzZQotdm9pZAotcG1hcF9jb3B5X3BhZ2Uodm1fcGFnZV90IHNy Yywgdm1fcGFnZV90IGRzdCkKLXsKLQl2bV9vZmZzZXRfdCB2YV9zcmMsIHZhX2RzdDsKLQl2bV9w YWRkcl90IHBoeV9zcmMgPSBWTV9QQUdFX1RPX1BIWVMoc3JjKTsKLQl2bV9wYWRkcl90IHBoeV9k c3QgPSBWTV9QQUdFX1RPX1BIWVMoZHN0KTsKIAlyZWdpc3Rlcl90IGludHI7CiAKIAlpZiAoKHBo eV9zcmMgPCBNSVBTX0tTRUcwX0xBUkdFU1RfUEhZUykgJiYgKHBoeV9kc3QgPCBNSVBTX0tTRUcw X0xBUkdFU1RfUEhZUykpIHsKQEAgLTIzNDIsNyArMjI1MCw2IEBACiAJCVBNQVBfTE1FTV9VTk1B UCgpOwogCX0KIH0KLSNlbmRpZgogCiAvKgogICogUmV0dXJucyB0cnVlIGlmIHRoZSBwbWFwJ3Mg cHYgaXMgb25lIG9mIHRoZSBmaXJzdApAQCAtMjc0OCwyNCArMjY1NSwxMCBAQAogICogYWRkcmVz cyBzcGFjZS4gUmV0dXJuIGEgcG9pbnRlciB0byB3aGVyZSBpdCBpcyBtYXBwZWQuIFRoaXMKICAq IHJvdXRpbmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgbWFwcGluZyBkZXZpY2UgbWVtb3J5 LAogICogTk9UIHJlYWwgbWVtb3J5LgotICoKLSAqIFVzZSBYS1BIWVMgdW5jYWNoZWQgZm9yIDY0 IGJpdCwgYW5kIEtTRUcxIHdoZXJlIHBvc3NpYmxlIGZvciAzMiBiaXQuCiAgKi8KLSNpZiBkZWZp bmVkKF9fbWlwc19uNjQpCiB2b2lkICoKIHBtYXBfbWFwZGV2KHZtX29mZnNldF90IHBhLCB2bV9z aXplX3Qgc2l6ZSkKIHsKLQlyZXR1cm4gKCh2b2lkICopTUlQU19QSFlTX1RPX1hLUEhZU19VTkNB Q0hFRChwYSkpOwotfQotCi12b2lkCi1wbWFwX3VubWFwZGV2KHZtX29mZnNldF90IHZhLCB2bV9z aXplX3Qgc2l6ZSkKLXsKLX0KLSNlbHNlCi12b2lkICoKLXBtYXBfbWFwZGV2KHZtX29mZnNldF90 IHBhLCB2bV9zaXplX3Qgc2l6ZSkKLXsKICAgICAgICAgdm1fb2Zmc2V0X3QgdmEsIHRtcHZhLCBv ZmZzZXQ7CiAKIAkvKiAKQEAgLTI4MDksNyArMjcwMiw2IEBACiAJCXBtYXBfa3JlbW92ZSh0bXB2 YSk7CiAJa21lbV9mcmVlKGtlcm5lbF9tYXAsIGJhc2UsIHNpemUpOwogfQotI2VuZGlmCiAKIC8q CiAgKiBwZXJmb3JtIHRoZSBwbWFwIHdvcmsgZm9yIG1pbmNvcmUKQEAgLTI5MDIsMTQgKzI3OTQs MTQgQEAKIAkJcmV0dXJuOwogCWlmIChvYmplY3QgIT0gTlVMTCAmJiAob2JqZWN0LT5mbGFncyAm IE9CSl9DT0xPUkVEKSAhPSAwKQogCQlvZmZzZXQgKz0gcHRvYShvYmplY3QtPnBnX2NvbG9yKTsK LQlzdXBlcnBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0ICYgU0VHT0ZTRVQ7Ci0JaWYgKHNpemUgLSAoKE5C U0VHIC0gc3VwZXJwYWdlX29mZnNldCkgJiBTRUdPRlNFVCkgPCBOQlNFRyB8fAotCSAgICAoKmFk ZHIgJiBTRUdPRlNFVCkgPT0gc3VwZXJwYWdlX29mZnNldCkKKwlzdXBlcnBhZ2Vfb2Zmc2V0ID0g b2Zmc2V0ICYgU0VHTUFTSzsKKwlpZiAoc2l6ZSAtICgoTkJTRUcgLSBzdXBlcnBhZ2Vfb2Zmc2V0 KSAmIFNFR01BU0spIDwgTkJTRUcgfHwKKwkgICAgKCphZGRyICYgU0VHTUFTSykgPT0gc3VwZXJw YWdlX29mZnNldCkKIAkJcmV0dXJuOwotCWlmICgoKmFkZHIgJiBTRUdPRlNFVCkgPCBzdXBlcnBh Z2Vfb2Zmc2V0KQotCQkqYWRkciA9ICgqYWRkciAmIH5TRUdPRlNFVCkgKyBzdXBlcnBhZ2Vfb2Zm c2V0OworCWlmICgoKmFkZHIgJiBTRUdNQVNLKSA8IHN1cGVycGFnZV9vZmZzZXQpCisJCSphZGRy ID0gKCphZGRyICYgflNFR01BU0spICsgc3VwZXJwYWdlX29mZnNldDsKIAllbHNlCi0JCSphZGRy ID0gKCgqYWRkciArIFNFR09GU0VUKSAmIH5TRUdPRlNFVCkgKyBzdXBlcnBhZ2Vfb2Zmc2V0Owor CQkqYWRkciA9ICgoKmFkZHIgKyBTRUdNQVNLKSAmIH5TRUdNQVNLKSArIHN1cGVycGFnZV9vZmZz ZXQ7CiB9CiAKIC8qCkBAIC0zMTQxLDExICszMDMzLDYgQEAKIAkvKgogCSAqIEZpcnN0LCB0aGUg ZGlyZWN0LW1hcHBlZCByZWdpb25zLgogCSAqLwotI2lmIGRlZmluZWQoX19taXBzX242NCkKLQlp ZiAodmEgPj0gTUlQU19YS1BIWVNfU1RBUlQgJiYgdmEgPCBNSVBTX1hLUEhZU19FTkQpCi0JCXJl dHVybiAoTUlQU19YS1BIWVNfVE9fUEhZUyh2YSkpOwotI2VuZGlmCi0KIAlpZiAodmEgPj0gTUlQ U19LU0VHMF9TVEFSVCAmJiB2YSA8IE1JUFNfS1NFRzBfRU5EKQogCQlyZXR1cm4gKE1JUFNfS1NF RzBfVE9fUEhZUyh2YSkpOwogCkBAIC0zMTcyLDkgKzMwNTksNiBAQAogCSAqIFNob3VsZCBiZSBr ZXJuZWwgdmlydHVhbCBoZXJlLCBvdGhlcndpc2UgZmFpbAogCSAqLwogCW1hcHBlZCA9ICh2YSA+ PSBNSVBTX0tTRUcyX1NUQVJUIHx8IHZhIDwgTUlQU19LU0VHMl9FTkQpOwotI2lmIGRlZmluZWQo X19taXBzX242NCkKLQltYXBwZWQgPSBtYXBwZWQgfHwgKHZhID49IE1JUFNfWEtTRUdfU1RBUlQg fHwgdmEgPCBNSVBTX1hLU0VHX0VORCk7Ci0jZW5kaWYgCiAJLyoKIAkgKiBLZXJuZWwgdmlydHVh bC4KIAkgKi8K --0016e64757dcd58fd3048c646c04 Content-Type: application/octet-stream; name="mips-n64-config.patch" Content-Disposition: attachment; filename="mips-n64-config.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gc572wx23 SW5kZXg6IHN5cy9jb25mL29wdGlvbnMubWlwcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvY29uZi9vcHRp b25zLm1pcHMJKHJldmlzaW9uIDIxMDUzNCkKKysrIHN5cy9jb25mL29wdGlvbnMubWlwcwkod29y a2luZyBjb3B5KQpAQCAtNTMsNiArNTMsOSBAQAogVEFSR0VUX0VNVUxBVE9SCW9wdF9kZGIuaAog VEFSR0VUX1hMUl9YTFMgIG9wdF9nbG9iYWwuaAogCitLRVJORUxfNjQJb3B0X2dsb2JhbC5oCitL RVJORUxfMzIJb3B0X2dsb2JhbC5oCisKIFRJQ0tfVVNFX1lBTU9OX0ZSRVEJb3B0X2dsb2JhbC5o CiBUSUNLX1VTRV9NQUxUQV9SVEMJb3B0X2dsb2JhbC5oCiAKSW5kZXg6IHN5cy9jb25mL2ZpbGVz Lm1pcHMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQotLS0gc3lzL2NvbmYvZmlsZXMubWlwcwkocmV2aXNpb24gMjEwNTM0 KQorKysgc3lzL2NvbmYvZmlsZXMubWlwcwkod29ya2luZyBjb3B5KQpAQCAtMzIsNyArMzIsOCBA QAogbWlwcy9taXBzL2V4Y2VwdGlvbi5TCQlzdGFuZGFyZAogbWlwcy9taXBzL2dkYl9tYWNoZGVw LmMJCXN0YW5kYXJkCiAjIG1pcHMvbWlwcy9tYWluYnVzLmMJCXN0YW5kYXJkCi1taXBzL21pcHMv cG1hcC5jCQlzdGFuZGFyZAorbWlwcy9taXBzL3BtYXAuYwkJb3B0aW9uYWwga2VybmVsXzMyCitt aXBzL21pcHMvcG1hcDY0LmMJCW9wdGlvbmFsIGtlcm5lbF82NAogbWlwcy9taXBzL3RyYXAuYwkJ c3RhbmRhcmQKIG1pcHMvbWlwcy92bV9tYWNoZGVwLmMJCXN0YW5kYXJkCiAjIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KSW5kZXg6IHN5cy9taXBzL2NvbmYvWExSNjQKPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL21pcHMvY29u Zi9YTFI2NAkocmV2aXNpb24gMjEwNTM0KQorKysgc3lzL21pcHMvY29uZi9YTFI2NAkod29ya2lu ZyBjb3B5KQpAQCAtMjUsNiArMjUsOCBAQAogbWFrZW9wdGlvbnMgICAgIFRBUkdFVF9CSUdfRU5E SUFOCiAKIGluY2x1ZGUJCSIuLi9ybWkvc3RkLnhsciIKK25vb3B0aW9uCUtFUk5FTF8zMgorb3B0 aW9ucwkJS0VSTkVMXzY0CiAKIG1ha2VvcHRpb25zCURFQlVHPS1nCQkjIEJ1aWxkIGtlcm5lbCB3 aXRoIGdkYigxKSBkZWJ1ZyBzeW1ib2xzCiBtYWtlb3B0aW9ucwlBUkNIX0ZMQUdTPSItbWFyY2g9 bWlwczY0IC1tYWJpPTY0IgpJbmRleDogc3lzL21pcHMvY29uZi9ERUZBVUxUUwo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Ci0tLSBzeXMvbWlwcy9jb25mL0RFRkFVTFRTCShyZXZpc2lvbiAyMTA1MzQpCisrKyBzeXMvbWlw cy9jb25mL0RFRkFVTFRTCSh3b3JraW5nIGNvcHkpCkBAIC0xMSwzICsxMSw0IEBACiAKIG9wdGlv bnMgCUdFT01fUEFSVF9CU0QKIG9wdGlvbnMgCUdFT01fUEFSVF9NQlIKK29wdGlvbnMJCUtFUk5F TF8zMgo= --0016e64757dcd58fd3048c646c04 Content-Type: application/octet-stream; name="rmi-n64-rge.patch" Content-Disposition: attachment; filename="rmi-n64-rge.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gc572xjt4 SW5kZXg6IHN5cy9taXBzL3JtaS9kZXYveGxyL3JnZS5jCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9taXBz L3JtaS9kZXYveGxyL3JnZS5jCShyZXZpc2lvbiAyMTA1MzQpCisrKyBzeXMvbWlwcy9ybWkvZGV2 L3hsci9yZ2UuYwkod29ya2luZyBjb3B5KQpAQCAtNTY3LDggKzU2Nyw4IEBACiAJcGFkZHIgPSB2 dG9waHlzKCh2bV9vZmZzZXRfdCl0eF9kZXNjKTsKIAl0eF9kZXNjLT5mcmFnW25mcmFnXSA9ICgx VUxMIDw8IDYzKSB8IChmcl9zdGlkIDw8IDU0KSB8IHBhZGRyOwogCW5mcmFnKys7Ci0JdHhfZGVz Yy0+ZnJhZ1tYTFJfTUFYX1RYX0ZSQUdTXSA9ICh1aW50NjRfdCkgKHZtX29mZnNldF90KXR4X2Rl c2M7Ci0JdHhfZGVzYy0+ZnJhZ1tYTFJfTUFYX1RYX0ZSQUdTICsgMV0gPSAodWludDY0X3QpICh2 bV9vZmZzZXRfdCltX2hlYWQ7CisJdHhfZGVzYy0+ZnJhZ1tYTFJfTUFYX1RYX0ZSQUdTXSA9ICh1 aW50NjRfdCkoaW50cHRyX3QpdHhfZGVzYzsKKwl0eF9kZXNjLT5mcmFnW1hMUl9NQVhfVFhfRlJB R1MgKyAxXSA9ICh1aW50NjRfdCkoaW50cHRyX3QpbV9oZWFkOwogCiAJcDJkX2xlbiA9IChuZnJh ZyAqIDgpOwogCXAycF9tc2ctPm1zZzAgPSAoMVVMTCA8PCA2MykgfCAoMVVMTCA8PCA2MikgfCAo MTI3VUxMIDw8IDU0KSB8CkBAIC02MTQsMTkgKzYxNCwyNyBAQAogZnJlZV9idWYodm1fcGFkZHJf dCBwYWRkcikKIHsKIAlzdHJ1Y3QgbWJ1ZiAqbTsKLQl1aW50MzJfdCBtYWcsIHVtLCBzcjsKKwl1 aW50MzJfdCBtYWc7CisjaWZkZWYgX19taXBzX242NAorCXVpbnQ2NF90ICp2YWRkcjsKIAorCXZh ZGRyID0gKHVpbnQ2NF90ICopTUlQU19QSFlTX1RPX1hLUEhZU19DQUNIRUQocGFkZHIpOworCW0g PSAoc3RydWN0IG1idWYgKil2YWRkclswXTsKKwltYWcgPSAodWludDMyX3QpdmFkZHJbMV07Cisj ZWxzZQorCXVpbnQzMl90IHNyOworCiAJc3IgPSB4bHJfZW5hYmxlX2t4KCk7Ci0JdW0gPSB4bHJf cGFkZHJfbHcocGFkZHIgLSBYTFJfQ0FDSEVMSU5FX1NJWkUpOwotCW1hZyA9IHhscl9wYWRkcl9s dyhwYWRkciAtIFhMUl9DQUNIRUxJTkVfU0laRSArIHNpemVvZih1aW50MzJfdCkpOworCW0gPSAo c3RydWN0IG1idWYgKikoaW50cHRyX3QpeGxyX3BhZGRyX2x3KHBhZGRyIC0gWExSX0NBQ0hFTElO RV9TSVpFICsgc2l6ZW9mKHVpbnQzMl90KSk7CisJbWFnID0geGxyX3BhZGRyX2x3KHBhZGRyIC0g WExSX0NBQ0hFTElORV9TSVpFICsgMyAqIHNpemVvZih1aW50MzJfdCkpOwogCW1pcHNfd3Jfc3Rh dHVzKHNyKTsKKyNlbmRpZgogCiAJaWYgKG1hZyAhPSAweGYwMGJhZCkgewogCQlwcmludGYoIlNv bWV0aGluZyBpcyB3cm9uZyBrc2VnOiVseCBmb3VuZCBtYWc6JXggbm90IDB4ZjAwYmFkXG4iLAog CQkgICAgKHVfbG9uZylwYWRkciwgbWFnKTsKIAkJcmV0dXJuOwogCX0KLQltID0gKHN0cnVjdCBt YnVmICopKGludHB0cl90KXVtOwogCWlmIChtICE9IE5VTEwpCiAJCW1fZnJlZW0obSk7CiB9CkBA IC02MzUsNyArNjQzLDcgQEAKIGdldF9idWYodm9pZCkKIHsKIAlzdHJ1Y3QgbWJ1ZiAqbV9uZXcg PSBOVUxMOwotCXVuc2lnbmVkIGludCAqbWQ7CisJdWludDY0X3QgKm1kOwogI2lmZGVmIElOVkFS SUFOVFMKIAl2bV9wYWRkcl90IHRlbXAxLCB0ZW1wMjsKICNlbmRpZgpAQCAtNjQ1LDcgKzY1Myw3 IEBACiAJCXJldHVybiBOVUxMOwogCiAJbV9hZGoobV9uZXcsIFhMUl9DQUNIRUxJTkVfU0laRSAt ICgodWludHB0cl90KW1fbmV3LT5tX2RhdGEgJiAweDFmKSk7Ci0JbWQgPSAodW5zaWduZWQgaW50 ICopbV9uZXctPm1fZGF0YTsKKwltZCA9ICh1aW50NjRfdCAqKW1fbmV3LT5tX2RhdGE7CiAJbWRb MF0gPSAodWludHB0cl90KW1fbmV3OwkvKiBCYWNrIFB0ciAqLwogCW1kWzFdID0gMHhmMDBiYWQ7 CiAJbV9hZGoobV9uZXcsIFhMUl9DQUNIRUxJTkVfU0laRSk7CkBAIC0yMDMzLDE4ICsyMDQxLDMw IEBACiByZ2Vfcngoc3RydWN0IHJnZV9zb2Z0YyAqc2MsIHZtX3BhZGRyX3QgcGFkZHIsIGludCBs ZW4pCiB7CiAJc3RydWN0IG1idWYgKm07Ci0JdWludDMyX3QgdG0sIG1hZywgc3I7CisJdWludDMy X3QgbWFnOwogCXN0cnVjdCBpZm5ldCAqaWZwID0gc2MtPnJnZV9pZnA7CisjaWZkZWYgX19taXBz X242NAorCXVpbnQ2NF90ICp2YWRkcjsKIAorCXZhZGRyID0odWludDY0X3QgKilNSVBTX1BIWVNf VE9fWEtQSFlTX0NBQ0hFRChwYWRkciAtIFhMUl9DQUNIRUxJTkVfU0laRSk7CisJbSA9IChzdHJ1 Y3QgbWJ1ZiAqKXZhZGRyWzBdOworCW1hZyA9ICh1aW50MzJfdCl2YWRkclsxXTsKKyNlbHNlCisJ dWludDMyX3Qgc3I7CisJLyoKKwkgKiBPbiAzMiBiaXQgbWFjaGluZXMgd2UgdXNlIFhLUEhZUyB0 byBnZXQgdGhlIHZhbHVlcyBzdG9yZXMgd2l0aAorCSAqIHRoZSBtYnVmLCBuZWVkIHRvIGV4cGxp Y2l0bHkgZW5hYmxlIEtYLiBEaXNhYmxlIGludGVycnVwdHMgd2hpbGUKKwkgKiBLWCBpcyBlbmFi bGVkIHRvIHByZXZlbnQgdGhpcyBzZXR0aW5nIGxlYWtpbmcgdG8gb3RoZXIgY29kZS4KKwkgKi8K IAlzciA9IHhscl9lbmFibGVfa3goKTsKLQl0bSA9IHhscl9wYWRkcl9sdyhwYWRkciAtIFhMUl9D QUNIRUxJTkVfU0laRSk7Ci0JbWFnID0geGxyX3BhZGRyX2x3KHBhZGRyIC0gWExSX0NBQ0hFTElO RV9TSVpFICsgc2l6ZW9mKHVpbnQzMl90KSk7CisJbSA9IChzdHJ1Y3QgbWJ1ZiAqKShpbnRwdHJf dCl4bHJfcGFkZHJfbHcocGFkZHIgLSBYTFJfQ0FDSEVMSU5FX1NJWkUgKyBzaXplb2YodWludDMy X3QpKTsKKwltYWcgPSB4bHJfcGFkZHJfbHcocGFkZHIgLSBYTFJfQ0FDSEVMSU5FX1NJWkUgKyAz ICogc2l6ZW9mKHVpbnQzMl90KSk7CiAJbWlwc193cl9zdGF0dXMoc3IpOwotCi0JbSA9IChzdHJ1 Y3QgbWJ1ZiAqKShpbnRwdHJfdCl0bTsKKyNlbmRpZgogCWlmIChtYWcgIT0gMHhmMDBiYWQpIHsK IAkJLyogc29tZWJvZHkgZWxzZSBwYWNrZXQgRXJyb3IgLSBGSVhNRSBpbiBpbnRpYWxpemF0aW9u ICovCi0JCXByaW50ZigiY3B1ICVkOiAqRVJST1IqIE5vdCBteSBwYWNrZXQgcGFkZHIgJXBcbiIs IHhscl9jcHVfaWQoKSwgKHZvaWQgKilwYWRkcik7CisJCXByaW50ZigiY3B1ICVkOiAqRVJST1Iq IE5vdCBteSBwYWNrZXQgcGFkZHIgJXBcbiIsCisJCSAgICB4bHJfY3B1X2lkKCksICh2b2lkICop cGFkZHIpOwogCQlyZXR1cm47CiAJfQogCS8qIGFsaWduIHRoZSBkYXRhICovCg== --0016e64757dcd58fd3048c646c04--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTikAjRTMn0m1DemdmUXKMydmyQPxij%2BN=1d9L2=y>