LyogdjNfcGNpLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KLyogQ29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgUHJvamVjdCAyMDA0CiAqIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykKICovCi8qIENvcHlyaWdodCAoYykgMjAwNCBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqCiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwogKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQogKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSAiY3J5cHRsaWIuaCIKI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgojaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KCnN0YXRpYyBpbnQgaTJyX3BjaShYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OICpleHQsCglCSU8gKm91dCwgaW50IGluZGVudCk7CnN0YXRpYyBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OICpyMmlfcGNpKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCglYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnN0cik7Cgpjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19wY2kgPQoJeyBOSURfcHJveHlDZXJ0SW5mbywgMCwgQVNOMV9JVEVNX3JlZihQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OKSwKCSAgMCwwLDAsMCwKCSAgMCwwLAoJICBOVUxMLCBOVUxMLAoJICAoWDUwOVYzX0VYVF9JMlIpaTJyX3BjaSwKCSAgKFg1MDlWM19FWFRfUjJJKXIyaV9wY2ksCgkgIE5VTEwsCgl9OwoKc3RhdGljIGludCBpMnJfcGNpKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT04gKnBjaSwKCUJJTyAqb3V0LCBpbnQgaW5kZW50KQoJewoJQklPX3ByaW50ZihvdXQsICIlKnNQYXRoIExlbmd0aCBDb25zdHJhaW50OiAiLCBpbmRlbnQsICIiKTsKCWlmIChwY2ktPnBjUGF0aExlbmd0aENvbnN0cmFpbnQpCgkgIGkyYV9BU04xX0lOVEVHRVIob3V0LCBwY2ktPnBjUGF0aExlbmd0aENvbnN0cmFpbnQpOwoJZWxzZQoJICBCSU9fcHJpbnRmKG91dCwgImluZmluaXRlIik7CglCSU9fcHV0cyhvdXQsICJcbiIpOwoJQklPX3ByaW50ZihvdXQsICIlKnNQb2xpY3kgTGFuZ3VhZ2U6ICIsIGluZGVudCwgIiIpOwoJaTJhX0FTTjFfT0JKRUNUKG91dCwgcGNpLT5wcm94eVBvbGljeS0+cG9saWN5TGFuZ3VhZ2UpOwoJQklPX3B1dHMob3V0LCAiXG4iKTsKCWlmIChwY2ktPnByb3h5UG9saWN5LT5wb2xpY3kgJiYgcGNpLT5wcm94eVBvbGljeS0+cG9saWN5LT5kYXRhKQoJICBCSU9fcHJpbnRmKG91dCwgIiUqc1BvbGljeSBUZXh0OiAlc1xuIiwgaW5kZW50LCAiIiwKCQkgICAgIHBjaS0+cHJveHlQb2xpY3ktPnBvbGljeS0+ZGF0YSk7CglyZXR1cm4gMTsKCX0KCnN0YXRpYyBpbnQgcHJvY2Vzc19wY2lfdmFsdWUoQ09ORl9WQUxVRSAqdmFsLAoJQVNOMV9PQkpFQ1QgKipsYW5ndWFnZSwgQVNOMV9JTlRFR0VSICoqcGF0aGxlbiwKCUFTTjFfT0NURVRfU1RSSU5HICoqcG9saWN5KQoJewoJaW50IGZyZWVfcG9saWN5ID0gMDsKCglpZiAoc3RyY21wKHZhbC0+bmFtZSwgImxhbmd1YWdlIikgPT0gMCkKCQl7CgkJaWYgKCpsYW5ndWFnZSkKCQkJewoJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsWDUwOVYzX1JfUE9MSUNZX0xBTkdVQUdFX0FMUkVBRFlfREVGSU5FRCk7CgkJCVg1MDlWM19jb25mX2Vycih2YWwpOwoJCQlyZXR1cm4gMDsKCQkJfQoJCWlmICghKCpsYW5ndWFnZSA9IE9CSl90eHQyb2JqKHZhbC0+dmFsdWUsIDApKSkKCQkJewoJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsWDUwOVYzX1JfSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUik7CgkJCVg1MDlWM19jb25mX2Vycih2YWwpOwoJCQlyZXR1cm4gMDsKCQkJfQoJCX0KCWVsc2UgaWYgKHN0cmNtcCh2YWwtPm5hbWUsICJwYXRobGVuIikgPT0gMCkKCQl7CgkJaWYgKCpwYXRobGVuKQoJCQl7CgkJCVg1MDlWM2VycihYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRSxYNTA5VjNfUl9QT0xJQ1lfUEFUSF9MRU5HVEhfQUxSRUFEWV9ERUZJTkVEKTsKCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CgkJCXJldHVybiAwOwoJCQl9CgkJaWYgKCFYNTA5VjNfZ2V0X3ZhbHVlX2ludCh2YWwsIHBhdGhsZW4pKQoJCQl7CgkJCVg1MDlWM2VycihYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRSxYNTA5VjNfUl9QT0xJQ1lfUEFUSF9MRU5HVEgpOwoJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKCQkJcmV0dXJuIDA7CgkJCX0KCQl9CgllbHNlIGlmIChzdHJjbXAodmFsLT5uYW1lLCAicG9saWN5IikgPT0gMCkKCQl7CgkJdW5zaWduZWQgY2hhciAqdG1wX2RhdGEgPSBOVUxMOwoJCWxvbmcgdmFsX2xlbjsKCQlpZiAoISpwb2xpY3kpCgkJCXsKCQkJKnBvbGljeSA9IEFTTjFfT0NURVRfU1RSSU5HX25ldygpOwoJCQlpZiAoISpwb2xpY3kpCgkJCQl7CgkJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwoJCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CgkJCQlyZXR1cm4gMDsKCQkJCX0KCQkJZnJlZV9wb2xpY3kgPSAxOwoJCQl9CgkJaWYgKHN0cm5jbXAodmFsLT52YWx1ZSwgImhleDoiLCA0KSA9PSAwKQoJCQl7CgkJCXVuc2lnbmVkIGNoYXIgKnRtcF9kYXRhMiA9CgkJCQlzdHJpbmdfdG9faGV4KHZhbC0+dmFsdWUgKyA0LCAmdmFsX2xlbik7CgoJCQlpZiAoIXRtcF9kYXRhMikgCgkJCQl7CgkJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsWDUwOVYzX1JfSUxMRUdBTF9IRVhfRElHSVQpOwoJCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CgkJCQlnb3RvIGVycjsKCQkJCX0KCgkJCXRtcF9kYXRhID0gT1BFTlNTTF9yZWFsbG9jKCgqcG9saWN5KS0+ZGF0YSwKCQkJCSgqcG9saWN5KS0+bGVuZ3RoICsgdmFsX2xlbiArIDEpOwoJCQlpZiAodG1wX2RhdGEpCgkJCQl7CgkJCQkoKnBvbGljeSktPmRhdGEgPSB0bXBfZGF0YTsKCQkJCW1lbWNweSgmKCpwb2xpY3kpLT5kYXRhWygqcG9saWN5KS0+bGVuZ3RoXSwKCQkJCQl0bXBfZGF0YTIsIHZhbF9sZW4pOwoJCQkJKCpwb2xpY3kpLT5sZW5ndGggKz0gdmFsX2xlbjsKCQkJCSgqcG9saWN5KS0+ZGF0YVsoKnBvbGljeSktPmxlbmd0aF0gPSAnXDAnOwoJCQkJfQoJCQllbHNlCgkJCQl7CgkJCQlPUEVOU1NMX2ZyZWUodG1wX2RhdGEyKTsKCQkJCS8qIHJlYWxsb2MgZmFpbHVyZSBpbXBsaWVzIHRoZSBvcmlnaW5hbCBkYXRhIHNwYWNlIGlzIGIwcmtlZCB0b28hICovCgkJCQkoKnBvbGljeSktPmRhdGEgPSBOVUxMOwoJCQkJKCpwb2xpY3kpLT5sZW5ndGggPSAwOwoJCQkJWDUwOVYzZXJyKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKCQkJCVg1MDlWM19jb25mX2Vycih2YWwpOwoJCQkJZ290byBlcnI7CgkJCQl9CgkJCU9QRU5TU0xfZnJlZSh0bXBfZGF0YTIpOwoJCQl9CgkJZWxzZSBpZiAoc3RybmNtcCh2YWwtPnZhbHVlLCAiZmlsZToiLCA1KSA9PSAwKQoJCQl7CgkJCXVuc2lnbmVkIGNoYXIgYnVmWzIwNDhdOwoJCQlpbnQgbjsKCQkJQklPICpiID0gQklPX25ld19maWxlKHZhbC0+dmFsdWUgKyA1LCAiciIpOwoJCQlpZiAoIWIpCgkJCQl7CgkJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsRVJSX1JfQklPX0xJQik7CgkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKCQkJCWdvdG8gZXJyOwoJCQkJfQoJCQl3aGlsZSgobiA9IEJJT19yZWFkKGIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSA+IDAKCQkJCXx8IChuID09IDAgJiYgQklPX3Nob3VsZF9yZXRyeShiKSkpCgkJCQl7CgkJCQlpZiAoIW4pIGNvbnRpbnVlOwoKCQkJCXRtcF9kYXRhID0gT1BFTlNTTF9yZWFsbG9jKCgqcG9saWN5KS0+ZGF0YSwKCQkJCQkoKnBvbGljeSktPmxlbmd0aCArIG4gKyAxKTsKCgkJCQlpZiAoIXRtcF9kYXRhKQoJCQkJCWJyZWFrOwoKCQkJCSgqcG9saWN5KS0+ZGF0YSA9IHRtcF9kYXRhOwoJCQkJbWVtY3B5KCYoKnBvbGljeSktPmRhdGFbKCpwb2xpY3kpLT5sZW5ndGhdLAoJCQkJCWJ1Ziwgbik7CgkJCQkoKnBvbGljeSktPmxlbmd0aCArPSBuOwoJCQkJKCpwb2xpY3kpLT5kYXRhWygqcG9saWN5KS0+bGVuZ3RoXSA9ICdcMCc7CgkJCQl9CgkJCUJJT19mcmVlX2FsbChiKTsKCgkJCWlmIChuIDwgMCkKCQkJCXsKCQkJCVg1MDlWM2VycihYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRSxFUlJfUl9CSU9fTElCKTsKCQkJCVg1MDlWM19jb25mX2Vycih2YWwpOwoJCQkJZ290byBlcnI7CgkJCQl9CgkJCX0KCQllbHNlIGlmIChzdHJuY21wKHZhbC0+dmFsdWUsICJ0ZXh0OiIsIDUpID09IDApCgkJCXsKCQkJdmFsX2xlbiA9IHN0cmxlbih2YWwtPnZhbHVlICsgNSk7CgkJCXRtcF9kYXRhID0gT1BFTlNTTF9yZWFsbG9jKCgqcG9saWN5KS0+ZGF0YSwKCQkJCSgqcG9saWN5KS0+bGVuZ3RoICsgdmFsX2xlbiArIDEpOwoJCQlpZiAodG1wX2RhdGEpCgkJCQl7CgkJCQkoKnBvbGljeSktPmRhdGEgPSB0bXBfZGF0YTsKCQkJCW1lbWNweSgmKCpwb2xpY3kpLT5kYXRhWygqcG9saWN5KS0+bGVuZ3RoXSwKCQkJCQl2YWwtPnZhbHVlICsgNSwgdmFsX2xlbik7CgkJCQkoKnBvbGljeSktPmxlbmd0aCArPSB2YWxfbGVuOwoJCQkJKCpwb2xpY3kpLT5kYXRhWygqcG9saWN5KS0+bGVuZ3RoXSA9ICdcMCc7CgkJCQl9CgkJCWVsc2UKCQkJCXsKCQkJCS8qIHJlYWxsb2MgZmFpbHVyZSBpbXBsaWVzIHRoZSBvcmlnaW5hbCBkYXRhIHNwYWNlIGlzIGIwcmtlZCB0b28hICovCgkJCQkoKnBvbGljeSktPmRhdGEgPSBOVUxMOwoJCQkJKCpwb2xpY3kpLT5sZW5ndGggPSAwOwoJCQkJWDUwOVYzZXJyKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKCQkJCVg1MDlWM19jb25mX2Vycih2YWwpOwoJCQkJZ290byBlcnI7CgkJCQl9CgkJCX0KCQllbHNlCgkJCXsKCQkJWDUwOVYzZXJyKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFLFg1MDlWM19SX0lOQ09SUkVDVF9QT0xJQ1lfU1lOVEFYX1RBRyk7CgkJCVg1MDlWM19jb25mX2Vycih2YWwpOwoJCQlnb3RvIGVycjsKCQkJfQoJCWlmICghdG1wX2RhdGEpCgkJCXsKCQkJWDUwOVYzZXJyKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CgkJCWdvdG8gZXJyOwoJCQl9CgkJfQoJcmV0dXJuIDE7CmVycjoKCWlmIChmcmVlX3BvbGljeSkKCQl7CgkJQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZSgqcG9saWN5KTsKCQkqcG9saWN5ID0gTlVMTDsKCQl9CglyZXR1cm4gMDsKCX0KCnN0YXRpYyBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OICpyMmlfcGNpKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCglYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnZhbHVlKQoJewoJUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTiAqcGNpID0gTlVMTDsKCVNUQUNLX09GKENPTkZfVkFMVUUpICp2YWxzOwoJQVNOMV9PQkpFQ1QgKmxhbmd1YWdlID0gTlVMTDsKCUFTTjFfSU5URUdFUiAqcGF0aGxlbiA9IE5VTEw7CglBU04xX09DVEVUX1NUUklORyAqcG9saWN5ID0gTlVMTDsKCWludCBpLCBqOwoKCXZhbHMgPSBYNTA5VjNfcGFyc2VfbGlzdCh2YWx1ZSk7Cglmb3IgKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0odmFscyk7IGkrKykKCQl7CgkJQ09ORl9WQUxVRSAqY25mID0gc2tfQ09ORl9WQUxVRV92YWx1ZSh2YWxzLCBpKTsKCQlpZiAoIWNuZi0+bmFtZSB8fCAoKmNuZi0+bmFtZSAhPSAnQCcgJiYgIWNuZi0+dmFsdWUpKQoJCQl7CgkJCVg1MDlWM2VycihYNTA5VjNfRl9SMklfUENJLFg1MDlWM19SX0lOVkFMSURfUFJPWFlfUE9MSUNZX1NFVFRJTkcpOwoJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKCQkJZ290byBlcnI7CgkJCX0KCQlpZiAoKmNuZi0+bmFtZSA9PSAnQCcpCgkJCXsKCQkJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnNlY3Q7CgkJCWludCBzdWNjZXNzX3AgPSAxOwoKCQkJc2VjdCA9IFg1MDlWM19nZXRfc2VjdGlvbihjdHgsIGNuZi0+bmFtZSArIDEpOwoJCQlpZiAoIXNlY3QpCgkJCQl7CgkJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUjJJX1BDSSxYNTA5VjNfUl9JTlZBTElEX1NFQ1RJT04pOwoJCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CgkJCQlnb3RvIGVycjsKCQkJCX0KCQkJZm9yIChqID0gMDsgc3VjY2Vzc19wICYmIGogPCBza19DT05GX1ZBTFVFX251bShzZWN0KTsgaisrKQoJCQkJewoJCQkJc3VjY2Vzc19wID0KCQkJCQlwcm9jZXNzX3BjaV92YWx1ZShza19DT05GX1ZBTFVFX3ZhbHVlKHNlY3QsIGopLAoJCQkJCQkmbGFuZ3VhZ2UsICZwYXRobGVuLCAmcG9saWN5KTsKCQkJCX0KCQkJWDUwOVYzX3NlY3Rpb25fZnJlZShjdHgsIHNlY3QpOwoJCQlpZiAoIXN1Y2Nlc3NfcCkKCQkJCWdvdG8gZXJyOwoJCQl9CgkJZWxzZQoJCQl7CgkJCWlmICghcHJvY2Vzc19wY2lfdmFsdWUoY25mLAoJCQkJCSZsYW5ndWFnZSwgJnBhdGhsZW4sICZwb2xpY3kpKQoJCQkJewoJCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CgkJCQlnb3RvIGVycjsKCQkJCX0KCQkJfQoJCX0KCgkvKiBMYW5ndWFnZSBpcyBtYW5kYXRvcnkgKi8KCWlmICghbGFuZ3VhZ2UpCgkJewoJCVg1MDlWM2VycihYNTA5VjNfRl9SMklfUENJLFg1MDlWM19SX05PX1BST1hZX0NFUlRfUE9MSUNZX0xBTkdVQUdFX0RFRklORUQpOwoJCWdvdG8gZXJyOwoJCX0KCWkgPSBPQkpfb2JqMm5pZChsYW5ndWFnZSk7CglpZiAoKGkgPT0gTklEX0luZGVwZW5kZW50IHx8IGkgPT0gTklEX2lkX3BwbF9pbmhlcml0QWxsKSAmJiBwb2xpY3kpCgkJewoJCVg1MDlWM2VycihYNTA5VjNfRl9SMklfUENJLFg1MDlWM19SX1BPTElDWV9XSEVOX1BST1hZX0xBTkdVQUdFX1JFUVVJUkVTX05PX1BPTElDWSk7CgkJZ290byBlcnI7CgkJfQoKCXBjaSA9IFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT05fbmV3KCk7CglpZiAoIXBjaSkKCQl7CgkJWDUwOVYzZXJyKFg1MDlWM19GX1IySV9QQ0ksRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwoJCWdvdG8gZXJyOwoJCX0KCglwY2ktPnByb3h5UG9saWN5LT5wb2xpY3lMYW5ndWFnZSA9IGxhbmd1YWdlOyBsYW5ndWFnZSA9IE5VTEw7CglwY2ktPnByb3h5UG9saWN5LT5wb2xpY3kgPSBwb2xpY3k7IHBvbGljeSA9IE5VTEw7CglwY2ktPnBjUGF0aExlbmd0aENvbnN0cmFpbnQgPSBwYXRobGVuOyBwYXRobGVuID0gTlVMTDsKCWdvdG8gZW5kOwplcnI6CglpZiAobGFuZ3VhZ2UpIHsgQVNOMV9PQkpFQ1RfZnJlZShsYW5ndWFnZSk7IGxhbmd1YWdlID0gTlVMTDsgfQoJaWYgKHBhdGhsZW4pIHsgQVNOMV9JTlRFR0VSX2ZyZWUocGF0aGxlbik7IHBhdGhsZW4gPSBOVUxMOyB9CglpZiAocG9saWN5KSB7IEFTTjFfT0NURVRfU1RSSU5HX2ZyZWUocG9saWN5KTsgcG9saWN5ID0gTlVMTDsgfQoJaWYgKHBjaSkgeyBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OX2ZyZWUocGNpKTsgcGNpID0gTlVMTDsgfQplbmQ6Cglza19DT05GX1ZBTFVFX3BvcF9mcmVlKHZhbHMsIFg1MDlWM19jb25mX2ZyZWUpOwoJcmV0dXJuIHBjaTsKCX0K