Improve cron(8)

看板FB_hackers作者時間11年前 (2014/06/13 02:01), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/21 (看更多)
--089e0111c08a47d11f04fb9e10f8 Content-Type: text/plain; charset=UTF-8 Hello, I saw on the FreeBSD Ideas page topic about cron :). I've started updating the 'original' FreeBSD cron from sources to vixi cron 4.1. I think (well I hope :P) most of the features that were done in FreeBSD cron are now ported into vixi cron 4.1, there are unfortunately some missing features at the moment: - @every_second - this need to be done - -s and -o, in vixi cron 4.1 daylight time switches are enabled by default, at the moment there is no -s and -o options. So you need to remove '-s' from the cron rc script I've also added one feature from OpenBSD, crontab is poking cron using unix-domain socket so we don't need to have suid on crontab. Path is in the attachment. I'm testing it on my FreeBSD box and it looks good but anyway don't try it on production machines :). After the installation we have to do a few things: - Add crontab group - Change group to crontab on /var/cron/tabs - Add sticky bit on /var/cron/tabs - Add group write permissions on /var/cron/tabs This is still work in progress but if someone could have a look on this and give me some feedback it would be great. Regards, Tomasz Walaszek --089e0111c08a47d11f04fb9e10f8 Content-Type: application/octet-stream; name=vixi_patch Content-Disposition: attachment; filename=vixi_patch Content-Transfer-Encoding: base64 X-Attachment-Id: f_hwbtjuwi0 ZGlmZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vTWFrZWZpbGUgZnJlZWJzZF9jcm9uL01h a2VmaWxlCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL01ha2VmaWxlCTIwMTQtMDEtMTYgMjE6 NDM6NDkuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vTWFrZWZpbGUJMjAxNC0wNi0x MSAxNjo0Mjo1NS4yNzE0NDQ4OTMgKzAyMDAKQEAgLTEsNCArMSw0IEBACi0jICRGcmVlQlNEOiBy ZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL01ha2VmaWxlIDgwMDI5IDIwMDEtMDctMjAgMDY6 MjA6MzJaIG9icmllbiAkCisjICRGcmVlQlNEOiByZWxlbmcvMTAuMC91c3Iuc2Jpbi9jcm9uL01h a2VmaWxlIDgwMDI5IDIwMDEtMDctMjAgMDY6MjA6MzJaIG9icmllbiAkCiAKIFNVQkRJUj0JbGli IGNyb24gY3JvbnRhYgogCmRpZmYgLXJ1TiAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL01ha2VmaWxl LmluYyBmcmVlYnNkX2Nyb24vTWFrZWZpbGUuaW5jCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9u L01ha2VmaWxlLmluYwkyMDE0LTAxLTE2IDIxOjQzOjUwLjAwMDAwMDAwMCArMDEwMAorKysgZnJl ZWJzZF9jcm9uL01ha2VmaWxlLmluYwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3MTQ0NDg5MyArMDIw MApAQCAtMSw0ICsxLDQgQEAKLSMgJEZyZWVCU0Q6IHJlbGVhc2UvMTAuMC4wL3Vzci5zYmluL2Ny b24vTWFrZWZpbGUuaW5jIDE0NzIyNSAyMDA1LTA2LTEwIDA2OjEyOjUzWiBkZXMgJAorIyAkRnJl ZUJTRDogcmVsZW5nLzEwLjAvdXNyLnNiaW4vY3Jvbi9NYWtlZmlsZS5pbmMgMTQ3MjI1IDIwMDUt MDYtMTAgMDY6MTI6NTNaIGRlcyAkCiAKIExJQkNST049ICR7Lk9CSkRJUn0vLi4vbGliL2xpYmNy b24uYQogCmRpZmYgLXJ1TiAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb24vTWFrZWZpbGUgZnJl ZWJzZF9jcm9uL2Nyb24vTWFrZWZpbGUKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi9N YWtlZmlsZQkyMDE0LTAxLTE2IDIxOjQzOjQ5LjAwMDAwMDAwMCArMDEwMAorKysgZnJlZWJzZF9j cm9uL2Nyb24vTWFrZWZpbGUJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzE0NDQ4OTMgKzAyMDAKQEAg LTEsNCArMSw0IEBACi0jICRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL2Ny b24vTWFrZWZpbGUgMjAxMzkwIDIwMTAtMDEtMDIgMTE6MDc6NDRaIGVkICQKKyMgJEZyZWVCU0Q6 IHJlbGVuZy8xMC4wL3Vzci5zYmluL2Nyb24vY3Jvbi9NYWtlZmlsZSAyMDEzOTAgMjAxMC0wMS0w MiAxMTowNzo0NFogZWQgJAogCiBQUk9HPQljcm9uCiBNQU49CWNyb24uOApkaWZmIC1ydU4gL3Vz ci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL2NvbXBhdC5oIGZyZWVic2RfY3Jvbi9jcm9uL2NvbXBh dC5oCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb24vY29tcGF0LmgJMjAxNC0wMS0xNiAy MTo0Mzo0OS4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVic2RfY3Jvbi9jcm9uL2NvbXBhdC5oCTE5 NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCkBAIC0xLDE0MCArMCwwIEBACi0vKiBD b3B5cmlnaHQgMTk5MywxOTk0IGJ5IFBhdWwgVml4aWUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQK LSAqCi0gKiBEaXN0cmlidXRlIGZyZWVseSwgZXhjZXB0OiBkb24ndCByZW1vdmUgbXkgbmFtZSBm cm9tIHRoZSBzb3VyY2Ugb3IKLSAqIGRvY3VtZW50YXRpb24gKGRvbid0IHRha2UgY3JlZGl0IGZv ciBteSB3b3JrKSwgbWFyayB5b3VyIGNoYW5nZXMgKGRvbid0Ci0gKiBnZXQgbWUgYmxhbWVkIGZv ciB5b3VyIHBvc3NpYmxlIGJ1Z3MpLCBkb24ndCBhbHRlciBvciByZW1vdmUgdGhpcwotICogbm90 aWNlLiAgTWF5IGJlIHNvbGQgaWYgYnVpbGRhYmxlIHNvdXJjZSBpcyBwcm92aWRlZCB0byBidXll ci4gIE5vCi0gKiB3YXJyYW50ZWUgb2YgYW55IGtpbmQsIGV4cHJlc3Mgb3IgaW1wbGllZCwgaXMg aW5jbHVkZWQgd2l0aCB0aGlzCi0gKiBzb2Z0d2FyZTsgdXNlIGF0IHlvdXIgb3duIHJpc2ssIHJl c3BvbnNpYmlsaXR5IGZvciBkYW1hZ2VzIChpZiBhbnkpIHRvCi0gKiBhbnlvbmUgcmVzdWx0aW5n IGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIHJlc3RzIGVudGlyZWx5IHdpdGggdGhlCi0g KiB1c2VyLgotICoKLSAqIFNlbmQgYnVnIHJlcG9ydHMsIGJ1ZyBmaXhlcywgZW5oYW5jZW1lbnRz LCByZXF1ZXN0cywgZmxhbWVzLCBldGMuLCBhbmQKLSAqIEknbGwgdHJ5IHRvIGtlZXAgYSB2ZXJz aW9uIHVwIHRvIGRhdGUuICBJIGNhbiBiZSByZWFjaGVkIGFzIGZvbGxvd3M6Ci0gKiBQYXVsIFZp eGllICAgICAgICAgIDxwYXVsQHZpeC5jb20+ICAgICAgICAgIHV1bmV0IWRlY3dybCF2aXhpZSFw YXVsCi0gKi8KLQotLyoKLSAqICRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9u L2Nyb24vY29tcGF0LmggNTA0NzkgMTk5OS0wOC0yOCAwMTozNTo1OVogcGV0ZXIgJAotICovCi0K LSNpZm5kZWYgX19QCi0jIGlmZGVmIF9fU1REQ19fCi0jICBkZWZpbmUgX19QKHgpIHgKLSMgZWxz ZQotIyAgZGVmaW5lIF9fUCh4KSAoKQotIyAgZGVmaW5lIGNvbnN0Ci0jIGVuZGlmCi0jZW5kaWYK LQotI2lmIGRlZmluZWQoVU5JWFBDKSB8fCBkZWZpbmVkKHVuaXhwYykKLSMgZGVmaW5lIFVOSVhQ QyAxCi0jIGRlZmluZSBBVFQgMQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKGhwdXgpIHx8IGRlZmlu ZWQoX2hwdXgpIHx8IGRlZmluZWQoX19ocHV4KQotIyBkZWZpbmUgSFBVWCAxCi0jIGRlZmluZSBz ZXRldWlkKGUpIHNldHJlc3VpZCgtMSxlLC0xKQotIyBkZWZpbmUgc2V0cmV1aWQocixlKQlzZXRy ZXN1aWQocixlLC0xKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9JQk1SMikKLSMgZGVmaW5lIEFJ WCAxCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19jb252ZXhfXykKLSMgZGVmaW5lIENPTlZFWCAx Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoc2dpKSB8fCBkZWZpbmVkKF9zZ2kpIHx8IGRlZmluZWQo X19zZ2kpCi0jIGRlZmluZSBJUklYIDEKLS8qIElSSVggNCBoZHJzIGFyZSBicm9rZW46IG9uZSBj YW5ub3QgI2luY2x1ZGUgYm90aCA8c3RkaW8uaD4KLSAqIGFuZCA8c3RkbGliLmg+IGJlY2F1c2Ug dGhleSBkaXNhZ3JlZSBvbiBzeXN0ZW0oKSwgcGVycm9yKCkuCi0gKiBUaGVyZWZvcmUgd2UgbXVz dCB6YXAgdGhlICJjb25zdCIga2V5d29yZCBCRUZPUkUgaW5jbHVkaW5nCi0gKiBlaXRoZXIgb2Yg dGhlbS4KLSAqLwotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfVU5JQ09T KQotIyBkZWZpbmUgVU5JQ09TIDEKLSNlbmRpZgotCi0jaWZuZGVmIFBPU0lYCi0jIGlmIChCU0Qg Pj0gMTk5MTAzKSB8fCBkZWZpbmVkKF9fbGludXgpIHx8IGRlZmluZWQodWx0cml4KSB8fCBkZWZp bmVkKEFJWCkgfHxcCi0JZGVmaW5lZChIUFVYKSB8fCBkZWZpbmVkKENPTlZFWCkgfHwgZGVmaW5l ZChJUklYKQotIyAgZGVmaW5lIFBPU0lYCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBCU0QK LSMgaWYgZGVmaW5lZCh1bHRyaXgpCi0jICBkZWZpbmUgQlNEIDE5ODkwMgotIyBlbmRpZgotI2Vu ZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKi8KLQotI2lmICFkZWZpbmVkKEJTRCkgJiYgIWRlZmluZWQoSFBVWCkg JiYgIWRlZmluZWQoQ09OVkVYKSAmJiAhZGVmaW5lZChfX2xpbnV4KQotIyBkZWZpbmUgTkVFRF9W Rk9SSwotI2VuZGlmCi0KLSNpZiAoIWRlZmluZWQoQlNEKSB8fCAoQlNEIDwgMTk4OTAyKSkgJiYg IWRlZmluZWQoX19saW51eCkgJiYgXAotCSFkZWZpbmVkKElSSVgpICYmICFkZWZpbmVkKE5lWFQp ICYmICFkZWZpbmVkKEhQVVgpCi0jIGRlZmluZSBORUVEX1NUUkNBU0VDTVAKLSNlbmRpZgotCi0j aWYgKCFkZWZpbmVkKEJTRCkgfHwgKEJTRCA8IDE5ODkxMSkpICYmICFkZWZpbmVkKF9fbGludXgp ICYmXAotCSFkZWZpbmVkKElSSVgpICYmICFkZWZpbmVkKFVOSUNPUykgJiYgIWRlZmluZWQoSFBV WCkKLSMgZGVmaW5lIE5FRURfU1RSRFVQCi0jZW5kaWYKLQotI2lmICghZGVmaW5lZChCU0QpIHx8 IChCU0QgPCAxOTg5MTEpKSAmJiAhZGVmaW5lZChQT1NJWCkgJiYgIWRlZmluZWQoTmVYVCkKLSMg ZGVmaW5lIE5FRURfU1RSRVJST1IKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChIUFVYKSB8fCBkZWZp bmVkKEFJWCkgfHwgZGVmaW5lZChVTklYUEMpCi0jIGRlZmluZSBORUVEX0ZMT0NLCi0jZW5kaWYK LQotI2lmbmRlZiBQT1NJWAotIyBkZWZpbmUgTkVFRF9TRVRTSUQKLSNlbmRpZgotCi0jaWYgKGRl ZmluZWQoUE9TSVgpICYmICFkZWZpbmVkKEJTRCkpICYmICFkZWZpbmVkKF9fbGludXgpCi0jIGRl ZmluZSBORUVEX0dFVERUQUJMRVNJWkUKLSNlbmRpZgotCi0jaWZkZWYgUE9TSVgKLSNpbmNsdWRl IDx1bmlzdGQuaD4KLSNpZmRlZiBfUE9TSVhfU0FWRURfSURTCi0jIGRlZmluZSBIQVZFX1NBVkVE X1VJRFMKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChBVFQpICYmICFkZWZpbmVkKF9f bGludXgpICYmICFkZWZpbmVkKElSSVgpICYmICFkZWZpbmVkKFVOSUNPUykKLSMgZGVmaW5lIFVT RV9TSUdDSExECi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKEFJWCkgJiYgIWRlZmluZWQoVU5JQ09T KQotIyBkZWZpbmUgU1lTX1RJTUVfSCAxCi0jZWxzZQotIyBkZWZpbmUgU1lTX1RJTUVfSCAwCi0j ZW5kaWYKLQotI2lmIGRlZmluZWQoQlNEKSAmJiAhZGVmaW5lZChQT1NJWCkKLSMgZGVmaW5lIFVT RV9VVElNRVMKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChBSVgpIHx8IGRlZmluZWQoSFBVWCkgfHwg ZGVmaW5lZChJUklYKQotIyBkZWZpbmUgTkVFRF9TRVRFTlYKLSNlbmRpZgotCi0jaWYgIWRlZmlu ZWQoVU5JQ09TKSAmJiAhZGVmaW5lZChVTklYUEMpCi0jIGRlZmluZSBIQVNfRkNIT1dOCi0jZW5k aWYKLQotI2lmICFkZWZpbmVkKFVOSUNPUykgJiYgIWRlZmluZWQoVU5JWFBDKQotIyBkZWZpbmUg SEFTX0ZDSE1PRAotI2VuZGlmCmRpZmYgLXJ1TiAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb24v Y29uZmlnLmggZnJlZWJzZF9jcm9uL2Nyb24vY29uZmlnLmgKLS0tIC91c3Ivc3JjL3Vzci5zYmlu L2Nyb24vY3Jvbi9jb25maWcuaAkyMDE0LTAxLTE2IDIxOjQzOjQ5LjAwMDAwMDAwMCArMDEwMAor KysgZnJlZWJzZF9jcm9uL2Nyb24vY29uZmlnLmgJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzE0NDQ4 OTMgKzAyMDAKQEAgLTEsMjkgKzEsMjkgQEAKIC8qIENvcHlyaWdodCAxOTg4LDE5OTAsMTk5Mywx OTk0IGJ5IFBhdWwgVml4aWUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqLworCisvKgorICog Q29weXJpZ2h0IChjKSAyMDA0IGJ5IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1bSwgSW5jLiAo IklTQyIpCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsMjAwMCBieSBJbnRlcm5ldCBTb2Z0d2FyZSBD b25zb3J0aXVtLCBJbmMuCiAgKgotICogRGlzdHJpYnV0ZSBmcmVlbHksIGV4Y2VwdDogZG9uJ3Qg cmVtb3ZlIG15IG5hbWUgZnJvbSB0aGUgc291cmNlIG9yCi0gKiBkb2N1bWVudGF0aW9uIChkb24n dCB0YWtlIGNyZWRpdCBmb3IgbXkgd29yayksIG1hcmsgeW91ciBjaGFuZ2VzIChkb24ndAotICog Z2V0IG1lIGJsYW1lZCBmb3IgeW91ciBwb3NzaWJsZSBidWdzKSwgZG9uJ3QgYWx0ZXIgb3IgcmVt b3ZlIHRoaXMKLSAqIG5vdGljZS4gIE1heSBiZSBzb2xkIGlmIGJ1aWxkYWJsZSBzb3VyY2UgaXMg cHJvdmlkZWQgdG8gYnV5ZXIuICBObwotICogd2FycmFudGVlIG9mIGFueSBraW5kLCBleHByZXNz IG9yIGltcGxpZWQsIGlzIGluY2x1ZGVkIHdpdGggdGhpcwotICogc29mdHdhcmU7IHVzZSBhdCB5 b3VyIG93biByaXNrLCByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyAoaWYgYW55KSB0bwotICog YW55b25lIHJlc3VsdGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSByZXN0cyBlbnRp cmVseSB3aXRoIHRoZQotICogdXNlci4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2Rp ZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRo IG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92 ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIg aW4gYWxsIGNvcGllcy4KICAqCi0gKiBTZW5kIGJ1ZyByZXBvcnRzLCBidWcgZml4ZXMsIGVuaGFu Y2VtZW50cywgcmVxdWVzdHMsIGZsYW1lcywgZXRjLiwgYW5kCi0gKiBJJ2xsIHRyeSB0byBrZWVw IGEgdmVyc2lvbiB1cCB0byBkYXRlLiAgSSBjYW4gYmUgcmVhY2hlZCBhcyBmb2xsb3dzOgotICog UGF1bCBWaXhpZSAgICAgICAgICA8cGF1bEB2aXguY29tPiAgICAgICAgICB1dW5ldCFkZWN3cmwh dml4aWUhcGF1bAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElTQyBE SVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUg SU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBB TkQgRklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIElTQyBCRSBMSUFCTEUgRk9SCisgKiBBTlkg U1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFO WSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRB IE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElH RU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCisgKiBPRiBPUiBJTiBD T05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgog ICovCiAKLS8qIGNvbmZpZy5oIC0gY29uZmlndXJhYmxlcyBmb3IgVml4aWUgQ3JvbgorLyogY29u ZmlnLmggLSBjb25maWd1cmFibGVzIGZvciBJU0MgQ3JvbgogICoKLSAqICRGcmVlQlNEOiByZWxl YXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL2Nyb24vY29uZmlnLmggNTA0NzkgMTk5OS0wOC0yOCAw MTozNTo1OVogcGV0ZXIgJAorICogJElkOiBjb25maWcuaCx2IDEuMTAgMjAwNC8wMS8yMyAxODo1 Njo0MiB2aXhpZSBFeHAgJAogICovCiAKLSNpZiAhZGVmaW5lZChfUEFUSF9TRU5ETUFJTCkKLSMg ZGVmaW5lIF9QQVRIX1NFTkRNQUlMICIvdXNyL2xpYi9zZW5kbWFpbCIKLSNlbmRpZiAvKlNFTkRN QUlMKi8KLQogLyoKICAqIHRoZXNlIGFyZSBzaXRlLWRlcGVuZGVudAogICovCkBAIC0zMyw0NCAr MzMsMzggQEAKICNlbmRpZgogCiAJCQkvKgotCQkJICogY2hvb3NlIG9uZSBvZiB0aGVzZSBNQUlM Q01EIGNvbW1hbmRzLiAgSSB1c2UKKwkJCSAqIGNob29zZSBvbmUgb2YgdGhlc2UgbWFpbGVyIGNv bW1hbmRzLiAgc29tZSB1c2UKIAkJCSAqIC9iaW4vbWFpbCBmb3Igc3BlZWQ7IGl0IG1ha2VzIGJp ZmYgYmFyayBidXQgZG9lc24ndAotCQkJICogZG8gYWxpYXNpbmcuICAvdXNyL2xpYi9zZW5kbWFp bCBkb2VzIGFsaWFzaW5nIGJ1dCBpcworCQkJICogZG8gYWxpYXNpbmcuICBzZW5kbWFpbCBkb2Vz IGRvIGFsaWFzaW5nIGJ1dCBpcwogCQkJICogYSBob2cgZm9yIHNob3J0IG1lc3NhZ2VzLiAgYWxp YXNpbmcgaXMgbm90IG5lZWRlZAogCQkJICogaWYgeW91IG1ha2UgdXNlIG9mIHRoZSBNQUlMVE89 IGZlYXR1cmUgaW4gY3JvbnRhYnMuCiAJCQkgKiAoaGludDogTUFJTFRPPSB3YXMgYWRkZWQgZm9y IHRoaXMgcmVhc29uKS4KIAkJCSAqLwogCi0jZGVmaW5lIE1BSUxDTUQgX1BBVEhfU0VORE1BSUwJ CQkJCS8qLSovCi0jZGVmaW5lIE1BSUxBUkdTICIlcyAtRkNyb25EYWVtb24gLW9kaSAtb2VtIC1v aSAtdCIgICAgICAgICAgICAgLyotKi8KLQkJCS8qIC1GeAkgPSBzZXQgZnVsbC1uYW1lIG9mIHNl bmRlcgorI2RlZmluZSBNQUlMRk1UICIlcyAtRkNyb25EYWVtb24gLW9kaSAtb2VtIC1vaSAtdCIg LyotKi8KKwkJCS8qIC1GeAkgPSBTZXQgZnVsbC1uYW1lIG9mIHNlbmRlcgogCQkJICogLW9kaQkg PSBPcHRpb24gRGVsaXZlcnltb2RlIEludGVyYWN0aXZlCiAJCQkgKiAtb2VtCSA9IE9wdGlvbiBF cnJvcnMgTWFpbGVkdG9zZW5kZXIKLQkJCSAqIC1vaSAgID0gT3B0aW9uIGRvdCBtZXNzYWdlIHRl cm1pbmF0b3IKLQkJCSAqIC10ICAgID0gcmVhZCByZWNpcGllbnRzIGZyb20gaGVhZGVyIG9mIG1l c3NhZ2UKKwkJCSAqIC1vaSAgID0gSWdub3JlICIuIiBhbG9uZSBvbiBhIGxpbmUKKwkJCSAqIC10 ICAgID0gR2V0IHJlY2lwaWVudCBmcm9tIGhlYWRlcnMKIAkJCSAqLworI2RlZmluZSBNQUlMQVJH IF9QQVRIX1NFTkRNQUlMCQkJCS8qLSovCiAKLS8qICNkZWZpbmUgTUFJTENNRCAiL2Jpbi9tYWls IiAqLwkJLyotKi8KLS8qICNkZWZpbmUgTUFJTEFSR1MgIiVzIC1kICAlcyIgKi8JCS8qLSovCi0J CQkvKiAtZCA9IHVuZG9jdW1lbnRlZCBidXQgY29tbW9uIGZsYWc6IGRlbGl2ZXIgbG9jYWxseT8K Ky8qICNkZWZpbmUgTUFJTEZNVCAiJXMgLWQgJXMiCQkJCQorCQkJIC1kID0gdW5kb2N1bWVudGVk IGJ1dCBjb21tb24gZmxhZzogZGVsaXZlciBsb2NhbGx5PwogCQkJICovCisvKiAjZGVmaW5lIE1B SUxBUkcgIi9iaW4vbWFpbCIsbWFpbHRvICovCiAKLS8qICNkZWZpbmUgTUFJTENNRCAiL3Vzci9t bWRmL2Jpbi9zdWJtaXQiICovCS8qLSovCi0vKiAjZGVmaW5lIE1BSUxBUkdTICIlcyAtbWxyeHRv ICVzIiAqLwkJLyotKi8KKy8qICNkZWZpbmUgTUFJTEZNVCAiJXMgLW1scnh0byAlcyIJCQkqLwor LyogI2RlZmluZSBNQUlMQVJHICIvdXNyL21tZGYvYmluL3N1Ym1pdCIsbWFpbHRvCSovCiAKLS8q ICNkZWZpbmUgTUFJTF9EQVRFICovCQkJCS8qLSovCisvKiAjZGVmaW5lIE1BSUxfREFURQkJCQkq LwogCQkJLyogc2hvdWxkIHdlIGluY2x1ZGUgYW4gZXJzYXR6IERhdGU6IGhlYWRlciBpbgogCQkJ ICogZ2VuZXJhdGVkIG1haWw/ICBpZiB5b3UgYXJlIHVzaW5nIHNlbmRtYWlsCi0JCQkgKiBmb3Ig TUFJTENNRCwgaXQgaXMgYmV0dGVyIHRvIGxldCBzZW5kbWFpbAorCQkJICogYXMgdGhlIG1haWxl ciwgaXQgaXMgYmV0dGVyIHRvIGxldCBzZW5kbWFpbAogCQkJICogZ2VuZXJhdGUgdGhlIERhdGU6 IGhlYWRlci4KIAkJCSAqLwogCi0JCQkvKiBpZiBBTExPV19GSUxFIGFuZCBERU5ZX0ZJTEUgYXJl IG5vdCBkZWZpbmVkIG9yIGFyZQotCQkJICogZGVmaW5lZCBidXQgbmVpdGhlciBleGlzdHMsIHNo b3VsZCBjcm9udGFiKDEpIGJlCi0JCQkgKiB1c2FibGUgb25seSBieSByb290PwotCQkJICovCi0v KiAjZGVmaW5lIEFMTE9XX09OTFlfUk9PVCAqLwkJCS8qLSovCi0KIAkJCS8qIGlmIHlvdSB3YW50 IHRvIHVzZSBzeXNsb2coMykgaW5zdGVhZCBvZiBhcHBlbmRpbmcKIAkJCSAqIHRvIENST05ESVIv TE9HX0ZJTEUgKC92YXIvY3Jvbi9sb2csIGUuZy4pLCBkZWZpbmUKIAkJCSAqIFNZU0xPRyBoZXJl LiAgTm90ZSB0aGF0IHF1aXRlIGEgYml0IG9mIGxvZ2dpbmcKQEAgLTg1LDMgKzc5LDI3IEBACiAJ CQkgKiBwbGFjZXMuCiAJCQkgKi8KICNkZWZpbmUgU1lTTE9HCSAJCQkvKi0qLworCisJCQkvKiBp ZiB5b3Ugd2FudCBjcm9uIHRvIGNhcGl0YWxpemUgaXRzIG5hbWUgaW4gcHMKKwkJCSAqIHdoZW4g cnVubmluZyBhIGpvYi4gIERvZXMgbm90IHdvcmsgb24gU1lTVi4KKwkJCSAqLworLyojZGVmaW5l IENBUElUQUxJWkVfRk9SX1BTCQkqLworCisJCQkvKiBpZiB5b3UgaGF2ZSBhIHRtX2dtdG9mZiBt ZW1iZXIgaW4gc3RydWN0IHRtLgorCQkJICogSWYgbm90LCB3ZSB3aWxsIGhhdmUgdG8gY29tcHV0 ZSB0aGUgdmFsdWUgb3Vyc2VsdmVzLgorCQkJICovCisvKiNkZWZpbmUgSEFWRV9UTV9HTVRPRkYJ CSovCisKKwkJCS8qIGlmIHlvdXIgT1Mgc3VwcG9ydHMgYSBCU0Qtc3R5bGUgbG9naW4uY29uZiBm aWxlICovCisvKiNkZWZpbmUgTE9HSU5fQ0FQCQkJKi8KKworCQkJLyogaWYgeW91ciBPUyBzdXBw b3J0cyBCU0QgYXV0aGVudGljYXRpb24gKi8KKy8qI2RlZmluZSBCU0RfQVVUSAkJCSovCisKKwkJ CS8qIERlZmluZSB0aGlzIHRvIHJ1biBjcm9udGFiIHNldGdpZCBpbnN0ZWFkIG9mICAgCisJCQkg KiBzZXR1aWQgcm9vdC4gIEdyb3VwIGFjY2VzcyB3aWxsIGJlIHVzZWQgdG8gcmVhZAorCQkJICog dGhlIHRhYnMvYXRqb2JzIGRpcnMgYW5kIHRoZSBhbGxvdy9kZW55IGZpbGVzLgorCQkJICogSWYg dGhpcyBpcyBub3QgZGVmaW5lZCB0aGVuIGNyb250YWIgYW5kIGF0CisJCQkgKiBtdXN0IGJlIHNl dHVpZCByb290LgorCQkJICovCisvKiNkZWZpbmUgQ1JPTl9HUk9VUAkiY3JvbnRhYiIJKi8KZGlm ZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi9jcm9uLjggZnJlZWJzZF9jcm9uL2Ny b24vY3Jvbi44Ci0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb24vY3Jvbi44CTIwMTQtMDEt MTYgMjE6NDM6NDkuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vY3Jvbi9jcm9uLjgJ MjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzI0NDQyNzYgKzAyMDAKQEAgLTE1LDcgKzE1LDcgQEAKIC5c IiAqIFBhdWwgVml4aWUgICAgICAgICAgPHBhdWxAdml4LmNvbT4gICAgICAgICAgdXVuZXQhZGVj d3JsIXZpeGllIXBhdWwKIC5cIiAqLwogLlwiCi0uXCIgJEZyZWVCU0Q6IHJlbGVhc2UvMTAuMC4w L3Vzci5zYmluL2Nyb24vY3Jvbi9jcm9uLjggMTgwMDk2IDIwMDgtMDYtMjkgMTY6NTY6MThaIG1h cmNrICQKKy5cIiAkRnJlZUJTRDogcmVsZW5nLzEwLjAvdXNyLnNiaW4vY3Jvbi9jcm9uL2Nyb24u OCAxODAwOTYgMjAwOC0wNi0yOSAxNjo1NjoxOFogbWFyY2sgJAogLlwiCiAuRGQgSnVuZSAyOSwg MjAwOAogLkR0IENST04gOApkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL2Ny b24uYyBmcmVlYnNkX2Nyb24vY3Jvbi9jcm9uLmMKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24v Y3Jvbi9jcm9uLmMJMjAxNC0wMS0xNiAyMTo0Mzo0OS4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVi c2RfY3Jvbi9jcm9uL2Nyb24uYwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3MjQ0NDI3NiArMDIwMApA QCAtMSwxNDIgKzEsMTM3IEBACiAvKiBDb3B5cmlnaHQgMTk4OCwxOTkwLDE5OTMsMTk5NCBieSBQ YXVsIFZpeGllCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKi8KKworLyoKKyAqIENvcHlyaWdo dCAoYykgMjAwNCBieSBJbnRlcm5ldCBTeXN0ZW1zIENvbnNvcnRpdW0sIEluYy4gKCJJU0MiKQor ICogQ29weXJpZ2h0IChjKSAxOTk3LDIwMDAgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1 bSwgSW5jLgogICoKLSAqIERpc3RyaWJ1dGUgZnJlZWx5LCBleGNlcHQ6IGRvbid0IHJlbW92ZSBt eSBuYW1lIGZyb20gdGhlIHNvdXJjZSBvcgotICogZG9jdW1lbnRhdGlvbiAoZG9uJ3QgdGFrZSBj cmVkaXQgZm9yIG15IHdvcmspLCBtYXJrIHlvdXIgY2hhbmdlcyAoZG9uJ3QKLSAqIGdldCBtZSBi bGFtZWQgZm9yIHlvdXIgcG9zc2libGUgYnVncyksIGRvbid0IGFsdGVyIG9yIHJlbW92ZSB0aGlz Ci0gKiBub3RpY2UuICBNYXkgYmUgc29sZCBpZiBidWlsZGFibGUgc291cmNlIGlzIHByb3ZpZGVk IHRvIGJ1eWVyLiAgTm8KLSAqIHdhcnJhbnRlZSBvZiBhbnkga2luZCwgZXhwcmVzcyBvciBpbXBs aWVkLCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMKLSAqIHNvZnR3YXJlOyB1c2UgYXQgeW91ciBvd24g cmlzaywgcmVzcG9uc2liaWxpdHkgZm9yIGRhbWFnZXMgKGlmIGFueSkgdG8KLSAqIGFueW9uZSBy ZXN1bHRpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUgcmVzdHMgZW50aXJlbHkgd2l0 aCB0aGUKLSAqIHVzZXIuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQg ZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRo b3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNv cHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBj b3BpZXMuCiAgKgotICogU2VuZCBidWcgcmVwb3J0cywgYnVnIGZpeGVzLCBlbmhhbmNlbWVudHMs IHJlcXVlc3RzLCBmbGFtZXMsIGV0Yy4sIGFuZAotICogSSdsbCB0cnkgdG8ga2VlcCBhIHZlcnNp b24gdXAgdG8gZGF0ZS4gIEkgY2FuIGJlIHJlYWNoZWQgYXMgZm9sbG93czoKLSAqIFBhdWwgVml4 aWUgICAgICAgICAgPHBhdWxAdml4LmNvbT4gICAgICAgICAgdXVuZXQhZGVjd3JsIXZpeGllIXBh dWwKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJU0MgRElTQ0xBSU1T IEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElO RyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F U1MuICBJTiBOTyBFVkVOVCBTSEFMTCBJU0MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUws IERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdF UworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9G SVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Ig T1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVAorICogT0YgT1IgSU4gQ09OTkVDVElP TiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCi0j aWYgIWRlZmluZWQobGludCkgJiYgIWRlZmluZWQoTElOVCkKLXN0YXRpYyBjb25zdCBjaGFyIHJj c2lkW10gPQotICAiJEZyZWVCU0Q6IHJlbGVhc2UvMTAuMC4wL3Vzci5zYmluL2Nyb24vY3Jvbi9j cm9uLmMgMjQyMTAxIDIwMTItMTAtMjUgMjI6NTQ6MjlaIHNvYm9tYXggJCI7Ci0jZW5kaWYKKy8v I2lmICFkZWZpbmVkKGxpbnQpICYmICFkZWZpbmVkKExJTlQpCisvL3N0YXRpYyBjaGFyIHJjc2lk W10gPSAiJElkOiBjcm9uLmMsdiAxLjEyIDIwMDQvMDEvMjMgMTg6NTY6NDIgdml4aWUgRXhwICQi OworLy8jZW5kaWYKIAogI2RlZmluZQlNQUlOX1BST0dSQU0KLQorI2luY2x1ZGUgPGxpYnV0aWwu aD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgogCiAjaW5jbHVkZSAiY3Jvbi5oIgotI2luY2x1ZGUg PHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgotI2lmIFNZU19USU1FX0gKLSMg aW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHRpbWUuaD4KLSNlbmRpZgog CitlbnVtIHRpbWVqdW1wIHsgbmVnYXRpdmUsIHNtYWxsLCBtZWRpdW0sIGxhcmdlIH07CiAKIHN0 YXRpYwl2b2lkCXVzYWdlKHZvaWQpLAogCQlydW5fcmVib290X2pvYnMoY3Jvbl9kYiAqKSwKLQkJ Y3Jvbl90aWNrKGNyb25fZGIgKiwgaW50KSwKLQkJY3Jvbl9zeW5jKGludCksCi0JCWNyb25fc2xl ZXAoY3Jvbl9kYiAqLCBpbnQpLAotCQljcm9uX2NsZWFuKGNyb25fZGIgKiksCi0jaWZkZWYgVVNF X1NJR0NITEQKKwkJZmluZF9qb2JzKGludCwgY3Jvbl9kYiAqLCBpbnQsIGludCksCisJCXNldF90 aW1lKGludCksCisJCWNyb25fc2xlZXAoaW50KSwKIAkJc2lnY2hsZF9oYW5kbGVyKGludCksCi0j ZW5kaWYKIAkJc2lnaHVwX2hhbmRsZXIoaW50KSwKKwkJc2lnY2hsZF9yZWFwZXIodm9pZCksCisJ CXF1aXQoaW50KSwKIAkJcGFyc2VfYXJncyhpbnQgYywgY2hhciAqdltdKTsKIAotc3RhdGljIGlu dAlydW5fYXRfc2VjcmVzKGNyb25fZGIgKik7Ci0KLXN0YXRpYyB0aW1lX3QJbGFzdF90aW1lID0g MDsKLXN0YXRpYyBpbnQJZHN0X2VuYWJsZWQgPSAwOwotc3RydWN0IHBpZGZoICpwZmg7CitzdGF0 aWMJdm9sYXRpbGUgc2lnX2F0b21pY190CWdvdF9zaWdodXAsIGdvdF9zaWdjaGxkOworc3RhdGlj CWludAkJCXRpbWVSdW5uaW5nLCB2aXJ0dWFsVGltZSwgY2xvY2tUaW1lOworc3RhdGljICBpbnQJ CQljcm9uU29jazsKK3N0YXRpYwlsb25nCQkJR01Ub2ZmOworc3RhdGljICBjcm9uX2RiIAkJZGF0 YWJhc2U7CiAKK3N0cnVjdCBwaWRmaAkJCSpwZmg7CiBzdGF0aWMgdm9pZAotdXNhZ2UoKSB7Ci0j aWYgREVCVUdHSU5HCi0gICAgY2hhciAqKmRmbGFnczsKLSNlbmRpZgotCi0JZnByaW50ZihzdGRl cnIsICJ1c2FnZTogY3JvbiBbLWogaml0dGVyXSBbLUogcm9vdGppdHRlcl0gIgotCQkJIlstbSBt YWlsdG9dIFstc10gWy1vXSBbLXggZGVidWdmbGFnWywuLi5dXVxuIik7Ci0jaWYgREVCVUdHSU5H Ci0JZnByaW50ZihzdGRlcnIsICJcbmRlYnVnZmxhZ3M6ICIpOwordXNhZ2Uodm9pZCkgeworCWNv bnN0IGNoYXIgKipkZmxhZ3M7CiAKLSAgICAgICAgZm9yKGRmbGFncyA9IERlYnVnRmxhZ05hbWVz OyAqZGZsYWdzOyBkZmxhZ3MrKykgewotCQlmcHJpbnRmKHN0ZGVyciwgIiVzICIsICpkZmxhZ3Mp OwotCX0KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotI2VuZGlmCisJZnByaW50Zihz dGRlcnIsICJ1c2FnZTogY3JvbiBbLWogaml0dGVyXSBbLUogcm9vdGppdHRlcl0gIik7CisJZnBy aW50ZihzdGRlcnIsICIlcyBbLW5dIFsteCBbIiwgUHJvZ3JhbU5hbWUpOworCWZvciAoZGZsYWdz ID0gRGVidWdGbGFnTmFtZXM7ICpkZmxhZ3M7IGRmbGFncysrKQorCQlmcHJpbnRmKHN0ZGVyciwg IiVzJXMiLCAqZGZsYWdzLCBkZmxhZ3NbMV0gPyAiLCIgOiAiXSIpOwogCisJZnByaW50ZihzdGRl cnIsICJdXG4iKTsKIAlleGl0KEVSUk9SX0VYSVQpOwogfQogCiBzdGF0aWMgdm9pZAogb3Blbl9w aWRmaWxlKHZvaWQpCiB7Ci0JY2hhcglwaWRmaWxlW01BWF9GTkFNRV07Ci0JY2hhcglidWZbTUFY X1RFTVBTVFJdOwotCWludAlvdGhlcnBpZDsKLQotCSh2b2lkKSBzbnByaW50ZihwaWRmaWxlLCBz aXplb2YocGlkZmlsZSksIFBJREZJTEUsIFBJRERJUik7Ci0JcGZoID0gcGlkZmlsZV9vcGVuKHBp ZGZpbGUsIDA2MDAsICZvdGhlcnBpZCk7Ci0JaWYgKHBmaCA9PSBOVUxMKSB7Ci0JCWlmIChlcnJu byA9PSBFRVhJU1QpIHsKLQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCQkgICAgImNy b24gYWxyZWFkeSBydW5uaW5nLCBwaWQ6ICVkIiwgb3RoZXJwaWQpOwotCQl9IGVsc2UgewotCQkJ c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCSAgICAiY2FuJ3Qgb3BlbiBvciBjcmVhdGUg JXM6ICVzIiwgcGlkZmlsZSwKLQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQl9Ci0JCWxvZ19p dCgiQ1JPTiIsIGdldHBpZCgpLCAiREVBVEgiLCBidWYpOwotCQllcnJ4KEVSUk9SX0VYSVQsICIl cyIsIGJ1Zik7Ci0JfQorICAgICAgICBjaGFyICAgIHBpZGZpbGVbTUFYX0ZOQU1FXTsKKyAgICAg ICAgY2hhciAgICBidWZbTUFYX1RFTVBTVFJdOworICAgICAgICBpbnQgICAgIG90aGVycGlkOwor CisgICAgICAgICh2b2lkKSBzbnByaW50ZihwaWRmaWxlLCBzaXplb2YocGlkZmlsZSksIFBJREZJ TEUsIFBJRERJUik7CisgICAgICAgIHBmaCA9IHBpZGZpbGVfb3BlbihwaWRmaWxlLCAwNjAwLCAm b3RoZXJwaWQpOworICAgICAgICBpZiAocGZoID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBp ZiAoZXJybm8gPT0gRUVYSVNUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50Zihi dWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9uIGFscmVh ZHkgcnVubmluZywgcGlkOiAlZCIsIG90aGVycGlkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2Ug eworICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3Qgb3BlbiBvciBjcmVhdGUgJXM6ICVzIiwg cGlkZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwor ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2dfaXQoIkNST04iLCBnZXRwaWQo KSwgIkRFQVRIIiwgYnVmKTsKKyAgICAgICAgICAgICAgICBlcnJ4KEVSUk9SX0VYSVQsICIlcyIs IGJ1Zik7CisgICAgICAgIH0KIH0KIAogaW50Ci1tYWluKGFyZ2MsIGFyZ3YpCi0JaW50CWFyZ2M7 Ci0JY2hhcgkqYXJndltdOwotewotCWNyb25fZGIJZGF0YWJhc2U7Ci0JaW50IHJ1bm51bTsKLQlp bnQgc2VjcmVzMSwgc2VjcmVzMjsKLQlzdHJ1Y3QgdG0gKnRtOworbWFpbihpbnQgYXJnYywgY2hh ciAqYXJndltdKSB7CisJc3RydWN0IHNpZ2FjdGlvbiBzYWN0OwogCiAJUHJvZ3JhbU5hbWUgPSBh cmd2WzBdOwogCisJc2V0bG9jYWxlKExDX0FMTCwgIiIpOworCiAjaWYgZGVmaW5lZChCU0QpCiAJ c2V0bGluZWJ1ZihzdGRvdXQpOwogCXNldGxpbmVidWYoc3RkZXJyKTsKICNlbmRpZgogCisJTm9G b3JrID0gMDsKIAlwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpOwogCi0jaWZkZWYgVVNFX1NJR0NITEQK LQkodm9pZCkgc2lnbmFsKFNJR0NITEQsIHNpZ2NobGRfaGFuZGxlcik7Ci0jZWxzZQotCSh2b2lk KSBzaWduYWwoU0lHQ0xELCBTSUdfSUdOKTsKKwliemVybygoY2hhciAqKSZzYWN0LCBzaXplb2Yg c2FjdCk7CisJc2lnZW1wdHlzZXQoJnNhY3Quc2FfbWFzayk7CisJc2FjdC5zYV9mbGFncyA9IDA7 CisjaWZkZWYgU0FfUkVTVEFSVAorCXNhY3Quc2FfZmxhZ3MgfD0gU0FfUkVTVEFSVDsKICNlbmRp ZgotCSh2b2lkKSBzaWduYWwoU0lHSFVQLCBzaWdodXBfaGFuZGxlcik7CisJc2FjdC5zYV9oYW5k bGVyID0gc2lnY2hsZF9oYW5kbGVyOworCSh2b2lkKSBzaWdhY3Rpb24oU0lHQ0hMRCwgJnNhY3Qs IE5VTEwpOworCXNhY3Quc2FfaGFuZGxlciA9IHNpZ2h1cF9oYW5kbGVyOworCSh2b2lkKSBzaWdh Y3Rpb24oU0lHSFVQLCAmc2FjdCwgTlVMTCk7CisJc2FjdC5zYV9oYW5kbGVyID0gcXVpdDsKKwko dm9pZCkgc2lnYWN0aW9uKFNJR0lOVCwgJnNhY3QsIE5VTEwpOworCSh2b2lkKSBzaWdhY3Rpb24o U0lHVEVSTSwgJnNhY3QsIE5VTEwpOwogCiAJb3Blbl9waWRmaWxlKCk7CisJY3JvblNvY2sgPSBv cGVuX3NvY2tldCgpOwogCXNldF9jcm9uX3VpZCgpOwogCXNldF9jcm9uX2N3ZCgpOwogCi0jaWYg ZGVmaW5lZChQT1NJWCkKLQlzZXRlbnYoIlBBVEgiLCBfUEFUSF9ERUZQQVRILCAxKTsKLSNlbmRp ZgorCWlmIChwdXRlbnYoIlBBVEg9Il9QQVRIX0RFRlBBVEgpIDwgMCkgeworCQlsb2dfaXQoIkNS T04iLCBnZXRwaWQoKSwgIkRFQVRIIiwgImNhbid0IG1hbGxvYyIpOworCQlleGl0KDEpOworCX0K IAogCS8qIGlmIHRoZXJlIGFyZSBubyBkZWJ1ZyBmbGFncyB0dXJuZWQgb24sIGZvcmsgYXMgYSBk YWVtb24gc2hvdWxkLgogCSAqLwotIyBpZiBERUJVR0dJTkcKIAlpZiAoRGVidWdGbGFncykgewot IyBlbHNlCi0JaWYgKDApIHsKLSMgZW5kaWYKLQkJKHZvaWQpIGZwcmludGYoc3RkZXJyLCAiWyVk XSBjcm9uIHN0YXJ0ZWRcbiIsIGdldHBpZCgpKTsKLQl9IGVsc2UgeworI2lmIERFQlVHR0lORwor CQkodm9pZCkgZnByaW50ZihzdGRlcnIsICJbJWxkXSBjcm9uIHN0YXJ0ZWRcbiIsIChsb25nKWdl dHBpZCgpKTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoTm9Gb3JrID09IDApIHsKIAkJaWYgKGRhZW1v bigxLCAwKSA9PSAtMSkgewogCQkJcGlkZmlsZV9yZW1vdmUocGZoKTsKIAkJCWxvZ19pdCgiQ1JP TiIsZ2V0cGlkKCksIkRFQVRIIiwiY2FuJ3QgYmVjb21lIGRhZW1vbiIpOwpAQCAtMTQ1LDE2MCAr MTQwLDE4MCBAQAogCX0KIAogCWlmIChtYWR2aXNlKE5VTEwsIDAsIE1BRFZfUFJPVEVDVCkgIT0g MCkKLQkJbG9nX2l0KCJDUk9OIiwgZ2V0cGlkKCksICJXQVJOSU5HIiwgIm1hZHZpc2UoKSBmYWls ZWQiKTsKKwkJbG9nX2l0KCJDUk9OIiwgZ2V0cGlkKCksICJXQVJOSU5HIiwgIm1hZHZpc2UoKSBm aWxlZCIpOwogCiAJcGlkZmlsZV93cml0ZShwZmgpOwogCWRhdGFiYXNlLmhlYWQgPSBOVUxMOwog CWRhdGFiYXNlLnRhaWwgPSBOVUxMOwogCWRhdGFiYXNlLm10aW1lID0gKHRpbWVfdCkgMDsKIAls b2FkX2RhdGFiYXNlKCZkYXRhYmFzZSk7Ci0Jc2VjcmVzMSA9IHNlY3JlczIgPSBydW5fYXRfc2Vj cmVzKCZkYXRhYmFzZSk7CisJc2V0X3RpbWUoVFJVRSk7CiAJcnVuX3JlYm9vdF9qb2JzKCZkYXRh YmFzZSk7Ci0JY3Jvbl9zeW5jKHNlY3JlczEpOwotCXJ1bm51bSA9IDA7CisJdGltZVJ1bm5pbmcg PSB2aXJ0dWFsVGltZSA9IGNsb2NrVGltZTsKKworCS8qCisJICogVG9vIG1hbnkgY2xvY2tzLCBu b3QgZW5vdWdoIHRpbWUgKEFsLiBFaW5zdGVpbikKKwkgKiBUaGVzZSBjbG9ja3MgYXJlIGluIG1p bnV0ZXMgc2luY2UgdGhlIGVwb2NoLCBhZGp1c3RlZCBmb3IgdGltZXpvbmUuCisJICogdmlydHVh bFRpbWU6IGlzIHRoZSB0aW1lIGl0ICp3b3VsZCogYmUgaWYgd2Ugd29rZSB1cAorCSAqIHByb21w dGx5IGFuZCBub2JvZHkgZXZlciBjaGFuZ2VkIHRoZSBjbG9jay4gSXQgaXMKKwkgKiBtb25vdG9u aWNhbGx5IGluY3JlYXNpbmcuLi4gdW5sZXNzIGEgdGltZWp1bXAgaGFwcGVucy4KKwkgKiBBdCB0 aGUgdG9wIG9mIHRoZSBsb29wLCBhbGwgam9icyBmb3IgJ3ZpcnR1YWxUaW1lJyBoYXZlIHJ1bi4K KwkgKiB0aW1lUnVubmluZzogaXMgdGhlIHRpbWUgd2UgbGFzdCBhd2FrZW5lZC4KKwkgKiBjbG9j a1RpbWU6IGlzIHRoZSB0aW1lIHdoZW4gc2V0X3RpbWUgd2FzIGxhc3QgY2FsbGVkLgorCSAqLwog CXdoaWxlIChUUlVFKSB7Ci0jIGlmIERFQlVHR0lORwotCSAgICAvKiBpZiAoIShEZWJ1Z0ZsYWdz ICYgRFRFU1QpKSAqLwotIyBlbmRpZiAvKkRFQlVHR0lORyovCi0JCQljcm9uX3NsZWVwKCZkYXRh YmFzZSwgc2VjcmVzMSk7Ci0KLQkJaWYgKHNlY3JlczEgPT0gMCB8fCBydW5udW0gJSA2MCA9PSAw KSB7Ci0JCQlsb2FkX2RhdGFiYXNlKCZkYXRhYmFzZSk7Ci0JCQlzZWNyZXMyID0gcnVuX2F0X3Nl Y3JlcygmZGF0YWJhc2UpOwotCQkJaWYgKHNlY3JlczIgIT0gc2VjcmVzMSkgewotCQkJCXNlY3Jl czEgPSBzZWNyZXMyOwotCQkJCWlmIChzZWNyZXMxICE9IDApIHsKLQkJCQkJcnVubnVtID0gMDsK LQkJCQl9IGVsc2UgewotCQkJCQkvKgotCQkJCQkgKiBHb2luZyBmcm9tIDEgc2VjIHRvIDYwIHNl YyByZXMuIElmIHdlCi0JCQkJCSAqIGFyZSBhbHJlYWR5IGF0IG1pbnV0ZSdzIGJvdW5kYXJ5LCBz bwotCQkJCQkgKiBsZXQgaXQgcnVuLCBvdGhlcndpc2Ugc2NoZWR1bGUgZm9yIHRoZQotCQkJCQkg KiBuZXh0IG1pbnV0ZS4KLQkJCQkJICovCi0JCQkJCXRtID0gbG9jYWx0aW1lKCZUYXJnZXRUaW1l KTsKLQkJCQkJaWYgKHRtLT50bV9zZWMgPiAwKSAgewotCQkJCQkJY3Jvbl9zeW5jKHNlY3JlczIp OwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9CisJCWludCB0aW1lRGlmZjsKKwkJZW51 bSB0aW1lanVtcCB3YWtldXBLaW5kOworCisJCS8qIC4uLiB3YWl0IGZvciB0aGUgdGltZSAoaW4g bWludXRlcykgdG8gY2hhbmdlIC4uLiAqLworCQlkbyB7CisJCQljcm9uX3NsZWVwKHRpbWVSdW5u aW5nICsgMSk7CisJCQlzZXRfdGltZShGQUxTRSk7CisJCX0gd2hpbGUgKGNsb2NrVGltZSA9PSB0 aW1lUnVubmluZyk7CisJCXRpbWVSdW5uaW5nID0gY2xvY2tUaW1lOworCisJCS8qCisJCSAqIENh bGN1bGF0ZSBob3cgdGhlIGN1cnJlbnQgdGltZSBkaWZmZXJzIGZyb20gb3VyIHZpcnR1YWwKKwkJ ICogY2xvY2suICBDbGFzc2lmeSB0aGUgY2hhbmdlIGludG8gb25lIG9mIDQgY2FzZXMuCisJCSAq LworCQl0aW1lRGlmZiA9IHRpbWVSdW5uaW5nIC0gdmlydHVhbFRpbWU7CisKKwkJLyogc2hvcnRj dXQgZm9yIHRoZSBtb3N0IGNvbW1vbiBjYXNlICovCisJCWlmICh0aW1lRGlmZiA9PSAxKSB7CisJ CQl2aXJ0dWFsVGltZSA9IHRpbWVSdW5uaW5nOworCQkJZmluZF9qb2JzKHZpcnR1YWxUaW1lLCAm ZGF0YWJhc2UsIFRSVUUsIFRSVUUpOworCQl9IGVsc2UgeworCQkJaWYgKHRpbWVEaWZmID4gKDMq TUlOVVRFX0NPVU5UKSB8fAorCQkJICAgIHRpbWVEaWZmIDwgLSgzKk1JTlVURV9DT1VOVCkpCisJ CQkJd2FrZXVwS2luZCA9IGxhcmdlOworCQkJZWxzZSBpZiAodGltZURpZmYgPiA1KQorCQkJCXdh a2V1cEtpbmQgPSBtZWRpdW07CisJCQllbHNlIGlmICh0aW1lRGlmZiA+IDApCisJCQkJd2FrZXVw S2luZCA9IHNtYWxsOworCQkJZWxzZQorCQkJCXdha2V1cEtpbmQgPSBuZWdhdGl2ZTsKKworCQkJ c3dpdGNoICh3YWtldXBLaW5kKSB7CisJCQljYXNlIHNtYWxsOgorCQkJCS8qCisJCQkJICogY2Fz ZSAxOiB0aW1lRGlmZiBpcyBhIHNtYWxsIHBvc2l0aXZlIG51bWJlcgorCQkJCSAqICh3b2tldXAg bGF0ZSkgcnVuIGpvYnMgZm9yIGVhY2ggdmlydHVhbAorCQkJCSAqIG1pbnV0ZSB1bnRpbCBjYXVn aHQgdXAuCisJCQkJICovCisJCQkJRGVidWcoRFNDSCwgKCJbJWxkXSwgbm9ybWFsIGNhc2UgJWQg bWludXRlcyB0byBnb1xuIiwKKwkJCQkgICAgKGxvbmcpZ2V0cGlkKCksIHRpbWVEaWZmKSkKKwkJ CQlkbyB7CisJCQkJCWlmIChqb2JfcnVucXVldWUoKSkKKwkJCQkJCXNsZWVwKDEwKTsKKwkJCQkJ dmlydHVhbFRpbWUrKzsKKwkJCQkJZmluZF9qb2JzKHZpcnR1YWxUaW1lLCAmZGF0YWJhc2UsCisJ CQkJCSAgICBUUlVFLCBUUlVFKTsKKwkJCQl9IHdoaWxlICh2aXJ0dWFsVGltZSA8IHRpbWVSdW5u aW5nKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBtZWRpdW06CisJCQkJLyoKKwkJCQkgKiBjYXNl IDI6IHRpbWVEaWZmIGlzIGEgbWVkaXVtLXNpemVkIHBvc2l0aXZlCisJCQkJICogbnVtYmVyLCBm b3IgZXhhbXBsZSBiZWNhdXNlIHdlIHdlbnQgdG8gRFNUCisJCQkJICogcnVuIHdpbGRjYXJkIGpv YnMgb25jZSwgdGhlbiBydW4gYW55CisJCQkJICogZml4ZWQtdGltZSBqb2JzIHRoYXQgd291bGQg b3RoZXJ3aXNlIGJlCisJCQkJICogc2tpcHBlZCBpZiB3ZSB1c2UgdXAgb3VyIG1pbnV0ZSAocG9z c2libGUsCisJCQkJICogaWYgdGhlcmUgYXJlIGEgbG90IG9mIGpvYnMgdG8gcnVuKSBnbworCQkJ CSAqIGFyb3VuZCB0aGUgbG9vcCBhZ2FpbiBzbyB0aGF0IHdpbGRjYXJkIGpvYnMKKwkJCQkgKiBo YXZlIGEgY2hhbmNlIHRvIHJ1biwgYW5kIHdlIGRvIG91cgorCQkJCSAqIGhvdXNla2VlcGluZy4K KwkJCQkgKi8KKwkJCQlEZWJ1ZyhEU0NILCAoIlslbGRdLCBEU1QgYmVnaW5zICVkIG1pbnV0ZXMg dG8gZ29cbiIsCisJCQkJICAgIChsb25nKWdldHBpZCgpLCB0aW1lRGlmZikpCisJCQkJLyogcnVu IHdpbGRjYXJkIGpvYnMgZm9yIGN1cnJlbnQgbWludXRlICovCisJCQkJZmluZF9qb2JzKHRpbWVS dW5uaW5nLCAmZGF0YWJhc2UsIFRSVUUsIEZBTFNFKTsKKwkKKwkJCQkvKiBydW4gZml4ZWQtdGlt ZSBqb2JzIGZvciBlYWNoIG1pbnV0ZSBtaXNzZWQgKi8KKwkJCQlkbyB7CisJCQkJCWlmIChqb2Jf cnVucXVldWUoKSkKKwkJCQkJCXNsZWVwKDEwKTsKKwkJCQkJdmlydHVhbFRpbWUrKzsKKwkJCQkJ ZmluZF9qb2JzKHZpcnR1YWxUaW1lLCAmZGF0YWJhc2UsCisJCQkJCSAgICBGQUxTRSwgVFJVRSk7 CisJCQkJCXNldF90aW1lKEZBTFNFKTsKKwkJCQl9IHdoaWxlICh2aXJ0dWFsVGltZTwgdGltZVJ1 bm5pbmcgJiYKKwkJCQkgICAgY2xvY2tUaW1lID09IHRpbWVSdW5uaW5nKTsKKwkJCQlicmVhazsK KwkKKwkJCWNhc2UgbmVnYXRpdmU6CisJCQkJLyoKKwkJCQkgKiBjYXNlIDM6IHRpbWVEaWZmIGlz IGEgc21hbGwgb3IgbWVkaXVtLXNpemVkCisJCQkJICogbmVnYXRpdmUgbnVtLCBlZy4gYmVjYXVz ZSBvZiBEU1QgZW5kaW5nLgorCQkJCSAqIEp1c3QgcnVuIHRoZSB3aWxkY2FyZCBqb2JzLiBUaGUg Zml4ZWQtdGltZQorCQkJCSAqIGpvYnMgcHJvYmFibHkgaGF2ZSBhbHJlYWR5IHJ1biwgYW5kIHNo b3VsZAorCQkJCSAqIG5vdCBiZSByZXBlYXRlZC4gIFZpcnR1YWwgdGltZSBkb2VzIG5vdAorCQkJ CSAqIGNoYW5nZSB1bnRpbCB3ZSBhcmUgY2F1Z2h0IHVwLgorCQkJCSAqLworCQkJCURlYnVnKERT Q0gsICgiWyVsZF0sIERTVCBlbmRzICVkIG1pbnV0ZXMgdG8gZ29cbiIsCisJCQkJICAgIChsb25n KWdldHBpZCgpLCB0aW1lRGlmZikpCisJCQkJZmluZF9qb2JzKHRpbWVSdW5uaW5nLCAmZGF0YWJh c2UsIFRSVUUsIEZBTFNFKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyoKKwkJCQkg KiBvdGhlcjogdGltZSBoYXMgY2hhbmdlZCBhICpsb3QqLAorCQkJCSAqIGp1bXAgdmlydHVhbCB0 aW1lLCBhbmQgcnVuIGV2ZXJ5dGhpbmcKKwkJCQkgKi8KKwkJCQlEZWJ1ZyhEU0NILCAoIlslbGRd LCBjbG9jayBqdW1wZWRcbiIsCisJCQkJICAgIChsb25nKWdldHBpZCgpKSkKKwkJCQl2aXJ0dWFs VGltZSA9IHRpbWVSdW5uaW5nOworCQkJCWZpbmRfam9icyh0aW1lUnVubmluZywgJmRhdGFiYXNl LCBUUlVFLCBUUlVFKTsKIAkJCX0KIAkJfQogCi0JCS8qIGRvIHRoaXMgaXRlcmF0aW9uCi0JCSAq LwotCQljcm9uX3RpY2soJmRhdGFiYXNlLCBzZWNyZXMxKTsKKwkJLyogSm9icyB0byBiZSBydW4g KGlmIGFueSkgYXJlIGxvYWRlZDsgY2xlYXIgdGhlIHF1ZXVlLiAqLworCQlqb2JfcnVucXVldWUo KTsKIAotCQkvKiBzbGVlcCAxIG9yIDYwIHNlY29uZHMKLQkJICovCi0JCVRhcmdldFRpbWUgKz0g KHNlY3JlczEgIT0gMCkgPyAxIDogNjA7Ci0JCXJ1bm51bSArPSAxOworCQkvKiBDaGVjayB0byBz ZWUgaWYgd2UgcmVjZWl2ZWQgYSBzaWduYWwgd2hpbGUgcnVubmluZyBqb2JzLiAqLworCQlpZiAo Z290X3NpZ2h1cCkgeworCQkJZ290X3NpZ2h1cCA9IDA7CisJCQlsb2dfY2xvc2UoKTsKKwkJfQor CQlpZiAoZ290X3NpZ2NobGQpIHsKKwkJCWdvdF9zaWdjaGxkID0gMDsKKwkJCXNpZ2NobGRfcmVh cGVyKCk7CisJCX0KKwkJbG9hZF9kYXRhYmFzZSgmZGF0YWJhc2UpOwogCX0KIH0KIAotCiBzdGF0 aWMgdm9pZAotcnVuX3JlYm9vdF9qb2JzKGRiKQotCWNyb25fZGIgKmRiOwotewotCXJlZ2lzdGVy IHVzZXIJCSp1OwotCXJlZ2lzdGVyIGVudHJ5CQkqZTsKK3J1bl9yZWJvb3Rfam9icyhjcm9uX2Ri ICpkYikgeworCXVzZXIgKnU7CisJZW50cnkgKmU7CiAKLQlmb3IgKHUgPSBkYi0+aGVhZDsgIHUg IT0gTlVMTDsgIHUgPSB1LT5uZXh0KSB7Ci0JCWZvciAoZSA9IHUtPmNyb250YWI7ICBlICE9IE5V TEw7ICBlID0gZS0+bmV4dCkgewotCQkJaWYgKGUtPmZsYWdzICYgV0hFTl9SRUJPT1QpIHsKKwlm b3IgKHUgPSBkYi0+aGVhZDsgdSAhPSBOVUxMOyB1ID0gdS0+bmV4dCkgeworCQlmb3IgKGUgPSB1 LT5jcm9udGFiOyBlICE9IE5VTEw7IGUgPSBlLT5uZXh0KSB7CisJCQlpZiAoZS0+ZmxhZ3MgJiBX SEVOX1JFQk9PVCkKIAkJCQlqb2JfYWRkKGUsIHUpOwotCQkJfQogCQl9CiAJfQogCSh2b2lkKSBq b2JfcnVucXVldWUoKTsKIH0KIAotCiBzdGF0aWMgdm9pZAotY3Jvbl90aWNrKGNyb25fZGIgKmRi LCBpbnQgc2VjcmVzKQotewotCXN0YXRpYyBzdHJ1Y3QgdG0JbGFzdHRtOwotCXN0YXRpYyB0aW1l X3QJZGlmZiA9IDAsIC8qIHRpbWUgZGlmZmVyZW5jZSBpbiBzZWNvbmRzIGZyb20gdGhlIGxhc3Qg b2Zmc2V0IGNoYW5nZSAqLwotCQlkaWZmbGltaXQgPSAwOyAvKiBlbmQgcG9pbnQgZm9yIHRoZSB0 aW1lIHpvbmUgY29ycmVjdGlvbiAqLwotCXN0cnVjdCB0bQlvdHp0bTsgLyogdGltZSBpbiB0aGUg b2xkIHRpbWUgem9uZSAqLwotCWludAkJb3R6c2Vjb25kLCBvdHptaW51dGUsIG90emhvdXIsIG90 emRvbSwgb3R6bW9udGgsIG90emRvdzsKLSAJcmVnaXN0ZXIgc3RydWN0IHRtCSp0bSA9IGxvY2Fs dGltZSgmVGFyZ2V0VGltZSk7Ci0JcmVnaXN0ZXIgaW50CQlzZWNvbmQsIG1pbnV0ZSwgaG91ciwg ZG9tLCBtb250aCwgZG93OwotCXJlZ2lzdGVyIHVzZXIJCSp1OwotCXJlZ2lzdGVyIGVudHJ5CQkq ZTsKK2ZpbmRfam9icyhpbnQgdnRpbWUsIGNyb25fZGIgKmRiLCBpbnQgZG9XaWxkLCBpbnQgZG9O b25XaWxkKSB7CisJdGltZV90IHZpcnR1YWxTZWNvbmQgID0gdnRpbWUgKiBTRUNPTkRTX1BFUl9N SU5VVEU7CisJc3RydWN0IHRtICp0bSA9IGdtdGltZSgmdmlydHVhbFNlY29uZCk7CisJaW50IG1p bnV0ZSwgaG91ciwgZG9tLCBtb250aCwgZG93OworCXVzZXIgKnU7CisJZW50cnkgKmU7CiAKIAkv KiBtYWtlIDAtYmFzZWQgdmFsdWVzIG91dCBvZiB0aGVzZSBzbyB3ZSBjYW4gdXNlIHRoZW0gYXMg aW5kaWNpZXMKIAkgKi8KLQlzZWNvbmQgPSAoc2VjcmVzID09IDApID8gMCA6IHRtLT50bV9zZWMg LUZJUlNUX1NFQ09ORDsKIAltaW51dGUgPSB0bS0+dG1fbWluIC1GSVJTVF9NSU5VVEU7CiAJaG91 ciA9IHRtLT50bV9ob3VyIC1GSVJTVF9IT1VSOwogCWRvbSA9IHRtLT50bV9tZGF5IC1GSVJTVF9E T007CiAJbW9udGggPSB0bS0+dG1fbW9uICsxIC8qIDAuLjExIC0+IDEuLjEyICovIC1GSVJTVF9N T05USDsKIAlkb3cgPSB0bS0+dG1fd2RheSAtRklSU1RfRE9XOwogCi0JRGVidWcoRFNDSCwgKCJb JWRdIHRpY2soJWQsJWQsJWQsJWQsJWQsJWQpXG4iLAotCQlnZXRwaWQoKSwgc2Vjb25kLCBtaW51 dGUsIGhvdXIsIGRvbSwgbW9udGgsIGRvdykpCi0KLQlpZiAoZHN0X2VuYWJsZWQgJiYgbGFzdF90 aW1lICE9IDAgCi0JJiYgVGFyZ2V0VGltZSA+IGxhc3RfdGltZSAvKiBleGNsdWRlIHN0ZXBwaW5n IGJhY2sgKi8KLQkmJiB0bS0+dG1fZ210b2ZmICE9IGxhc3R0bS50bV9nbXRvZmYgKSB7Ci0KLQkJ ZGlmZiA9IHRtLT50bV9nbXRvZmYgLSBsYXN0dG0udG1fZ210b2ZmOwotCi0JCWlmICggZGlmZiA+ IDAgKSB7IC8qIFNULT5EU1QgKi8KLQkJCS8qIG1hcmsgam9icyBmb3IgYW4gZWFybGllciBydW4g Ki8KLQkJCWRpZmZsaW1pdCA9IFRhcmdldFRpbWUgKyBkaWZmOwotCQkJZm9yICh1ID0gZGItPmhl YWQ7ICB1ICE9IE5VTEw7ICB1ID0gdS0+bmV4dCkgewotCQkJCWZvciAoZSA9IHUtPmNyb250YWI7 ICBlICE9IE5VTEw7ICBlID0gZS0+bmV4dCkgewotCQkJCQllLT5mbGFncyAmPSB+Tk9UX1VOVElM OwotCQkJCQlpZiAoIGUtPmxhc3RydW4gPj0gVGFyZ2V0VGltZSApCi0JCQkJCQllLT5sYXN0cnVu ID0gMDsKLQkJCQkJLyogbm90IGluY2x1ZGUgdGhlIGVuZHMgb2YgaG91cmx5IHJhbmdlcyAqLwot CQkJCQlpZiAoIGUtPmxhc3RydW4gPCBUYXJnZXRUaW1lIC0gMzYwMCApCi0JCQkJCQllLT5mbGFn cyB8PSBSVU5fQVQ7Ci0JCQkJCWVsc2UKLQkJCQkJCWUtPmZsYWdzICY9IH5SVU5fQVQ7Ci0JCQkJ fQotCQkJfQotCQl9IGVsc2UgeyAvKiBkaWZmIDwgMCA6IERTVC0+U1QgKi8KLQkJCS8qIG1hcmsg am9icyBmb3Igc2tpcHBpbmcgKi8KLQkJCWRpZmZsaW1pdCA9IFRhcmdldFRpbWUgLSBkaWZmOwot CQkJZm9yICh1ID0gZGItPmhlYWQ7ICB1ICE9IE5VTEw7ICB1ID0gdS0+bmV4dCkgewotCQkJCWZv ciAoZSA9IHUtPmNyb250YWI7ICBlICE9IE5VTEw7ICBlID0gZS0+bmV4dCkgewotCQkJCQllLT5m bGFncyB8PSBOT1RfVU5USUw7Ci0JCQkJCWUtPmZsYWdzICY9IH5SVU5fQVQ7Ci0JCQkJfQotCQkJ fQotCQl9Ci0JfQotCi0JaWYgKGRpZmYgIT0gMCkgewotCQkvKiBpZiB0aGUgdGltZSB3YXMgcmVz ZXQgb2YgdGhlIGVuZCBvZiBzcGVjaWFsIHpvbmUgaXMgcmVhY2hlZCAqLwotCQlpZiAobGFzdF90 aW1lID09IDAgfHwgVGFyZ2V0VGltZSA+PSBkaWZmbGltaXQpIHsKLQkJCS8qIGRpc2FibGUgdGhl IFRaIHN3aXRjaCBjaGVja3MgKi8KLQkJCWRpZmYgPSAwOwotCQkJZGlmZmxpbWl0ID0gMDsKLQkJ CWZvciAodSA9IGRiLT5oZWFkOyAgdSAhPSBOVUxMOyAgdSA9IHUtPm5leHQpIHsKLQkJCQlmb3Ig KGUgPSB1LT5jcm9udGFiOyAgZSAhPSBOVUxMOyAgZSA9IGUtPm5leHQpIHsKLQkJCQkJZS0+Zmxh Z3MgJj0gfihSVU5fQVR8Tk9UX1VOVElMKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkv KiBnZXQgdGhlIHRpbWUgaW4gdGhlIG9sZCB0aW1lIHpvbmUgKi8KLQkJCXRpbWVfdCBkaWZmdGlt ZSA9IFRhcmdldFRpbWUgKyB0bS0+dG1fZ210b2ZmIC0gZGlmZjsKLQkJCWdtdGltZV9yKCZkaWZm dGltZSwgJm90enRtKTsKLQotCQkJLyogbWFrZSAwLWJhc2VkIHZhbHVlcyBvdXQgb2YgdGhlc2Ug c28gd2UgY2FuIHVzZSB0aGVtIGFzIGluZGljaWVzCi0JCQkgKi8KLQkJCW90enNlY29uZCA9IChz ZWNyZXMgPT0gMCkgPyAwIDogb3R6dG0udG1fc2VjIC1GSVJTVF9TRUNPTkQ7Ci0JCQlvdHptaW51 dGUgPSBvdHp0bS50bV9taW4gLUZJUlNUX01JTlVURTsKLQkJCW90emhvdXIgPSBvdHp0bS50bV9o b3VyIC1GSVJTVF9IT1VSOwotCQkJb3R6ZG9tID0gb3R6dG0udG1fbWRheSAtRklSU1RfRE9NOwot CQkJb3R6bW9udGggPSBvdHp0bS50bV9tb24gKzEgLyogMC4uMTEgLT4gMS4uMTIgKi8gLUZJUlNU X01PTlRIOwotCQkJb3R6ZG93ID0gb3R6dG0udG1fd2RheSAtRklSU1RfRE9XOwotCQl9Ci0JfQor CURlYnVnKERTQ0gsICgiWyVsZF0gdGljayglZCwlZCwlZCwlZCwlZCkgJXMgJXNcbiIsCisJCSAg ICAgKGxvbmcpZ2V0cGlkKCksIG1pbnV0ZSwgaG91ciwgZG9tLCBtb250aCwgZG93LAorCQkgICAg IGRvV2lsZD8iICI6Ik5vIHdpbGRjYXJkIixkb05vbldpbGQ/IiAiOiJXaWxkY2FyZCBvbmx5Iikp CiAKIAkvKiB0aGUgZG9tL2RvdyBzaXR1YXRpb24gaXMgb2RkLiAgJyogKiAxLDE1ICogU3VuJyB3 aWxsIHJ1biBvbiB0aGUKIAkgKiBmaXJzdCBhbmQgZmlmdGVlbnRoIEFORCBldmVyeSBTdW5kYXk7 ICAnKiAqICogKiBTdW4nIHdpbGwgcnVuICpvbmx5KgpAQCAtMzA2LDI2OSArMzIxLDE5NSBAQAog CSAqIGlzIHdoeSB3ZSBrZWVwICdlLT5kb3dfc3RhcicgYW5kICdlLT5kb21fc3RhcicuICB5ZXMs IGl0J3MgYml6YXJyZS4KIAkgKiBsaWtlIG1hbnkgYml6YXJyZSB0aGluZ3MsIGl0J3MgdGhlIHN0 YW5kYXJkLgogCSAqLwotCWZvciAodSA9IGRiLT5oZWFkOyAgdSAhPSBOVUxMOyAgdSA9IHUtPm5l eHQpIHsKLQkJZm9yIChlID0gdS0+Y3JvbnRhYjsgIGUgIT0gTlVMTDsgIGUgPSBlLT5uZXh0KSB7 CisJZm9yICh1ID0gZGItPmhlYWQ7IHUgIT0gTlVMTDsgdSA9IHUtPm5leHQpIHsKKwkJZm9yIChl ID0gdS0+Y3JvbnRhYjsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkgewogCQkJRGVidWcoRFNDSHxE RVhULCAoInVzZXIgWyVzOiVkOiVkOi4uLl0gY21kPVwiJXNcIlxuIiwKLQkJCQkJICBlbnZfZ2V0 KCJMT0dOQU1FIiwgZS0+ZW52cCksCi0JCQkJCSAgZS0+dWlkLCBlLT5naWQsIGUtPmNtZCkpCi0K LQkJCWlmICggZGlmZiAhPSAwICYmIChlLT5mbGFncyAmIChSVU5fQVR8Tk9UX1VOVElMKSkgKSB7 Ci0JCQkJaWYgKGJpdF90ZXN0KGUtPnNlY29uZCwgb3R6c2Vjb25kKQotCQkJCSAmJiBiaXRfdGVz dChlLT5taW51dGUsIG90em1pbnV0ZSkKLQkJCQkgJiYgYml0X3Rlc3QoZS0+aG91ciwgb3R6aG91 cikKLQkJCQkgJiYgYml0X3Rlc3QoZS0+bW9udGgsIG90em1vbnRoKQotCQkJCSAmJiAoICgoZS0+ ZmxhZ3MgJiBET01fU1RBUikgfHwgKGUtPmZsYWdzICYgRE9XX1NUQVIpKQotCQkJCQkgID8gKGJp dF90ZXN0KGUtPmRvdyxvdHpkb3cpICYmIGJpdF90ZXN0KGUtPmRvbSxvdHpkb20pKQotCQkJCQkg IDogKGJpdF90ZXN0KGUtPmRvdyxvdHpkb3cpIHx8IGJpdF90ZXN0KGUtPmRvbSxvdHpkb20pKQot CQkJCQkpCi0JCQkJICAgKSB7Ci0JCQkJCWlmICggZS0+ZmxhZ3MgJiBSVU5fQVQgKSB7Ci0JCQkJ CQllLT5mbGFncyAmPSB+UlVOX0FUOwotCQkJCQkJZS0+bGFzdHJ1biA9IFRhcmdldFRpbWU7Ci0J CQkJCQlqb2JfYWRkKGUsIHUpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gZWxzZSAKLQkJCQkJ CWUtPmZsYWdzICY9IH5OT1RfVU5USUw7Ci0JCQkJfSBlbHNlIGlmICggZS0+ZmxhZ3MgJiBOT1Rf VU5USUwgKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGJpdF90ZXN0KGUtPnNlY29u ZCwgc2Vjb25kKQotCQkJICYmIGJpdF90ZXN0KGUtPm1pbnV0ZSwgbWludXRlKQotCQkJICYmIGJp dF90ZXN0KGUtPmhvdXIsIGhvdXIpCi0JCQkgJiYgYml0X3Rlc3QoZS0+bW9udGgsIG1vbnRoKQot CQkJICYmICggKChlLT5mbGFncyAmIERPTV9TVEFSKSB8fCAoZS0+ZmxhZ3MgJiBET1dfU1RBUikp CisJCQkgICAgZW52X2dldCgiTE9HTkFNRSIsIGUtPmVudnApLCAKKwkJCSAgICBlLT51aWQsIGUt PmdpZCwgZS0+Y21kKSkKKwkJCWlmIChiaXRfdGVzdChlLT5taW51dGUsIG1pbnV0ZSkgJiYKKwkJ CSAgICBiaXRfdGVzdChlLT5ob3VyLCBob3VyKSAmJgorCQkJICAgIGJpdF90ZXN0KGUtPm1vbnRo LCBtb250aCkgJiYKKwkJCSAgICAoICgoZS0+ZmxhZ3MgJiBET01fU1RBUikgfHwgKGUtPmZsYWdz ICYgRE9XX1NUQVIpKQogCQkJICAgICAgPyAoYml0X3Rlc3QoZS0+ZG93LGRvdykgJiYgYml0X3Rl c3QoZS0+ZG9tLGRvbSkpCiAJCQkgICAgICA6IChiaXRfdGVzdChlLT5kb3csZG93KSB8fCBiaXRf dGVzdChlLT5kb20sZG9tKSkKIAkJCSAgICApCiAJCQkgICApIHsKLQkJCQllLT5mbGFncyAmPSB+ UlVOX0FUOwotCQkJCWUtPmxhc3RydW4gPSBUYXJnZXRUaW1lOwotCQkJCWpvYl9hZGQoZSwgdSk7 CisJCQkJaWYgKChkb05vbldpbGQgJiYKKwkJCQkgICAgIShlLT5mbGFncyAmIChNSU5fU1RBUnxI Ul9TVEFSKSkpIHx8IAorCQkJCSAgICAoZG9XaWxkICYmIChlLT5mbGFncyAmIChNSU5fU1RBUnxI Ul9TVEFSKSkpKQorCQkJCQlqb2JfYWRkKGUsIHUpOwogCQkJfQogCQl9CiAJfQotCi0JbGFzdF90 aW1lID0gVGFyZ2V0VGltZTsKLQlsYXN0dG0gPSAqdG07CiB9CiAKLQotLyogdGhlIHRhc2sgaGVy ZSBpcyB0byBmaWd1cmUgb3V0IGhvdyBsb25nIGl0J3MgZ29pbmcgdG8gYmUgdW50aWwgOjAwIG9m IHRoZQotICogZm9sbG93aW5nIG1pbnV0ZSBhbmQgaW5pdGlhbGl6ZSBUYXJnZXRUaW1lIHRvIHRo aXMgdmFsdWUuICBUYXJnZXRUaW1lCi0gKiB3aWxsIHN1YnNlcXVlbnRseSBzbGlkZSA2MCBzZWNv bmRzIGF0IGEgdGltZSwgd2l0aCBjb3JyZWN0aW9uIGFwcGxpZWQKLSAqIGltcGxpY2l0bHkgaW4g Y3Jvbl9zbGVlcCgpLiAgaXQgd291bGQgYmUgbmljZSB0byBsZXQgY3JvbiBleGVjdXRlIGluCi0g KiB0aGUgImN1cnJlbnQgbWludXRlIiBiZWZvcmUgZ29pbmcgdG8gc2xlZXAsIGJ1dCBieSByZXN0 YXJ0aW5nIGNyb24geW91Ci0gKiBjb3VsZCB0aGVuIGdldCBpdCB0byBleGVjdXRlIGEgZ2l2ZW4g bWludXRlJ3Mgam9icyBtb3JlIHRoYW4gb25jZS4KLSAqIGluc3RlYWQgd2UgaGF2ZSB0aGUgY2hh bmNlIG9mIG1pc3NpbmcgYSBtaW51dGUncyBqb2JzIGNvbXBsZXRlbHksIGJ1dAotICogdGhhdCdz IHNvbWV0aGluZyBzeXNhZG1pbidzIGtub3cgdG8gZXhwZWN0IHdoYXQgd2l0aCBjcmFzaGluZyBj b21wdXRlcnMuLgorLyoKKyAqIFNldCBTdGFydFRpbWUgYW5kIGNsb2NrVGltZSB0byB0aGUgY3Vy cmVudCB0aW1lLgorICogVGhlc2UgYXJlIHVzZWQgZm9yIGNvbXB1dGluZyB3aGF0IHRpbWUgaXQg cmVhbGx5IGlzIHJpZ2h0IG5vdy4KKyAqIE5vdGUgdGhhdCBjbG9ja1RpbWUgaXMgYSB1bml4IHdh bGxjbG9jayB0aW1lIGNvbnZlcnRlZCB0byBtaW51dGVzLgogICovCiBzdGF0aWMgdm9pZAotY3Jv bl9zeW5jKGludCBzZWNyZXMpIHsKLSAJc3RydWN0IHRtICp0bTsKLQotCVRhcmdldFRpbWUgPSB0 aW1lKCh0aW1lX3QqKTApOwotCWlmIChzZWNyZXMgIT0gMCkgewotCQlUYXJnZXRUaW1lICs9IDE7 Ci0JfSBlbHNlIHsKLQkJdG0gPSBsb2NhbHRpbWUoJlRhcmdldFRpbWUpOwotCQlUYXJnZXRUaW1l ICs9ICg2MCAtIHRtLT50bV9zZWMpOwotCX0KLX0KK3NldF90aW1lKGludCBpbml0aWFsaXplKSB7 CisJc3RydWN0IHRtIHRtOworCXN0YXRpYyBpbnQgaXNkc3Q7CiAKLXN0YXRpYyBpbnQKLXRpbWVz cGVjX3N1YnRyYWN0KHN0cnVjdCB0aW1lc3BlYyAqcmVzdWx0LCBzdHJ1Y3QgdGltZXNwZWMgKngs Ci0gICAgc3RydWN0IHRpbWVzcGVjICp5KQotewotCXRpbWVfdCBuc2VjOworCVN0YXJ0VGltZSA9 IHRpbWUoTlVMTCk7CiAKLQkvKiBQZXJmb3JtIHRoZSBjYXJyeSBmb3IgdGhlIGxhdGVyIHN1YnRy YWN0aW9uIGJ5IHVwZGF0aW5nIHkuICovCi0JaWYgKHgtPnR2X25zZWMgPCB5LT50dl9uc2VjKSB7 Ci0JCW5zZWMgPSAoeS0+dHZfbnNlYyAtIHgtPnR2X25zZWMpIC8gMTAwMDAwMDAgKyAxOwotCQl5 LT50dl9uc2VjIC09IDEwMDAwMDAwMDAgKiBuc2VjOwotCQl5LT50dl9zZWMgKz0gbnNlYzsKKwkv KiBXZSBhZGp1c3QgdGhlIHRpbWUgdG8gR01UIHNvIHdlIGNhbiBjYXRjaCBEU1QgY2hhbmdlcy4g Ki8KKwl0bSA9ICpsb2NhbHRpbWUoJlN0YXJ0VGltZSk7CisJaWYgKGluaXRpYWxpemUgfHwgdG0u dG1faXNkc3QgIT0gaXNkc3QpIHsKKwkJaXNkc3QgPSB0bS50bV9pc2RzdDsKKwkJR01Ub2ZmID0g Z2V0X2dtdG9mZigmU3RhcnRUaW1lLCAmdG0pOworCQlEZWJ1ZyhEU0NILCAoIlslbGRdIEdNVG9m Zj0lbGRcbiIsCisJCSAgICAobG9uZylnZXRwaWQoKSwgKGxvbmcpR01Ub2ZmKSkKIAl9Ci0JaWYg KHgtPnR2X25zZWMgLSB5LT50dl9uc2VjID4gMTAwMDAwMDAwMCkgewotCQluc2VjID0gKHgtPnR2 X25zZWMgLSB5LT50dl9uc2VjKSAvIDEwMDAwMDAwMDA7Ci0JCXktPnR2X25zZWMgKz0gMTAwMDAw MDAwMCAqIG5zZWM7Ci0JCXktPnR2X3NlYyAtPSBuc2VjOwotCX0KLSAgICAgCi0JLyogdHZfbnNl YyBpcyBjZXJ0YWlubHkgcG9zaXRpdmUuICovCi0JcmVzdWx0LT50dl9zZWMgPSB4LT50dl9zZWMg LSB5LT50dl9zZWM7Ci0JcmVzdWx0LT50dl9uc2VjID0geC0+dHZfbnNlYyAtIHktPnR2X25zZWM7 Ci0gICAgIAotCS8qIFJldHVybiBUcnVlIGlmIHJlc3VsdCBpcyBuZWdhdGl2ZS4gKi8KLQlyZXR1 cm4gKHgtPnR2X3NlYyA8IHktPnR2X3NlYyk7CisJY2xvY2tUaW1lID0gKFN0YXJ0VGltZSArIEdN VG9mZikgLyAodGltZV90KVNFQ09ORFNfUEVSX01JTlVURTsKIH0KIAorLyoKKyAqIFRyeSB0byBq dXN0IGhpdCB0aGUgbmV4dCBtaW51dGUuCisgKi8KIHN0YXRpYyB2b2lkCi1jcm9uX3NsZWVwKGNy b25fZGIgKmRiLCBpbnQgc2VjcmVzKQotewotCWludCBzZWNvbmRzX3RvX3dhaXQ7Ci0JaW50IHJ2 YWw7Ci0Jc3RydWN0IHRpbWVzcGVjIGN0aW1lLCB0dGltZSwgc3RpbWUsIHJlbXRpbWU7Ci0KLQkv KgotCSAqIExvb3AgdW50aWwgd2UgcmVhY2ggdGhlIHRvcCBvZiB0aGUgbmV4dCBtaW51dGUsIHNs ZWVwIHdoZW4gcG9zc2libGUuCi0JICovCi0KLQlmb3IgKDs7KSB7Ci0JCWNsb2NrX2dldHRpbWUo Q0xPQ0tfUkVBTFRJTUUsICZjdGltZSk7Ci0JCXR0aW1lLnR2X3NlYyA9IFRhcmdldFRpbWU7Ci0J CXR0aW1lLnR2X25zZWMgPSAwOwotCQl0aW1lc3BlY19zdWJ0cmFjdCgmc3RpbWUsICZ0dGltZSwg JmN0aW1lKTsKLQorY3Jvbl9zbGVlcChpbnQgdGFyZ2V0KSB7CisJdGltZV90IHQxLCB0MjsKKwl1 bnNpZ25lZCBjaGFyIHBva2U7CisJaW50IG5mZHMsIGZkOworCXNvY2tsZW5fdCBzdW5sZW47CisJ c3RhdGljIGZkX3NldCAqZmRzcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gc191bjsKKworCXN0cnVj dCB0aW1ldmFsIHNlY29uZHNfdG9fd2FpdDsKKwlzZWNvbmRzX3RvX3dhaXQudHZfdXNlYyA9IDA7 CisKKwl0MSA9IHRpbWUoTlVMTCkgKyBHTVRvZmY7CisJc2Vjb25kc190b193YWl0LnR2X3NlYyA9 IChpbnQpKHRhcmdldCAqIFNFQ09ORFNfUEVSX01JTlVURSAtIHQxKSArIDE7CisJRGVidWcoRFND SCwgKCJbJWxkXSBUYXJnZXQgdGltZT0lbGQsIHNlYy10by13YWl0PSVsZFxuIiwKKwkgICAgKGxv bmcpZ2V0cGlkKCksIChsb25nKXRhcmdldCpTRUNPTkRTX1BFUl9NSU5VVEUsIHNlY29uZHNfdG9f d2FpdC50dl9zZWMpKQorCisJZmRzciA9IChmZF9zZXQgKiljYWxsb2MoaG93bWFueShjcm9uU29j ayArIDEsIE5GREJJVFMpLAorCQkJc2l6ZW9mKGZkX21hc2spKTsKKworCXdoaWxlIChzZWNvbmRz X3RvX3dhaXQudHZfc2VjID4gMCAmJiBzZWNvbmRzX3RvX3dhaXQudHZfc2VjIDwgNjUpIHsKKwkJ cG9rZSA9IFJFTE9BRF9DUk9OOworCQlpZiAoZmRzcikKKwkJCUZEX1NFVChjcm9uU29jaywgZmRz cik7CiAJCS8qCi0JCSAqIElmIHRoZSBzZWNvbmRzX3RvX3dhaXQgdmFsdWUgaXMgaW5zYW5lLCBq dW1wIHRoZSBjcm9uCisJCSAqIENoZWNrIHRvIHNlZSBpZiB3ZSB3ZXJlIGludGVycnVwdGVkIGJ5 IGEgc2lnbmFsLgorCQkgKiBJZiBzbywgc2VydmljZSB0aGUgc2lnbmFsKHMpIHRoZW4gY29udGlu dWUgc2xlZXBpbmcKKwkJICogd2hlcmUgd2UgbGVmdCBvZmYuCiAJCSAqLwotCi0JCWlmIChzdGlt ZS50dl9zZWMgPCAtNjAwIHx8IHN0aW1lLnR2X3NlYyA+IDYwMCkgewotCQkJY3Jvbl9jbGVhbihk Yik7Ci0JCQljcm9uX3N5bmMoc2VjcmVzKTsKLQkJCWNvbnRpbnVlOworCQluZmRzID0gc2VsZWN0 KGNyb25Tb2NrICsgMSwgZmRzciwgTlVMTCwgTlVMTCwgJnNlY29uZHNfdG9fd2FpdCk7CisJCWlm IChuZmRzID09IDApCisJCQlicmVhazsgICAgICAgICAgLyogdGltZXIgZXhwaXJlZCAqLworCQlp ZiAobmZkcyA9PSAtMSAmJiBlcnJubyAhPSBFSU5UUikKKwkJCWJyZWFrOyAgICAgICAgICAvKiBh biBlcnJvciBvY2N1cnJlZCAqLworCQlpZiAobmZkcyA+IDApIHsKKwkJCURlYnVnKERTQ0gsICgi WyVsZF0gR290IGEgcG9rZSBvbiB0aGUgc29ja2V0XG4iLAorCQkJCQkJKGxvbmcpZ2V0cGlkKCkp KQorCQkJc3VubGVuID0gc2l6ZW9mKHNfdW4pOworCQkJZmQgPSBhY2NlcHQoY3JvblNvY2ssIChz dHJ1Y3Qgc29ja2FkZHIgKikmc191biwgJnN1bmxlbik7CisJCQlpZiAoZmQgPj0gMCAmJiBmY250 bChmZCwgRl9TRVRGTCwgT19OT05CTE9DSykgPT0gMCkgeworCQkJCSh2b2lkKSByZWFkKGZkLCAm cG9rZSwgMSk7CisJCQkJY2xvc2UoZmQpOworCQkJCWlmIChwb2tlICYgUkVMT0FEX0NST04pIHsK KwkJCQkJZGF0YWJhc2UubXRpbWUgPSAodGltZV90KTA7CisJCQkJCWxvYWRfZGF0YWJhc2UoJmRh dGFiYXNlKTsKKwkJCQl9CisJCQl9CiAJCX0KLQotCQlzZWNvbmRzX3RvX3dhaXQgPSAoc3RpbWUu dHZfbnNlYyA+IDApID8gc3RpbWUudHZfc2VjICsgMSA6Ci0JCSAgICBzdGltZS50dl9zZWM7Ci0K LQkJRGVidWcoRFNDSCwgKCJbJWRdIFRhcmdldFRpbWU9JWxkLCBzZWMtdG8td2FpdD0lZFxuIiwK LQkJCWdldHBpZCgpLCAobG9uZylUYXJnZXRUaW1lLCBzZWNvbmRzX3RvX3dhaXQpKQotCi0JCS8q Ci0JCSAqIElmIHdlJ3ZlIHJ1biBvdXQgb2Ygd2FpdCB0aW1lIG9yIHRoZXJlIGFyZSBubyBqb2Jz IGxlZnQKLQkJICogdG8gcnVuLCBicmVhawotCQkgKi8KLQotCQlpZiAoc3RpbWUudHZfc2VjIDwg MCkKLQkJCWJyZWFrOwotCQlpZiAoam9iX3J1bnF1ZXVlKCkgPT0gMCkgewotCQkJRGVidWcoRFND SCwgKCJbJWRdIHNsZWVwaW5nIGZvciAlZCBzZWNvbmRzXG4iLAotCQkJCWdldHBpZCgpLCBzZWNv bmRzX3RvX3dhaXQpKQotCi0JCQlmb3IgKDs7KSB7Ci0JCQkJcnZhbCA9IG5hbm9zbGVlcCgmc3Rp bWUsICZyZW10aW1lKTsKLQkJCQlpZiAocnZhbCA9PSAwIHx8IGVycm5vICE9IEVJTlRSKQotCQkJ CQlicmVhazsKLQkJCQlzdGltZS50dl9zZWMgPSByZW10aW1lLnR2X3NlYzsKLQkJCQlzdGltZS50 dl9uc2VjID0gcmVtdGltZS50dl9uc2VjOworCQllbHNlIHsKKwkJCWlmIChnb3Rfc2lnaHVwKSB7 CisJCQkJZ290X3NpZ2h1cCA9IDA7CisJCQkJbG9nX2Nsb3NlKCk7CisJCQl9CisJCQlpZiAoZ290 X3NpZ2NobGQpIHsKKwkJCQlnb3Rfc2lnY2hsZCA9IDA7CisJCQkJc2lnY2hsZF9yZWFwZXIoKTsK IAkJCX0KIAkJfQorCQl0MiA9IHRpbWUoTlVMTCkgKyBHTVRvZmY7CisJCXNlY29uZHNfdG9fd2Fp dC50dl9zZWMgLT0gKGludCkodDIgLSB0MSk7CisJCXQxID0gdDI7CiAJfQogfQogCi0KLS8qIGlm IHRoZSB0aW1lIHdhcyBjaGFuZ2VkIGFicnVwdGx5LCBjbGVhciB0aGUgZmxhZ3MgcmVsYXRlZAot ICogdG8gdGhlIGRheWxpZ2h0IHRpbWUgc3dpdGNoIGhhbmRsaW5nIHRvIGF2b2lkIHN0cmFuZ2Ug ZWZmZWN0cwotICovCi0KIHN0YXRpYyB2b2lkCi1jcm9uX2NsZWFuKGRiKQotCWNyb25fZGIJKmRi OwotewotCXVzZXIJCSp1OwotCWVudHJ5CQkqZTsKK3NpZ2h1cF9oYW5kbGVyKGludCB4KSB7CisJ Z290X3NpZ2h1cCA9IDE7Cit9CiAKLQlsYXN0X3RpbWUgPSAwOworc3RhdGljIHZvaWQKK3NpZ2No bGRfaGFuZGxlcihpbnQgeCkgeworCWdvdF9zaWdjaGxkID0gMTsKK30KIAotCWZvciAodSA9IGRi LT5oZWFkOyAgdSAhPSBOVUxMOyAgdSA9IHUtPm5leHQpIHsKLQkJZm9yIChlID0gdS0+Y3JvbnRh YjsgIGUgIT0gTlVMTDsgIGUgPSBlLT5uZXh0KSB7Ci0JCQllLT5mbGFncyAmPSB+KFJVTl9BVHxO T1RfVU5USUwpOwotCQl9Ci0JfQorc3RhdGljIHZvaWQKK3F1aXQoaW50IHgpIHsKKwlwaWRmaWxl X3JlbW92ZShwZmgpOworCV9leGl0KDApOwogfQogCi0jaWZkZWYgVVNFX1NJR0NITEQKIHN0YXRp YyB2b2lkCi1zaWdjaGxkX2hhbmRsZXIoaW50IHgpCi17Ci0JV0FJVF9UCQl3YWl0ZXI7Ci0JUElE X1QJCXBpZDsKK3NpZ2NobGRfcmVhcGVyKHZvaWQpIHsKKwlXQUlUX1Qgd2FpdGVyOworCVBJRF9U IHBpZDsKIAotCWZvciAoOzspIHsKLSNpZmRlZiBQT1NJWAorCWRvIHsKIAkJcGlkID0gd2FpdHBp ZCgtMSwgJndhaXRlciwgV05PSEFORyk7Ci0jZWxzZQotCQlwaWQgPSB3YWl0Mygmd2FpdGVyLCBX Tk9IQU5HLCAoc3RydWN0IHJ1c2FnZSAqKTApOwotI2VuZGlmCiAJCXN3aXRjaCAocGlkKSB7CiAJ CWNhc2UgLTE6CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CiAJCQlEZWJ1 ZyhEUFJPQywKLQkJCQkoIlslZF0gc2lnY2hsZC4uLm5vIGNoaWxkcmVuXG4iLCBnZXRwaWQoKSkp Ci0JCQlyZXR1cm47CisJCQkgICAgICAoIlslbGRdIHNpZ2NobGQuLi5ubyBjaGlsZHJlblxuIiwK KwkJCSAgICAgICAobG9uZylnZXRwaWQoKSkpCisJCQlicmVhazsKIAkJY2FzZSAwOgogCQkJRGVi dWcoRFBST0MsCi0JCQkJKCJbJWRdIHNpZ2NobGQuLi5ubyBkZWFkIGtpZHNcbiIsIGdldHBpZCgp KSkKLQkJCXJldHVybjsKKwkJCSAgICAgICgiWyVsZF0gc2lnY2hsZC4uLm5vIGRlYWQga2lkc1xu IiwKKwkJCSAgICAgICAobG9uZylnZXRwaWQoKSkpCisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJ CURlYnVnKERQUk9DLAotCQkJCSgiWyVkXSBzaWdjaGxkLi4ucGlkICMlZCBkaWVkLCBzdGF0PSVk XG4iLAotCQkJCWdldHBpZCgpLCBwaWQsIFdFWElUU1RBVFVTKHdhaXRlcikpKQorCQkJICAgICAg KCJbJWxkXSBzaWdjaGxkLi4ucGlkICMlbGQgZGllZCwgc3RhdD0lZFxuIiwKKwkJCSAgICAgICAo bG9uZylnZXRwaWQoKSwgKGxvbmcpcGlkLCBXRVhJVFNUQVRVUyh3YWl0ZXIpKSkKKwkJCWJyZWFr OwogCQl9Ci0JfQorCX0gd2hpbGUgKHBpZCA+IDApOwogfQotI2VuZGlmIC8qVVNFX1NJR0NITEQq LwotCiAKIHN0YXRpYyB2b2lkCi1zaWdodXBfaGFuZGxlcihpbnQgeCkKLXsKLQlsb2dfY2xvc2Uo KTsKLX0KLQorcGFyc2VfYXJncyhpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisJaW50IGFyZ2No OwogCi1zdGF0aWMgdm9pZAotcGFyc2VfYXJncyhhcmdjLCBhcmd2KQotCWludAlhcmdjOwotCWNo YXIJKmFyZ3ZbXTsKLXsKLQlpbnQJYXJnY2g7Ci0JY2hhcgkqZW5kcDsKKwljaGFyICplbmRwOwog Ci0Jd2hpbGUgKChhcmdjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiajpKOm06b3N4OiIpKSAhPSAt MSkgeworCXdoaWxlICgtMSAhPSAoYXJnY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgImo6SjptOm54 OiIpKSkgewogCQlzd2l0Y2ggKGFyZ2NoKSB7CisJCWRlZmF1bHQ6CisJCQl1c2FnZSgpOwogCQlj YXNlICdqJzoKIAkJCUppdHRlciA9IHN0cnRvdWwob3B0YXJnLCAmZW5kcCwgMTApOwogCQkJaWYg KCpvcHRhcmcgPT0gJ1wwJyB8fCAqZW5kcCAhPSAnXDAnIHx8IEppdHRlciA+IDYwKQogCQkJCWVy cngoRVJST1JfRVhJVCwKLQkJCQkgICAgICJiYWQgdmFsdWUgZm9yIGppdHRlcjogJXMiLCBvcHRh cmcpOworCQkJCQkJImJhZCB2YWx1ZSBmb3Igaml0dGVyOiAlcyIsIG9wdGFyZyk7CiAJCQlicmVh azsKIAkJY2FzZSAnSic6CiAJCQlSb290Sml0dGVyID0gc3RydG91bChvcHRhcmcsICZlbmRwLCAx MCk7Ci0JCQlpZiAoKm9wdGFyZyA9PSAnXDAnIHx8ICplbmRwICE9ICdcMCcgfHwgUm9vdEppdHRl ciA+IDYwKQorCQkJaWYoICpvcHRhcmcgPT0gJ1wwJyB8fCAqZW5kcCAhPSAnXDAnIHx8IFJvb3RK aXR0ZXIgPiA2MCkKIAkJCQllcnJ4KEVSUk9SX0VYSVQsCi0JCQkJICAgICAiYmFkIHZhbHVlIGZv ciByb290IGppdHRlcjogJXMiLCBvcHRhcmcpOworCQkJCQkJImJhZCB2YWx1ZSBmb3Igcm9vdCBq aXR0ZXI6ICVzIiwgb3B0YXJnKTsKIAkJCWJyZWFrOwogCQljYXNlICdtJzoKIAkJCWRlZm1haWx0 byA9IG9wdGFyZzsKIAkJCWJyZWFrOwotCQljYXNlICdvJzoKLQkJCWRzdF9lbmFibGVkID0gMDsK LQkJCWJyZWFrOwotCQljYXNlICdzJzoKLQkJCWRzdF9lbmFibGVkID0gMTsKLQkJCWJyZWFrOwog CQljYXNlICd4JzoKIAkJCWlmICghc2V0X2RlYnVnX2ZsYWdzKG9wdGFyZykpCiAJCQkJdXNhZ2Uo KTsKIAkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdXNhZ2UoKTsKLQkJfQotCX0KLX0KLQotc3Rh dGljIGludAotcnVuX2F0X3NlY3Jlcyhjcm9uX2RiICpkYikKLXsKLQl1c2VyICp1OwotCWVudHJ5 ICplOwotCi0JZm9yICh1ID0gZGItPmhlYWQ7ICB1ICE9IE5VTEw7ICB1ID0gdS0+bmV4dCkgewot CQlmb3IgKGUgPSB1LT5jcm9udGFiOyAgZSAhPSBOVUxMOyAgZSA9IGUtPm5leHQpIHsKLQkJCWlm ICgoZS0+ZmxhZ3MgJiBTRUNfUkVTKSAhPSAwKQotCQkJCXJldHVybiAxOworCQljYXNlICduJzoK KwkJCU5vRm9yayA9IDE7CisJCQlicmVhazsKIAkJfQogCX0KLQlyZXR1cm4gMDsKIH0KZGlmZiAt cnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi9jcm9uLmggZnJlZWJzZF9jcm9uL2Nyb24v Y3Jvbi5oCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb24vY3Jvbi5oCTIwMTQtMDEtMTYg MjE6NDM6NDkuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vY3Jvbi9jcm9uLmgJMjAx NC0wNi0xMSAxNjo0Mjo1NS4yNzI0NDQyNzYgKzAyMDAKQEAgLTEsMzA3ICsxLDQ2IEBACiAvKiBD b3B5cmlnaHQgMTk4OCwxOTkwLDE5OTMsMTk5NCBieSBQYXVsIFZpeGllCiAgKiBBbGwgcmlnaHRz IHJlc2VydmVkCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBieSBJbnRlcm5ldCBT eXN0ZW1zIENvbnNvcnRpdW0sIEluYy4gKCJJU0MiKQorICogQ29weXJpZ2h0IChjKSAxOTk3LDIw MDAgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bSwgSW5jLgogICoKLSAqIERpc3RyaWJ1 dGUgZnJlZWx5LCBleGNlcHQ6IGRvbid0IHJlbW92ZSBteSBuYW1lIGZyb20gdGhlIHNvdXJjZSBv cgotICogZG9jdW1lbnRhdGlvbiAoZG9uJ3QgdGFrZSBjcmVkaXQgZm9yIG15IHdvcmspLCBtYXJr IHlvdXIgY2hhbmdlcyAoZG9uJ3QKLSAqIGdldCBtZSBibGFtZWQgZm9yIHlvdXIgcG9zc2libGUg YnVncyksIGRvbid0IGFsdGVyIG9yIHJlbW92ZSB0aGlzCi0gKiBub3RpY2UuICBNYXkgYmUgc29s ZCBpZiBidWlsZGFibGUgc291cmNlIGlzIHByb3ZpZGVkIHRvIGJ1eWVyLiAgTm8KLSAqIHdhcnJh bnRlZSBvZiBhbnkga2luZCwgZXhwcmVzcyBvciBpbXBsaWVkLCBpcyBpbmNsdWRlZCB3aXRoIHRo aXMKLSAqIHNvZnR3YXJlOyB1c2UgYXQgeW91ciBvd24gcmlzaywgcmVzcG9uc2liaWxpdHkgZm9y IGRhbWFnZXMgKGlmIGFueSkgdG8KLSAqIGFueW9uZSByZXN1bHRpbmcgZnJvbSB0aGUgdXNlIG9m IHRoaXMgc29mdHdhcmUgcmVzdHMgZW50aXJlbHkgd2l0aCB0aGUKLSAqIHVzZXIuCisgKiBQZXJt aXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJl IGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRl ZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMg cGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiAgKgotICogU2VuZCBidWcg cmVwb3J0cywgYnVnIGZpeGVzLCBlbmhhbmNlbWVudHMsIHJlcXVlc3RzLCBmbGFtZXMsIGV0Yy4s IGFuZAotICogSSdsbCB0cnkgdG8ga2VlcCBhIHZlcnNpb24gdXAgdG8gZGF0ZS4gIEkgY2FuIGJl IHJlYWNoZWQgYXMgZm9sbG93czoKLSAqIFBhdWwgVml4aWUgICAgICAgICAgPHBhdWxAdml4LmNv bT4gICAgICAgICAgdXVuZXQhZGVjd3JsIXZpeGllIXBhdWwKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQ Uk9WSURFRCAiQVMgSVMiIEFORCBJU0MgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRI IFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVT IE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuICBJTiBOTyBFVkVOVCBTSEFMTCBJ U0MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENP TlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJ TkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBB Q1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBB UklTSU5HIE9VVAorICogT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9S TUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCiAvKiBjcm9uLmggLSBoZWFkZXIgZm9yIHZp eGllJ3MgY3JvbgogICoKLSAqICRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9u L2Nyb24vY3Jvbi5oIDI0MjEwMSAyMDEyLTEwLTI1IDIyOjU0OjI5WiBzb2JvbWF4ICQKKyAqICRJ ZDogY3Jvbi5oLHYgMS42IDIwMDQvMDEvMjMgMTg6NTY6NDIgdml4aWUgRXhwICQKICAqCiAgKiB2 aXggMTRub3Y4OCBbcmVzdCBvZiBsb2cgaXMgaW4gUkNTXQogICogdml4IDE0amFuODcgWzAgb3Ig NyBjYW4gYmUgc3VuZGF5OyB0aGFua3MsIG13bUBiZXJrZWxleV0KICAqIHZpeCAzMGRlYzg2IFt3 cml0dGVuXQogICovCiAKLS8qIHJlb3JkZXIgdGhlc2UgI2luY2x1ZGUncyBhdCB5b3VyIHBlcmls ICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNp bmNsdWRlICJjb21wYXQuaCIKKyNkZWZpbmUgQ1JPTl9WRVJTSU9OICJWNS4wIgogCi0jaW5jbHVk ZSA8Yml0c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KK3Vuc2lnbmVkIEppdHRlciwgUm9v dEppdHRlcjsKK2V4dGVybiB1bnNpZ25lZCBKaXR0ZXIsIFJvb3RKaXR0ZXI7CitleHRlcm4gc3Ry dWN0IHBpZGZoICpwZmg7CiAjaW5jbHVkZSA8ZXJyLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KICNp bmNsdWRlIDxsaWJ1dGlsLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+ Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3dh aXQuaD4KIAotI2luY2x1ZGUgInBhdGhuYW1lcy5oIgorI2RlZmluZSBTWVNfTkFNRSAiKnN5c3Rl bSoiCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiZXh0ZXJucy5oIgotCi0JLyogdGhl c2UgYXJlIHJlYWxseSBpbW11dGFibGUsIGFuZCBhcmUKLQkgKiAgIGRlZmluZWQgZm9yIHN5bWJv bGljIGNvbnZlbmllbmNlIG9ubHkKLQkgKiBUUlVFLCBGQUxTRSwgYW5kIEVSUiBtdXN0IGJlIGRp c3RpbmN0Ci0JICogRVJSIG11c3QgYmUgPCBPSy4KLQkgKi8KLSNkZWZpbmUgVFJVRQkJMQotI2Rl ZmluZSBGQUxTRQkJMAotCS8qIHN5c3RlbSBjYWxscyByZXR1cm4gdGhpcyBvbiBzdWNjZXNzICov Ci0jZGVmaW5lIE9LCQkwCi0JLyogICBvciB0aGlzIG9uIGVycm9yICovCi0jZGVmaW5lIEVSUgkJ KC0xKQotCi0JLyogdHVybiB0aGlzIG9uIHRvIGdldCAnLXgnIGNvZGUgKi8KLSNpZm5kZWYgREVC VUdHSU5HCi0jZGVmaW5lIERFQlVHR0lORwlGQUxTRQotI2VuZGlmCi0KLSNkZWZpbmUgUkVBRF9Q SVBFCTAJLyogd2hpY2ggZW5kIG9mIGEgcGlwZSBwYWlyIGRvIHlvdSByZWFkPyAqLwotI2RlZmlu ZSBXUklURV9QSVBFCTEJLyogICBvciB3cml0ZSB0bz8gKi8KLSNkZWZpbmUgU1RESU4JCTAJLyog d2hhdCBpcyBzdGRpbidzIGZpbGUgZGVzY3JpcHRvcj8gKi8KLSNkZWZpbmUgU1RET1VUCQkxCS8q ICAgc3Rkb3V0J3M/ICovCi0jZGVmaW5lIFNUREVSUgkJMgkvKiAgIHN0ZGVycidzPyAqLwotI2Rl ZmluZSBFUlJPUl9FWElUCTEJLyogZXhpdCgpIHdpdGggdGhpcyB3aWxsIHNjYXJlIHRoZSBzaGVs bCAqLwotI2RlZmluZQlPS19FWElUCQkwCS8qIGV4aXQoKSB3aXRoIHRoaXMgaXMgY29uc2lkZXJl ZCAnbm9ybWFsJyAqLwotI2RlZmluZQlNQVhfRk5BTUUJMTAwCS8qIG1heCBsZW5ndGggb2YgaW50 ZXJuYWxseSBnZW5lcmF0ZWQgZm4gKi8KLSNkZWZpbmUJTUFYX0NPTU1BTkQJMTAwMAkvKiBtYXgg bGVuZ3RoIG9mIGludGVybmFsbHkgZ2VuZXJhdGVkIGNtZCAqLwotI2RlZmluZQlNQVhfRU5WU1RS CTEwMDAJLyogbWF4IGxlbmd0aCBvZiBlbnZ2YXI9dmFsdWVcMCBzdHJpbmdzICovCi0jZGVmaW5l CU1BWF9URU1QU1RSCTEwMAkvKiBvYnZpb3VzICovCi0jZGVmaW5lCU1BWF9VTkFNRQkyMAkvKiBt YXggbGVuZ3RoIG9mIHVzZXJuYW1lLCBzaG91bGQgYmUgb3ZlcmtpbGwgKi8KLSNkZWZpbmUJUk9P VF9VSUQJMAkvKiBkb24ndCBjaGFuZ2UgdGhpcywgaXQgcmVhbGx5IG11c3QgYmUgcm9vdCAqLwot I2RlZmluZQlST09UX1VTRVIJInJvb3QiCS8qIGRpdHRvICovCi0jZGVmaW5lCVNZU19OQU1FCSIq c3lzdGVtKiIgLyogbWFnaWMgb3duZXIgbmFtZSBmb3Igc3lzdGVtIGNyb250YWIgKi8KLQotCQkJ CS8qIE5PVEU6IHRoZXNlIGNvcnJlc3BvbmQgdG8gRGVidWdGbGFnTmFtZXMsCi0JCQkJICoJZGVm aW5lZCBiZWxvdy4KLQkJCQkgKi8KLSNkZWZpbmUJREVYVAkJMHgwMDAxCS8qIGV4dGVuZCBmbGFn IGZvciBvdGhlciBkZWJ1ZyBtYXNrcyAqLwotI2RlZmluZQlEU0NICQkweDAwMDIJLyogc2NoZWR1 bGluZyBkZWJ1ZyBtYXNrICovCi0jZGVmaW5lCURQUk9DCQkweDAwMDQJLyogcHJvY2VzcyBjb250 cm9sIGRlYnVnIG1hc2sgKi8KLSNkZWZpbmUJRFBBUlMJCTB4MDAwOAkvKiBwYXJzaW5nIGRlYnVn IG1hc2sgKi8KLSNkZWZpbmUJRExPQUQJCTB4MDAxMAkvKiBkYXRhYmFzZSBsb2FkaW5nIGRlYnVn IG1hc2sgKi8KLSNkZWZpbmUJRE1JU0MJCTB4MDAyMAkvKiBtaXNjIGRlYnVnIG1hc2sgKi8KLSNk ZWZpbmUJRFRFU1QJCTB4MDA0MAkvKiB0ZXN0IG1vZGU6IGRvbid0IGV4ZWN1dGUgYW55IGNvbW1h bmRzICovCi0jZGVmaW5lCURCSVQJCTB4MDA4MAkvKiBiaXQgdHdpZGRsaW5nIHNob3duIChsb25n KSAqLwotCi0jZGVmaW5lCUNST05fVEFCKHUpCSIlcy8lcyIsIFNQT09MX0RJUiwgdQotI2RlZmlu ZQlSRUcJCXJlZ2lzdGVyCi0jZGVmaW5lCVBQQ19OVUxMCSgoY2hhciAqKilOVUxMKQotCi0jaWZu ZGVmIE1BWEhPU1ROQU1FTEVOCi0jZGVmaW5lIE1BWEhPU1ROQU1FTEVOIDI1NgotI2VuZGlmCi0K LSNkZWZpbmUJU2tpcF9CbGFua3MoYywgZikgXAotCQkJd2hpbGUgKGMgPT0gJ1x0JyB8fCBjID09 ICcgJykgXAotCQkJCWMgPSBnZXRfY2hhcihmKTsKLQotI2RlZmluZQlTa2lwX05vbmJsYW5rcyhj LCBmKSBcCi0JCQl3aGlsZSAoYyE9J1x0JyAmJiBjIT0nICcgJiYgYyE9J1xuJyAmJiBjICE9IEVP RikgXAotCQkJCWMgPSBnZXRfY2hhcihmKTsKLQotI2RlZmluZQlTa2lwX0xpbmUoYywgZikgXAot CQkJZG8ge2MgPSBnZXRfY2hhcihmKTt9IHdoaWxlIChjICE9ICdcbicgJiYgYyAhPSBFT0YpOwot Ci0jaWYgREVCVUdHSU5HCi0jIGRlZmluZSBEZWJ1ZyhtYXNrLCBtZXNzYWdlKSBcCi0JCQlpZiAo IChEZWJ1Z0ZsYWdzICYgKG1hc2spICkgPT0gKG1hc2spICkgXAotCQkJCXByaW50ZiBtZXNzYWdl OwotI2Vsc2UgLyogIURFQlVHR0lORyAqLwotIyBkZWZpbmUgRGVidWcobWFzaywgbWVzc2FnZSkg XAotCQkJOwotI2VuZGlmIC8qIERFQlVHR0lORyAqLwotCi0jZGVmaW5lCU1rTG93ZXIoY2gpCShp c3VwcGVyKGNoKSA/IHRvbG93ZXIoY2gpIDogY2gpCi0jZGVmaW5lCU1rVXBwZXIoY2gpCShpc2xv d2VyKGNoKSA/IHRvdXBwZXIoY2gpIDogY2gpCi0jZGVmaW5lCVNldF9MaW5lTnVtKGxuKQl7RGVi dWcoRFBBUlN8REVYVCwoImxpbmVudW09JWRcbiIsbG4pKTsgXAotCQkJIExpbmVOdW1iZXIgPSBs bjsgXAotCQkJfQotCi0jZGVmaW5lCUZJUlNUX1NFQ09ORAkwCi0jZGVmaW5lCUxBU1RfU0VDT05E CTU5Ci0jZGVmaW5lCVNFQ09ORF9DT1VOVAkoTEFTVF9TRUNPTkQgLSBGSVJTVF9TRUNPTkQgKyAx KQotCi0jZGVmaW5lCUZJUlNUX01JTlVURQkwCi0jZGVmaW5lCUxBU1RfTUlOVVRFCTU5Ci0jZGVm aW5lCU1JTlVURV9DT1VOVAkoTEFTVF9NSU5VVEUgLSBGSVJTVF9NSU5VVEUgKyAxKQotCi0jZGVm aW5lCUZJUlNUX0hPVVIJMAotI2RlZmluZQlMQVNUX0hPVVIJMjMKLSNkZWZpbmUJSE9VUl9DT1VO VAkoTEFTVF9IT1VSIC0gRklSU1RfSE9VUiArIDEpCi0KLSNkZWZpbmUJRklSU1RfRE9NCTEKLSNk ZWZpbmUJTEFTVF9ET00JMzEKLSNkZWZpbmUJRE9NX0NPVU5UCShMQVNUX0RPTSAtIEZJUlNUX0RP TSArIDEpCi0KLSNkZWZpbmUJRklSU1RfTU9OVEgJMQotI2RlZmluZQlMQVNUX01PTlRICTEyCi0j ZGVmaW5lCU1PTlRIX0NPVU5UCShMQVNUX01PTlRIIC0gRklSU1RfTU9OVEggKyAxKQotCi0vKiBu b3RlIG9uIERPVzogMCBhbmQgNyBhcmUgYm90aCBTdW5kYXksIGZvciBjb21wYXRpYmlsaXR5IHJl YXNvbnMuICovCi0jZGVmaW5lCUZJUlNUX0RPVwkwCi0jZGVmaW5lCUxBU1RfRE9XCTcKLSNkZWZp bmUJRE9XX0NPVU5UCShMQVNUX0RPVyAtIEZJUlNUX0RPVyArIDEpCi0KLSNpZmRlZiBMT0dJTl9D QVAKLS8qIHNlZSBpbml0LmMgKi8KLSNkZWZpbmUgUkVTT1VSQ0VfUkMgImRhZW1vbiIKLSNlbmRp ZgotCi0JCQkvKiBlYWNoIHVzZXIncyBjcm9udGFiIHdpbGwgYmUgaGVsZCBhcyBhIGxpc3Qgb2YK LQkJCSAqIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLgotCQkJICoKLQkJCSAqIFRoZXNlIGFyZSB0 aGUgY3JvbiBjb21tYW5kcy4KLQkJCSAqLwotCi10eXBlZGVmCXN0cnVjdCBfZW50cnkgewotCXN0 cnVjdCBfZW50cnkJKm5leHQ7Ci0JdWlkX3QJCXVpZDsKLQlnaWRfdAkJZ2lkOwotI2lmZGVmIExP R0lOX0NBUAotCWNoYXIgICAgICAgICAgICAqY2xhc3M7Ci0jZW5kaWYKLQljaGFyCQkqKmVudnA7 Ci0JY2hhcgkJKmNtZDsKLQliaXRzdHJfdAliaXRfZGVjbChzZWNvbmQsIFNFQ09ORF9DT1VOVCk7 Ci0JYml0c3RyX3QJYml0X2RlY2wobWludXRlLCBNSU5VVEVfQ09VTlQpOwotCWJpdHN0cl90CWJp dF9kZWNsKGhvdXIsICAgSE9VUl9DT1VOVCk7Ci0JYml0c3RyX3QJYml0X2RlY2woZG9tLCAgICBE T01fQ09VTlQpOwotCWJpdHN0cl90CWJpdF9kZWNsKG1vbnRoLCAgTU9OVEhfQ09VTlQpOwotCWJp dHN0cl90CWJpdF9kZWNsKGRvdywgICAgRE9XX0NPVU5UKTsKLQlpbnQJCWZsYWdzOwotI2RlZmlu ZQlET01fU1RBUgkweDAxCi0jZGVmaW5lCURPV19TVEFSCTB4MDIKLSNkZWZpbmUJV0hFTl9SRUJP T1QJMHgwNAotI2RlZmluZQlSVU5fQVQJMHgwOAotI2RlZmluZQlOT1RfVU5USUwJMHgxMAotI2Rl ZmluZQlTRUNfUkVTCQkweDIwCi0JdGltZV90CWxhc3RydW47Ci19IGVudHJ5OwotCi0JCQkvKiB0 aGUgY3JvbnRhYiBkYXRhYmFzZSB3aWxsIGJlIGEgbGlzdCBvZiB0aGUKLQkJCSAqIGZvbGxvd2lu ZyBzdHJ1Y3R1cmUsIG9uZSBlbGVtZW50IHBlciB1c2VyCi0JCQkgKiBwbHVzIG9uZSBmb3IgdGhl IHN5c3RlbS4KLQkJCSAqCi0JCQkgKiBUaGVzZSBhcmUgdGhlIGNyb250YWJzLgotCQkJICovCi0K LXR5cGVkZWYJc3RydWN0IF91c2VyIHsKLQlzdHJ1Y3QgX3VzZXIJKm5leHQsICpwcmV2OwkvKiBs aW5rcyAqLwotCWNoYXIJCSpuYW1lOwotCXRpbWVfdAkJbXRpbWU7CQkvKiBsYXN0IG1vZHRpbWUg b2YgY3JvbnRhYiAqLwotCWVudHJ5CQkqY3JvbnRhYjsJLyogdGhpcyBwZXJzb24ncyBjcm9udGFi ICovCi19IHVzZXI7Ci0KLXR5cGVkZWYJc3RydWN0IF9jcm9uX2RiIHsKLQl1c2VyCQkqaGVhZCwg KnRhaWw7CS8qIGxpbmtzICovCi0JdGltZV90CQltdGltZTsJCS8qIGxhc3QgbW9kdGltZSBvbiBz cG9vbGRpciAqLwotfSBjcm9uX2RiOwotCi0KLXZvaWQJCXNldF9jcm9uX3VpZCh2b2lkKSwKLQkJ c2V0X2Nyb25fY3dkKHZvaWQpLAotCQlsb2FkX2RhdGFiYXNlKGNyb25fZGIgKiksCi0JCW9wZW5f bG9nZmlsZSh2b2lkKSwKLQkJc2lncGlwZV9mdW5jKHZvaWQpLAotCQlqb2JfYWRkKGVudHJ5ICos IHVzZXIgKiksCi0JCWRvX2NvbW1hbmQoZW50cnkgKiwgdXNlciAqKSwKLQkJbGlua191c2VyKGNy b25fZGIgKiwgdXNlciAqKSwKLQkJdW5saW5rX3VzZXIoY3Jvbl9kYiAqLCB1c2VyICopLAotCQlm cmVlX3VzZXIodXNlciAqKSwKLQkJZW52X2ZyZWUoY2hhciAqKiksCi0JCXVuZ2V0X2NoYXIoaW50 LCBGSUxFICopLAotCQlmcmVlX2VudHJ5KGVudHJ5ICopLAotCQlza2lwX2NvbW1lbnRzKEZJTEUg KiksCi0JCWxvZ19pdChjaGFyICosIGludCwgY2hhciAqLCBjaGFyICopLAotCQlsb2dfY2xvc2Uo dm9pZCk7Ci0KLWludAkJam9iX3J1bnF1ZXVlKHZvaWQpLAotCQlzZXRfZGVidWdfZmxhZ3MoY2hh ciAqKSwKLQkJZ2V0X2NoYXIoRklMRSAqKSwKLQkJZ2V0X3N0cmluZyhjaGFyICosIGludCwgRklM RSAqLCBjaGFyICopLAotCQlzd2FwX3VpZHModm9pZCksCi0JCXN3YXBfdWlkc19iYWNrKHZvaWQp LAotCQlsb2FkX2VudihjaGFyICosIEZJTEUgKiksCi0JCWNyb25fcGNsb3NlKEZJTEUgKiksCi0J CXN0cmNtcF91bnRpbChjaGFyICosIGNoYXIgKiwgaW50KSwKLQkJYWxsb3dlZChjaGFyICopLAot CQlzdHJkdGIoY2hhciAqKTsKLQotY2hhcgkJKmVudl9nZXQoY2hhciAqLCBjaGFyICoqKSwKLQkJ KmFycGFkYXRlKHRpbWVfdCAqKSwKLQkJKm1rcHJpbnRzKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWdu ZWQgaW50KSwKLQkJKmZpcnN0X3dvcmQoY2hhciAqLCBjaGFyICopLAotCQkqKmVudl9pbml0KHZv aWQpLAotCQkqKmVudl9jb3B5KGNoYXIgKiopLAotCQkqKmVudl9zZXQoY2hhciAqKiwgY2hhciAq KTsKLQotdXNlcgkJKmxvYWRfdXNlcihpbnQsIHN0cnVjdCBwYXNzd2QgKiwgY2hhciAqKSwKLQkJ KmZpbmRfdXNlcihjcm9uX2RiICosIGNoYXIgKik7Ci0KLWVudHJ5CQkqbG9hZF9lbnRyeShGSUxF ICosIHZvaWQgKCopKGNoYXIgKiksCi0JCQkJIHN0cnVjdCBwYXNzd2QgKiwgY2hhciAqKik7Ci0K LUZJTEUJCSpjcm9uX3BvcGVuKGNoYXIgKiwgY2hhciAqLCBlbnRyeSAqKTsKLQotCi0JCQkJLyog aW4gdGhlIEMgdHJhZGl0aW9uLCB3ZSBvbmx5IGNyZWF0ZQotCQkJCSAqIHZhcmlhYmxlcyBmb3Ig dGhlIG1haW4gcHJvZ3JhbSwganVzdAotCQkJCSAqIGV4dGVybiB0aGVtIGVsc2V3aGVyZS4KLQkJ CQkgKi8KLQotI2lmZGVmIE1BSU5fUFJPR1JBTQotIyBpZiAhZGVmaW5lZChMSU5UKSAmJiAhZGVm aW5lZChsaW50KQotY2hhcgkqY29weXJpZ2h0W10gPSB7Ci0JCSJAKCMpIENvcHlyaWdodCAxOTg4 LDE5ODksMTk5MCwxOTkzLDE5OTQgYnkgUGF1bCBWaXhpZSIsCi0JCSJAKCMpIEFsbCByaWdodHMg cmVzZXJ2ZWQiCi0JfTsKLSMgZW5kaWYKLQotY2hhcgkqTW9udGhOYW1lc1tdID0gewotCQkiSmFu IiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLAotCQkiSnVsIiwgIkF1ZyIsICJT ZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiLAotCQlOVUxMCi0JfTsKLQotY2hhcgkqRG93TmFtZXNb XSA9IHsKLQkJIlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIs ICJTdW4iLAotCQlOVUxMCi0JfTsKLQotY2hhcgkqUHJvZ3JhbU5hbWUsCi0JKmRlZm1haWx0bzsK LWludAlMaW5lTnVtYmVyOwotdW5zaWduZWQgSml0dGVyLAotCVJvb3RKaXR0ZXI7Ci10aW1lX3QJ VGFyZ2V0VGltZTsKLQotIyBpZiBERUJVR0dJTkcKLWludAlEZWJ1Z0ZsYWdzOwotY2hhcgkqRGVi dWdGbGFnTmFtZXNbXSA9IHsJLyogc3luYyB3aXRoICNkZWZpbmVzICovCi0JCSJleHQiLCAic2No IiwgInByb2MiLCAicGFycyIsICJsb2FkIiwgIm1pc2MiLCAidGVzdCIsICJiaXQiLAotCQlOVUxM CQkvKiBOVUxMIG11c3QgYmUgbGFzdCBlbGVtZW50ICovCi0JfTsKLSMgZW5kaWYgLyogREVCVUdH SU5HICovCi0jZWxzZSAvKk1BSU5fUFJPR1JBTSovCi1leHRlcm4JY2hhcgkqY29weXJpZ2h0W10s Ci0JCSpNb250aE5hbWVzW10sCi0JCSpEb3dOYW1lc1tdLAotCQkqUHJvZ3JhbU5hbWUsCi0JCSpk ZWZtYWlsdG87Ci1leHRlcm4JaW50CUxpbmVOdW1iZXI7Ci1leHRlcm4gdW5zaWduZWQJSml0dGVy LAotCQlSb290Sml0dGVyOwotZXh0ZXJuCXRpbWVfdAlUYXJnZXRUaW1lOwotZXh0ZXJuIHN0cnVj dCBwaWRmaCAqcGZoOwotIyBpZiBERUJVR0dJTkcKLWV4dGVybglpbnQJRGVidWdGbGFnczsKLWV4 dGVybgljaGFyCSpEZWJ1Z0ZsYWdOYW1lc1tdOwotIyBlbmRpZiAvKiBERUJVR0dJTkcgKi8KLSNl bmRpZiAvKk1BSU5fUFJPR1JBTSovCisjaW5jbHVkZSAicGF0aG5hbWVzLmgiCisjaW5jbHVkZSAi bWFjcm9zLmgiCisjaW5jbHVkZSAic3RydWN0cy5oIgorI2luY2x1ZGUgImZ1bmNzLmgiCisjaW5j bHVkZSAiZ2xvYmFscy5oIgpkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL2Rh dGFiYXNlLmMgZnJlZWJzZF9jcm9uL2Nyb24vZGF0YWJhc2UuYwotLS0gL3Vzci9zcmMvdXNyLnNi aW4vY3Jvbi9jcm9uL2RhdGFiYXNlLmMJMjAxNC0wMS0xNiAyMTo0Mzo0OS4wMDAwMDAwMDAgKzAx MDAKKysrIGZyZWVic2RfY3Jvbi9jcm9uL2RhdGFiYXNlLmMJMjAxNC0wNi0xMSAxNjo0Mjo1NS4y NzI0NDQyNzYgKzAyMDAKQEAgLTEsNTUgKzEsNDggQEAKIC8qIENvcHlyaWdodCAxOTg4LDE5OTAs MTk5MywxOTk0IGJ5IFBhdWwgVml4aWUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqLworCisv KgorICogQ29weXJpZ2h0IChjKSAyMDA0IGJ5IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1bSwg SW5jLiAoIklTQyIpCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsMjAwMCBieSBJbnRlcm5ldCBTb2Z0 d2FyZSBDb25zb3J0aXVtLCBJbmMuCiAgKgotICogRGlzdHJpYnV0ZSBmcmVlbHksIGV4Y2VwdDog ZG9uJ3QgcmVtb3ZlIG15IG5hbWUgZnJvbSB0aGUgc291cmNlIG9yCi0gKiBkb2N1bWVudGF0aW9u IChkb24ndCB0YWtlIGNyZWRpdCBmb3IgbXkgd29yayksIG1hcmsgeW91ciBjaGFuZ2VzIChkb24n dAotICogZ2V0IG1lIGJsYW1lZCBmb3IgeW91ciBwb3NzaWJsZSBidWdzKSwgZG9uJ3QgYWx0ZXIg b3IgcmVtb3ZlIHRoaXMKLSAqIG5vdGljZS4gIE1heSBiZSBzb2xkIGlmIGJ1aWxkYWJsZSBzb3Vy Y2UgaXMgcHJvdmlkZWQgdG8gYnV5ZXIuICBObwotICogd2FycmFudGVlIG9mIGFueSBraW5kLCBl eHByZXNzIG9yIGltcGxpZWQsIGlzIGluY2x1ZGVkIHdpdGggdGhpcwotICogc29mdHdhcmU7IHVz ZSBhdCB5b3VyIG93biByaXNrLCByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyAoaWYgYW55KSB0 bwotICogYW55b25lIHJlc3VsdGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSByZXN0 cyBlbnRpcmVseSB3aXRoIHRoZQotICogdXNlci4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5 LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9z ZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRo ZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBh cHBlYXIgaW4gYWxsIGNvcGllcy4KICAqCi0gKiBTZW5kIGJ1ZyByZXBvcnRzLCBidWcgZml4ZXMs IGVuaGFuY2VtZW50cywgcmVxdWVzdHMsIGZsYW1lcywgZXRjLiwgYW5kCi0gKiBJJ2xsIHRyeSB0 byBrZWVwIGEgdmVyc2lvbiB1cCB0byBkYXRlLiAgSSBjYW4gYmUgcmVhY2hlZCBhcyBmb2xsb3dz OgotICogUGF1bCBWaXhpZSAgICAgICAgICA8cGF1bEB2aXguY29tPiAgICAgICAgICB1dW5ldCFk ZWN3cmwhdml4aWUhcGF1bAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5E IElTQyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09G VFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJ TElUWSBBTkQgRklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIElTQyBCRSBMSUFCTEUgRk9SCisg KiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT IE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNF LCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwg TkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCisgKiBPRiBP UiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRX QVJFLgogICovCiAKLSNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5lZChMSU5UKQotc3RhdGlj IGNvbnN0IGNoYXIgcmNzaWRbXSA9Ci0gICIkRnJlZUJTRDogcmVsZWFzZS8xMC4wLjAvdXNyLnNi aW4vY3Jvbi9jcm9uL2RhdGFiYXNlLmMgMTczNDEyIDIwMDctMTEtMDcgMTA6NTM6NDFaIGtldmxv ICQiOwotI2VuZGlmCisvLyNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5lZChMSU5UKQorLy9z dGF0aWMgY2hhciByY3NpZFtdID0gIiRJZDogZGF0YWJhc2UuYyx2IDEuNyAyMDA0LzAxLzIzIDE4 OjU2OjQyIHZpeGllIEV4cCAkIjsKKy8vI2VuZGlmCiAKIC8qIHZpeCAyNmphbjg3IFtSQ1MgaGFz IHRoZSBsb2ddCiAgKi8KIAotCiAjaW5jbHVkZSAiY3Jvbi5oIgotI2luY2x1ZGUgPGZjbnRsLmg+ Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotCiAKICNkZWZp bmUgVE1BWChhLGIpICgoYSk+KGIpPyhhKTooYikpCiAKLQotc3RhdGljCXZvaWQJCXByb2Nlc3Nf Y3JvbnRhYihjaGFyICosIGNoYXIgKiwgY2hhciAqLAotCQkJCQkgICAgIHN0cnVjdCBzdGF0ICos Ci0JCQkJCSAgICAgY3Jvbl9kYiAqLCBjcm9uX2RiICopOwotCitzdGF0aWMJdm9pZAkJcHJvY2Vz c19jcm9udGFiKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAorCQkJCQljb25zdCBjaGFyICos IHN0cnVjdCBzdGF0ICosCisJCQkJCWNyb25fZGIgKiwgY3Jvbl9kYiAqKTsKIAogdm9pZAotbG9h ZF9kYXRhYmFzZShvbGRfZGIpCi0JY3Jvbl9kYgkJKm9sZF9kYjsKLXsKLQlESVIJCSpkaXI7Ci0J c3RydWN0IHN0YXQJc3RhdGJ1ZjsKLQlzdHJ1Y3Qgc3RhdAlzeXNjcm9uX3N0YXQ7Ci0JRElSX1Qg ICAJKmRwOwotCWNyb25fZGIJCW5ld19kYjsKLQl1c2VyCQkqdSwgKm51OworbG9hZF9kYXRhYmFz ZShjcm9uX2RiICpvbGRfZGIpIHsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmLCBzeXNjcm9uX3N0YXQ7 CisJY3Jvbl9kYiBuZXdfZGI7CisJRElSX1QgKmRwOworCURJUiAqZGlyOworCXVzZXIgKnUsICpu dTsKIAotCURlYnVnKERMT0FELCAoIlslZF0gbG9hZF9kYXRhYmFzZSgpXG4iLCBnZXRwaWQoKSkp CisJRGVidWcoRExPQUQsICgiWyVsZF0gbG9hZF9kYXRhYmFzZSgpXG4iLCAobG9uZylnZXRwaWQo KSkpCiAKIAkvKiBiZWZvcmUgd2Ugc3RhcnQgbG9hZGluZyBhbnkgZGF0YSwgZG8gYSBzdGF0IG9u IFNQT09MX0RJUgogCSAqIHNvIHRoYXQgaWYgYW55dGhpbmcgY2hhbmdlcyBhcyBvZiB0aGlzIG1v bWVudCAoaS5lLiwgYmVmb3JlIHdlJ3ZlCkBAIC03Myw4ICs2Niw4IEBACiAJICogdGltZSB0aGlz IGZ1bmN0aW9uIGlzIGNhbGxlZC4KIAkgKi8KIAlpZiAob2xkX2RiLT5tdGltZSA9PSBUTUFYKHN0 YXRidWYuc3RfbXRpbWUsIHN5c2Nyb25fc3RhdC5zdF9tdGltZSkpIHsKLQkJRGVidWcoRExPQUQs ICgiWyVkXSBzcG9vbCBkaXIgbXRpbWUgdW5jaCwgbm8gbG9hZCBuZWVkZWQuXG4iLAotCQkJICAg ICAgZ2V0cGlkKCkpKQorCQlEZWJ1ZyhETE9BRCwgKCJbJWxkXSBzcG9vbCBkaXIgbXRpbWUgdW5j aCwgbm8gbG9hZCBuZWVkZWQuXG4iLAorCQkJICAgICAgKGxvbmcpZ2V0cGlkKCkpKQogCQlyZXR1 cm47CiAJfQogCkBAIC04NiwxMSArNzksOSBAQAogCW5ld19kYi5tdGltZSA9IFRNQVgoc3RhdGJ1 Zi5zdF9tdGltZSwgc3lzY3Jvbl9zdGF0LnN0X210aW1lKTsKIAluZXdfZGIuaGVhZCA9IG5ld19k Yi50YWlsID0gTlVMTDsKIAotCWlmIChzeXNjcm9uX3N0YXQuc3RfbXRpbWUpIHsKLQkJcHJvY2Vz c19jcm9udGFiKCJyb290IiwgU1lTX05BTUUsCi0JCQkJU1lTQ1JPTlRBQiwgJnN5c2Nyb25fc3Rh dCwKKwlpZiAoc3lzY3Jvbl9zdGF0LnN0X210aW1lKQorCQlwcm9jZXNzX2Nyb250YWIoInJvb3Qi LCBOVUxMLCBTWVNDUk9OVEFCLCAmc3lzY3Jvbl9zdGF0LAogCQkJCSZuZXdfZGIsIG9sZF9kYik7 Ci0JfQogCiAJLyogd2UgdXNlZCB0byBrZWVwIHRoaXMgZGlyIG9wZW4gYWxsIHRoZSB0aW1lLCBm b3IgdGhlIHNha2Ugb2YKIAkgKiBlZmZpY2llbmN5LiAgaG93ZXZlciwgd2UgbmVlZCB0byBjbG9z ZSBpdCBpbiBldmVyeSBmb3JrLCBhbmQKQEAgLTEwMiw4ICs5Myw3IEBACiAJfQogCiAJd2hpbGUg KE5VTEwgIT0gKGRwID0gcmVhZGRpcihkaXIpKSkgewotCQljaGFyCWZuYW1lW01BWE5BTUxFTisx XSwKLQkJCXRhYm5hbWVbTUFYTkFNTEVOKzFdOworCQljaGFyIGZuYW1lW01BWE5BTUxFTisxXSwg dGFibmFtZVtNQVhOQU1MRU4rMV07CiAKIAkJLyogYXZvaWQgZmlsZSBuYW1lcyBiZWdpbm5pbmcg d2l0aCAiLiIuICB0aGlzIGlzIGdvb2QKIAkJICogYmVjYXVzZSB3ZSB3b3VsZCBvdGhlcndpc2Ug d2FzdGUgdHdvIGd1YXJhbnRlZWQgY2FsbHMKQEAgLTExMyw5ICsxMDMsMTMgQEAKIAkJaWYgKGRw LT5kX25hbWVbMF0gPT0gJy4nKQogCQkJY29udGludWU7CiAKLQkJKHZvaWQpIHN0cm5jcHkoZm5h bWUsIGRwLT5kX25hbWUsIHNpemVvZihmbmFtZSkpOwotCQlmbmFtZVtzaXplb2YoZm5hbWUpLTFd ID0gJ1wwJzsKLQkJKHZvaWQpIHNucHJpbnRmKHRhYm5hbWUsIHNpemVvZiB0YWJuYW1lLCBDUk9O X1RBQihmbmFtZSkpOworCQlpZiAoc3RybGVuKGRwLT5kX25hbWUpID49IHNpemVvZiBmbmFtZSkK KwkJCWNvbnRpbnVlOwkvKiBYWFggbG9nPyAqLworCQkodm9pZCkgc3RybGNweShmbmFtZSwgZHAt PmRfbmFtZSwgc2l6ZW9mKGZuYW1lKSk7CisJCQorCQlpZiAoIWdsdWVfc3RyaW5ncyh0YWJuYW1l LCBzaXplb2YgdGFibmFtZSwgU1BPT0xfRElSLAorCQkJCSAgZm5hbWUsICcvJykpCisJCQljb250 aW51ZTsJLyogWFhYIGxvZz8gKi8KIAogCQlwcm9jZXNzX2Nyb250YWIoZm5hbWUsIGZuYW1lLCB0 YWJuYW1lLAogCQkJCSZzdGF0YnVmLCAmbmV3X2RiLCBvbGRfZGIpOwpAQCAtMTQ0LDEyICsxMzgs OCBAQAogCURlYnVnKERMT0FELCAoImxvYWRfZGF0YWJhc2UgaXMgZG9uZVxuIikpCiB9CiAKLQog dm9pZAotbGlua191c2VyKGRiLCB1KQotCWNyb25fZGIJKmRiOwotCXVzZXIJKnU7Ci17CitsaW5r X3VzZXIoY3Jvbl9kYiAqZGIsIHVzZXIgKnUpIHsKIAlpZiAoZGItPmhlYWQgPT0gTlVMTCkKIAkJ ZGItPmhlYWQgPSB1OwogCWlmIChkYi0+dGFpbCkKQEAgLTE1OSwxMiArMTQ5LDggQEAKIAlkYi0+ dGFpbCA9IHU7CiB9CiAKLQogdm9pZAotdW5saW5rX3VzZXIoZGIsIHUpCi0JY3Jvbl9kYgkqZGI7 Ci0JdXNlcgkqdTsKLXsKK3VubGlua191c2VyKGNyb25fZGIgKmRiLCB1c2VyICp1KSB7CiAJaWYg KHUtPnByZXYgPT0gTlVMTCkKIAkJZGItPmhlYWQgPSB1LT5uZXh0OwogCWVsc2UKQEAgLTE3Niw0 MyArMTYyLDM2IEBACiAJCXUtPm5leHQtPnByZXYgPSB1LT5wcmV2OwogfQogCi0KIHVzZXIgKgot ZmluZF91c2VyKGRiLCBuYW1lKQotCWNyb25fZGIJKmRiOwotCWNoYXIJKm5hbWU7Ci17Ci0JY2hh cgkqZW52X2dldCgpOwotCXVzZXIJKnU7CitmaW5kX3VzZXIoY3Jvbl9kYiAqZGIsIGNvbnN0IGNo YXIgKm5hbWUpIHsKKwl1c2VyICp1OwogCiAJZm9yICh1ID0gZGItPmhlYWQ7ICB1ICE9IE5VTEw7 ICB1ID0gdS0+bmV4dCkKLQkJaWYgKCFzdHJjbXAodS0+bmFtZSwgbmFtZSkpCisJCWlmIChzdHJj bXAodS0+bmFtZSwgbmFtZSkgPT0gMCkKIAkJCWJyZWFrOwotCXJldHVybiB1OworCXJldHVybiAo dSk7CiB9CiAKLQogc3RhdGljIHZvaWQKLXByb2Nlc3NfY3JvbnRhYih1bmFtZSwgZm5hbWUsIHRh Ym5hbWUsIHN0YXRidWYsIG5ld19kYiwgb2xkX2RiKQotCWNoYXIJCSp1bmFtZTsKLQljaGFyCQkq Zm5hbWU7Ci0JY2hhcgkJKnRhYm5hbWU7Ci0Jc3RydWN0IHN0YXQJKnN0YXRidWY7Ci0JY3Jvbl9k YgkJKm5ld19kYjsKLQljcm9uX2RiCQkqb2xkX2RiOworcHJvY2Vzc19jcm9udGFiKGNvbnN0IGNo YXIgKnVuYW1lLCBjb25zdCBjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqdGFibmFtZSwKKwkJc3Ry dWN0IHN0YXQgKnN0YXRidWYsIGNyb25fZGIgKm5ld19kYiwgY3Jvbl9kYiAqb2xkX2RiKQogewot CXN0cnVjdCBwYXNzd2QJKnB3ID0gTlVMTDsKLQlpbnQJCWNyb250YWJfZmQgPSBPSyAtIDE7Ci0J dXNlcgkJKnU7CisJc3RydWN0IHBhc3N3ZCAqcHcgPSBOVUxMOworCWludCBjcm9udGFiX2ZkID0g T0sgLSAxOworCXVzZXIgKnU7CiAKLQlpZiAoc3RyY21wKGZuYW1lLCBTWVNfTkFNRSkgJiYgIShw dyA9IGdldHB3bmFtKHVuYW1lKSkpIHsKKwlpZiAoZm5hbWUgPT0gTlVMTCkgeworCQkvKiBtdXN0 IGJlIHNldCB0byBzb21ldGhpbmcgZm9yIGxvZ2dpbmcgcHVycG9zZXMuCisJCSAqLworCQlmbmFt ZSA9ICIqc3lzdGVtKiI7CisJfSBlbHNlIGlmICgocHcgPSBnZXRwd25hbSh1bmFtZSkpID09IE5V TEwpIHsKIAkJLyogZmlsZSBkb2Vzbid0IGhhdmUgYSB1c2VyIGluIHBhc3N3ZCBmaWxlLgogCQkg Ki8KIAkJbG9nX2l0KGZuYW1lLCBnZXRwaWQoKSwgIk9SUEhBTiIsICJubyBwYXNzd2QgZW50cnki KTsKIAkJZ290byBuZXh0X2Nyb250YWI7CiAJfQogCi0JaWYgKChjcm9udGFiX2ZkID0gb3Blbih0 YWJuYW1lLCBPX1JET05MWSwgMCkpIDwgT0spIHsKKwlpZiAoKGNyb250YWJfZmQgPSBvcGVuKHRh Ym5hbWUsIE9fUkRPTkxZfE9fTk9OQkxPQ0t8T19OT0ZPTExPVywgMCkpIDwgT0spIHsKIAkJLyog Y3JvbnRhYiBub3QgYWNjZXNzaWJsZT8KIAkJICovCiAJCWxvZ19pdChmbmFtZSwgZ2V0cGlkKCks ICJDQU4nVCBPUEVOIiwgdGFibmFtZSk7CkBAIC0yMjMsNiArMjAyLDIzIEBACiAJCWxvZ19pdChm bmFtZSwgZ2V0cGlkKCksICJGU1RBVCBGQUlMRUQiLCB0YWJuYW1lKTsKIAkJZ290byBuZXh0X2Ny b250YWI7CiAJfQorCWlmICghU19JU1JFRyhzdGF0YnVmLT5zdF9tb2RlKSkgeworCQlsb2dfaXQo Zm5hbWUsIGdldHBpZCgpLCAiTk9UIFJFR1VMQVIiLCB0YWJuYW1lKTsKKwkJZ290byBuZXh0X2Ny b250YWI7CisJfQorCWlmICgoc3RhdGJ1Zi0+c3RfbW9kZSAmIDA3Nzc3KSAhPSAwNjAwKSB7CisJ CWxvZ19pdChmbmFtZSwgZ2V0cGlkKCksICJCQUQgRklMRSBNT0RFIiwgdGFibmFtZSk7CisJCWdv dG8gbmV4dF9jcm9udGFiOworCX0KKwlpZiAoc3RhdGJ1Zi0+c3RfdWlkICE9IFJPT1RfVUlEICYm IChwdyA9PSBOVUxMIHx8CisJICAgIHN0YXRidWYtPnN0X3VpZCAhPSBwdy0+cHdfdWlkIHx8IHN0 cmNtcCh1bmFtZSwgcHctPnB3X25hbWUpICE9IDApKSB7CisJCWxvZ19pdChmbmFtZSwgZ2V0cGlk KCksICJXUk9ORyBGSUxFIE9XTkVSIiwgdGFibmFtZSk7CisJCWdvdG8gbmV4dF9jcm9udGFiOwor CX0KKwlpZiAoc3RhdGJ1Zi0+c3RfbmxpbmsgIT0gMSkgeworCQlsb2dfaXQoZm5hbWUsIGdldHBp ZCgpLCAiQkFEIExJTksgQ09VTlQiLCB0YWJuYW1lKTsKKwkJZ290byBuZXh0X2Nyb250YWI7CisJ fQogCiAJRGVidWcoRExPQUQsICgiXHQlczoiLCBmbmFtZSkpCiAJdSA9IGZpbmRfdXNlcihvbGRf ZGIsIGZuYW1lKTsKQEAgLTI1NSw3ICsyNTEsNyBAQAogCQlsaW5rX3VzZXIobmV3X2RiLCB1KTsK IAl9CiAKLW5leHRfY3JvbnRhYjoKKyBuZXh0X2Nyb250YWI6CiAJaWYgKGNyb250YWJfZmQgPj0g T0spIHsKIAkJRGVidWcoRExPQUQsICgiIFtkb25lXVxuIikpCiAJCWNsb3NlKGNyb250YWJfZmQp OwpkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL2RvX2NvbW1hbmQuYyBmcmVl YnNkX2Nyb24vY3Jvbi9kb19jb21tYW5kLmMKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jv bi9kb19jb21tYW5kLmMJMjAxNC0wMS0xNiAyMTo0Mzo0OS4wMDAwMDAwMDAgKzAxMDAKKysrIGZy ZWVic2RfY3Jvbi9jcm9uL2RvX2NvbW1hbmQuYwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3MjQ0NDI3 NiArMDIwMApAQCAtMSw1NCArMSw0OSBAQAogLyogQ29weXJpZ2h0IDE5ODgsMTk5MCwxOTkzLDE5 OTQgYnkgUGF1bCBWaXhpZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICovCisKKy8qCisgKiBD b3B5cmlnaHQgKGMpIDIwMDQgYnkgSW50ZXJuZXQgU3lzdGVtcyBDb25zb3J0aXVtLCBJbmMuICgi SVNDIikKKyAqIENvcHlyaWdodCAoYykgMTk5NywyMDAwIGJ5IEludGVybmV0IFNvZnR3YXJlIENv bnNvcnRpdW0sIEluYy4KICAqCi0gKiBEaXN0cmlidXRlIGZyZWVseSwgZXhjZXB0OiBkb24ndCBy ZW1vdmUgbXkgbmFtZSBmcm9tIHRoZSBzb3VyY2Ugb3IKLSAqIGRvY3VtZW50YXRpb24gKGRvbid0 IHRha2UgY3JlZGl0IGZvciBteSB3b3JrKSwgbWFyayB5b3VyIGNoYW5nZXMgKGRvbid0Ci0gKiBn ZXQgbWUgYmxhbWVkIGZvciB5b3VyIHBvc3NpYmxlIGJ1Z3MpLCBkb24ndCBhbHRlciBvciByZW1v dmUgdGhpcwotICogbm90aWNlLiAgTWF5IGJlIHNvbGQgaWYgYnVpbGRhYmxlIHNvdXJjZSBpcyBw cm92aWRlZCB0byBidXllci4gIE5vCi0gKiB3YXJyYW50ZWUgb2YgYW55IGtpbmQsIGV4cHJlc3Mg b3IgaW1wbGllZCwgaXMgaW5jbHVkZWQgd2l0aCB0aGlzCi0gKiBzb2Z0d2FyZTsgdXNlIGF0IHlv dXIgb3duIHJpc2ssIHJlc3BvbnNpYmlsaXR5IGZvciBkYW1hZ2VzIChpZiBhbnkpIHRvCi0gKiBh bnlvbmUgcmVzdWx0aW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIHJlc3RzIGVudGly ZWx5IHdpdGggdGhlCi0gKiB1c2VyLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlm eSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGgg b3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3Zl CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBp biBhbGwgY29waWVzLgogICoKLSAqIFNlbmQgYnVnIHJlcG9ydHMsIGJ1ZyBmaXhlcywgZW5oYW5j ZW1lbnRzLCByZXF1ZXN0cywgZmxhbWVzLCBldGMuLCBhbmQKLSAqIEknbGwgdHJ5IHRvIGtlZXAg YSB2ZXJzaW9uIHVwIHRvIGRhdGUuICBJIGNhbiBiZSByZWFjaGVkIGFzIGZvbGxvd3M6Ci0gKiBQ YXVsIFZpeGllICAgICAgICAgIDxwYXVsQHZpeC5jb20+ICAgICAgICAgIHV1bmV0IWRlY3dybCF2 aXhpZSFwYXVsCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgSVNDIERJ U0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJ TkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFO RCBGSVRORVNTLiAgSU4gTk8gRVZFTlQgU0hBTEwgSVNDIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBT UEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5Z IERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEg T1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdF TkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKKyAqIE9GIE9SIElOIENP Tk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAg Ki8KIAotI2lmICFkZWZpbmVkKGxpbnQpICYmICFkZWZpbmVkKExJTlQpCi1zdGF0aWMgY29uc3Qg Y2hhciByY3NpZFtdID0KLSAgIiRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9u L2Nyb24vZG9fY29tbWFuZC5jIDIyODk5MCAyMDExLTEyLTMwIDEwOjU4OjE0WiB1cXMgJCI7Ci0j ZW5kaWYKLQorLy8jaWYgIWRlZmluZWQobGludCkgJiYgIWRlZmluZWQoTElOVCkKKy8vc3RhdGlj IGNoYXIgcmNzaWRbXSA9ICIkSWQ6IGRvX2NvbW1hbmQuYyx2IDEuOSAyMDA0LzAxLzIzIDE4OjU2 OjQyIHZpeGllIEV4cCAkIjsKKy8vI2VuZGlmCiAKICNpbmNsdWRlICJjcm9uLmgiCi0jaW5jbHVk ZSA8c3lzL3NpZ25hbC5oPgorCiAjaWYgZGVmaW5lZChzZXF1ZW50KQogIyBpbmNsdWRlIDxzeXMv dW5pdmVyc2UuaD4KICNlbmRpZgotI2lmIGRlZmluZWQoU1lTTE9HKQotIyBpbmNsdWRlIDxzeXNs b2cuaD4KLSNlbmRpZgorCiAjaWYgZGVmaW5lZChMT0dJTl9DQVApCiAjIGluY2x1ZGUgPGxvZ2lu X2NhcC5oPgogI2VuZGlmCisKICNpZmRlZiBQQU0KICMgaW5jbHVkZSA8c2VjdXJpdHkvcGFtX2Fw cGwuaD4KICMgaW5jbHVkZSA8c2VjdXJpdHkvb3BlbnBhbS5oPgogI2VuZGlmCi0KLQotc3RhdGlj IHZvaWQJCWNoaWxkX3Byb2Nlc3MoZW50cnkgKiwgdXNlciAqKSwKLQkJCWRvX3VuaXYodXNlciAq KTsKLQorc3RhdGljIHZvaWQJCWNoaWxkX3Byb2Nlc3MoZW50cnkgKiwgdXNlciAqKTsKK3N0YXRp YyBpbnQJCXNhZmVfcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CiAKIHZvaWQKLWRvX2Nv bW1hbmQoZSwgdSkKLQllbnRyeQkqZTsKLQl1c2VyCSp1OwoteworZG9fY29tbWFuZChlbnRyeSAq ZSwgdXNlciAqdSkgewogCURlYnVnKERQUk9DLCAoIlslZF0gZG9fY29tbWFuZCglcywgKCVzLCVk LCVkKSlcbiIsCi0JCWdldHBpZCgpLCBlLT5jbWQsIHUtPm5hbWUsIGUtPnVpZCwgZS0+Z2lkKSkK KwkJICAgICAgZ2V0cGlkKCksIGUtPmNtZCwgdS0+bmFtZSwgZS0+dWlkLCBlLT5naWQpKQogCiAJ LyogZm9yayB0byBiZWNvbWUgYXN5bmNocm9ub3VzIC0tIHBhcmVudCBwcm9jZXNzIGlzIGRvbmUg aW1tZWRpYXRlbHksCiAJICogYW5kIGNvbnRpbnVlcyB0byBydW4gdGhlIG5vcm1hbCBjcm9uIGNv ZGUsIHdoaWNoIG1lYW5zIHJldHVybiB0bwpAQCAtNTksNDEgKzU0LDM4IEBACiAJICovCiAJc3dp dGNoIChmb3JrKCkpIHsKIAljYXNlIC0xOgotCQlsb2dfaXQoIkNST04iLGdldHBpZCgpLCJlcnJv ciIsImNhbid0IGZvcmsiKTsKKwkJbG9nX2l0KCJDUk9OIiwgZ2V0cGlkKCksICJlcnJvciIsICJj YW4ndCBmb3JrIik7CiAJCWJyZWFrOwogCWNhc2UgMDoKIAkJLyogY2hpbGQgcHJvY2VzcyAqLwog CQlwaWRmaWxlX2Nsb3NlKHBmaCk7CiAJCWNoaWxkX3Byb2Nlc3MoZSwgdSk7Ci0JCURlYnVnKERQ Uk9DLCAoIlslZF0gY2hpbGQgcHJvY2VzcyBkb25lLCBleGl0aW5nXG4iLCBnZXRwaWQoKSkpCisJ CURlYnVnKERQUk9DLCAoIlslbGRdIGNoaWxkIHByb2Nlc3MgZG9uZSwgZXhpdGluZ1xuIiwKKwkJ CSAgICAgIChsb25nKWdldHBpZCgpKSkKIAkJX2V4aXQoT0tfRVhJVCk7CiAJCWJyZWFrOwogCWRl ZmF1bHQ6CiAJCS8qIHBhcmVudCBwcm9jZXNzICovCiAJCWJyZWFrOwogCX0KLQlEZWJ1ZyhEUFJP QywgKCJbJWRdIG1haW4gcHJvY2VzcyByZXR1cm5pbmcgdG8gd29ya1xuIiwgZ2V0cGlkKCkpKQor CURlYnVnKERQUk9DLCAoIlslbGRdIG1haW4gcHJvY2VzcyByZXR1cm5pbmcgdG8gd29ya1xuIiwo bG9uZylnZXRwaWQoKSkpCiB9CiAKLQogc3RhdGljIHZvaWQKLWNoaWxkX3Byb2Nlc3MoZSwgdSkK LQllbnRyeQkqZTsKLQl1c2VyCSp1OwotewotCWludAkJc3RkaW5fcGlwZVsyXSwgc3Rkb3V0X3Bp cGVbMl07Ci0JcmVnaXN0ZXIgY2hhcgkqaW5wdXRfZGF0YTsKLQljaGFyCQkqdXNlcm5tLCAqbWFp bHRvOwotCWludAkJY2hpbGRyZW4gPSAwOworY2hpbGRfcHJvY2VzcyhlbnRyeSAqZSwgdXNlciAq dSkgeworCWludCBzdGRpbl9waXBlWzJdLCBzdGRvdXRfcGlwZVsyXTsKKwljaGFyICppbnB1dF9k YXRhLCAqdXNlcm5tLCAqbWFpbHRvOworCWludCBjaGlsZHJlbiA9IDA7CisKICMgaWYgZGVmaW5l ZChMT0dJTl9DQVApCi0Jc3RydWN0IHBhc3N3ZAkqcHdkOworCXN0cnVjdCBwYXNzd2QgKnB3ZDsK IAlsb2dpbl9jYXBfdCAqbGM7CiAjIGVuZGlmCiAKLQlEZWJ1ZyhEUFJPQywgKCJbJWRdIGNoaWxk X3Byb2Nlc3MoJyVzJylcbiIsIGdldHBpZCgpLCBlLT5jbWQpKQorCURlYnVnKERQUk9DLCAoIlsl bGRdIGNoaWxkX3Byb2Nlc3MoJyVzJylcbiIsIChsb25nKWdldHBpZCgpLCBlLT5jbWQpKQogCi0J LyogbWFyayBvdXJzZWx2ZXMgYXMgZGlmZmVyZW50IHRvIFBTIGNvbW1hbmQgd2F0Y2hlcnMgYnkg dXBzaGlmdGluZwotCSAqIG91ciBwcm9ncmFtIG5hbWUuICBUaGlzIGhhcyBubyBlZmZlY3Qgb24g c29tZSBrZXJuZWxzLgorCS8qIG1hcmsgb3Vyc2VsdmVzIGFzIGRpZmZlcmVudCB0byBQUyBjb21t YW5kIHdhdGNoZXJzIGJ5IHVwc2hpdGluZworCSAqIG91ciBwcm9ncmFtIG5hbWUuIFRoaXMgaGFz IG5vIGVmZmVjdCBvbiBzb21lIGtlcm5lbHMuCiAJICovCiAJc2V0cHJvY3RpdGxlKCJydW5uaW5n IGpvYiIpOwogCkBAIC0xMDMsODggKzk1LDgwIEBACiAJbWFpbHRvID0gZW52X2dldCgiTUFJTFRP IiwgZS0+ZW52cCk7CiAKICNpZmRlZiBQQU0KLQkvKiB1c2UgUEFNIHRvIHNlZSBpZiB0aGUgdXNl cidzIGFjY291bnQgaXMgYXZhaWxhYmxlLAotCSAqIGkuZS4sIG5vdCBsb2NrZWQgb3IgZXhwaXJl ZCBvciB3aGF0ZXZlci4gIHNraXAgdGhpcwotCSAqIGZvciBzeXN0ZW0gdGFza3MgZnJvbSAvZXRj L2Nyb250YWIgLS0gdGhleSBjYW4gcnVuCi0JICogYXMgYW55IHVzZXIuCi0JICovCi0JaWYgKHN0 cmNtcCh1LT5uYW1lLCBTWVNfTkFNRSkpIHsJLyogbm90IGVxdWFsICovCi0JCXBhbV9oYW5kbGVf dCAqcGFtaCA9IE5VTEw7Ci0JCWludCBwYW1fZXJyOwotCQlzdHJ1Y3QgcGFtX2NvbnYgcGFtYyA9 IHsKLQkJCS5jb252ID0gb3BlbnBhbV9udWxsY29udiwKLQkJCS5hcHBkYXRhX3B0ciA9IE5VTEwK LQkJfTsKLQotCQlEZWJ1ZyhEUFJPQywgKCJbJWRdIGNoZWNraW5nIGFjY291bnQgd2l0aCBQQU1c biIsIGdldHBpZCgpKSkKLQotCQkvKiB1LT5uYW1lIGtlZXBzIGNyb250YWIgb3duZXIgbmFtZSB3 aGlsZSBMT0dOQU1FIGlzIHRoZSBuYW1lCi0JCSAqIG9mIHVzZXIgdG8gcnVuIGNvbW1hbmQgb24g YmVoYWxmIG9mLiAgdGhleSBzaG91bGQgYmUgdGhlCi0JCSAqIHNhbWUgZm9yIGEgdGFzayBmcm9t IGEgcGVyLXVzZXIgY3JvbnRhYi4KLQkJICovCi0JCWlmIChzdHJjbXAodS0+bmFtZSwgdXNlcm5t KSkgewotCQkJbG9nX2l0KHVzZXJubSwgZ2V0cGlkKCksICJ1c2VybmFtZSBhbWJpZ3VpdHkiLCB1 LT5uYW1lKTsKLQkJCWV4aXQoRVJST1JfRVhJVCk7Ci0JCX0KLQotCQlwYW1fZXJyID0gcGFtX3N0 YXJ0KCJjcm9uIiwgdXNlcm5tLCAmcGFtYywgJnBhbWgpOwotCQlpZiAocGFtX2VyciAhPSBQQU1f U1VDQ0VTUykgewotCQkJbG9nX2l0KCJDUk9OIiwgZ2V0cGlkKCksICJlcnJvciIsICJjYW4ndCBz dGFydCBQQU0iKTsKLQkJCWV4aXQoRVJST1JfRVhJVCk7Ci0JCX0KKyAgICAgICAgLyogdXNlIFBB TSB0byBzZWUgaWYgdGhlIHVzZXIncyBhY2NvdW50IGlzIGF2YWlsYWJsZSwKKyAgICAgICAgICog aS5lLiwgbm90IGxvY2tlZCBvciBleHBpcmVkIG9yIHdoYXRldmVyLiAgc2tpcCB0aGlzCisgICAg ICAgICAqIGZvciBzeXN0ZW0gdGFza3MgZnJvbSAvZXRjL2Nyb250YWIgLS0gdGhleSBjYW4gcnVu CisgICAgICAgICAqIGFzIGFueSB1c2VyLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHN0cmNt cCh1LT5uYW1lLCBTWVNfTkFNRSkpIHsgICAgICAgIC8qIG5vdCBlcXVhbCAqLworICAgICAgICAg ICAgICAgIHBhbV9oYW5kbGVfdCAqcGFtaCA9IE5VTEw7CisgICAgICAgICAgICAgICAgaW50IHBh bV9lcnI7CisgICAgICAgICAgICAgICAgc3RydWN0IHBhbV9jb252IHBhbWMgPSB7CisgICAgICAg ICAgICAgICAgICAgICAgICAuY29udiA9IG9wZW5wYW1fbnVsbGNvbnYsCisgICAgICAgICAgICAg ICAgICAgICAgICAuYXBwZGF0YV9wdHIgPSBOVUxMCisgICAgICAgICAgICAgICAgfTsKKworICAg ICAgICAgICAgICAgIERlYnVnKERQUk9DLCAoIlslZF0gY2hlY2tpbmcgYWNjb3VudCB3aXRoIFBB TVxuIiwgZ2V0cGlkKCkpKQorCisgICAgICAgICAgICAgICAgLyogdS0+bmFtZSBrZWVwcyBjcm9u dGFiIG93bmVyIG5hbWUgd2hpbGUgTE9HTkFNRSBpcyB0aGUgbmFtZQorICAgICAgICAgICAgICAg ICAqIG9mIHVzZXIgdG8gcnVuIGNvbW1hbmQgb24gYmVoYWxmIG9mLiAgdGhleSBzaG91bGQgYmUg dGhlCisgICAgICAgICAgICAgICAgICogc2FtZSBmb3IgYSB0YXNrIGZyb20gYSBwZXItdXNlciBj cm9udGFiLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChzdHJjbXAo dS0+bmFtZSwgdXNlcm5tKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2l0KHVzZXJu bSwgZ2V0cGlkKCksICJ1c2VybmFtZSBhbWJpZ3VpdHkiLCB1LT5uYW1lKTsKKyAgICAgICAgICAg ICAgICAgICAgICAgIGV4aXQoRVJST1JfRVhJVCk7CisgICAgICAgICAgICAgICAgfQorCisgICAg ICAgICAgICAgICAgcGFtX2VyciA9IHBhbV9zdGFydCgiY3JvbiIsIHVzZXJubSwgJnBhbWMsICZw YW1oKTsKKyAgICAgICAgICAgICAgICBpZiAocGFtX2VyciAhPSBQQU1fU1VDQ0VTUykgeworICAg ICAgICAgICAgICAgICAgICAgICAgbG9nX2l0KCJDUk9OIiwgZ2V0cGlkKCksICJlcnJvciIsICJj YW4ndCBzdGFydCBQQU0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoRVJST1JfRVhJ VCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcGFtX2VyciA9IHBhbV9h Y2N0X21nbXQocGFtaCwgUEFNX1NJTEVOVCk7CisgICAgICAgICAgICAgICAgLyogRXhwaXJlZCBw YXNzd29yZCBzaG91bGRuJ3QgcHJldmVudCB0aGUgam9iIGZyb20gcnVubmluZy4gKi8KKyAgICAg ICAgICAgICAgICBpZiAocGFtX2VyciAhPSBQQU1fU1VDQ0VTUyAmJiBwYW1fZXJyICE9IFBBTV9O RVdfQVVUSFRPS19SRVFEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaXQodXNlcm5t LCBnZXRwaWQoKSwgIlVTRVIiLCAiYWNjb3VudCB1bmF2YWlsYWJsZSIpOworICAgICAgICAgICAg ICAgICAgICAgICAgZXhpdChFUlJPUl9FWElUKTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJcGFt X2VyciA9IHBhbV9hY2N0X21nbXQocGFtaCwgUEFNX1NJTEVOVCk7Ci0JCS8qIEV4cGlyZWQgcGFz c3dvcmQgc2hvdWxkbid0IHByZXZlbnQgdGhlIGpvYiBmcm9tIHJ1bm5pbmcuICovCi0JCWlmIChw YW1fZXJyICE9IFBBTV9TVUNDRVNTICYmIHBhbV9lcnIgIT0gUEFNX05FV19BVVRIVE9LX1JFUUQp IHsKLQkJCWxvZ19pdCh1c2Vybm0sIGdldHBpZCgpLCAiVVNFUiIsICJhY2NvdW50IHVuYXZhaWxh YmxlIik7Ci0JCQlleGl0KEVSUk9SX0VYSVQpOwotCQl9Ci0KLQkJcGFtX2VuZChwYW1oLCBwYW1f ZXJyKTsKLQl9CisgICAgICAgICAgICAgICAgcGFtX2VuZChwYW1oLCBwYW1fZXJyKTsKKyAgICAg ICAgfQogI2VuZGlmCiAKLSNpZmRlZiBVU0VfU0lHQ0hMRAogCS8qIG91ciBwYXJlbnQgaXMgd2F0 Y2hpbmcgZm9yIG91ciBkZWF0aCBieSBjYXRjaGluZyBTSUdDSExELiAgd2UKIAkgKiBkbyBub3Qg Y2FyZSB0byB3YXRjaCBmb3Igb3VyIGNoaWxkcmVuJ3MgZGVhdGhzIHRoaXMgd2F5IC0tIHdlCi0J ICogdXNlIHdhaXQoKSBleHBsaWNpdGx5LiAgc28gd2UgaGF2ZSB0byBkaXNhYmxlIHRoZSBzaWdu YWwgKHdoaWNoCisJICogdXNlIHdhaXQoKSBleHBsaWNpdGx5LiAgc28gd2UgaGF2ZSB0byByZXNl dCB0aGUgc2lnbmFsICh3aGljaAogCSAqIHdhcyBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50KS4K IAkgKi8KIAkodm9pZCkgc2lnbmFsKFNJR0NITEQsIFNJR19ERkwpOwotI2Vsc2UKLQkvKiBvbiBz eXN0ZW0tViBzeXN0ZW1zLCB3ZSBhcmUgaWdub3JpbmcgU0lHQ0xELiAgd2UgaGF2ZSB0byBzdG9w Ci0JICogaWdub3JpbmcgaXQgbm93IG9yIHRoZSB3YWl0KCkgaW4gY3Jvbl9wY2xvc2UoKSB3b24n dCB3b3JrLgotCSAqIGJlY2F1c2Ugb2YgdGhpcywgd2UgaGF2ZSB0byB3YWl0KCkgZm9yIG91ciBj aGlsZHJlbiBoZXJlLCBhcyB3ZWxsLgotCSAqLwotCSh2b2lkKSBzaWduYWwoU0lHQ0xELCBTSUdf REZMKTsKLSNlbmRpZiAvKkJTRCovCiAKIAkvKiBjcmVhdGUgc29tZSBwaXBlcyB0byB0YWxrIHRv IG91ciBmdXR1cmUgY2hpbGQKIAkgKi8KIAlwaXBlKHN0ZGluX3BpcGUpOwkvKiBjaGlsZCdzIHN0 ZGluICovCiAJcGlwZShzdGRvdXRfcGlwZSk7CS8qIGNoaWxkJ3Mgc3Rkb3V0ICovCi0KKwkKIAkv KiBzaW5jZSB3ZSBhcmUgYSBmb3JrZWQgcHJvY2Vzcywgd2UgY2FuIGRpZGRsZSB0aGUgY29tbWFu ZCBzdHJpbmcKIAkgKiB3ZSB3ZXJlIHBhc3NlZCAtLSBub2JvZHkgZWxzZSBpcyBnb2luZyB0byB1 c2UgaXQgYWdhaW4sIHJpZ2h0PwogCSAqCiAJICogaWYgYSAlIGlzIHByZXNlbnQgaW4gdGhlIGNv bW1hbmQsIHByZXZpb3VzIGNoYXJhY3RlcnMgYXJlIHRoZQogCSAqIGNvbW1hbmQsIGFuZCBzdWJz ZXF1ZW50IGNoYXJhY3RlcnMgYXJlIHRoZSBhZGRpdGlvbmFsIGlucHV0IHRvCi0JICogdGhlIGNv bW1hbmQuICBTdWJzZXF1ZW50ICUncyB3aWxsIGJlIHRyYW5zZm9ybWVkIGludG8gbmV3bGluZXMs CisJICogdGhlIGNvbW1hbmQuICBBbiBlc2NhcGVkICUgd2lsbCBoYXZlIHRoZSBlc2NhcGUgY2hh cmFjdGVyIHN0cmlwcGVkCisJICogZnJvbSBpdC4gIFN1YnNlcXVlbnQgJSdzIHdpbGwgYmUgdHJh bnNmb3JtZWQgaW50byBuZXdsaW5lcywKIAkgKiBidXQgdGhhdCBoYXBwZW5zIGxhdGVyLgotCSAq Ci0JICogSWYgdGhlcmUgYXJlIGVzY2FwZWQgJSdzLCByZW1vdmUgdGhlIGVzY2FwZSBjaGFyYWN0 ZXIuCiAJICovCiAJLypsb2NhbCovewotCQlyZWdpc3RlciBpbnQgZXNjYXBlZCA9IEZBTFNFOwot CQlyZWdpc3RlciBpbnQgY2g7Ci0JCXJlZ2lzdGVyIGNoYXIgKnA7CisJCWludCBlc2NhcGVkID0g RkFMU0U7CisJCWludCBjaDsKKwkJY2hhciAqcDsKIAotCQlmb3IgKGlucHV0X2RhdGEgPSBwID0g ZS0+Y21kOyAoY2ggPSAqaW5wdXRfZGF0YSk7CisJCWZvciAoaW5wdXRfZGF0YSA9IHAgPSBlLT5j bWQ7CisJCSAgICAgKGNoID0gKmlucHV0X2RhdGEpICE9ICdcMCc7CiAJCSAgICAgaW5wdXRfZGF0 YSsrLCBwKyspIHsKIAkJCWlmIChwICE9IGlucHV0X2RhdGEpCi0JCQkgICAgKnAgPSBjaDsKKwkJ CQkqcCA9IGNoOwogCQkJaWYgKGVzY2FwZWQpIHsKLQkJCQlpZiAoY2ggPT0gJyUnIHx8IGNoID09 ICdcXCcpCisJCQkJaWYgKGNoID09ICclJykKIAkJCQkJKi0tcCA9IGNoOwogCQkJCWVzY2FwZWQg PSBGQUxTRTsKIAkJCQljb250aW51ZTsKQEAgLTIwNSwyNiArMTg5LDI0IEBACiAJICovCiAJc3dp dGNoICh2Zm9yaygpKSB7CiAJY2FzZSAtMToKLQkJbG9nX2l0KCJDUk9OIixnZXRwaWQoKSwiZXJy b3IiLCJjYW4ndCB2Zm9yayIpOworCQlsb2dfaXQoIkNST04iLCBnZXRwaWQoKSwgImVycm9yIiwg ImNhbid0IHZmb3JrIik7CiAJCWV4aXQoRVJST1JfRVhJVCk7CiAJCS8qTk9UUkVBQ0hFRCovCiAJ Y2FzZSAwOgotCQlEZWJ1ZyhEUFJPQywgKCJbJWRdIGdyYW5kY2hpbGQgcHJvY2VzcyBWZm9yaygp J2VkXG4iLAotCQkJICAgICAgZ2V0cGlkKCkpKQotCisJCURlYnVnKERQUk9DLCAoIlslbGRdIGdy YW5kY2hpbGQgcHJvY2VzcyB2Zm9yaygpJ2VkXG4iLAorCQkJICAgICAgKGxvbmcpZ2V0cGlkKCkp KQogCQlpZiAoZS0+dWlkID09IFJPT1RfVUlEKQogCQkJSml0dGVyID0gUm9vdEppdHRlcjsKIAkJ aWYgKEppdHRlciAhPSAwKSB7CiAJCQlzcmFuZG9tKGdldHBpZCgpKTsKIAkJCXNsZWVwKHJhbmRv bSgpICUgSml0dGVyKTsKIAkJfQotCiAJCS8qIHdyaXRlIGEgbG9nIG1lc3NhZ2UuICB3ZSd2ZSB3 YWl0ZWQgdGhpcyBsb25nIHRvIGRvIGl0CiAJCSAqIGJlY2F1c2UgaXQgd2FzIG5vdCB1bnRpbCBu b3cgdGhhdCB3ZSBrbmV3IHRoZSBQSUQgdGhhdAogCQkgKiB0aGUgYWN0dWFsIHVzZXIgY29tbWFu ZCBzaGVsbCB3YXMgZ29pbmcgdG8gZ2V0IGFuZCB0aGUKIAkJICogUElEIGlzIHBhcnQgb2YgdGhl IGxvZyBtZXNzYWdlLgogCQkgKi8KLQkJLypsb2NhbCoveworCQlpZiAoKGUtPmZsYWdzICYgRE9O VF9MT0cpID09IDApIHsKIAkJCWNoYXIgKnggPSBta3ByaW50cygodV9jaGFyICopZS0+Y21kLCBz dHJsZW4oZS0+Y21kKSk7CiAKIAkJCWxvZ19pdCh1c2Vybm0sIGdldHBpZCgpLCAiQ01EIiwgeCk7 CkBAIC0yMzMsOSArMjE1LDcgQEAKIAogCQkvKiB0aGF0J3MgdGhlIGxhc3QgdGhpbmcgd2UnbGwg bG9nLiAgY2xvc2UgdGhlIGxvZyBmaWxlcy4KIAkJICovCi0jaWZkZWYgU1lTTE9HCi0JCWNsb3Nl bG9nKCk7Ci0jZW5kaWYKKwkJbG9nX2Nsb3NlKCk7CiAKIAkJLyogZ2V0IG5ldyBwZ3JwLCB2b2lk IHR0eSwgZXRjLgogCQkgKi8KQEAgLTI1Myw3NSArMjMzLDc1IEBACiAJCS8qIGdyYW5kY2hpbGQg cHJvY2Vzcy4gIG1ha2Ugc3Rke2luLG91dH0gYmUgdGhlIGVuZHMgb2YKIAkJICogcGlwZXMgb3Bl bmVkIGJ5IG91ciBkYWRkeTsgbWFrZSBzdGRlcnIgZ28gdG8gc3Rkb3V0LgogCQkgKi8KLQkJY2xv c2UoU1RESU4pOwlkdXAyKHN0ZGluX3BpcGVbUkVBRF9QSVBFXSwgU1RESU4pOwotCQljbG9zZShT VERPVVQpOwlkdXAyKHN0ZG91dF9waXBlW1dSSVRFX1BJUEVdLCBTVERPVVQpOwotCQljbG9zZShT VERFUlIpOwlkdXAyKFNURE9VVCwgU1RERVJSKTsKLQotCQkvKiBjbG9zZSB0aGUgcGlwZXMgd2Ug anVzdCBkdXAnZWQuICBUaGUgcmVzb3VyY2VzIHdpbGwgcmVtYWluLgotCQkgKi8KLQkJY2xvc2Uo c3RkaW5fcGlwZVtSRUFEX1BJUEVdKTsKLQkJY2xvc2Uoc3Rkb3V0X3BpcGVbV1JJVEVfUElQRV0p OwotCi0JCS8qIHNldCBvdXIgbG9naW4gdW5pdmVyc2UuICBEbyB0aGlzIGluIHRoZSBncmFuZGNo aWxkCi0JCSAqIHNvIHRoYXQgdGhlIGNoaWxkIGNhbiBpbnZva2UgL3Vzci9saWIvc2VuZG1haWwK LQkJICogd2l0aG91dCBzdXJwcmlzZXMuCi0JCSAqLwotCQlkb191bml2KHUpOwotCi0jIGlmIGRl ZmluZWQoTE9HSU5fQ0FQKQotCQkvKiBTZXQgdXNlcidzIGVudGlyZSBjb250ZXh0LCBidXQgc2tp cCB0aGUgZW52aXJvbm1lbnQKLQkJICogYXMgY3JvbiBwcm92aWRlcyBhIHNlcGFyYXRlIGludGVy ZmFjZSBmb3IgdGhpcwotCQkgKi8KLQkJaWYgKChwd2QgPSBnZXRwd25hbSh1c2Vybm0pKSA9PSBO VUxMKQotCQkJcHdkID0gZ2V0cHd1aWQoZS0+dWlkKTsKLQkJbGMgPSBOVUxMOwotCQlpZiAocHdk ICE9IE5VTEwpIHsKLQkJCXB3ZC0+cHdfZ2lkID0gZS0+Z2lkOwotCQkJaWYgKGUtPmNsYXNzICE9 IE5VTEwpCi0JCQkJbGMgPSBsb2dpbl9nZXRjbGFzcyhlLT5jbGFzcyk7Ci0JCX0KLQkJaWYgKHB3 ZCAmJgotCQkgICAgc2V0dXNlcmNvbnRleHQobGMsIHB3ZCwgZS0+dWlkLAotCQkJICAgIExPR0lO X1NFVEFMTCAmIH4oTE9HSU5fU0VUUEFUSHxMT0dJTl9TRVRFTlYpKSA9PSAwKQotCQkJKHZvaWQp IGVuZHB3ZW50KCk7Ci0JCWVsc2UgewotCQkJLyogZmFsbCBiYWNrIHRvIHRoZSBvbGQgbWV0aG9k ICovCi0JCQkodm9pZCkgZW5kcHdlbnQoKTsKLSMgZW5kaWYKLQkJCS8qIHNldCBvdXIgZGlyZWN0 b3J5LCB1aWQgYW5kIGdpZC4gIFNldCBnaWQgZmlyc3QsCi0JCQkgKiBzaW5jZSBvbmNlIHdlIHNl dCB1aWQsIHdlJ3ZlIGxvc3Qgcm9vdCBwcml2aWxlZ2VzLgotCQkJICovCi0JCQlpZiAoc2V0Z2lk KGUtPmdpZCkgIT0gMCkgewotCQkJCWxvZ19pdCh1c2Vybm0sIGdldHBpZCgpLAotCQkJCSAgICAi ZXJyb3IiLCAic2V0Z2lkIGZhaWxlZCIpOwotCQkJCWV4aXQoRVJST1JfRVhJVCk7Ci0JCQl9CisJ CWlmIChzdGRpbl9waXBlW1JFQURfUElQRV0gIT0gU1RESU4pIHsKKwkJCWR1cDIoc3RkaW5fcGlw ZVtSRUFEX1BJUEVdLCBTVERJTik7CisJCQljbG9zZShzdGRpbl9waXBlW1JFQURfUElQRV0pOwor CQl9CisJCWlmIChzdGRvdXRfcGlwZVtXUklURV9QSVBFXSAhPSBTVERPVVQpIHsKKwkJCWR1cDIo c3Rkb3V0X3BpcGVbV1JJVEVfUElQRV0sIFNURE9VVCk7CisJCQljbG9zZShzdGRvdXRfcGlwZVtX UklURV9QSVBFXSk7CisJCX0KKwkJZHVwMihTVERPVVQsIFNUREVSUik7CisKKworI2lmZGVmIExP R0lOX0NBUAorIC8qIFNldCB1c2VyJ3MgZW50aXJlIGNvbnRleHQsIGJ1dCBza2lwIHRoZSBlbnZp cm9ubWVudAorICAgICAgICAgICAgICAgICAqIGFzIGNyb24gcHJvdmlkZXMgYSBzZXBhcmF0ZSBp bnRlcmZhY2UgZm9yIHRoaXMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBp ZiAoKHB3ZCA9IGdldHB3bmFtKHVzZXJubSkpID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAg ICAgICBwd2QgPSBnZXRwd3VpZChlLT51aWQpOworICAgICAgICAgICAgICAgIGxjID0gTlVMTDsK KyAgICAgICAgICAgICAgICBpZiAocHdkICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAg ICAgIHB3ZC0+cHdfZ2lkID0gZS0+Z2lkOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUt PmNsYXNzICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjID0gbG9n aW5fZ2V0Y2xhc3MoZS0+Y2xhc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg ICBpZiAocHdkICYmCisgICAgICAgICAgICAgICAgICAgIHNldHVzZXJjb250ZXh0KGxjLCBwd2Qs IGUtPnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dJTl9TRVRBTEwgJiB+KExP R0lOX1NFVFBBVEh8TE9HSU5fU0VURU5WKSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAg ICh2b2lkKSBlbmRwd2VudCgpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAg ICAgICAgICAgICAgLyogZmFsbCBiYWNrIHRvIHRoZSBvbGQgbWV0aG9kICovCisgICAgICAgICAg ICAgICAgICAgICAgICAodm9pZCkgZW5kcHdlbnQoKTsKKworCisjZW5kaWYgLyogTE9HSU5fQ0FQ ICovCisgICAgICAgICAgICAgICAgICAgIC8qIHNldCBvdXIgZGlyZWN0b3J5LCB1aWQgYW5kIGdp ZC4gIFNldCBnaWQgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaW5jZSBvbmNl IHdlIHNldCB1aWQsIHdlJ3ZlIGxvc3Qgcm9vdCBwcml2aWxlZ2VzLgorICAgICAgICAgICAgICAg ICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0Z2lkKGUtPmdpZCkg IT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaXQodXNlcm5tLCBn ZXRwaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciIsICJz ZXRnaWQgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoRVJS T1JfRVhJVCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAjIGlmIGRlZmluZWQoQlNEKQot CQkJaWYgKGluaXRncm91cHModXNlcm5tLCBlLT5naWQpICE9IDApIHsKLQkJCQlsb2dfaXQodXNl cm5tLCBnZXRwaWQoKSwKLQkJCQkgICAgImVycm9yIiwgImluaXRncm91cHMgZmFpbGVkIik7Ci0J CQkJZXhpdChFUlJPUl9FWElUKTsKLQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChp bml0Z3JvdXBzKHVzZXJubSwgZS0+Z2lkKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGxvZ19pdCh1c2Vybm0sIGdldHBpZCgpLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgImVycm9yIiwgImluaXRncm91cHMgZmFpbGVkIik7CisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGV4aXQoRVJST1JfRVhJVCk7CisgICAgICAgICAgICAgICAg ICAgICAgICB9CiAjIGVuZGlmCi0JCQlpZiAoc2V0bG9naW4odXNlcm5tKSAhPSAwKSB7Ci0JCQkJ bG9nX2l0KHVzZXJubSwgZ2V0cGlkKCksCi0JCQkJICAgICJlcnJvciIsICJzZXRsb2dpbiBmYWls ZWQiKTsKLQkJCQlleGl0KEVSUk9SX0VYSVQpOwotCQkJfQotCQkJaWYgKHNldHVpZChlLT51aWQp ICE9IDApIHsKLQkJCQlsb2dfaXQodXNlcm5tLCBnZXRwaWQoKSwKLQkJCQkgICAgImVycm9yIiwg InNldHVpZCBmYWlsZWQiKTsKLQkJCQlleGl0KEVSUk9SX0VYSVQpOwotCQkJfQotCQkJLyogd2Ug YXJlbid0IHJvb3QgYWZ0ZXIgdGhpcy4uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChz ZXRsb2dpbih1c2Vybm0pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg bG9nX2l0KHVzZXJubSwgZ2V0cGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAiZXJyb3IiLCAic2V0bG9naW4gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGV4aXQoRVJST1JfRVhJVCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9Cisg ICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dWlkKGUtPnVpZCkgIT0gMCkgeworICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaXQodXNlcm5tLCBnZXRwaWQoKSwKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciIsICJzZXR1aWQgZmFpbGVkIik7 CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoRVJST1JfRVhJVCk7CisgICAg ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmVu J3Qgcm9vdCBhZnRlciB0aGlzLi4qLwogI2lmIGRlZmluZWQoTE9HSU5fQ0FQKQotCQl9Ci0JCWlm IChsYyAhPSBOVUxMKQotCQkJbG9naW5fY2xvc2UobGMpOworICAgICAgICAgICAgICAgIH0KKyAg ICAgICAgICAgICAgICBpZiAobGMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxv Z2luX2Nsb3NlKGxjKTsKICNlbmRpZgorCiAJCWNoZGlyKGVudl9nZXQoIkhPTUUiLCBlLT5lbnZw KSk7CiAKLQkJLyogZXhlYyB0aGUgY29tbWFuZC4KKwkJLyoKKwkJICogRXhlYyB0aGUgY29tbWFu ZC4KIAkJICovCiAJCXsKIAkJCWNoYXIJKnNoZWxsID0gZW52X2dldCgiU0hFTEwiLCBlLT5lbnZw KTsKQEAgLTMzNiw3ICszMTYsOCBAQAogCQkJfQogIyBlbmRpZiAvKkRFQlVHR0lORyovCiAJCQll eGVjbGUoc2hlbGwsIHNoZWxsLCAiLWMiLCBlLT5jbWQsIChjaGFyICopMCwgZS0+ZW52cCk7Ci0J CQl3YXJuKCJleGVjbDogY291bGRuJ3QgZXhlYyBgJXMnIiwgc2hlbGwpOworCQkJZnByaW50Zihz dGRlcnIsICJleGVjbDogY291bGRuJ3QgZXhlYyBgJXMnXG4iLCBzaGVsbCk7CisJCQlwZXJyb3Io ImV4ZWNsIik7CiAJCQlfZXhpdChFUlJPUl9FWElUKTsKIAkJfQogCQlicmVhazsKQEAgLTM1MSw3 ICszMzIsNyBAQAogCSAqIHRoZSB1c2VyJ3MgY29tbWFuZC4KIAkgKi8KIAotCURlYnVnKERQUk9D LCAoIlslZF0gY2hpbGQgY29udGludWVzLCBjbG9zaW5nIHBpcGVzXG4iLCBnZXRwaWQoKSkpCisJ RGVidWcoRFBST0MsICgiWyVsZF0gY2hpbGQgY29udGludWVzLCBjbG9zaW5nIHBpcGVzXG4iLChs b25nKWdldHBpZCgpKSkKIAogCS8qIGNsb3NlIHRoZSBlbmRzIG9mIHRoZSBwaXBlIHRoYXQgd2ls bCBvbmx5IGJlIHJlZmVyZW5jZWQgaW4gdGhlCiAJICogZ3JhbmRjaGlsZCBwcm9jZXNzLi4uCkBA IC0zNzEsMTcgKzM1MiwxOCBAQAogCSAqLwogCiAJaWYgKCppbnB1dF9kYXRhICYmIGZvcmsoKSA9 PSAwKSB7Ci0JCXJlZ2lzdGVyIEZJTEUJKm91dCA9IGZkb3BlbihzdGRpbl9waXBlW1dSSVRFX1BJ UEVdLCAidyIpOwotCQlyZWdpc3RlciBpbnQJbmVlZF9uZXdsaW5lID0gRkFMU0U7Ci0JCXJlZ2lz dGVyIGludAllc2NhcGVkID0gRkFMU0U7Ci0JCXJlZ2lzdGVyIGludAljaDsKKwkJRklMRSAqb3V0 ID0gZmRvcGVuKHN0ZGluX3BpcGVbV1JJVEVfUElQRV0sICJ3Iik7CisJCWludCBuZWVkX25ld2xp bmUgPSBGQUxTRTsKKwkJaW50IGVzY2FwZWQgPSBGQUxTRTsKKwkJaW50IGNoOwogCiAJCWlmIChv dXQgPT0gTlVMTCkgewotCQkJd2FybigiZmRvcGVuIGZhaWxlZCBpbiBjaGlsZDIiKTsKKwkJCXdh cm4oImZkb3BlbiBpbiBjaGlsZDIiKTsKIAkJCV9leGl0KEVSUk9SX0VYSVQpOwogCQl9CiAKLQkJ RGVidWcoRFBST0MsICgiWyVkXSBjaGlsZDIgc2VuZGluZyBkYXRhIHRvIGdyYW5kY2hpbGRcbiIs IGdldHBpZCgpKSkKKwkJRGVidWcoRFBST0MsICgiWyVsZF0gY2hpbGQyIHNlbmRpbmcgZGF0YSB0 byBncmFuZGNoaWxkXG4iLAorCQkJICAgICAgKGxvbmcpZ2V0cGlkKCkpKQogCiAJCS8qIGNsb3Nl IHRoZSBwaXBlIHdlIGRvbid0IHVzZSwgc2luY2Ugd2UgaW5oZXJpdGVkIGl0IGFuZAogCQkgKiBh cmUgcGFydCBvZiBpdHMgcmVmZXJlbmNlIGNvdW50IG5vdy4KQEAgLTM5Myw3ICszNzUsNyBAQAog CQkgKgklICAtPiBcbgogCQkgKglceCAtPiBceAlmb3IgYWxsIHggIT0gJQogCQkgKi8KLQkJd2hp bGUgKChjaCA9ICppbnB1dF9kYXRhKyspKSB7CisJCXdoaWxlICgoY2ggPSAqaW5wdXRfZGF0YSsr KSAhPSAnXDAnKSB7CiAJCQlpZiAoZXNjYXBlZCkgewogCQkJCWlmIChjaCAhPSAnJScpCiAJCQkJ CXB1dGMoJ1xcJywgb3V0KTsKQEAgLTQxNyw3ICszOTksOCBAQAogCQkgKi8KIAkJZmNsb3NlKG91 dCk7CiAKLQkJRGVidWcoRFBST0MsICgiWyVkXSBjaGlsZDIgZG9uZSBzZW5kaW5nIHRvIGdyYW5k Y2hpbGRcbiIsIGdldHBpZCgpKSkKKwkJRGVidWcoRFBST0MsICgiWyVsZF0gY2hpbGQyIGRvbmUg c2VuZGluZyB0byBncmFuZGNoaWxkXG4iLAorCQkJICAgICAgKGxvbmcpZ2V0cGlkKCkpKQogCQll eGl0KDApOwogCX0KIApAQCAtNDM1LDU3ICs0MTgsNjcgQEAKIAkgKiB3aGVuIHRoZSBncmFuZGNo aWxkIGV4aXRzLCB3ZSdsbCBnZXQgRU9GLgogCSAqLwogCi0JRGVidWcoRFBST0MsICgiWyVkXSBj aGlsZCByZWFkaW5nIG91dHB1dCBmcm9tIGdyYW5kY2hpbGRcbiIsIGdldHBpZCgpKSkKKwlEZWJ1 ZyhEUFJPQywgKCJbJWxkXSBjaGlsZCByZWFkaW5nIG91dHB1dCBmcm9tIGdyYW5kY2hpbGRcbiIs CisJCSAgICAgIChsb25nKWdldHBpZCgpKSkKIAogCS8qbG9jYWwqL3sKLQkJcmVnaXN0ZXIgRklM RQkqaW4gPSBmZG9wZW4oc3Rkb3V0X3BpcGVbUkVBRF9QSVBFXSwgInIiKTsKLQkJcmVnaXN0ZXIg aW50CWNoOworCQlGSUxFCSppbiA9IGZkb3BlbihzdGRvdXRfcGlwZVtSRUFEX1BJUEVdLCAiciIp OworCQlpbnQJY2ggPSBnZXRjKGluKTsKIAogCQlpZiAoaW4gPT0gTlVMTCkgewogCQkJd2Fybigi ZmRvcGVuIGZhaWxlZCBpbiBjaGlsZCIpOwogCQkJX2V4aXQoRVJST1JfRVhJVCk7CiAJCX0KIAot CQljaCA9IGdldGMoaW4pOwogCQlpZiAoY2ggIT0gRU9GKSB7Ci0JCQlyZWdpc3RlciBGSUxFCSpt YWlsOwotCQkJcmVnaXN0ZXIgaW50CWJ5dGVzID0gMTsKLQkJCWludAkJc3RhdHVzID0gMDsKKwkJ CUZJTEUJKm1haWw7CisJCQlpbnQJYnl0ZXMgPSAxOworCQkJaW50CXN0YXR1cyA9IDA7CiAKIAkJ CURlYnVnKERQUk9DfERFWFQsCi0JCQkJKCJbJWRdIGdvdCBkYXRhICgleDolYykgZnJvbSBncmFu ZGNoaWxkXG4iLAotCQkJCQlnZXRwaWQoKSwgY2gsIGNoKSkKKwkJCSAgICAgICgiWyVsZF0gZ290 IGRhdGEgKCV4OiVjKSBmcm9tIGdyYW5kY2hpbGRcbiIsCisJCQkgICAgICAgKGxvbmcpZ2V0cGlk KCksIGNoLCBjaCkpCiAKIAkJCS8qIGdldCBuYW1lIG9mIHJlY2lwaWVudC4gIHRoaXMgaXMgTUFJ TFRPIGlmIHNldCB0byBhCiAJCQkgKiB2YWxpZCBsb2NhbCB1c2VybmFtZTsgVVNFUiBvdGhlcndp c2UuCiAJCQkgKi8KLQkJCWlmIChtYWlsdG8gPT0gTlVMTCkgewotCQkJCS8qIE1BSUxUTyBub3Qg cHJlc2VudCwgc2V0IHRvIFVTRVIsCi0JCQkJICogdW5sZXNzIGdsb2JhbGx5IG92ZXJyaWRlbi4K KwkJCWlmKG1haWx0byA9PSBOVUxMKSB7CisJCQkJLypNQUlMVE8gbm90IHByZXNlbnQsIHNldCB0 byBVU0VSLAorCQkJCSAqIHVubGVzcyBnbG9iYWxseSBvdmVycmlkZW4KIAkJCQkgKi8KLQkJCQlp ZiAoZGVmbWFpbHRvKQorCQkJCWlmICghKm1haWx0bykgeworCQkJCQkvKiAuLi4gYnV0IGl0J3Mg ZW1wdHkuIHNldCB0byBOVUxMCisJCQkJCSAqLworCQkJCQltYWlsdG8gPSBOVUxMOworCQkJCX0K KwkJCX0gZWxzZSB7CisJCQkJLyogTUFJTFRPIG5vdCBwcmVzZW50LCBzZXQgdG8gVVNFUi4KKwkJ CQkgKi8KKwkJCQlpZiAoZGVmbWFpbHRvKSAKIAkJCQkJbWFpbHRvID0gZGVmbWFpbHRvOwotCQkJ CWVsc2UKKwkJCQllbHNlIAogCQkJCQltYWlsdG8gPSB1c2Vybm07CiAJCQl9Ci0JCQlpZiAobWFp bHRvICYmICptYWlsdG8gPT0gJ1wwJykKLQkJCQltYWlsdG8gPSBOVUxMOwotCisJCQogCQkJLyog aWYgd2UgYXJlIHN1cHBvc2VkIHRvIGJlIG1haWxpbmcsIE1BSUxUTyB3aWxsCiAJCQkgKiBiZSBu b24tTlVMTC4gIG9ubHkgaW4gdGhpcyBjYXNlIHNob3VsZCB3ZSBzZXQKIAkJCSAqIHVwIHRoZSBt YWlsIGNvbW1hbmQgYW5kIHN1YmplY3RzIGFuZCBzdHVmZi4uLgogCQkJICovCiAKLQkJCWlmICht YWlsdG8pIHsKLQkJCQlyZWdpc3RlciBjaGFyCSoqZW52OwotCQkJCWF1dG8gY2hhcgltYWlsY21k W01BWF9DT01NQU5EXTsKLQkJCQlhdXRvIGNoYXIJaG9zdG5hbWVbTUFYSE9TVE5BTUVMRU5dOwot Ci0JCQkJKHZvaWQpIGdldGhvc3RuYW1lKGhvc3RuYW1lLCBNQVhIT1NUTkFNRUxFTik7Ci0JCQkJ KHZvaWQpIHNucHJpbnRmKG1haWxjbWQsIHNpemVvZihtYWlsY21kKSwKLQkJCQkJICAgICAgIE1B SUxBUkdTLCBNQUlMQ01EKTsKKwkJCWlmIChtYWlsdG8gJiYgc2FmZV9wKHVzZXJubSwgbWFpbHRv KSkgeworCQkJCWNoYXIJKiplbnY7CisJCQkJY2hhcgltYWlsY21kW01BWF9DT01NQU5EXTsKKwkJ CQljaGFyCWhvc3RuYW1lW01BWEhPU1ROQU1FTEVOXTsKKworCQkJCWdldGhvc3RuYW1lKGhvc3Ru YW1lLCBNQVhIT1NUTkFNRUxFTik7CisJCQkJaWYgKHN0cmxlbnMoTUFJTEZNVCwgTUFJTEFSRywg TlVMTCkgKyAxCisJCQkJICAgID49IHNpemVvZiBtYWlsY21kKSB7CisJCQkJCWZwcmludGYoc3Rk ZXJyLCAibWFpbGNtZCB0b28gbG9uZ1xuIik7CisJCQkJCSh2b2lkKSBfZXhpdChFUlJPUl9FWElU KTsKKwkJCQl9CisJCQkJKHZvaWQpc3ByaW50ZihtYWlsY21kLCBNQUlMRk1ULCBNQUlMQVJHKTsK IAkJCQlpZiAoIShtYWlsID0gY3Jvbl9wb3BlbihtYWlsY21kLCAidyIsIGUpKSkgewotCQkJCQl3 YXJuKCIlcyIsIE1BSUxDTUQpOworCQkJCQl3YXJuKCIlcyIsIG1haWxjbWQpOwogCQkJCQkodm9p ZCkgX2V4aXQoRVJST1JfRVhJVCk7CiAJCQkJfQogCQkJCWZwcmludGYobWFpbCwgIkZyb206ICVz IChDcm9uIERhZW1vbilcbiIsIHVzZXJubSk7CkBAIC00OTMsMTAgKzQ4NiwxMCBAQAogCQkJCWZw cmludGYobWFpbCwgIlN1YmplY3Q6IENyb24gPCVzQCVzPiAlc1xuIiwKIAkJCQkJdXNlcm5tLCBm aXJzdF93b3JkKGhvc3RuYW1lLCAiLiIpLAogCQkJCQllLT5jbWQpOwotIyBpZiBkZWZpbmVkKE1B SUxfREFURSkKKyNpZmRlZiBNQUlMX0RBVEUKIAkJCQlmcHJpbnRmKG1haWwsICJEYXRlOiAlc1xu IiwKLQkJCQkJYXJwYWRhdGUoJlRhcmdldFRpbWUpKTsKLSMgZW5kaWYgLyogTUFJTF9EQVRFICov CisJCQkJCWFycGFkYXRlKCZTdGFydFRpbWUpKTsKKyNlbmRpZiAvKk1BSUxfREFURSovCiAJCQkJ Zm9yIChlbnYgPSBlLT5lbnZwOyAgKmVudjsgIGVudisrKQogCQkJCQlmcHJpbnRmKG1haWwsICJY LUNyb24tRW52OiA8JXM+XG4iLAogCQkJCQkJKmVudik7CkBAIC01MjMsOCArNTE2LDggQEAKIAkJ CSAqLwogCiAJCQlpZiAobWFpbHRvKSB7Ci0JCQkJRGVidWcoRFBST0MsICgiWyVkXSBjbG9zaW5n IHBpcGUgdG8gbWFpbFxuIiwKLQkJCQkJZ2V0cGlkKCkpKQorCQkJCURlYnVnKERQUk9DLCAoIlsl bGRdIGNsb3NpbmcgcGlwZSB0byBtYWlsXG4iLAorCQkJCQkgICAgICAobG9uZylnZXRwaWQoKSkp CiAJCQkJLyogTm90ZTogdGhlIHBjbG9zZSB3aWxsIHByb2JhYmx5IHNlZQogCQkJCSAqIHRoZSB0 ZXJtaW5hdGlvbiBvZiB0aGUgZ3JhbmRjaGlsZAogCQkJCSAqIGluIGFkZGl0aW9uIHRvIHRoZSBt YWlsIHByb2Nlc3MsIHNpbmNlCkBAIC01NDEsNyArNTM0LDcgQEAKIAkJCWlmIChtYWlsdG8gJiYg c3RhdHVzKSB7CiAJCQkJY2hhciBidWZbTUFYX1RFTVBTVFJdOwogCi0JCQkJc25wcmludGYoYnVm LCBzaXplb2YoYnVmKSwKKwkJCQlzcHJpbnRmKGJ1ZiwKIAkJCSJtYWlsZWQgJWQgYnl0ZSVzIG9m IG91dHB1dCBidXQgZ290IHN0YXR1cyAweCUwNHhcbiIsCiAJCQkJCWJ5dGVzLCAoYnl0ZXM9PTEp PyIiOiJzIiwKIAkJCQkJc3RhdHVzKTsKQEAgLTU1MCw2OCArNTQzLDQ4IEBACiAKIAkJfSAvKmlm IGRhdGEgZnJvbSBncmFuZGNoaWxkKi8KIAotCQlEZWJ1ZyhEUFJPQywgKCJbJWRdIGdvdCBFT0Yg ZnJvbSBncmFuZGNoaWxkXG4iLCBnZXRwaWQoKSkpCisJCURlYnVnKERQUk9DLCAoIlslbGRdIGdv
IGNoYXIKLWdldF9yYW5nZShiaXRzLCBsb3csIGhpZ2gsIG5hbWVzLCBjaCwgZmlsZSkKLQliaXRz dHJfdAkqYml0czsJCS8qIG9uZSBiaXQgcGVyIGZsYWcsIGRlZmF1bHQ9RkFMU0UgKi8KLQlpbnQJ CWxvdywgaGlnaDsJLyogYm91bmRzLCBpbXBsLiBvZmZzZXQgZm9yIGJpdHN0ciAqLwotCWNoYXIJ CSpuYW1lc1tdOwkvKiBOVUxMIG9yIG5hbWVzIG9mIGVsZW1lbnRzICovCi0JaW50CQljaDsJCS8q IGN1cnJlbnQgY2hhcmFjdGVyIGJlaW5nIHByb2Nlc3NlZCAqLwotCUZJTEUJCSpmaWxlOwkJLyog ZmlsZSBiZWluZyByZWFkICovCitzdGF0aWMgaW50CitnZXRfcmFuZ2UoYml0c3RyX3QgKmJpdHMs IGludCBsb3csIGludCBoaWdoLCBjb25zdCBjaGFyICpuYW1lc1tdLAorCSAgaW50IGNoLCBGSUxF ICpmaWxlKQogewogCS8qIHJhbmdlID0gbnVtYmVyIHwgbnVtYmVyICItIiBudW1iZXIgWyAiLyIg bnVtYmVyIF0KIAkgKi8KIAotCXJlZ2lzdGVyIGludAlpOwotCWF1dG8gaW50CW51bTEsIG51bTIs IG51bTM7CisJaW50IGksIG51bTEsIG51bTIsIG51bTM7CiAKIAlEZWJ1ZyhEUEFSU3xERVhULCAo ImdldF9yYW5nZSgpLi4uZW50ZXJpbmcsIGV4aXQgd29uJ3Qgc2hvd1xuIikpCiAKQEAgLTUyOSwz MSArNDc0LDMyIEBACiAJCW51bTIgPSBoaWdoOwogCQljaCA9IGdldF9jaGFyKGZpbGUpOwogCQlp ZiAoY2ggPT0gRU9GKQotCQkJcmV0dXJuIEVPRjsKKwkJCXJldHVybiAoRU9GKTsKIAl9IGVsc2Ug ewotCQlpZiAoRU9GID09IChjaCA9IGdldF9udW1iZXIoJm51bTEsIGxvdywgbmFtZXMsIGNoLCBm aWxlKSkpCi0JCQlyZXR1cm4gRU9GOworCQljaCA9IGdldF9udW1iZXIoJm51bTEsIGxvdywgbmFt ZXMsIGNoLCBmaWxlLCAiLC0gXHRcbiIpOworCQlpZiAoY2ggPT0gRU9GKQorCQkJcmV0dXJuIChF T0YpOwogCi0JCWlmIChjaCA9PSAnLycpCi0JCQludW0yID0gaGlnaDsKLQkJZWxzZSBpZiAoY2gg IT0gJy0nKSB7CisJCWlmIChjaCAhPSAnLScpIHsKIAkJCS8qIG5vdCBhIHJhbmdlLCBpdCdzIGEg c2luZ2xlIG51bWJlci4KIAkJCSAqLwotCQkJaWYgKEVPRiA9PSBzZXRfZWxlbWVudChiaXRzLCBs b3csIGhpZ2gsIG51bTEpKQotCQkJCXJldHVybiBFT0Y7Ci0JCQlyZXR1cm4gY2g7CisJCQlpZiAo RU9GID09IHNldF9lbGVtZW50KGJpdHMsIGxvdywgaGlnaCwgbnVtMSkpIHsKKwkJCQl1bmdldF9j aGFyKGNoLCBmaWxlKTsKKwkJCQlyZXR1cm4gKEVPRik7CisJCQl9CisJCQlyZXR1cm4gKGNoKTsK IAkJfSBlbHNlIHsKIAkJCS8qIGVhdCB0aGUgZGFzaAogCQkJICovCiAJCQljaCA9IGdldF9jaGFy KGZpbGUpOwogCQkJaWYgKGNoID09IEVPRikKLQkJCQlyZXR1cm4gRU9GOworCQkJCXJldHVybiAo RU9GKTsKIAogCQkJLyogZ2V0IHRoZSBudW1iZXIgZm9sbG93aW5nIHRoZSBkYXNoCiAJCQkgKi8K LQkJCWNoID0gZ2V0X251bWJlcigmbnVtMiwgbG93LCBuYW1lcywgY2gsIGZpbGUpOwotCQkJaWYg KGNoID09IEVPRikKLQkJCQlyZXR1cm4gRU9GOworCQkJY2ggPSBnZXRfbnVtYmVyKCZudW0yLCBs b3csIG5hbWVzLCBjaCwgZmlsZSwgIi8sIFx0XG4iKTsKKwkJCWlmIChjaCA9PSBFT0YgfHwgbnVt MSA+IG51bTIpCisJCQkJcmV0dXJuIChFT0YpOwogCQl9CiAJfQogCkBAIC01NjQsMTYgKzUxMCwx NiBAQAogCQkgKi8KIAkJY2ggPSBnZXRfY2hhcihmaWxlKTsKIAkJaWYgKGNoID09IEVPRikKLQkJ CXJldHVybiBFT0Y7CisJCQlyZXR1cm4gKEVPRik7CiAKIAkJLyogZ2V0IHRoZSBzdGVwIHNpemUg LS0gbm90ZTogd2UgZG9uJ3QgcGFzcyB0aGUKIAkJICogbmFtZXMgaGVyZSwgYmVjYXVzZSB0aGUg bnVtYmVyIGlzIG5vdCBhbgogCQkgKiBlbGVtZW50IGlkLCBpdCdzIGEgc3RlcCBzaXplLiAgJ2xv dycgaXMKIAkJICogc2VudCBhcyBhIDAgc2luY2UgdGhlcmUgaXMgbm8gb2Zmc2V0IGVpdGhlci4K IAkJICovCi0JCWNoID0gZ2V0X251bWJlcigmbnVtMywgMCwgUFBDX05VTEwsIGNoLCBmaWxlKTsK KwkJY2ggPSBnZXRfbnVtYmVyKCZudW0zLCAwLCBQUENfTlVMTCwgY2gsIGZpbGUsICIsIFx0XG4i KTsKIAkJaWYgKGNoID09IEVPRiB8fCBudW0zID09IDApCi0JCQlyZXR1cm4gRU9GOworCQkJcmV0 dXJuIChFT0YpOwogCX0gZWxzZSB7CiAJCS8qIG5vIHN0ZXAuICBkZWZhdWx0PT0xLgogCQkgKi8K QEAgLTU4Myw4NSArNTI5LDc2IEBACiAJLyogcmFuZ2UuIHNldCBhbGwgZWxlbWVudHMgZnJvbSBu dW0xIHRvIG51bTIsIHN0ZXBwaW5nCiAJICogYnkgbnVtMy4gICh0aGUgc3RlcCBpcyBhIGRvd253 YXJkLWNvbXBhdGlibGUgZXh0ZW5zaW9uCiAJICogcHJvcG9zZWQgY29uY2VwdHVhbGx5IGJ5IGJv YkBhY29ybnJjLCBzeW50YWN0aWNhbGx5Ci0JICogZGVzaWduZWQgdGhlbiBpbXBsbWVudGVkIGJ5 IHBhdWwgdml4aWUpLgorCSAqIGRlc2lnbmVkIHRoZW4gaW1wbGVtZW50ZWQgYnkgcGF1bCB2aXhp ZSkuCiAJICovCiAJZm9yIChpID0gbnVtMTsgIGkgPD0gbnVtMjsgIGkgKz0gbnVtMykKLQkJaWYg KEVPRiA9PSBzZXRfZWxlbWVudChiaXRzLCBsb3csIGhpZ2gsIGkpKQotCQkJcmV0dXJuIEVPRjsK KwkJaWYgKEVPRiA9PSBzZXRfZWxlbWVudChiaXRzLCBsb3csIGhpZ2gsIGkpKSB7CisJCQl1bmdl dF9jaGFyKGNoLCBmaWxlKTsKKwkJCXJldHVybiAoRU9GKTsKKwkJfQogCi0JcmV0dXJuIGNoOwor CXJldHVybiAoY2gpOwogfQogCitzdGF0aWMgaW50CitnZXRfbnVtYmVyKGludCAqbnVtcHRyLCBp bnQgbG93LCBjb25zdCBjaGFyICpuYW1lc1tdLCBpbnQgY2gsIEZJTEUgKmZpbGUsCisgICAgY29u c3QgY2hhciAqdGVybXMpIHsKKwljaGFyIHRlbXBbTUFYX1RFTVBTVFJdLCAqcGM7CisJaW50IGxl biwgaTsKIAotc3RhdGljIGNoYXIKLWdldF9udW1iZXIobnVtcHRyLCBsb3csIG5hbWVzLCBjaCwg ZmlsZSkKLQlpbnQJKm51bXB0cjsJLyogd2hlcmUgZG9lcyB0aGUgcmVzdWx0IGdvPyAqLwotCWlu dAlsb3c7CQkvKiBvZmZzZXQgYXBwbGllZCB0byByZXN1bHQgaWYgc3ltYm9saWMgZW51bSB1c2Vk ICovCi0JY2hhcgkqbmFtZXNbXTsJLyogc3ltYm9saWMgbmFtZXMsIGlmIGFueSwgZm9yIGVudW1z ICovCi0JaW50CWNoOwkJLyogY3VycmVudCBjaGFyYWN0ZXIgKi8KLQlGSUxFCSpmaWxlOwkJLyog c291cmNlICovCi17Ci0JY2hhcgl0ZW1wW01BWF9URU1QU1RSXSwgKnBjOwotCWludAlsZW4sIGks IGFsbF9kaWdpdHM7Ci0KLQkvKiBjb2xsZWN0IGFscGhhbnVtZXJpY3MgaW50byBvdXIgZml4ZWQt c2l6ZSB0ZW1wIGFycmF5Ci0JICovCiAJcGMgPSB0ZW1wOwogCWxlbiA9IDA7Ci0JYWxsX2RpZ2l0 cyA9IFRSVUU7Ci0Jd2hpbGUgKGlzYWxudW0oY2gpKSB7Ci0JCWlmICgrK2xlbiA+PSBNQVhfVEVN UFNUUikKLQkJCXJldHVybiBFT0Y7CiAKKwkvKiBmaXJzdCBsb29rIGZvciBhIG51bWJlciAqLwor CXdoaWxlIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKWNoKSkgeworCQlpZiAoKytsZW4gPj0gTUFY X1RFTVBTVFIpCisJCQlnb3RvIGJhZDsKIAkJKnBjKysgPSBjaDsKLQotCQlpZiAoIWlzZGlnaXQo Y2gpKQotCQkJYWxsX2RpZ2l0cyA9IEZBTFNFOwotCiAJCWNoID0gZ2V0X2NoYXIoZmlsZSk7CiAJ fQogCSpwYyA9ICdcMCc7Ci0JaWYgKGxlbiA9PSAwKQotCSAgICByZXR1cm4gKEVPRik7CisJaWYg KGxlbiAhPSAwKSB7CisJCS8qIGdvdCBhIG51bWJlciwgY2hlY2sgZm9yIHZhbGlkIHRlcm1pbmF0 b3IgKi8KKwkJaWYgKCFzdHJjaHIodGVybXMsIGNoKSkKKwkJCWdvdG8gYmFkOworCQkqbnVtcHRy ID0gYXRvaSh0ZW1wKTsKKwkJcmV0dXJuIChjaCk7CisJfQogCi0JLyogdHJ5IHRvIGZpbmQgdGhl IG5hbWUgaW4gdGhlIG5hbWUgbGlzdAotCSAqLworCS8qIG5vIG51bWJlcnMsIGxvb2sgZm9yIGEg c3RyaW5nIGlmIHdlIGhhdmUgYW55ICovCiAJaWYgKG5hbWVzKSB7Ci0JCWZvciAoaSA9IDA7ICBu YW1lc1tpXSAhPSBOVUxMOyAgaSsrKSB7Ci0JCQlEZWJ1ZyhEUEFSU3xERVhULAotCQkJCSgiZ2V0 X251bSwgY29tcGFyZSglcywlcylcbiIsIG5hbWVzW2ldLCB0ZW1wKSkKLQkJCWlmICghc3RyY2Fz ZWNtcChuYW1lc1tpXSwgdGVtcCkpIHsKLQkJCQkqbnVtcHRyID0gaStsb3c7Ci0JCQkJcmV0dXJu IGNoOworCQl3aGlsZSAoaXNhbHBoYSgodW5zaWduZWQgY2hhciljaCkpIHsKKwkJCWlmICgrK2xl biA+PSBNQVhfVEVNUFNUUikKKwkJCQlnb3RvIGJhZDsKKwkJCSpwYysrID0gY2g7CisJCQljaCA9 IGdldF9jaGFyKGZpbGUpOworCQl9CisJCSpwYyA9ICdcMCc7CisJCWlmIChsZW4gIT0gMCAmJiBz dHJjaHIodGVybXMsIGNoKSkgeworCQkJZm9yIChpID0gMDsgIG5hbWVzW2ldICE9IE5VTEw7ICBp KyspIHsKKwkJCQlEZWJ1ZyhEUEFSU3xERVhULAorCQkJCQkoImdldF9udW0sIGNvbXBhcmUoJXMs JXMpXG4iLCBuYW1lc1tpXSwKKwkJCQkJdGVtcCkpCisJCQkJaWYgKCFzdHJjYXNlY21wKG5hbWVz W2ldLCB0ZW1wKSkgeworCQkJCQkqbnVtcHRyID0gaStsb3c7CisJCQkJCXJldHVybiAoY2gpOwor CQkJCX0KIAkJCX0KIAkJfQogCX0KIAotCS8qIG5vIG5hbWUgbGlzdCBzcGVjaWZpZWQsIG9yIHRo ZXJlIGlzIG9uZSBhbmQgb3VyIHN0cmluZyBpc24ndAotCSAqIGluIGl0LiAgZWl0aGVyIHdheTog aWYgaXQncyBhbGwgZGlnaXRzLCB1c2UgaXRzIG1hZ25pdHVkZS4KLQkgKiBvdGhlcndpc2UsIGl0 J3MgYW4gZXJyb3IuCi0JICovCi0JaWYgKGFsbF9kaWdpdHMpIHsKLQkJKm51bXB0ciA9IGF0b2ko dGVtcCk7Ci0JCXJldHVybiBjaDsKLQl9Ci0KLQlyZXR1cm4gRU9GOworYmFkOgorCXVuZ2V0X2No YXIoY2gsIGZpbGUpOworCXJldHVybiAoRU9GKTsKIH0KIAotCiBzdGF0aWMgaW50Ci1zZXRfZWxl bWVudChiaXRzLCBsb3csIGhpZ2gsIG51bWJlcikKLQliaXRzdHJfdAkqYml0czsgCQkvKiBvbmUg Yml0IHBlciBmbGFnLCBkZWZhdWx0PUZBTFNFICovCi0JaW50CQlsb3c7Ci0JaW50CQloaWdoOwot CWludAkJbnVtYmVyOwoteworc2V0X2VsZW1lbnQoYml0c3RyX3QgKmJpdHMsIGludCBsb3csIGlu dCBoaWdoLCBpbnQgbnVtYmVyKSB7CiAJRGVidWcoRFBBUlN8REVYVCwgKCJzZXRfZWxlbWVudCg/ LCVkLCVkLCVkKVxuIiwgbG93LCBoaWdoLCBudW1iZXIpKQogCiAJaWYgKG51bWJlciA8IGxvdyB8 fCBudW1iZXIgPiBoaWdoKQotCQlyZXR1cm4gRU9GOworCQlyZXR1cm4gKEVPRik7CiAKIAliaXRf c2V0KGJpdHMsIChudW1iZXItbG93KSk7Ci0JcmV0dXJuIE9LOworCXJldHVybiAoT0spOwogfQpk aWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9saWIvZW52LmMgZnJlZWJzZF9jcm9uL2xp Yi9lbnYuYwotLS0gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9saWIvZW52LmMJMjAxNC0wMS0xNiAy MTo0Mzo1MC4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVic2RfY3Jvbi9saWIvZW52LmMJMjAxNC0w Ni0xMSAxNjo0Mjo1NS4yNzU0NDQzNzkgKzAyMDAKQEAgLTEsOTUgKzEsODIgQEAKIC8qIENvcHly aWdodCAxOTg4LDE5OTAsMTk5MywxOTk0IGJ5IFBhdWwgVml4aWUKICAqIEFsbCByaWdodHMgcmVz ZXJ2ZWQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0IGJ5IEludGVybmV0IFN5c3Rl bXMgQ29uc29ydGl1bSwgSW5jLiAoIklTQyIpCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsMjAwMCBi eSBJbnRlcm5ldCBTb2Z0d2FyZSBDb25zb3J0aXVtLCBJbmMuCiAgKgotICogRGlzdHJpYnV0ZSBm cmVlbHksIGV4Y2VwdDogZG9uJ3QgcmVtb3ZlIG15IG5hbWUgZnJvbSB0aGUgc291cmNlIG9yCi0g KiBkb2N1bWVudGF0aW9uIChkb24ndCB0YWtlIGNyZWRpdCBmb3IgbXkgd29yayksIG1hcmsgeW91 ciBjaGFuZ2VzIChkb24ndAotICogZ2V0IG1lIGJsYW1lZCBmb3IgeW91ciBwb3NzaWJsZSBidWdz KSwgZG9uJ3QgYWx0ZXIgb3IgcmVtb3ZlIHRoaXMKLSAqIG5vdGljZS4gIE1heSBiZSBzb2xkIGlm IGJ1aWxkYWJsZSBzb3VyY2UgaXMgcHJvdmlkZWQgdG8gYnV5ZXIuICBObwotICogd2FycmFudGVl IG9mIGFueSBraW5kLCBleHByZXNzIG9yIGltcGxpZWQsIGlzIGluY2x1ZGVkIHdpdGggdGhpcwot ICogc29mdHdhcmU7IHVzZSBhdCB5b3VyIG93biByaXNrLCByZXNwb25zaWJpbGl0eSBmb3IgZGFt YWdlcyAoaWYgYW55KSB0bwotICogYW55b25lIHJlc3VsdGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhp cyBzb2Z0d2FyZSByZXN0cyBlbnRpcmVseSB3aXRoIHRoZQotICogdXNlci4KKyAqIFBlcm1pc3Np b24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9y IGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBw cm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJt aXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KICAqCi0gKiBTZW5kIGJ1ZyByZXBv cnRzLCBidWcgZml4ZXMsIGVuaGFuY2VtZW50cywgcmVxdWVzdHMsIGZsYW1lcywgZXRjLiwgYW5k Ci0gKiBJJ2xsIHRyeSB0byBrZWVwIGEgdmVyc2lvbiB1cCB0byBkYXRlLiAgSSBjYW4gYmUgcmVh Y2hlZCBhcyBmb2xsb3dzOgotICogUGF1bCBWaXhpZSAgICAgICAgICA8cGF1bEB2aXguY29tPiAg ICAgICAgICB1dW5ldCFkZWN3cmwhdml4aWUhcGF1bAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJ REVEICJBUyBJUyIgQU5EIElTQyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVH QVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YK KyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIElTQyBC RSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VR VUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBG Uk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElP TiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJ TkcgT1VUCisgKiBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5D RSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKLSNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5l ZChMSU5UKQotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9Ci0gICIkRnJlZUJTRDogcmVsZWFz ZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9saWIvZW52LmMgMTEwNjM4IDIwMDMtMDItMTAgMTE6MjA6 NThaIHRob21hcyAkIjsKLSNlbmRpZgotCisvLyNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5l ZChMSU5UKQorLy9zdGF0aWMgY2hhciByY3NpZFtdID0gIiRJZDogZW52LmMsdiAxLjEwIDIwMDQv MDEvMjMgMTg6NTY6NDIgdml4aWUgRXhwICQiOworLy8jZW5kaWYKIAogI2luY2x1ZGUgImNyb24u aCIKIAotCiBjaGFyICoqCi1lbnZfaW5pdCgpCi17Ci0JcmVnaXN0ZXIgY2hhcgkqKnAgPSAoY2hh ciAqKikgbWFsbG9jKHNpemVvZihjaGFyICopKTsKK2Vudl9pbml0KHZvaWQpIHsKKwljaGFyICoq cCA9IChjaGFyICoqKSBtYWxsb2Moc2l6ZW9mKGNoYXIgKiopKTsKIAotCWlmIChwKQorCWlmIChw ICE9IE5VTEwpCiAJCXBbMF0gPSBOVUxMOwogCXJldHVybiAocCk7CiB9CiAKLQogdm9pZAotZW52 X2ZyZWUoZW52cCkKLQljaGFyCSoqZW52cDsKLXsKLQljaGFyCSoqcDsKK2Vudl9mcmVlKGNoYXIg KiplbnZwKSB7CisJY2hhciAqKnA7CiAKLQlpZiAoKHAgPSBlbnZwKSkKLQkgICAgZm9yICg7ICAq cDsgIHArKykKKwlmb3IgKHAgPSBlbnZwOyAqcCAhPSBOVUxMOyBwKyspCiAJCWZyZWUoKnApOwog CWZyZWUoZW52cCk7CiB9CiAKLQogY2hhciAqKgotZW52X2NvcHkoZW52cCkKLQlyZWdpc3RlciBj aGFyCSoqZW52cDsKLXsKLQlyZWdpc3RlciBpbnQJY291bnQsIGk7Ci0JcmVnaXN0ZXIgY2hhcgkq KnA7Ci0KLQlmb3IgKGNvdW50ID0gMDsgIGVudnBbY291bnRdICE9IE5VTEw7ICBjb3VudCsrKQot CQk7Ci0JcCA9IChjaGFyICoqKSBtYWxsb2MoKGNvdW50KzEpICogc2l6ZW9mKGNoYXIgKikpOyAv KiAxIGZvciB0aGUgTlVMTCAqLwotCWlmIChwID09IE5VTEwpIHsKLQkJZXJybm8gPSBFTk9NRU07 Ci0JCXJldHVybiBOVUxMOworZW52X2NvcHkoY2hhciAqKmVudnApIHsKKwlpbnQgY291bnQsIGks IHNhdmVfZXJybm87CisJY2hhciAqKnA7CisKKwlmb3IgKGNvdW50ID0gMDsgZW52cFtjb3VudF0g IT0gTlVMTDsgY291bnQrKykKKwkJTlVMTDsKKwlwID0gKGNoYXIgKiopIG1hbGxvYygoY291bnQr MSkgKiBzaXplb2YoY2hhciAqKSk7ICAvKiAxIGZvciB0aGUgTlVMTCAqLworCWlmIChwICE9IE5V TEwpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQlpZiAoKHBbaV0gPSBzdHJk dXAoZW52cFtpXSkpID09IE5VTEwpIHsKKwkJCQlzYXZlX2Vycm5vID0gZXJybm87CisJCQkJd2hp bGUgKC0taSA+PSAwKQorCQkJCQlmcmVlKHBbaV0pOworCQkJCWZyZWUocCk7CisJCQkJZXJybm8g PSBzYXZlX2Vycm5vOworCQkJCXJldHVybiAoTlVMTCk7CisJCQl9CisJCXBbY291bnRdID0gTlVM TDsKIAl9Ci0JZm9yIChpID0gMDsgIGkgPCBjb3VudDsgIGkrKykKLQkJaWYgKChwW2ldID0gc3Ry ZHVwKGVudnBbaV0pKSA9PSBOVUxMKSB7Ci0JCQl3aGlsZSAoLS1pID49IDApCi0JCQkJKHZvaWQp IGZyZWUocFtpXSk7Ci0JCQlmcmVlKHApOwotCQkJZXJybm8gPSBFTk9NRU07Ci0JCQlyZXR1cm4g TlVMTDsKLQkJfQotCXBbY291bnRdID0gTlVMTDsKIAlyZXR1cm4gKHApOwogfQogCi0KIGNoYXIg KioKLWVudl9zZXQoZW52cCwgZW52c3RyKQotCWNoYXIJKiplbnZwOwotCWNoYXIJKmVudnN0cjsK LXsKLQlyZWdpc3RlciBpbnQJY291bnQsIGZvdW5kOwotCXJlZ2lzdGVyIGNoYXIJKipwOwotCWNo YXIJCSpxOworZW52X3NldChjaGFyICoqZW52cCwgY2hhciAqZW52c3RyKSB7CisJaW50IGNvdW50 LCBmb3VuZDsKKwljaGFyICoqcCwgKmVudnRtcDsKIAogCS8qCiAJICogY291bnQgdGhlIG51bWJl ciBvZiBlbGVtZW50cywgaW5jbHVkaW5nIHRoZSBudWxsIHBvaW50ZXI7CiAJICogYWxzbyBzZXQg J2ZvdW5kJyB0byAtMSBvciBpbmRleCBvZiBlbnRyeSBpZiBhbHJlYWR5IGluIGhlcmUuCiAJICov CiAJZm91bmQgPSAtMTsKLQlmb3IgKGNvdW50ID0gMDsgIGVudnBbY291bnRdICE9IE5VTEw7ICBj b3VudCsrKSB7CisJZm9yIChjb3VudCA9IDA7IGVudnBbY291bnRdICE9IE5VTEw7IGNvdW50Kysp IHsKIAkJaWYgKCFzdHJjbXBfdW50aWwoZW52cFtjb3VudF0sIGVudnN0ciwgJz0nKSkKIAkJCWZv dW5kID0gY291bnQ7CiAJfQpAQCAtMTAwLDE0ICs4NywxMCBAQAogCQkgKiBpdCBleGlzdHMgYWxy ZWFkeSwgc28ganVzdCBmcmVlIHRoZSBleGlzdGluZyBzZXR0aW5nLAogCQkgKiBzYXZlIG91ciBu ZXcgb25lIHRoZXJlLCBhbmQgcmV0dXJuIHRoZSBleGlzdGluZyBhcnJheS4KIAkJICovCi0JCXEg PSBlbnZwW2ZvdW5kXTsKLQkJaWYgKChlbnZwW2ZvdW5kXSA9IHN0cmR1cChlbnZzdHIpKSA9PSBO VUxMKSB7Ci0JCQllbnZwW2ZvdW5kXSA9IHE7Ci0JCQkvKiBYWFggZW52X2ZyZWUoZW52cCk7ICov Ci0JCQllcnJubyA9IEVOT01FTTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWZyZWUocSk7CisJ CWlmICgoZW52dG1wID0gc3RyZHVwKGVudnN0cikpID09IE5VTEwpCisJCQlyZXR1cm4gKE5VTEwp OworCQlmcmVlKGVudnBbZm91bmRdKTsKKwkJZW52cFtmb3VuZF0gPSBlbnZ0bXA7CiAJCXJldHVy biAoZW52cCk7CiAJfQogCkBAIC0xMTYsNDcgKzk5LDQyIEBACiAJICogb25lLCBzYXZlIG91ciBz dHJpbmcgb3ZlciB0aGUgb2xkIG51bGwgcG9pbnRlciwgYW5kIHJldHVybiByZXNpemVkCiAJICog YXJyYXkuCiAJICovCisJaWYgKChlbnZ0bXAgPSBzdHJkdXAoZW52c3RyKSkgPT0gTlVMTCkKKwkJ cmV0dXJuIChOVUxMKTsKIAlwID0gKGNoYXIgKiopIHJlYWxsb2MoKHZvaWQgKikgZW52cCwKLQkJ CSAgICAgICh1bnNpZ25lZCkgKChjb3VudCsxKSAqIHNpemVvZihjaGFyICopKSk7Ci0JaWYgKHAg PT0gTlVMTCkgCXsKLQkJLyogWFhYIGVudl9mcmVlKGVudnApOyAqLwotCQllcnJubyA9IEVOT01F TTsKLQkJcmV0dXJuIE5VTEw7CisJCQkgICAgICAoc2l6ZV90KSAoKGNvdW50KzEpICogc2l6ZW9m KGNoYXIgKiopKSk7CisJaWYgKHAgPT0gTlVMTCkgeworCQlmcmVlKGVudnRtcCk7CisJCXJldHVy biAoTlVMTCk7CiAJfQogCXBbY291bnRdID0gcFtjb3VudC0xXTsKLQlpZiAoKHBbY291bnQtMV0g PSBzdHJkdXAoZW52c3RyKSkgPT0gTlVMTCkgewotCQllbnZfZnJlZShwKTsKLQkJZXJybm8gPSBF Tk9NRU07Ci0JCXJldHVybiBOVUxMOwotCX0KKwlwW2NvdW50LTFdID0gZW52dG1wOwogCXJldHVy biAocCk7CiB9CiAKKy8qIFRoZSBmb2xsb3dpbmcgc3RhdGVzIGFyZSB1c2VkIGJ5IGxvYWRfZW52 KCksIHRyYXZlcnNlZCBpbiBvcmRlcjogKi8KK2VudW0gZW52X3N0YXRlIHsKKwlOQU1FSSwJCS8q IEZpcnN0IGNoYXIgb2YgTkFNRSwgbWF5IGJlIHF1b3RlICovCisJTkFNRSwJCS8qIFN1YnNlcXVl bnQgY2hhcnMgb2YgTkFNRSAqLworCUVRMSwJCS8qIEFmdGVyIGVuZCBvZiBuYW1lLCBsb29raW5n IGZvciAnPScgc2lnbiAqLworCUVRMiwJCS8qIEFmdGVyICc9Jywgc2tpcHBpbmcgd2hpdGVzcGFj ZSAqLworCVZBTFVFSSwJCS8qIEZpcnN0IGNoYXIgb2YgVkFMVUUsIG1heSBiZSBxdW90ZSAqLwor CVZBTFVFLAkJLyogU3Vic2VxdWVudCBjaGFycyBvZiBWQUxVRSAqLworCUZJTkksCQkvKiBBbGwg ZG9uZSwgc2tpcHBpbmcgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLworCUVSUk9SLAkJLyogRXJyb3Ig Ki8KK307CiAKIC8qIHJldHVybglFUlIgPSBlbmQgb2YgZmlsZQogICoJCUZBTFNFID0gbm90IGFu IGVudiBzZXR0aW5nIChmaWxlIHdhcyByZXBvc2l0aW9uZWQpCiAgKgkJVFJVRSA9IHdhcyBhbiBl bnYgc2V0dGluZwogICovCiBpbnQKLWxvYWRfZW52KGVudnN0ciwgZikKLQljaGFyCSplbnZzdHI7 Ci0JRklMRQkqZjsKLXsKLQlsb25nCWZpbGVwb3M7Ci0JaW50CWZpbGVsaW5lOwotCWNoYXIJbmFt ZVtNQVhfRU5WU1RSXSwgdmFsW01BWF9FTlZTVFJdOwotCWNoYXIJcXVvdGVjaGFyLCAqYywgKnN0 cjsKLQlpbnQJc3RhdGU7Ci0KLQkvKiBUaGUgZm9sbG93aW5nIHN0YXRlcyBhcmUgdHJhdmVyc2Vk IGluIG9yZGVyOiAqLwotI2RlZmluZSBOQU1FSQkwCS8qIEZpcnN0IGNoYXIgb2YgTkFNRSwgbWF5 IGJlIHF1b3RlICovCi0jZGVmaW5lIE5BTUUJMQkvKiBTdWJzZXF1ZW50IGNoYXJzIG9mIE5BTUUg Ki8KLSNkZWZpbmUgRVExCTIJLyogQWZ0ZXIgZW5kIG9mIG5hbWUsIGxvb2tpbmcgZm9yICc9JyBz aWduICovCi0jZGVmaW5lIEVRMgkzCS8qIEFmdGVyICc9Jywgc2tpcHBpbmcgd2hpdGVzcGFjZSAq LwotI2RlZmluZSBWQUxVRUkJNAkvKiBGaXJzdCBjaGFyIG9mIFZBTFVFLCBtYXkgYmUgcXVvdGUg Ki8KLSNkZWZpbmUgVkFMVUUJNQkvKiBTdWJzZXF1ZW50IGNoYXJzIG9mIFZBTFVFICovCi0jZGVm aW5lIEZJTkkJNgkvKiBBbGwgZG9uZSwgc2tpcHBpbmcgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLwot I2RlZmluZSBFUlJPUgk3CS8qIEVycm9yICovCitsb2FkX2VudihjaGFyICplbnZzdHIsIEZJTEUg KmYpIHsKKwlsb25nIGZpbGVwb3M7CisJaW50IGZpbGVsaW5lOworCWVudW0gZW52X3N0YXRlIHN0 YXRlOworCWNoYXIgbmFtZVtNQVhfRU5WU1RSXSwgdmFsW01BWF9FTlZTVFJdOworCWNoYXIgcXVv dGVjaGFyLCAqYywgKnN0cjsKIAogCWZpbGVwb3MgPSBmdGVsbChmKTsKIAlmaWxlbGluZSA9IExp bmVOdW1iZXI7CkBAIC0xNjQsMTAgKzE0MiwxMCBAQAogCWlmIChFT0YgPT0gZ2V0X3N0cmluZyhl bnZzdHIsIE1BWF9FTlZTVFIsIGYsICJcbiIpKQogCQlyZXR1cm4gKEVSUik7CiAKLQlEZWJ1ZyhE UEFSUywgKCJsb2FkX2VudiwgcmVhZCA8JXM+XG4iLCBlbnZzdHIpKTsKKwlEZWJ1ZyhEUEFSUywg KCJsb2FkX2VudiwgcmVhZCA8JXM+XG4iLCBlbnZzdHIpKQogCi0JYnplcm8gKG5hbWUsIHNpemVv ZiBuYW1lKTsKLQliemVybyAodmFsLCBzaXplb2YgdmFsKTsKKwliemVybyhuYW1lLCBzaXplb2Yg bmFtZSk7CisJYnplcm8odmFsLCBzaXplb2YgdmFsKTsKIAlzdHIgPSBuYW1lOwogCXN0YXRlID0g TkFNRUk7CiAJcXVvdGVjaGFyID0gJ1wwJzsKQEAgLTE3OCw3ICsxNTYsNyBAQAogCQljYXNlIFZB TFVFSToKIAkJCWlmICgqYyA9PSAnXCcnIHx8ICpjID09ICciJykKIAkJCQlxdW90ZWNoYXIgPSAq YysrOwotCQkJKytzdGF0ZTsKKwkJCXN0YXRlKys7CiAJCQkvKiBGQUxMVEhST1VHSCAqLwogCQlj YXNlIE5BTUU6CiAJCWNhc2UgVkFMVUU6CkBAIC0xOTQsNyArMTcyLDcgQEAKIAkJCQl9CiAJCQl9 IGVsc2UgewogCQkJCWlmIChzdGF0ZSA9PSBOQU1FKSB7Ci0JCQkJCWlmIChpc3NwYWNlICgqYykp IHsKKwkJCQkJaWYgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKmMpKSB7CiAJCQkJCQljKys7CiAJ CQkJCQlzdGF0ZSsrOwogCQkJCQkJYnJlYWs7CkBAIC0yMTQsNTIgKzE5Miw1NSBAQAogCQkJCXN0 ciA9IHZhbDsKIAkJCQlxdW90ZWNoYXIgPSAnXDAnOwogCQkJfSBlbHNlIHsKLQkJCQlpZiAoIWlz c3BhY2UgKCpjKSkKKwkJCQlpZiAoIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKmMpKQogCQkJCQlz dGF0ZSA9IEVSUk9SOwogCQkJfQogCQkJYysrOwogCQkJYnJlYWs7CisKIAkJY2FzZSBFUTI6CiAJ CWNhc2UgRklOSToKLQkJCWlmIChpc3NwYWNlICgqYykpCisJCQlpZiAoaXNzcGFjZSgodW5zaWdu ZWQgY2hhcikqYykpCiAJCQkJYysrOwogCQkJZWxzZQogCQkJCXN0YXRlKys7CiAJCQlicmVhazsK KworCQlkZWZhdWx0OgorCQkJYWJvcnQoKTsKIAkJfQogCX0KIAlpZiAoc3RhdGUgIT0gRklOSSAm JiAhKHN0YXRlID09IFZBTFVFICYmICFxdW90ZWNoYXIpKSB7Ci0JCURlYnVnKERQQVJTLCAoImxv YWRfZW52LCBwYXJzZSBlcnJvciwgc3RhdGUgPSAlZFxuIiwgc3RhdGUpKQorCQlEZWJ1ZyhEUEFS UywgKCJsb2FkX2Vudiwgbm90IGFuIGVudiB2YXIsIHN0YXRlID0gJWRcbiIsIHN0YXRlKSkKIAkJ ZnNlZWsoZiwgZmlsZXBvcywgMCk7CiAJCVNldF9MaW5lTnVtKGZpbGVsaW5lKTsKIAkJcmV0dXJu IChGQUxTRSk7CiAJfQogCWlmIChzdGF0ZSA9PSBWQUxVRSkgewogCQkvKiBFbmQgb2YgdW5xdW90 ZWQgdmFsdWU6IHRyaW0gdHJhaWxpbmcgd2hpdGVzcGFjZSAqLwotCQljID0gdmFsICsgc3RybGVu ICh2YWwpOwotCQl3aGlsZSAoYyA+IHZhbCAmJiBpc3NwYWNlICgqKGMgLSAxKSkpCisJCWMgPSB2 YWwgKyBzdHJsZW4odmFsKTsKKwkJd2hpbGUgKGMgPiB2YWwgJiYgaXNzcGFjZSgodW5zaWduZWQg Y2hhciljWy0xXSkpCiAJCQkqKC0tYykgPSAnXDAnOwogCX0KIAogCS8qIDIgZmllbGRzIGZyb20g cGFyc2VyOyBsb29rcyBsaWtlIGFuIGVudiBzZXR0aW5nICovCiAKLQlpZiAoc3RybGVuKG5hbWUp ICsgMSArIHN0cmxlbih2YWwpID49IE1BWF9FTlZTVFItMSkKKwkvKgorCSAqIFRoaXMgY2FuJ3Qg b3ZlcmZsb3cgYmVjYXVzZSBnZXRfc3RyaW5nKCkgbGltaXRlZCB0aGUgc2l6ZSBvZiB0aGUKKwkg KiBuYW1lIGFuZCB2YWwgZmllbGRzLiAgU3RpbGwsIGl0IGRvZXNuJ3QgaHVydCB0byBiZSBjYXJl ZnVsLi4uCisJICovCisJaWYgKCFnbHVlX3N0cmluZ3MoZW52c3RyLCBNQVhfRU5WU1RSLCBuYW1l LCB2YWwsICc9JykpCiAJCXJldHVybiAoRkFMU0UpOwotCSh2b2lkKSBzcHJpbnRmKGVudnN0ciwg IiVzPSVzIiwgbmFtZSwgdmFsKTsKIAlEZWJ1ZyhEUEFSUywgKCJsb2FkX2VudiwgPCVzPiA8JXM+ IC0+IDwlcz5cbiIsIG5hbWUsIHZhbCwgZW52c3RyKSkKIAlyZXR1cm4gKFRSVUUpOwogfQogCi0K IGNoYXIgKgotZW52X2dldChuYW1lLCBlbnZwKQotCXJlZ2lzdGVyIGNoYXIJKm5hbWU7Ci0JcmVn aXN0ZXIgY2hhcgkqKmVudnA7Ci17Ci0JcmVnaXN0ZXIgaW50CWxlbiA9IHN0cmxlbihuYW1lKTsK LQlyZWdpc3RlciBjaGFyCSpwLCAqcTsKK2Vudl9nZXQoY2hhciAqbmFtZSwgY2hhciAqKmVudnAp IHsKKwlpbnQgbGVuID0gc3RybGVuKG5hbWUpOworCWNoYXIgKnAsICpxOwogCi0Jd2hpbGUgKChw ID0gKmVudnArKykpIHsKKwl3aGlsZSAoKHAgPSAqZW52cCsrKSAhPSBOVUxMKSB7CiAJCWlmICgh KHEgPSBzdHJjaHIocCwgJz0nKSkpCiAJCQljb250aW51ZTsKIAkJaWYgKChxIC0gcCkgPT0gbGVu ICYmICFzdHJuY21wKHAsIG5hbWUsIGxlbikpCmRpZmYgLXJ1TiAvdXNyL3NyYy91c3Iuc2Jpbi9j cm9uL2xpYi9taXNjLmMgZnJlZWJzZF9jcm9uL2xpYi9taXNjLmMKLS0tIC91c3Ivc3JjL3Vzci5z YmluL2Nyb24vbGliL21pc2MuYwkyMDE0LTAxLTE2IDIxOjQzOjUwLjAwMDAwMDAwMCArMDEwMAor KysgZnJlZWJzZF9jcm9uL2xpYi9taXNjLmMJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzU0NDQzNzkg KzAyMDAKQEAgLTEsNjMgKzEsOTAgQEAKIC8qIENvcHlyaWdodCAxOTg4LDE5OTAsMTk5MywxOTk0 IGJ5IFBhdWwgVml4aWUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqLworCisvKgorICogQ29w eXJpZ2h0IChjKSAyMDA0IGJ5IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1bSwgSW5jLiAoIklT QyIpCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsMjAwMCBieSBJbnRlcm5ldCBTb2Z0d2FyZSBDb25z b3J0aXVtLCBJbmMuCiAgKgotICogRGlzdHJpYnV0ZSBmcmVlbHksIGV4Y2VwdDogZG9uJ3QgcmVt b3ZlIG15IG5hbWUgZnJvbSB0aGUgc291cmNlIG9yCi0gKiBkb2N1bWVudGF0aW9uIChkb24ndCB0 YWtlIGNyZWRpdCBmb3IgbXkgd29yayksIG1hcmsgeW91ciBjaGFuZ2VzIChkb24ndAotICogZ2V0 IG1lIGJsYW1lZCBmb3IgeW91ciBwb3NzaWJsZSBidWdzKSwgZG9uJ3QgYWx0ZXIgb3IgcmVtb3Zl IHRoaXMKLSAqIG5vdGljZS4gIE1heSBiZSBzb2xkIGlmIGJ1aWxkYWJsZSBzb3VyY2UgaXMgcHJv dmlkZWQgdG8gYnV5ZXIuICBObwotICogd2FycmFudGVlIG9mIGFueSBraW5kLCBleHByZXNzIG9y IGltcGxpZWQsIGlzIGluY2x1ZGVkIHdpdGggdGhpcwotICogc29mdHdhcmU7IHVzZSBhdCB5b3Vy IG93biByaXNrLCByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyAoaWYgYW55KSB0bwotICogYW55 b25lIHJlc3VsdGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSByZXN0cyBlbnRpcmVs eSB3aXRoIHRoZQotICogdXNlci4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnks IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9y IHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQor ICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4g YWxsIGNvcGllcy4KICAqCi0gKiBTZW5kIGJ1ZyByZXBvcnRzLCBidWcgZml4ZXMsIGVuaGFuY2Vt ZW50cywgcmVxdWVzdHMsIGZsYW1lcywgZXRjLiwgYW5kCi0gKiBJJ2xsIHRyeSB0byBrZWVwIGEg dmVyc2lvbiB1cCB0byBkYXRlLiAgSSBjYW4gYmUgcmVhY2hlZCBhcyBmb2xsb3dzOgotICogUGF1 bCBWaXhpZSAgICAgICAgICA8cGF1bEB2aXguY29tPiAgICAgICAgICB1dW5ldCFkZWN3cmwhdml4 aWUhcGF1bAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElTQyBESVND TEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5D TFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQg RklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIElTQyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BF Q0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBE QU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9S IFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5D RSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCisgKiBPRiBPUiBJTiBDT05O RUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICov CiAKLSNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5lZChMSU5UKQotc3RhdGljIGNvbnN0IGNo YXIgcmNzaWRbXSA9Ci0gICIkRnJlZUJTRDogcmVsZWFzZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9s aWIvbWlzYy5jIDI0MTEyNSAyMDEyLTEwLTAyIDA5OjIzOjE2WiBwbHVrbmV0ICQiOwotI2VuZGlm CisvLyNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5lZChMSU5UKQorLy9zdGF0aWMgY2hhciBy Y3NpZFtdID0gIiRJZDogbWlzYy5jLHYgMS4xNiAyMDA0LzAxLzIzIDE4OjU2OjQzIHZpeGllIEV4 cCAkIjsKKy8vI2VuZGlmCiAKIC8qIHZpeCAyNmphbjg3IFtSQ1MgaGFzIHRoZSByZXN0IG9mIHRo ZSBsb2ddCiAgKiB2aXggMzBkZWM4NiBbd3JpdHRlbl0KICAqLwogCi0KICNpbmNsdWRlICJjcm9u LmgiCi0jaWYgU1lTX1RJTUVfSAotIyBpbmNsdWRlIDxzeXMvdGltZS5oPgotI2Vsc2UKLSMgaW5j bHVkZSA8dGltZS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNpbmNsdWRlIDxz eXMvc3RhdC5oPgotI2luY2x1ZGUgPGVyci5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVk ZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpZiBkZWZpbmVkKFNZU0xPRykKLSMg aW5jbHVkZSA8c3lzbG9nLmg+Ci0jZW5kaWYKKyNpbmNsdWRlIDxsaW1pdHMuaD4KIAorI2lmIGRl ZmluZWQoU1lTTE9HKSAmJiBkZWZpbmVkKExPR19GSUxFKQorIyB1bmRlZiBMT0dfRklMRQorI2Vu ZGlmCiAKICNpZiBkZWZpbmVkKExPR19EQUVNT04pICYmICFkZWZpbmVkKExPR19DUk9OKQotI2Rl ZmluZSBMT0dfQ1JPTiBMT0dfREFFTU9OCisjIGRlZmluZSBMT0dfQ1JPTiBMT0dfREFFTU9OCiAj ZW5kaWYKIAorI2lmbmRlZiBGQUNJTElUWQorI2RlZmluZSBGQUNJTElUWSBMT0dfQ1JPTgorI2Vu ZGlmCiAKLXN0YXRpYyBpbnQJCUxvZ0ZEID0gRVJSOworc3RhdGljIGludCBMb2dGRCA9IEVSUjsK IAorI2lmIGRlZmluZWQoU1lTTE9HKQorc3RhdGljIGludCBzeXNsb2dfb3BlbiA9IEZBTFNFOwor I2VuZGlmCiAKKy8qCisgKiBnbHVlX3N0cmluZ3MgaXMgdGhlIG92ZXJmbG93LXNhZmUgZXF1aXZh bGVudCBvZgorICoJCXNwcmludGYoYnVmZmVyLCAiJXMlYyVzIiwgYSwgc2VwYXJhdG9yLCBiKTsK KyAqCisgKiByZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlLiAgJ2J1ZmZlcicgTVVT VCBOT1QgYmUgdXNlZCBpZgorICogZ2x1ZV9zdHJpbmdzIGZhaWxzLgorICovCiBpbnQKLXN0cmNt cF91bnRpbChsZWZ0LCByaWdodCwgdW50aWwpCi0JY2hhcgkqbGVmdDsKLQljaGFyCSpyaWdodDsK LQlpbnQJdW50aWw7CitnbHVlX3N0cmluZ3MoY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3Np emUsIGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIsCisJICAgICBjaGFyIHNlcGFyYXRvcikK IHsKLQlyZWdpc3RlciBpbnQJZGlmZjsKKwljaGFyICpidWY7CisJY2hhciAqYnVmX2VuZDsKKwor CWlmIChidWZmZXJfc2l6ZSA8PSAwKQorCQlyZXR1cm4gKDApOworCWJ1Zl9lbmQgPSBidWZmZXIg KyBidWZmZXJfc2l6ZTsKKwlidWYgPSBidWZmZXI7CisKKwlmb3IgKCAvKiBub3RoaW5nICovOyBi dWYgPCBidWZfZW5kICYmICphICE9ICdcMCc7IGJ1ZisrLCBhKysgKQorCQkqYnVmID0gKmE7CisJ aWYgKGJ1ZiA9PSBidWZfZW5kKQorCQlyZXR1cm4gKDApOworCWlmIChzZXBhcmF0b3IgIT0gJy8n IHx8IGJ1ZiA9PSBidWZmZXIgfHwgYnVmWy0xXSAhPSAnLycpCisJCSpidWYrKyA9IHNlcGFyYXRv cjsKKwlpZiAoYnVmID09IGJ1Zl9lbmQpCisJCXJldHVybiAoMCk7CisJZm9yICggLyogbm90aGlu ZyAqLzsgYnVmIDwgYnVmX2VuZCAmJiAqYiAhPSAnXDAnOyBidWYrKywgYisrICkKKwkJKmJ1ZiA9 ICpiOworCWlmIChidWYgPT0gYnVmX2VuZCkKKwkJcmV0dXJuICgwKTsKKwkqYnVmID0gJ1wwJzsK KwlyZXR1cm4gKDEpOworfQogCitpbnQKK3N0cmNtcF91bnRpbChjb25zdCBjaGFyICpsZWZ0LCBj b25zdCBjaGFyICpyaWdodCwgY2hhciB1bnRpbCkgewogCXdoaWxlICgqbGVmdCAmJiAqbGVmdCAh PSB1bnRpbCAmJiAqbGVmdCA9PSAqcmlnaHQpIHsKIAkJbGVmdCsrOwogCQlyaWdodCsrOwpAQCAt NjUsMjEgKzkyLDE1IEBACiAKIAlpZiAoKCpsZWZ0PT0nXDAnIHx8ICpsZWZ0ID09IHVudGlsKSAm JgogCSAgICAoKnJpZ2h0PT0nXDAnIHx8ICpyaWdodCA9PSB1bnRpbCkpIHsKLQkJZGlmZiA9IDA7 Ci0JfSBlbHNlIHsKLQkJZGlmZiA9ICpsZWZ0IC0gKnJpZ2h0OworCQlyZXR1cm4gKDApOwogCX0K LQotCXJldHVybiBkaWZmOworCXJldHVybiAoKmxlZnQgLSAqcmlnaHQpOwogfQogCi0KIC8qIHN0 cmR0YihzKSAtIGRlbGV0ZSB0cmFpbGluZyBibGFua3MgaW4gc3RyaW5nICdzJyBhbmQgcmV0dXJu IG5ldyBsZW5ndGgKICAqLwogaW50Ci1zdHJkdGIocykKLQljaGFyCSpzOwoteworc3RyZHRiKGNo YXIgKnMpIHsKIAljaGFyCSp4ID0gczsKIAogCS8qIHNjYW4gZm9yd2FyZCB0byB0aGUgbnVsbApA QCAtOTEsNyArMTEyLDcgQEAKIAkgKiBvciB0aGUgbGFzdCBub24tYmxhbmsgaW4gdGhlIHN0cmlu Zywgd2hpY2hldmVyIGNvbWVzIGZpcnN0LgogCSAqLwogCWRvCXt4LS07fQotCXdoaWxlICh4ID49 IHMgJiYgaXNzcGFjZSgqeCkpOworCXdoaWxlICh4ID49IHMgJiYgaXNzcGFjZSgodW5zaWduZWQg Y2hhcikqeCkpOwogCiAJLyogb25lIGNoYXJhY3RlciBiZXlvbmQgd2hlcmUgd2Ugc3RvcHBlZCBh Ym92ZSBpcyB3aGVyZSB0aGUgbnVsbAogCSAqIGdvZXMuCkBAIC0xMDEsMTQgKzEyMiwxMSBAQAog CS8qIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBvc2l0aW9uIG9mIHRoZSBudWxsIGNoYXJh Y3RlciBhbmQKIAkgKiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUg c3RyaW5nIGlzIHRoZSBsZW5ndGguCiAJICovCi0JcmV0dXJuIHggLSBzOworCXJldHVybiAoeCAt IHMpOwogfQogCi0KIGludAotc2V0X2RlYnVnX2ZsYWdzKGZsYWdzKQotCWNoYXIJKmZsYWdzOwot eworc2V0X2RlYnVnX2ZsYWdzKGNvbnN0IGNoYXIgKmZsYWdzKSB7CiAJLyogZGVidWcgZmxhZ3Mg YXJlIG9mIHRoZSBmb3JtICAgIGZsYWdbLGZsYWcgLi4uXQogCSAqCiAJICogaWYgYW4gZXJyb3Ig b2NjdXJzLCBwcmludCBhIG1lc3NhZ2UgdG8gc3Rkb3V0IGFuZCByZXR1cm4gRkFMU0UuCkBAIC0x MTgsMzEgKzEzNiwzMCBAQAogI2lmICFERUJVR0dJTkcKIAogCXByaW50ZigidGhpcyBwcm9ncmFt IHdhcyBjb21waWxlZCB3aXRob3V0IGRlYnVnZ2luZyBlbmFibGVkXG4iKTsKLQlyZXR1cm4gRkFM U0U7CisJcmV0dXJuIChGQUxTRSk7CiAKICNlbHNlIC8qIERFQlVHR0lORyAqLwogCi0JY2hhcgkq cGMgPSBmbGFnczsKKwljb25zdCBjaGFyICpwYyA9IGZsYWdzOwogCiAJRGVidWdGbGFncyA9IDA7 CiAKIAl3aGlsZSAoKnBjKSB7Ci0JCWNoYXIJKip0ZXN0OwotCQlpbnQJbWFzazsKKwkJY29uc3Qg Y2hhcgkqKnRlc3Q7CisJCWludAkJbWFzazsKIAogCQkvKiB0cnkgdG8gZmluZCBkZWJ1ZyBmbGFn IG5hbWUgaW4gb3VyIGxpc3QuCiAJCSAqLwotCQlmb3IgKAl0ZXN0ID0gRGVidWdGbGFnTmFtZXMs IG1hc2sgPSAxOwotCQkJKnRlc3QgJiYgc3RyY21wX3VudGlsKCp0ZXN0LCBwYywgJywnKTsKLQkJ CXRlc3QrKywgbWFzayA8PD0gMQotCQkgICAgKQotCQkJOworCQlmb3IgKHRlc3QgPSBEZWJ1Z0Zs YWdOYW1lcywgbWFzayA9IDE7CisJCSAgICAgKnRlc3QgIT0gTlVMTCAmJiBzdHJjbXBfdW50aWwo KnRlc3QsIHBjLCAnLCcpOworCQkgICAgIHRlc3QrKywgbWFzayA8PD0gMSkKKwkJCU5VTEw7CiAK IAkJaWYgKCEqdGVzdCkgewogCQkJZnByaW50ZihzdGRlcnIsCiAJCQkJInVucmVjb2duaXplZCBk ZWJ1ZyBmbGFnIDwlcz4gPCVzPlxuIiwKIAkJCQlmbGFncywgcGMpOwotCQkJcmV0dXJuIEZBTFNF OworCQkJcmV0dXJuIChGQUxTRSk7CiAJCX0KIAogCQlEZWJ1Z0ZsYWdzIHw9IG1hc2s7CkBAIC0x NTYsNyArMTczLDcgQEAKIAl9CiAKIAlpZiAoRGVidWdGbGFncykgewotCQlpbnQJZmxhZzsKKwkJ aW50IGZsYWc7CiAKIAkJZnByaW50ZihzdGRlcnIsICJkZWJ1ZyBmbGFncyBlbmFibGVkOiIpOwog CkBAIC0xNjYsOTAgKzE4MywxMDUgQEAKIAkJZnByaW50ZihzdGRlcnIsICJcbiIpOwogCX0KIAot CXJldHVybiBUUlVFOworCXJldHVybiAoVFJVRSk7CiAKICNlbmRpZiAvKiBERUJVR0dJTkcgKi8K IH0KIAotCiB2b2lkCi1zZXRfY3Jvbl91aWQoKQoteworc2V0X2Nyb25fdWlkKHZvaWQpIHsKICNp ZiBkZWZpbmVkKEJTRCkgfHwgZGVmaW5lZChQT1NJWCkKLQlpZiAoc2V0ZXVpZChST09UX1VJRCkg PCBPSykKLQkJZXJyKEVSUk9SX0VYSVQsICJzZXRldWlkIik7CisJaWYgKHNldGV1aWQoUk9PVF9V SUQpIDwgT0spIHsKKwkJcGVycm9yKCJzZXRldWlkIik7CisJCWV4aXQoRVJST1JfRVhJVCk7CisJ fQogI2Vsc2UKLQlpZiAoc2V0dWlkKFJPT1RfVUlEKSA8IE9LKQotCQllcnIoRVJST1JfRVhJVCwg InNldHVpZCIpOworCWlmIChzZXR1aWQoUk9PVF9VSUQpIDwgT0spIHsKKwkJcGVycm9yKCJzZXR1 aWQiKTsKKwkJZXhpdChFUlJPUl9FWElUKTsKKwl9CiAjZW5kaWYKIH0KIAotCiB2b2lkCi1zZXRf Y3Jvbl9jd2QoKQotewotCXN0cnVjdCBzdGF0CXNiOworc2V0X2Nyb25fY3dkKHZvaWQpIHsKKwlz dHJ1Y3Qgc3RhdCBzYjsKKwlzdHJ1Y3QgZ3JvdXAgKmdycCA9IE5VTEw7CiAKKyNpZmRlZiBDUk9O X0dST1VQCisJZ3JwID0gZ2V0Z3JuYW0oQ1JPTl9HUk9VUCk7CisjZW5kaWYKIAkvKiBmaXJzdCBj aGVjayBmb3IgQ1JPTkRJUiAoIi92YXIvY3JvbiIgb3Igc29tZSBzdWNoKQogCSAqLwogCWlmIChz dGF0KENST05ESVIsICZzYikgPCBPSyAmJiBlcnJubyA9PSBFTk9FTlQpIHsKLQkJd2FybigiJXMi LCBDUk9ORElSKTsKLQkJaWYgKE9LID09IG1rZGlyKENST05ESVIsIDA3MDApKSB7Ci0JCQl3YXJu eCgiJXM6IGNyZWF0ZWQiLCBDUk9ORElSKTsKKwkJcGVycm9yKENST05ESVIpOworCQlpZiAoT0sg PT0gbWtkaXIoQ1JPTkRJUiwgMDcxMCkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNyZWF0 ZWRcbiIsIENST05ESVIpOwogCQkJc3RhdChDUk9ORElSLCAmc2IpOwogCQl9IGVsc2UgewotCQkJ ZXJyKEVSUk9SX0VYSVQsICIlczogbWtkaXIiLCBDUk9ORElSKTsKKwkJCWZwcmludGYoc3RkZXJy LCAiJXM6ICIsIENST05ESVIpOworCQkJcGVycm9yKCJta2RpciIpOworCQkJZXhpdChFUlJPUl9F WElUKTsKIAkJfQogCX0KLQlpZiAoIShzYi5zdF9tb2RlICYgU19JRkRJUikpCi0JCWVycihFUlJP Ul9FWElULCAiJyVzJyBpcyBub3QgYSBkaXJlY3RvcnksIGJhaWxpbmcgb3V0IiwgQ1JPTkRJUik7 Ci0JaWYgKGNoZGlyKENST05ESVIpIDwgT0spCi0JCWVycihFUlJPUl9FWElULCAiY2Fubm90IGNo ZGlyKCVzKSwgYmFpbGluZyBvdXQiLCBDUk9ORElSKTsKKwlpZiAoIVNfSVNESVIoc2Iuc3RfbW9k ZSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICInJXMnIGlzIG5vdCBhIGRpcmVjdG9yeSwgYmFpbGlu ZyBvdXQuXG4iLAorCQkJQ1JPTkRJUik7CisJCWV4aXQoRVJST1JfRVhJVCk7CisJfQorCWlmIChj aGRpcihDUk9ORElSKSA8IE9LKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY2Fubm90IGNoZGlyKCVz KSwgYmFpbGluZyBvdXQuXG4iLCBDUk9ORElSKTsKKwkJcGVycm9yKENST05ESVIpOworCQlleGl0 KEVSUk9SX0VYSVQpOworCX0KIAogCS8qIENST05ESVIgb2theSAobm93PT1DV0QpLCBub3cgbG9v ayBhdCBTUE9PTF9ESVIgKCJ0YWJzIiBvciBzb21lIHN1Y2gpCiAJICovCiAJaWYgKHN0YXQoU1BP T0xfRElSLCAmc2IpIDwgT0sgJiYgZXJybm8gPT0gRU5PRU5UKSB7Ci0JCXdhcm4oIiVzIiwgU1BP T0xfRElSKTsKKwkJcGVycm9yKFNQT09MX0RJUik7CiAJCWlmIChPSyA9PSBta2RpcihTUE9PTF9E SVIsIDA3MDApKSB7Ci0JCQl3YXJueCgiJXM6IGNyZWF0ZWQiLCBTUE9PTF9ESVIpOworCQkJZnBy aW50ZihzdGRlcnIsICIlczogY3JlYXRlZFxuIiwgU1BPT0xfRElSKTsKIAkJCXN0YXQoU1BPT0xf RElSLCAmc2IpOwogCQl9IGVsc2UgewotCQkJZXJyKEVSUk9SX0VYSVQsICIlczogbWtkaXIiLCBT UE9PTF9ESVIpOworCQkJZnByaW50ZihzdGRlcnIsICIlczogIiwgU1BPT0xfRElSKTsKKwkJCXBl cnJvcigibWtkaXIiKTsKKwkJCWV4aXQoRVJST1JfRVhJVCk7CiAJCX0KIAl9Ci0JaWYgKCEoc2Iu c3RfbW9kZSAmIFNfSUZESVIpKQotCQllcnIoRVJST1JfRVhJVCwgIiclcycgaXMgbm90IGEgZGly ZWN0b3J5LCBiYWlsaW5nIG91dCIsIFNQT09MX0RJUik7CisJaWYgKCFTX0lTRElSKHNiLnN0X21v ZGUpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJyVzJyBpcyBub3QgYSBkaXJlY3RvcnksIGJhaWxp bmcgb3V0LlxuIiwKKwkJCVNQT09MX0RJUik7CisJCWV4aXQoRVJST1JfRVhJVCk7CisJfQorCWlm IChncnAgIT0gTlVMTCkgeworCQlpZiAoc2Iuc3RfZ2lkICE9IGdycC0+Z3JfZ2lkKQorCQkJY2hv d24oU1BPT0xfRElSLCAtMSwgZ3JwLT5ncl9naWQpOworCQlpZiAoc2Iuc3RfbW9kZSAhPSAwMTcz MCkKKwkJCWNobW9kKFNQT09MX0RJUiwgMDE3MzApOworCX0KIH0KIAotCiAvKiBnZXRfY2hhcihm aWxlKSA6IGxpa2UgZ2V0YygpIGJ1dCBpbmNyZW1lbnQgTGluZU51bWJlciBvbiBuZXdsaW5lcwog ICovCiBpbnQKLWdldF9jaGFyKGZpbGUpCi0JRklMRQkqZmlsZTsKLXsKLQlpbnQJY2g7CitnZXRf Y2hhcihGSUxFICpmaWxlKSB7CisJaW50IGNoOwogCiAJY2ggPSBnZXRjKGZpbGUpOwogCWlmIChj aCA9PSAnXG4nKQogCQlTZXRfTGluZU51bShMaW5lTnVtYmVyICsgMSkKLQlyZXR1cm4gY2g7CisJ cmV0dXJuIChjaCk7CiB9CiAKLQogLyogdW5nZXRfY2hhcihjaCwgZmlsZSkgOiBsaWtlIHVuZ2V0 YyBidXQgZG8gTGluZU51bWJlciBwcm9jZXNzaW5nCiAgKi8KIHZvaWQKLXVuZ2V0X2NoYXIoY2gs IGZpbGUpCi0JaW50CWNoOwotCUZJTEUJKmZpbGU7Ci17Cit1bmdldF9jaGFyKGludCBjaCwgRklM RSAqZmlsZSkgewogCXVuZ2V0YyhjaCwgZmlsZSk7CiAJaWYgKGNoID09ICdcbicpCiAJCVNldF9M aW5lTnVtKExpbmVOdW1iZXIgLSAxKQogfQogCi0KIC8qIGdldF9zdHJpbmcoc3RyLCBtYXgsIGZp bGUsIHRlcm1zdHIpIDogbGlrZSBmZ2V0cygpIGJ1dAogICoJCSgxKSBoYXMgdGVybWluYXRvciBz dHJpbmcgd2hpY2ggc2hvdWxkIGluY2x1ZGUgXG4KICAqCQkoMikgd2lsbCBhbHdheXMgbGVhdmUg cm9vbSBmb3IgdGhlIG51bGwKQEAgLTI1NywxMyArMjg5LDggQEAKICAqCQkoNCkgcmV0dXJucyBF T0Ygb3IgdGVybWluYXRpbmcgY2hhcmFjdGVyLCB3aGljaGV2ZXIKICAqLwogaW50Ci1nZXRfc3Ry aW5nKHN0cmluZywgc2l6ZSwgZmlsZSwgdGVybXMpCi0JY2hhcgkqc3RyaW5nOwotCWludAlzaXpl OwotCUZJTEUJKmZpbGU7Ci0JY2hhcgkqdGVybXM7Ci17Ci0JaW50CWNoOworZ2V0X3N0cmluZyhj aGFyICpzdHJpbmcsIGludCBzaXplLCBGSUxFICpmaWxlLCBjaGFyICp0ZXJtcykgeworCWludCBj aDsKIAogCXdoaWxlIChFT0YgIT0gKGNoID0gZ2V0X2NoYXIoZmlsZSkpICYmICFzdHJjaHIodGVy bXMsIGNoKSkgewogCQlpZiAoc2l6ZSA+IDEpIHsKQEAgLTI3NSwxNyArMzAyLDE0IEBACiAJaWYg KHNpemUgPiAwKQogCQkqc3RyaW5nID0gJ1wwJzsKIAotCXJldHVybiBjaDsKKwlyZXR1cm4gKGNo KTsKIH0KIAotCiAvKiBza2lwX2NvbW1lbnRzKGZpbGUpIDogcmVhZCBwYXN0IGNvbW1lbnQgKGlm IGFueSkKICAqLwogdm9pZAotc2tpcF9jb21tZW50cyhmaWxlKQotCUZJTEUJKmZpbGU7Ci17Ci0J aW50CWNoOworc2tpcF9jb21tZW50cyhGSUxFICpmaWxlKSB7CisJaW50IGNoOwogCiAJd2hpbGUg KEVPRiAhPSAoY2ggPSBnZXRfY2hhcihmaWxlKSkpIHsKIAkJLyogY2ggaXMgbm93IHRoZSBmaXJz dCBjaGFyYWN0ZXIgb2YgYSBsaW5lLgpAQCAtMzE4LDkyICszNDIsODcgQEAKIAkJdW5nZXRfY2hh cihjaCwgZmlsZSk7CiB9CiAKLQotLyogaW50IGluX2ZpbGUoY2hhciAqc3RyaW5nLCBGSUxFICpm aWxlKQorLyogaW50IGluX2ZpbGUoY29uc3QgY2hhciAqc3RyaW5nLCBGSUxFICpmaWxlLCBpbnQg ZXJyb3IpCiAgKglyZXR1cm4gVFJVRSBpZiBvbmUgb2YgdGhlIGxpbmVzIGluIGZpbGUgbWF0Y2hl cyBzdHJpbmcgZXhhY3RseSwKLSAqCUZBTFNFIG90aGVyd2lzZS4KKyAqCUZBTFNFIGlmIG5vIGxp bmVzIG1hdGNoLCBhbmQgZXJyb3Igb24gZXJyb3IuCiAgKi8KIHN0YXRpYyBpbnQKLWluX2ZpbGUo Y2hhciAqc3RyaW5nLCBGSUxFICpmaWxlKQoraW5fZmlsZShjb25zdCBjaGFyICpzdHJpbmcsIEZJ TEUgKmZpbGUsIGludCBlcnJvcikKIHsKIAljaGFyIGxpbmVbTUFYX1RFTVBTVFJdOworCWNoYXIg KmVuZHA7CiAKLQlyZXdpbmQoZmlsZSk7CisJaWYgKGZzZWVrKGZpbGUsIDBMLCBTRUVLX1NFVCkp CisJCXJldHVybiAoZXJyb3IpOwogCXdoaWxlIChmZ2V0cyhsaW5lLCBNQVhfVEVNUFNUUiwgZmls ZSkpIHsKLQkJaWYgKGxpbmVbMF0gIT0gJ1wwJykKLQkJCWlmIChsaW5lW3N0cmxlbihsaW5lKS0x XSA9PSAnXG4nKQotCQkJCWxpbmVbc3RybGVuKGxpbmUpLTFdID0gJ1wwJzsKLQkJaWYgKDAgPT0g c3RyY21wKGxpbmUsIHN0cmluZykpCi0JCQlyZXR1cm4gVFJVRTsKKwkJaWYgKGxpbmVbMF0gIT0g J1wwJykgeworCQkJZW5kcCA9ICZsaW5lW3N0cmxlbihsaW5lKSAtIDFdOworCQkJaWYgKCplbmRw ICE9ICdcbicpCisJCQkJcmV0dXJuIChlcnJvcik7CisJCQkqZW5kcCA9ICdcMCc7CisJCQlpZiAo MCA9PSBzdHJjbXAobGluZSwgc3RyaW5nKSkKKwkJCQlyZXR1cm4gKFRSVUUpOworCQl9CiAJfQot CXJldHVybiBGQUxTRTsKKwlpZiAoZmVycm9yKGZpbGUpKQorCQlyZXR1cm4gKGVycm9yKTsKKwly ZXR1cm4gKEZBTFNFKTsKIH0KIAotCiAvKiBpbnQgYWxsb3dlZChjaGFyICp1c2VybmFtZSkKLSAq CXJldHVybnMgVFJVRSBpZiAoQUxMT1dfRklMRSBleGlzdHMgYW5kIHVzZXIgaXMgbGlzdGVkKQot ICoJb3IgKERFTllfRklMRSBleGlzdHMgYW5kIHVzZXIgaXMgTk9UIGxpc3RlZCkKLSAqCW9yIChu ZWl0aGVyIGZpbGUgZXhpc3RzIGJ1dCB1c2VyPT0icm9vdCIgc28gaXQncyBva2F5KQorICogICAg ICByZXR1cm5zIFRSVUUgaWYgKEFMTE9XX0ZJTEUgZXhpc3RzIGFuZCB1c2VyIGlzIGxpc3RlZCkK KyAqICAgICAgb3IgKERFTllfRklMRSBleGlzdHMgYW5kIHVzZXIgaXMgTk9UIGxpc3RlZCkKKyAq ICAgICAgb3IgKG5laXRoZXIgZmlsZSBleGlzdHMgYnV0IHVzZXI9PSJyb290IiBzbyBpdCdzIG9r YXkpCiAgKi8KKwogaW50Ci1hbGxvd2VkKHVzZXJuYW1lKQotCWNoYXIgKnVzZXJuYW1lOworYWxs b3dlZChjaGFyICp1c2VybmFtZSkKIHsKLQlGSUxFCSphbGxvdywgKmRlbnk7Ci0JaW50CWlzYWxs b3dlZDsKKyAgICAgICAgRklMRSAgICAqYWxsb3csICpkZW55OworICAgICAgICBpbnQgICAgIGlz YWxsb3dlZDsKIAotCWlzYWxsb3dlZCA9IEZBTFNFOworICAgICAgICBpc2FsbG93ZWQgPSBGQUxT RTsKIAotCWRlbnkgPSBOVUxMOworICAgICAgICBkZW55ID0gTlVMTDsKICNpZiBkZWZpbmVkKEFM TE9XX0ZJTEUpICYmIGRlZmluZWQoREVOWV9GSUxFKQotCWlmICgoYWxsb3cgPSBmb3BlbihBTExP V19GSUxFLCAiciIpKSA9PSBOVUxMICYmIGVycm5vICE9IEVOT0VOVCkKLQkJZ290byBvdXQ7Ci0J aWYgKChkZW55ID0gZm9wZW4oREVOWV9GSUxFLCAiciIpKSA9PSBOVUxMICYmIGVycm5vICE9IEVO T0VOVCkKLQkJZ290byBvdXQ7Ci0JRGVidWcoRE1JU0MsICgiYWxsb3cvZGVueSBlbmFibGVkLCAl ZC8lZFxuIiwgISFhbGxvdywgISFkZW55KSkKKyAgICAgICAgaWYgKChhbGxvdyA9IGZvcGVuKEFM TE9XX0ZJTEUsICJyIikpID09IE5VTEwgJiYgZXJybm8gIT0gRU5PRU5UKQorICAgICAgICAgICAg ICAgIGdvdG8gb3V0OworICAgICAgICBpZiAoKGRlbnkgPSBmb3BlbihERU5ZX0ZJTEUsICJyIikp ID09IE5VTEwgJiYgZXJybm8gIT0gRU5PRU5UKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0Owor ICAgICAgICBEZWJ1ZyhETUlTQywgKCJhbGxvdy9kZW55IGVuYWJsZWQsICVkLyVkXG4iLCAhIWFs bG93LCAhIWRlbnkpKQogI2Vsc2UKLQlhbGxvdyA9IE5VTEw7CisgICAgICAgIGFsbG93ID0gTlVM TDsKICNlbmRpZgogCi0JaWYgKGFsbG93KQotCQlpc2FsbG93ZWQgPSBpbl9maWxlKHVzZXJuYW1l LCBhbGxvdyk7Ci0JZWxzZSBpZiAoZGVueSkKLQkJaXNhbGxvd2VkID0gIWluX2ZpbGUodXNlcm5h bWUsIGRlbnkpOwotCWVsc2UgeworICAgICAgICBpZiAoYWxsb3cpCisgICAgICAgICAgICAgICAg aXNhbGxvd2VkID0gaW5fZmlsZSh1c2VybmFtZSwgYWxsb3csIEZBTFNFKTsKKyAgICAgICAgZWxz ZSBpZiAoZGVueSkKKyAgICAgICAgICAgICAgICBpc2FsbG93ZWQgPSAhaW5fZmlsZSh1c2VybmFt ZSwgZGVueSwgRkFMU0UpOworICAgICAgICBlbHNlIHsKICNpZiBkZWZpbmVkKEFMTE9XX09OTFlf Uk9PVCkKLQkJaXNhbGxvd2VkID0gKHN0cmNtcCh1c2VybmFtZSwgUk9PVF9VU0VSKSA9PSAwKTsK KyAgICAgICAgICAgICAgICBpc2FsbG93ZWQgPSAoc3RyY21wKHVzZXJuYW1lLCBST09UX1VTRVIp ID09IDApOwogI2Vsc2UKLQkJaXNhbGxvd2VkID0gVFJVRTsgCisgICAgICAgICAgICAgICAgaXNh bGxvd2VkID0gVFJVRTsgCiAjZW5kaWYKLQl9Ci1vdXQ6CWlmIChhbGxvdykKLQkJZmNsb3NlKGFs bG93KTsKLQlpZiAoZGVueSkKLQkJZmNsb3NlKGRlbnkpOwotCXJldHVybiAoaXNhbGxvd2VkKTsK KyAgICAgICAgfQorb3V0OiAgICBpZiAoYWxsb3cpCisgICAgICAgICAgICAgICAgZmNsb3NlKGFs bG93KTsKKyAgICAgICAgaWYgKGRlbnkpCisgICAgICAgICAgICAgICAgZmNsb3NlKGRlbnkpOwor ICAgICAgICByZXR1cm4gKGlzYWxsb3dlZCk7CiB9CiAKLQogdm9pZAotbG9nX2l0KHVzZXJuYW1l LCB4cGlkLCBldmVudCwgZGV0YWlsKQotCWNoYXIJKnVzZXJuYW1lOwotCWludAl4cGlkOwotCWNo YXIJKmV2ZW50OwotCWNoYXIJKmRldGFpbDsKLXsKK2xvZ19pdChjb25zdCBjaGFyICp1c2VybmFt ZSwgUElEX1QgeHBpZCwgY29uc3QgY2hhciAqZXZlbnQsIGNvbnN0IGNoYXIgKmRldGFpbCkgewog I2lmIGRlZmluZWQoTE9HX0ZJTEUpIHx8IERFQlVHR0lORwotCVBJRF9UCQkJcGlkID0geHBpZDsK KwlQSURfVCBwaWQgPSB4cGlkOwogI2VuZGlmCiAjaWYgZGVmaW5lZChMT0dfRklMRSkKLQljaGFy CQkJKm1zZzsKLQlUSU1FX1QJCQlub3cgPSB0aW1lKChUSU1FX1QpIDApOwotCXJlZ2lzdGVyIHN0 cnVjdCB0bQkqdCA9IGxvY2FsdGltZSgmbm93KTsKKwljaGFyICptc2c7CisJVElNRV9UIG5vdyA9 IHRpbWUoKFRJTUVfVCkgMCk7CisJc3RydWN0IHRtICp0ID0gbG9jYWx0aW1lKCZub3cpOwogI2Vu ZGlmIC8qTE9HX0ZJTEUqLwogCi0jaWYgZGVmaW5lZChTWVNMT0cpCi0Jc3RhdGljIGludAkJc3lz bG9nX29wZW4gPSAwOwotI2VuZGlmCi0KICNpZiBkZWZpbmVkKExPR19GSUxFKQogCS8qIHdlIGFz c3VtZSB0aGF0IE1BWF9URU1QU1RSIHdpbGwgaG9sZCB0aGUgZGF0ZSwgdGltZSwgJnB1bmN0dWF0 aW9uLgogCSAqLwpAQCAtNDExLDkwICs0MzAsODkgQEAKIAkJICAgICArIHN0cmxlbihldmVudCkK IAkJICAgICArIHN0cmxlbihkZXRhaWwpCiAJCSAgICAgKyBNQVhfVEVNUFNUUik7Ci0KIAlpZiAo bXNnID09IE5VTEwpCi0JCXdhcm54KCJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBsb2cg bWVzc2FnZSIpOwotCWVsc2UgeworCQlyZXR1cm47CisKKwlpZiAoTG9nRkQgPCBPSykgeworCQlM b2dGRCA9IG9wZW4oTE9HX0ZJTEUsIE9fV1JPTkxZfE9fQVBQRU5EfE9fQ1JFQVQsIDA2MDApOwog CQlpZiAoTG9nRkQgPCBPSykgewotCQkJTG9nRkQgPSBvcGVuKExPR19GSUxFLCBPX1dST05MWXxP X0FQUEVORHxPX0NSRUFULCAwNjAwKTsKLQkJCWlmIChMb2dGRCA8IE9LKSB7Ci0JCQkJd2Fybigi Y2FuJ3Qgb3BlbiBsb2cgZmlsZSAlcyIsIExPR19GSUxFKTsKLQkJCX0gZWxzZSB7Ci0JCQkJKHZv aWQpIGZjbnRsKExvZ0ZELCBGX1NFVEZELCAxKTsKLQkJCX0KKwkJCWZwcmludGYoc3RkZXJyLCAi JXM6IGNhbid0IG9wZW4gbG9nIGZpbGVcbiIsCisJCQkJUHJvZ3JhbU5hbWUpOworCQkJcGVycm9y KExPR19GSUxFKTsKKwkJfSBlbHNlIHsKKwkJCSh2b2lkKSBmY250bChMb2dGRCwgRl9TRVRGRCwg MSk7CiAJCX0KKwl9CiAKLQkJLyogd2UgaGF2ZSB0byBzcHJpbnRmKCkgaXQgYmVjYXVzZSBmcHJp bnRmKCkgZG9lc24ndCBhbHdheXMKLQkJICogd3JpdGUgZXZlcnl0aGluZyBvdXQgaW4gb25lIGNo dW5rIGFuZCB0aGlzIGhhcyB0byBiZQotCQkgKiBhdG9taWNhbGx5IGFwcGVuZGVkIHRvIHRoZSBs b2cgZmlsZS4KLQkJICovCi0JCXNwcmludGYobXNnLCAiJXMgKCUwMmQvJTAyZC0lMDJkOiUwMmQ6 JTAyZC0lZCkgJXMgKCVzKVxuIiwKLQkJCXVzZXJuYW1lLAotCQkJdC0+dG1fbW9uKzEsIHQtPnRt X21kYXksIHQtPnRtX2hvdXIsIHQtPnRtX21pbiwKLQkJCXQtPnRtX3NlYywgcGlkLCBldmVudCwg ZGV0YWlsKTsKLQotCQkvKiB3ZSBoYXZlIHRvIHJ1biBzdHJsZW4oKSBiZWNhdXNlIHNwcmludGYo KSByZXR1cm5zIChjaGFyKikKLQkJICogb24gb2xkIEJTRC4KLQkJICovCi0JCWlmIChMb2dGRCA8 IE9LIHx8IHdyaXRlKExvZ0ZELCBtc2csIHN0cmxlbihtc2cpKSA8IE9LKSB7Ci0JCQlpZiAoTG9n RkQgPj0gT0spCi0JCQkJd2FybigiJXMiLCBMT0dfRklMRSk7Ci0JCQl3YXJueCgiY2FuJ3Qgd3Jp dGUgdG8gbG9nIGZpbGUiKTsKLQkJCXdyaXRlKFNUREVSUiwgbXNnLCBzdHJsZW4obXNnKSk7Ci0J CX0KKwkvKiB3ZSBoYXZlIHRvIHNwcmludGYoKSBpdCBiZWNhdXNlIGZwcmludGYoKSBkb2Vzbid0 IGFsd2F5cyB3cml0ZQorCSAqIGV2ZXJ5dGhpbmcgb3V0IGluIG9uZSBjaHVuayBhbmQgdGhpcyBo YXMgdG8gYmUgYXRvbWljYWxseSBhcHBlbmRlZAorCSAqIHRvIHRoZSBsb2cgZmlsZS4KKwkgKi8K KwlzcHJpbnRmKG1zZywgIiVzICglMDJkLyUwMmQtJTAyZDolMDJkOiUwMmQtJWQpICVzICglcylc biIsCisJCXVzZXJuYW1lLAorCQl0LT50bV9tb24rMSwgdC0+dG1fbWRheSwgdC0+dG1faG91ciwg dC0+dG1fbWluLCB0LT50bV9zZWMsIHBpZCwKKwkJZXZlbnQsIGRldGFpbCk7CiAKLQkJZnJlZSht c2cpOworCS8qIHdlIGhhdmUgdG8gcnVuIHN0cmxlbigpIGJlY2F1c2Ugc3ByaW50ZigpIHJldHVy bnMgKGNoYXIqKSBvbiBvbGQgQlNECisJICovCisJaWYgKExvZ0ZEIDwgT0sgfHwgd3JpdGUoTG9n RkQsIG1zZywgc3RybGVuKG1zZykpIDwgT0spIHsKKwkJaWYgKExvZ0ZEID49IE9LKQorCQkJcGVy cm9yKExPR19GSUxFKTsKKwkJZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgd3JpdGUgdG8gbG9n IGZpbGVcbiIsIFByb2dyYW1OYW1lKTsKKwkJd3JpdGUoU1RERVJSLCBtc2csIHN0cmxlbihtc2cp KTsKIAl9CisKKwlmcmVlKG1zZyk7CiAjZW5kaWYgLypMT0dfRklMRSovCiAKICNpZiBkZWZpbmVk KFNZU0xPRykKIAlpZiAoIXN5c2xvZ19vcGVuKSB7Ci0JCS8qIHdlIGRvbid0IHVzZSBMT0dfUElE IHNpbmNlIHRoZSBwaWQgcGFzc2VkIHRvIHVzIGJ5Ci0JCSAqIG91ciBjbGllbnQgbWF5IG5vdCBi ZSBvdXIgb3duLiAgdGhlcmVmb3JlIHdlIHdhbnQgdG8KLQkJICogcHJpbnQgdGhlIHBpZCBvdXJz ZWx2ZXMuCi0JCSAqLwogIyBpZmRlZiBMT0dfREFFTU9OCi0JCW9wZW5sb2coUHJvZ3JhbU5hbWUs IExPR19QSUQsIExPR19DUk9OKTsKKwkJb3BlbmxvZyhQcm9ncmFtTmFtZSwgTE9HX1BJRCwgRkFD SUxJVFkpOwogIyBlbHNlCiAJCW9wZW5sb2coUHJvZ3JhbU5hbWUsIExPR19QSUQpOwogIyBlbmRp ZgogCQlzeXNsb2dfb3BlbiA9IFRSVUU7CQkvKiBhc3N1bWUgb3BlbmxvZyBzdWNjZXNzICovCiAJ fQogCi0Jc3lzbG9nKExPR19JTkZPLCAiKCVzKSAlcyAoJXMpXG4iLCB1c2VybmFtZSwgZXZlbnQs IGRldGFpbCk7CisJc3lzbG9nKExPR19JTkZPLCAiKCVzKSAlcyAoJXMpIiwgdXNlcm5hbWUsIGV2 ZW50LCBkZXRhaWwpOwogCiAjZW5kaWYgLypTWVNMT0cqLwogCiAjaWYgREVCVUdHSU5HCiAJaWYg KERlYnVnRmxhZ3MpIHsKLQkJZnByaW50ZihzdGRlcnIsICJsb2dfaXQ6ICglcyAlZCkgJXMgKCVz KVxuIiwKLQkJCXVzZXJuYW1lLCBwaWQsIGV2ZW50LCBkZXRhaWwpOworCQlmcHJpbnRmKHN0ZGVy ciwgImxvZ19pdDogKCVzICVsZCkgJXMgKCVzKVxuIiwKKwkJCXVzZXJuYW1lLCAobG9uZylwaWQs IGV2ZW50LCBkZXRhaWwpOwogCX0KICNlbmRpZgogfQogCi0KIHZvaWQKLWxvZ19jbG9zZSgpIHsK K2xvZ19jbG9zZSh2b2lkKSB7CiAJaWYgKExvZ0ZEICE9IEVSUikgewogCQljbG9zZShMb2dGRCk7 CiAJCUxvZ0ZEID0gRVJSOwogCX0KKyNpZiBkZWZpbmVkKFNZU0xPRykKKwljbG9zZWxvZygpOwor CXN5c2xvZ19vcGVuID0gRkFMU0U7CisjZW5kaWYgLypTWVNMT0cqLwogfQogCi0KLS8qIHR3byB3 YXJuaW5nczoKKy8qIGNoYXIgKmZpcnN0X3dvcmQoY2hhciAqcywgY2hhciAqdCkKKyAqCXJldHVy biBwb2ludGVyIHRvIGZpcnN0IHdvcmQKKyAqIHBhcmFtZXRlcnM6CisgKglzIC0gc3RyaW5nIHdl IHdhbnQgdGhlIGZpcnN0IHdvcmQgb2YKKyAqCXQgLSB0ZXJtaW5hdG9ycywgaW1wbGljaXRseSBp bmNsdWRpbmcgXDAKKyAqIHdhcm5pbmdzOgogICoJKDEpIHRoaXMgcm91dGluZSBpcyBmYWlybHkg c2xvdwogICoJKDIpIGl0IHJldHVybnMgYSBwb2ludGVyIHRvIHN0YXRpYyBzdG9yYWdlCiAgKi8K IGNoYXIgKgotZmlyc3Rfd29yZChzLCB0KQotCXJlZ2lzdGVyIGNoYXIgKnM7CS8qIHN0cmluZyB3 ZSB3YW50IHRoZSBmaXJzdCB3b3JkIG9mICovCi0JcmVnaXN0ZXIgY2hhciAqdDsJLyogdGVybWlu YXRvcnMsIGltcGxpY2l0bHkgaW5jbHVkaW5nIFwwICovCi17CitmaXJzdF93b3JkKGNoYXIgKnMs IGNoYXIgKnQpIHsKIAlzdGF0aWMgY2hhciByZXRidWZbMl1bTUFYX1RFTVBTVFIgKyAxXTsJLyog c3VyZSB3aXNoIEMgaGFkIEdDICovCiAJc3RhdGljIGludCByZXRzZWwgPSAwOwotCXJlZ2lzdGVy IGNoYXIgKnJiLCAqcnA7CisJY2hhciAqcmIsICpycDsKIAogCS8qIHNlbGVjdCBhIHJldHVybiBi dWZmZXIgKi8KIAlyZXRzZWwgPSAxLXJldHNlbDsKQEAgLTUxMywxOSArNTMxLDIzIEBACiAKIAkv KiBmaW5pc2ggdGhlIHJldHVybi1zdHJpbmcgYW5kIHJldHVybiBpdCAqLwogCSpycCA9ICdcMCc7 Ci0JcmV0dXJuIHJiOworCXJldHVybiAocmIpOwogfQogCi0KIC8qIHdhcm5pbmc6CiAgKgloZWF2 aWx5IGFzY2lpLWRlcGVuZGVudC4KICAqLwotc3RhdGljIHZvaWQKLW1rcHJpbnQocmVnaXN0ZXIg Y2hhciAqZHN0LCByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpzcmMsIHJlZ2lzdGVyIGludCBsZW4p Cit2b2lkCitta3ByaW50KGNoYXIgKmRzdCwgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgbGVuKQog eworCS8qCisJICogWFhYCisJICogV2Uga25vdyB0aGlzIHJvdXRpbmUgY2FuJ3Qgb3ZlcmZsb3cg dGhlIGRzdCBidWZmZXIgYmVjYXVzZSBta3ByaW50cygpCisJICogYWxsb2NhdGVkIGVub3VnaCBz cGFjZSBmb3IgdGhlIHdvcnN0IGNhc2UuCisJICovCiAJd2hpbGUgKGxlbi0tID4gMCkKIAl7Ci0J CXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgY2ggPSAqc3JjKys7CisJCXVuc2lnbmVkIGNoYXIgY2gg PSAqc3JjKys7CiAKIAkJaWYgKGNoIDwgJyAnKSB7CQkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8K IAkJCSpkc3QrKyA9ICdeJzsKQEAgLTU0Myw1OCArNTY1LDE3NSBAQAogCSpkc3QgPSAnXDAnOwog fQogCi0KIC8qIHdhcm5pbmc6CiAgKglyZXR1cm5zIGEgcG9pbnRlciB0byBtYWxsb2MnZCBzdG9y YWdlLCB5b3UgbXVzdCBjYWxsIGZyZWUgeW91cnNlbGYuCiAgKi8KIGNoYXIgKgogbWtwcmludHMo c3JjLCBsZW4pCi0JcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqc3JjOwotCXJlZ2lzdGVyIHVuc2ln bmVkIGludCBsZW47CisJdW5zaWduZWQgY2hhciAqc3JjOworCXVuc2lnbmVkIGludCBsZW47CiB7 Ci0JcmVnaXN0ZXIgY2hhciAqZHN0ID0gbWFsbG9jKGxlbio0ICsgMSk7CisJY2hhciAqZHN0ID0g bWFsbG9jKGxlbio0ICsgMSk7CiAKLQlpZiAoZHN0ICE9IE5VTEwpCisJaWYgKGRzdCkKIAkJbWtw cmludChkc3QsIHNyYywgbGVuKTsKIAotCXJldHVybiBkc3Q7CisJcmV0dXJuIChkc3QpOwogfQog Ci0KICNpZmRlZiBNQUlMX0RBVEUKLS8qIFNhdCwgMjcgRmViIDkzIDExOjQ0OjUxIENTVAotICog MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3CisvKiBTYXQsIDI3IEZlYiAxOTkzIDExOjQ0OjUx IC0wODAwIChDU1QpCisgKiAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3CiAg Ki8KIGNoYXIgKgogYXJwYWRhdGUoY2xvY2spCiAJdGltZV90ICpjbG9jazsKIHsKLQl0aW1lX3Qg dCA9IGNsb2NrID8qY2xvY2sgOnRpbWUoMEwpOwotCXN0cnVjdCB0bSAqdG0gPSBsb2NhbHRpbWUo JnQpOwotCXN0YXRpYyBjaGFyIHJldFszMl07CS8qIHpvbmUgbmFtZSBtaWdodCBiZSA+MyBjaGFy cyAqLwotCi0JaWYgKHRtLT50bV95ZWFyID49IDEwMCkKLQkJdG0tPnRtX3llYXIgKz0gMTkwMDsK LQotCSh2b2lkKSBzbnByaW50ZihyZXQsIHNpemVvZihyZXQpLCAiJXMsICUyZCAlcyAlZCAlMDJk OiUwMmQ6JTAyZCAlcyIsCi0JCSAgICAgICBEb3dOYW1lc1t0bS0+dG1fd2RheV0sCi0JCSAgICAg ICB0bS0+dG1fbWRheSwKLQkJICAgICAgIE1vbnRoTmFtZXNbdG0tPnRtX21vbl0sCi0JCSAgICAg ICB0bS0+dG1feWVhciwKLQkJICAgICAgIHRtLT50bV9ob3VyLAotCQkgICAgICAgdG0tPnRtX21p biwKLQkJICAgICAgIHRtLT50bV9zZWMsCisJdGltZV90IHQgPSBjbG9jayA/ICpjbG9jayA6IHRp bWUoKFRJTUVfVCkgMCk7CisJc3RydWN0IHRtIHRtID0gKmxvY2FsdGltZSgmdCk7CisJbG9uZyBn bXRvZmYgPSBnZXRfZ210b2ZmKCZ0LCAmdG0pOworCWludCBob3VycyA9IGdtdG9mZiAvIFNFQ09O RFNfUEVSX0hPVVI7CisJaW50IG1pbnV0ZXMgPSAoZ210b2ZmIC0gKGhvdXJzICogU0VDT05EU19Q RVJfSE9VUikpIC8gU0VDT05EU19QRVJfTUlOVVRFOworCXN0YXRpYyBjaGFyIHJldFs2NF07CS8q IHpvbmUgbmFtZSBtaWdodCBiZSA+MyBjaGFycyAqLworCQorCSh2b2lkKSBzcHJpbnRmKHJldCwg IiVzLCAlMmQgJXMgJTJkICUwMmQ6JTAyZDolMDJkICUuMmQlLjJkICglcykiLAorCQkgICAgICAg RG93TmFtZXNbdG0udG1fd2RheV0sCisJCSAgICAgICB0bS50bV9tZGF5LAorCQkgICAgICAgTW9u dGhOYW1lc1t0bS50bV9tb25dLAorCQkgICAgICAgdG0udG1feWVhciArIDE5MDAsCisJCSAgICAg ICB0bS50bV9ob3VyLAorCQkgICAgICAgdG0udG1fbWluLAorCQkgICAgICAgdG0udG1fc2VjLAor CQkgICAgICAgaG91cnMsCisJCSAgICAgICBtaW51dGVzLAogCQkgICAgICAgVFpPTkUoKnRtKSk7 Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gKHJldCk7CiB9CiAjZW5kaWYgLypNQUlMX0RBVEUqLwog Ci0KICNpZmRlZiBIQVZFX1NBVkVEX1VJRFMKLXN0YXRpYyBpbnQgc2F2ZV9ldWlkOwotaW50IHN3 YXBfdWlkcygpIHsgc2F2ZV9ldWlkID0gZ2V0ZXVpZCgpOyByZXR1cm4gc2V0ZXVpZChnZXR1aWQo KSk7IH0KLWludCBzd2FwX3VpZHNfYmFjaygpIHsgcmV0dXJuIHNldGV1aWQoc2F2ZV9ldWlkKTsg fQorc3RhdGljIHVpZF90IHNhdmVfZXVpZDsKK3N0YXRpYyBnaWRfdCBzYXZlX2VnaWQ7CisKK2lu dCBzd2FwX3VpZHModm9pZCkgeworCXNhdmVfZWdpZCA9IGdldGVnaWQoKTsKKwlzYXZlX2V1aWQg PSBnZXRldWlkKCk7CisJcmV0dXJuICgoc2V0ZWdpZChnZXRnaWQoKSkgfHwgc2V0ZXVpZChnZXR1 aWQoKSkpID8gLTEgOiAwKTsKK30KKworaW50IHN3YXBfdWlkc19iYWNrKHZvaWQpIHsKKwlyZXR1 cm4gKChzZXRlZ2lkKGdldGdpZCgpKSB8fCBzZXRldWlkKGdldHVpZCgpKSkgPyAtMSA6IDApOwor fQorCiAjZWxzZSAvKkhBVkVfU0FWRURfVUlEUyovCi1pbnQgc3dhcF91aWRzKCkgeyByZXR1cm4g c2V0cmV1aWQoZ2V0ZXVpZCgpLCBnZXR1aWQoKSk7IH0KLWludCBzd2FwX3VpZHNfYmFjaygpIHsg cmV0dXJuIHN3YXBfdWlkcygpOyB9CisKK2ludCBzd2FwX3VpZHModm9pZCkgeworCXJldHVybiAo KHNldHJlZ2lkKGdldGVnaWQoKSwgZ2V0Z2lkKCkpIHx8IHNldHJldWlkKGdldGV1aWQoKSwgZ2V0 dWlkKCkpKQorCSAgICA/IC0xIDogMCk7Cit9CisKK2ludCBzd2FwX3VpZHNfYmFjayh2b2lkKSB7 CisJcmV0dXJuIChzd2FwX3VpZHMoKSk7Cit9CiAjZW5kaWYgLypIQVZFX1NBVkVEX1VJRFMqLwor CitzaXplX3QKK3N0cmxlbnMoY29uc3QgY2hhciAqbGFzdCwgLi4uKSB7CisJdmFfbGlzdCBhcDsK KwlzaXplX3QgcmV0ID0gMDsKKwljb25zdCBjaGFyICpzdHI7CisKKwl2YV9zdGFydChhcCwgbGFz dCk7CisJZm9yIChzdHIgPSBsYXN0OyBzdHIgIT0gTlVMTDsgc3RyID0gdmFfYXJnKGFwLCBjb25z dCBjaGFyICopKQorCQlyZXQgKz0gc3RybGVuKHN0cik7CisJdmFfZW5kKGFwKTsKKwlyZXR1cm4g KHJldCk7Cit9CisKKy8qIFJldHVybiB0aGUgb2Zmc2V0IGZyb20gR01UIGluIHNlY29uZHMgKGFs Z29yaXRobSB0YWtlbiBmcm9tIHNlbmRtYWlsKS4KKyAqCisgKiB3YXJuaW5nOgorICoJY2xvYmJl cnMgdGhlIHN0YXRpYyBzdG9yYWdlIHNwYWNlIHVzZWQgYnkgbG9jYWx0aW1lKCkgYW5kIGdtdGlt ZSgpLgorICoJSWYgdGhlIGxvY2FsIHBvaW50ZXIgaXMgbm9uLU5VTEwgaXQgKm11c3QqIHBvaW50 IHRvIGEgbG9jYWwgY29weS4KKyAqLworI2lmbmRlZiBIQVZFX1RNX0dNVE9GRgorbG9uZyBnZXRf Z210b2ZmKHRpbWVfdCAqY2xvY2ssIHN0cnVjdCB0bSAqbG9jYWwpCit7CisJc3RydWN0IHRtIGdt dDsKKwlsb25nIG9mZnNldDsKKworCWdtdCA9ICpnbXRpbWUoY2xvY2spOworCWlmIChsb2NhbCA9 PSBOVUxMKQorCQlsb2NhbCA9IGxvY2FsdGltZShjbG9jayk7CisKKwlvZmZzZXQgPSAobG9jYWwt PnRtX3NlYyAtIGdtdC50bV9zZWMpICsKKwkgICAgKChsb2NhbC0+dG1fbWluIC0gZ210LnRtX21p bikgKiA2MCkgKworCSAgICAoKGxvY2FsLT50bV9ob3VyIC0gZ210LnRtX2hvdXIpICogMzYwMCk7 CisKKwkvKiBUaW1lem9uZSBtYXkgY2F1c2UgeWVhciByb2xsb3ZlciB0byBoYXBwZW4gb24gYSBk aWZmZXJlbnQgZGF5LiAqLworCWlmIChsb2NhbC0+dG1feWVhciA8IGdtdC50bV95ZWFyKQorCQlv ZmZzZXQgLT0gMjQgKiAzNjAwOworCWVsc2UgaWYgKGxvY2FsLT50bV95ZWFyID4gZ210LnRtX3ll YXIpCisJCW9mZnNldCAtPSAyNCAqIDM2MDA7CisJZWxzZSBpZiAobG9jYWwtPnRtX3lkYXkgPCBn bXQudG1feWRheSkKKwkJb2Zmc2V0IC09IDI0ICogMzYwMDsKKwllbHNlIGlmIChsb2NhbC0+dG1f eWRheSA+IGdtdC50bV95ZGF5KQorCQlvZmZzZXQgKz0gMjQgKiAzNjAwOworCisJcmV0dXJuIChv ZmZzZXQpOworfQorI2VuZGlmIC8qIEhBVkVfVE1fR01UT0ZGICovCisKK2ludAorb3Blbl9zb2Nr ZXQodm9pZCkKK3sKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgIHNvY2s7CisgICAgICAgIG1v ZGVfdCAgICAgICAgICAgICBvbWFzazsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX3VuIHNfdW47 CisKKyAgICAgICAgc29jayA9IHNvY2tldChQRl9MT0NBTCwgU09DS19TVFJFQU0sIDApOworICAg ICAgICBpZiAoc29jayA9PSAtMSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAi JXM6IGNhbid0IGNyZWF0ZSBzb2NrZXQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBQcm9n cmFtTmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBleGl0KEVYSVRfRkFJ TFVSRSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZjbnRsKHNvY2ssIEZfU0VURkQsIEZEX0NM T0VYRUMpID09IC0xKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2Fu J3QgbWFrZSBzb2NrZXQgY2xvc2Ugb24gZXhlYzogJXNcbiIsCisgICAgICAgICAgICAgICAgICAg IFByb2dyYW1OYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgIGV4aXQoRVhJ VF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmNudGwoc29jaywgRl9TRVRGTCwg T19OT05CTE9DSykgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVz OiBjYW4ndCBtYWtlIHNvY2tldCBub24tYmxvY2tpbmc6ICVzXG4iLAorICAgICAgICAgICAgICAg ICAgICBQcm9ncmFtTmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBleGl0 KEVYSVRfRkFJTFVSRSk7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KCZzX3VuLCAnXDAnLCBz aXplb2Yoc191bikpOworICAgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpc25wcmludGYoc191bi5z dW5fcGF0aCwgc2l6ZW9mKHNfdW4uc3VuX3BhdGgpLCAiJXMvJXMvJXMiLAorICAgICAgICAgICAg ICBDUk9ORElSLCBTUE9PTF9ESVIsIFNPQ0tGSUxFKSA+PSBzaXplb2Yoc191bi5zdW5fcGF0aCkp IHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzLyVzOiBwYXRoIHRvbyBsb25n XG4iLCBDUk9ORElSLCBTT0NLRklMRSk7CisgICAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxV UkUpOworICAgICAgICB9CisgICAgICAgIHVubGluayhzX3VuLnN1bl9wYXRoKTsKKyAgICAgICAg c191bi5zdW5fZmFtaWx5ID0gUEZfTE9DQUw7CisjaWZkZWYgU1VOX0xFTgorICAgICAgICBzX3Vu LnN1bl9sZW4gPSBTVU5fTEVOKCZzX3VuKTsKKyNlbmRpZgorCisgICAgICAgIG9tYXNrID0gdW1h c2soMDA3KTsKKyAgICAgICAgaWYgKGJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzX3Vu LCBzaXplb2Yoc191bikpKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczog Y2FuJ3QgYmluZCBzb2NrZXQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBQcm9ncmFtTmFt ZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICB1bWFzayhvbWFzayk7CisgICAg ICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgICAgIHVtYXNr KG9tYXNrKTsKKyAgICAgICAgaWYgKGxpc3Rlbihzb2NrLCBTT01BWENPTk4pKSB7CisgICAgICAg ICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3QgbGlzdGVuIG9uIHNvY2tldDogJXNc biIsCisgICAgICAgICAgICAgICAgICAgIFByb2dyYW1OYW1lLCBzdHJlcnJvcihlcnJubykpOwor ICAgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgICAgICBj aG1vZChzX3VuLnN1bl9wYXRoLCAwNjYwKTsKKworICAgICAgICByZXR1cm4oc29jayk7Cit9CisK --089e0111c08a47d11f04fb9e10f8 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org" --089e0111c08a47d11f04fb9e10f8--
因文章內容過長,因此無法取得中間部份內容。您可以登入 https://term.ptt.cc/ 查看完整內容。
文章代碼(AID): #1JcUhV-0 (FB_hackers)
討論串 (同標題文章)
文章代碼(AID): #1JcUhV-0 (FB_hackers)