Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIE1pbmkgaW5zbW9kIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CiAqCiAqIFRoaXMgdmVyc2lvbiBvZiBpbnNtb2Qgc3VwcG9ydHMgeDg2LCBBUk0sIFNIMy80LzUsIHBvd2VycGMsIG02OGssCiAqIE1JUFMsIGFuZCB2ODUwZS4KICoKICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgogKiBhbmQgUm9uIEFsZGVyIDxhbGRlckBsaW5lby5jb20+CiAqCiAqIE1pbGVzIEJhZGVyIDxtaWxlc0BnbnUub3JnPiBhZGRlZCBORUMgVjg1MEUgc3VwcG9ydC4KICoKICogTW9kaWZpZWQgYnkgQnJ5YW4gUml0dG1leWVyIDxicnlhbkBpeGlhY29tLmNvbT4gdG8gc3VwcG9ydCBTSDQKICogYW5kICh0aGVvcmV0aWNhbGx5KSBTSDMuIEkgaGF2ZSBvbmx5IHRlc3RlZCBTSDQgaW4gbGl0dGxlIGVuZGlhbiBtb2RlLgogKgogKiBNb2RpZmllZCBieSBBbGNvdmUsIEp1bGllbiBHYXVsbWluIDxqdWxpZW4uZ2F1bG1pbkBhbGNvdmUuZnI+IGFuZAogKiBOaWNvbGFzIEZlcnJlIDxuaWNvbGFzLmZlcnJlQGFsY292ZS5mcj4gdG8gc3VwcG9ydCBBUk03VERNSS4gIE9ubHkKICogdmVyeSBtaW5vciBjaGFuZ2VzIHJlcXVpcmVkIHRvIGFsc28gd29yayB3aXRoIFN0cm9uZ0FybSBhbmQgcHJlc3VtYWJseQogKiBhbGwgQVJNIGJhc2VkIHN5c3RlbXMuCiAqCiAqIFBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+IDA4LUF1Zy0yMDAzLgogKiAgIEludGVncmF0ZWQgc3VwcG9ydCBmb3Igc2g2NCAoU0gtNSksIGZyb20gcHJlbGltaW5hcnkgbW9kdXRpbHMKICogICBwYXRjaGVzIGZyb20gQmVuZWRpY3QgR2FzdGVyIDxiZW5lZGljdC5nYXN0ZXJAc3VwZXJoLmNvbT4uCiAqICAgQ3VycmVudGx5IGxpbWl0ZWQgdG8gc3VwcG9ydCBmb3IgMzJiaXQgQUJJLgogKgogKiBNYWdudXMgRGFtbSA8ZGFtbUBvcGVuc291cmNlLnNlPiAyMi1NYXktMjAwMi4KICogICBUaGUgcGx0IGFuZCBnb3QgY29kZSBhcmUgbm93IHVzaW5nIHRoZSBzYW1lIHN0cnVjdHMuCiAqICAgQWRkZWQgZ2VuZXJpYyBsaW5rZWQgbGlzdCBjb2RlIHRvIGZ1bGx5IHN1cHBvcnQgUG93ZXJQQy4KICogICBSZXBsYWNlZCB0aGUgbWVzcyBpbiBhcmNoX2FwcGx5X3JlbG9jYXRpb24oKSB3aXRoIGFyY2hpdGVjdHVyZSBibG9ja3MuCiAqICAgVGhlIGFyY2hfY3JlYXRlX2dvdCgpIGZ1bmN0aW9uIGdvdCBjbGVhbmVkIHVwIHdpdGggYXJjaGl0ZWN0dXJlIGJsb2Nrcy4KICogICBUaGVzZSBibG9ja3Mgc2hvdWxkIGJlIGVhc3kgbWFpbnRhaW4gYW5kIHN5bmMgd2l0aCBvYmpfeHh4LmMgaW4gbW9kdXRpbHMuCiAqCiAqIE1hZ251cyBEYW1tIDxkYW1tQG9wZW5zb3VyY2Uuc2U+IGFkZGVkIFBvd2VyUEMgc3VwcG9ydCAyMC1GZWItMjAwMS4KICogICBQb3dlclBDIHNwZWNpZmljIGNvZGUgc3RvbGVuIGZyb20gbW9kdXRpbHMtMi4zLjE2LAogKiAgIHdyaXR0ZW4gYnkgUGF1bCBNYWNrZXJyYXMsIENvcHlyaWdodCAxOTk2LCAxOTk3IExpbnV4IEludGVybmF0aW9uYWwuCiAqICAgSSd2ZSBvbmx5IHRlc3RlZCB0aGUgY29kZSBvbiBtcGM4eHggcGxhdGZvcm1zIGluIGJpZy1lbmRpYW4gbW9kZS4KICogICBEaWQgc29tZSBjbGVhbnVwIGFuZCBhZGRlZCBDT05GSUdfVVNFX3h4eF9FTlRSSUVTLi4uCiAqCiAqIFF1aW5uIEplbnNlbiA8amVuc2VucUBsaW5lby5jb20+IGFkZGVkIE1JUFMgc3VwcG9ydCAyMy1GZWItMjAwMS4KICogICBiYXNlZCBvbiBtb2R1dGlscy0yLjQuMgogKiAgIE1JUFMgc3BlY2lmaWMgc3VwcG9ydCBmb3IgRWxmIGxvYWRpbmcgYW5kIHJlbG9jYXRpb24uCiAqICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgTGludXggSW50ZXJuYXRpb25hbC4KICogICBDb250cmlidXRlZCBieSBSYWxmIEJhZWNobGUgPHJhbGZAZ251LmFpLm1pdC5lZHU+CiAqCiAqIEJhc2VkIGFsbW9zdCBlbnRpcmVseSBvbiB0aGUgTGludXggbW9kdXRpbHMtMi4zLjExIGltcGxlbWVudGF0aW9uLgogKiAgIENvcHlyaWdodCAxOTk2LCAxOTk3IExpbnV4IEludGVybmF0aW9uYWwuCiAqICAgTmV3IGltcGxlbWVudGF0aW9uIGNvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+CiAqICAgQmFzZWQgb24gb3JpZ2luYWwgd29yayBieSBCam9ybiBFa3dhbGwgPGJqMHJuQGJsb3guc2U+CiAqICAgUmVzdHJ1Y3R1cmVkIChhbmQgcGFydGx5IHJld3JpdHRlbikgYnk6CiAqICAgQmr2cm4gRWt3YWxsIDxiajBybkBibG94LnNlPiBGZWJydWFyeSAxOTk5CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICoKICovCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkZGVmLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxkaXJlbnQuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Z2V0b3B0Lmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KI2luY2x1ZGUgImJ1c3lib3guaCIKCiNpZiAhZGVmaW5lZChDT05GSUdfRkVBVFVSRV8yXzRfTU9EVUxFUykgJiYgXAoJIWRlZmluZWQoQ09ORklHX0ZFQVRVUkVfMl8yX01PRFVMRVMpICYmIFwKCSFkZWZpbmVkKENPTkZJR19GRUFUVVJFXzJfNl9NT0RVTEVTKQojZGVmaW5lIENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTCiNlbmRpZgoKI2lmICFkZWZpbmVkKENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTKSAmJiAhZGVmaW5lZChDT05GSUdfRkVBVFVSRV8yXzJfTU9EVUxFUykKI2RlZmluZSBpbnNtb2RfbmdfbWFpbiBpbnNtb2RfbWFpbgojZW5kaWYKCiNpZiBkZWZpbmVkKENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTKSB8fCBkZWZpbmVkKENPTkZJR19GRUFUVVJFXzJfMl9NT0RVTEVTKQoKI2lmIGRlZmluZWQoQ09ORklHX0ZFQVRVUkVfMl82X01PRFVMRVMpCmV4dGVybiBpbnQgaW5zbW9kX25nX21haW4oIGludCBhcmdjLCBjaGFyICoqYXJndik7CiNlbmRpZgoKI2lmZGVmIENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTCiMgdW5kZWYgQ09ORklHX0ZFQVRVUkVfMl8yX01PRFVMRVMKIyBkZWZpbmUgbmV3X3N5c19pbml0X21vZHVsZQlpbml0X21vZHVsZQojZWxzZQojIGRlZmluZSBvbGRfc3lzX2luaXRfbW9kdWxlCWluaXRfbW9kdWxlCiNlbmRpZgoKI2lmZGVmIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FESU5LTUVNCiNkZWZpbmUgTE9BREJJVFMgMAojZWxzZQojZGVmaW5lIExPQURCSVRTIDEKI2VuZGlmCgoKI2lmIGRlZmluZWQoX19hcm1fXykKI2RlZmluZSBDT05GSUdfVVNFX1BMVF9FTlRSSUVTCiNkZWZpbmUgQ09ORklHX1BMVF9FTlRSWV9TSVpFIDgKI2RlZmluZSBDT05GSUdfVVNFX0dPVF9FTlRSSUVTCiNkZWZpbmUgQ09ORklHX0dPVF9FTlRSWV9TSVpFIDgKI2RlZmluZSBDT05GSUdfVVNFX1NJTkdMRQoKI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX0FSTSkKI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMCiNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWwKI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgojZW5kaWYKCiNpZiBkZWZpbmVkKF9fczM5MF9fKQojZGVmaW5lIENPTkZJR19VU0VfUExUX0VOVFJJRVMKI2RlZmluZSBDT05GSUdfUExUX0VOVFJZX1NJWkUgOAojZGVmaW5lIENPTkZJR19VU0VfR09UX0VOVFJJRVMKI2RlZmluZSBDT05GSUdfR09UX0VOVFJZX1NJWkUgOAojZGVmaW5lIENPTkZJR19VU0VfU0lOR0xFCgojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fUzM5MCkKI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMQQojZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsYQojZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCiNlbmRpZgoKI2lmIGRlZmluZWQoX19pMzg2X18pCiNkZWZpbmUgQ09ORklHX1VTRV9HT1RfRU5UUklFUwojZGVmaW5lIENPTkZJR19HT1RfRU5UUllfU0laRSA0CiNkZWZpbmUgQ09ORklHX1VTRV9TSU5HTEUKCiNpZm5kZWYgRU1fNDg2CiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV8zODYpCiNlbHNlCiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV8zODYgfHwgeCA9PSBFTV80ODYpCiNlbmRpZgoKI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMCiNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWwKI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgojZW5kaWYKCiNpZiBkZWZpbmVkKF9fbWM2ODAwMF9fKQojZGVmaW5lIENPTkZJR19VU0VfR09UX0VOVFJJRVMKI2RlZmluZSBDT05GSUdfR09UX0VOVFJZX1NJWkUgNAojZGVmaW5lIENPTkZJR19VU0VfU0lOR0xFCgojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fNjhLKQojZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCiNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCiNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKI2VuZGlmCgojaWYgZGVmaW5lZChfX21pcHNfXykKLyogQWNjb3VudCBmb3IgRUxGIHNwZWMgY2hhbmdlcy4gICovCiNpZm5kZWYgRU1fTUlQU19SUzNfTEUKI2lmZGVmIEVNX01JUFNfUlM0X0JFCiNkZWZpbmUgRU1fTUlQU19SUzNfTEUJRU1fTUlQU19SUzRfQkUKI2Vsc2UKI2RlZmluZSBFTV9NSVBTX1JTM19MRQkxMAojZW5kaWYKI2VuZGlmIC8qICFFTV9NSVBTX1JTM19MRSAqLwoKI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX01JUFMgfHwgeCA9PSBFTV9NSVBTX1JTM19MRSkKI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMCiNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWwKI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgojZGVmaW5lIEFSQ0hEQVRBTSAgICAgICAiX19kYmVfdGFibGUiCiNlbmRpZgoKI2lmIGRlZmluZWQoX19wb3dlcnBjX18pCiNkZWZpbmUgQ09ORklHX1VTRV9QTFRfRU5UUklFUwojZGVmaW5lIENPTkZJR19QTFRfRU5UUllfU0laRSAxNgojZGVmaW5lIENPTkZJR19VU0VfUExUX0xJU1QKI2RlZmluZSBDT05GSUdfTElTVF9BUkNIVFlQRSBFbGZXKEFkZHIpCiNkZWZpbmUgQ09ORklHX1VTRV9MSVNUCgojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fUFBDKQojZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCiNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCiNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKI2RlZmluZSBBUkNIREFUQU0gICAgICAgIl9fZnRyX2ZpeHVwIgojZW5kaWYKCiNpZiBkZWZpbmVkKF9fc2hfXykKI2RlZmluZSBDT05GSUdfVVNFX0dPVF9FTlRSSUVTCiNkZWZpbmUgQ09ORklHX0dPVF9FTlRSWV9TSVpFIDQKI2RlZmluZSBDT05GSUdfVVNFX1NJTkdMRQoKI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX1NIKQojZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCiNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCiNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKCi8qIHRoZSBTSCBjaGFuZ2VzIGhhdmUgb25seSBiZWVuIHRlc3RlZCBpbiA9bGl0dGxlIGVuZGlhbj0gbW9kZSAqLwovKiBJJ20gbm90IHN1cmUgYWJvdXQgYmlnIGVuZGlhbiwgc28gbGV0J3Mgd2FybjogKi8KCiNpZiBkZWZpbmVkKF9fc2hfXykgJiYgZGVmaW5lZChfX0JJR19FTkRJQU5fXykKI2Vycm9yIGluc21vZC5jIG1heSByZXF1aXJlIGNoYW5nZXMgZm9yIHVzZSBvbiBiaWcgZW5kaWFuIFNICiNlbmRpZgoKLyogaXQgbWF5IG9yIG1heSBub3Qgd29yayBvbiB0aGUgU0gxL1NIMi4uLiBTbyBsZXQncyBlcnJvciBvbiB0aG9zZQogICBhbHNvICovCiNpZiAoKCEoZGVmaW5lZChfX1NIM19fKSB8fCBkZWZpbmVkKF9fU0g0X18pIHx8IGRlZmluZWQoX19TSDVfXykpKSkgJiYgXAoJKGRlZmluZWQoX19zaF9fKSkKI2Vycm9yIGluc21vZC5jIG1heSByZXF1aXJlIGNoYW5nZXMgZm9yIFNIMSBvciBTSDIgdXNlCiNlbmRpZgojZW5kaWYKCiNpZiBkZWZpbmVkIChfX3Y4NTBlX18pCiNkZWZpbmUgQ09ORklHX1VTRV9QTFRfRU5UUklFUwojZGVmaW5lIENPTkZJR19QTFRfRU5UUllfU0laRSA4CiNkZWZpbmUgQ09ORklHX1VTRV9TSU5HTEUKCiNpZm5kZWYgRU1fQ1lHTlVTX1Y4NTAJLyogZ3J1bWJsZSAqLwojZGVmaW5lIEVNX0NZR05VU19WODUwIAkweDkwODAKI2VuZGlmCgojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKCh4KSA9PSBFTV9WODUwIHx8ICh4KSA9PSBFTV9DWUdOVVNfVjg1MCkKI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMQQojZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsYQojZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCgojZGVmaW5lIFNZTUJPTF9QUkVGSVgJIl8iCiNlbmRpZgoKI2lmIGRlZmluZWQoX19jcmlzX18pCiNpZm5kZWYgRU1fQ1JJUwojZGVmaW5lIEVNX0NSSVMgNzYKI2RlZmluZSBSX0NSSVNfTk9ORSAwCiNkZWZpbmUgUl9DUklTXzMyICAgMwojZW5kaWYKCiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9DUklTKQojZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCiNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCiNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKI2VuZGlmCgojaWZuZGVmIFNIVF9SRUxNCiNlcnJvciBTb3JyeSwgYnV0IGluc21vZC5jIGRvZXMgbm90IHlldCBzdXBwb3J0IHRoaXMgYXJjaGl0ZWN0dXJlLi4uCiNlbmRpZgoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy0tLS0tLS0tbW9kdXRpbHMgbW9kdWxlLmgsIGxpbmVzIDQ1LTI0MgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8qIERlZmluaXRpb25zIGZvciB0aGUgTGludXggbW9kdWxlIHN5c2NhbGwgaW50ZXJmYWNlLgogICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBMaW51eCBJbnRlcm5hdGlvbmFsLgoKICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4KCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBtb2R1dGlscy4KCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCiAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CiAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCgoKI2lmbmRlZiBNT0RVVElMU19NT0RVTEVfSApzdGF0aWMgY29uc3QgaW50IE1PRFVUSUxTX01PRFVMRV9IID0gMTsKCiNpZGVudCAiJElkOiBpbnNtb2QuYyx2IDEuMTE2IDIwMDQvMDQvMDYgMTE6NTY6MjYgYW5kZXJzZW4gRXhwICQiCgovKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUgMi4wIGFuZCAyLjEga2VybmVscy4KICAgV2UgZG8gbm90IHVzZSB0aGUga2VybmVsIGhlYWRlcnMgZGlyZWN0bHkgYmVjYXVzZSB3ZSBkbyBub3Qgd2lzaAogICB0byBiZSBkZXBlbmRhbnQgb24gYSBwYXJ0aWN1bGFyIGtlcm5lbCB2ZXJzaW9uIHRvIGNvbXBpbGUgaW5zbW9kLiAgKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKiBUaGUgc3RydWN0dXJlcyB1c2VkIGJ5IExpbnV4IDIuMC4gICovCgovKiBUaGUgc3ltYm9sIGZvcm1hdCB1c2VkIGJ5IGdldF9rZXJuZWxfc3ltcygyKS4gICovCnN0cnVjdCBvbGRfa2VybmVsX3N5bQp7Cgl1bnNpZ25lZCBsb25nIHZhbHVlOwoJY2hhciBuYW1lWzYwXTsKfTsKCnN0cnVjdCBvbGRfbW9kdWxlX3JlZgp7Cgl1bnNpZ25lZCBsb25nIG1vZHVsZTsJCS8qIGtlcm5lbCBhZGRyZXNzZXMgKi8KCXVuc2lnbmVkIGxvbmcgbmV4dDsKfTsKCnN0cnVjdCBvbGRfbW9kdWxlX3N5bWJvbAp7Cgl1bnNpZ25lZCBsb25nIGFkZHI7Cgl1bnNpZ25lZCBsb25nIG5hbWU7Cn07CgpzdHJ1Y3Qgb2xkX3N5bWJvbF90YWJsZQp7CglpbnQgc2l6ZTsJCQkvKiB0b3RhbCwgaW5jbHVkaW5nIHN0cmluZyB0YWJsZSEhISAqLwoJaW50IG5fc3ltYm9sczsKCWludCBuX3JlZnM7CglzdHJ1Y3Qgb2xkX21vZHVsZV9zeW1ib2wgc3ltYm9sWzBdOyAvKiBhY3R1YWwgc2l6ZSBkZWZpbmVkIGJ5IG5fc3ltYm9scyAqLwoJc3RydWN0IG9sZF9tb2R1bGVfcmVmIHJlZlswXTsJLyogYWN0dWFsIHNpemUgZGVmaW5lZCBieSBuX3JlZnMgKi8KfTsKCnN0cnVjdCBvbGRfbW9kX3JvdXRpbmVzCnsKCXVuc2lnbmVkIGxvbmcgaW5pdDsKCXVuc2lnbmVkIGxvbmcgY2xlYW51cDsKfTsKCnN0cnVjdCBvbGRfbW9kdWxlCnsKCXVuc2lnbmVkIGxvbmcgbmV4dDsKCXVuc2lnbmVkIGxvbmcgcmVmOwkJLyogdGhlIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IHJlZmVyIHRvIG1lICovCgl1bnNpZ25lZCBsb25nIHN5bXRhYjsKCXVuc2lnbmVkIGxvbmcgbmFtZTsKCWludCBzaXplOwkJCS8qIHNpemUgb2YgbW9kdWxlIGluIHBhZ2VzICovCgl1bnNpZ25lZCBsb25nIGFkZHI7CQkvKiBhZGRyZXNzIG9mIG1vZHVsZSAqLwoJaW50IHN0YXRlOwoJdW5zaWduZWQgbG9uZyBjbGVhbnVwOwkvKiBjbGVhbnVwIHJvdXRpbmUgKi8KfTsKCi8qIFNlbnQgdG8gaW5pdF9tb2R1bGUoMikgb3InZWQgaW50byB0aGUgY29kZSBzaXplIHBhcmFtZXRlci4gICovCnN0YXRpYyBjb25zdCBpbnQgT0xEX01PRF9BVVRPQ0xFQU4gPSAweDQwMDAwMDAwOyAvKiBiaWcgZW5vdWdoLCBidXQgbm8gc2lnbiBwcm9ibGVtcy4uLiAqLwoKaW50IGdldF9rZXJuZWxfc3ltcyhzdHJ1Y3Qgb2xkX2tlcm5lbF9zeW0gKik7CmludCBvbGRfc3lzX2luaXRfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmNvZGUsIHVuc2lnbmVkIGNvZGVzaXplLAoJCQlzdHJ1Y3Qgb2xkX21vZF9yb3V0aW5lcyAqLCBzdHJ1Y3Qgb2xkX3N5bWJvbF90YWJsZSAqKTsKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8qIEZvciBzaXplb2YoKSB3aGljaCBhcmUgcmVsYXRlZCB0byB0aGUgbW9kdWxlIHBsYXRmb3JtIGFuZCBub3QgdG8gdGhlCiAgIGVudmlyb25tZW50IGlzbm1vZCBpcyBydW5uaW5nIGluLCB1c2Ugc2l6ZW9mX3h4IGluc3RlYWQgb2Ygc2l6ZW9mKHh4KS4gICovCgojZGVmaW5lIHRndF9zaXplb2ZfY2hhcgkJc2l6ZW9mKGNoYXIpCiNkZWZpbmUgdGd0X3NpemVvZl9zaG9ydAlzaXplb2Yoc2hvcnQpCiNkZWZpbmUgdGd0X3NpemVvZl9pbnQJCXNpemVvZihpbnQpCiNkZWZpbmUgdGd0X3NpemVvZl9sb25nCQlzaXplb2YobG9uZykKI2RlZmluZSB0Z3Rfc2l6ZW9mX2NoYXJfcAlzaXplb2YoY2hhciAqKQojZGVmaW5lIHRndF9zaXplb2Zfdm9pZF9wCXNpemVvZih2b2lkICopCiNkZWZpbmUgdGd0X2xvbmcJCWxvbmcKCiNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgIWRlZmluZWQoX19zcGFyY192OV9fKSAmJiBkZWZpbmVkKEFSQ0hfc3BhcmM2NCkKI3VuZGVmIHRndF9zaXplb2ZfbG9uZwojdW5kZWYgdGd0X3NpemVvZl9jaGFyX3AKI3VuZGVmIHRndF9zaXplb2Zfdm9pZF9wCiN1bmRlZiB0Z3RfbG9uZwpzdGF0aWMgY29uc3QgaW50IHRndF9zaXplb2ZfbG9uZyA9IDg7CnN0YXRpYyBjb25zdCBpbnQgdGd0X3NpemVvZl9jaGFyX3AgPSA4OwpzdGF0aWMgY29uc3QgaW50IHRndF9zaXplb2Zfdm9pZF9wID0gODsKI2RlZmluZSB0Z3RfbG9uZwkJbG9uZyBsb25nCiNlbmRpZgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLyogVGhlIHN0cnVjdHVyZXMgdXNlZCBpbiBMaW51eCAyLjEuICAqLwoKLyogTm90ZTogbmV3X21vZHVsZV9zeW1ib2wgZG9lcyBub3QgdXNlIHRndF9sb25nIGludGVudGlvbmFsbHkgKi8Kc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sCnsKCXVuc2lnbmVkIGxvbmcgdmFsdWU7Cgl1bnNpZ25lZCBsb25nIG5hbWU7Cn07CgpzdHJ1Y3QgbmV3X21vZHVsZV9wZXJzaXN0OwoKc3RydWN0IG5ld19tb2R1bGVfcmVmCnsKCXVuc2lnbmVkIHRndF9sb25nIGRlcDsJCS8qIGtlcm5lbCBhZGRyZXNzZXMgKi8KCXVuc2lnbmVkIHRndF9sb25nIHJlZjsKCXVuc2lnbmVkIHRndF9sb25nIG5leHRfcmVmOwp9OwoKc3RydWN0IG5ld19tb2R1bGUKewoJdW5zaWduZWQgdGd0X2xvbmcgc2l6ZV9vZl9zdHJ1Y3Q7CS8qID09IHNpemVvZihtb2R1bGUpICovCgl1bnNpZ25lZCB0Z3RfbG9uZyBuZXh0OwoJdW5zaWduZWQgdGd0X2xvbmcgbmFtZTsKCXVuc2lnbmVkIHRndF9sb25nIHNpemU7CgoJdGd0X2xvbmcgdXNlY291bnQ7Cgl1bnNpZ25lZCB0Z3RfbG9uZyBmbGFnczsJCS8qIEFVVE9DTEVBTiBldCBhbCAqLwoKCXVuc2lnbmVkIG5zeW1zOwoJdW5zaWduZWQgbmRlcHM7CgoJdW5zaWduZWQgdGd0X2xvbmcgc3ltczsKCXVuc2lnbmVkIHRndF9sb25nIGRlcHM7Cgl1bnNpZ25lZCB0Z3RfbG9uZyByZWZzOwoJdW5zaWduZWQgdGd0X2xvbmcgaW5pdDsKCXVuc2lnbmVkIHRndF9sb25nIGNsZWFudXA7Cgl1bnNpZ25lZCB0Z3RfbG9uZyBleF90YWJsZV9zdGFydDsKCXVuc2lnbmVkIHRndF9sb25nIGV4X3RhYmxlX2VuZDsKI2lmZGVmIF9fYWxwaGFfXwoJdW5zaWduZWQgdGd0X2xvbmcgZ3A7CiNlbmRpZgoJLyogRXZlcnl0aGluZyBhZnRlciBoZXJlIGlzIGV4dGVuc2lvbi4gICovCgl1bnNpZ25lZCB0Z3RfbG9uZyBwZXJzaXN0X3N0YXJ0OwoJdW5zaWduZWQgdGd0X2xvbmcgcGVyc2lzdF9lbmQ7Cgl1bnNpZ25lZCB0Z3RfbG9uZyBjYW5fdW5sb2FkOwoJdW5zaWduZWQgdGd0X2xvbmcgcnVuc2l6ZTsKI2lmZGVmIENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTCgljb25zdCBjaGFyICprYWxsc3ltc19zdGFydDsgICAgIC8qIEFsbCBzeW1ib2xzIGZvciBrZXJuZWwgZGVidWdnaW5nICovCgljb25zdCBjaGFyICprYWxsc3ltc19lbmQ7Cgljb25zdCBjaGFyICphcmNoZGF0YV9zdGFydDsgICAgIC8qIGFyY2ggc3BlY2lmaWMgZGF0YSBmb3IgbW9kdWxlICovCgljb25zdCBjaGFyICphcmNoZGF0YV9lbmQ7Cgljb25zdCBjaGFyICprZXJuZWxfZGF0YTsgICAgICAgIC8qIFJlc2VydmVkIGZvciBrZXJuZWwgaW50ZXJuYWwgdXNlICovCiNlbmRpZgp9OwoKI2lmZGVmIEFSQ0hEQVRBTQojZGVmaW5lIEFSQ0hEQVRBX1NFQ19OQU1FIEFSQ0hEQVRBTQojZWxzZQojZGVmaW5lIEFSQ0hEQVRBX1NFQ19OQU1FICJfX2FyY2hkYXRhIgojZW5kaWYKI2RlZmluZSBLQUxMU1lNU19TRUNfTkFNRSAiX19rYWxsc3ltcyIKCgpzdHJ1Y3QgbmV3X21vZHVsZV9pbmZvCnsKCXVuc2lnbmVkIGxvbmcgYWRkcjsKCXVuc2lnbmVkIGxvbmcgc2l6ZTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cglsb25nIHVzZWNvdW50Owp9OwoKLyogQml0cyBvZiBtb2R1bGUuZmxhZ3MuICAqLwpzdGF0aWMgY29uc3QgaW50IE5FV19NT0RfUlVOTklORyA9IDE7CnN0YXRpYyBjb25zdCBpbnQgTkVXX01PRF9ERUxFVEVEID0gMjsKc3RhdGljIGNvbnN0IGludCBORVdfTU9EX0FVVE9DTEVBTiA9IDQ7CnN0YXRpYyBjb25zdCBpbnQgTkVXX01PRF9WSVNJVEVEID0gODsKc3RhdGljIGNvbnN0IGludCBORVdfTU9EX1VTRURfT05DRSA9IDE2OwoKaW50IG5ld19zeXNfaW5pdF9tb2R1bGUoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3RydWN0IG5ld19tb2R1bGUgKik7CmludCBxdWVyeV9tb2R1bGUoY29uc3QgY2hhciAqbmFtZSwgaW50IHdoaWNoLCB2b2lkICpidWYsIHNpemVfdCBidWZzaXplLAoJCSBzaXplX3QgKnJldCk7CgovKiBWYWx1ZXMgZm9yIHF1ZXJ5X21vZHVsZSdzIHdoaWNoLiAgKi8KCnN0YXRpYyBjb25zdCBpbnQgUU1fTU9EVUxFUyA9IDE7CnN0YXRpYyBjb25zdCBpbnQgUU1fREVQUyA9IDI7CnN0YXRpYyBjb25zdCBpbnQgUU1fUkVGUyA9IDM7CnN0YXRpYyBjb25zdCBpbnQgUU1fU1lNQk9MUyA9IDQ7CnN0YXRpYyBjb25zdCBpbnQgUU1fSU5GTyA9IDU7CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKiBUaGUgc3lzdGVtIGNhbGxzIHVuY2hhbmdlZCBiZXR3ZWVuIDIuMCBhbmQgMi4xLiAgKi8KCnVuc2lnbmVkIGxvbmcgY3JlYXRlX21vZHVsZShjb25zdCBjaGFyICosIHNpemVfdCk7CmludCBkZWxldGVfbW9kdWxlKGNvbnN0IGNoYXIgKik7CgoKI2VuZGlmIC8qIG1vZHVsZS5oICovCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8tLS0tLS0tLWVuZCBvZiBtb2R1dGlscyBtb2R1bGUuaAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLS0tLS0tLS1tb2R1dGlscyBvYmouaCwgbGluZXMgMjUzLTQ2MgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8qIEVsZiBvYmplY3QgZmlsZSBsb2FkaW5nIGFuZCByZWxvY2F0aW9uIHJvdXRpbmVzLgogICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBMaW51eCBJbnRlcm5hdGlvbmFsLgoKICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4KCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBtb2R1dGlscy4KCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCiAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CiAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCgoKI2lmbmRlZiBNT0RVVElMU19PQkpfSApzdGF0aWMgY29uc3QgaW50IE1PRFVUSUxTX09CSl9IID0gMTsKCiNpZGVudCAiJElkOiBpbnNtb2QuYyx2IDEuMTE2IDIwMDQvMDQvMDYgMTE6NTY6MjYgYW5kZXJzZW4gRXhwICQiCgovKiBUaGUgcmVsb2NhdGFibGUgb2JqZWN0IGlzIG1hbmlwdWxhdGVkIHVzaW5nIGVsZmluIHR5cGVzLiAgKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8ZWxmLmg+CiNpbmNsdWRlIDxlbmRpYW4uaD4KCiNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCiNkZWZpbmUgRUxGREFUQU0JRUxGREFUQTJMU0IKI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgojZGVmaW5lIEVMRkRBVEFNCUVMRkRBVEEyTVNCCiNlbmRpZgoKI2lmbmRlZiBFbGZXCiMgaWYgRUxGQ0xBU1NNID09IEVMRkNMQVNTMzIKIyAgZGVmaW5lIEVsZlcoeCkgIEVsZjMyXyAjIyB4CiMgIGRlZmluZSBFTEZXKHgpICBFTEYzMl8gIyMgeAojIGVsc2UKIyAgZGVmaW5lIEVsZlcoeCkgIEVsZjY0XyAjIyB4CiMgIGRlZmluZSBFTEZXKHgpICBFTEY2NF8gIyMgeAojIGVuZGlmCiNlbmRpZgoKLyogRm9yIHNvbWUgcmVhc29uIHRoaXMgaXMgbWlzc2luZyBmcm9tIHNvbWUgYW5jaWVudCBDIGxpYnJhcmllcy4uLi4gICovCiNpZm5kZWYgRUxGMzJfU1RfSU5GTwojIGRlZmluZSBFTEYzMl9TVF9JTkZPKGJpbmQsIHR5cGUpICAgICAgICgoKGJpbmQpIDw8IDQpICsgKCh0eXBlKSAmIDB4ZikpCiNlbmRpZgoKI2lmbmRlZiBFTEY2NF9TVF9JTkZPCiMgZGVmaW5lIEVMRjY0X1NUX0lORk8oYmluZCwgdHlwZSkgICAgICAgKCgoYmluZCkgPDwgNCkgKyAoKHR5cGUpICYgMHhmKSkKI2VuZGlmCgpzdHJ1Y3Qgb2JqX3N0cmluZ19wYXRjaDsKc3RydWN0IG9ial9zeW1ib2xfcGF0Y2g7CgpzdHJ1Y3Qgb2JqX3NlY3Rpb24KewoJRWxmVyhTaGRyKSBoZWFkZXI7Cgljb25zdCBjaGFyICpuYW1lOwoJY2hhciAqY29udGVudHM7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKmxvYWRfbmV4dDsKCWludCBpZHg7Cn07CgpzdHJ1Y3Qgb2JqX3N5bWJvbAp7CglzdHJ1Y3Qgb2JqX3N5bWJvbCAqbmV4dDsJLyogaGFzaCB0YWJsZSBsaW5rICovCgljb25zdCBjaGFyICpuYW1lOwoJdW5zaWduZWQgbG9uZyB2YWx1ZTsKCXVuc2lnbmVkIGxvbmcgc2l6ZTsKCWludCBzZWNpZHg7CQkJLyogdGhlIGRlZmluaW5nIHNlY3Rpb24gaW5kZXgvbW9kdWxlICovCglpbnQgaW5mbzsKCWludCBrc3ltaWR4OwkJCS8qIGZvciBleHBvcnQgdG8gdGhlIGtlcm5lbCBzeW10YWIgKi8KCWludCByZWZlcmVuY2VkOwkJLyogYWN0dWFsbHkgdXNlZCBpbiB0aGUgbGluayAqLwp9OwoKLyogSGFyZGNvZGUgdGhlIGhhc2ggdGFibGUgc2l6ZS4gIFdlIHNob3VsZG4ndCBiZSBuZWVkaW5nIHNvIG1hbnkKICAgc3ltYm9scyB0aGF0IHdlIGJlZ2luIHRvIGRlZ3JhZGUgcGVyZm9ybWFuY2UsIGFuZCB3ZSBnZXQgYSBiaWcgd2luCiAgIGJ5IGdpdmluZyB0aGUgY29tcGlsZXIgYSBjb25zdGFudCBkaXZpc29yLiAgKi8KCiNkZWZpbmUgSEFTSF9CVUNLRVRTICA1MjEKCnN0cnVjdCBvYmpfZmlsZQp7CglFbGZXKEVoZHIpIGhlYWRlcjsKCUVsZlcoQWRkcikgYmFzZWFkZHI7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKipzZWN0aW9uczsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqbG9hZF9vcmRlcjsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqKmxvYWRfb3JkZXJfc2VhcmNoX3N0YXJ0OwoJc3RydWN0IG9ial9zdHJpbmdfcGF0Y2ggKnN0cmluZ19wYXRjaGVzOwoJc3RydWN0IG9ial9zeW1ib2xfcGF0Y2ggKnN5bWJvbF9wYXRjaGVzOwoJaW50ICgqc3ltYm9sX2NtcCkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwoJdW5zaWduZWQgbG9uZyAoKnN5bWJvbF9oYXNoKShjb25zdCBjaGFyICopOwoJdW5zaWduZWQgbG9uZyBsb2NhbF9zeW10YWJfc2l6ZTsKCXN0cnVjdCBvYmpfc3ltYm9sICoqbG9jYWxfc3ltdGFiOwoJc3RydWN0IG9ial9zeW1ib2wgKnN5bXRhYltIQVNIX0JVQ0tFVFNdOwp9OwoKZW51bSBvYmpfcmVsb2MKewoJb2JqX3JlbG9jX29rLAoJb2JqX3JlbG9jX292ZXJmbG93LAoJb2JqX3JlbG9jX2Rhbmdlcm91cywKCW9ial9yZWxvY191bmhhbmRsZWQKfTsKCnN0cnVjdCBvYmpfc3RyaW5nX3BhdGNoCnsKCXN0cnVjdCBvYmpfc3RyaW5nX3BhdGNoICpuZXh0OwoJaW50IHJlbG9jX3NlY2lkeDsKCUVsZlcoQWRkcikgcmVsb2Nfb2Zmc2V0OwoJRWxmVyhBZGRyKSBzdHJpbmdfb2Zmc2V0Owp9OwoKc3RydWN0IG9ial9zeW1ib2xfcGF0Y2gKewoJc3RydWN0IG9ial9zeW1ib2xfcGF0Y2ggKm5leHQ7CglpbnQgcmVsb2Nfc2VjaWR4OwoJRWxmVyhBZGRyKSByZWxvY19vZmZzZXQ7CglzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOwp9OwoKCi8qIEdlbmVyaWMgb2JqZWN0IG1hbmlwdWxhdGlvbiByb3V0aW5lcy4gICovCgpzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmpfZWxmX2hhc2goY29uc3QgY2hhciAqKTsKCnN0YXRpYyB1bnNpZ25lZCBsb25nIG9ial9lbGZfaGFzaF9uKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZyBsZW4pOwoKc3RhdGljIHN0cnVjdCBvYmpfc3ltYm9sICpvYmpfZmluZF9zeW1ib2wgKHN0cnVjdCBvYmpfZmlsZSAqZiwKCQkJCQkgY29uc3QgY2hhciAqbmFtZSk7CgpzdGF0aWMgRWxmVyhBZGRyKSBvYmpfc3ltYm9sX2ZpbmFsX3ZhbHVlKHN0cnVjdCBvYmpfZmlsZSAqZiwKCQkJCSAgc3RydWN0IG9ial9zeW1ib2wgKnN5bSk7CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcKc3RhdGljIHZvaWQgb2JqX3NldF9zeW1ib2xfY29tcGFyZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCSAgICBpbnQgKCpjbXApKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSwKCQkJICAgIHVuc2lnbmVkIGxvbmcgKCpoYXNoKShjb25zdCBjaGFyICopKTsKI2VuZGlmCgpzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICpvYmpfZmluZF9zZWN0aW9uIChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQkJICAgY29uc3QgY2hhciAqbmFtZSk7CgpzdGF0aWMgdm9pZCBvYmpfaW5zZXJ0X3NlY3Rpb25fbG9hZF9vcmRlciAoc3RydWN0IG9ial9maWxlICpmLAoJCQkJICAgIHN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjKTsKCnN0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKm9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uIChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQkJCWNvbnN0IGNoYXIgKm5hbWUsCgkJCQkJCXVuc2lnbmVkIGxvbmcgYWxpZ24sCgkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSk7CgpzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICpvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbl9maXJzdCAoc3RydWN0IG9ial9maWxlICpmLAoJCQkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAoJCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFsaWduLAoJCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUpOwoKc3RhdGljIHZvaWQgKm9ial9leHRlbmRfc2VjdGlvbiAoc3RydWN0IG9ial9zZWN0aW9uICpzZWMsIHVuc2lnbmVkIGxvbmcgbW9yZSk7CgpzdGF0aWMgaW50IG9ial9zdHJpbmdfcGF0Y2goc3RydWN0IG9ial9maWxlICpmLCBpbnQgc2VjaWR4LCBFbGZXKEFkZHIpIG9mZnNldCwKCQkgICAgIGNvbnN0IGNoYXIgKnN0cmluZyk7CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfMl80X01PRFVMRVMKc3RhdGljIGludCBvYmpfc3ltYm9sX3BhdGNoKHN0cnVjdCBvYmpfZmlsZSAqZiwgaW50IHNlY2lkeCwgRWxmVyhBZGRyKSBvZmZzZXQsCgkJICAgICBzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltKTsKI2VuZGlmCgpzdGF0aWMgaW50IG9ial9jaGVja191bmRlZmluZWRzKHN0cnVjdCBvYmpfZmlsZSAqZik7CgpzdGF0aWMgdm9pZCBvYmpfYWxsb2NhdGVfY29tbW9ucyhzdHJ1Y3Qgb2JqX2ZpbGUgKmYpOwoKc3RhdGljIHVuc2lnbmVkIGxvbmcgb2JqX2xvYWRfc2l6ZSAoc3RydWN0IG9ial9maWxlICpmKTsKCnN0YXRpYyBpbnQgb2JqX3JlbG9jYXRlIChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIEVsZlcoQWRkcikgYmFzZSk7CgpzdGF0aWMgc3RydWN0IG9ial9maWxlICpvYmpfbG9hZChGSUxFICpmLCBpbnQgbG9hZHByb2diaXRzKTsKCnN0YXRpYyBpbnQgb2JqX2NyZWF0ZV9pbWFnZSAoc3RydWN0IG9ial9maWxlICpmLCBjaGFyICppbWFnZSk7CgovKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgbWFuaXB1bGF0aW9uIHJvdXRpbmVzLiAgKi8KCnN0YXRpYyBzdHJ1Y3Qgb2JqX2ZpbGUgKmFyY2hfbmV3X2ZpbGUgKHZvaWQpOwoKc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqYXJjaF9uZXdfc2VjdGlvbiAodm9pZCk7CgpzdGF0aWMgc3RydWN0IG9ial9zeW1ib2wgKmFyY2hfbmV3X3N5bWJvbCAodm9pZCk7CgpzdGF0aWMgZW51bSBvYmpfcmVsb2MgYXJjaF9hcHBseV9yZWxvY2F0aW9uIChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQkgICAgICBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnRhcmdzZWMsCgkJCQkgICAgICBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnN5bXNlYywKCQkJCSAgICAgIHN0cnVjdCBvYmpfc3ltYm9sICpzeW0sCgkJCQkgICAgICBFbGZXKFJlbE0pICpyZWwsIEVsZlcoQWRkcikgdmFsdWUpOwoKc3RhdGljIHZvaWQgYXJjaF9jcmVhdGVfZ290IChzdHJ1Y3Qgb2JqX2ZpbGUgKmYpOwoKc3RhdGljIGludCBvYmpfZ3BsX2xpY2Vuc2Uoc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICoqbGljZW5zZSk7CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfMl80X01PRFVMRVMKc3RhdGljIGludCBhcmNoX2luaXRfbW9kdWxlIChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIHN0cnVjdCBuZXdfbW9kdWxlICopOwojZW5kaWYKCiNlbmRpZiAvKiBvYmouaCAqLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8tLS0tLS0tLWVuZCBvZiBtb2R1dGlscyBvYmouaAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgovKiBTUEZYIGlzIGFsd2F5cyBhIHN0cmluZywgc28gaXQgY2FuIGJlIGNvbmNhdGVuYXRlZCB0byBzdHJpbmcgY29uc3RhbnRzLiAgKi8KI2lmZGVmIFNZTUJPTF9QUkVGSVgKI2RlZmluZSBTUEZYCVNZTUJPTF9QUkVGSVgKI2Vsc2UKI2RlZmluZSBTUEZYIAkiIgojZW5kaWYKCgojZGVmaW5lIF9QQVRIX01PRFVMRVMJIi9saWIvbW9kdWxlcyIKc3RhdGljIGNvbnN0IGludCBTVFJWRVJTSU9OTEVOID0gMzI7CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKc3RhdGljIGludCBmbGFnX2ZvcmNlX2xvYWQgPSAwOwpzdGF0aWMgaW50IGZsYWdfYXV0b2NsZWFuID0gMDsKc3RhdGljIGludCBmbGFnX3ZlcmJvc2UgPSAwOwpzdGF0aWMgaW50IGZsYWdfcXVpZXQgPSAwOwpzdGF0aWMgaW50IGZsYWdfZXhwb3J0ID0gMTsKCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2lmIGRlZmluZWQoQ09ORklHX1VTRV9MSVNUKQoKc3RydWN0IGFyY2hfbGlzdF9lbnRyeQp7CglzdHJ1Y3QgYXJjaF9saXN0X2VudHJ5ICpuZXh0OwoJQ09ORklHX0xJU1RfQVJDSFRZUEUgYWRkZW5kOwoJaW50IG9mZnNldDsKCWludCBpbml0ZWQgOiAxOwp9OwoKI2VuZGlmCgojaWYgZGVmaW5lZChDT05GSUdfVVNFX1NJTkdMRSkKCnN0cnVjdCBhcmNoX3NpbmdsZV9lbnRyeQp7CglpbnQgb2Zmc2V0OwoJaW50IGluaXRlZCA6IDE7CglpbnQgYWxsb2NhdGVkIDogMTsKfTsKCiNlbmRpZgoKI2lmIGRlZmluZWQoX19taXBzX18pCnN0cnVjdCBtaXBzX2hpMTYKewoJc3RydWN0IG1pcHNfaGkxNiAqbmV4dDsKCUVsZjMyX0FkZHIgKmFkZHI7CglFbGYzMl9BZGRyIHZhbHVlOwp9OwojZW5kaWYKCnN0cnVjdCBhcmNoX2ZpbGUgewoJc3RydWN0IG9ial9maWxlIHJvb3Q7CiNpZiBkZWZpbmVkKENPTkZJR19VU0VfUExUX0VOVFJJRVMpCglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnBsdDsKI2VuZGlmCiNpZiBkZWZpbmVkKENPTkZJR19VU0VfR09UX0VOVFJJRVMpCglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKmdvdDsKI2VuZGlmCiNpZiBkZWZpbmVkKF9fbWlwc19fKQoJc3RydWN0IG1pcHNfaGkxNiAqbWlwc19oaTE2X2xpc3Q7CiNlbmRpZgp9OwoKc3RydWN0IGFyY2hfc3ltYm9sIHsKCXN0cnVjdCBvYmpfc3ltYm9sIHJvb3Q7CiNpZiBkZWZpbmVkKENPTkZJR19VU0VfUExUX0VOVFJJRVMpCiNpZiBkZWZpbmVkKENPTkZJR19VU0VfUExUX0xJU1QpCglzdHJ1Y3QgYXJjaF9saXN0X2VudHJ5ICpwbHRlbnQ7CiNlbHNlCglzdHJ1Y3QgYXJjaF9zaW5nbGVfZW50cnkgcGx0ZW50OwojZW5kaWYKI2VuZGlmCiNpZiBkZWZpbmVkKENPTkZJR19VU0VfR09UX0VOVFJJRVMpCglzdHJ1Y3QgYXJjaF9zaW5nbGVfZW50cnkgZ290ZW50OwojZW5kaWYKfTsKCgpzdHJ1Y3QgZXh0ZXJuYWxfbW9kdWxlIHsKCWNvbnN0IGNoYXIgKm5hbWU7CglFbGZXKEFkZHIpIGFkZHI7CglpbnQgdXNlZDsKCXNpemVfdCBuc3ltczsKCXN0cnVjdCBuZXdfbW9kdWxlX3N5bWJvbCAqc3ltczsKfTsKCnN0YXRpYyBzdHJ1Y3QgbmV3X21vZHVsZV9zeW1ib2wgKmtzeW1zOwpzdGF0aWMgc2l6ZV90IG5rc3ltczsKCnN0YXRpYyBzdHJ1Y3QgZXh0ZXJuYWxfbW9kdWxlICpleHRfbW9kdWxlczsKc3RhdGljIGludCBuX2V4dF9tb2R1bGVzOwpzdGF0aWMgaW50IG5fZXh0X21vZHVsZXNfdXNlZDsKZXh0ZXJuIGludCBkZWxldGVfbW9kdWxlKGNvbnN0IGNoYXIgKik7CgpzdGF0aWMgY2hhciAqbV9maWxlbmFtZTsKc3RhdGljIGNoYXIgKm1fZnVsbE5hbWU7CgoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKc3RhdGljIGludCBjaGVja19tb2R1bGVfbmFtZV9tYXRjaChjb25zdCBjaGFyICpmaWxlbmFtZSwgc3RydWN0IHN0YXQgKnN0YXRidWYsCgkJCQkJCSAgIHZvaWQgKnVzZXJkYXRhKQp7CgljaGFyICpmdWxsbmFtZSA9IChjaGFyICopIHVzZXJkYXRhOwoKCWlmIChmdWxsbmFtZVswXSA9PSAnXDAnKQoJCXJldHVybiAoRkFMU0UpOwoJZWxzZSB7CgkJY2hhciAqdG1wLCAqdG1wMSA9IGJiX3hzdHJkdXAoZmlsZW5hbWUpOwoJCXRtcCA9IGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50KHRtcDEpOwoJCWlmIChzdHJjbXAodG1wLCBmdWxsbmFtZSkgPT0gMCkgewoJCQlmcmVlKHRtcDEpOwoJCQkvKiBTdG9wIHNlYXJjaGluZyBpZiB3ZSBmaW5kIGEgbWF0Y2ggKi8KCQkJbV9maWxlbmFtZSA9IGJiX3hzdHJkdXAoZmlsZW5hbWUpOwoJCQlyZXR1cm4gKEZBTFNFKTsKCQl9CgkJZnJlZSh0bXAxKTsKCX0KCXJldHVybiAoVFJVRSk7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKc3RhdGljIHN0cnVjdCBvYmpfZmlsZSAqYXJjaF9uZXdfZmlsZSh2b2lkKQp7CglzdHJ1Y3QgYXJjaF9maWxlICpmOwoJZiA9IHhtYWxsb2Moc2l6ZW9mKCpmKSk7CgoJbWVtc2V0KGYsIDAsIHNpemVvZigqZikpOwoKCXJldHVybiAmZi0+cm9vdDsKfQoKc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqYXJjaF9uZXdfc2VjdGlvbih2b2lkKQp7CglyZXR1cm4geG1hbGxvYyhzaXplb2Yoc3RydWN0IG9ial9zZWN0aW9uKSk7Cn0KCnN0YXRpYyBzdHJ1Y3Qgb2JqX3N5bWJvbCAqYXJjaF9uZXdfc3ltYm9sKHZvaWQpCnsKCXN0cnVjdCBhcmNoX3N5bWJvbCAqc3ltOwoJc3ltID0geG1hbGxvYyhzaXplb2YoKnN5bSkpOwoKCW1lbXNldChzeW0sIDAsIHNpemVvZigqc3ltKSk7CgoJcmV0dXJuICZzeW0tPnJvb3Q7Cn0KCnN0YXRpYyBlbnVtIG9ial9yZWxvYwphcmNoX2FwcGx5X3JlbG9jYXRpb24oc3RydWN0IG9ial9maWxlICpmLAoJCQkJCSAgc3RydWN0IG9ial9zZWN0aW9uICp0YXJnc2VjLAoJCQkJCSAgc3RydWN0IG9ial9zZWN0aW9uICpzeW1zZWMsCgkJCQkJICBzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltLAoJCQkJICAgICAgRWxmVyhSZWxNKSAqcmVsLCBFbGZXKEFkZHIpIHYpCnsKCXN0cnVjdCBhcmNoX2ZpbGUgKmlmaWxlID0gKHN0cnVjdCBhcmNoX2ZpbGUgKikgZjsKCWVudW0gb2JqX3JlbG9jIHJldCA9IG9ial9yZWxvY19vazsKCUVsZlcoQWRkcikgKmxvYyA9IChFbGZXKEFkZHIpICopICh0YXJnc2VjLT5jb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwoJRWxmVyhBZGRyKSBkb3QgPSB0YXJnc2VjLT5oZWFkZXIuc2hfYWRkciArIHJlbC0+cl9vZmZzZXQ7CiNpZiBkZWZpbmVkKENPTkZJR19VU0VfR09UX0VOVFJJRVMpIHx8IGRlZmluZWQoQ09ORklHX1VTRV9QTFRfRU5UUklFUykKCXN0cnVjdCBhcmNoX3N5bWJvbCAqaXN5bSA9IChzdHJ1Y3QgYXJjaF9zeW1ib2wgKikgc3ltOwojZW5kaWYKI2lmIGRlZmluZWQoQ09ORklHX1VTRV9HT1RfRU5UUklFUykKCUVsZlcoQWRkcikgZ290ID0gaWZpbGUtPmdvdCA/IGlmaWxlLT5nb3QtPmhlYWRlci5zaF9hZGRyIDogMDsKI2VuZGlmCiNpZiBkZWZpbmVkKENPTkZJR19VU0VfUExUX0VOVFJJRVMpCglFbGZXKEFkZHIpIHBsdCA9IGlmaWxlLT5wbHQgPyBpZmlsZS0+cGx0LT5oZWFkZXIuc2hfYWRkciA6IDA7Cgl1bnNpZ25lZCBsb25nICppcDsKI2lmIGRlZmluZWQoQ09ORklHX1VTRV9QTFRfTElTVCkKCXN0cnVjdCBhcmNoX2xpc3RfZW50cnkgKnBlOwojZWxzZQoJc3RydWN0IGFyY2hfc2luZ2xlX2VudHJ5ICpwZTsKI2VuZGlmCiNlbmRpZgoKCXN3aXRjaCAoRUxGMzJfUl9UWVBFKHJlbC0+cl9pbmZvKSkgewoKCiNpZiBkZWZpbmVkKF9fYXJtX18pCgkJY2FzZSBSX0FSTV9OT05FOgoJCQlicmVhazsKCgkJY2FzZSBSX0FSTV9BQlMzMjoKCQkJKmxvYyArPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSX0FSTV9HT1QzMjoKCQkJZ290byBiYl91c2VfZ290OwoKCQljYXNlIFJfQVJNX0dPVFBDOgoJCQkvKiByZWxhdGl2ZSByZWxvYywgYWx3YXlzIHRvIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXwoJCQkgKiAod2hpY2ggaXMgLmdvdCkgc2ltaWxhciB0byBicmFuY2gsCgkJCSAqIGJ1dCBpcyBmdWxsIDMyIGJpdHMgcmVsYXRpdmUgKi8KCgkJCWFzc2VydChnb3QpOwoJCQkqbG9jICs9IGdvdCAtIGRvdDsKCQkJYnJlYWs7CgoJCWNhc2UgUl9BUk1fUEMyNDoKCQljYXNlIFJfQVJNX1BMVDMyOgoJCQlnb3RvIGJiX3VzZV9wbHQ7CgoJCWNhc2UgUl9BUk1fR09UT0ZGOiAvKiBhZGRyZXNzIHJlbGF0aXZlIHRvIHRoZSBnb3QgKi8KCQkJYXNzZXJ0KGdvdCk7CgkJCSpsb2MgKz0gdiAtIGdvdDsKCQkJYnJlYWs7CgojZWxpZiBkZWZpbmVkKF9fczM5MF9fKQoJCWNhc2UgUl8zOTBfMzI6CgkJCSoodW5zaWduZWQgaW50ICopIGxvYyArPSB2OwoJCQlicmVhazsKCQljYXNlIFJfMzkwXzE2OgoJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArPSB2OwoJCQlicmVhazsKCQljYXNlIFJfMzkwXzg6CgkJCSoodW5zaWduZWQgY2hhciAqKSBsb2MgKz0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl8zOTBfUEMzMjoKCQkJKih1bnNpZ25lZCBpbnQgKikgbG9jICs9IHYgLSBkb3Q7CgkJCWJyZWFrOwoJCWNhc2UgUl8zOTBfUEMxNkRCTDoKCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgKz0gKHYgLSBkb3QpID4+IDE7CgkJCWJyZWFrOwoJCWNhc2UgUl8zOTBfUEMxNjoKCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgKz0gdiAtIGRvdDsKCQkJYnJlYWs7CgoJCWNhc2UgUl8zOTBfUExUMzI6CgkJY2FzZSBSXzM5MF9QTFQxNkRCTDoKCQkJLyogZmluZCB0aGUgcGx0IGVudHJ5IGFuZCBpbml0aWFsaXplIGl0LiAgKi8KCQkJYXNzZXJ0KGlzeW0gIT0gTlVMTCk7CgkJCXBlID0gKHN0cnVjdCBhcmNoX3NpbmdsZV9lbnRyeSAqKSAmaXN5bS0+cGx0ZW50OwoJCQlhc3NlcnQocGUtPmFsbG9jYXRlZCk7CgkJCWlmIChwZS0+aW5pdGVkID09IDApIHsKCQkJCWlwID0gKHVuc2lnbmVkIGxvbmcgKikoaWZpbGUtPnBsdC0+Y29udGVudHMgKyBwZS0+b2Zmc2V0KTsKCQkJCWlwWzBdID0gMHgwZDEwNTgxMDsgLyogYmFzciAxLDA7IGxnIDEsMTAoMSk7IGJyIDEgKi8KCQkJCWlwWzFdID0gMHgxMDA2MDdmMTsKCQkJCWlmIChFTEYzMl9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfMzkwX1BMVDE2REJMKQoJCQkJCWlwWzJdID0gdiAtIDI7CgkJCQllbHNlCgkJCQkJaXBbMl0gPSB2OwoJCQkJcGUtPmluaXRlZCA9IDE7CgkJCX0KCgkJCS8qIEluc2VydCByZWxhdGl2ZSBkaXN0YW5jZSB0byB0YXJnZXQuICAqLwoJCQl2ID0gcGx0ICsgcGUtPm9mZnNldCAtIGRvdDsKCQkJaWYgKEVMRjMyX1JfVFlQRShyZWwtPnJfaW5mbykgPT0gUl8zOTBfUExUMzIpCgkJCQkqKHVuc2lnbmVkIGludCAqKSBsb2MgPSAodW5zaWduZWQgaW50KSB2OwoJCQllbHNlIGlmIChFTEYzMl9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfMzkwX1BMVDE2REJMKQoJCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgPSAodW5zaWduZWQgc2hvcnQpICgodiArIDIpID4+IDEpOwoJCQlicmVhazsKCgkJY2FzZSBSXzM5MF9HTE9CX0RBVDoKCQljYXNlIFJfMzkwX0pNUF9TTE9UOgoJCQkqbG9jID0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl8zOTBfUkVMQVRJVkU6CgkJCSpsb2MgKz0gZi0+YmFzZWFkZHI7CgkJCWJyZWFrOwoKCQljYXNlIFJfMzkwX0dPVFBDOgoJCQlhc3NlcnQoZ290ICE9IDApOwoJCQkqKHVuc2lnbmVkIGxvbmcgKikgbG9jICs9IGdvdCAtIGRvdDsKCQkJYnJlYWs7CgoJCWNhc2UgUl8zOTBfR09UMTI6CgkJY2FzZSBSXzM5MF9HT1QxNjoKCQljYXNlIFJfMzkwX0dPVDMyOgoJCQlhc3NlcnQoaXN5bSAhPSBOVUxMKTsKCQkJYXNzZXJ0KGdvdCAhPSAwKTsKCQkJaWYgKCFpc3ltLT5nb3RlbnQuaW5pdGVkKQoJCQl7CgkJCQlpc3ltLT5nb3RlbnQuaW5pdGVkID0gMTsKCQkJCSooRWxmMzJfQWRkciAqKShpZmlsZS0+Z290LT5jb250ZW50cyArIGlzeW0tPmdvdGVudC5vZmZzZXQpID0gdjsKCQkJfQoJCQlpZiAoRUxGMzJfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSXzM5MF9HT1QxMikKCQkJCSoodW5zaWduZWQgc2hvcnQgKikgbG9jIHw9ICgqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArIGlzeW0tPmdvdGVudC5vZmZzZXQpICYgMHhmZmY7CgkJCWVsc2UgaWYgKEVMRjMyX1JfVFlQRShyZWwtPnJfaW5mbykgPT0gUl8zOTBfR09UMTYpCgkJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArPSBpc3ltLT5nb3RlbnQub2Zmc2V0OwoJCQllbHNlIGlmIChFTEYzMl9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfMzkwX0dPVDMyKQoJCQkJKih1bnNpZ25lZCBpbnQgKikgbG9jICs9IGlzeW0tPmdvdGVudC5vZmZzZXQ7CgkJCWJyZWFrOwoKI2lmbmRlZiBSXzM5MF9HT1RPRkYzMgojZGVmaW5lIFJfMzkwX0dPVE9GRjMyIFJfMzkwX0dPVE9GRgojZW5kaWYKCQljYXNlIFJfMzkwX0dPVE9GRjMyOgoJCQlhc3NlcnQoZ290ICE9IDApOwoJCQkqbG9jICs9IHYgLSBnb3Q7CgkJCWJyZWFrOwoKI2VsaWYgZGVmaW5lZChfX2kzODZfXykKCgkJY2FzZSBSXzM4Nl9OT05FOgoJCQlicmVhazsKCgkJY2FzZSBSXzM4Nl8zMjoKCQkJKmxvYyArPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSXzM4Nl9QTFQzMjoKCQljYXNlIFJfMzg2X1BDMzI6CgkJCSpsb2MgKz0gdiAtIGRvdDsKCQkJYnJlYWs7CgoJCWNhc2UgUl8zODZfR0xPQl9EQVQ6CgkJY2FzZSBSXzM4Nl9KTVBfU0xPVDoKCQkJKmxvYyA9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfMzg2X1JFTEFUSVZFOgoJCQkqbG9jICs9IGYtPmJhc2VhZGRyOwoJCQlicmVhazsKCgkJY2FzZSBSXzM4Nl9HT1RQQzoKCQkJYXNzZXJ0KGdvdCAhPSAwKTsKCQkJKmxvYyArPSBnb3QgLSBkb3Q7CgkJCWJyZWFrOwoKCQljYXNlIFJfMzg2X0dPVDMyOgoJCQlnb3RvIGJiX3VzZV9nb3Q7CgoJCWNhc2UgUl8zODZfR09UT0ZGOgoJCQlhc3NlcnQoZ290ICE9IDApOwoJCQkqbG9jICs9IHYgLSBnb3Q7CgkJCWJyZWFrOwoKI2VsaWYgZGVmaW5lZChfX21jNjgwMDBfXykKCgkJY2FzZSBSXzY4S19OT05FOgoJCQlicmVhazsKCgkJY2FzZSBSXzY4S18zMjoKCQkJKmxvYyArPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSXzY4S184OgoJCQlpZiAodiA+IDB4ZmYpIHsKCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKCQkJfQoJCQkqKGNoYXIgKilsb2MgPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSXzY4S18xNjoKCQkJaWYgKHYgPiAweGZmZmYpIHsKCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKCQkJfQoJCQkqKHNob3J0ICopbG9jID0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl82OEtfUEM4OgoJCQl2IC09IGRvdDsKCQkJaWYgKChFbGYzMl9Td29yZCl2ID4gMHg3ZiB8fAoJCQkJCShFbGYzMl9Td29yZCl2IDwgLShFbGYzMl9Td29yZCkweDgwKSB7CgkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CgkJCX0KCQkJKihjaGFyICopbG9jID0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl82OEtfUEMxNjoKCQkJdiAtPSBkb3Q7CgkJCWlmICgoRWxmMzJfU3dvcmQpdiA+IDB4N2ZmZiB8fAoJCQkJCShFbGYzMl9Td29yZCl2IDwgLShFbGYzMl9Td29yZCkweDgwMDApIHsKCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKCQkJfQoJCQkqKHNob3J0ICopbG9jID0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl82OEtfUEMzMjoKCQkJKihpbnQgKilsb2MgPSB2IC0gZG90OwoJCQlicmVhazsKCgkJY2FzZSBSXzY4S19HTE9CX0RBVDoKCQljYXNlIFJfNjhLX0pNUF9TTE9UOgoJCQkqbG9jID0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl82OEtfUkVMQVRJVkU6CgkJCSooaW50ICopbG9jICs9IGYtPmJhc2VhZGRyOwoJCQlicmVhazsKCgkJY2FzZSBSXzY4S19HT1QzMjoKCQkJZ290byBiYl91c2VfZ290OwoKI2lmZGVmIFJfNjhLX0dPVE9GRgoJCWNhc2UgUl82OEtfR09UT0ZGOgoJCQlhc3NlcnQoZ290ICE9IDApOwoJCQkqbG9jICs9IHYgLSBnb3Q7CgkJCWJyZWFrOwojZW5kaWYKCiNlbGlmIGRlZmluZWQoX19taXBzX18pCgoJCWNhc2UgUl9NSVBTX05PTkU6CgkJCWJyZWFrOwoKCQljYXNlIFJfTUlQU18zMjoKCQkJKmxvYyArPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSX01JUFNfMjY6CgkJCWlmICh2ICUgNCkKCQkJCXJldCA9IG9ial9yZWxvY19kYW5nZXJvdXM7CgkJCWlmICgodiAmIDB4ZjAwMDAwMDApICE9ICgoZG90ICsgNCkgJiAweGYwMDAwMDAwKSkKCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKCQkJKmxvYyA9CgkJCQkoKmxvYyAmIH4weDAzZmZmZmZmKSB8ICgoKmxvYyArICh2ID4+IDIpKSAmCgkJCQkJCQkJCQkweDAzZmZmZmZmKTsKCQkJYnJlYWs7CgoJCWNhc2UgUl9NSVBTX0hJMTY6CgkJCXsKCQkJCXN0cnVjdCBtaXBzX2hpMTYgKm47CgoJCQkJLyogV2UgY2Fubm90IHJlbG9jYXRlIHRoaXMgb25lIG5vdyBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIHZhbHVlCgkJCQkgICBvZiB0aGUgY2Fycnkgd2UgbmVlZCB0byBhZGQuICBTYXZlIHRoZSBpbmZvcm1hdGlvbiwgYW5kIGxldCBMTzE2CgkJCQkgICBkbyB0aGUgYWN0dWFsIHJlbG9jYXRpb24uICAqLwoJCQkJbiA9IChzdHJ1Y3QgbWlwc19oaTE2ICopIHhtYWxsb2Moc2l6ZW9mICpuKTsKCQkJCW4tPmFkZHIgPSBsb2M7CgkJCQluLT52YWx1ZSA9IHY7CgkJCQluLT5uZXh0ID0gaWZpbGUtPm1pcHNfaGkxNl9saXN0OwoJCQkJaWZpbGUtPm1pcHNfaGkxNl9saXN0ID0gbjsKCQkJCWJyZWFrOwoJCQl9CgoJCWNhc2UgUl9NSVBTX0xPMTY6CgkJCXsKCQkJCXVuc2lnbmVkIGxvbmcgaW5zbmxvID0gKmxvYzsKCQkJCUVsZjMyX0FkZHIgdmFsLCB2YWxsbzsKCgkJCQkvKiBTaWduIGV4dGVuZCB0aGUgYWRkZW5kIHdlIGV4dHJhY3QgZnJvbSB0aGUgbG8gaW5zbi4gICovCgkJCQl2YWxsbyA9ICgoaW5zbmxvICYgMHhmZmZmKSBeIDB4ODAwMCkgLSAweDgwMDA7CgoJCQkJaWYgKGlmaWxlLT5taXBzX2hpMTZfbGlzdCAhPSBOVUxMKSB7CgkJCQkJc3RydWN0IG1pcHNfaGkxNiAqbDsKCgkJCQkJbCA9IGlmaWxlLT5taXBzX2hpMTZfbGlzdDsKCQkJCQl3aGlsZSAobCAhPSBOVUxMKSB7CgkJCQkJCXN0cnVjdCBtaXBzX2hpMTYgKm5leHQ7CgkJCQkJCXVuc2lnbmVkIGxvbmcgaW5zbjsKCgkJCQkJCS8qIFRoZSB2YWx1ZSBmb3IgdGhlIEhJMTYgaGFkIGJlc3QgYmUgdGhlIHNhbWUuICovCgkJCQkJCWFzc2VydCh2ID09IGwtPnZhbHVlKTsKCgkJCQkJCS8qIERvIHRoZSBISTE2IHJlbG9jYXRpb24uICBOb3RlIHRoYXQgd2UgYWN0dWFsbHkgZG9uJ3QKCQkJCQkJICAgbmVlZCB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBMTzE2IGl0c2VsZiwgZXhjZXB0IHdoZXJlCgkJCQkJCSAgIHRvIGZpbmQgdGhlIGxvdyAxNiBiaXRzIG9mIHRoZSBhZGRlbmQgbmVlZGVkIGJ5IHRoZSBMTzE2LiAgKi8KCQkJCQkJaW5zbiA9ICpsLT5hZGRyOwoJCQkJCQl2YWwgPQoJCQkJCQkJKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKwoJCQkJCQkJdmFsbG87CgkJCQkJCXZhbCArPSB2OwoKCQkJCQkJLyogQWNjb3VudCBmb3IgdGhlIHNpZ24gZXh0ZW5zaW9uIHRoYXQgd2lsbCBoYXBwZW4gaW4gdGhlCgkJCQkJCSAgIGxvdyBiaXRzLiAgKi8KCQkJCQkJdmFsID0KCQkJCQkJCSgodmFsID4+IDE2KSArCgkJCQkJCQkgKCh2YWwgJiAweDgwMDApICE9CgkJCQkJCQkgIDApKSAmIDB4ZmZmZjsKCgkJCQkJCWluc24gPSAoaW5zbiAmIH4weGZmZmYpIHwgdmFsOwoJCQkJCQkqbC0+YWRkciA9IGluc247CgoJCQkJCQluZXh0ID0gbC0+bmV4dDsKCQkJCQkJZnJlZShsKTsKCQkJCQkJbCA9IG5leHQ7CgkJCQkJfQoKCQkJCQlpZmlsZS0+bWlwc19oaTE2X2xpc3QgPSBOVUxMOwoJCQkJfQoKCQkJCS8qIE9rLCB3ZSdyZSBkb25lIHdpdGggdGhlIEhJMTYgcmVsb2NzLiAgTm93IGRlYWwgd2l0aCB0aGUgTE8xNi4gICovCgkJCQl2YWwgPSB2ICsgdmFsbG87CgkJCQlpbnNubG8gPSAoaW5zbmxvICYgfjB4ZmZmZikgfCAodmFsICYgMHhmZmZmKTsKCQkJCSpsb2MgPSBpbnNubG87CgkJCQlicmVhazsKCQkJfQoKI2VsaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKCgkJY2FzZSBSX1BQQ19BRERSMTZfSEE6CgkJCSoodW5zaWduZWQgc2hvcnQgKilsb2MgPSAodiArIDB4ODAwMCkgPj4gMTY7CgkJCWJyZWFrOwoKCQljYXNlIFJfUFBDX0FERFIxNl9ISToKCQkJKih1bnNpZ25lZCBzaG9ydCAqKWxvYyA9IHYgPj4gMTY7CgkJCWJyZWFrOwoKCQljYXNlIFJfUFBDX0FERFIxNl9MTzoKCQkJKih1bnNpZ25lZCBzaG9ydCAqKWxvYyA9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfUFBDX1JFTDI0OgoJCQlnb3RvIGJiX3VzZV9wbHQ7CgoJCWNhc2UgUl9QUENfUkVMMzI6CgkJCSpsb2MgPSB2IC0gZG90OwoJCQlicmVhazsKCgkJY2FzZSBSX1BQQ19BRERSMzI6CgkJCSpsb2MgPSB2OwoJCQlicmVhazsKCiNlbGlmIGRlZmluZWQoX19zaF9fKQoKCQljYXNlIFJfU0hfTk9ORToKCQkJYnJlYWs7CgoJCWNhc2UgUl9TSF9ESVIzMjoKCQkJKmxvYyArPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSX1NIX1JFTDMyOgoJCQkqbG9jICs9IHYgLSBkb3Q7CgkJCWJyZWFrOwoKCQljYXNlIFJfU0hfUExUMzI6CgkJCSpsb2MgPSB2IC0gZG90OwoJCQlicmVhazsKCgkJY2FzZSBSX1NIX0dMT0JfREFUOgoJCWNhc2UgUl9TSF9KTVBfU0xPVDoKCQkJKmxvYyA9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfU0hfUkVMQVRJVkU6CgkJCSpsb2MgPSBmLT5iYXNlYWRkciArIHJlbC0+cl9hZGRlbmQ7CgkJCWJyZWFrOwoKCQljYXNlIFJfU0hfR09UUEM6CgkJCWFzc2VydChnb3QgIT0gMCk7CgkJCSpsb2MgPSBnb3QgLSBkb3QgKyByZWwtPnJfYWRkZW5kOwoJCQlicmVhazsKCgkJY2FzZSBSX1NIX0dPVDMyOgoJCQlnb3RvIGJiX3VzZV9nb3Q7CgoJCWNhc2UgUl9TSF9HT1RPRkY6CgkJCWFzc2VydChnb3QgIT0gMCk7CgkJCSpsb2MgPSB2IC0gZ290OwoJCQlicmVhazsKCiNpZiBkZWZpbmVkKF9fU0g1X18pCgkJY2FzZSBSX1NIX0lNTV9NRURMT1cxNjoKCQljYXNlIFJfU0hfSU1NX0xPVzE2OgoJCQl7CgkJCQlFbGYzMl9BZGRyIHdvcmQ7CgoJCQkJaWYgKEVMRjMyX1JfVFlQRShyZWwtPnJfaW5mbykgPT0gUl9TSF9JTU1fTUVETE9XMTYpCgkJCQkJdiA+Pj0gMTY7CgoJCQkJLyoKCQkJCSAqICBtb3ZpIGFuZCBzaG9yaSBoYXZlIHRoZSBmb3JtYXQ6CgkJCQkgKgoJCQkJICogIHwgIG9wICB8IGltbSAgfCByZWcgfCByZXNlcnZlZCB8CgkJCQkgKiAgIDMxLi4yNiAyNS4uMTAgOS4uIDQgMyAgIC4uICAgMAoJCQkJICoKCQkJCSAqIHNvIHdlIHNpbXBseSBtYXNrIGFuZCBvciBpbiBpbW0uCgkJCQkgKi8KCQkJCXdvcmQgPSAqbG9jICYgfjB4M2ZmZmMwMDsKCQkJCXdvcmQgfD0gKHYgJiAweGZmZmYpIDw8IDEwOwoKCQkJCSpsb2MgPSB3b3JkOwoKCQkJCWJyZWFrOwoJCQl9CgoJCWNhc2UgUl9TSF9JTU1fTUVETE9XMTZfUENSRUw6CgkJY2FzZSBSX1NIX0lNTV9MT1cxNl9QQ1JFTDoKCQkJewoJCQkJRWxmMzJfQWRkciB3b3JkOwoKCQkJCXdvcmQgPSAqbG9jICYgfjB4M2ZmZmMwMDsKCgkJCQl2IC09IGRvdDsKCgkJCQlpZiAoRUxGMzJfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSX1NIX0lNTV9NRURMT1cxNl9QQ1JFTCkKCQkJCQl2ID4+PSAxNjsKCgkJCQl3b3JkIHw9ICh2ICYgMHhmZmZmKSA8PCAxMDsKCgkJCQkqbG9jID0gd29yZDsKCgkJCQlicmVhazsKCQkJfQojZW5kaWYgLyogX19TSDVfXyAqLwojZW5kaWYgLyogX19zaF9fICovCgoJCWRlZmF1bHQ6CgkJCXByaW50ZigiV2FybmluZzogdW5oYW5kbGVkIHJlbG9jICVkXG4iLChpbnQpRUxGMzJfUl9UWVBFKHJlbC0+cl9pbmZvKSk7CgkJCXJldCA9IG9ial9yZWxvY191bmhhbmRsZWQ7CgkJCWJyZWFrOwoKI2lmIGRlZmluZWQgKF9fdjg1MGVfXykKCQljYXNlIFJfVjg1MF9OT05FOgoJCQlicmVhazsKCgkJY2FzZSBSX1Y4NTBfMzI6CgkJCS8qIFdlIHdyaXRlIHR3byBzaG9ydHMgaW5zdGVhZCBvZiBhIGxvbmcgYmVjYXVzZSBldmVuCgkJCSAgIDMyLWJpdCBpbnNucyBvbmx5IG5lZWQgaGFsZi13b3JkIGFsaWdubWVudCwgYnV0CgkJCSAgIDMyLWJpdCBkYXRhIG5lZWRzIHRvIGJlIGxvbmctd29yZCBhbGlnbmVkLiAgKi8KCQkJdiArPSAoKHVuc2lnbmVkIHNob3J0ICopbG9jKVswXTsKCQkJdiArPSAoKHVuc2lnbmVkIHNob3J0ICopbG9jKVsxXSA8PCAxNjsKCQkJKCh1bnNpZ25lZCBzaG9ydCAqKWxvYylbMF0gPSB2ICYgMHhmZmZmOwoJCQkoKHVuc2lnbmVkIHNob3J0ICopbG9jKVsxXSA9ICh2ID4+IDE2KSAmIDB4ZmZmZjsKCQkJYnJlYWs7CgoJCWNhc2UgUl9WODUwXzIyX1BDUkVMOgoJCQlnb3RvIGJiX3VzZV9wbHQ7CiNlbmRpZgoKI2lmIGRlZmluZWQgKF9fY3Jpc19fKQoJCWNhc2UgUl9DUklTX05PTkU6CgkJCWJyZWFrOwoKCQljYXNlIFJfQ1JJU18zMjoKCQkJLyogQ1JJUyBrZWVwcyB0aGUgcmVsb2NhdGlvbiB2YWx1ZSBpbiB0aGUgcl9hZGRlbmQgZmllbGQgYW5kCgkJCSAqIHNob3VsZCBub3QgdXNlIHdoYXRzIGluICpsb2MgYXQgYWxsCgkJCSAqLwoJCQkqbG9jID0gdjsKCQkJYnJlYWs7CiNlbmRpZgoKI2lmIGRlZmluZWQoQ09ORklHX1VTRV9QTFRfRU5UUklFUykKCmJiX3VzZV9wbHQ6CgoJCQkvKiBmaW5kIHRoZSBwbHQgZW50cnkgYW5kIGluaXRpYWxpemUgaXQgaWYgbmVjZXNzYXJ5ICovCgkJCWFzc2VydChpc3ltICE9IE5VTEwpOwoKI2lmIGRlZmluZWQoQ09ORklHX1VTRV9QTFRfTElTVCkKCQkJZm9yIChwZSA9IGlzeW0tPnBsdGVudDsgcGUgIT0gTlVMTCAmJiBwZS0+YWRkZW5kICE9IHJlbC0+cl9hZGRlbmQ7KQoJCQkJcGUgPSBwZS0+bmV4dDsKCQkJYXNzZXJ0KHBlICE9IE5VTEwpOwojZWxzZQoJCQlwZSA9ICZpc3ltLT5wbHRlbnQ7CiNlbmRpZgoKCQkJaWYgKCEgcGUtPmluaXRlZCkgewoJCQkJaXAgPSAodW5zaWduZWQgbG9uZyAqKSAoaWZpbGUtPnBsdC0+Y29udGVudHMgKyBwZS0+b2Zmc2V0KTsKCgkJCQkvKiBnZW5lcmF0ZSBzb21lIG1hY2hpbmUgY29kZSAqLwoKI2lmIGRlZmluZWQoX19hcm1fXykKCQkJCWlwWzBdID0gMHhlNTFmZjAwNDsJCQkvKiBsZHIgcGMsW3BjLCMtNF0gKi8KCQkJCWlwWzFdID0gdjsJCQkJLyogc3ltQCAqLwojZW5kaWYKI2lmIGRlZmluZWQoX19wb3dlcnBjX18pCgkJCQlpcFswXSA9IDB4M2Q2MDAwMDAgKyAoKHYgKyAweDgwMDApID4+IDE2KTsgIC8qIGxpcyByMTEsc3ltQGhhICovCgkJCQlpcFsxXSA9IDB4Mzk2YjAwMDAgKyAodiAmIDB4ZmZmZik7CSAgICAgIC8qIGFkZGkgcjExLHIxMSxzeW1AbCAqLwoJCQkJaXBbMl0gPSAweDdkNjkwM2E2OwkJCSAgICAgIC8qIG10Y3RyIHIxMSAqLwoJCQkJaXBbM10gPSAweDRlODAwNDIwOwkJCSAgICAgIC8qIGJjdHIgKi8KI2VuZGlmCiNpZiBkZWZpbmVkIChfX3Y4NTBlX18pCgkJCQkvKiBXZSBoYXZlIHRvIHRyYXNoIGEgcmVnaXN0ZXIsIHNvIHdlIGFzc3VtZSB0aGF0IGFueSBjb250cm9sCgkJCQkgICB0cmFuc2ZlciBtb3JlIHRoYW4gMjEtYml0cyBhd2F5IG11c3QgYmUgYSBmdW5jdGlvbiBjYWxsCgkJCQkgICAoc28gd2UgY2FuIHVzZSBhIGNhbGwtY2xvYmJlcmVkIHJlZ2lzdGVyKS4gICovCgkJCQlpcFswXSA9IDB4MDYyMSArICgodiAmIDB4ZmZmZikgPDwgMTYpOyAgIC8qIG1vdiBzeW0sIHIxIC4uLiAqLwoJCQkJaXBbMV0gPSAoKHYgPj4gMTYpICYgMHhmZmZmKSArIDB4NjEwMDAwOyAvKiAuLi47IGptcCByMSAqLwojZW5kaWYKCQkJCXBlLT5pbml0ZWQgPSAxOwoJCQl9CgoJCQkvKiByZWxhdGl2ZSBkaXN0YW5jZSB0byB0YXJnZXQgKi8KCQkJdiAtPSBkb3Q7CgkJCS8qIGlmIHRoZSB0YXJnZXQgaXMgdG9vIGZhciBhd2F5Li4uLiAqLwojaWYgZGVmaW5lZCAoX19hcm1fXykgfHwgZGVmaW5lZCAoX19wb3dlcnBjX18pCgkJCWlmICgoaW50KXYgPCAtMHgwMjAwMDAwMCB8fCAoaW50KXYgPj0gMHgwMjAwMDAwMCkKI2VsaWYgZGVmaW5lZCAoX192ODUwZV9fKQoJCQkJaWYgKChFbGYzMl9Td29yZCl2ID4gMHgxZmZmZmYgfHwgKEVsZjMyX1N3b3JkKXYgPCAoRWxmMzJfU3dvcmQpLTB4MjAwMDAwKQojZW5kaWYKCQkJCQkvKiBnbyB2aWEgdGhlIHBsdCAqLwoJCQkJCXYgPSBwbHQgKyBwZS0+b2Zmc2V0IC0gZG90OwoKI2lmIGRlZmluZWQgKF9fdjg1MGVfXykKCQkJaWYgKHYgJiAxKQojZWxzZQoJCQkJaWYgKHYgJiAzKQojZW5kaWYKCQkJCQlyZXQgPSBvYmpfcmVsb2NfZGFuZ2Vyb3VzOwoKCQkJLyogbWVyZ2UgdGhlIG9mZnNldCBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gKi8KI2lmIGRlZmluZWQoX19hcm1fXykKCQkJLyogQ29udmVydCB0byB3b3Jkcy4gKi8KCQkJdiA+Pj0gMjsKCgkJCSpsb2MgPSAoKmxvYyAmIH4weDAwZmZmZmZmKSB8ICgodiArICpsb2MpICYgMHgwMGZmZmZmZik7CiNlbmRpZgojaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKCQkJKmxvYyA9ICgqbG9jICYgfjB4MDNmZmZmZmMpIHwgKHYgJiAweDAzZmZmZmZjKTsKI2VuZGlmCiNpZiBkZWZpbmVkIChfX3Y4NTBlX18pCgkJCS8qIFdlIHdyaXRlIHR3byBzaG9ydHMgaW5zdGVhZCBvZiBhIGxvbmcgYmVjYXVzZSBldmVuIDMyLWJpdCBpbnNucwoJCQkgICBvbmx5IG5lZWQgaGFsZi13b3JkIGFsaWdubWVudCwgYnV0IHRoZSAzMi1iaXQgZGF0YSB3cml0ZSBuZWVkcwoJCQkgICB0byBiZSBsb25nLXdvcmQgYWxpZ25lZC4gICovCgkJCSgodW5zaWduZWQgc2hvcnQgKilsb2MpWzBdID0KCQkJCSgqKHVuc2lnbmVkIHNob3J0ICopbG9jICYgMHhmZmMwKSAvKiBvcGNvZGUgKyByZWcgKi8KCQkJCXwgKCh2ID4+IDE2KSAmIDB4M2YpOyAgICAgICAgICAgICAvKiBvZmZzIGhpZ2ggcGFydCAqLwoJCQkoKHVuc2lnbmVkIHNob3J0ICopbG9jKVsxXSA9CgkJCQkodiAmIDB4ZmZmZik7ICAgICAgICAgICAgICAgICAgICAvKiBvZmZzIGxvdyBwYXJ0ICovCiNlbmRpZgoJCQlicmVhazsKI2VuZGlmIC8qIENPTkZJR19VU0VfUExUX0VOVFJJRVMgKi8KCiNpZiBkZWZpbmVkKENPTkZJR19VU0VfR09UX0VOVFJJRVMpCmJiX3VzZV9nb3Q6CgoJCQlhc3NlcnQoaXN5bSAhPSBOVUxMKTsKCQkJLyogbmVlZHMgYW4gZW50cnkgaW4gdGhlIC5nb3Q6IHNldCBpdCwgb25jZSAqLwoJCQlpZiAoIWlzeW0tPmdvdGVudC5pbml0ZWQpIHsKCQkJCWlzeW0tPmdvdGVudC5pbml0ZWQgPSAxOwoJCQkJKihFbGZXKEFkZHIpICopIChpZmlsZS0+Z290LT5jb250ZW50cyArIGlzeW0tPmdvdGVudC5vZmZzZXQpID0gdjsKCQkJfQoJCQkvKiBtYWtlIHRoZSByZWxvYyB3aXRoX3Jlc3BlY3RfdG9fLmdvdCAqLwojaWYgZGVmaW5lZChfX3NoX18pCgkJCSpsb2MgKz0gaXN5bS0+Z290ZW50Lm9mZnNldCArIHJlbC0+cl9hZGRlbmQ7CiNlbGlmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX21jNjgwMDBfXykKCQkJKmxvYyArPSBpc3ltLT5nb3RlbnQub2Zmc2V0OwojZW5kaWYKCQkJYnJlYWs7CgojZW5kaWYgLyogQ09ORklHX1VTRV9HT1RfRU5UUklFUyAqLwoJfQoKCXJldHVybiByZXQ7Cn0KCgojaWYgZGVmaW5lZChDT05GSUdfVVNFX0xJU1QpCgpzdGF0aWMgaW50IGFyY2hfbGlzdF9hZGQoRWxmVyhSZWxNKSAqcmVsLCBzdHJ1Y3QgYXJjaF9saXN0X2VudHJ5ICoqbGlzdCwKCQkJICBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkKewoJc3RydWN0IGFyY2hfbGlzdF9lbnRyeSAqcGU7CgoJZm9yIChwZSA9ICpsaXN0OyBwZSAhPSBOVUxMOyBwZSA9IHBlLT5uZXh0KSB7CgkJaWYgKHBlLT5hZGRlbmQgPT0gcmVsLT5yX2FkZGVuZCkgewoJCQlicmVhazsKCQl9Cgl9CgoJaWYgKHBlID09IE5VTEwpIHsKCQlwZSA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhcmNoX2xpc3RfZW50cnkpKTsKCQlwZS0+bmV4dCA9ICpsaXN0OwoJCXBlLT5hZGRlbmQgPSByZWwtPnJfYWRkZW5kOwoJCXBlLT5vZmZzZXQgPSBvZmZzZXQ7CgkJcGUtPmluaXRlZCA9IDA7CgkJKmxpc3QgPSBwZTsKCQlyZXR1cm4gc2l6ZTsKCX0KCXJldHVybiAwOwp9CgojZW5kaWYKCiNpZiBkZWZpbmVkKENPTkZJR19VU0VfU0lOR0xFKQoKc3RhdGljIGludCBhcmNoX3NpbmdsZV9pbml0KEVsZlcoUmVsTSkgKnJlbCwgc3RydWN0IGFyY2hfc2luZ2xlX2VudHJ5ICpzaW5nbGUsCgkJCSAgICAgaW50IG9mZnNldCwgaW50IHNpemUpCnsKCWlmIChzaW5nbGUtPmFsbG9jYXRlZCA9PSAwKSB7CgkJc2luZ2xlLT5hbGxvY2F0ZWQgPSAxOwoJCXNpbmdsZS0+b2Zmc2V0ID0gb2Zmc2V0OwoJCXNpbmdsZS0+aW5pdGVkID0gMDsKCQlyZXR1cm4gc2l6ZTsKCX0KCXJldHVybiAwOwp9CgojZW5kaWYKCiNpZiBkZWZpbmVkKENPTkZJR19VU0VfR09UX0VOVFJJRVMpIHx8IGRlZmluZWQoQ09ORklHX1VTRV9QTFRfRU5UUklFUykKCnN0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKmFyY2hfeHNlY3RfaW5pdChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNoYXIgKm5hbWUsCgkJCQkJICAgaW50IG9mZnNldCwgaW50IHNpemUpCnsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqbXlyZWxzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsIG5hbWUpOwoKCWlmIChvZmZzZXQgPT0gMCkgewoJCW9mZnNldCArPSBzaXplOwoJfQoKCWlmIChteXJlbHNlYykgewoJCW9ial9leHRlbmRfc2VjdGlvbihteXJlbHNlYywgb2Zmc2V0KTsKCX0gZWxzZSB7CgkJbXlyZWxzZWMgPSBvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihmLCBuYW1lLAoJCQkJc2l6ZSwgb2Zmc2V0KTsKCQlhc3NlcnQobXlyZWxzZWMpOwoJfQoKCXJldHVybiBteXJlbHNlYzsKfQoKI2VuZGlmCgpzdGF0aWMgdm9pZCBhcmNoX2NyZWF0ZV9nb3Qoc3RydWN0IG9ial9maWxlICpmKQp7CiNpZiBkZWZpbmVkKENPTkZJR19VU0VfR09UX0VOVFJJRVMpIHx8IGRlZmluZWQoQ09ORklHX1VTRV9QTFRfRU5UUklFUykKCXN0cnVjdCBhcmNoX2ZpbGUgKmlmaWxlID0gKHN0cnVjdCBhcmNoX2ZpbGUgKikgZjsKCWludCBpOwojaWYgZGVmaW5lZChDT05GSUdfVVNFX0dPVF9FTlRSSUVTKQoJaW50IGdvdF9vZmZzZXQgPSAwLCBnb3RfbmVlZGVkID0gMCwgZ290X2FsbG9jYXRlOwojZW5kaWYKI2lmIGRlZmluZWQoQ09ORklHX1VTRV9QTFRfRU5UUklFUykKCWludCBwbHRfb2Zmc2V0ID0gMCwgcGx0X25lZWRlZCA9IDAsIHBsdF9hbGxvY2F0ZTsKI2VuZGlmCglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnJlbHNlYywgKnN5bXNlYywgKnN0cnNlYzsKCUVsZlcoUmVsTSkgKnJlbCwgKnJlbGVuZDsKCUVsZlcoU3ltKSAqc3ltdGFiLCAqZXh0c3ltOwoJY29uc3QgY2hhciAqc3RydGFiLCAqbmFtZTsKCXN0cnVjdCBhcmNoX3N5bWJvbCAqaW50c3ltOwoKCWZvciAoaSA9IDA7IGkgPCBmLT5oZWFkZXIuZV9zaG51bTsgKytpKSB7CgkJcmVsc2VjID0gZi0+c2VjdGlvbnNbaV07CgkJaWYgKHJlbHNlYy0+aGVhZGVyLnNoX3R5cGUgIT0gU0hUX1JFTE0pCgkJCWNvbnRpbnVlOwoKCQlzeW1zZWMgPSBmLT5zZWN0aW9uc1tyZWxzZWMtPmhlYWRlci5zaF9saW5rXTsKCQlzdHJzZWMgPSBmLT5zZWN0aW9uc1tzeW1zZWMtPmhlYWRlci5zaF9saW5rXTsKCgkJcmVsID0gKEVsZlcoUmVsTSkgKikgcmVsc2VjLT5jb250ZW50czsKCQlyZWxlbmQgPSByZWwgKyAocmVsc2VjLT5oZWFkZXIuc2hfc2l6ZSAvIHNpemVvZihFbGZXKFJlbE0pKSk7CgkJc3ltdGFiID0gKEVsZlcoU3ltKSAqKSBzeW1zZWMtPmNvbnRlbnRzOwoJCXN0cnRhYiA9IChjb25zdCBjaGFyICopIHN0cnNlYy0+Y29udGVudHM7CgoJCWZvciAoOyByZWwgPCByZWxlbmQ7ICsrcmVsKSB7CgkJCWV4dHN5bSA9ICZzeW10YWJbRUxGMzJfUl9TWU0ocmVsLT5yX2luZm8pXTsKCiNpZiBkZWZpbmVkKENPTkZJR19VU0VfR09UX0VOVFJJRVMpCgkJCWdvdF9hbGxvY2F0ZSA9IDA7CiNlbmRpZgojaWYgZGVmaW5lZChDT05GSUdfVVNFX1BMVF9FTlRSSUVTKQoJCQlwbHRfYWxsb2NhdGUgPSAwOwojZW5kaWYKCgkJCXN3aXRjaCAoRUxGMzJfUl9UWVBFKHJlbC0+cl9pbmZvKSkgewojaWYgZGVmaW5lZChfX2FybV9fKQoJCQkJY2FzZSBSX0FSTV9QQzI0OgoJCQkJY2FzZSBSX0FSTV9QTFQzMjoKCQkJCQlwbHRfYWxsb2NhdGUgPSAxOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgUl9BUk1fR09UT0ZGOgoJCQkJY2FzZSBSX0FSTV9HT1RQQzoKCQkJCQlnb3RfbmVlZGVkID0gMTsKCQkJCQljb250aW51ZTsKCgkJCQljYXNlIFJfQVJNX0dPVDMyOgoJCQkJCWdvdF9hbGxvY2F0ZSA9IDE7CgkJCQkJYnJlYWs7CgojZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQoJCQkJY2FzZSBSXzM4Nl9HT1RQQzoKCQkJCWNhc2UgUl8zODZfR09UT0ZGOgoJCQkJCWdvdF9uZWVkZWQgPSAxOwoJCQkJCWNvbnRpbnVlOwoKCQkJCWNhc2UgUl8zODZfR09UMzI6CgkJCQkJZ290X2FsbG9jYXRlID0gMTsKCQkJCQlicmVhazsKCiNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pCgkJCQljYXNlIFJfUFBDX1JFTDI0OgoJCQkJCXBsdF9hbGxvY2F0ZSA9IDE7CgkJCQkJYnJlYWs7CgojZWxpZiBkZWZpbmVkKF9fbWM2ODAwMF9fKQoJCQkJY2FzZSBSXzY4S19HT1QzMjoKCQkJCQlnb3RfYWxsb2NhdGUgPSAxOwoJCQkJCWJyZWFrOwoKI2lmZGVmIFJfNjhLX0dPVE9GRgoJCQkJY2FzZSBSXzY4S19HT1RPRkY6CgkJCQkJZ290X25lZWRlZCA9IDE7CgkJCQkJY29udGludWU7CiNlbmRpZgoKI2VsaWYgZGVmaW5lZChfX3NoX18pCgkJCQljYXNlIFJfU0hfR09UMzI6CgkJCQkJZ290X2FsbG9jYXRlID0gMTsKCQkJCQlicmVhazsKCgkJCQljYXNlIFJfU0hfR09UUEM6CgkJCQljYXNlIFJfU0hfR09UT0ZGOgoJCQkJCWdvdF9uZWVkZWQgPSAxOwoJCQkJCWNvbnRpbnVlOwoKI2VsaWYgZGVmaW5lZCAoX192ODUwZV9fKQoJCQkJY2FzZSBSX1Y4NTBfMjJfUENSRUw6CgkJCQkJcGx0X25lZWRlZCA9IDE7CgkJCQkJYnJlYWs7CgojZW5kaWYKCQkJCWRlZmF1bHQ6CgkJCQkJY29udGludWU7CgkJCX0KCgkJCWlmIChleHRzeW0tPnN0X25hbWUgIT0gMCkgewoJCQkJbmFtZSA9IHN0cnRhYiArIGV4dHN5bS0+c3RfbmFtZTsKCQkJfSBlbHNlIHsKCQkJCW5hbWUgPSBmLT5zZWN0aW9uc1tleHRzeW0tPnN0X3NobmR4XS0+bmFtZTsKCQkJfQoJCQlpbnRzeW0gPSAoc3RydWN0IGFyY2hfc3ltYm9sICopIG9ial9maW5kX3N5bWJvbChmLCBuYW1lKTsKI2lmIGRlZmluZWQoQ09ORklHX1VTRV9HT1RfRU5UUklFUykKCQkJaWYgKGdvdF9hbGxvY2F0ZSkgewoJCQkJZ290X29mZnNldCArPSBhcmNoX3NpbmdsZV9pbml0KAoJCQkJCQlyZWwsICZpbnRzeW0tPmdvdGVudCwKCQkJCQkJZ290X29mZnNldCwgQ09ORklHX0dPVF9FTlRSWV9TSVpFKTsKCgkJCQlnb3RfbmVlZGVkID0gMTsKCQkJfQojZW5kaWYKI2lmIGRlZmluZWQoQ09ORklHX1VTRV9QTFRfRU5UUklFUykKCQkJaWYgKHBsdF9hbGxvY2F0ZSkgewojaWYgZGVmaW5lZChDT05GSUdfVVNFX1BMVF9MSVNUKQoJCQkJcGx0X29mZnNldCArPSBhcmNoX2xpc3RfYWRkKAoJCQkJCQlyZWwsICZpbnRzeW0tPnBsdGVudCwKCQkJCQkJcGx0X29mZnNldCwgQ09ORklHX1BMVF9FTlRSWV9TSVpFKTsKI2Vsc2UKCQkJCXBsdF9vZmZzZXQgKz0gYXJjaF9zaW5nbGVfaW5pdCgKCQkJCQkJcmVsLCAmaW50c3ltLT5wbHRlbnQsCgkJCQkJCXBsdF9vZmZzZXQsIENPTkZJR19QTFRfRU5UUllfU0laRSk7CiNlbmRpZgoJCQkJcGx0X25lZWRlZCA9IDE7CgkJCX0KI2VuZGlmCgkJfQoJfQoKI2lmIGRlZmluZWQoQ09ORklHX1VTRV9HT1RfRU5UUklFUykKCWlmIChnb3RfbmVlZGVkKSB7CgkJaWZpbGUtPmdvdCA9IGFyY2hfeHNlY3RfaW5pdChmLCAiLmdvdCIsIGdvdF9vZmZzZXQsCgkJCQlDT05GSUdfR09UX0VOVFJZX1NJWkUpOwoJfQojZW5kaWYKCiNpZiBkZWZpbmVkKENPTkZJR19VU0VfUExUX0VOVFJJRVMpCglpZiAocGx0X25lZWRlZCkgewoJCWlmaWxlLT5wbHQgPSBhcmNoX3hzZWN0X2luaXQoZiwgIi5wbHQiLCBwbHRfb2Zmc2V0LAoJCQkJQ09ORklHX1BMVF9FTlRSWV9TSVpFKTsKCX0KI2VuZGlmCgojZW5kaWYgLyogZGVmaW5lZChDT05GSUdfVVNFX0dPVF9FTlRSSUVTKSB8fCBkZWZpbmVkKENPTkZJR19VU0VfUExUX0VOVFJJRVMpICovCn0KCiNpZmRlZiBDT05GSUdfRkVBVFVSRV8yXzRfTU9EVUxFUwpzdGF0aWMgaW50IGFyY2hfaW5pdF9tb2R1bGUoc3RydWN0IG9ial9maWxlICpmLCBzdHJ1Y3QgbmV3X21vZHVsZSAqbW9kKQp7CglyZXR1cm4gMTsKfQojZW5kaWYKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKiBTdGFuZGFyZCBFTEYgaGFzaCBmdW5jdGlvbi4gICovCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBvYmpfZWxmX2hhc2hfbihjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG4pCnsKCXVuc2lnbmVkIGxvbmcgaCA9IDA7Cgl1bnNpZ25lZCBsb25nIGc7Cgl1bnNpZ25lZCBjaGFyIGNoOwoKCXdoaWxlIChuID4gMCkgewoJCWNoID0gKm5hbWUrKzsKCQloID0gKGggPDwgNCkgKyBjaDsKCQlpZiAoKGcgPSAoaCAmIDB4ZjAwMDAwMDApKSAhPSAwKSB7CgkJCWggXj0gZyA+PiAyNDsKCQkJaCAmPSB+ZzsKCQl9CgkJbi0tOwoJfQoJcmV0dXJuIGg7Cn0KCnN0YXRpYyB1bnNpZ25lZCBsb25nIG9ial9lbGZfaGFzaChjb25zdCBjaGFyICpuYW1lKQp7CglyZXR1cm4gb2JqX2VsZl9oYXNoX24obmFtZSwgc3RybGVuKG5hbWUpKTsKfQoKI2lmZGVmIENPTkZJR19GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCi8qIFN0cmluZyBjb21wYXJpc29uIGZvciBub24tY28tdmVyc2lvbmVkIGtlcm5lbCBhbmQgbW9kdWxlLiAgKi8KCnN0YXRpYyBpbnQgbmN2X3N0cmNtcChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiKQp7CglzaXplX3QgYWxlbiA9IHN0cmxlbihhKSwgYmxlbiA9IHN0cmxlbihiKTsKCglpZiAoYmxlbiA9PSBhbGVuICsgMTAgJiYgYlthbGVuXSA9PSAnXycgJiYgYlthbGVuICsgMV0gPT0gJ1InKQoJCXJldHVybiBzdHJuY21wKGEsIGIsIGFsZW4pOwoJZWxzZSBpZiAoYWxlbiA9PSBibGVuICsgMTAgJiYgYVtibGVuXSA9PSAnXycgJiYgYVtibGVuICsgMV0gPT0gJ1InKQoJCXJldHVybiBzdHJuY21wKGEsIGIsIGJsZW4pOwoJZWxzZQoJCXJldHVybiBzdHJjbXAoYSwgYik7Cn0KCi8qIFN0cmluZyBoYXNoaW5nIGZvciBub24tY28tdmVyc2lvbmVkIGtlcm5lbCBhbmQgbW9kdWxlLiAgSGVyZQogICB3ZSBhcmUgc2ltcGx5IGZvcmNlZCB0byBkcm9wIHRoZSBjcmMgZnJvbSB0aGUgaGFzaC4gICovCgpzdGF0aWMgdW5zaWduZWQgbG9uZyBuY3Zfc3ltYm9sX2hhc2goY29uc3QgY2hhciAqc3RyKQp7CglzaXplX3QgbGVuID0gc3RybGVuKHN0cik7CglpZiAobGVuID4gMTAgJiYgc3RyW2xlbiAtIDEwXSA9PSAnXycgJiYgc3RyW2xlbiAtIDldID09ICdSJykKCQlsZW4gLT0gMTA7CglyZXR1cm4gb2JqX2VsZl9oYXNoX24oc3RyLCBsZW4pOwp9CgpzdGF0aWMgdm9pZApvYmpfc2V0X3N5bWJvbF9jb21wYXJlKHN0cnVjdCBvYmpfZmlsZSAqZiwKCQkJCQkgICBpbnQgKCpjbXApIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiksCgkJCQkJICAgdW5zaWduZWQgbG9uZyAoKmhhc2gpIChjb25zdCBjaGFyICopKQp7CglpZiAoY21wKQoJCWYtPnN5bWJvbF9jbXAgPSBjbXA7CglpZiAoaGFzaCkgewoJCXN0cnVjdCBvYmpfc3ltYm9sICp0bXB0YWJbSEFTSF9CVUNLRVRTXSwgKnN5bSwgKm5leHQ7CgkJaW50IGk7CgoJCWYtPnN5bWJvbF9oYXNoID0gaGFzaDsKCgkJbWVtY3B5KHRtcHRhYiwgZi0+c3ltdGFiLCBzaXplb2YodG1wdGFiKSk7CgkJbWVtc2V0KGYtPnN5bXRhYiwgMCwgc2l6ZW9mKGYtPnN5bXRhYikpOwoKCQlmb3IgKGkgPSAwOyBpIDwgSEFTSF9CVUNLRVRTOyArK2kpCgkJCWZvciAoc3ltID0gdG1wdGFiW2ldOyBzeW07IHN5bSA9IG5leHQpIHsKCQkJCXVuc2lnbmVkIGxvbmcgaCA9IGhhc2goc3ltLT5uYW1lKSAlIEhBU0hfQlVDS0VUUzsKCQkJCW5leHQgPSBzeW0tPm5leHQ7CgkJCQlzeW0tPm5leHQgPSBmLT5zeW10YWJbaF07CgkJCQlmLT5zeW10YWJbaF0gPSBzeW07CgkJCX0KCX0KfQoKI2VuZGlmCQkJCQkJCS8qIENPTkZJR19GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HICovCgpzdGF0aWMgc3RydWN0IG9ial9zeW1ib2wgKgpvYmpfYWRkX3N5bWJvbChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKm5hbWUsCgkJCQkJCQkJICB1bnNpZ25lZCBsb25nIHN5bWlkeCwgaW50IGluZm8sCgkJCQkJCQkJICBpbnQgc2VjaWR4LCBFbGZXKEFkZHIpIHZhbHVlLAoJCQkJCQkJCSAgdW5zaWduZWQgbG9uZyBzaXplKQp7CglzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOwoJdW5zaWduZWQgbG9uZyBoYXNoID0gZi0+c3ltYm9sX2hhc2gobmFtZSkgJSBIQVNIX0JVQ0tFVFM7CglpbnQgbl90eXBlID0gRUxGVyhTVF9UWVBFKSAoaW5mbyk7CglpbnQgbl9iaW5kaW5nID0gRUxGVyhTVF9CSU5EKSAoaW5mbyk7CgoJZm9yIChzeW0gPSBmLT5zeW10YWJbaGFzaF07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQoJCWlmIChmLT5zeW1ib2xfY21wKHN5bS0+bmFtZSwgbmFtZSkgPT0gMCkgewoJCQlpbnQgb19zZWNpZHggPSBzeW0tPnNlY2lkeDsKCQkJaW50IG9faW5mbyA9IHN5bS0+aW5mbzsKCQkJaW50IG9fdHlwZSA9IEVMRlcoU1RfVFlQRSkgKG9faW5mbyk7CgkJCWludCBvX2JpbmRpbmcgPSBFTEZXKFNUX0JJTkQpIChvX2luZm8pOwoKCQkJLyogQSByZWRlZmluaXRpb24hICBJcyBpdCBsZWdhbD8gICovCgoJCQlpZiAoc2VjaWR4ID09IFNITl9VTkRFRikKCQkJCXJldHVybiBzeW07CgkJCWVsc2UgaWYgKG9fc2VjaWR4ID09IFNITl9VTkRFRikKCQkJCWdvdG8gZm91bmQ7CgkJCWVsc2UgaWYgKG5fYmluZGluZyA9PSBTVEJfR0xPQkFMICYmIG9fYmluZGluZyA9PSBTVEJfTE9DQUwpIHsKCQkJCS8qIENvcGUgd2l0aCBsb2NhbCBhbmQgZ2xvYmFsIHN5bWJvbHMgb2YgdGhlIHNhbWUgbmFtZQoJCQkJICAgaW4gdGhlIHNhbWUgb2JqZWN0IGZpbGUsIGFzIG1pZ2h0IGhhdmUgYmVlbiBjcmVhdGVkCgkJCQkgICBieSBsZCAtci4gIFRoZSBvbmx5IHJlYXNvbiBsb2NhbHMgYXJlIG5vdyBzZWVuIGF0IHRoaXMKCQkJCSAgIGxldmVsIGF0IGFsbCBpcyBzbyB0aGF0IHdlIGNhbiBkbyBzZW1pLXNlbnNpYmxlIHRoaW5ncwoJCQkJICAgd2l0aCBwYXJhbWV0ZXJzLiAgKi8KCgkJCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqbnN5bSwgKipwOwoKCQkJCW5zeW0gPSBhcmNoX25ld19zeW1ib2woKTsKCQkJCW5zeW0tPm5leHQgPSBzeW0tPm5leHQ7CgkJCQluc3ltLT5rc3ltaWR4ID0gLTE7CgoJCQkJLyogRXhjaXNlIHRoZSBvbGQgKGxvY2FsKSBzeW1ib2wgZnJvbSB0aGUgaGFzaCBjaGFpbi4gICovCgkJCQlmb3IgKHAgPSAmZi0+c3ltdGFiW2hhc2hdOyAqcCAhPSBzeW07IHAgPSAmKCpwKS0+bmV4dCkKCQkJCQljb250aW51ZTsKCQkJCSpwID0gc3ltID0gbnN5bTsKCQkJCWdvdG8gZm91bmQ7CgkJCX0gZWxzZSBpZiAobl9iaW5kaW5nID09IFNUQl9MT0NBTCkgewoJCQkJLyogQW5vdGhlciBzeW1ib2wgb2YgdGhlIHNhbWUgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuCgkJCQkgICBKdXN0IGFkZCB0aGlzIHRvIHRoZSBsb2NhbCB0YWJsZS4gICovCgkJCQlzeW0gPSBhcmNoX25ld19zeW1ib2woKTsKCQkJCXN5bS0+bmV4dCA9IE5VTEw7CgkJCQlzeW0tPmtzeW1pZHggPSAtMTsKCQkJCWYtPmxvY2FsX3N5bXRhYltzeW1pZHhdID0gc3ltOwoJCQkJZ290byBmb3VuZDsKCQkJfSBlbHNlIGlmIChuX2JpbmRpbmcgPT0gU1RCX1dFQUspCgkJCQlyZXR1cm4gc3ltOwoJCQllbHNlIGlmIChvX2JpbmRpbmcgPT0gU1RCX1dFQUspCgkJCQlnb3RvIGZvdW5kOwoJCQkvKiBEb24ndCB1bmlmeSBDT01NT04gc3ltYm9scyB3aXRoIG9iamVjdCB0eXBlcyB0aGUgcHJvZ3JhbW1lcgoJCQkgICBkb2Vzbid0IGV4cGVjdC4gICovCgkJCWVsc2UgaWYgKHNlY2lkeCA9PSBTSE5fQ09NTU9OCgkJCQkJJiYgKG9fdHlwZSA9PSBTVFRfTk9UWVBFIHx8IG9fdHlwZSA9PSBTVFRfT0JKRUNUKSkKCQkJCXJldHVybiBzeW07CgkJCWVsc2UgaWYgKG9fc2VjaWR4ID09IFNITl9DT01NT04KCQkJCQkmJiAobl90eXBlID09IFNUVF9OT1RZUEUgfHwgbl90eXBlID09IFNUVF9PQkpFQ1QpKQoJCQkJZ290byBmb3VuZDsKCQkJZWxzZSB7CgkJCQkvKiBEb24ndCByZXBvcnQgYW4gZXJyb3IgaWYgdGhlIHN5bWJvbCBpcyBjb21pbmcgZnJvbQoJCQkJICAgdGhlIGtlcm5lbCBvciBzb21lIGV4dGVybmFsIG1vZHVsZS4gICovCgkJCQlpZiAoc2VjaWR4IDw9IFNITl9ISVJFU0VSVkUpCgkJCQkJYmJfZXJyb3JfbXNnKCIlcyBtdWx0aXBseSBkZWZpbmVkIiwgbmFtZSk7CgkJCQlyZXR1cm4gc3ltOwoJCQl9CgkJfQoKCS8qIENvbXBsZXRlbHkgbmV3IHN5bWJvbC4gICovCglzeW0gPSBhcmNoX25ld19zeW1ib2woKTsKCXN5bS0+bmV4dCA9IGYtPnN5bXRhYltoYXNoXTsKCWYtPnN5bXRhYltoYXNoXSA9IHN5bTsKCXN5bS0+a3N5bWlkeCA9IC0xOwoKCWlmIChFTEZXKFNUX0JJTkQpKGluZm8pID09IFNUQl9MT0NBTCAmJiBzeW1pZHggIT0gLTEpIHsKCQlpZiAoc3ltaWR4ID49IGYtPmxvY2FsX3N5bXRhYl9zaXplKQoJCQliYl9lcnJvcl9tc2coImxvY2FsIHN5bWJvbCAlcyB3aXRoIGluZGV4ICVsZCBleGNlZWRzIGxvY2FsX3N5bXRhYl9zaXplICVsZCIsCgkJCQkJbmFtZSwgKGxvbmcpIHN5bWlkeCwgKGxvbmcpIGYtPmxvY2FsX3N5bXRhYl9zaXplKTsKCQllbHNlCgkJCWYtPmxvY2FsX3N5bXRhYltzeW1pZHhdID0gc3ltOwoJfQoKZm91bmQ6CglzeW0tPm5hbWUgPSBuYW1lOwoJc3ltLT52YWx1ZSA9IHZhbHVlOwoJc3ltLT5zaXplID0gc2l6ZTsKCXN5bS0+c2VjaWR4ID0gc2VjaWR4OwoJc3ltLT5pbmZvID0gaW5mbzsKCglyZXR1cm4gc3ltOwp9CgpzdGF0aWMgc3RydWN0IG9ial9zeW1ib2wgKgpvYmpfZmluZF9zeW1ib2woc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICpuYW1lKQp7CglzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOwoJdW5zaWduZWQgbG9uZyBoYXNoID0gZi0+c3ltYm9sX2hhc2gobmFtZSkgJSBIQVNIX0JVQ0tFVFM7CgoJZm9yIChzeW0gPSBmLT5zeW10YWJbaGFzaF07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQoJCWlmIChmLT5zeW1ib2xfY21wKHN5bS0+bmFtZSwgbmFtZSkgPT0gMCkKCQkJcmV0dXJuIHN5bTsKCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIEVsZlcoQWRkcikKCW9ial9zeW1ib2xfZmluYWxfdmFsdWUoc3RydWN0IG9ial9maWxlICogZiwgc3RydWN0IG9ial9zeW1ib2wgKiBzeW0pCnsKCWlmIChzeW0pIHsKCQlpZiAoc3ltLT5zZWNpZHggPj0gU0hOX0xPUkVTRVJWRSkKCQkJcmV0dXJuIHN5bS0+dmFsdWU7CgoJCXJldHVybiBzeW0tPnZhbHVlICsgZi0+c2VjdGlvbnNbc3ltLT5zZWNpZHhdLT5oZWFkZXIuc2hfYWRkcjsKCX0gZWxzZSB7CgkJLyogQXMgYSBzcGVjaWFsIGNhc2UsIGEgTlVMTCBzeW0gaGFzIHZhbHVlIHplcm8uICAqLwoJCXJldHVybiAwOwoJfQp9CgpzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICpvYmpfZmluZF9zZWN0aW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqbmFtZSkKewoJaW50IGksIG4gPSBmLT5oZWFkZXIuZV9zaG51bTsKCglmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQoJCWlmIChzdHJjbXAoZi0+c2VjdGlvbnNbaV0tPm5hbWUsIG5hbWUpID09IDApCgkJCXJldHVybiBmLT5zZWN0aW9uc1tpXTsKCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIGludCBvYmpfbG9hZF9vcmRlcl9wcmlvKHN0cnVjdCBvYmpfc2VjdGlvbiAqYSkKewoJdW5zaWduZWQgbG9uZyBhZiwgYWM7CgoJYWYgPSBhLT5oZWFkZXIuc2hfZmxhZ3M7CgoJYWMgPSAwOwoJaWYgKGEtPm5hbWVbMF0gIT0gJy4nIHx8IHN0cmxlbihhLT5uYW1lKSAhPSAxMCB8fAoJCQlzdHJjbXAoYS0+bmFtZSArIDUsICIuaW5pdCIpKQoJCWFjIHw9IDMyOwoJaWYgKGFmICYgU0hGX0FMTE9DKQoJCWFjIHw9IDE2OwoJaWYgKCEoYWYgJiBTSEZfV1JJVEUpKQoJCWFjIHw9IDg7CglpZiAoYWYgJiBTSEZfRVhFQ0lOU1RSKQoJCWFjIHw9IDQ7CglpZiAoYS0+aGVhZGVyLnNoX3R5cGUgIT0gU0hUX05PQklUUykKCQlhYyB8PSAyOwoKCXJldHVybiBhYzsKfQoKc3RhdGljIHZvaWQKb2JqX2luc2VydF9zZWN0aW9uX2xvYWRfb3JkZXIoc3RydWN0IG9ial9maWxlICpmLCBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYykKewoJc3RydWN0IG9ial9zZWN0aW9uICoqcDsKCWludCBwcmlvID0gb2JqX2xvYWRfb3JkZXJfcHJpbyhzZWMpOwoJZm9yIChwID0gZi0+bG9hZF9vcmRlcl9zZWFyY2hfc3RhcnQ7ICpwOyBwID0gJigqcCktPmxvYWRfbmV4dCkKCQlpZiAob2JqX2xvYWRfb3JkZXJfcHJpbygqcCkgPCBwcmlvKQoJCQlicmVhazsKCXNlYy0+bG9hZF9uZXh0ID0gKnA7CgkqcCA9IHNlYzsKfQoKc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb24oc3RydWN0IG9ial9maWxlICpmLAoJCQkJCQkJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCgkJCQkJCQkJCQkJICAgdW5zaWduZWQgbG9uZyBhbGlnbiwKCQkJCQkJCQkJCQkgICB1bnNpZ25lZCBsb25nIHNpemUpCnsKCWludCBuZXdpZHggPSBmLT5oZWFkZXIuZV9zaG51bSsrOwoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CgoJZi0+c2VjdGlvbnMgPSB4cmVhbGxvYyhmLT5zZWN0aW9ucywgKG5ld2lkeCArIDEpICogc2l6ZW9mKHNlYykpOwoJZi0+c2VjdGlvbnNbbmV3aWR4XSA9IHNlYyA9IGFyY2hfbmV3X3NlY3Rpb24oKTsKCgltZW1zZXQoc2VjLCAwLCBzaXplb2YoKnNlYykpOwoJc2VjLT5oZWFkZXIuc2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKCXNlYy0+aGVhZGVyLnNoX2ZsYWdzID0gU0hGX1dSSVRFIHwgU0hGX0FMTE9DOwoJc2VjLT5oZWFkZXIuc2hfc2l6ZSA9IHNpemU7CglzZWMtPmhlYWRlci5zaF9hZGRyYWxpZ24gPSBhbGlnbjsKCXNlYy0+bmFtZSA9IG5hbWU7CglzZWMtPmlkeCA9IG5ld2lkeDsKCWlmIChzaXplKQoJCXNlYy0+Y29udGVudHMgPSB4bWFsbG9jKHNpemUpOwoKCW9ial9pbnNlcnRfc2VjdGlvbl9sb2FkX29yZGVyKGYsIHNlYyk7CgoJcmV0dXJuIHNlYzsKfQoKc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb25fZmlyc3Qoc3RydWN0IG9ial9maWxlICpmLAoJCQkJCQkJCQkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCgkJCQkJCQkJCQkJCQkgdW5zaWduZWQgbG9uZyBhbGlnbiwKCQkJCQkJCQkJCQkJCSB1bnNpZ25lZCBsb25nIHNpemUpCnsKCWludCBuZXdpZHggPSBmLT5oZWFkZXIuZV9zaG51bSsrOwoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CgoJZi0+c2VjdGlvbnMgPSB4cmVhbGxvYyhmLT5zZWN0aW9ucywgKG5ld2lkeCArIDEpICogc2l6ZW9mKHNlYykpOwoJZi0+c2VjdGlvbnNbbmV3aWR4XSA9IHNlYyA9IGFyY2hfbmV3X3NlY3Rpb24oKTsKCgltZW1zZXQoc2VjLCAwLCBzaXplb2YoKnNlYykpOwoJc2VjLT5oZWFkZXIuc2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKCXNlYy0+aGVhZGVyLnNoX2ZsYWdzID0gU0hGX1dSSVRFIHwgU0hGX0FMTE9DOwoJc2VjLT5oZWFkZXIuc2hfc2l6ZSA9IHNpemU7CglzZWMtPmhlYWRlci5zaF9hZGRyYWxpZ24gPSBhbGlnbjsKCXNlYy0+bmFtZSA9IG5hbWU7CglzZWMtPmlkeCA9IG5ld2lkeDsKCWlmIChzaXplKQoJCXNlYy0+Y29udGVudHMgPSB4bWFsbG9jKHNpemUpOwoKCXNlYy0+bG9hZF9uZXh0ID0gZi0+bG9hZF9vcmRlcjsKCWYtPmxvYWRfb3JkZXIgPSBzZWM7CglpZiAoZi0+bG9hZF9vcmRlcl9zZWFyY2hfc3RhcnQgPT0gJmYtPmxvYWRfb3JkZXIpCgkJZi0+bG9hZF9vcmRlcl9zZWFyY2hfc3RhcnQgPSAmc2VjLT5sb2FkX25leHQ7CgoJcmV0dXJuIHNlYzsKfQoKc3RhdGljIHZvaWQgKm9ial9leHRlbmRfc2VjdGlvbihzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYywgdW5zaWduZWQgbG9uZyBtb3JlKQp7Cgl1bnNpZ25lZCBsb25nIG9sZHNpemUgPSBzZWMtPmhlYWRlci5zaF9zaXplOwoJaWYgKG1vcmUpIHsKCQlzZWMtPmNvbnRlbnRzID0geHJlYWxsb2Moc2VjLT5jb250ZW50cywgc2VjLT5oZWFkZXIuc2hfc2l6ZSArPSBtb3JlKTsKCX0KCXJldHVybiBzZWMtPmNvbnRlbnRzICsgb2xkc2l6ZTsKfQoKCi8qIENvbmRpdGlvbmFsbHkgYWRkIHRoZSBzeW1ib2xzIGZyb20gdGhlIGdpdmVuIHN5bWJvbCBzZXQgdG8gdGhlCiAgIG5ldyBtb2R1bGUuICAqLwoKc3RhdGljIGludAphZGRfc3ltYm9sc19mcm9tKAoJCQkJIHN0cnVjdCBvYmpfZmlsZSAqZiwKCQkJCSBpbnQgaWR4LCBzdHJ1Y3QgbmV3X21vZHVsZV9zeW1ib2wgKnN5bXMsIHNpemVfdCBuc3ltcykKewoJc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sICpzOwoJc2l6ZV90IGk7CglpbnQgdXNlZCA9IDA7CiNpZmRlZiBTWU1CT0xfUFJFRklYCgljaGFyICpuYW1lX2J1ZiA9IDA7CglzaXplX3QgbmFtZV9hbGxvY2VkX3NpemUgPSAwOwojZW5kaWYKI2lmZGVmIENPTkZJR19GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFCglpbnQgZ3BsOwoKCWdwbCA9IG9ial9ncGxfbGljZW5zZShmLCBOVUxMKSA9PSAwOwojZW5kaWYKCWZvciAoaSA9IDAsIHMgPSBzeW1zOyBpIDwgbnN5bXM7ICsraSwgKytzKSB7CgkJLyogT25seSBhZGQgc3ltYm9scyB0aGF0IGFyZSBhbHJlYWR5IG1hcmtlZCBleHRlcm5hbC4KCQkgICBJZiB3ZSBvdmVycmlkZSBsb2NhbHMgd2UgbWF5IGNhdXNlIHByb2JsZW1zIGZvcgoJCSAgIGFyZ3VtZW50IGluaXRpYWxpemF0aW9uLiAgV2Ugd2lsbCBhbHNvIGNyZWF0ZSBhIGZhbHNlCgkJICAgZGVwZW5kZW5jeSBvbiB0aGUgbW9kdWxlLiAgKi8KCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOwoJCWNoYXIgKm5hbWU7CgoJCS8qIEdQTCBsaWNlbnNlZCBtb2R1bGVzIGNhbiB1c2Ugc3ltYm9scyBleHBvcnRlZCB3aXRoCgkJICogRVhQT1JUX1NZTUJPTF9HUEwsIHNvIGlnbm9yZSBhbnkgR1BMT05MWV8gcHJlZml4IG9uIHRoZQoJCSAqIGV4cG9ydGVkIG5hbWVzLiAgTm9uLUdQTCBtb2R1bGVzIG5ldmVyIHNlZSBhbnkgR1BMT05MWV8KCQkgKiBzeW1ib2xzIHNvIHRoZXkgY2Fubm90IGZ1ZGdlIGl0IGJ5IGFkZGluZyB0aGUgcHJlZml4IG9uCgkJICogdGhlaXIgcmVmZXJlbmNlcy4KCQkgKi8KCQlpZiAoc3RybmNtcCgoY2hhciAqKXMtPm5hbWUsICJHUExPTkxZXyIsIDgpID09IDApIHsKI2lmZGVmIENPTkZJR19GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFCgkJCWlmIChncGwpCgkJCQkoKGNoYXIgKilzLT5uYW1lKSArPSA4OwoJCQllbHNlCiNlbmRpZgoJCQkJY29udGludWU7CgkJfQoJCW5hbWUgPSAoY2hhciAqKXMtPm5hbWU7CgojaWZkZWYgU1lNQk9MX1BSRUZJWAoJCS8qIFByZXBlbmQgU1lNQk9MX1BSRUZJWCB0byB0aGUgc3ltYm9sJ3MgbmFtZSAodGhlCgkJICAga2VybmVsIGV4cG9ydHMgYEMgbmFtZXMnLCBidXQgbW9kdWxlIG9iamVjdCBmaWxlcwoJCSAgIHJlZmVyZW5jZSBgbGlua2VyIG5hbWVzJykuICAqLwoJCXNpemVfdCBleHRyYSA9IHNpemVvZiBTWU1CT0xfUFJFRklYOwoJCXNpemVfdCBuYW1lX3NpemUgPSBzdHJsZW4gKG5hbWUpICsgZXh0cmE7CgkJaWYgKG5hbWVfc2l6ZSA+IG5hbWVfYWxsb2NlZF9zaXplKSB7CgkJCW5hbWVfYWxsb2NlZF9zaXplID0gbmFtZV9zaXplICogMjsKCQkJbmFtZV9idWYgPSBhbGxvY2EgKG5hbWVfYWxsb2NlZF9zaXplKTsKCQl9CgkJc3RyY3B5IChuYW1lX2J1ZiwgU1lNQk9MX1BSRUZJWCk7CgkJc3RyY3B5IChuYW1lX2J1ZiArIGV4dHJhIC0gMSwgbmFtZSk7CgkJbmFtZSA9IG5hbWVfYnVmOwojZW5kaWYgLyogU1lNQk9MX1BSRUZJWCAqLwoKCQlzeW0gPSBvYmpfZmluZF9zeW1ib2woZiwgbmFtZSk7CgkJaWYgKHN5bSAmJiAhKEVMRlcoU1RfQklORCkgKHN5bS0+aW5mbykgPT0gU1RCX0xPQ0FMKSkgewojaWZkZWYgU1lNQk9MX1BSRUZJWAoJCQkvKiBQdXQgTkFNRV9CVUYgaW50byBtb3JlIHBlcm1hbmVudCBzdG9yYWdlLiAgKi8KCQkJbmFtZSA9IHhtYWxsb2MgKG5hbWVfc2l6ZSk7CgkJCXN0cmNweSAobmFtZSwgbmFtZV9idWYpOwojZW5kaWYKCQkJc3ltID0gb2JqX2FkZF9zeW1ib2woZiwgbmFtZSwgLTEsCgkJCQkJRUxGVyhTVF9JTkZPKSAoU1RCX0dMT0JBTCwKCQkJCQkJU1RUX05PVFlQRSksCgkJCQkJaWR4LCBzLT52YWx1ZSwgMCk7CgkJCS8qIERpZCBvdXIgc3ltYm9sIGp1c3QgZ2V0IGluc3RhbGxlZD8gIElmIHNvLCBtYXJrIHRoZQoJCQkgICBtb2R1bGUgYXMgInVzZWQiLiAgKi8KCQkJaWYgKHN5bS0+c2VjaWR4ID09IGlkeCkKCQkJCXVzZWQgPSAxOwoJCX0KCX0KCglyZXR1cm4gdXNlZDsKfQoKc3RhdGljIHZvaWQgYWRkX2tlcm5lbF9zeW1ib2xzKHN0cnVjdCBvYmpfZmlsZSAqZikKewoJc3RydWN0IGV4dGVybmFsX21vZHVsZSAqbTsKCWludCBpLCBudXNlZCA9IDA7CgoJLyogQWRkIG1vZHVsZSBzeW1ib2xzIGZpcnN0LiAgKi8KCglmb3IgKGkgPSAwLCBtID0gZXh0X21vZHVsZXM7IGkgPCBuX2V4dF9tb2R1bGVzOyArK2ksICsrbSkKCQlpZiAobS0+bnN5bXMKCQkJCSYmIGFkZF9zeW1ib2xzX2Zyb20oZiwgU0hOX0hJUkVTRVJWRSArIDIgKyBpLCBtLT5zeW1zLAoJCQkJCW0tPm5zeW1zKSkgbS0+dXNlZCA9IDEsICsrbnVzZWQ7CgoJbl9leHRfbW9kdWxlc191c2VkID0gbnVzZWQ7CgoJLyogQW5kIGZpbmFsbHkgdGhlIHN5bWJvbHMgZnJvbSB0aGUga2VybmVsIHByb3Blci4gICovCgoJaWYgKG5rc3ltcykKCQlhZGRfc3ltYm9sc19mcm9tKGYsIFNITl9ISVJFU0VSVkUgKyAxLCBrc3ltcywgbmtzeW1zKTsKfQoKc3RhdGljIGNoYXIgKmdldF9tb2RpbmZvX3ZhbHVlKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqa2V5KQp7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKCWNoYXIgKnAsICp2LCAqbiwgKmVwOwoJc2l6ZV90IGtsZW4gPSBzdHJsZW4oa2V5KTsKCglzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICIubW9kaW5mbyIpOwoJaWYgKHNlYyA9PSBOVUxMKQoJCXJldHVybiBOVUxMOwoJcCA9IHNlYy0+Y29udGVudHM7CgllcCA9IHAgKyBzZWMtPmhlYWRlci5zaF9zaXplOwoJd2hpbGUgKHAgPCBlcCkgewoJCXYgPSBzdHJjaHIocCwgJz0nKTsKCQluID0gc3RyY2hyKHAsICdcMCcpOwoJCWlmICh2KSB7CgkJCWlmIChwICsga2xlbiA9PSB2ICYmIHN0cm5jbXAocCwga2V5LCBrbGVuKSA9PSAwKQoJCQkJcmV0dXJuIHYgKyAxOwoJCX0gZWxzZSB7CgkJCWlmIChwICsga2xlbiA9PSBuICYmIHN0cmNtcChwLCBrZXkpID09IDApCgkJCQlyZXR1cm4gbjsKCQl9CgkJcCA9IG4gKyAxOwoJfQoKCXJldHVybiBOVUxMOwp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLyogRnVuY3Rpb25zIHJlbGF0aW5nIHRvIG1vZHVsZSBsb2FkaW5nIGluIHByZSAyLjEga2VybmVscy4gICovCgpzdGF0aWMgaW50Cm9sZF9wcm9jZXNzX21vZHVsZV9hcmd1bWVudHMoc3RydWN0IG9ial9maWxlICpmLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCXdoaWxlIChhcmdjID4gMCkgewoJCWNoYXIgKnAsICpxOwoJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CgkJaW50ICpsb2M7CgoJCXAgPSAqYXJndjsKCQlpZiAoKHEgPSBzdHJjaHIocCwgJz0nKSkgPT0gTlVMTCkgewoJCQlhcmdjLS07CgkJCWNvbnRpbnVlOwoJCX0KCQkqcSsrID0gJ1wwJzsKCgkJc3ltID0gb2JqX2ZpbmRfc3ltYm9sKGYsIHApOwoKCQkvKiBBbHNvIGNoZWNrIHRoYXQgdGhlIHBhcmFtZXRlciB3YXMgbm90IHJlc29sdmVkIGZyb20gdGhlIGtlcm5lbC4gICovCgkJaWYgKHN5bSA9PSBOVUxMIHx8IHN5bS0+c2VjaWR4ID4gU0hOX0hJUkVTRVJWRSkgewoJCQliYl9lcnJvcl9tc2coInN5bWJvbCBmb3IgcGFyYW1ldGVyICVzIG5vdCBmb3VuZCIsIHApOwoJCQlyZXR1cm4gMDsKCQl9CgoJCWxvYyA9IChpbnQgKikgKGYtPnNlY3Rpb25zW3N5bS0+c2VjaWR4XS0+Y29udGVudHMgKyBzeW0tPnZhbHVlKTsKCgkJLyogRG8gQyBxdW90aW5nIGlmIHdlIGJlZ2luIHdpdGggYSAiLiAgKi8KCQlpZiAoKnEgPT0gJyInKSB7CgkJCWNoYXIgKnIsICpzdHI7CgoJCQlzdHIgPSBhbGxvY2Eoc3RybGVuKHEpKTsKCQkJZm9yIChyID0gc3RyLCBxKys7ICpxICE9ICciJzsgKytxLCArK3IpIHsKCQkJCWlmICgqcSA9PSAnXDAnKSB7CgkJCQkJYmJfZXJyb3JfbXNnKCJpbXByb3Blcmx5IHRlcm1pbmF0ZWQgc3RyaW5nIGFyZ3VtZW50IGZvciAlcyIsIHApOwoJCQkJCXJldHVybiAwOwoJCQkJfSBlbHNlIGlmICgqcSA9PSAnXFwnKQoJCQkJCXN3aXRjaCAoKisrcSkgewoJCQkJCQljYXNlICdhJzoKCQkJCQkJCSpyID0gJ1xhJzsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdiJzoKCQkJCQkJCSpyID0gJ1xiJzsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdlJzoKCQkJCQkJCSpyID0gJ1wwMzMnOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ2YnOgoJCQkJCQkJKnIgPSAnXGYnOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ24nOgoJCQkJCQkJKnIgPSAnXG4nOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ3InOgoJCQkJCQkJKnIgPSAnXHInOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ3QnOgoJCQkJCQkJKnIgPSAnXHQnOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICcwJzoKCQkJCQkJY2FzZSAnMSc6CgkJCQkJCWNhc2UgJzInOgoJCQkJCQljYXNlICczJzoKCQkJCQkJY2FzZSAnNCc6CgkJCQkJCWNhc2UgJzUnOgoJCQkJCQljYXNlICc2JzoKCQkJCQkJY2FzZSAnNyc6CgkJCQkJCQl7CgkJCQkJCQkJaW50IGMgPSAqcSAtICcwJzsKCQkJCQkJCQlpZiAocVsxXSA+PSAnMCcgJiYgcVsxXSA8PSAnNycpIHsKCQkJCQkJCQkJYyA9IChjICogOCkgKyAqKytxIC0gJzAnOwoJCQkJCQkJCQlpZiAocVsxXSA+PSAnMCcgJiYgcVsxXSA8PSAnNycpCgkJCQkJCQkJCQljID0gKGMgKiA4KSArICorK3EgLSAnMCc7CgkJCQkJCQkJfQoJCQkJCQkJCSpyID0gYzsKCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoKCQkJCQkJZGVmYXVsdDoKCQkJCQkJCSpyID0gKnE7CgkJCQkJCQlicmVhazsKCQkJCQl9IGVsc2UKCQkJCQkJKnIgPSAqcTsKCQkJfQoJCQkqciA9ICdcMCc7CgkJCW9ial9zdHJpbmdfcGF0Y2goZiwgc3ltLT5zZWNpZHgsIHN5bS0+dmFsdWUsIHN0cik7CgkJfSBlbHNlIGlmICgqcSA+PSAnMCcgJiYgKnEgPD0gJzknKSB7CgkJCWRvCgkJCQkqbG9jKysgPSBzdHJ0b3VsKHEsICZxLCAwKTsKCQkJd2hpbGUgKCpxKysgPT0gJywnKTsKCQl9IGVsc2UgewoJCQljaGFyICpjb250ZW50cyA9IGYtPnNlY3Rpb25zW3N5bS0+c2VjaWR4XS0+Y29udGVudHM7CgkJCWNoYXIgKm15bG9jID0gY29udGVudHMgKyBzeW0tPnZhbHVlOwoJCQljaGFyICpyOwkJCS8qIFRvIHNlYXJjaCBmb3IgY29tbWFzICovCgoJCQkvKiBCcmVhayB0aGUgc3RyaW5nIHdpdGggY29tYXMgKi8KCQkJd2hpbGUgKChyID0gc3RyY2hyKHEsICcsJykpICE9IChjaGFyICopIE5VTEwpIHsKCQkJCSpyKysgPSAnXDAnOwoJCQkJb2JqX3N0cmluZ19wYXRjaChmLCBzeW0tPnNlY2lkeCwgbXlsb2MgLSBjb250ZW50cywgcSk7CgkJCQlteWxvYyArPSBzaXplb2YoY2hhciAqKTsKCQkJCXEgPSByOwoJCQl9CgoJCQkvKiBsYXN0IHBhcnQgKi8KCQkJb2JqX3N0cmluZ19wYXRjaChmLCBzeW0tPnNlY2lkeCwgbXlsb2MgLSBjb250ZW50cywgcSk7CgkJfQoKCQlhcmdjLS0sIGFyZ3YrKzsKCX0KCglyZXR1cm4gMTsKfQoKI2lmZGVmIENPTkZJR19GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCnN0YXRpYyBpbnQgb2xkX2lzX21vZHVsZV9jaGVja3N1bW1lZChzdHJ1Y3Qgb2JqX2ZpbGUgKmYpCnsKCXJldHVybiBvYmpfZmluZF9zeW1ib2woZiwgIlVzaW5nX1ZlcnNpb25zIikgIT0gTlVMTDsKfQovKiBHZXQgdGhlIG1vZHVsZSdzIGtlcm5lbCB2ZXJzaW9uIGluIHRoZSBjYW5vbmljYWwgaW50ZWdlciBmb3JtLiAgKi8KCnN0YXRpYyBpbnQKb2xkX2dldF9tb2R1bGVfdmVyc2lvbihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNoYXIgc3RyW1NUUlZFUlNJT05MRU5dKQp7CglzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOwoJY2hhciAqcCwgKnE7CglpbnQgYSwgYiwgYzsKCglzeW0gPSBvYmpfZmluZF9zeW1ib2woZiwgImtlcm5lbF92ZXJzaW9uIik7CglpZiAoc3ltID09IE5VTEwpCgkJcmV0dXJuIC0xOwoKCXAgPSBmLT5zZWN0aW9uc1tzeW0tPnNlY2lkeF0tPmNvbnRlbnRzICsgc3ltLT52YWx1ZTsKCXNhZmVfc3RybmNweShzdHIsIHAsIFNUUlZFUlNJT05MRU4pOwoKCWEgPSBzdHJ0b3VsKHAsICZwLCAxMCk7CglpZiAoKnAgIT0gJy4nKQoJCXJldHVybiAtMTsKCWIgPSBzdHJ0b3VsKHAgKyAxLCAmcCwgMTApOwoJaWYgKCpwICE9ICcuJykKCQlyZXR1cm4gLTE7CgljID0gc3RydG91bChwICsgMSwgJnEsIDEwKTsKCWlmIChwICsgMSA9PSBxKQoJCXJldHVybiAtMTsKCglyZXR1cm4gYSA8PCAxNiB8IGIgPDwgOCB8IGM7Cn0KCiNlbmRpZiAgIC8qIENPTkZJR19GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HICovCgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfMl8yX01PRFVMRVMKCi8qIEZldGNoIGFsbCB0aGUgc3ltYm9scyBhbmQgZGl2dnkgdGhlbSB1cCBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIG1vZHVsZXMuICAqLwoKc3RhdGljIGludCBvbGRfZ2V0X2tlcm5lbF9zeW1ib2xzKGNvbnN0IGNoYXIgKm1fbmFtZSkKewoJc3RydWN0IG9sZF9rZXJuZWxfc3ltICprcywgKms7CglzdHJ1Y3QgbmV3X21vZHVsZV9zeW1ib2wgKnM7CglzdHJ1Y3QgZXh0ZXJuYWxfbW9kdWxlICptb2Q7CglpbnQgbmtzLCBubXMsIG5tb2QsIGk7CgoJbmtzID0gZ2V0X2tlcm5lbF9zeW1zKE5VTEwpOwoJaWYgKG5rcyA8PSAwKSB7CgkJaWYgKG5rcykKCQkJYmJfcGVycm9yX21zZygiZ2V0X2tlcm5lbF9zeW1zOiAlcyIsIG1fbmFtZSk7CgkJZWxzZQoJCQliYl9lcnJvcl9tc2coIk5vIGtlcm5lbCBzeW1ib2xzIik7CgkJcmV0dXJuIDA7Cgl9CgoJa3MgPSBrID0geG1hbGxvYyhua3MgKiBzaXplb2YoKmtzKSk7CgoJaWYgKGdldF9rZXJuZWxfc3ltcyhrcykgIT0gbmtzKSB7CgkJcGVycm9yKCJpbmNvbnNpc3RlbmN5IHdpdGggZ2V0X2tlcm5lbF9zeW1zIC0tIGlzIHNvbWVvbmUgZWxzZSAiCgkJCQkicGxheWluZyB3aXRoIG1vZHVsZXM/Iik7CgkJZnJlZShrcyk7CgkJcmV0dXJuIDA7Cgl9CgoJLyogQ29sbGVjdCB0aGUgbW9kdWxlIGluZm9ybWF0aW9uLiAgKi8KCgltb2QgPSBOVUxMOwoJbm1vZCA9IC0xOwoKCXdoaWxlIChrLT5uYW1lWzBdID09ICcjJyAmJiBrLT5uYW1lWzFdKSB7CgkJc3RydWN0IG9sZF9rZXJuZWxfc3ltICprMjsKCgkJLyogRmluZCBvdXQgaG93IG1hbnkgc3ltYm9scyB0aGlzIG1vZHVsZSBoYXMuICAqLwoJCWZvciAoazIgPSBrICsgMTsgazItPm5hbWVbMF0gIT0gJyMnOyArK2syKQoJCQljb250aW51ZTsKCQlubXMgPSBrMiAtIGsgLSAxOwoKCQltb2QgPSB4cmVhbGxvYyhtb2QsICgrK25tb2QgKyAxKSAqIHNpemVvZigqbW9kKSk7CgkJbW9kW25tb2RdLm5hbWUgPSBrLT5uYW1lICsgMTsKCQltb2Rbbm1vZF0uYWRkciA9IGstPnZhbHVlOwoJCW1vZFtubW9kXS51c2VkID0gMDsKCQltb2Rbbm1vZF0ubnN5bXMgPSBubXM7CgkJbW9kW25tb2RdLnN5bXMgPSBzID0gKG5tcyA/IHhtYWxsb2Mobm1zICogc2l6ZW9mKCpzKSkgOiBOVUxMKTsKCgkJZm9yIChpID0gMCwgKytrOyBpIDwgbm1zOyArK2ksICsrcywgKytrKSB7CgkJCXMtPm5hbWUgPSAodW5zaWduZWQgbG9uZykgay0+bmFtZTsKCQkJcy0+dmFsdWUgPSBrLT52YWx1ZTsKCQl9CgoJCWsgPSBrMjsKCX0KCglleHRfbW9kdWxlcyA9IG1vZDsKCW5fZXh0X21vZHVsZXMgPSBubW9kICsgMTsKCgkvKiBOb3cgY29sbGVjdCB0aGUgc3ltYm9scyBmb3IgdGhlIGtlcm5lbCBwcm9wZXIuICAqLwoKCWlmIChrLT5uYW1lWzBdID09ICcjJykKCQkrK2s7CgoJbmtzeW1zID0gbm1zID0gbmtzIC0gKGsgLSBrcyk7Cglrc3ltcyA9IHMgPSAobm1zID8geG1hbGxvYyhubXMgKiBzaXplb2YoKnMpKSA6IE5VTEwpOwoKCWZvciAoaSA9IDA7IGkgPCBubXM7ICsraSwgKytzLCArK2spIHsKCQlzLT5uYW1lID0gKHVuc2lnbmVkIGxvbmcpIGstPm5hbWU7CgkJcy0+dmFsdWUgPSBrLT52YWx1ZTsKCX0KCglyZXR1cm4gMTsKfQoKLyogUmV0dXJuIHRoZSBrZXJuZWwgc3ltYm9sIGNoZWNrc3VtIHZlcnNpb24sIG9yIHplcm8gaWYgbm90IHVzZWQuICAqLwoKc3RhdGljIGludCBvbGRfaXNfa2VybmVsX2NoZWNrc3VtbWVkKHZvaWQpCnsKCS8qIFVzaW5nX1ZlcnNpb25zIGlzIHRoZSBmaXJzdCBzeW1ib2wuICAqLwoJaWYgKG5rc3ltcyA+IDAKCQkJJiYgc3RyY21wKChjaGFyICopIGtzeW1zWzBdLm5hbWUsCgkJCQkiVXNpbmdfVmVyc2lvbnMiKSA9PSAwKSByZXR1cm4ga3N5bXNbMF0udmFsdWU7CgllbHNlCgkJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgaW50IG9sZF9jcmVhdGVfbW9kX3VzZV9jb3VudChzdHJ1Y3Qgb2JqX2ZpbGUgKmYpCnsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOwoKCXNlYyA9IG9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uX2ZpcnN0KGYsICIubW9kdXNlIiwgc2l6ZW9mKGxvbmcpLAoJCQlzaXplb2YobG9uZykpOwoKCW9ial9hZGRfc3ltYm9sKGYsICJtb2RfdXNlX2NvdW50XyIsIC0xLAoJCQlFTEZXKFNUX0lORk8pIChTVEJfTE9DQUwsIFNUVF9PQkpFQ1QpLCBzZWMtPmlkeCwgMCwKCQkJc2l6ZW9mKGxvbmcpKTsKCglyZXR1cm4gMTsKfQoKc3RhdGljIGludApvbGRfaW5pdF9tb2R1bGUoY29uc3QgY2hhciAqbV9uYW1lLCBzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQl1bnNpZ25lZCBsb25nIG1fc2l6ZSkKewoJY2hhciAqaW1hZ2U7CglzdHJ1Y3Qgb2xkX21vZF9yb3V0aW5lcyByb3V0aW5lczsKCXN0cnVjdCBvbGRfc3ltYm9sX3RhYmxlICpzeW10YWI7CglpbnQgcmV0OwoKCS8qIENyZWF0ZSB0aGUgc3ltYm9sIHRhYmxlICovCgl7CgkJaW50IG5zeW1zID0gMCwgc3Ryc2l6ZSA9IDAsIHRvdGFsOwoKCQkvKiBTaXplIHRoaW5ncyBmaXJzdC4uLiAqLwoJCWlmIChmbGFnX2V4cG9ydCkgewoJCQlpbnQgaTsKCQkJZm9yIChpID0gMDsgaSA8IEhBU0hfQlVDS0VUUzsgKytpKSB7CgkJCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOwoJCQkJZm9yIChzeW0gPSBmLT5zeW10YWJbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQoJCQkJCWlmIChFTEZXKFNUX0JJTkQpIChzeW0tPmluZm8pICE9IFNUQl9MT0NBTAoJCQkJCQkJJiYgc3ltLT5zZWNpZHggPD0gU0hOX0hJUkVTRVJWRSkKCQkJCQl7CgkJCQkJCXN5bS0+a3N5bWlkeCA9IG5zeW1zKys7CgkJCQkJCXN0cnNpemUgKz0gc3RybGVuKHN5bS0+bmFtZSkgKyAxOwoJCQkJCX0KCQkJfQoJCX0KCgkJdG90YWwgPSAoc2l6ZW9mKHN0cnVjdCBvbGRfc3ltYm9sX3RhYmxlKQoJCQkJKyBuc3ltcyAqIHNpemVvZihzdHJ1Y3Qgb2xkX21vZHVsZV9zeW1ib2wpCgkJCQkrIG5fZXh0X21vZHVsZXNfdXNlZCAqIHNpemVvZihzdHJ1Y3Qgb2xkX21vZHVsZV9yZWYpCgkJCQkrIHN0cnNpemUpOwoJCXN5bXRhYiA9IHhtYWxsb2ModG90YWwpOwoJCXN5bXRhYi0+c2l6ZSA9IHRvdGFsOwoJCXN5bXRhYi0+bl9zeW1ib2xzID0gbnN5bXM7CgkJc3ltdGFiLT5uX3JlZnMgPSBuX2V4dF9tb2R1bGVzX3VzZWQ7CgoJCWlmIChmbGFnX2V4cG9ydCAmJiBuc3ltcykgewoJCQlzdHJ1Y3Qgb2xkX21vZHVsZV9zeW1ib2wgKmtzeW07CgkJCWNoYXIgKnN0cjsKCQkJaW50IGk7CgoJCQlrc3ltID0gc3ltdGFiLT5zeW1ib2w7CgkJCXN0ciA9ICgoY2hhciAqKSBrc3ltICsgbnN5bXMgKiBzaXplb2Yoc3RydWN0IG9sZF9tb2R1bGVfc3ltYm9sKQoJCQkJCSsgbl9leHRfbW9kdWxlc191c2VkICogc2l6ZW9mKHN0cnVjdCBvbGRfbW9kdWxlX3JlZikpOwoKCQkJZm9yIChpID0gMDsgaSA8IEhBU0hfQlVDS0VUUzsgKytpKSB7CgkJCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOwoJCQkJZm9yIChzeW0gPSBmLT5zeW10YWJbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQoJCQkJCWlmIChzeW0tPmtzeW1pZHggPj0gMCkgewoJCQkJCQlrc3ltLT5hZGRyID0gb2JqX3N5bWJvbF9maW5hbF92YWx1ZShmLCBzeW0pOwoJCQkJCQlrc3ltLT5uYW1lID0KCQkJCQkJCSh1bnNpZ25lZCBsb25nKSBzdHIgLSAodW5zaWduZWQgbG9uZykgc3ltdGFiOwoKCQkJCQkJc3RyY3B5KHN0ciwgc3ltLT5uYW1lKTsKCQkJCQkJc3RyICs9IHN0cmxlbihzeW0tPm5hbWUpICsgMTsKCQkJCQkJa3N5bSsrOwoJCQkJCX0KCQkJfQoJCX0KCgkJaWYgKG5fZXh0X21vZHVsZXNfdXNlZCkgewoJCQlzdHJ1Y3Qgb2xkX21vZHVsZV9yZWYgKnJlZjsKCQkJaW50IGk7CgoJCQlyZWYgPSAoc3RydWN0IG9sZF9tb2R1bGVfcmVmICopCgkJCQkoKGNoYXIgKikgc3ltdGFiLT5zeW1ib2wgKyBuc3ltcyAqIHNpemVvZihzdHJ1Y3Qgb2xkX21vZHVsZV9zeW1ib2wpKTsKCgkJCWZvciAoaSA9IDA7IGkgPCBuX2V4dF9tb2R1bGVzOyArK2kpCgkJCQlpZiAoZXh0X21vZHVsZXNbaV0udXNlZCkKCQkJCQlyZWYrKy0+bW9kdWxlID0gZXh0X21vZHVsZXNbaV0uYWRkcjsKCQl9Cgl9CgoJLyogRmlsbCBpbiByb3V0aW5lcy4gICovCgoJcm91dGluZXMuaW5pdCA9CgkJb2JqX3N5bWJvbF9maW5hbF92YWx1ZShmLCBvYmpfZmluZF9zeW1ib2woZiwgU1BGWCAiaW5pdF9tb2R1bGUiKSk7Cglyb3V0aW5lcy5jbGVhbnVwID0KCQlvYmpfc3ltYm9sX2ZpbmFsX3ZhbHVlKGYsIG9ial9maW5kX3N5bWJvbChmLCBTUEZYICJjbGVhbnVwX21vZHVsZSIpKTsKCgkvKiBXaGV3ISAgQWxsIG9mIHRoZSBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS4gIENvbGxlY3QgdGhlIGZpbmFsCgkgICBtb2R1bGUgaW1hZ2UgYW5kIGdpdmUgaXQgdG8gdGhlIGtlcm5lbC4gICovCgoJaW1hZ2UgPSB4bWFsbG9jKG1fc2l6ZSk7CglvYmpfY3JlYXRlX2ltYWdlKGYsIGltYWdlKTsKCgkvKiBpbWFnZSBob2xkcyB0aGUgY29tcGxldGUgcmVsb2NhdGVkIG1vZHVsZSwgYWNjb3VudGluZyBjb3JyZWN0bHkgZm9yCgkgICBtb2RfdXNlX2NvdW50LiAgSG93ZXZlciB0aGUgb2xkIG1vZHVsZSBrZXJuZWwgc3VwcG9ydCBhc3N1bWUgdGhhdAoJICAgaXQgaXMgcmVjZWl2aW5nIHNvbWV0aGluZyB3aGljaCBkb2VzIG5vdCBjb250YWluIG1vZF91c2VfY291bnQuICAqLwoJcmV0ID0gb2xkX3N5c19pbml0X21vZHVsZShtX25hbWUsIGltYWdlICsgc2l6ZW9mKGxvbmcpLAoJCQltX3NpemUgfCAoZmxhZ19hdXRvY2xlYW4gPyBPTERfTU9EX0FVVE9DTEVBTgoJCQkJOiAwKSwgJnJvdXRpbmVzLCBzeW10YWIpOwoJaWYgKHJldCkKCQliYl9wZXJyb3JfbXNnKCJpbml0X21vZHVsZTogJXMiLCBtX25hbWUpOwoKCWZyZWUoaW1hZ2UpOwoJZnJlZShzeW10YWIpOwoKCXJldHVybiByZXQgPT0gMDsKfQoKI2Vsc2UKCiNkZWZpbmUgb2xkX2NyZWF0ZV9tb2RfdXNlX2NvdW50KHgpIFRSVUUKI2RlZmluZSBvbGRfaW5pdF9tb2R1bGUoeCwgeSwgeikgVFJVRQoKI2VuZGlmCQkJCQkJCS8qIENPTkZJR19GRUFUVVJFXzJfMl9NT0RVTEVTICovCgoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8qIEZ1bmN0aW9ucyByZWxhdGluZyB0byBtb2R1bGUgbG9hZGluZyBhZnRlciAyLjEuMTguICAqLwoKc3RhdGljIGludApuZXdfcHJvY2Vzc19tb2R1bGVfYXJndW1lbnRzKHN0cnVjdCBvYmpfZmlsZSAqZiwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7Cgl3aGlsZSAoYXJnYyA+IDApIHsKCQljaGFyICpwLCAqcSwgKmtleSwgKnN5bV9uYW1lOwoJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CgkJY2hhciAqY29udGVudHMsICpsb2M7CgkJaW50IG1pbiwgbWF4LCBuOwoKCQlwID0gKmFyZ3Y7CgkJaWYgKChxID0gc3RyY2hyKHAsICc9JykpID09IE5VTEwpIHsKCQkJYXJnYy0tOwoJCQljb250aW51ZTsKCQl9CgoJCWtleSA9IGFsbG9jYShxIC0gcCArIDYpOwoJCW1lbWNweShrZXksICJwYXJtXyIsIDUpOwoJCW1lbWNweShrZXkgKyA1LCBwLCBxIC0gcCk7CgkJa2V5W3EgLSBwICsgNV0gPSAwOwoKCQlwID0gZ2V0X21vZGluZm9fdmFsdWUoZiwga2V5KTsKCQlrZXkgKz0gNTsKCQlpZiAocCA9PSBOVUxMKSB7CgkJCWJiX2Vycm9yX21zZygiaW52YWxpZCBwYXJhbWV0ZXIgJXMiLCBrZXkpOwoJCQlyZXR1cm4gMDsKCQl9CgojaWZkZWYgU1lNQk9MX1BSRUZJWAoJCXN5bV9uYW1lID0gYWxsb2NhIChzdHJsZW4gKGtleSkgKyBzaXplb2YgU1lNQk9MX1BSRUZJWCk7CgkJc3RyY3B5IChzeW1fbmFtZSwgU1lNQk9MX1BSRUZJWCk7CgkJc3RyY2F0IChzeW1fbmFtZSwga2V5KTsKI2Vsc2UKCQlzeW1fbmFtZSA9IGtleTsKI2VuZGlmCgkJc3ltID0gb2JqX2ZpbmRfc3ltYm9sKGYsIHN5bV9uYW1lKTsKCgkJLyogQWxzbyBjaGVjayB0aGF0IHRoZSBwYXJhbWV0ZXIgd2FzIG5vdCByZXNvbHZlZCBmcm9tIHRoZSBrZXJuZWwuICAqLwoJCWlmIChzeW0gPT0gTlVMTCB8fCBzeW0tPnNlY2lkeCA+IFNITl9ISVJFU0VSVkUpIHsKCQkJYmJfZXJyb3JfbXNnKCJzeW1ib2wgZm9yIHBhcmFtZXRlciAlcyBub3QgZm91bmQiLCBrZXkpOwoJCQlyZXR1cm4gMDsKCQl9CgoJCWlmIChpc2RpZ2l0KCpwKSkgewoJCQltaW4gPSBzdHJ0b3VsKHAsICZwLCAxMCk7CgkJCWlmICgqcCA9PSAnLScpCgkJCQltYXggPSBzdHJ0b3VsKHAgKyAxLCAmcCwgMTApOwoJCQllbHNlCgkJCQltYXggPSBtaW47CgkJfSBlbHNlCgkJCW1pbiA9IG1heCA9IDE7CgoJCWNvbnRlbnRzID0gZi0+c2VjdGlvbnNbc3ltLT5zZWNpZHhdLT5jb250ZW50czsKCQlsb2MgPSBjb250ZW50cyArIHN5bS0+dmFsdWU7CgkJbiA9ICgqKytxICE9ICdcMCcpOwoKCQl3aGlsZSAoMSkgewoJCQlpZiAoKCpwID09ICdzJykgfHwgKCpwID09ICdjJykpIHsKCQkJCWNoYXIgKnN0cjsKCgkJCQkvKiBEbyBDIHF1b3RpbmcgaWYgd2UgYmVnaW4gd2l0aCBhICIsIGVsc2Ugc2x1cnAgdGhlIGxvdC4gICovCgkJCQlpZiAoKnEgPT0gJyInKSB7CgkJCQkJY2hhciAqcjsKCgkJCQkJc3RyID0gYWxsb2NhKHN0cmxlbihxKSk7CgkJCQkJZm9yIChyID0gc3RyLCBxKys7ICpxICE9ICciJzsgKytxLCArK3IpIHsKCQkJCQkJaWYgKCpxID09ICdcMCcpIHsKCQkJCQkJCWJiX2Vycm9yX21zZygiaW1wcm9wZXJseSB0ZXJtaW5hdGVkIHN0cmluZyBhcmd1bWVudCBmb3IgJXMiLAoJCQkJCQkJCQlrZXkpOwoJCQkJCQkJcmV0dXJuIDA7CgkJCQkJCX0gZWxzZSBpZiAoKnEgPT0gJ1xcJykKCQkJCQkJCXN3aXRjaCAoKisrcSkgewoJCQkJCQkJCWNhc2UgJ2EnOgoJCQkJCQkJCQkqciA9ICdcYSc7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCWNhc2UgJ2InOgoJCQkJCQkJCQkqciA9ICdcYic7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCWNhc2UgJ2UnOgoJCQkJCQkJCQkqciA9ICdcMDMzJzsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJY2FzZSAnZic6CgkJCQkJCQkJCSpyID0gJ1xmJzsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJY2FzZSAnbic6CgkJCQkJCQkJCSpyID0gJ1xuJzsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJY2FzZSAncic6CgkJCQkJCQkJCSpyID0gJ1xyJzsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJY2FzZSAndCc6CgkJCQkJCQkJCSpyID0gJ1x0JzsKCQkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJCWNhc2UgJzAnOgoJCQkJCQkJCWNhc2UgJzEnOgoJCQkJCQkJCWNhc2UgJzInOgoJCQkJCQkJCWNhc2UgJzMnOgoJCQkJCQkJCWNhc2UgJzQnOgoJCQkJCQkJCWNhc2UgJzUnOgoJCQkJCQkJCWNhc2UgJzYnOgoJCQkJCQkJCWNhc2UgJzcnOgoJCQkJCQkJCQl7CgkJCQkJCQkJCQlpbnQgYyA9ICpxIC0gJzAnOwoJCQkJCQkJCQkJaWYgKHFbMV0gPj0gJzAnICYmIHFbMV0gPD0gJzcnKSB7CgkJCQkJCQkJCQkJYyA9IChjICogOCkgKyAqKytxIC0gJzAnOwoJCQkJCQkJCQkJCWlmIChxWzFdID49ICcwJyAmJiBxWzFdIDw9ICc3JykKCQkJCQkJCQkJCQkJYyA9IChjICogOCkgKyAqKytxIC0gJzAnOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJKnIgPSBjOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWJyZWFrOwoKCQkJCQkJCQlkZWZhdWx0OgoJCQkJCQkJCQkqciA9ICpxOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCX0gZWxzZQoJCQkJCQkJCSpyID0gKnE7CgkJCQkJfQoJCQkJCSpyID0gJ1wwJzsKCQkJCQkrK3E7CgkJCQl9IGVsc2UgewoJCQkJCWNoYXIgKnI7CgoJCQkJCS8qIEluIHRoaXMgY2FzZSwgdGhlIHN0cmluZyBpcyBub3QgcXVvdGVkLiBXZSB3aWxsIGJyZWFrCgkJCQkJICAgaXQgdXNpbmcgdGhlIGNvbWEgKGxpa2UgZm9yIGludHMpLiBJZiB0aGUgdXNlciB3YW50cyB0bwoJCQkJCSAgIGluY2x1ZGUgY29tYXMgaW4gYSBzdHJpbmcsIGhlIGp1c3QgaGFzIHRvIHF1b3RlIGl0ICovCgoJCQkJCS8qIFNlYXJjaCB0aGUgbmV4dCBjb21hICovCgkJCQkJciA9IHN0cmNocihxLCAnLCcpOwoKCQkJCQkvKiBGb3VuZCA/ICovCgkJCQkJaWYgKHIgIT0gKGNoYXIgKikgTlVMTCkgewoJCQkJCQkvKiBSZWNvcHkgdGhlIGN1cnJlbnQgZmllbGQgKi8KCQkJCQkJc3RyID0gYWxsb2NhKHIgLSBxICsgMSk7CgkJCQkJCW1lbWNweShzdHIsIHEsIHIgLSBxKTsKCgkJCQkJCS8qIEkgZG9uJ3Qga25vdyBpZiBpdCBpcyB1c2VmdWxsLCBhcyB0aGUgcHJldmlvdXMgY2FzZQoJCQkJCQkgICBkb2Vzbid0IG51bGwgdGVybWluYXRlIHRoZSBzdHJpbmcgPz8/ICovCgkJCQkJCXN0cltyIC0gcV0gPSAnXDAnOwoKCQkJCQkJLyogS2VlcCBuZXh0IGZpZWxkcyAqLwoJCQkJCQlxID0gcjsKCQkJCQl9IGVsc2UgewoJCQkJCQkvKiBsYXN0IHN0cmluZyAqLwoJCQkJCQlzdHIgPSBxOwoJCQkJCQlxID0gIiI7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICgqcCA9PSAncycpIHsKCQkJCQkvKiBOb3JtYWwgc3RyaW5nICovCgkJCQkJb2JqX3N0cmluZ19wYXRjaChmLCBzeW0tPnNlY2lkeCwgbG9jIC0gY29udGVudHMsIHN0cik7CgkJCQkJbG9jICs9IHRndF9zaXplb2ZfY2hhcl9wOwoJCQkJfSBlbHNlIHsKCQkJCQkvKiBBcnJheSBvZiBjaGFycyAoaW4gZmFjdCwgbWF0cml4ICEpICovCgkJCQkJdW5zaWduZWQgbG9uZyBjaGFyc3NpemU7CS8qIHNpemUgb2YgZWFjaCBtZW1iZXIgKi8KCgkJCQkJLyogR2V0IHRoZSBzaXplIG9mIGVhY2ggbWVtYmVyICovCgkJCQkJLyogUHJvYmFibHkgd2Ugc2hvdWxkIGRvIHRoYXQgb3V0c2lkZSB0aGUgbG9vcCA/ICovCgkJCQkJaWYgKCFpc2RpZ2l0KCoocCArIDEpKSkgewoJCQkJCQliYl9lcnJvcl9tc2coInBhcmFtZXRlciB0eXBlICdjJyBmb3IgJXMgbXVzdCBiZSBmb2xsb3dlZCBieSIKCQkJCQkJCQkiIHRoZSBtYXhpbXVtIHNpemUiLCBrZXkpOwoJCQkJCQlyZXR1cm4gMDsKCQkJCQl9CgkJCQkJY2hhcnNzaXplID0gc3RydG91bChwICsgMSwgKGNoYXIgKiopIE5VTEwsIDEwKTsKCgkJCQkJLyogQ2hlY2sgbGVuZ3RoICovCgkJCQkJaWYgKHN0cmxlbihzdHIpID49IGNoYXJzc2l6ZSkgewoJCQkJCQliYl9lcnJvcl9tc2coInN0cmluZyB0b28gbG9uZyBmb3IgJXMgKG1heCAlbGQpIiwga2V5LAoJCQkJCQkJCWNoYXJzc2l6ZSAtIDEpOwoJCQkJCQlyZXR1cm4gMDsKCQkJCQl9CgoJCQkJCS8qIENvcHkgdG8gbG9jYXRpb24gKi8KCQkJCQlzdHJjcHkoKGNoYXIgKikgbG9jLCBzdHIpOwoJCQkJCWxvYyArPSBjaGFyc3NpemU7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlsb25nIHYgPSBzdHJ0b3VsKHEsICZxLCAwKTsKCQkJCXN3aXRjaCAoKnApIHsKCQkJCQljYXNlICdiJzoKCQkJCQkJKmxvYysrID0gdjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnaCc6CgkJCQkJCSooc2hvcnQgKikgbG9jID0gdjsKCQkJCQkJbG9jICs9IHRndF9zaXplb2Zfc2hvcnQ7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ2knOgoJCQkJCQkqKGludCAqKSBsb2MgPSB2OwoJCQkJCQlsb2MgKz0gdGd0X3NpemVvZl9pbnQ7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ2wnOgoJCQkJCQkqKGxvbmcgKikgbG9jID0gdjsKCQkJCQkJbG9jICs9IHRndF9zaXplb2ZfbG9uZzsKCQkJCQkJYnJlYWs7CgoJCQkJCWRlZmF1bHQ6CgkJCQkJCWJiX2Vycm9yX21zZygidW5rbm93biBwYXJhbWV0ZXIgdHlwZSAnJWMnIGZvciAlcyIsICpwLCBrZXkpOwoJCQkJCQlyZXR1cm4gMDsKCQkJCX0KCQkJfQoKcmV0cnlfZW5kX29mX3ZhbHVlOgoJCQlzd2l0Y2ggKCpxKSB7CgkJCQljYXNlICdcMCc6CgkJCQkJZ290byBlbmRfb2ZfYXJnOwoKCQkJCWNhc2UgJyAnOgoJCQkJY2FzZSAnXHQnOgoJCQkJY2FzZSAnXG4nOgoJCQkJY2FzZSAnXHInOgoJCQkJCSsrcTsKCQkJCQlnb3RvIHJldHJ5X2VuZF9vZl92YWx1ZTsKCgkJCQljYXNlICcsJzoKCQkJCQlpZiAoKytuID4gbWF4KSB7CgkJCQkJCWJiX2Vycm9yX21zZygidG9vIG1hbnkgdmFsdWVzIGZvciAlcyAobWF4ICVkKSIsIGtleSwgbWF4KTsKCQkJCQkJcmV0dXJuIDA7CgkJCQkJfQoJCQkJCSsrcTsKCQkJCQlicmVhazsKCgkJCQlkZWZhdWx0OgoJCQkJCWJiX2Vycm9yX21zZygiaW52YWxpZCBhcmd1bWVudCBzeW50YXggZm9yICVzIiwga2V5KTsKCQkJCQlyZXR1cm4gMDsKCQkJfQoJCX0KCmVuZF9vZl9hcmc6CgkJaWYgKG4gPCBtaW4pIHsKCQkJYmJfZXJyb3JfbXNnKCJ0b28gZmV3IHZhbHVlcyBmb3IgJXMgKG1pbiAlZCkiLCBrZXksIG1pbik7CgkJCXJldHVybiAwOwoJCX0KCgkJYXJnYy0tLCBhcmd2Kys7Cgl9CgoJcmV0dXJuIDE7Cn0KCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORwpzdGF0aWMgaW50IG5ld19pc19tb2R1bGVfY2hlY2tzdW1tZWQoc3RydWN0IG9ial9maWxlICpmKQp7Cgljb25zdCBjaGFyICpwID0gZ2V0X21vZGluZm9fdmFsdWUoZiwgInVzaW5nX2NoZWNrc3VtcyIpOwoJaWYgKHApCgkJcmV0dXJuIGF0b2kocCk7CgllbHNlCgkJcmV0dXJuIDA7Cn0KCi8qIEdldCB0aGUgbW9kdWxlJ3Mga2VybmVsIHZlcnNpb24gaW4gdGhlIGNhbm9uaWNhbCBpbnRlZ2VyIGZvcm0uICAqLwoKc3RhdGljIGludApuZXdfZ2V0X21vZHVsZV92ZXJzaW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwgY2hhciBzdHJbU1RSVkVSU0lPTkxFTl0pCnsKCWNoYXIgKnAsICpxOwoJaW50IGEsIGIsIGM7CgoJcCA9IGdldF9tb2RpbmZvX3ZhbHVlKGYsICJrZXJuZWxfdmVyc2lvbiIpOwoJaWYgKHAgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CglzYWZlX3N0cm5jcHkoc3RyLCBwLCBTVFJWRVJTSU9OTEVOKTsKCglhID0gc3RydG91bChwLCAmcCwgMTApOwoJaWYgKCpwICE9ICcuJykKCQlyZXR1cm4gLTE7CgliID0gc3RydG91bChwICsgMSwgJnAsIDEwKTsKCWlmICgqcCAhPSAnLicpCgkJcmV0dXJuIC0xOwoJYyA9IHN0cnRvdWwocCArIDEsICZxLCAxMCk7CglpZiAocCArIDEgPT0gcSkKCQlyZXR1cm4gLTE7CgoJcmV0dXJuIGEgPDwgMTYgfCBiIDw8IDggfCBjOwp9CgojZW5kaWYgICAvKiBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyAqLwoKCiNpZmRlZiBDT05GSUdfRkVBVFVSRV8yXzRfTU9EVUxFUwoKLyogRmV0Y2ggdGhlIGxvYWRlZCBtb2R1bGVzLCBhbmQgYWxsIGN1cnJlbnRseSBleHBvcnRlZCBzeW1ib2xzLiAgKi8KCnN0YXRpYyBpbnQgbmV3X2dldF9rZXJuZWxfc3ltYm9scyh2b2lkKQp7CgljaGFyICptb2R1bGVfbmFtZXMsICptbjsKCXN0cnVjdCBleHRlcm5hbF9tb2R1bGUgKm1vZHVsZXMsICptOwoJc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sICpzeW1zLCAqczsKCXNpemVfdCByZXQsIGJ1ZnNpemUsIG5tb2QsIG5zeW1zLCBpLCBqOwoKCS8qIENvbGxlY3QgdGhlIGxvYWRlZCBtb2R1bGVzLiAgKi8KCgltb2R1bGVfbmFtZXMgPSB4bWFsbG9jKGJ1ZnNpemUgPSAyNTYpOwpyZXRyeV9tb2R1bGVzX2xvYWQ6CglpZiAocXVlcnlfbW9kdWxlKE5VTEwsIFFNX01PRFVMRVMsIG1vZHVsZV9uYW1lcywgYnVmc2l6ZSwgJnJldCkpIHsKCQlpZiAoZXJybm8gPT0gRU5PU1BDICYmIGJ1ZnNpemUgPCByZXQpIHsKCQkJbW9kdWxlX25hbWVzID0geHJlYWxsb2MobW9kdWxlX25hbWVzLCBidWZzaXplID0gcmV0KTsKCQkJZ290byByZXRyeV9tb2R1bGVzX2xvYWQ7CgkJfQoJCWJiX3BlcnJvcl9tc2coIlFNX01PRFVMRVMiKTsKCQlyZXR1cm4gMDsKCX0KCgluX2V4dF9tb2R1bGVzID0gbm1vZCA9IHJldDsKCgkvKiBDb2xsZWN0IHRoZSBtb2R1bGVzJyBzeW1ib2xzLiAgKi8KCglpZiAobm1vZCl7CgkJZXh0X21vZHVsZXMgPSBtb2R1bGVzID0geG1hbGxvYyhubW9kICogc2l6ZW9mKCptb2R1bGVzKSk7CgkJbWVtc2V0KG1vZHVsZXMsIDAsIG5tb2QgKiBzaXplb2YoKm1vZHVsZXMpKTsKCQlmb3IgKGkgPSAwLCBtbiA9IG1vZHVsZV9uYW1lcywgbSA9IG1vZHVsZXM7CgkJCQlpIDwgbm1vZDsgKytpLCArK20sIG1uICs9IHN0cmxlbihtbikgKyAxKSB7CgkJCXN0cnVjdCBuZXdfbW9kdWxlX2luZm8gaW5mbzsKCgkJCWlmIChxdWVyeV9tb2R1bGUobW4sIFFNX0lORk8sICZpbmZvLCBzaXplb2YoaW5mbyksICZyZXQpKSB7CgkJCQlpZiAoZXJybm8gPT0gRU5PRU5UKSB7CgkJCQkJLyogVGhlIG1vZHVsZSB3YXMgcmVtb3ZlZCBvdXQgZnJvbSB1bmRlcm5lYXRoIHVzLiAgKi8KCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCWJiX3BlcnJvcl9tc2coInF1ZXJ5X21vZHVsZTogUU1fSU5GTzogJXMiLCBtbik7CgkJCQlyZXR1cm4gMDsKCQkJfQoKCQkJc3ltcyA9IHhtYWxsb2MoYnVmc2l6ZSA9IDEwMjQpOwpyZXRyeV9tb2Rfc3ltX2xvYWQ6CgkJCWlmIChxdWVyeV9tb2R1bGUobW4sIFFNX1NZTUJPTFMsIHN5bXMsIGJ1ZnNpemUsICZyZXQpKSB7CgkJCQlzd2l0Y2ggKGVycm5vKSB7CgkJCQkJY2FzZSBFTk9TUEM6CgkJCQkJCXN5bXMgPSB4cmVhbGxvYyhzeW1zLCBidWZzaXplID0gcmV0KTsKCQkJCQkJZ290byByZXRyeV9tb2Rfc3ltX2xvYWQ7CgkJCQkJY2FzZSBFTk9FTlQ6CgkJCQkJCS8qIFRoZSBtb2R1bGUgd2FzIHJlbW92ZWQgb3V0IGZyb20gdW5kZXJuZWF0aCB1cy4gICovCgkJCQkJCWNvbnRpbnVlOwoJCQkJCWRlZmF1bHQ6CgkJCQkJCWJiX3BlcnJvcl9tc2coInF1ZXJ5X21vZHVsZTogUU1fU1lNQk9MUzogJXMiLCBtbik7CgkJCQkJCXJldHVybiAwOwoJCQkJfQoJCQl9CgkJCW5zeW1zID0gcmV0OwoKCQkJbS0+bmFtZSA9IG1uOwoJCQltLT5hZGRyID0gaW5mby5hZGRyOwoJCQltLT5uc3ltcyA9IG5zeW1zOwoJCQltLT5zeW1zID0gc3ltczsKCgkJCWZvciAoaiA9IDAsIHMgPSBzeW1zOyBqIDwgbnN5bXM7ICsraiwgKytzKSB7CgkJCQlzLT5uYW1lICs9ICh1bnNpZ25lZCBsb25nKSBzeW1zOwoJCQl9CgkJfQoJfQoKCS8qIENvbGxlY3QgdGhlIGtlcm5lbCdzIHN5bWJvbHMuICAqLwoKCXN5bXMgPSB4bWFsbG9jKGJ1ZnNpemUgPSAxNiAqIDEwMjQpOwpyZXRyeV9rZXJuX3N5bV9sb2FkOgoJaWYgKHF1ZXJ5X21vZHVsZShOVUxMLCBRTV9TWU1CT0xTLCBzeW1zLCBidWZzaXplLCAmcmV0KSkgewoJCWlmIChlcnJubyA9PSBFTk9TUEMgJiYgYnVmc2l6ZSA8IHJldCkgewoJCQlzeW1zID0geHJlYWxsb2Moc3ltcywgYnVmc2l6ZSA9IHJldCk7CgkJCWdvdG8gcmV0cnlfa2Vybl9zeW1fbG9hZDsKCQl9CgkJYmJfcGVycm9yX21zZygia2VybmVsOiBRTV9TWU1CT0xTIik7CgkJcmV0dXJuIDA7Cgl9Cglua3N5bXMgPSBuc3ltcyA9IHJldDsKCWtzeW1zID0gc3ltczsKCglmb3IgKGogPSAwLCBzID0gc3ltczsgaiA8IG5zeW1zOyArK2osICsrcykgewoJCXMtPm5hbWUgKz0gKHVuc2lnbmVkIGxvbmcpIHN5bXM7Cgl9CglyZXR1cm4gMTsKfQoKCi8qIFJldHVybiB0aGUga2VybmVsIHN5bWJvbCBjaGVja3N1bSB2ZXJzaW9uLCBvciB6ZXJvIGlmIG5vdCB1c2VkLiAgKi8KCnN0YXRpYyBpbnQgbmV3X2lzX2tlcm5lbF9jaGVja3N1bW1lZCh2b2lkKQp7CglzdHJ1Y3QgbmV3X21vZHVsZV9zeW1ib2wgKnM7CglzaXplX3QgaTsKCgkvKiBVc2luZ19WZXJzaW9ucyBpcyBub3QgdGhlIGZpcnN0IHN5bWJvbCwgYnV0IGl0IHNob3VsZCBiZSBpbiB0aGVyZS4gICovCgoJZm9yIChpID0gMCwgcyA9IGtzeW1zOyBpIDwgbmtzeW1zOyArK2ksICsrcykKCQlpZiAoc3RyY21wKChjaGFyICopIHMtPm5hbWUsICJVc2luZ19WZXJzaW9ucyIpID09IDApCgkJCXJldHVybiBzLT52YWx1ZTsKCglyZXR1cm4gMDsKfQoKCnN0YXRpYyBpbnQgbmV3X2NyZWF0ZV90aGlzX21vZHVsZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKm1fbmFtZSkKewoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CgoJc2VjID0gb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb25fZmlyc3QoZiwgIi50aGlzIiwgdGd0X3NpemVvZl9sb25nLAoJCQlzaXplb2Yoc3RydWN0IG5ld19tb2R1bGUpKTsKCW1lbXNldChzZWMtPmNvbnRlbnRzLCAwLCBzaXplb2Yoc3RydWN0IG5ld19tb2R1bGUpKTsKCglvYmpfYWRkX3N5bWJvbChmLCBTUEZYICJfX3RoaXNfbW9kdWxlIiwgLTEsCgkJCUVMRlcoU1RfSU5GTykgKFNUQl9MT0NBTCwgU1RUX09CSkVDVCksIHNlYy0+aWR4LCAwLAoJCQlzaXplb2Yoc3RydWN0IG5ld19tb2R1bGUpKTsKCglvYmpfc3RyaW5nX3BhdGNoKGYsIHNlYy0+aWR4LCBvZmZzZXRvZihzdHJ1Y3QgbmV3X21vZHVsZSwgbmFtZSksCgkJCW1fbmFtZSk7CgoJcmV0dXJuIDE7Cn0KCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUwovKiBhZGQgYW4gZW50cnkgdG8gdGhlIF9fa3N5bXRhYiBzZWN0aW9uLCBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnkgKi8Kc3RhdGljIHZvaWQgbmV3X2FkZF9rc3ltdGFiKHN0cnVjdCBvYmpfZmlsZSAqZiwgc3RydWN0IG9ial9zeW1ib2wgKnN5bSkKewoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CglFbGZXKEFkZHIpIG9mczsKCgkvKiBlbnN1cmUgX19rc3ltdGFiIGlzIGFsbG9jYXRlZCwgRVhQT1JUX05PU1lNQk9MUyBjcmVhdGVzIGEgbm9uLWFsbG9jIHNlY3Rpb24uCgkgKiBJZiBfX2tzeW10YWIgaXMgZGVmaW5lZCBidXQgbm90IG1hcmtlZCBhbGxvYywgeCBvdXQgdGhlIGZpcnN0IGNoYXJhY3RlcgoJICogKG5vIG9ial9kZWxldGUgcm91dGluZSkgYW5kIGNyZWF0ZSBhIG5ldyBfX2tzeW10YWIgd2l0aCB0aGUgY29ycmVjdAoJICogY2hhcmFjdGVyaXN0aWNzLgoJICovCglzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICJfX2tzeW10YWIiKTsKCWlmIChzZWMgJiYgIShzZWMtPmhlYWRlci5zaF9mbGFncyAmIFNIRl9BTExPQykpIHsKCQkqKChjaGFyICopKHNlYy0+bmFtZSkpID0gJ3gnOwkvKiBvdmVycmlkZSBjb25zdCAqLwoJCXNlYyA9IE5VTEw7Cgl9CglpZiAoIXNlYykKCQlzZWMgPSBvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihmLCAiX19rc3ltdGFiIiwKCQkJCXRndF9zaXplb2Zfdm9pZF9wLCAwKTsKCWlmICghc2VjKQoJCXJldHVybjsKCXNlYy0+aGVhZGVyLnNoX2ZsYWdzIHw9IFNIRl9BTExPQzsKCXNlYy0+aGVhZGVyLnNoX2FkZHJhbGlnbiA9IHRndF9zaXplb2Zfdm9pZF9wOwkvKiBFbXB0eSBzZWN0aW9uIG1pZ2h0CgkJCQkJCQkJCQkJCQkgICBiZSBieXRlLWFsaWduZWQgKi8KCW9mcyA9IHNlYy0+aGVhZGVyLnNoX3NpemU7CglvYmpfc3ltYm9sX3BhdGNoKGYsIHNlYy0+aWR4LCBvZnMsIHN5bSk7CglvYmpfc3RyaW5nX3BhdGNoKGYsIHNlYy0+aWR4LCBvZnMgKyB0Z3Rfc2l6ZW9mX3ZvaWRfcCwgc3ltLT5uYW1lKTsKCW9ial9leHRlbmRfc2VjdGlvbihzZWMsIDIgKiB0Z3Rfc2l6ZW9mX2NoYXJfcCk7Cn0KI2VuZGlmIC8qIENPTkZJR19GRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTICovCgpzdGF0aWMgaW50IG5ld19jcmVhdGVfbW9kdWxlX2tzeW10YWIoc3RydWN0IG9ial9maWxlICpmKQp7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKCWludCBpOwoKCS8qIFdlIG11c3QgYWx3YXlzIGFkZCB0aGUgbW9kdWxlIHJlZmVyZW5jZXMuICAqLwoKCWlmIChuX2V4dF9tb2R1bGVzX3VzZWQpIHsKCQlzdHJ1Y3QgbmV3X21vZHVsZV9yZWYgKmRlcDsKCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqdG07CgoJCXNlYyA9IG9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKGYsICIua21vZHRhYiIsIHRndF9zaXplb2Zfdm9pZF9wLAoJCQkJKHNpemVvZihzdHJ1Y3QgbmV3X21vZHVsZV9yZWYpCgkJCQkgKiBuX2V4dF9tb2R1bGVzX3VzZWQpKTsKCQlpZiAoIXNlYykKCQkJcmV0dXJuIDA7CgoJCXRtID0gb2JqX2ZpbmRfc3ltYm9sKGYsIFNQRlggIl9fdGhpc19tb2R1bGUiKTsKCQlkZXAgPSAoc3RydWN0IG5ld19tb2R1bGVfcmVmICopIHNlYy0+Y29udGVudHM7CgkJZm9yIChpID0gMDsgaSA8IG5fZXh0X21vZHVsZXM7ICsraSkKCQkJaWYgKGV4dF9tb2R1bGVzW2ldLnVzZWQpIHsKCQkJCWRlcC0+ZGVwID0gZXh0X21vZHVsZXNbaV0uYWRkcjsKCQkJCW9ial9zeW1ib2xfcGF0Y2goZiwgc2VjLT5pZHgsCgkJCQkJCShjaGFyICopICZkZXAtPnJlZiAtIHNlYy0+Y29udGVudHMsIHRtKTsKCQkJCWRlcC0+bmV4dF9yZWYgPSAwOwoJCQkJKytkZXA7CgkJCX0KCX0KCglpZiAoZmxhZ19leHBvcnQgJiYgIW9ial9maW5kX3NlY3Rpb24oZiwgIl9fa3N5bXRhYiIpKSB7CgkJc2l6ZV90IG5zeW1zOwoJCWludCAqbG9hZGVkOwoKCQlzZWMgPQoJCQlvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihmLCAiX19rc3ltdGFiIiwgdGd0X3NpemVvZl92b2lkX3AsCgkJCQkJMCk7CgoJCS8qIFdlIGRvbid0IHdhbnQgdG8gZXhwb3J0IHN5bWJvbHMgcmVzaWRpbmcgaW4gc2VjdGlvbnMgdGhhdAoJCSAgIGFyZW4ndCBsb2FkZWQuICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgdGhlc2UgY3JlYXRlZCBzbyB0aGF0CgkJICAgd2UgbWFrZSBzdXJlIGNlcnRhaW4gbW9kdWxlIG9wdGlvbnMgZG9uJ3QgYXBwZWFyIHR3aWNlLiAgKi8KCgkJbG9hZGVkID0gYWxsb2NhKHNpemVvZihpbnQpICogKGkgPSBmLT5oZWFkZXIuZV9zaG51bSkpOwoJCXdoaWxlICgtLWkgPj0gMCkKCQkJbG9hZGVkW2ldID0gKGYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDA7CgoJCWZvciAobnN5bXMgPSBpID0gMDsgaSA8IEhBU0hfQlVDS0VUUzsgKytpKSB7CgkJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CgkJCWZvciAoc3ltID0gZi0+c3ltdGFiW2ldOyBzeW07IHN5bSA9IHN5bS0+bmV4dCkKCQkJCWlmIChFTEZXKFNUX0JJTkQpIChzeW0tPmluZm8pICE9IFNUQl9MT0NBTAoJCQkJCQkmJiBzeW0tPnNlY2lkeCA8PSBTSE5fSElSRVNFUlZFCgkJCQkJCSYmIChzeW0tPnNlY2lkeCA+PSBTSE5fTE9SRVNFUlZFCgkJCQkJCQl8fCBsb2FkZWRbc3ltLT5zZWNpZHhdKSkgewoJCQkJCUVsZlcoQWRkcikgb2ZzID0gbnN5bXMgKiAyICogdGd0X3NpemVvZl92b2lkX3A7CgoJCQkJCW9ial9zeW1ib2xfcGF0Y2goZiwgc2VjLT5pZHgsIG9mcywgc3ltKTsKCQkJCQlvYmpfc3RyaW5nX3BhdGNoKGYsIHNlYy0+aWR4LCBvZnMgKyB0Z3Rfc2l6ZW9mX3ZvaWRfcCwKCQkJCQkJCXN5bS0+bmFtZSk7CgoJCQkJCW5zeW1zKys7CgkJCQl9CgkJfQoKCQlvYmpfZXh0ZW5kX3NlY3Rpb24oc2VjLCBuc3ltcyAqIDIgKiB0Z3Rfc2l6ZW9mX2NoYXJfcCk7Cgl9CgoJcmV0dXJuIDE7Cn0KCgpzdGF0aWMgaW50Cm5ld19pbml0X21vZHVsZShjb25zdCBjaGFyICptX25hbWUsIHN0cnVjdCBvYmpfZmlsZSAqZiwKCQkJCXVuc2lnbmVkIGxvbmcgbV9zaXplKQp7CglzdHJ1Y3QgbmV3X21vZHVsZSAqbW9kdWxlOwoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7Cgl2b2lkICppbWFnZTsKCWludCByZXQ7Cgl0Z3RfbG9uZyBtX2FkZHI7CgoJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLnRoaXMiKTsKCWlmICghc2VjIHx8ICFzZWMtPmNvbnRlbnRzKSB7CgkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjb3JydXB0IG1vZHVsZSAlcz8iLG1fbmFtZSk7Cgl9Cgltb2R1bGUgPSAoc3RydWN0IG5ld19tb2R1bGUgKikgc2VjLT5jb250ZW50czsKCW1fYWRkciA9IHNlYy0+aGVhZGVyLnNoX2FkZHI7CgoJbW9kdWxlLT5zaXplX29mX3N0cnVjdCA9IHNpemVvZigqbW9kdWxlKTsKCW1vZHVsZS0+c2l6ZSA9IG1fc2l6ZTsKCW1vZHVsZS0+ZmxhZ3MgPSBmbGFnX2F1dG9jbGVhbiA/IE5FV19NT0RfQVVUT0NMRUFOIDogMDsKCglzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICJfX2tzeW10YWIiKTsKCWlmIChzZWMgJiYgc2VjLT5oZWFkZXIuc2hfc2l6ZSkgewoJCW1vZHVsZS0+c3ltcyA9IHNlYy0+aGVhZGVyLnNoX2FkZHI7CgkJbW9kdWxlLT5uc3ltcyA9IHNlYy0+aGVhZGVyLnNoX3NpemUgLyAoMiAqIHRndF9zaXplb2ZfY2hhcl9wKTsKCX0KCglpZiAobl9leHRfbW9kdWxlc191c2VkKSB7CgkJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLmttb2R0YWIiKTsKCQltb2R1bGUtPmRlcHMgPSBzZWMtPmhlYWRlci5zaF9hZGRyOwoJCW1vZHVsZS0+bmRlcHMgPSBuX2V4dF9tb2R1bGVzX3VzZWQ7Cgl9CgoJbW9kdWxlLT5pbml0ID0KCQlvYmpfc3ltYm9sX2ZpbmFsX3ZhbHVlKGYsIG9ial9maW5kX3N5bWJvbChmLCBTUEZYICJpbml0X21vZHVsZSIpKTsKCW1vZHVsZS0+Y2xlYW51cCA9CgkJb2JqX3N5bWJvbF9maW5hbF92YWx1ZShmLCBvYmpfZmluZF9zeW1ib2woZiwgU1BGWCAiY2xlYW51cF9tb2R1bGUiKSk7CgoJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiX19leF90YWJsZSIpOwoJaWYgKHNlYykgewoJCW1vZHVsZS0+ZXhfdGFibGVfc3RhcnQgPSBzZWMtPmhlYWRlci5zaF9hZGRyOwoJCW1vZHVsZS0+ZXhfdGFibGVfZW5kID0gc2VjLT5oZWFkZXIuc2hfYWRkciArIHNlYy0+aGVhZGVyLnNoX3NpemU7Cgl9CgoJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLnRleHQuaW5pdCIpOwoJaWYgKHNlYykgewoJCW1vZHVsZS0+cnVuc2l6ZSA9IHNlYy0+aGVhZGVyLnNoX2FkZHIgLSBtX2FkZHI7Cgl9CglzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICIuZGF0YS5pbml0Iik7CglpZiAoc2VjKSB7CgkJaWYgKCFtb2R1bGUtPnJ1bnNpemUgfHwKCQkJCW1vZHVsZS0+cnVuc2l6ZSA+IHNlYy0+aGVhZGVyLnNoX2FkZHIgLSBtX2FkZHIpCgkJCW1vZHVsZS0+cnVuc2l6ZSA9IHNlYy0+aGVhZGVyLnNoX2FkZHIgLSBtX2FkZHI7Cgl9CglzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsIEFSQ0hEQVRBX1NFQ19OQU1FKTsKCWlmIChzZWMgJiYgc2VjLT5oZWFkZXIuc2hfc2l6ZSkgewoJCW1vZHVsZS0+YXJjaGRhdGFfc3RhcnQgPSAodm9pZCopc2VjLT5oZWFkZXIuc2hfYWRkcjsKCQltb2R1bGUtPmFyY2hkYXRhX2VuZCA9IG1vZHVsZS0+YXJjaGRhdGFfc3RhcnQgKyBzZWMtPmhlYWRlci5zaF9zaXplOwoJfQoJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCBLQUxMU1lNU19TRUNfTkFNRSk7CglpZiAoc2VjICYmIHNlYy0+aGVhZGVyLnNoX3NpemUpIHsKCQltb2R1bGUtPmthbGxzeW1zX3N0YXJ0ID0gKHZvaWQqKXNlYy0+aGVhZGVyLnNoX2FkZHI7CgkJbW9kdWxlLT5rYWxsc3ltc19lbmQgPSBtb2R1bGUtPmthbGxzeW1zX3N0YXJ0ICsgc2VjLT5oZWFkZXIuc2hfc2l6ZTsKCX0KCglpZiAoIWFyY2hfaW5pdF9tb2R1bGUoZiwgbW9kdWxlKSkKCQlyZXR1cm4gMDsKCgkvKiBXaGV3ISAgQWxsIG9mIHRoZSBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS4gIENvbGxlY3QgdGhlIGZpbmFsCgkgICBtb2R1bGUgaW1hZ2UgYW5kIGdpdmUgaXQgdG8gdGhlIGtlcm5lbC4gICovCgoJaW1hZ2UgPSB4bWFsbG9jKG1fc2l6ZSk7CglvYmpfY3JlYXRlX2ltYWdlKGYsIGltYWdlKTsKCglyZXQgPSBuZXdfc3lzX2luaXRfbW9kdWxlKG1fbmFtZSwgKHN0cnVjdCBuZXdfbW9kdWxlICopIGltYWdlKTsKCWlmIChyZXQpCgkJYmJfcGVycm9yX21zZygiaW5pdF9tb2R1bGU6ICVzIiwgbV9uYW1lKTsKCglmcmVlKGltYWdlKTsKCglyZXR1cm4gcmV0ID09IDA7Cn0KCiNlbHNlCgojZGVmaW5lIG5ld19pbml0X21vZHVsZSh4LCB5LCB6KSBUUlVFCiNkZWZpbmUgbmV3X2NyZWF0ZV90aGlzX21vZHVsZSh4LCB5KSAwCiNkZWZpbmUgbmV3X2FkZF9rc3ltdGFiKHgsIHkpIC0xCiNkZWZpbmUgbmV3X2NyZWF0ZV9tb2R1bGVfa3N5bXRhYih4KQojZGVmaW5lIHF1ZXJ5X21vZHVsZSh2LCB3LCB4LCB5LCB6KSAtMQoKI2VuZGlmCQkJCQkJCS8qIENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTICovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnN0YXRpYyBpbnQKb2JqX3N0cmluZ19wYXRjaChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGludCBzZWNpZHgsIEVsZlcoQWRkcikgb2Zmc2V0LAoJCQkJIGNvbnN0IGNoYXIgKnN0cmluZykKewoJc3RydWN0IG9ial9zdHJpbmdfcGF0Y2ggKnA7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnN0cnNlYzsKCXNpemVfdCBsZW4gPSBzdHJsZW4oc3RyaW5nKSArIDE7CgljaGFyICpsb2M7CgoJcCA9IHhtYWxsb2Moc2l6ZW9mKCpwKSk7CglwLT5uZXh0ID0gZi0+c3RyaW5nX3BhdGNoZXM7CglwLT5yZWxvY19zZWNpZHggPSBzZWNpZHg7CglwLT5yZWxvY19vZmZzZXQgPSBvZmZzZXQ7CglmLT5zdHJpbmdfcGF0Y2hlcyA9IHA7CgoJc3Ryc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLmtzdHJ0YWIiKTsKCWlmIChzdHJzZWMgPT0gTlVMTCkgewoJCXN0cnNlYyA9IG9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKGYsICIua3N0cnRhYiIsIDEsIGxlbik7CgkJcC0+c3RyaW5nX29mZnNldCA9IDA7CgkJbG9jID0gc3Ryc2VjLT5jb250ZW50czsKCX0gZWxzZSB7CgkJcC0+c3RyaW5nX29mZnNldCA9IHN0cnNlYy0+aGVhZGVyLnNoX3NpemU7CgkJbG9jID0gb2JqX2V4dGVuZF9zZWN0aW9uKHN0cnNlYywgbGVuKTsKCX0KCW1lbWNweShsb2MsIHN0cmluZywgbGVuKTsKCglyZXR1cm4gMTsKfQoKI2lmZGVmIENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTCnN0YXRpYyBpbnQKb2JqX3N5bWJvbF9wYXRjaChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGludCBzZWNpZHgsIEVsZlcoQWRkcikgb2Zmc2V0LAoJCQkJIHN0cnVjdCBvYmpfc3ltYm9sICpzeW0pCnsKCXN0cnVjdCBvYmpfc3ltYm9sX3BhdGNoICpwOwoKCXAgPSB4bWFsbG9jKHNpemVvZigqcCkpOwoJcC0+bmV4dCA9IGYtPnN5bWJvbF9wYXRjaGVzOwoJcC0+cmVsb2Nfc2VjaWR4ID0gc2VjaWR4OwoJcC0+cmVsb2Nfb2Zmc2V0ID0gb2Zmc2V0OwoJcC0+c3ltID0gc3ltOwoJZi0+c3ltYm9sX3BhdGNoZXMgPSBwOwoKCXJldHVybiAxOwp9CiNlbmRpZgoKc3RhdGljIGludCBvYmpfY2hlY2tfdW5kZWZpbmVkcyhzdHJ1Y3Qgb2JqX2ZpbGUgKmYpCnsKCXVuc2lnbmVkIGxvbmcgaTsKCWludCByZXQgPSAxOwoKCWZvciAoaSA9IDA7IGkgPCBIQVNIX0JVQ0tFVFM7ICsraSkgewoJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CgkJZm9yIChzeW0gPSBmLT5zeW10YWJbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQoJCQlpZiAoc3ltLT5zZWNpZHggPT0gU0hOX1VOREVGKSB7CgkJCQlpZiAoRUxGVyhTVF9CSU5EKSAoc3ltLT5pbmZvKSA9PSBTVEJfV0VBSykgewoJCQkJCXN5bS0+c2VjaWR4ID0gU0hOX0FCUzsKCQkJCQlzeW0tPnZhbHVlID0gMDsKCQkJCX0gZWxzZSB7CgkJCQkJaWYgKCFmbGFnX3F1aWV0KSB7CgkJCQkJCWJiX2Vycm9yX21zZygidW5yZXNvbHZlZCBzeW1ib2wgJXMiLCBzeW0tPm5hbWUpOwoJCQkJCX0KCQkJCQlyZXQgPSAwOwoJCQkJfQoJCQl9Cgl9CgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHZvaWQgb2JqX2FsbG9jYXRlX2NvbW1vbnMoc3RydWN0IG9ial9maWxlICpmKQp7CglzdHJ1Y3QgY29tbW9uX2VudHJ5IHsKCQlzdHJ1Y3QgY29tbW9uX2VudHJ5ICpuZXh0OwoJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07Cgl9ICpjb21tb25faGVhZCA9IE5VTEw7CgoJdW5zaWduZWQgbG9uZyBpOwoKCWZvciAoaSA9IDA7IGkgPCBIQVNIX0JVQ0tFVFM7ICsraSkgewoJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CgkJZm9yIChzeW0gPSBmLT5zeW10YWJbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQoJCQlpZiAoc3ltLT5zZWNpZHggPT0gU0hOX0NPTU1PTikgewoJCQkJLyogQ29sbGVjdCBhbGwgQ09NTU9OIHN5bWJvbHMgYW5kIHNvcnQgdGhlbSBieSBzaXplIHNvIGFzIHRvCgkJCQkgICBtaW5pbWl6ZSBzcGFjZSB3YXN0ZWQgYnkgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4gICovCgkJCQl7CgkJCQkJc3RydWN0IGNvbW1vbl9lbnRyeSAqKnAsICpuOwoJCQkJCWZvciAocCA9ICZjb21tb25faGVhZDsgKnA7IHAgPSAmKCpwKS0+bmV4dCkKCQkJCQkJaWYgKHN5bS0+c2l6ZSA8PSAoKnApLT5zeW0tPnNpemUpCgkJCQkJCQlicmVhazsKCgkJCQkJbiA9IGFsbG9jYShzaXplb2YoKm4pKTsKCQkJCQluLT5uZXh0ID0gKnA7CgkJCQkJbi0+c3ltID0gc3ltOwoJCQkJCSpwID0gbjsKCQkJCX0KCQkJfQoJfQoKCWZvciAoaSA9IDE7IGkgPCBmLT5sb2NhbF9zeW10YWJfc2l6ZTsgKytpKSB7CgkJc3RydWN0IG9ial9zeW1ib2wgKnN5bSA9IGYtPmxvY2FsX3N5bXRhYltpXTsKCQlpZiAoc3ltICYmIHN5bS0+c2VjaWR4ID09IFNITl9DT01NT04pIHsKCQkJc3RydWN0IGNvbW1vbl9lbnRyeSAqKnAsICpuOwoJCQlmb3IgKHAgPSAmY29tbW9uX2hlYWQ7ICpwOyBwID0gJigqcCktPm5leHQpCgkJCQlpZiAoc3ltID09ICgqcCktPnN5bSkKCQkJCQlicmVhazsKCQkJCWVsc2UgaWYgKHN5bS0+c2l6ZSA8ICgqcCktPnN5bS0+c2l6ZSkgewoJCQkJCW4gPSBhbGxvY2Eoc2l6ZW9mKCpuKSk7CgkJCQkJbi0+bmV4dCA9ICpwOwoJCQkJCW4tPnN5bSA9IHN5bTsKCQkJCQkqcCA9IG47CgkJCQkJYnJlYWs7CgkJCQl9CgkJfQoJfQoKCWlmIChjb21tb25faGVhZCkgewoJCS8qIEZpbmQgdGhlIGJzcyBzZWN0aW9uLiAgKi8KCQlmb3IgKGkgPSAwOyBpIDwgZi0+aGVhZGVyLmVfc2hudW07ICsraSkKCQkJaWYgKGYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfdHlwZSA9PSBTSFRfTk9CSVRTKQoJCQkJYnJlYWs7CgoJCS8qIElmIGZvciBzb21lIHJlYXNvbiB0aGVyZSBoYWRuJ3QgYmVlbiBvbmUsIGNyZWF0ZSBvbmUuICAqLwoJCWlmIChpID09IGYtPmhlYWRlci5lX3NobnVtKSB7CgkJCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOwoKCQkJZi0+c2VjdGlvbnMgPSB4cmVhbGxvYyhmLT5zZWN0aW9ucywgKGkgKyAxKSAqIHNpemVvZihzZWMpKTsKCQkJZi0+c2VjdGlvbnNbaV0gPSBzZWMgPSBhcmNoX25ld19zZWN0aW9uKCk7CgkJCWYtPmhlYWRlci5lX3NobnVtID0gaSArIDE7CgoJCQltZW1zZXQoc2VjLCAwLCBzaXplb2YoKnNlYykpOwoJCQlzZWMtPmhlYWRlci5zaF90eXBlID0gU0hUX1BST0dCSVRTOwoJCQlzZWMtPmhlYWRlci5zaF9mbGFncyA9IFNIRl9XUklURSB8IFNIRl9BTExPQzsKCQkJc2VjLT5uYW1lID0gIi5ic3MiOwoJCQlzZWMtPmlkeCA9IGk7CgkJfQoKCQkvKiBBbGxvY2F0ZSB0aGUgQ09NTU9OUy4gICovCgkJewoJCQlFbGZXKEFkZHIpIGJzc19zaXplID0gZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF9zaXplOwoJCQlFbGZXKEFkZHIpIG1heF9hbGlnbiA9IGYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfYWRkcmFsaWduOwoJCQlzdHJ1Y3QgY29tbW9uX2VudHJ5ICpjOwoKCQkJZm9yIChjID0gY29tbW9uX2hlYWQ7IGM7IGMgPSBjLT5uZXh0KSB7CgkJCQlFbGZXKEFkZHIpIGFsaWduID0gYy0+c3ltLT52YWx1ZTsKCgkJCQlpZiAoYWxpZ24gPiBtYXhfYWxpZ24pCgkJCQkJbWF4X2FsaWduID0gYWxpZ247CgkJCQlpZiAoYnNzX3NpemUgJiAoYWxpZ24gLSAxKSkKCQkJCQlic3Nfc2l6ZSA9IChic3Nfc2l6ZSB8IChhbGlnbiAtIDEpKSArIDE7CgoJCQkJYy0+c3ltLT5zZWNpZHggPSBpOwoJCQkJYy0+c3ltLT52YWx1ZSA9IGJzc19zaXplOwoKCQkJCWJzc19zaXplICs9IGMtPnN5bS0+c2l6ZTsKCQkJfQoKCQkJZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF9zaXplID0gYnNzX3NpemU7CgkJCWYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfYWRkcmFsaWduID0gbWF4X2FsaWduOwoJCX0KCX0KCgkvKiBGb3IgdGhlIHNha2Ugb2YgcGF0Y2ggcmVsb2NhdGlvbiBhbmQgcGFyYW1ldGVyIGluaXRpYWxpemF0aW9uLAoJICAgYWxsb2NhdGUgemVyb2VkIGRhdGEgZm9yIE5PQklUUyBzZWN0aW9ucyBub3cuICBOb3RlIHRoYXQgYWZ0ZXIKCSAgIHRoaXMgd2UgY2Fubm90IGFzc3VtZSBOT0JJVFMgYXJlIHJlYWxseSBlbXB0eS4gICovCglmb3IgKGkgPSAwOyBpIDwgZi0+aGVhZGVyLmVfc2hudW07ICsraSkgewoJCXN0cnVjdCBvYmpfc2VjdGlvbiAqcyA9IGYtPnNlY3Rpb25zW2ldOwoJCWlmIChzLT5oZWFkZXIuc2hfdHlwZSA9PSBTSFRfTk9CSVRTKSB7CgkJCWlmIChzLT5oZWFkZXIuc2hfc2l6ZSAhPSAwKQoJCQkJcy0+Y29udGVudHMgPSBtZW1zZXQoeG1hbGxvYyhzLT5oZWFkZXIuc2hfc2l6ZSksCgkJCQkJCTAsIHMtPmhlYWRlci5zaF9zaXplKTsKCQkJZWxzZQoJCQkJcy0+Y29udGVudHMgPSBOVUxMOwoKCQkJcy0+aGVhZGVyLnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7CgkJfQoJfQp9CgpzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmpfbG9hZF9zaXplKHN0cnVjdCBvYmpfZmlsZSAqZikKewoJdW5zaWduZWQgbG9uZyBkb3QgPSAwOwoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CgoJLyogRmluYWxpemUgdGhlIHBvc2l0aW9ucyBvZiB0aGUgc2VjdGlvbnMgcmVsYXRpdmUgdG8gb25lIGFub3RoZXIuICAqLwoKCWZvciAoc2VjID0gZi0+bG9hZF9vcmRlcjsgc2VjOyBzZWMgPSBzZWMtPmxvYWRfbmV4dCkgewoJCUVsZlcoQWRkcikgYWxpZ247CgoJCWFsaWduID0gc2VjLT5oZWFkZXIuc2hfYWRkcmFsaWduOwoJCWlmIChhbGlnbiAmJiAoZG90ICYgKGFsaWduIC0gMSkpKQoJCQlkb3QgPSAoZG90IHwgKGFsaWduIC0gMSkpICsgMTsKCgkJc2VjLT5oZWFkZXIuc2hfYWRkciA9IGRvdDsKCQlkb3QgKz0gc2VjLT5oZWFkZXIuc2hfc2l6ZTsKCX0KCglyZXR1cm4gZG90Owp9CgpzdGF0aWMgaW50IG9ial9yZWxvY2F0ZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIEVsZlcoQWRkcikgYmFzZSkKewoJaW50IGksIG4gPSBmLT5oZWFkZXIuZV9zaG51bTsKCWludCByZXQgPSAxOwoKCS8qIEZpbmFsaXplIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zLiAgKi8KCglmLT5iYXNlYWRkciA9IGJhc2U7Cglmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQoJCWYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfYWRkciArPSBiYXNlOwoKCS8qIEFuZCBpdGVyYXRlIG92ZXIgYWxsIG9mIHRoZSByZWxvY2F0aW9ucy4gICovCgoJZm9yIChpID0gMDsgaSA8IG47ICsraSkgewoJCXN0cnVjdCBvYmpfc2VjdGlvbiAqcmVsc2VjLCAqc3ltc2VjLCAqdGFyZ3NlYywgKnN0cnNlYzsKCQlFbGZXKFJlbE0pICogcmVsLCAqcmVsZW5kOwoJCUVsZlcoU3ltKSAqIHN5bXRhYjsKCQljb25zdCBjaGFyICpzdHJ0YWI7CgoJCXJlbHNlYyA9IGYtPnNlY3Rpb25zW2ldOwoJCWlmIChyZWxzZWMtPmhlYWRlci5zaF90eXBlICE9IFNIVF9SRUxNKQoJCQljb250aW51ZTsKCgkJc3ltc2VjID0gZi0+c2VjdGlvbnNbcmVsc2VjLT5oZWFkZXIuc2hfbGlua107CgkJdGFyZ3NlYyA9IGYtPnNlY3Rpb25zW3JlbHNlYy0+aGVhZGVyLnNoX2luZm9dOwoJCXN0cnNlYyA9IGYtPnNlY3Rpb25zW3N5bXNlYy0+aGVhZGVyLnNoX2xpbmtdOwoKCQlyZWwgPSAoRWxmVyhSZWxNKSAqKSByZWxzZWMtPmNvbnRlbnRzOwoJCXJlbGVuZCA9IHJlbCArIChyZWxzZWMtPmhlYWRlci5zaF9zaXplIC8gc2l6ZW9mKEVsZlcoUmVsTSkpKTsKCQlzeW10YWIgPSAoRWxmVyhTeW0pICopIHN5bXNlYy0+Y29udGVudHM7CgkJc3RydGFiID0gKGNvbnN0IGNoYXIgKikgc3Ryc2VjLT5jb250ZW50czsKCgkJZm9yICg7IHJlbCA8IHJlbGVuZDsgKytyZWwpIHsKCQkJRWxmVyhBZGRyKSB2YWx1ZSA9IDA7CgkJCXN0cnVjdCBvYmpfc3ltYm9sICppbnRzeW0gPSBOVUxMOwoJCQl1bnNpZ25lZCBsb25nIHN5bW5keDsKCQkJRWxmVyhTeW0pICogZXh0c3ltID0gMDsKCQkJY29uc3QgY2hhciAqZXJybXNnOwoKCQkJLyogQXR0ZW1wdCB0byBmaW5kIGEgdmFsdWUgdG8gdXNlIGZvciB0aGlzIHJlbG9jYXRpb24uICAqLwoKCQkJc3ltbmR4ID0gRUxGVyhSX1NZTSkgKHJlbC0+cl9pbmZvKTsKCQkJaWYgKHN5bW5keCkgewoJCQkJLyogTm90ZSB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIHVuZGVmaW5lZCBzeW1ib2xzLiAgKi8KCgkJCQlleHRzeW0gPSAmc3ltdGFiW3N5bW5keF07CgkJCQlpZiAoRUxGVyhTVF9CSU5EKSAoZXh0c3ltLT5zdF9pbmZvKSA9PSBTVEJfTE9DQUwpIHsKCQkJCQkvKiBMb2NhbCBzeW1ib2xzIHdlIGxvb2sgdXAgaW4gdGhlIGxvY2FsIHRhYmxlIHRvIGJlIHN1cmUKCQkJCQkgICB3ZSBnZXQgdGhlIG9uZSB0aGF0IGlzIHJlYWxseSBpbnRlbmRlZC4gICovCgkJCQkJaW50c3ltID0gZi0+bG9jYWxfc3ltdGFiW3N5bW5keF07CgkJCQl9IGVsc2UgewoJCQkJCS8qIE90aGVycyB3ZSBsb29rIHVwIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KCQkJCQljb25zdCBjaGFyICpuYW1lOwoJCQkJCWlmIChleHRzeW0tPnN0X25hbWUpCgkJCQkJCW5hbWUgPSBzdHJ0YWIgKyBleHRzeW0tPnN0X25hbWU7CgkJCQkJZWxzZQoJCQkJCQluYW1lID0gZi0+c2VjdGlvbnNbZXh0c3ltLT5zdF9zaG5keF0tPm5hbWU7CgkJCQkJaW50c3ltID0gb2JqX2ZpbmRfc3ltYm9sKGYsIG5hbWUpOwoJCQkJfQoKCQkJCXZhbHVlID0gb2JqX3N5bWJvbF9maW5hbF92YWx1ZShmLCBpbnRzeW0pOwoJCQkJaW50c3ltLT5yZWZlcmVuY2VkID0gMTsKCQkJfQojaWYgU0hUX1JFTE0gPT0gU0hUX1JFTEEKI2lmIGRlZmluZWQoX19hbHBoYV9fKSAmJiBkZWZpbmVkKEFYUF9CUk9LRU5fR0FTKQoJCQkvKiBXb3JrIGFyb3VuZCBhIG5hc3R5IEdBUyBidWcsIHRoYXQgaXMgZml4ZWQgYXMgb2YgMi43LjAuOS4gICovCgkJCWlmICghZXh0c3ltIHx8ICFleHRzeW0tPnN0X25hbWUgfHwKCQkJCQlFTEZXKFNUX0JJTkQpIChleHRzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKI2VuZGlmCgkJCQl2YWx1ZSArPSByZWwtPnJfYWRkZW5kOwojZW5kaWYKCgkJCS8qIERvIGl0ISAqLwoJCQlzd2l0Y2ggKGFyY2hfYXBwbHlfcmVsb2NhdGlvbgoJCQkJCShmLCB0YXJnc2VjLCBzeW1zZWMsIGludHN5bSwgcmVsLCB2YWx1ZSkpIHsKCQkJCWNhc2Ugb2JqX3JlbG9jX29rOgoJCQkJCWJyZWFrOwoKCQkJCWNhc2Ugb2JqX3JlbG9jX292ZXJmbG93OgoJCQkJCWVycm1zZyA9ICJSZWxvY2F0aW9uIG92ZXJmbG93IjsKCQkJCQlnb3RvIGJhZF9yZWxvYzsKCQkJCWNhc2Ugb2JqX3JlbG9jX2Rhbmdlcm91czoKCQkJCQllcnJtc2cgPSAiRGFuZ2Vyb3VzIHJlbG9jYXRpb24iOwoJCQkJCWdvdG8gYmFkX3JlbG9jOwoJCQkJY2FzZSBvYmpfcmVsb2NfdW5oYW5kbGVkOgoJCQkJCWVycm1zZyA9ICJVbmhhbmRsZWQgcmVsb2NhdGlvbiI7CmJhZF9yZWxvYzoKCQkJCQlpZiAoZXh0c3ltKSB7CgkJCQkJCWJiX2Vycm9yX21zZygiJXMgb2YgdHlwZSAlbGQgZm9yICVzIiwgZXJybXNnLAoJCQkJCQkJCShsb25nKSBFTEZXKFJfVFlQRSkgKHJlbC0+cl9pbmZvKSwKCQkJCQkJCQlzdHJ0YWIgKyBleHRzeW0tPnN0X25hbWUpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWJiX2Vycm9yX21zZygiJXMgb2YgdHlwZSAlbGQiLCBlcnJtc2csCgkJCQkJCQkJKGxvbmcpIEVMRlcoUl9UWVBFKSAocmVsLT5yX2luZm8pKTsKCQkJCQl9CgkJCQkJcmV0ID0gMDsKCQkJCQlicmVhazsKCQkJfQoJCX0KCX0KCgkvKiBGaW5hbGx5LCB0YWtlIGNhcmUgb2YgdGhlIHBhdGNoZXMuICAqLwoKCWlmIChmLT5zdHJpbmdfcGF0Y2hlcykgewoJCXN0cnVjdCBvYmpfc3RyaW5nX3BhdGNoICpwOwoJCXN0cnVjdCBvYmpfc2VjdGlvbiAqc3Ryc2VjOwoJCUVsZlcoQWRkcikgc3Ryc2VjX2Jhc2U7CgkJc3Ryc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLmtzdHJ0YWIiKTsKCQlzdHJzZWNfYmFzZSA9IHN0cnNlYy0+aGVhZGVyLnNoX2FkZHI7CgoJCWZvciAocCA9IGYtPnN0cmluZ19wYXRjaGVzOyBwOyBwID0gcC0+bmV4dCkgewoJCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnRhcmdzZWMgPSBmLT5zZWN0aW9uc1twLT5yZWxvY19zZWNpZHhdOwoJCQkqKEVsZlcoQWRkcikgKikgKHRhcmdzZWMtPmNvbnRlbnRzICsgcC0+cmVsb2Nfb2Zmc2V0KQoJCQkJPSBzdHJzZWNfYmFzZSArIHAtPnN0cmluZ19vZmZzZXQ7CgkJfQoJfQoKCWlmIChmLT5zeW1ib2xfcGF0Y2hlcykgewoJCXN0cnVjdCBvYmpfc3ltYm9sX3BhdGNoICpwOwoKCQlmb3IgKHAgPSBmLT5zeW1ib2xfcGF0Y2hlczsgcDsgcCA9IHAtPm5leHQpIHsKCQkJc3RydWN0IG9ial9zZWN0aW9uICp0YXJnc2VjID0gZi0+c2VjdGlvbnNbcC0+cmVsb2Nfc2VjaWR4XTsKCQkJKihFbGZXKEFkZHIpICopICh0YXJnc2VjLT5jb250ZW50cyArIHAtPnJlbG9jX29mZnNldCkKCQkJCT0gb2JqX3N5bWJvbF9maW5hbF92YWx1ZShmLCBwLT5zeW0pOwoJCX0KCX0KCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IG9ial9jcmVhdGVfaW1hZ2Uoc3RydWN0IG9ial9maWxlICpmLCBjaGFyICppbWFnZSkKewoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CglFbGZXKEFkZHIpIGJhc2UgPSBmLT5iYXNlYWRkcjsKCglmb3IgKHNlYyA9IGYtPmxvYWRfb3JkZXI7IHNlYzsgc2VjID0gc2VjLT5sb2FkX25leHQpIHsKCQljaGFyICpzZWNpbWc7CgoJCWlmIChzZWMtPmNvbnRlbnRzID09IDAgfHwgc2VjLT5oZWFkZXIuc2hfc2l6ZSA9PSAwKQoJCQljb250aW51ZTsKCgkJc2VjaW1nID0gaW1hZ2UgKyAoc2VjLT5oZWFkZXIuc2hfYWRkciAtIGJhc2UpOwoKCQkvKiBOb3RlIHRoYXQgd2UgYWxsb2NhdGVkIGRhdGEgZm9yIE5PQklUUyBzZWN0aW9ucyBlYXJsaWVyLiAgKi8KCQltZW1jcHkoc2VjaW1nLCBzZWMtPmNvbnRlbnRzLCBzZWMtPmhlYWRlci5zaF9zaXplKTsKCX0KCglyZXR1cm4gMTsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnN0YXRpYyBzdHJ1Y3Qgb2JqX2ZpbGUgKm9ial9sb2FkKEZJTEUgKiBmcCwgaW50IGxvYWRwcm9nYml0cykKewoJc3RydWN0IG9ial9maWxlICpmOwoJRWxmVyhTaGRyKSAqIHNlY3Rpb25faGVhZGVyczsKCWludCBzaG51bSwgaTsKCWNoYXIgKnNoc3RydGFiOwoKCS8qIFJlYWQgdGhlIGZpbGUgaGVhZGVyLiAgKi8KCglmID0gYXJjaF9uZXdfZmlsZSgpOwoJbWVtc2V0KGYsIDAsIHNpemVvZigqZikpOwoJZi0+c3ltYm9sX2NtcCA9IHN0cmNtcDsKCWYtPnN5bWJvbF9oYXNoID0gb2JqX2VsZl9oYXNoOwoJZi0+bG9hZF9vcmRlcl9zZWFyY2hfc3RhcnQgPSAmZi0+bG9hZF9vcmRlcjsKCglmc2VlayhmcCwgMCwgU0VFS19TRVQpOwoJaWYgKGZyZWFkKCZmLT5oZWFkZXIsIHNpemVvZihmLT5oZWFkZXIpLCAxLCBmcCkgIT0gMSkgewoJCWJiX3BlcnJvcl9tc2coImVycm9yIHJlYWRpbmcgRUxGIGhlYWRlciIpOwoJCXJldHVybiBOVUxMOwoJfQoKCWlmIChmLT5oZWFkZXIuZV9pZGVudFtFSV9NQUcwXSAhPSBFTEZNQUcwCgkJCXx8IGYtPmhlYWRlci5lX2lkZW50W0VJX01BRzFdICE9IEVMRk1BRzEKCQkJfHwgZi0+aGVhZGVyLmVfaWRlbnRbRUlfTUFHMl0gIT0gRUxGTUFHMgoJCQl8fCBmLT5oZWFkZXIuZV9pZGVudFtFSV9NQUczXSAhPSBFTEZNQUczKSB7CgkJYmJfZXJyb3JfbXNnKCJub3QgYW4gRUxGIGZpbGUiKTsKCQlyZXR1cm4gTlVMTDsKCX0KCWlmIChmLT5oZWFkZXIuZV9pZGVudFtFSV9DTEFTU10gIT0gRUxGQ0xBU1NNCgkJCXx8IGYtPmhlYWRlci5lX2lkZW50W0VJX0RBVEFdICE9IEVMRkRBVEFNCgkJCXx8IGYtPmhlYWRlci5lX2lkZW50W0VJX1ZFUlNJT05dICE9IEVWX0NVUlJFTlQKCQkJfHwgIU1BVENIX01BQ0hJTkUoZi0+aGVhZGVyLmVfbWFjaGluZSkpIHsKCQliYl9lcnJvcl9tc2coIkVMRiBmaWxlIG5vdCBmb3IgdGhpcyBhcmNoaXRlY3R1cmUiKTsKCQlyZXR1cm4gTlVMTDsKCX0KCWlmIChmLT5oZWFkZXIuZV90eXBlICE9IEVUX1JFTCkgewoJCWJiX2Vycm9yX21zZygiRUxGIGZpbGUgbm90IGEgcmVsb2NhdGFibGUgb2JqZWN0Iik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJLyogUmVhZCB0aGUgc2VjdGlvbiBoZWFkZXJzLiAgKi8KCglpZiAoZi0+aGVhZGVyLmVfc2hlbnRzaXplICE9IHNpemVvZihFbGZXKFNoZHIpKSkgewoJCWJiX2Vycm9yX21zZygic2VjdGlvbiBoZWFkZXIgc2l6ZSBtaXNtYXRjaDogJWx1ICE9ICVsdSIsCgkJCQkodW5zaWduZWQgbG9uZykgZi0+aGVhZGVyLmVfc2hlbnRzaXplLAoJCQkJKHVuc2lnbmVkIGxvbmcpIHNpemVvZihFbGZXKFNoZHIpKSk7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJc2hudW0gPSBmLT5oZWFkZXIuZV9zaG51bTsKCWYtPnNlY3Rpb25zID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IG9ial9zZWN0aW9uICopICogc2hudW0pOwoJbWVtc2V0KGYtPnNlY3Rpb25zLCAwLCBzaXplb2Yoc3RydWN0IG9ial9zZWN0aW9uICopICogc2hudW0pOwoKCXNlY3Rpb25faGVhZGVycyA9IGFsbG9jYShzaXplb2YoRWxmVyhTaGRyKSkgKiBzaG51bSk7Cglmc2VlayhmcCwgZi0+aGVhZGVyLmVfc2hvZmYsIFNFRUtfU0VUKTsKCWlmIChmcmVhZChzZWN0aW9uX2hlYWRlcnMsIHNpemVvZihFbGZXKFNoZHIpKSwgc2hudW0sIGZwKSAhPSBzaG51bSkgewoJCWJiX3BlcnJvcl9tc2coImVycm9yIHJlYWRpbmcgRUxGIHNlY3Rpb24gaGVhZGVycyIpOwoJCXJldHVybiBOVUxMOwoJfQoKCS8qIFJlYWQgdGhlIHNlY3Rpb24gZGF0YS4gICovCgoJZm9yIChpID0gMDsgaSA8IHNobnVtOyArK2kpIHsKCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKCgkJZi0+c2VjdGlvbnNbaV0gPSBzZWMgPSBhcmNoX25ld19zZWN0aW9uKCk7CgkJbWVtc2V0KHNlYywgMCwgc2l6ZW9mKCpzZWMpKTsKCgkJc2VjLT5oZWFkZXIgPSBzZWN0aW9uX2hlYWRlcnNbaV07CgkJc2VjLT5pZHggPSBpOwoKCQlpZihzZWMtPmhlYWRlci5zaF9zaXplKSBzd2l0Y2ggKHNlYy0+aGVhZGVyLnNoX3R5cGUpIHsKCQkJY2FzZSBTSFRfTlVMTDoKCQkJY2FzZSBTSFRfTk9URToKCQkJY2FzZSBTSFRfTk9CSVRTOgoJCQkJLyogaWdub3JlICovCgkJCQlicmVhazsKCgkJCWNhc2UgU0hUX1BST0dCSVRTOgojaWYgTE9BREJJVFMKCQkJCWlmICghbG9hZHByb2diaXRzKSB7CgkJCQkJc2VjLT5jb250ZW50cyA9IE5VTEw7CgkJCQkJYnJlYWs7CgkJCQl9CiNlbmRpZgoJCQljYXNlIFNIVF9TWU1UQUI6CgkJCWNhc2UgU0hUX1NUUlRBQjoKCQkJY2FzZSBTSFRfUkVMTToKCQkJCWlmIChzZWMtPmhlYWRlci5zaF9zaXplID4gMCkgewoJCQkJCXNlYy0+Y29udGVudHMgPSB4bWFsbG9jKHNlYy0+aGVhZGVyLnNoX3NpemUpOwoJCQkJCWZzZWVrKGZwLCBzZWMtPmhlYWRlci5zaF9vZmZzZXQsIFNFRUtfU0VUKTsKCQkJCQlpZiAoZnJlYWQoc2VjLT5jb250ZW50cywgc2VjLT5oZWFkZXIuc2hfc2l6ZSwgMSwgZnApICE9IDEpIHsKCQkJCQkJYmJfcGVycm9yX21zZygiZXJyb3IgcmVhZGluZyBFTEYgc2VjdGlvbiBkYXRhIik7CgkJCQkJCXJldHVybiBOVUxMOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJc2VjLT5jb250ZW50cyA9IE5VTEw7CgkJCQl9CgkJCQlicmVhazsKCiNpZiBTSFRfUkVMTSA9PSBTSFRfUkVMCgkJCWNhc2UgU0hUX1JFTEE6CgkJCQliYl9lcnJvcl9tc2coIlJFTEEgcmVsb2NhdGlvbnMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGFyY2hpdGVjdHVyZSIpOwoJCQkJcmV0dXJuIE5VTEw7CiNlbHNlCgkJCWNhc2UgU0hUX1JFTDoKCQkJCWJiX2Vycm9yX21zZygiUkVMIHJlbG9jYXRpb25zIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBhcmNoaXRlY3R1cmUiKTsKCQkJCXJldHVybiBOVUxMOwojZW5kaWYKCgkJCWRlZmF1bHQ6CgkJCQlpZiAoc2VjLT5oZWFkZXIuc2hfdHlwZSA+PSBTSFRfTE9QUk9DKSB7CgkJCQkJLyogQXNzdW1lIHByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIHR5cGVzIGFyZSBkZWJ1ZwoJCQkJCSAgIGluZm8gYW5kIGNhbiBzYWZlbHkgYmUgaWdub3JlZC4gIElmIHRoaXMgaXMgZXZlciBub3QKCQkJCQkgICB0aGUgY2FzZSAoSGVsbG8gTUlQUz8pLCBkb24ndCBwdXQgaWZkZWZzIGhlcmUgYnV0CgkJCQkJICAgY3JlYXRlIGFuIGFyY2hfbG9hZF9wcm9jX3NlY3Rpb24oKS4gICovCgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJYmJfZXJyb3JfbXNnKCJjYW4ndCBoYW5kbGUgc2VjdGlvbnMgb2YgdHlwZSAlbGQiLAoJCQkJCQkobG9uZykgc2VjLT5oZWFkZXIuc2hfdHlwZSk7CgkJCQlyZXR1cm4gTlVMTDsKCQl9Cgl9CgoJLyogRG8gd2hhdCBzb3J0IG9mIGludGVycHJldGF0aW9uIGFzIG5lZWRlZCBieSBlYWNoIHNlY3Rpb24uICAqLwoKCXNoc3RydGFiID0gZi0+c2VjdGlvbnNbZi0+aGVhZGVyLmVfc2hzdHJuZHhdLT5jb250ZW50czsKCglmb3IgKGkgPSAwOyBpIDwgc2hudW07ICsraSkgewoJCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjID0gZi0+c2VjdGlvbnNbaV07CgkJc2VjLT5uYW1lID0gc2hzdHJ0YWIgKyBzZWMtPmhlYWRlci5zaF9uYW1lOwoJfQoKCWZvciAoaSA9IDA7IGkgPCBzaG51bTsgKytpKSB7CgkJc3RydWN0IG9ial9zZWN0aW9uICpzZWMgPSBmLT5zZWN0aW9uc1tpXTsKCgkJLyogLm1vZGluZm8gc2hvdWxkIGJlIGNvbnRlbnRzIG9ubHkgYnV0IGdjYyBoYXMgbm8gYXR0cmlidXRlIGZvciB0aGF0LgoJCSAqIFRoZSBrZXJuZWwgbWF5IGhhdmUgbWFya2VkIC5tb2RpbmZvIGFzIEFMTE9DLCBpZ25vcmUgdGhpcyBiaXQuCgkJICovCgkJaWYgKHN0cmNtcChzZWMtPm5hbWUsICIubW9kaW5mbyIpID09IDApCgkJCXNlYy0+aGVhZGVyLnNoX2ZsYWdzICY9IH5TSEZfQUxMT0M7CgoJCWlmIChzZWMtPmhlYWRlci5zaF9mbGFncyAmIFNIRl9BTExPQykKCQkJb2JqX2luc2VydF9zZWN0aW9uX2xvYWRfb3JkZXIoZiwgc2VjKTsKCgkJc3dpdGNoIChzZWMtPmhlYWRlci5zaF90eXBlKSB7CgkJCWNhc2UgU0hUX1NZTVRBQjoKCQkJCXsKCQkJCQl1bnNpZ25lZCBsb25nIG5zeW0sIGo7CgkJCQkJY2hhciAqc3RydGFiOwoJCQkJCUVsZlcoU3ltKSAqIHN5bTsKCgkJCQkJaWYgKHNlYy0+aGVhZGVyLnNoX2VudHNpemUgIT0gc2l6ZW9mKEVsZlcoU3ltKSkpIHsKCQkJCQkJYmJfZXJyb3JfbXNnKCJzeW1ib2wgc2l6ZSBtaXNtYXRjaDogJWx1ICE9ICVsdSIsCgkJCQkJCQkJKHVuc2lnbmVkIGxvbmcpIHNlYy0+aGVhZGVyLnNoX2VudHNpemUsCgkJCQkJCQkJKHVuc2lnbmVkIGxvbmcpIHNpemVvZihFbGZXKFN5bSkpKTsKCQkJCQkJcmV0dXJuIE5VTEw7CgkJCQkJfQoKCQkJCQluc3ltID0gc2VjLT5oZWFkZXIuc2hfc2l6ZSAvIHNpemVvZihFbGZXKFN5bSkpOwoJCQkJCXN0cnRhYiA9IGYtPnNlY3Rpb25zW3NlYy0+aGVhZGVyLnNoX2xpbmtdLT5jb250ZW50czsKCQkJCQlzeW0gPSAoRWxmVyhTeW0pICopIHNlYy0+Y29udGVudHM7CgoJCQkJCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIHRhYmxlIG9mIGxvY2FsIHN5bWJvbHMuICAqLwoJCQkJCWogPSBmLT5sb2NhbF9zeW10YWJfc2l6ZSA9IHNlYy0+aGVhZGVyLnNoX2luZm87CgkJCQkJZi0+bG9jYWxfc3ltdGFiID0geGNhbGxvYyhqLCBzaXplb2Yoc3RydWN0IG9ial9zeW1ib2wgKikpOwoKCQkJCQkvKiBJbnNlcnQgYWxsIHN5bWJvbHMgaW50byB0aGUgaGFzaCB0YWJsZS4gICovCgkJCQkJZm9yIChqID0gMSwgKytzeW07IGogPCBuc3ltOyArK2osICsrc3ltKSB7CgkJCQkJCUVsZlcoQWRkcikgdmFsID0gc3ltLT5zdF92YWx1ZTsKCQkJCQkJY29uc3QgY2hhciAqbmFtZTsKCQkJCQkJaWYgKHN5bS0+c3RfbmFtZSkKCQkJCQkJCW5hbWUgPSBzdHJ0YWIgKyBzeW0tPnN0X25hbWU7CgkJCQkJCWVsc2UgaWYgKHN5bS0+c3Rfc2huZHggPCBzaG51bSkKCQkJCQkJCW5hbWUgPSBmLT5zZWN0aW9uc1tzeW0tPnN0X3NobmR4XS0+bmFtZTsKCQkJCQkJZWxzZQoJCQkJCQkJY29udGludWU7CgojaWYgZGVmaW5lZChfX1NINV9fKQoJCQkJCQkvKgoJCQkJCQkgKiBGb3Igc2g2NCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSB0YXJnZXQgb2YgYSBicmFuY2gKCQkJCQkJICogcmVxdWlyZXMgYSBtb2RlIHN3aXRjaCAoMzIgdG8gMTYgYW5kIGJhY2sgYWdhaW4pLgoJCQkJCQkgKgoJCQkJCQkgKiBUaGlzIGlzIGltcGxpZWQgYnkgdGhlIGxzYiBiZWluZyBzZXQgaW4gdGhlIHRhcmdldAoJCQkJCQkgKiBhZGRyZXNzIGZvciBTSG1lZGlhIG1vZGUgYW5kIGNsZWFyIGZvciBTSGNvbXBhY3QuCgkJCQkJCSAqLwoJCQkJCQl2YWwgfD0gc3ltLT5zdF9vdGhlciAmIDQ7CiNlbmRpZgoKCQkJCQkJb2JqX2FkZF9zeW1ib2woZiwgbmFtZSwgaiwgc3ltLT5zdF9pbmZvLCBzeW0tPnN0X3NobmR4LAoJCQkJCQkJCXZhbCwgc3ltLT5zdF9zaXplKTsKCQkJCQl9CgkJCQl9CgkJCQlicmVhazsKCgkJCWNhc2UgU0hUX1JFTE06CgkJCQlpZiAoc2VjLT5oZWFkZXIuc2hfZW50c2l6ZSAhPSBzaXplb2YoRWxmVyhSZWxNKSkpIHsKCQkJCQliYl9lcnJvcl9tc2coInJlbG9jYXRpb24gZW50cnkgc2l6ZSBtaXNtYXRjaDogJWx1ICE9ICVsdSIsCgkJCQkJCQkodW5zaWduZWQgbG9uZykgc2VjLT5oZWFkZXIuc2hfZW50c2l6ZSwKCQkJCQkJCSh1bnNpZ25lZCBsb25nKSBzaXplb2YoRWxmVyhSZWxNKSkpOwoJCQkJCXJldHVybiBOVUxMOwoJCQkJfQoJCQkJYnJlYWs7CgkJCQkvKiBYWFggIFJlbG9jYXRpb24gY29kZSBmcm9tIG1vZHV0aWxzLTIuMy4xOSBpcyBub3QgaGVyZS4KCQkJCSAqIFdoeT8gIFRoYXQncyBhYm91dCAyMCBsaW5lcyBvZiBjb2RlIGZyb20gb2JqL29ial9sb2FkLmMsCgkJCQkgKiB3aGljaCBnZXRzIGRvbmUgaW4gYSBzZWNvbmQgcGFzcyB0aHJvdWdoIHRoZSBzZWN0aW9ucy4KCQkJCSAqIFRoaXMgQnVzeUJveCBpbnNtb2QgZG9lcyBzaW1pbGFyIHdvcmsgaW4gb2JqX3JlbG9jYXRlKCkuICovCgkJfQoJfQoKCXJldHVybiBmOwp9CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURJTktNRU0KLyoKICogbG9hZCB0aGUgdW5sb2FkZWQgc2VjdGlvbnMgZGlyZWN0bHkgaW50byB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieQogKiBrZXJuZWwgZm9yIHRoZSBtb2R1bGUKICovCgpzdGF0aWMgaW50IG9ial9sb2FkX3Byb2diaXRzKEZJTEUgKiBmcCwgc3RydWN0IG9ial9maWxlKiBmLCBjaGFyKiBpbWFnZWJhc2UpCnsKCUVsZlcoQWRkcikgYmFzZSA9IGYtPmJhc2VhZGRyOwoJc3RydWN0IG9ial9zZWN0aW9uKiBzZWM7CgoJZm9yIChzZWMgPSBmLT5sb2FkX29yZGVyOyBzZWM7IHNlYyA9IHNlYy0+bG9hZF9uZXh0KSB7CgoJCS8qIHNlY3Rpb24gYWxyZWFkeSBsb2FkZWQ/ICovCgkJaWYgKHNlYy0+Y29udGVudHMgIT0gTlVMTCkKCQkJY29udGludWU7CgoJCWlmIChzZWMtPmhlYWRlci5zaF9zaXplID09IDApCgkJCWNvbnRpbnVlOwoKCQlzZWMtPmNvbnRlbnRzID0gaW1hZ2ViYXNlICsgKHNlYy0+aGVhZGVyLnNoX2FkZHIgLSBiYXNlKTsKCQlmc2VlayhmcCwgc2VjLT5oZWFkZXIuc2hfb2Zmc2V0LCBTRUVLX1NFVCk7CgkJaWYgKGZyZWFkKHNlYy0+Y29udGVudHMsIHNlYy0+aGVhZGVyLnNoX3NpemUsIDEsIGZwKSAhPSAxKSB7CgkJCWJiX2Vycm9yX21zZygiZXJyb3IgcmVhZGluZyBFTEYgc2VjdGlvbiBkYXRhOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKCQkJcmV0dXJuIDA7CgkJfQoKCX0KCXJldHVybiAxOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgaGlkZV9zcGVjaWFsX3N5bWJvbHMoc3RydWN0IG9ial9maWxlICpmKQp7CglzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3BlY2lhbHNbXSA9IHsKCQlTUEZYICJjbGVhbnVwX21vZHVsZSIsCgkJU1BGWCAiaW5pdF9tb2R1bGUiLAoJCVNQRlggImtlcm5lbF92ZXJzaW9uIiwKCQlOVUxMCgl9OwoKCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07Cgljb25zdCBjaGFyICpjb25zdCAqcDsKCglmb3IgKHAgPSBzcGVjaWFsczsgKnA7ICsrcCkKCQlpZiAoKHN5bSA9IG9ial9maW5kX3N5bWJvbChmLCAqcCkpICE9IE5VTEwpCgkJCXN5bS0+aW5mbyA9CgkJCQlFTEZXKFNUX0lORk8pIChTVEJfTE9DQUwsIEVMRlcoU1RfVFlQRSkgKHN5bS0+aW5mbykpOwp9CgoKI2lmZGVmIENPTkZJR19GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFCnN0YXRpYyBpbnQgb2JqX2dwbF9saWNlbnNlKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqKmxpY2Vuc2UpCnsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOwoJLyogVGhpcyBsaXN0IG11c3QgbWF0Y2ggKmV4YWN0bHkqIHRoZSBsaXN0IG9mIGFsbG93YWJsZSBsaWNlbnNlcyBpbgoJICogbGludXgvaW5jbHVkZS9saW51eC9tb2R1bGUuaC4gIENoZWNraW5nIGZvciBsZWFkaW5nICJHUEwiIHdpbGwgbm90CgkgKiB3b3JrLCBzb21lYm9keSB3aWxsIHVzZSAiR1BMIHN1Y2tzLCB0aGlzIGlzIHByb3ByaWV0YXJ5Ii4KCSAqLwoJc3RhdGljIGNvbnN0IGNoYXIgKmdwbF9saWNlbnNlc1tdID0gewoJCSJHUEwiLAoJCSJHUEwgdjIiLAoJCSJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIiwKCQkiRHVhbCBCU0QvR1BMIiwKCQkiRHVhbCBNUEwvR1BMIiwKCX07CgoJaWYgKChzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICIubW9kaW5mbyIpKSkgewoJCWNvbnN0IGNoYXIgKnZhbHVlLCAqcHRyLCAqZW5kcHRyOwoJCXB0ciA9IHNlYy0+Y29udGVudHM7CgkJZW5kcHRyID0gcHRyICsgc2VjLT5oZWFkZXIuc2hfc2l6ZTsKCQl3aGlsZSAocHRyIDwgZW5kcHRyKSB7CgkJCWlmICgodmFsdWUgPSBzdHJjaHIocHRyLCAnPScpKSAmJiBzdHJuY21wKHB0ciwgImxpY2Vuc2UiLCB2YWx1ZS1wdHIpID09IDApIHsKCQkJCWludCBpOwoJCQkJaWYgKGxpY2Vuc2UpCgkJCQkJKmxpY2Vuc2UgPSB2YWx1ZSsxOwoJCQkJZm9yIChpID0gMDsgaSA8IHNpemVvZihncGxfbGljZW5zZXMpL3NpemVvZihncGxfbGljZW5zZXNbMF0pOyArK2kpIHsKCQkJCQlpZiAoc3RyY21wKHZhbHVlKzEsIGdwbF9saWNlbnNlc1tpXSkgPT0gMCkKCQkJCQkJcmV0dXJuKDApOwoJCQkJfQoJCQkJcmV0dXJuKDIpOwoJCQl9CgkJCWlmIChzdHJjaHIocHRyLCAnXDAnKSkKCQkJCXB0ciA9IHN0cmNocihwdHIsICdcMCcpICsgMTsKCQkJZWxzZQoJCQkJcHRyID0gZW5kcHRyOwoJCX0KCX0KCXJldHVybigxKTsKfQoKI2RlZmluZSBUQUlOVF9GSUxFTkFNRSAgICAgICAgICAgICAgICAgICIvcHJvYy9zeXMva2VybmVsL3RhaW50ZWQiCiNkZWZpbmUgVEFJTlRfUFJPUFJJRVRPUllfTU9EVUxFICAgICAgICAoMTw8MCkKI2RlZmluZSBUQUlOVF9GT1JDRURfTU9EVUxFICAgICAgICAgICAgICgxPDwxKQojZGVmaW5lIFRBSU5UX1VOU0FGRV9TTVAgICAgICAgICAgICAgICAgKDE8PDIpCiNkZWZpbmUgVEFJTlRfVVJMCQkJCQkJImh0dHA6Ly93d3cudHV4Lm9yZy9sa21sLyNleHBvcnQtdGFpbnRlZCIKCnN0YXRpYyB2b2lkIHNldF90YWludGVkKHN0cnVjdCBvYmpfZmlsZSAqZiwgaW50IGZkLCBjaGFyICptX25hbWUsCgkJaW50IGtlcm5lbF9oYXNfdGFpbnRlZCwgaW50IHRhaW50LCBjb25zdCBjaGFyICp0ZXh0MSwgY29uc3QgY2hhciAqdGV4dDIpCnsKCWNoYXIgYnVmWzgwXTsKCWludCBvbGR2YWw7CglzdGF0aWMgaW50IGZpcnN0ID0gMTsKCWlmIChmZCA8IDAgJiYgIWtlcm5lbF9oYXNfdGFpbnRlZCkKCQlyZXR1cm47CQkvKiBOZXcgbW9kdXRpbHMgb24gb2xkIGtlcm5lbCAqLwoJcHJpbnRmKCJXYXJuaW5nOiBsb2FkaW5nICVzIHdpbGwgdGFpbnQgdGhlIGtlcm5lbDogJXMlc1xuIiwKCQkJbV9uYW1lLCB0ZXh0MSwgdGV4dDIpOwoJaWYgKGZpcnN0KSB7CgkJcHJpbnRmKCIgIFNlZSAlcyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGFpbnRlZCBtb2R1bGVzXG4iLCBUQUlOVF9VUkwpOwoJCWZpcnN0ID0gMDsKCX0KCWlmIChmZCA+PSAwKSB7CgkJcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKS0xKTsKCQlidWZbc2l6ZW9mKGJ1ZiktMV0gPSAnXDAnOwoJCW9sZHZhbCA9IHN0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CgkJc3ByaW50ZihidWYsICIlZFxuIiwgb2xkdmFsIHwgdGFpbnQpOwoJCXdyaXRlKGZkLCBidWYsIHN0cmxlbihidWYpKTsKCX0KfQoKLyogQ2hlY2sgaWYgbG9hZGluZyB0aGlzIG1vZHVsZSB3aWxsIHRhaW50IHRoZSBrZXJuZWwuICovCnN0YXRpYyB2b2lkIGNoZWNrX3RhaW50ZWRfbW9kdWxlKHN0cnVjdCBvYmpfZmlsZSAqZiwgY2hhciAqbV9uYW1lKQp7CglzdGF0aWMgY29uc3QgY2hhciB0YWludGVkX2ZpbGVbXSA9IFRBSU5UX0ZJTEVOQU1FOwoJaW50IGZkLCBrZXJuZWxfaGFzX3RhaW50ZWQ7Cgljb25zdCBjaGFyICpwdHI7CgoJa2VybmVsX2hhc190YWludGVkID0gMTsKCWlmICgoZmQgPSBvcGVuKHRhaW50ZWRfZmlsZSwgT19SRFdSKSkgPCAwKSB7CgkJaWYgKGVycm5vID09IEVOT0VOVCkKCQkJa2VybmVsX2hhc190YWludGVkID0gMDsKCQllbHNlIGlmIChlcnJubyA9PSBFQUNDRVMpCgkJCWtlcm5lbF9oYXNfdGFpbnRlZCA9IDE7CgkJZWxzZSB7CgkJCXBlcnJvcih0YWludGVkX2ZpbGUpOwoJCQlrZXJuZWxfaGFzX3RhaW50ZWQgPSAwOwoJCX0KCX0KCglzd2l0Y2ggKG9ial9ncGxfbGljZW5zZShmLCAmcHRyKSkgewoJCWNhc2UgMDoKCQkJYnJlYWs7CgkJY2FzZSAxOgoJCQlzZXRfdGFpbnRlZChmLCBmZCwgbV9uYW1lLCBrZXJuZWxfaGFzX3RhaW50ZWQsIFRBSU5UX1BST1BSSUVUT1JZX01PRFVMRSwgIm5vIGxpY2Vuc2UiLCAiIik7CgkJCWJyZWFrOwoJCWNhc2UgMjoKCQkJLyogVGhlIG1vZHVsZSBoYXMgYSBub24tR1BMIGxpY2Vuc2Ugc28gd2UgcHJldGVuZCB0aGF0IHRoZQoJCQkgKiBrZXJuZWwgYWx3YXlzIGhhcyBhIHRhaW50IGZsYWcgdG8gZ2V0IGEgd2FybmluZyBldmVuIG9uCgkJCSAqIGtlcm5lbHMgd2l0aG91dCB0aGUgcHJvYyBmbGFnLgoJCQkgKi8KCQkJc2V0X3RhaW50ZWQoZiwgZmQsIG1fbmFtZSwgMSwgVEFJTlRfUFJPUFJJRVRPUllfTU9EVUxFLCAibm9uLUdQTCBsaWNlbnNlIC0gIiwgcHRyKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJc2V0X3RhaW50ZWQoZiwgZmQsIG1fbmFtZSwgMSwgVEFJTlRfUFJPUFJJRVRPUllfTU9EVUxFLCAiVW5leHBlY3RlZCByZXR1cm4gZnJvbSBvYmpfZ3BsX2xpY2Vuc2UiLCAiIik7CgkJCWJyZWFrOwoJfQoKCWlmIChmbGFnX2ZvcmNlX2xvYWQpCgkJc2V0X3RhaW50ZWQoZiwgZmQsIG1fbmFtZSwgMSwgVEFJTlRfRk9SQ0VEX01PRFVMRSwgImZvcmNlZCBsb2FkIiwgIiIpOwoKCWlmIChmZCA+PSAwKQoJCWNsb3NlKGZkKTsKfQojZWxzZSAvKiBDT05GSUdfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRSAqLwojZGVmaW5lIGNoZWNrX3RhaW50ZWRfbW9kdWxlKHgsIHkpIGRvIHsgfSB3aGlsZSgwKTsKI2VuZGlmIC8qIENPTkZJR19GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFICovCgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMKLyogYWRkIG1vZHVsZSBzb3VyY2UsIHRpbWVzdGFtcCwga2VybmVsIHZlcnNpb24gYW5kIGEgc3ltYm9sIGZvciB0aGUKICogc3RhcnQgb2Ygc29tZSBzZWN0aW9ucy4gIHRoaXMgaW5mbyBpcyB1c2VkIGJ5IGtzeW1vb3BzIHRvIGRvIGJldHRlcgogKiBkZWJ1Z2dpbmcuCiAqLwpzdGF0aWMgaW50CmdldF9tb2R1bGVfdmVyc2lvbihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNoYXIgc3RyW1NUUlZFUlNJT05MRU5dKQp7CiNpZmRlZiBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORwoJaWYgKGdldF9tb2RpbmZvX3ZhbHVlKGYsICJrZXJuZWxfdmVyc2lvbiIpID09IE5VTEwpCgkJcmV0dXJuIG9sZF9nZXRfbW9kdWxlX3ZlcnNpb24oZiwgc3RyKTsKCWVsc2UKCQlyZXR1cm4gbmV3X2dldF9tb2R1bGVfdmVyc2lvbihmLCBzdHIpOwojZWxzZSAgLyogQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcgKi8KCXN0cm5jcHkoc3RyLCAiPz8/Iiwgc2l6ZW9mKHN0cikpOwoJcmV0dXJuIC0xOwojZW5kaWYgLyogQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcgKi8KfQoKLyogYWRkIG1vZHVsZSBzb3VyY2UsIHRpbWVzdGFtcCwga2VybmVsIHZlcnNpb24gYW5kIGEgc3ltYm9sIGZvciB0aGUKICogc3RhcnQgb2Ygc29tZSBzZWN0aW9ucy4gIHRoaXMgaW5mbyBpcyB1c2VkIGJ5IGtzeW1vb3BzIHRvIGRvIGJldHRlcgogKiBkZWJ1Z2dpbmcuCiAqLwpzdGF0aWMgdm9pZAphZGRfa3N5bW9vcHNfc3ltYm9scyhzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAoJCQkJIGNvbnN0IGNoYXIgKm1fbmFtZSkKewoJc3RhdGljIGNvbnN0IGNoYXIgc3ltcHJlZml4W10gPSAiX19pbnNtb2RfIjsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOwoJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKCWNoYXIgKm5hbWUsICphYnNvbHV0ZV9maWxlbmFtZTsKCWNoYXIgc3RyW1NUUlZFUlNJT05MRU5dLCByZWFsW1BBVEhfTUFYXTsKCWludCBpLCBsLCBsbV9uYW1lLCBsZmlsZW5hbWUsIHVzZV9rc3ltdGFiLCB2ZXJzaW9uOwoJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKCglzdGF0aWMgY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lc1tdID0gewoJCSIudGV4dCIsCgkJIi5yb2RhdGEiLAoJCSIuZGF0YSIsCgkJIi5ic3MiCgkJCSIuc2JzcyIKCX07CgoJaWYgKHJlYWxwYXRoKGZpbGVuYW1lLCByZWFsKSkgewoJCWFic29sdXRlX2ZpbGVuYW1lID0gYmJfeHN0cmR1cChyZWFsKTsKCX0KCWVsc2UgewoJCWludCBzYXZlX2Vycm5vID0gZXJybm87CgkJYmJfZXJyb3JfbXNnKCJjYW5ub3QgZ2V0IHJlYWxwYXRoIGZvciAlcyIsIGZpbGVuYW1lKTsKCQllcnJubyA9IHNhdmVfZXJybm87CgkJcGVycm9yKCIiKTsKCQlhYnNvbHV0ZV9maWxlbmFtZSA9IGJiX3hzdHJkdXAoZmlsZW5hbWUpOwoJfQoKCWxtX25hbWUgPSBzdHJsZW4obV9uYW1lKTsKCWxmaWxlbmFtZSA9IHN0cmxlbihhYnNvbHV0ZV9maWxlbmFtZSk7CgoJLyogYWRkIHRvIGtzeW10YWIgaWYgaXQgYWxyZWFkeSBleGlzdHMgb3IgdGhlcmUgaXMgbm8ga3N5bXRhYiBhbmQgb3RoZXIgc3ltYm9scwoJICogYXJlIG5vdCB0byBiZSBleHBvcnRlZC4gIG90aGVyd2lzZSBsZWF2ZSBrc3ltdGFiIGFsb25lIGZvciBub3csIHRoZQoJICogImV4cG9ydCBhbGwgc3ltYm9scyIgY29tcGF0aWJpbGl0eSBjb2RlIHdpbGwgZXhwb3J0IHRoZXNlIHN5bWJvbHMgbGF0ZXIuCgkgKi8KCXVzZV9rc3ltdGFiID0gIG9ial9maW5kX3NlY3Rpb24oZiwgIl9fa3N5bXRhYiIpIHx8ICFmbGFnX2V4cG9ydDsKCglpZiAoKHNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi50aGlzIikpKSB7CgkJLyogdGFnIHRoZSBtb2R1bGUgaGVhZGVyIHdpdGggdGhlIG9iamVjdCBuYW1lLCBsYXN0IG1vZGlmaWVkCgkJICogdGltZXN0YW1wIGFuZCBtb2R1bGUgdmVyc2lvbi4gIHdvcnN0IGNhc2UgZm9yIG1vZHVsZSB2ZXJzaW9uCgkJICogaXMgMHhmZmZmZmYsIGRlY2ltYWwgMTY3NzcyMTUuICBwdXR0aW5nIGFsbCB0aHJlZSBmaWVsZHMgaW4KCQkgKiBvbmUgc3ltYm9sIGlzIGxlc3MgcmVhZGFibGUgYnV0IHNhdmVzIGtlcm5lbCBzcGFjZS4KCQkgKi8KCQlsID0gc2l6ZW9mKHN5bXByZWZpeCkrCQkJLyogIl9faW5zbW9kXyIgKi8KCQkJbG1fbmFtZSsJCQkJLyogbW9kdWxlIG5hbWUgKi8KCQkJMisJCQkJCS8qICJfTyIgKi8KCQkJbGZpbGVuYW1lKwkJCQkvKiBvYmplY3QgZmlsZW5hbWUgKi8KCQkJMisJCQkJCS8qICJfTSIgKi8KCQkJMipzaXplb2Yoc3RhdGJ1Zi5zdF9tdGltZSkrCQkvKiBtdGltZSBpbiBoZXggKi8KCQkJMisJCQkJCS8qICJfViIgKi8KCQkJOCsJCQkJCS8qIHZlcnNpb24gaW4gZGVjICovCgkJCTE7CQkJCQkvKiBudWwgKi8KCQluYW1lID0geG1hbGxvYyhsKTsKCQlpZiAoc3RhdChhYnNvbHV0ZV9maWxlbmFtZSwgJnN0YXRidWYpICE9IDApCgkJCXN0YXRidWYuc3RfbXRpbWUgPSAwOwoJCXZlcnNpb24gPSBnZXRfbW9kdWxlX3ZlcnNpb24oZiwgc3RyKTsJLyogLTEgaWYgbm90IGZvdW5kICovCgkJc25wcmludGYobmFtZSwgbCwgIiVzJXNfTyVzX00lMCpsWF9WJWQiLAoJCQkJc3ltcHJlZml4LCBtX25hbWUsIGFic29sdXRlX2ZpbGVuYW1lLAoJCQkJKGludCkoMipzaXplb2Yoc3RhdGJ1Zi5zdF9tdGltZSkpLCBzdGF0YnVmLnN0X210aW1lLAoJCQkJdmVyc2lvbik7CgkJc3ltID0gb2JqX2FkZF9zeW1ib2woZiwgbmFtZSwgLTEsCgkJCQlFTEZXKFNUX0lORk8pIChTVEJfR0xPQkFMLCBTVFRfTk9UWVBFKSwKCQkJCXNlYy0+aWR4LCBzZWMtPmhlYWRlci5zaF9hZGRyLCAwKTsKCQlpZiAodXNlX2tzeW10YWIpCgkJCW5ld19hZGRfa3N5bXRhYihmLCBzeW0pOwoJfQoJZnJlZShhYnNvbHV0ZV9maWxlbmFtZSk7CiNpZmRlZiBfTk9UX1NVUFBPUlRFRF8KCS8qIHJlY29yZCB3aGVyZSB0aGUgcGVyc2lzdGVudCBkYXRhIGlzIGdvaW5nLCBzYW1lIGFkZHJlc3MgYXMgcHJldmlvdXMgc3ltYm9sICovCgoJaWYgKGYtPnBlcnNpc3QpIHsKCQlsID0gc2l6ZW9mKHN5bXByZWZpeCkrCQkvKiAiX19pbnNtb2RfIiAqLwoJCQlsbV9uYW1lKwkJLyogbW9kdWxlIG5hbWUgKi8KCQkJMisJCQkvKiAiX1AiICovCgkJCXN0cmxlbihmLT5wZXJzaXN0KSsJLyogZGF0YSBzdG9yZSAqLwoJCQkxOwkJCS8qIG51bCAqLwoJCW5hbWUgPSB4bWFsbG9jKGwpOwoJCXNucHJpbnRmKG5hbWUsIGwsICIlcyVzX1AlcyIsCgkJCQlzeW1wcmVmaXgsIG1fbmFtZSwgZi0+cGVyc2lzdCk7CgkJc3ltID0gb2JqX2FkZF9zeW1ib2woZiwgbmFtZSwgLTEsIEVMRlcoU1RfSU5GTykgKFNUQl9HTE9CQUwsIFNUVF9OT1RZUEUpLAoJCQkJc2VjLT5pZHgsIHNlYy0+aGVhZGVyLnNoX2FkZHIsIDApOwoJCWlmICh1c2Vfa3N5bXRhYikKCQkJbmV3X2FkZF9rc3ltdGFiKGYsIHN5bSk7Cgl9CiNlbmRpZiAvKiBfTk9UX1NVUFBPUlRFRF8gKi8KCS8qIHRhZyB0aGUgZGVzaXJlZCBzZWN0aW9ucyBpZiBzaXplIGlzIG5vbi16ZXJvICovCgoJZm9yIChpID0gMDsgaSA8IHNpemVvZihzZWN0aW9uX25hbWVzKS9zaXplb2Yoc2VjdGlvbl9uYW1lc1swXSk7ICsraSkgewoJCWlmICgoc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCBzZWN0aW9uX25hbWVzW2ldKSkgJiYKCQkJCXNlYy0+aGVhZGVyLnNoX3NpemUpIHsKCQkJbCA9IHNpemVvZihzeW1wcmVmaXgpKwkJLyogIl9faW5zbW9kXyIgKi8KCQkJCWxtX25hbWUrCQkvKiBtb2R1bGUgbmFtZSAqLwoJCQkJMisJCQkvKiAiX1MiICovCgkJCQlzdHJsZW4oc2VjLT5uYW1lKSsJLyogc2VjdGlvbiBuYW1lICovCgkJCQkyKwkJCS8qICJfTCIgKi8KCQkJCTgrCQkJLyogbGVuZ3RoIGluIGRlYyAqLwoJCQkJMTsJCQkvKiBudWwgKi8KCQkJbmFtZSA9IHhtYWxsb2MobCk7CgkJCXNucHJpbnRmKG5hbWUsIGwsICIlcyVzX1Mlc19MJWxkIiwKCQkJCQlzeW1wcmVmaXgsIG1fbmFtZSwgc2VjLT5uYW1lLAoJCQkJCShsb25nKXNlYy0+aGVhZGVyLnNoX3NpemUpOwoJCQlzeW0gPSBvYmpfYWRkX3N5bWJvbChmLCBuYW1lLCAtMSwgRUxGVyhTVF9JTkZPKSAoU1RCX0dMT0JBTCwgU1RUX05PVFlQRSksCgkJCQkJc2VjLT5pZHgsIHNlYy0+aGVhZGVyLnNoX2FkZHIsIDApOwoJCQlpZiAodXNlX2tzeW10YWIpCgkJCQluZXdfYWRkX2tzeW10YWIoZiwgc3ltKTsKCQl9Cgl9Cn0KI2VuZGlmIC8qIENPTkZJR19GRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTICovCgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQCnN0YXRpYyB2b2lkIHByaW50X2xvYWRfbWFwKHN0cnVjdCBvYmpfZmlsZSAqZikKewoJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKCXN0cnVjdCBvYmpfc3ltYm9sICoqYWxsLCAqKnA7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKCWludCBpLCBuc3ltcywgKmxvYWRlZDsKCgkvKiBSZXBvcnQgb24gdGhlIHNlY3Rpb24gbGF5b3V0LiAgKi8KCglwcmludGYoIlNlY3Rpb25zOiAgICAgICBTaXplICAgICAgJS0qcyAgQWxpZ25cbiIsCgkJCShpbnQpICgyICogc2l6ZW9mKHZvaWQgKikpLCAiQWRkcmVzcyIpOwoKCWZvciAoc2VjID0gZi0+bG9hZF9vcmRlcjsgc2VjOyBzZWMgPSBzZWMtPmxvYWRfbmV4dCkgewoJCWludCBhOwoJCXVuc2lnbmVkIGxvbmcgdG1wOwoKCQlmb3IgKGEgPSAtMSwgdG1wID0gc2VjLT5oZWFkZXIuc2hfYWRkcmFsaWduOyB0bXA7ICsrYSkKCQkJdG1wID4+PSAxOwoJCWlmIChhID09IC0xKQoJCQlhID0gMDsKCgkJcHJpbnRmKCIlLTE1cyAlMDhseCAgJTAqbHggIDIqKiVkXG4iLAoJCQkJc2VjLT5uYW1lLAoJCQkJKGxvbmcpc2VjLT5oZWFkZXIuc2hfc2l6ZSwKCQkJCShpbnQpICgyICogc2l6ZW9mKHZvaWQgKikpLAoJCQkJKGxvbmcpc2VjLT5oZWFkZXIuc2hfYWRkciwKCQkJCWEpOwoJfQojaWZkZWYgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQX0ZVTEwKCS8qIFF1aWNrIHJlZmVyZW5jZSB3aGljaCBzZWN0aW9uIGluZGljaWVzIGFyZSBsb2FkZWQuICAqLwoKCWxvYWRlZCA9IGFsbG9jYShzaXplb2YoaW50KSAqIChpID0gZi0+aGVhZGVyLmVfc2hudW0pKTsKCXdoaWxlICgtLWkgPj0gMCkKCQlsb2FkZWRbaV0gPSAoZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMDsKCgkvKiBDb2xsZWN0IHRoZSBzeW1ib2xzIHdlJ2xsIGJlIGxpc3RpbmcuICAqLwoKCWZvciAobnN5bXMgPSBpID0gMDsgaSA8IEhBU0hfQlVDS0VUUzsgKytpKQoJCWZvciAoc3ltID0gZi0+c3ltdGFiW2ldOyBzeW07IHN5bSA9IHN5bS0+bmV4dCkKCQkJaWYgKHN5bS0+c2VjaWR4IDw9IFNITl9ISVJFU0VSVkUKCQkJCQkmJiAoc3ltLT5zZWNpZHggPj0gU0hOX0xPUkVTRVJWRSB8fCBsb2FkZWRbc3ltLT5zZWNpZHhdKSkKCQkJCSsrbnN5bXM7CgoJYWxsID0gYWxsb2NhKG5zeW1zICogc2l6ZW9mKHN0cnVjdCBvYmpfc3ltYm9sICopKTsKCglmb3IgKGkgPSAwLCBwID0gYWxsOyBpIDwgSEFTSF9CVUNLRVRTOyArK2kpCgkJZm9yIChzeW0gPSBmLT5zeW10YWJbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQoJCQlpZiAoc3ltLT5zZWNpZHggPD0gU0hOX0hJUkVTRVJWRQoJCQkJCSYmIChzeW0tPnNlY2lkeCA+PSBTSE5fTE9SRVNFUlZFIHx8IGxvYWRlZFtzeW0tPnNlY2lkeF0pKQoJCQkJKnArKyA9IHN5bTsKCgkvKiBBbmQgbGlzdCB0aGVtLiAgKi8KCXByaW50ZigiXG5TeW1ib2xzOlxuIik7Cglmb3IgKHAgPSBhbGw7IHAgPCBhbGwgKyBuc3ltczsgKytwKSB7CgkJY2hhciB0eXBlID0gJz8nOwoJCXVuc2lnbmVkIGxvbmcgdmFsdWU7CgoJCXN5bSA9ICpwOwoJCWlmIChzeW0tPnNlY2lkeCA9PSBTSE5fQUJTKSB7CgkJCXR5cGUgPSAnQSc7CgkJCXZhbHVlID0gc3ltLT52YWx1ZTsKCQl9IGVsc2UgaWYgKHN5bS0+c2VjaWR4ID09IFNITl9VTkRFRikgewoJCQl0eXBlID0gJ1UnOwoJCQl2YWx1ZSA9IDA7CgkJfSBlbHNlIHsKCQkJc2VjID0gZi0+c2VjdGlvbnNbc3ltLT5zZWNpZHhdOwoKCQkJaWYgKHNlYy0+aGVhZGVyLnNoX3R5cGUgPT0gU0hUX05PQklUUykKCQkJCXR5cGUgPSAnQic7CgkJCWVsc2UgaWYgKHNlYy0+aGVhZGVyLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSB7CgkJCQlpZiAoc2VjLT5oZWFkZXIuc2hfZmxhZ3MgJiBTSEZfRVhFQ0lOU1RSKQoJCQkJCXR5cGUgPSAnVCc7CgkJCQllbHNlIGlmIChzZWMtPmhlYWRlci5zaF9mbGFncyAmIFNIRl9XUklURSkKCQkJCQl0eXBlID0gJ0QnOwoJCQkJZWxzZQoJCQkJCXR5cGUgPSAnUic7CgkJCX0KCQkJdmFsdWUgPSBzeW0tPnZhbHVlICsgc2VjLT5oZWFkZXIuc2hfYWRkcjsKCQl9CgoJCWlmIChFTEZXKFNUX0JJTkQpIChzeW0tPmluZm8pID09IFNUQl9MT0NBTCkKCQkJdHlwZSA9IHRvbG93ZXIodHlwZSk7CgoJCXByaW50ZigiJTAqbHggJWMgJXNcbiIsIChpbnQpICgyICogc2l6ZW9mKHZvaWQgKikpLCB2YWx1ZSwKCQkJCXR5cGUsIHN5bS0+bmFtZSk7Cgl9CiNlbmRpZgp9CgojZW5kaWYKCmV4dGVybiBpbnQgaW5zbW9kX21haW4oIGludCBhcmdjLCBjaGFyICoqYXJndikKewoJaW50IG9wdDsKCWludCBrX2NyY3M7CglpbnQga19uZXdfc3lzY2FsbHM7CglpbnQgbGVuOwoJY2hhciAqdG1wLCAqdG1wMTsKCXVuc2lnbmVkIGxvbmcgbV9zaXplOwoJRWxmVyhBZGRyKSBtX2FkZHI7CglzdHJ1Y3Qgb2JqX2ZpbGUgKmY7CglzdHJ1Y3Qgc3RhdCBzdDsKCWNoYXIgKm1fbmFtZSA9IDA7CglpbnQgZXhpdF9zdGF0dXMgPSBFWElUX0ZBSUxVUkU7CglpbnQgbV9oYXNfbW9kaW5mbzsKI2lmZGVmIENPTkZJR19GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCglzdHJ1Y3QgdXRzbmFtZSB1dHNfaW5mbzsKCWNoYXIgbV9zdHJ2ZXJzaW9uW1NUUlZFUlNJT05MRU5dOwoJaW50IG1fdmVyc2lvbjsKCWludCBtX2NyY3M7CiNlbmRpZgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfQ0xFQU5fVVAKCUZJTEUgKmZwID0gMDsKI2Vsc2UKCUZJTEUgKmZwOwojZW5kaWYKI2lmZGVmIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FEX01BUAoJaW50IGZsYWdfcHJpbnRfbG9hZF9tYXAgPSAwOwojZW5kaWYKCWludCBrX3ZlcnNpb24gPSAwOwoJc3RydWN0IHV0c25hbWUgbXl1bmFtZTsKCgkvKiBQYXJzZSBhbnkgb3B0aW9ucyAqLwojaWZkZWYgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQCgl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiZmtxc3Z4bUxvOiIpKSA+IDApCiNlbHNlCgl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiZmtxc3Z4TG86IikpID4gMCkKI2VuZGlmCgkJewoJCQlzd2l0Y2ggKG9wdCkgewoJCQkJY2FzZSAnZic6CQkJLyogZm9yY2UgbG9hZGluZyAqLwoJCQkJCWZsYWdfZm9yY2VfbG9hZCA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdrJzoJCQkvKiBtb2R1bGUgbG9hZGVkIGJ5IGtlcm5lbGQsIGF1dG8tY2xlYW5hYmxlICovCgkJCQkJZmxhZ19hdXRvY2xlYW4gPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAncyc6CQkJLyogbG9nIHRvIHN5c2xvZyAqLwoJCQkJCS8qIGxvZyB0byBzeXNsb2cgLS0gbm90IHN1cHBvcnRlZCAgICAgICAgICAgICAgKi8KCQkJCQkvKiBidXQga2VybmVsIG5lZWRzIHRoaXMgZm9yIHJlcXVlc3RfbW9kdWxlKCksICovCgkJCQkJLyogYXMgdGhpcyBjYWxsczogbW9kcHJvYmUgLWsgLXMgLS0gPG1vZHVsZT4gICAqLwoJCQkJCS8qIHNvIHNpbGVudGx5IGlnbm9yZSB0aGlzIGZsYWcgICAgICAgICAgICAgICAgKi8KCQkJCQlicmVhazsKCQkJCWNhc2UgJ3YnOgkJCS8qIHZlcmJvc2Ugb3V0cHV0ICovCgkJCQkJZmxhZ192ZXJib3NlID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3EnOgkJCS8qIHNpbGVudCAqLwoJCQkJCWZsYWdfcXVpZXQgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAneCc6CQkJLyogZG8gbm90IGV4cG9ydCBleHRlcm5zICovCgkJCQkJZmxhZ19leHBvcnQgPSAwOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnbyc6CQkJLyogbmFtZSB0aGUgb3V0cHV0IG1vZHVsZSAqLwoJCQkJCWZyZWUobV9uYW1lKTsKCQkJCQltX25hbWUgPSBiYl94c3RyZHVwKG9wdGFyZyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdMJzoJCQkvKiBTdHViIHdhcm5pbmcgKi8KCQkJCQkvKiBUaGlzIGlzIG5lZWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1vZHByb2JlLgoJCQkJCSAqIEluIHRoZW9yeSwgdGhpcyBkb2VzIGxvY2tpbmcsIGJ1dCB3ZSBkb24ndCBkbwoJCQkJCSAqIHRoYXQuICBTbyBiZSBjYXJlZnVsIGFuZCBwbGFuIHlvdXIgbGlmZSBhcm91bmQgbm90CgkJCQkJICogbG9hZGluZyB0aGUgc2FtZSBtb2R1bGUgNTAgdGltZXMgY29uY3VycmVudGx5LiAqLwoJCQkJCWJyZWFrOwojaWZkZWYgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQCgkJCQljYXNlICdtJzoJCQkvKiBwcmludCBtb2R1bGUgbG9hZCBtYXAgKi8KCQkJCQlmbGFnX3ByaW50X2xvYWRfbWFwID0gMTsKCQkJCQlicmVhazsKI2VuZGlmCgkJCQlkZWZhdWx0OgoJCQkJCWJiX3Nob3dfdXNhZ2UoKTsKCQkJfQoJCX0KCglpZiAoYXJndltvcHRpbmRdID09IE5VTEwpIHsKCQliYl9zaG93X3VzYWdlKCk7Cgl9CgoJLyogR3JhYiB0aGUgbW9kdWxlIG5hbWUgKi8KCXRtcDEgPSBiYl94c3RyZHVwKGFyZ3Zbb3B0aW5kXSk7Cgl0bXAgPSBiYXNlbmFtZSh0bXAxKTsKCWxlbiA9IHN0cmxlbih0bXApOwoKCWlmICh1bmFtZSgmbXl1bmFtZSkgPT0gMCkgewoJCWlmIChteXVuYW1lLnJlbGVhc2VbMF0gPT0gJzInKSB7CgkJCWtfdmVyc2lvbiA9IG15dW5hbWUucmVsZWFzZVsyXSAtICcwJzsKCQl9Cgl9CgojaWYgZGVmaW5lZChDT05GSUdfRkVBVFVSRV8yXzZfTU9EVUxFUykKCWlmIChrX3ZlcnNpb24gPiA0ICYmIGxlbiA+IDMgJiYgdG1wW2xlbiAtIDNdID09ICcuJyAmJgoJCQl0bXBbbGVuIC0gMl0gPT0gJ2snICYmIHRtcFtsZW4gLSAxXSA9PSAnbycpIHsKCQlsZW4tPTM7CgkJdG1wW2xlbl0gPSAnXDAnOwoJfQoJZWxzZQojZW5kaWYKCQlpZiAobGVuID4gMiAmJiB0bXBbbGVuIC0gMl0gPT0gJy4nICYmIHRtcFtsZW4gLSAxXSA9PSAnbycpIHsKCQkJbGVuLT0yOwoJCQl0bXBbbGVuXSA9ICdcMCc7CgkJfQoKCiNpZiBkZWZpbmVkKENPTkZJR19GRUFUVVJFXzJfNl9NT0RVTEVTKQoJaWYgKGtfdmVyc2lvbiA+IDQpCgkJYmJfeGFzcHJpbnRmKCZtX2Z1bGxOYW1lLCAiJXMua28iLCB0bXApOwoJZWxzZQojZW5kaWYKCQliYl94YXNwcmludGYoJm1fZnVsbE5hbWUsICIlcy5vIiwgdG1wKTsKCglpZiAoIW1fbmFtZSkgewoJCW1fbmFtZSA9IHRtcDsKCX0gZWxzZSB7CgkJZnJlZSh0bXAxKTsKCQl0bXAxID0gMDsgICAgICAgLyogZmxhZyBmb3IgZnJlZShtX25hbWUpIGJlZm9yZSBleGl0KCkgKi8KCX0KCgkvKiBHZXQgYSBmaWxlZGVzYyBmb3IgdGhlIG1vZHVsZS4gIENoZWNrIHdlIHdlIGhhdmUgYSBjb21wbGV0ZSBwYXRoICovCglpZiAoc3RhdChhcmd2W29wdGluZF0sICZzdCkgPCAwIHx8ICFTX0lTUkVHKHN0LnN0X21vZGUpIHx8CgkJCShmcCA9IGZvcGVuKGFyZ3Zbb3B0aW5kXSwgInIiKSkgPT0gTlVMTCkgewoJCS8qIEhtbS4gIENvdWxkIG5vdCBvcGVuIGl0LiAgRmlyc3Qgc2VhcmNoIHVuZGVyIC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgLAoJCSAqIGJ1dCBkbyBub3QgZXJyb3Igb3V0IHlldCBpZiB3ZSBmYWlsIHRvIGZpbmQgaXQuLi4gKi8KCQlpZiAoa192ZXJzaW9uKSB7CS8qIHVuYW1lIHN1Y2NlZWRkICovCgkJCWNoYXIgKm1vZHVsZV9kaXI7CgkJCWNoYXIgKnRtZG47CgkJCWNoYXIgcmVhbF9tb2R1bGVfZGlyW0ZJTEVOQU1FX01BWF07CgoJCQl0bWRuID0gY29uY2F0X3BhdGhfZmlsZShfUEFUSF9NT0RVTEVTLCBteXVuYW1lLnJlbGVhc2UpOwoJCQkvKiBKdW1wIHRocm91Z2ggaG9vcHMgaW4gY2FzZSAvbGliL21vZHVsZXMvYHVuYW1lIC1yYAoJCQkgKiBpcyBhIHN5bWxpbmsuICBXZSBkbyBub3Qgd2FudCByZWN1cnNpdmVfYWN0aW9uIHRvCgkJCSAqIGZvbGxvdyBzeW1saW5rcywgYnV0IHdlIGRvIHdhbnQgdG8gZm9sbG93IHRoZQoJCQkgKiAvbGliL21vZHVsZXMvYHVuYW1lIC1yYCBkaXIsIFNvIHJlc29sdmUgaXQgb3Vyc2VsdmVzCgkJCSAqIGlmIGl0IGlzIGEgbGluay4uLiAqLwoJCQlpZiAocmVhbHBhdGggKHRtZG4sIHJlYWxfbW9kdWxlX2RpcikgPT0gTlVMTCkKCQkJCW1vZHVsZV9kaXIgPSB0bWRuOwoJCQllbHNlCgkJCQltb2R1bGVfZGlyID0gcmVhbF9tb2R1bGVfZGlyOwoJCQlyZWN1cnNpdmVfYWN0aW9uKG1vZHVsZV9kaXIsIFRSVUUsIEZBTFNFLCBGQUxTRSwKCQkJCQljaGVja19tb2R1bGVfbmFtZV9tYXRjaCwgMCwgbV9mdWxsTmFtZSk7CgkJCWZyZWUodG1kbik7CgkJfQoKCQkvKiBDaGVjayBpZiB3ZSBoYXZlIGZvdW5kIGFueXRoaW5nIHlldCAqLwoJCWlmIChtX2ZpbGVuYW1lID09IDAgfHwgKChmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJyIikpID09IE5VTEwpKQoJCXsKCQkJY2hhciBtb2R1bGVfZGlyW0ZJTEVOQU1FX01BWF07CgoJCQlmcmVlKG1fZmlsZW5hbWUpOwoJCQltX2ZpbGVuYW1lID0gMDsKCQkJaWYgKHJlYWxwYXRoIChfUEFUSF9NT0RVTEVTLCBtb2R1bGVfZGlyKSA9PSBOVUxMKQoJCQkJc3RyY3B5KG1vZHVsZV9kaXIsIF9QQVRIX01PRFVMRVMpOwoJCQkvKiBObyBtb2R1bGUgZm91bmQgdW5kZXIgL2xpYi9tb2R1bGVzL2B1bmFtZSAtcmAsIHRoaXMKCQkJICogdGltZSBjYXN0IHRoZSBuZXQgYSBiaXQgd2lkZXIuICBTZWFyY2ggL2xpYi9tb2R1bGVzLyAqLwoJCQlpZiAoISByZWN1cnNpdmVfYWN0aW9uKG1vZHVsZV9kaXIsIFRSVUUsIEZBTFNFLCBGQUxTRSwKCQkJCQkJY2hlY2tfbW9kdWxlX25hbWVfbWF0Y2gsIDAsIG1fZnVsbE5hbWUpKQoJCQl7CgkJCQlpZiAobV9maWxlbmFtZSA9PSAwCgkJCQkJCXx8ICgoZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiciIpKSA9PSBOVUxMKSkKCQkJCXsKCQkJCQliYl9lcnJvcl9tc2coIiVzOiBubyBtb2R1bGUgYnkgdGhhdCBuYW1lIGZvdW5kIiwgbV9mdWxsTmFtZSk7CgkJCQkJZ290byBvdXQ7CgkJCQl9CgkJCX0gZWxzZQoJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiBubyBtb2R1bGUgYnkgdGhhdCBuYW1lIGZvdW5kIiwgbV9mdWxsTmFtZSk7CgkJfQoJfSBlbHNlCgkJbV9maWxlbmFtZSA9IGJiX3hzdHJkdXAoYXJndltvcHRpbmRdKTsKCglpZiAoIWZsYWdfcXVpZXQpCgkJcHJpbnRmKCJVc2luZyAlc1xuIiwgbV9maWxlbmFtZSk7CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfMl82X01PRFVMRVMKCWlmIChrX3ZlcnNpb24gPiA0KQoJewoJCW9wdGluZC0tOwoJCWFyZ3Zbb3B0aW5kICsgMV0gPSBtX2ZpbGVuYW1lOwoJCXJldHVybiBpbnNtb2RfbmdfbWFpbihhcmdjIC0gb3B0aW5kLCBhcmd2ICsgb3B0aW5kKTsKCX0KI2VuZGlmCgoJaWYgKChmID0gb2JqX2xvYWQoZnAsIExPQURCSVRTKSkgPT0gTlVMTCkKCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIkNvdWxkIG5vdCBsb2FkIHRoZSBtb2R1bGUiKTsKCglpZiAoZ2V0X21vZGluZm9fdmFsdWUoZiwgImtlcm5lbF92ZXJzaW9uIikgPT0gTlVMTCkKCQltX2hhc19tb2RpbmZvID0gMDsKCWVsc2UKCQltX2hhc19tb2RpbmZvID0gMTsKCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORwoJLyogVmVyc2lvbiBjb3JyZXNwb25kZW5jZT8gICovCglpZiAoIWZsYWdfcXVpZXQpIHsKCQlpZiAodW5hbWUoJnV0c19pbmZvKSA8IDApCgkJCXV0c19pbmZvLnJlbGVhc2VbMF0gPSAnXDAnOwoJCWlmIChtX2hhc19tb2RpbmZvKSB7CgkJCW1fdmVyc2lvbiA9IG5ld19nZXRfbW9kdWxlX3ZlcnNpb24oZiwgbV9zdHJ2ZXJzaW9uKTsKCQl9IGVsc2UgewoJCQltX3ZlcnNpb24gPSBvbGRfZ2V0X21vZHVsZV92ZXJzaW9uKGYsIG1fc3RydmVyc2lvbik7CgkJCWlmIChtX3ZlcnNpb24gPT0gLTEpIHsKCQkJCWJiX2Vycm9yX21zZygiY291bGRuJ3QgZmluZCB0aGUga2VybmVsIHZlcnNpb24gdGhlIG1vZHVsZSB3YXMgIgoJCQkJCQkiY29tcGlsZWQgZm9yIik7CgkJCQlnb3RvIG91dDsKCQkJfQoJCX0KCgkJaWYgKHN0cm5jbXAodXRzX2luZm8ucmVsZWFzZSwgbV9zdHJ2ZXJzaW9uLCBTVFJWRVJTSU9OTEVOKSAhPSAwKSB7CgkJCWlmIChmbGFnX2ZvcmNlX2xvYWQpIHsKCQkJCWJiX2Vycm9yX21zZygiV2FybmluZzoga2VybmVsLW1vZHVsZSB2ZXJzaW9uIG1pc21hdGNoXG4iCgkJCQkJCSJcdCVzIHdhcyBjb21waWxlZCBmb3Iga2VybmVsIHZlcnNpb24gJXNcbiIKCQkJCQkJIlx0d2hpbGUgdGhpcyBrZXJuZWwgaXMgdmVyc2lvbiAlcyIsCgkJCQkJCW1fZmlsZW5hbWUsIG1fc3RydmVyc2lvbiwgdXRzX2luZm8ucmVsZWFzZSk7CgkJCX0gZWxzZSB7CgkJCQliYl9lcnJvcl9tc2coImtlcm5lbC1tb2R1bGUgdmVyc2lvbiBtaXNtYXRjaFxuIgoJCQkJCQkiXHQlcyB3YXMgY29tcGlsZWQgZm9yIGtlcm5lbCB2ZXJzaW9uICVzXG4iCgkJCQkJCSJcdHdoaWxlIHRoaXMga2VybmVsIGlzIHZlcnNpb24gJXMuIiwKCQkJCQkJbV9maWxlbmFtZSwgbV9zdHJ2ZXJzaW9uLCB1dHNfaW5mby5yZWxlYXNlKTsKCQkJCWdvdG8gb3V0OwoJCQl9CgkJfQoJfQoJa19jcmNzID0gMDsKI2VuZGlmCQkJCQkJCS8qIENPTkZJR19GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HICovCgoJa19uZXdfc3lzY2FsbHMgPSAhcXVlcnlfbW9kdWxlKE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwpOwoKCWlmIChrX25ld19zeXNjYWxscykgewojaWZkZWYgQ09ORklHX0ZFQVRVUkVfMl80X01PRFVMRVMKCQlpZiAoIW5ld19nZXRfa2VybmVsX3N5bWJvbHMoKSkKCQkJZ290byBvdXQ7CgkJa19jcmNzID0gbmV3X2lzX2tlcm5lbF9jaGVja3N1bW1lZCgpOwojZWxzZQoJCWJiX2Vycm9yX21zZygiTm90IGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBuZXcga2VybmVscyIpOwoJCWdvdG8gb3V0OwojZW5kaWYKCX0gZWxzZSB7CiNpZmRlZiBDT05GSUdfRkVBVFVSRV8yXzJfTU9EVUxFUwoJCWlmICghb2xkX2dldF9rZXJuZWxfc3ltYm9scyhtX25hbWUpKQoJCQlnb3RvIG91dDsKCQlrX2NyY3MgPSBvbGRfaXNfa2VybmVsX2NoZWNrc3VtbWVkKCk7CiNlbHNlCgkJYmJfZXJyb3JfbXNnKCJOb3QgY29uZmlndXJlZCB0byBzdXBwb3J0IG9sZCBrZXJuZWxzIik7CgkJZ290byBvdXQ7CiNlbmRpZgoJfQoKI2lmZGVmIENPTkZJR19GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCglpZiAobV9oYXNfbW9kaW5mbykKCQltX2NyY3MgPSBuZXdfaXNfbW9kdWxlX2NoZWNrc3VtbWVkKGYpOwoJZWxzZQoJCW1fY3JjcyA9IG9sZF9pc19tb2R1bGVfY2hlY2tzdW1tZWQoZik7CgoJaWYgKG1fY3JjcyAhPSBrX2NyY3MpCgkJb2JqX3NldF9zeW1ib2xfY29tcGFyZShmLCBuY3Zfc3RyY21wLCBuY3Zfc3ltYm9sX2hhc2gpOwojZW5kaWYJCQkJCQkJLyogQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcgKi8KCgkvKiBMZXQgdGhlIG1vZHVsZSBrbm93IGFib3V0IHRoZSBrZXJuZWwgc3ltYm9scy4gICovCglhZGRfa2VybmVsX3N5bWJvbHMoZik7CgoJLyogQWxsb2NhdGUgY29tbW9uIHN5bWJvbHMsIHN5bWJvbCB0YWJsZXMsIGFuZCBzdHJpbmcgdGFibGVzLiAgKi8KCglpZiAoa19uZXdfc3lzY2FsbHMKCQkJPyAhbmV3X2NyZWF0ZV90aGlzX21vZHVsZShmLCBtX25hbWUpCgkJCTogIW9sZF9jcmVhdGVfbW9kX3VzZV9jb3VudChmKSkKCXsKCQlnb3RvIG91dDsKCX0KCglpZiAoIW9ial9jaGVja191bmRlZmluZWRzKGYpKSB7CgkJZ290byBvdXQ7Cgl9CglvYmpfYWxsb2NhdGVfY29tbW9ucyhmKTsKCWNoZWNrX3RhaW50ZWRfbW9kdWxlKGYsIG1fbmFtZSk7CgoJLyogZG9uZSB3aXRoIHRoZSBtb2R1bGUgbmFtZSwgb24gdG8gdGhlIG9wdGlvbmFsIHZhcj12YWx1ZSBhcmd1bWVudHMgKi8KCSsrb3B0aW5kOwoKCWlmIChvcHRpbmQgPCBhcmdjKSB7CgkJaWYgKG1faGFzX21vZGluZm8KCQkJCT8gIW5ld19wcm9jZXNzX21vZHVsZV9hcmd1bWVudHMoZiwgYXJnYyAtIG9wdGluZCwgYXJndiArIG9wdGluZCkKCQkJCTogIW9sZF9wcm9jZXNzX21vZHVsZV9hcmd1bWVudHMoZiwgYXJnYyAtIG9wdGluZCwgYXJndiArIG9wdGluZCkpCgkJewoJCQlnb3RvIG91dDsKCQl9Cgl9CgoJYXJjaF9jcmVhdGVfZ290KGYpOwoJaGlkZV9zcGVjaWFsX3N5bWJvbHMoZik7CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMKCWFkZF9rc3ltb29wc19zeW1ib2xzKGYsIG1fZmlsZW5hbWUsIG1fbmFtZSk7CiNlbmRpZiAvKiBDT05GSUdfRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUyAqLwoKCWlmIChrX25ld19zeXNjYWxscykKCQluZXdfY3JlYXRlX21vZHVsZV9rc3ltdGFiKGYpOwoKCS8qIEZpbmQgY3VycmVudCBzaXplIG9mIHRoZSBtb2R1bGUgKi8KCW1fc2l6ZSA9IG9ial9sb2FkX3NpemUoZik7CgoKCW1fYWRkciA9IGNyZWF0ZV9tb2R1bGUobV9uYW1lLCBtX3NpemUpOwoJaWYgKG1fYWRkciA9PSAtMSkgc3dpdGNoIChlcnJubykgewoJCWNhc2UgRUVYSVNUOgoJCQliYl9lcnJvcl9tc2coIkEgbW9kdWxlIG5hbWVkICVzIGFscmVhZHkgZXhpc3RzIiwgbV9uYW1lKTsKCQkJZ290byBvdXQ7CgkJY2FzZSBFTk9NRU06CgkJCWJiX2Vycm9yX21zZygiQ2FuJ3QgYWxsb2NhdGUga2VybmVsIG1lbW9yeSBmb3IgbW9kdWxlOyBuZWVkZWQgJWx1IGJ5dGVzIiwKCQkJCQltX3NpemUpOwoJCQlnb3RvIG91dDsKCQlkZWZhdWx0OgoJCQliYl9wZXJyb3JfbXNnKCJjcmVhdGVfbW9kdWxlOiAlcyIsIG1fbmFtZSk7CgkJCWdvdG8gb3V0OwoJfQoKI2lmICAhTE9BREJJVFMKCS8qCgkgKiB0aGUgUFJPR0JJVFMgc2VjdGlvbiB3YXMgbm90IGxvYWRlZCBieSB0aGUgb2JqX2xvYWQKCSAqIG5vdyB3ZSBjYW4gbG9hZCB0aGVtIGRpcmVjdGx5IGludG8gdGhlIGtlcm5lbCBtZW1vcnkKCSAqLwoJaWYgKCFvYmpfbG9hZF9wcm9nYml0cyhmcCwgZiwgKGNoYXIqKW1fYWRkcikpIHsKCQlkZWxldGVfbW9kdWxlKG1fbmFtZSk7CgkJZ290byBvdXQ7Cgl9CiNlbmRpZgoKCWlmICghb2JqX3JlbG9jYXRlKGYsIG1fYWRkcikpIHsKCQlkZWxldGVfbW9kdWxlKG1fbmFtZSk7CgkJZ290byBvdXQ7Cgl9CgoJaWYgKGtfbmV3X3N5c2NhbGxzCgkJCT8gIW5ld19pbml0X21vZHVsZShtX25hbWUsIGYsIG1fc2l6ZSkKCQkJOiAhb2xkX2luaXRfbW9kdWxlKG1fbmFtZSwgZiwgbV9zaXplKSkKCXsKCQlkZWxldGVfbW9kdWxlKG1fbmFtZSk7CgkJZ290byBvdXQ7Cgl9CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQCglpZihmbGFnX3ByaW50X2xvYWRfbWFwKQoJCXByaW50X2xvYWRfbWFwKGYpOwojZW5kaWYKCglleGl0X3N0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKCm91dDoKI2lmZGVmIENPTkZJR19GRUFUVVJFX0NMRUFOX1VQCglpZihmcCkKCQlmY2xvc2UoZnApOwoJaWYodG1wMSkgewoJCWZyZWUodG1wMSk7Cgl9IGVsc2UgewoJCWZyZWUobV9uYW1lKTsKCX0KCWZyZWUobV9maWxlbmFtZSk7CiNlbmRpZgoJcmV0dXJuKGV4aXRfc3RhdHVzKTsKfQoKCiNlbmRpZgoKCiNpZmRlZiBDT05GSUdfRkVBVFVSRV8yXzZfTU9EVUxFUwoKI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgoKLyogV2UgdXNlIGVycm9yIG51bWJlcnMgaW4gYSBsb29zZSB0cmFuc2xhdGlvbi4uLiAqLwpzdGF0aWMgY29uc3QgY2hhciAqbW9kZXJyb3IoaW50IGVycikKewoJc3dpdGNoIChlcnIpIHsKCQljYXNlIEVOT0VYRUM6CgkJCXJldHVybiAiSW52YWxpZCBtb2R1bGUgZm9ybWF0IjsKCQljYXNlIEVOT0VOVDoKCQkJcmV0dXJuICJVbmtub3duIHN5bWJvbCBpbiBtb2R1bGUiOwoJCWNhc2UgRVNSQ0g6CgkJCXJldHVybiAiTW9kdWxlIGhhcyB3cm9uZyBzeW1ib2wgdmVyc2lvbiI7CgkJY2FzZSBFSU5WQUw6CgkJCXJldHVybiAiSW52YWxpZCBwYXJhbWV0ZXJzIjsKCQlkZWZhdWx0OgoJCQlyZXR1cm4gc3RyZXJyb3IoZXJyKTsKCX0KfQoKZXh0ZXJuIGludCBpbnNtb2RfbmdfbWFpbiggaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CglpbnQgaTsKCWludCBmZDsKCWxvbmcgaW50IHJldDsKCXN0cnVjdCBzdGF0IHN0OwoJdW5zaWduZWQgbG9uZyBsZW47Cgl2b2lkICptYXA7CgljaGFyICpmaWxlbmFtZSwgKm9wdGlvbnMgPSBiYl94c3RyZHVwKCIiKTsKCglmaWxlbmFtZSA9IGFyZ3ZbMV07CglpZiAoIWZpbGVuYW1lKSB7CgkJYmJfc2hvd191c2FnZSgpOwoJCXJldHVybiAtMTsKCX0KCgkvKiBSZXN0IGlzIG9wdGlvbnMgKi8KCWZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspIHsKCQlvcHRpb25zID0geHJlYWxsb2Mob3B0aW9ucywgc3RybGVuKG9wdGlvbnMpICsgMiArIHN0cmxlbihhcmd2W2ldKSArIDIpOwoJCS8qIFNwYWNlcyBoYW5kbGVkIGJ5ICIiIHBhaXJzLCBidXQgbm8gd2F5IG9mIGVzY2FwaW5nIHF1b3RlcyAqLwoJCWlmIChzdHJjaHIoYXJndltpXSwgJyAnKSkgewoJCQlzdHJjYXQob3B0aW9ucywgIlwiIik7CgkJCXN0cmNhdChvcHRpb25zLCBhcmd2W2ldKTsKCQkJc3RyY2F0KG9wdGlvbnMsICJcIiIpOwoJCX0gZWxzZSB7CgkJCXN0cmNhdChvcHRpb25zLCBhcmd2W2ldKTsKCQl9CgkJc3RyY2F0KG9wdGlvbnMsICIgIik7Cgl9CgoJaWYgKChmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZLCAwKSkgPCAwKSB7CgkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW5ub3Qgb3BlbiBtb2R1bGUgYCVzJyIsIGZpbGVuYW1lKTsKCX0KCglmc3RhdChmZCwgJnN0KTsKCWxlbiA9IHN0LnN0X3NpemU7CgltYXAgPSBtbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmZCwgMCk7CglpZiAobWFwID09IE1BUF9GQUlMRUQpIHsKCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbm5vdCBtbWFwIGAlcyciLCBmaWxlbmFtZSk7Cgl9CgoJcmV0ID0gc3lzY2FsbChfX05SX2luaXRfbW9kdWxlLCBtYXAsIGxlbiwgb3B0aW9ucyk7CglpZiAocmV0ICE9IDApIHsKCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbm5vdCBpbnNlcnQgYCVzJzogJXMgKCVsaSkiLAoJCQkJZmlsZW5hbWUsIG1vZGVycm9yKGVycm5vKSwgcmV0KTsKCX0KCglyZXR1cm4gMDsKfQoKI2VuZGlmCg==