LyoKICogU2FtcGxlIG1hbmFnZW1lbnQgZnVuY3Rpb25zLgogKgogKiBDb3B5cmlnaHQgMjAwOS0yMDEwIEVYQ0VMSUFOQ0UsIEVtZXJpYyBCcnVuIDxlYnJ1bkBleGNlbGlhbmNlLmZyPgogKiBDb3B5cmlnaHQgKEMpIDIwMTIgV2lsbHkgVGFycmVhdSA8d0Axd3QuZXU+CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqLwoKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGFycGEvaW5ldC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCiNpbmNsdWRlIDx0eXBlcy9nbG9iYWwuaD4KCiNpbmNsdWRlIDxjb21tb24vY2h1bmsuaD4KI2luY2x1ZGUgPGNvbW1vbi9oYXNoLmg+CiNpbmNsdWRlIDxjb21tb24vc3RhbmRhcmQuaD4KI2luY2x1ZGUgPGNvbW1vbi91cmlfYXV0aC5oPgojaW5jbHVkZSA8Y29tbW9uL2Jhc2U2NC5oPgoKI2luY2x1ZGUgPHByb3RvL2FyZy5oPgojaW5jbHVkZSA8cHJvdG8vYXV0aC5oPgojaW5jbHVkZSA8cHJvdG8vbG9nLmg+CiNpbmNsdWRlIDxwcm90by9wcm90b19odHRwLmg+CiNpbmNsdWRlIDxwcm90by9wcm94eS5oPgojaW5jbHVkZSA8cHJvdG8vc2FtcGxlLmg+CiNpbmNsdWRlIDxwcm90by9zdGlja190YWJsZS5oPgoKLyogc2FtcGxlIHR5cGUgbmFtZXMgKi8KY29uc3QgY2hhciAqc21wX3RvX3R5cGVbU01QX1RZUEVTXSA9IHsKCVtTTVBfVF9CT09MXSA9ICJib29sIiwKCVtTTVBfVF9VSU5UXSA9ICJ1aW50IiwKCVtTTVBfVF9TSU5UXSA9ICJzaW50IiwKCVtTTVBfVF9BRERSXSA9ICJhZGRyIiwKCVtTTVBfVF9JUFY0XSA9ICJpcHY0IiwKCVtTTVBfVF9JUFY2XSA9ICJpcHY2IiwKCVtTTVBfVF9TVFJdICA9ICJzdHIiLAoJW1NNUF9UX0JJTl0gID0gImJpbiIsCn07CgovKiBzdGF0aWMgc2FtcGxlIHVzZWQgaW4gc2FtcGxlX3Byb2Nlc3MoKSB3aGVuIDxwPiBpcyBOVUxMICovCnN0YXRpYyBzdHJ1Y3Qgc2FtcGxlIHRlbXBfc21wOwoKLyogbGlzdCBoZWFkIG9mIGFsbCBrbm93biBzYW1wbGUgZmV0Y2gga2V5d29yZHMgKi8Kc3RhdGljIHN0cnVjdCBzYW1wbGVfZmV0Y2hfa3dfbGlzdCBzYW1wbGVfZmV0Y2hlcyA9IHsKCS5saXN0ID0gTElTVF9IRUFEX0lOSVQoc2FtcGxlX2ZldGNoZXMubGlzdCkKfTsKCi8qIGxpc3QgaGVhZCBvZiBhbGwga25vd24gc2FtcGxlIGZvcm1hdCBjb252ZXJzaW9uIGtleXdvcmRzICovCnN0YXRpYyBzdHJ1Y3Qgc2FtcGxlX2NvbnZfa3dfbGlzdCBzYW1wbGVfY29udnMgPSB7CgkubGlzdCA9IExJU1RfSEVBRF9JTklUKHNhbXBsZV9jb252cy5saXN0KQp9OwoKY29uc3QgdW5zaWduZWQgaW50IGZldGNoX2NhcFtTTVBfU1JDX0VOVFJJRVNdID0gewoJW1NNUF9TUkNfSU5UUk5dID0gKFNNUF9WQUxfRkVfQ09OX0FDQyB8IFNNUF9WQUxfRkVfU0VTX0FDQyB8IFNNUF9WQUxfRkVfUkVRX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9IUlFfSERSIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfTElTVE5dID0gKFNNUF9WQUxfRkVfQ09OX0FDQyB8IFNNUF9WQUxfRkVfU0VTX0FDQyB8IFNNUF9WQUxfRkVfUkVRX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9IUlFfSERSIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfRlRFTkRdID0gKFNNUF9WQUxfRkVfQ09OX0FDQyB8IFNNUF9WQUxfRkVfU0VTX0FDQyB8IFNNUF9WQUxfRkVfUkVRX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9IUlFfSERSIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfTDRDTEldID0gKFNNUF9WQUxfRkVfQ09OX0FDQyB8IFNNUF9WQUxfRkVfU0VTX0FDQyB8IFNNUF9WQUxfRkVfUkVRX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9IUlFfSERSIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfTDVDTEldID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfRkVfU0VTX0FDQyB8IFNNUF9WQUxfRkVfUkVRX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9IUlFfSERSIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfVFJBQ0tdID0gKFNNUF9WQUxfRkVfQ09OX0FDQyB8IFNNUF9WQUxfRkVfU0VTX0FDQyB8IFNNUF9WQUxfRkVfUkVRX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9IUlFfSERSIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfTDZSRVFdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfRkVfUkVRX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9IUlFfSERSIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyksCgoJW1NNUF9TUkNfSFJRSFZdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfRkVfUkVRX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9IUlFfSERSIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyksCgoJW1NNUF9TUkNfSFJRSFBdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfRkVfUkVRX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9IUlFfSERSIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfSFJRQk9dID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9GRV9IUlFfQkRZIHwgU01QX1ZBTF9GRV9TRVRfQkNLIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyksCgoJW1NNUF9TUkNfQktFTkRdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX1JFUV9DTlQgfCBTTVBfVkFMX0JFX0hSUV9IRFIgfCBTTVBfVkFMX0JFX0hSUV9CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfU0VUX1NSViB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfU0VSVlJdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfQkVfU1JWX0NPTiB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfTDRTUlZdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfTDVTUlZdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfTDZSRVNdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyksCgoJW1NNUF9TUkNfSFJTSFZdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyksCgoJW1NNUF9TUkNfSFJTSFBdID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfQkVfUkVTX0NOVCB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9IUlNfSERSIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfSFJTQk9dID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9CRV9IUlNfQkRZIHwgU01QX1ZBTF9CRV9TVE9fUlVMIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX1JFU19DTlQgfCBTTVBfVkFMX0ZFX0hSU19IRFIgfCBTTVBfVkFMX0ZFX0hSU19CRFkgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyksCgoJW1NNUF9TUkNfUlFGSU5dID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfUlNGSU5dID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfVFhGSU5dID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCgoJW1NNUF9TUkNfU1NGSU5dID0gKFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfTE9HX0VORCksCn07CgpzdGF0aWMgY29uc3QgY2hhciAqZmV0Y2hfc3JjX25hbWVzW1NNUF9TUkNfRU5UUklFU10gPSB7CglbU01QX1NSQ19JTlRSTl0gPSAiaW50ZXJuYWwgc3RhdGUiLAoJW1NNUF9TUkNfTElTVE5dID0gImxpc3RlbmVyIiwKCVtTTVBfU1JDX0ZURU5EXSA9ICJmcm9udGVuZCIsCglbU01QX1NSQ19MNENMSV0gPSAiY2xpZW50IGFkZHJlc3MiLAoJW1NNUF9TUkNfTDVDTEldID0gImNsaWVudC1zaWRlIGNvbm5lY3Rpb24iLAoJW1NNUF9TUkNfVFJBQ0tdID0gInRyYWNrIGNvdW50ZXJzIiwKCVtTTVBfU1JDX0w2UkVRXSA9ICJyZXF1ZXN0IGJ1ZmZlciIsCglbU01QX1NSQ19IUlFIVl0gPSAiSFRUUCByZXF1ZXN0IGhlYWRlcnMiLAoJW1NNUF9TUkNfSFJRSFBdID0gIkhUVFAgcmVxdWVzdCIsCglbU01QX1NSQ19IUlFCT10gPSAiSFRUUCByZXF1ZXN0IGJvZHkiLAoJW1NNUF9TUkNfQktFTkRdID0gImJhY2tlbmQiLAoJW1NNUF9TUkNfU0VSVlJdID0gInNlcnZlciIsCglbU01QX1NSQ19MNFNSVl0gPSAic2VydmVyIGFkZHJlc3MiLAoJW1NNUF9TUkNfTDVTUlZdID0gInNlcnZlci1zaWRlIGNvbm5lY3Rpb24iLAoJW1NNUF9TUkNfTDZSRVNdID0gInJlc3BvbnNlIGJ1ZmZlciIsCglbU01QX1NSQ19IUlNIVl0gPSAiSFRUUCByZXNwb25zZSBoZWFkZXJzIiwKCVtTTVBfU1JDX0hSU0hQXSA9ICJIVFRQIHJlc3BvbnNlIiwKCVtTTVBfU1JDX0hSU0JPXSA9ICJIVFRQIHJlc3BvbnNlIGJvZHkiLAoJW1NNUF9TUkNfUlFGSU5dID0gInJlcXVlc3QgYnVmZmVyIHN0YXRpc3RpY3MiLAoJW1NNUF9TUkNfUlNGSU5dID0gInJlc3BvbnNlIGJ1ZmZlciBzdGF0aXN0aWNzIiwKCVtTTVBfU1JDX1RYRklOXSA9ICJ0cmFuc2FjdGlvbiBzdGF0aXN0aWNzIiwKCVtTTVBfU1JDX1NTRklOXSA9ICJzZXNzaW9uIHN0YXRpc3RpY3MiLAp9OwoKc3RhdGljIGNvbnN0IGNoYXIgKmZldGNoX2NrcF9uYW1lc1tTTVBfQ0tQX0VOVFJJRVNdID0gewoJW1NNUF9DS1BfRkVfQ09OX0FDQ10gPSAiZnJvbnRlbmQgdGNwLXJlcXVlc3QgY29ubmVjdGlvbiBydWxlIiwKCVtTTVBfQ0tQX0ZFX1NFU19BQ0NdID0gImZyb250ZW5kIHRjcC1yZXF1ZXN0IHNlc3Npb24gcnVsZSIsCglbU01QX0NLUF9GRV9SRVFfQ05UXSA9ICJmcm9udGVuZCB0Y3AtcmVxdWVzdCBjb250ZW50IHJ1bGUiLAoJW1NNUF9DS1BfRkVfSFJRX0hEUl0gPSAiZnJvbnRlbmQgaHR0cC1yZXF1ZXN0IGhlYWRlciBydWxlIiwKCVtTTVBfQ0tQX0ZFX0hSUV9CRFldID0gImZyb250ZW5kIGh0dHAtcmVxdWVzdCBib2R5IHJ1bGUiLAoJW1NNUF9DS1BfRkVfU0VUX0JDS10gPSAiZnJvbnRlbmQgdXNlLWJhY2tlbmQgcnVsZSIsCglbU01QX0NLUF9CRV9SRVFfQ05UXSA9ICJiYWNrZW5kIHRjcC1yZXF1ZXN0IGNvbnRlbnQgcnVsZSIsCglbU01QX0NLUF9CRV9IUlFfSERSXSA9ICJiYWNrZW5kIGh0dHAtcmVxdWVzdCBoZWFkZXIgcnVsZSIsCglbU01QX0NLUF9CRV9IUlFfQkRZXSA9ICJiYWNrZW5kIGh0dHAtcmVxdWVzdCBib2R5IHJ1bGUiLAoJW1NNUF9DS1BfQkVfU0VUX1NSVl0gPSAiYmFja2VuZCB1c2Utc2VydmVyLCBiYWxhbmNlIG9yIHN0aWNrLW1hdGNoIHJ1bGUiLAoJW1NNUF9DS1BfQkVfU1JWX0NPTl0gPSAic2VydmVyIHNvdXJjZSBzZWxlY3Rpb24iLAoJW1NNUF9DS1BfQkVfUkVTX0NOVF0gPSAiYmFja2VuZCB0Y3AtcmVzcG9uc2UgY29udGVudCBydWxlIiwKCVtTTVBfQ0tQX0JFX0hSU19IRFJdID0gImJhY2tlbmQgaHR0cC1yZXNwb25zZSBoZWFkZXIgcnVsZSIsCglbU01QX0NLUF9CRV9IUlNfQkRZXSA9ICJiYWNrZW5kIGh0dHAtcmVzcG9uc2UgYm9keSBydWxlIiwKCVtTTVBfQ0tQX0JFX1NUT19SVUxdID0gImJhY2tlbmQgc3RpY2stc3RvcmUgcnVsZSIsCglbU01QX0NLUF9GRV9SRVNfQ05UXSA9ICJmcm9udGVuZCB0Y3AtcmVzcG9uc2UgY29udGVudCBydWxlIiwKCVtTTVBfQ0tQX0ZFX0hSU19IRFJdID0gImZyb250ZW5kIGh0dHAtcmVzcG9uc2UgaGVhZGVyIHJ1bGUiLAoJW1NNUF9DS1BfRkVfSFJTX0JEWV0gPSAiZnJvbnRlbmQgaHR0cC1yZXNwb25zZSBib2R5IHJ1bGUiLAoJW1NNUF9DS1BfRkVfTE9HX0VORF0gPSAibG9ncyIsCn07CgovKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHNhbXBsZV9leHByLgogKiBJdCBhc3N1bWVzIHRoYXQgdGhlIDxleHByPiBhbmQgYWxsIG9mIGl0cyBjb252ZXJ0ZXJzIGFyZSBwcm9wZXJseQogKiBpbml0aWFsaXplZC4KICovCmlubGluZQppbnQgc21wX2V4cHJfb3V0cHV0X3R5cGUoc3RydWN0IHNhbXBsZV9leHByICpleHByKQp7CglzdHJ1Y3Qgc2FtcGxlX2NvbnZfZXhwciAqc21wX2V4cHI7CgoJaWYgKCFMSVNUX0lTRU1QVFkoJmV4cHItPmNvbnZfZXhwcnMpKSB7CgkJc21wX2V4cHIgPSBMSVNUX1BSRVYoJmV4cHItPmNvbnZfZXhwcnMsIHN0cnVjdCBzYW1wbGVfY29udl9leHByICosIGxpc3QpOwoJCXJldHVybiBzbXBfZXhwci0+Y29udi0+b3V0X3R5cGU7Cgl9CglyZXR1cm4gZXhwci0+ZmV0Y2gtPm91dF90eXBlOwp9CgoKLyogZmlsbCB0aGUgdHJhc2ggd2l0aCBhIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIHNvdXJjZSBuYW1lcyBmb3IgdGhlIDx1c2U+IGJpdAogKiBmaWVsZCB3aGljaCBtdXN0IGJlIGNvbXBvc2VkIG9mIGEgbm9uLW51bGwgc2V0IG9mIFNNUF9VU0VfKiBmbGFncy4gVGhlIHJldHVybgogKiB2YWx1ZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgc3RyaW5nIGluIHRoZSB0cmFzaCBidWZmZXIuCiAqLwpjb25zdCBjaGFyICpzYW1wbGVfc3JjX25hbWVzKHVuc2lnbmVkIGludCB1c2UpCnsKCWludCBiaXQ7CgoJdHJhc2gubGVuID0gMDsKCXRyYXNoLnN0clswXSA9ICdcMCc7Cglmb3IgKGJpdCA9IDA7IGJpdCA8IFNNUF9TUkNfRU5UUklFUzsgYml0KyspIHsKCQlpZiAoISh1c2UgJiB+KCgxIDw8IGJpdCkgLSAxKSkpCgkJCWJyZWFrOyAvKiBubyBtb3JlIGJpdHMgKi8KCgkJaWYgKCEodXNlICYgKDEgPDwgYml0KSkpCgkJCWNvbnRpbnVlOyAvKiBiaXQgbm90IHNldCAqLwoKCQl0cmFzaC5sZW4gKz0gc25wcmludGYodHJhc2guc3RyICsgdHJhc2gubGVuLCB0cmFzaC5zaXplIC0gdHJhc2gubGVuLCAiJXMlcyIsCgkJCQkgICAgICAodXNlICYgKCgxIDw8IGJpdCkgLSAxKSkgPyAiLCIgOiAiIiwKCQkgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hfc3JjX25hbWVzW2JpdF0pOwoJfQoJcmV0dXJuIHRyYXNoLnN0cjsKfQoKLyogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY29ycmVjdCBzYW1wbGUgY2hlY2twb2ludCBuYW1lLCBvciAidW5rbm93biIgd2hlbgogKiB0aGUgZmxhZ3MgYXJlIGludmFsaWQuIE9ubHkgdGhlIGxvd2VzdCBiaXQgaXMgdXNlZCwgaGlnaGVyIGJpdHMgYXJlIGlnbm9yZWQKICogaWYgc2V0LgogKi8KY29uc3QgY2hhciAqc2FtcGxlX2NrcF9uYW1lcyh1bnNpZ25lZCBpbnQgdXNlKQp7CglpbnQgYml0OwoKCWZvciAoYml0ID0gMDsgYml0IDwgU01QX0NLUF9FTlRSSUVTOyBiaXQrKykKCQlpZiAodXNlICYgKDEgPDwgYml0KSkKCQkJcmV0dXJuIGZldGNoX2NrcF9uYW1lc1tiaXRdOwoJcmV0dXJuICJ1bmtub3duIHNhbXBsZSBjaGVjayBwbGFjZSwgcGxlYXNlIHJlcG9ydCB0aGlzIGJ1ZyI7Cn0KCi8qCiAqIFJlZ2lzdGVycyB0aGUgc2FtcGxlIGZldGNoIGtleXdvcmQgbGlzdCA8a3dsPiBhcyBhIGxpc3Qgb2YgdmFsaWQga2V5d29yZHMKICogZm9yIG5leHQgcGFyc2luZyBzZXNzaW9ucy4gVGhlIGZldGNoIGtleXdvcmRzIGNhcGFiaWxpdGllcyBhcmUgYWxzbyBjb21wdXRlZAogKiBmcm9tIHRoZWlyIC0+dXNlIGZpZWxkLgogKi8Kdm9pZCBzYW1wbGVfcmVnaXN0ZXJfZmV0Y2hlcyhzdHJ1Y3Qgc2FtcGxlX2ZldGNoX2t3X2xpc3QgKmt3bCkKewoJc3RydWN0IHNhbXBsZV9mZXRjaCAqc2Y7CglpbnQgYml0OwoKCWZvciAoc2YgPSBrd2wtPmt3OyBzZi0+a3cgIT0gTlVMTDsgc2YrKykgewoJCWZvciAoYml0ID0gMDsgYml0IDwgU01QX1NSQ19FTlRSSUVTOyBiaXQrKykKCQkJaWYgKHNmLT51c2UgJiAoMSA8PCBiaXQpKQoJCQkJc2YtPnZhbCB8PSBmZXRjaF9jYXBbYml0XTsKCX0KCUxJU1RfQUREUSgmc2FtcGxlX2ZldGNoZXMubGlzdCwgJmt3bC0+bGlzdCk7Cn0KCi8qCiAqIFJlZ2lzdGVycyB0aGUgc2FtcGxlIGZvcm1hdCBjb3ZlcnN0aW9uIGtleXdvcmQgbGlzdCA8cGNrbD4gYXMgYSBsaXN0IG9mIHZhbGlkIGtleXdvcmRzIGZvciBuZXh0CiAqIHBhcnNpbmcgc2Vzc2lvbnMuCiAqLwp2b2lkIHNhbXBsZV9yZWdpc3Rlcl9jb252cyhzdHJ1Y3Qgc2FtcGxlX2NvbnZfa3dfbGlzdCAqcGNrbCkKewoJTElTVF9BRERRKCZzYW1wbGVfY29udnMubGlzdCwgJnBja2wtPmxpc3QpOwp9CgovKgogKiBSZXR1cm5zIHRoZSBwb2ludGVyIG9uIHNhbXBsZSBmZXRjaCBrZXl3b3JkIHN0cnVjdHVyZSBpZGVudGlmaWVkIGJ5CiAqIHN0cmluZyBvZiA8bGVuPiBpbiBidWZmZXIgPGt3Pi4KICoKICovCnN0cnVjdCBzYW1wbGVfZmV0Y2ggKmZpbmRfc2FtcGxlX2ZldGNoKGNvbnN0IGNoYXIgKmt3LCBpbnQgbGVuKQp7CglpbnQgaW5kZXg7CglzdHJ1Y3Qgc2FtcGxlX2ZldGNoX2t3X2xpc3QgKmt3bDsKCglsaXN0X2Zvcl9lYWNoX2VudHJ5KGt3bCwgJnNhbXBsZV9mZXRjaGVzLmxpc3QsIGxpc3QpIHsKCQlmb3IgKGluZGV4ID0gMDsga3dsLT5rd1tpbmRleF0ua3cgIT0gTlVMTDsgaW5kZXgrKykgewoJCQlpZiAoc3RybmNtcChrd2wtPmt3W2luZGV4XS5rdywga3csIGxlbikgPT0gMCAmJgoJCQkgICAga3dsLT5rd1tpbmRleF0ua3dbbGVuXSA9PSAnXDAnKQoJCQkJcmV0dXJuICZrd2wtPmt3W2luZGV4XTsKCQl9Cgl9CglyZXR1cm4gTlVMTDsKfQoKLyogVGhpcyBmdWNudGlvbiBicm93c2UgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHNhcGxlIGZldGNoLiA8Y3VycmVudD4gaXMKICogdGhlIGxhc3QgdXNlZCBzYW1wbGUgZmV0Y2guIElmIGl0IGlzIHRoZSBmaXJzdCBjYWxsLCBpdCBtdXN0IHNldCB0byBOVUxMLgogKiA8aWR4PiBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgc2FtcGxl6GZldGNoIGVudHJ5LiBJdCBpcyB1c2VkIGFzIHByaXZhdGUKICogdmFsdWUuIEl0IGlzIHVzZWxlcyB0byBpbml0aWF0ZSBpdC4KICoKICogSXQgcmV0dXJucyBhbHdheXMgdGhlIG5ld3QgZmV0Y2hfc2FtcGxlIGVudHJ5LCBhbmQgTlVMTCB3aGVuIHRoZSBlbmQgb2YKICogdGhlIGxpc3QgaXMgcmVhY2hlZC4KICovCnN0cnVjdCBzYW1wbGVfZmV0Y2ggKnNhbXBsZV9mZXRjaF9nZXRuZXh0KHN0cnVjdCBzYW1wbGVfZmV0Y2ggKmN1cnJlbnQsIGludCAqaWR4KQp7CglzdHJ1Y3Qgc2FtcGxlX2ZldGNoX2t3X2xpc3QgKmt3bDsKCXN0cnVjdCBzYW1wbGVfZmV0Y2ggKmJhc2U7CgoJaWYgKCFjdXJyZW50KSB7CgkJLyogR2V0IGZpcnN0IGt3bCBlbnRyeS4gKi8KCQlrd2wgPSBMSVNUX05FWFQoJnNhbXBsZV9mZXRjaGVzLmxpc3QsIHN0cnVjdCBzYW1wbGVfZmV0Y2hfa3dfbGlzdCAqLCBsaXN0KTsKCQkoKmlkeCkgPSAwOwoJfSBlbHNlIHsKCQkvKiBHZXQga3dsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJldCBlbnRyeS4gKi8KCQliYXNlID0gY3VycmVudCArIDEgLSAoKmlkeCk7CgkJa3dsID0gY29udGFpbmVyX29mKGJhc2UsIHN0cnVjdCBzYW1wbGVfZmV0Y2hfa3dfbGlzdCwga3cpOwoJfQoKCXdoaWxlICgxKSB7CgoJCS8qIENoZWNrIGlmIGt3bCBpcyB0aGUgbGFzdCBlbnRyeS4gKi8KCQlpZiAoJmt3bC0+bGlzdCA9PSAmc2FtcGxlX2ZldGNoZXMubGlzdCkKCQkJcmV0dXJuIE5VTEw7CgoJCS8qIGlkeCBjb250YWluIHRoZSBuZXh0IGtleXdvcmQuIElmIGl0IGlzIGF2YWlsYWJsZSwgcmV0dXJuIGl0LiAqLwoJCWlmIChrd2wtPmt3WyppZHhdLmt3KSB7CgkJCSgqaWR4KSsrOwoJCQlyZXR1cm4gJmt3bC0+a3dbKCppZHgpLTFdOwoJCX0KCgkJLyogZ2V0IG5leHQgZW50cnkgaW4gdGhlIG1haW4gbGlzdCwgYW5kIHJldHVybiBOVUxMIGlmIHRoZSBlbmQgaXMgcmVhY2hlZC4gKi8KCQlrd2wgPSBMSVNUX05FWFQoJmt3bC0+bGlzdCwgc3RydWN0IHNhbXBsZV9mZXRjaF9rd19saXN0ICosIGxpc3QpOwoKCQkvKiBTZXQgaW5kZXggdG8gMCwgYW5zIGRvIG9uZSBvdGhlciBsb29wLiAqLwoJCSgqaWR4KSA9IDA7Cgl9Cn0KCi8qIFRoaXMgZnVuY3Rpb24gYnJvd3NlcyB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY29udmVydGVycy4gPGN1cnJlbnQ+IGlzCiAqIHRoZSBsYXN0IHVzZWQgY29udmVydGVyLiBJZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCwgaXQgbXVzdCBzZXQgdG8gTlVMTC4KICogPGlkeD4gaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNvbnZlcnRlciBlbnRyeS4gSXQgaXMgdXNlZCBhcyBwcml2YXRlCiAqIHZhbHVlLiBJdCBpcyB1c2VsZXNzIHRvIGluaXRpYXRlIGl0LgogKgogKiBJdCByZXR1cm5zIGFsd2F5cyB0aGUgbmV4dCBzYW1wbGVfY29udiBlbnRyeSwgYW5kIE5VTEwgd2hlbiB0aGUgZW5kIG9mCiAqIHRoZSBsaXN0IGlzIHJlYWNoZWQuCiAqLwpzdHJ1Y3Qgc2FtcGxlX2NvbnYgKnNhbXBsZV9jb252X2dldG5leHQoc3RydWN0IHNhbXBsZV9jb252ICpjdXJyZW50LCBpbnQgKmlkeCkKewoJc3RydWN0IHNhbXBsZV9jb252X2t3X2xpc3QgKmt3bDsKCXN0cnVjdCBzYW1wbGVfY29udiAqYmFzZTsKCglpZiAoIWN1cnJlbnQpIHsKCQkvKiBHZXQgZmlyc3Qga3dsIGVudHJ5LiAqLwoJCWt3bCA9IExJU1RfTkVYVCgmc2FtcGxlX2NvbnZzLmxpc3QsIHN0cnVjdCBzYW1wbGVfY29udl9rd19saXN0ICosIGxpc3QpOwoJCSgqaWR4KSA9IDA7Cgl9IGVsc2UgewoJCS8qIEdldCBrd2wgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmV0IGVudHJ5LiAqLwoJCWJhc2UgPSBjdXJyZW50ICsgMSAtICgqaWR4KTsKCQlrd2wgPSBjb250YWluZXJfb2YoYmFzZSwgc3RydWN0IHNhbXBsZV9jb252X2t3X2xpc3QsIGt3KTsKCX0KCgl3aGlsZSAoMSkgewoJCS8qIENoZWNrIGlmIGt3bCBpcyB0aGUgbGFzdCBlbnRyeS4gKi8KCQlpZiAoJmt3bC0+bGlzdCA9PSAmc2FtcGxlX2NvbnZzLmxpc3QpCgkJCXJldHVybiBOVUxMOwoKCQkvKiBpZHggY29udGFpbiB0aGUgbmV4dCBrZXl3b3JkLiBJZiBpdCBpcyBhdmFpbGFibGUsIHJldHVybiBpdC4gKi8KCQlpZiAoa3dsLT5rd1sqaWR4XS5rdykgewoJCQkoKmlkeCkrKzsKCQkJcmV0dXJuICZrd2wtPmt3WygqaWR4KS0xXTsKCQl9CgoJCS8qIGdldCBuZXh0IGVudHJ5IGluIHRoZSBtYWluIGxpc3QsIGFuZCByZXR1cm4gTlVMTCBpZiB0aGUgZW5kIGlzIHJlYWNoZWQuICovCgkJa3dsID0gTElTVF9ORVhUKCZrd2wtPmxpc3QsIHN0cnVjdCBzYW1wbGVfY29udl9rd19saXN0ICosIGxpc3QpOwoKCQkvKiBTZXQgaW5kZXggdG8gMCwgYW5zIGRvIG9uZSBvdGhlciBsb29wLiAqLwoJCSgqaWR4KSA9IDA7Cgl9Cn0KCi8qCiAqIFJldHVybnMgdGhlIHBvaW50ZXIgb24gc2FtcGxlIGZvcm1hdCBjb252ZXJzaW9uIGtleXdvcmQgc3RydWN0dXJlIGlkZW50aWZpZWQgYnkKICogc3RyaW5nIG9mIDxsZW4+IGluIGJ1ZmZlciA8a3c+LgogKgogKi8Kc3RydWN0IHNhbXBsZV9jb252ICpmaW5kX3NhbXBsZV9jb252KGNvbnN0IGNoYXIgKmt3LCBpbnQgbGVuKQp7CglpbnQgaW5kZXg7CglzdHJ1Y3Qgc2FtcGxlX2NvbnZfa3dfbGlzdCAqa3dsOwoKCWxpc3RfZm9yX2VhY2hfZW50cnkoa3dsLCAmc2FtcGxlX2NvbnZzLmxpc3QsIGxpc3QpIHsKCQlmb3IgKGluZGV4ID0gMDsga3dsLT5rd1tpbmRleF0ua3cgIT0gTlVMTDsgaW5kZXgrKykgewoJCQlpZiAoc3RybmNtcChrd2wtPmt3W2luZGV4XS5rdywga3csIGxlbikgPT0gMCAmJgoJCQkgICAga3dsLT5rd1tpbmRleF0ua3dbbGVuXSA9PSAnXDAnKQoJCQkJcmV0dXJuICZrd2wtPmt3W2luZGV4XTsKCQl9Cgl9CglyZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgU2FtcGxlIGNhc3RzIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICBOb3RlOiB0aGVzZSBmdW5jdGlvbnMgZG8gKk5PVCogc2V0IHRoZSBvdXRwdXQgdHlwZSBvbiB0aGUgICAgKi8KLyogICBzYW1wbGUsIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRvaW5nIHRoaXMgb24gcmV0dXJuLiAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBpbnQgY19pcDJpbnQoc3RydWN0IHNhbXBsZSAqc21wKQp7CglzbXAtPmRhdGEudWludCA9IG50b2hsKHNtcC0+ZGF0YS5pcHY0LnNfYWRkcik7CglzbXAtPnR5cGUgPSBTTVBfVF9VSU5UOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19pcDJzdHIoc3RydWN0IHNhbXBsZSAqc21wKQp7CglzdHJ1Y3QgY2h1bmsgKnRyYXNoID0gZ2V0X3RyYXNoX2NodW5rKCk7CgoJaWYgKCFpbmV0X250b3AoQUZfSU5FVCwgKHZvaWQgKikmc21wLT5kYXRhLmlwdjQsIHRyYXNoLT5zdHIsIHRyYXNoLT5zaXplKSkKCQlyZXR1cm4gMDsKCgl0cmFzaC0+bGVuID0gc3RybGVuKHRyYXNoLT5zdHIpOwoJc21wLT5kYXRhLnN0ciA9ICp0cmFzaDsKCXNtcC0+dHlwZSA9IFNNUF9UX1NUUjsKCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IGNfaXAyaXB2NihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXY0dG92Nigmc21wLT5kYXRhLmlwdjYsICZzbXAtPmRhdGEuaXB2NCk7CglzbXAtPnR5cGUgPSBTTVBfVF9JUFY2OwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19pcHY2MnN0cihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXN0cnVjdCBjaHVuayAqdHJhc2ggPSBnZXRfdHJhc2hfY2h1bmsoKTsKCglpZiAoIWluZXRfbnRvcChBRl9JTkVUNiwgKHZvaWQgKikmc21wLT5kYXRhLmlwdjYsIHRyYXNoLT5zdHIsIHRyYXNoLT5zaXplKSkKCQlyZXR1cm4gMDsKCgl0cmFzaC0+bGVuID0gc3RybGVuKHRyYXNoLT5zdHIpOwoJc21wLT5kYXRhLnN0ciA9ICp0cmFzaDsKCXNtcC0+dHlwZSA9IFNNUF9UX1NUUjsKCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoJcmV0dXJuIDE7Cn0KCi8qCnN0YXRpYyBpbnQgY19pcHY2MmlwKHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJcmV0dXJuIHY2dG92NCgmc21wLT5kYXRhLmlwdjQsICZzbXAtPmRhdGEuaXB2Nik7Cn0KKi8KCnN0YXRpYyBpbnQgY19pbnQyaXAoc3RydWN0IHNhbXBsZSAqc21wKQp7CglzbXAtPmRhdGEuaXB2NC5zX2FkZHIgPSBodG9ubChzbXAtPmRhdGEudWludCk7CglzbXAtPnR5cGUgPSBTTVBfVF9JUFY0OwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19zdHIyYWRkcihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCWlmICghYnVmMmlwKHNtcC0+ZGF0YS5zdHIuc3RyLCBzbXAtPmRhdGEuc3RyLmxlbiwgJnNtcC0+ZGF0YS5pcHY0KSkgewoJCWlmICghYnVmMmlwNihzbXAtPmRhdGEuc3RyLnN0ciwgc21wLT5kYXRhLnN0ci5sZW4sICZzbXAtPmRhdGEuaXB2NikpCgkJCXJldHVybiAwOwoJCXNtcC0+dHlwZSA9IFNNUF9UX0lQVjY7CgkJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CgkJcmV0dXJuIDE7Cgl9CglzbXAtPnR5cGUgPSBTTVBfVF9JUFY0OwoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBjX3N0cjJpcChzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCWlmICghYnVmMmlwKHNtcC0+ZGF0YS5zdHIuc3RyLCBzbXAtPmRhdGEuc3RyLmxlbiwgJnNtcC0+ZGF0YS5pcHY0KSkKCQlyZXR1cm4gMDsKCXNtcC0+dHlwZSA9IFNNUF9UX0lQVjQ7CglzbXAtPmZsYWdzICY9IH5TTVBfRl9DT05TVDsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IGNfc3RyMmlwdjYoc3RydWN0IHNhbXBsZSAqc21wKQp7CglpZiAoIWJ1ZjJpcDYoc21wLT5kYXRhLnN0ci5zdHIsIHNtcC0+ZGF0YS5zdHIubGVuLCAmc21wLT5kYXRhLmlwdjYpKQoJCXJldHVybiAwOwoJc21wLT50eXBlID0gU01QX1RfSVBWNjsKCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoJcmV0dXJuIDE7Cn0KCi8qCiAqIFRoZSBOVUxMIGNoYXIgYWx3YXlzIGVuZm9yY2VzIHRoZSBlbmQgb2Ygc3RyaW5nIGlmIGl0IGlzIG1ldC4KICogRGF0YSBpcyBuZXZlciBjaGFuZ2VkLCBzbyB3ZSBjYW4gaWdub3JlIHRoZSBDT05TVCBjYXNlCiAqLwpzdGF0aWMgaW50IGNfYmluMnN0cihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBzbXAtPmRhdGEuc3RyLmxlbjsgaSsrKSB7CgkJaWYgKCFzbXAtPmRhdGEuc3RyLnN0cltpXSkgewoJCQlzbXAtPmRhdGEuc3RyLmxlbiA9IGk7CgkJCWJyZWFrOwoJCX0KCX0KCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IGNfaW50MnN0cihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXN0cnVjdCBjaHVuayAqdHJhc2ggPSBnZXRfdHJhc2hfY2h1bmsoKTsKCWNoYXIgKnBvczsKCglwb3MgPSB1bHRvYV9yKHNtcC0+ZGF0YS51aW50LCB0cmFzaC0+c3RyLCB0cmFzaC0+c2l6ZSk7CgoJaWYgKCFwb3MpCgkJcmV0dXJuIDA7CgoJdHJhc2gtPnNpemUgPSB0cmFzaC0+c2l6ZSAtIChwb3MgLSB0cmFzaC0+c3RyKTsKCXRyYXNoLT5zdHIgPSBwb3M7Cgl0cmFzaC0+bGVuID0gc3RybGVuKHBvcyk7CglzbXAtPmRhdGEuc3RyID0gKnRyYXNoOwoJc21wLT50eXBlID0gU01QX1RfU1RSOwoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CglyZXR1cm4gMTsKfQoKLyogVGhpcyBmdW5jdGlvbiBkdXBsaWNhdGVzIGRhdGEgYW5kIHJlbW92ZXMgdGhlIGZsYWcgImNvbnN0Ii4gKi8KaW50IHNtcF9kdXAoc3RydWN0IHNhbXBsZSAqc21wKQp7CglzdHJ1Y3QgY2h1bmsgKnRyYXNoOwoKCS8qIElmIHRoZSBjb25zdCBmbGFnIGlzIG5vdCBzZXQsIHdlIGRvbid0IG5lZWQgdG8gZHVwbGljYXRlIHRoZQoJICogcGF0dGVybiBhcyBpdCBjYW4gYmUgbW9kaWZpZWQgaW4gcGxhY2UuCgkgKi8KCWlmICghKHNtcC0+ZmxhZ3MgJiBTTVBfRl9DT05TVCkpCgkJcmV0dXJuIDE7CgoJc3dpdGNoIChzbXAtPnR5cGUpIHsKCWNhc2UgU01QX1RfQk9PTDoKCWNhc2UgU01QX1RfVUlOVDoKCWNhc2UgU01QX1RfU0lOVDoKCWNhc2UgU01QX1RfQUREUjoKCWNhc2UgU01QX1RfSVBWNDoKCWNhc2UgU01QX1RfSVBWNjoKCQkvKiBUaGVzZSB0eXBlIGFyZSBub3QgY29uc3QuICovCgkJYnJlYWs7CgljYXNlIFNNUF9UX1NUUjoKCWNhc2UgU01QX1RfQklOOgoJCS8qIER1cGxpY2F0ZSBkYXRhLiAqLwoJCXRyYXNoID0gZ2V0X3RyYXNoX2NodW5rKCk7CgkJdHJhc2gtPmxlbiA9IHNtcC0+ZGF0YS5zdHIubGVuIDwgdHJhc2gtPnNpemUgPyBzbXAtPmRhdGEuc3RyLmxlbiA6IHRyYXNoLT5zaXplOwoJCW1lbWNweSh0cmFzaC0+c3RyLCBzbXAtPmRhdGEuc3RyLnN0ciwgdHJhc2gtPmxlbik7CgkJc21wLT5kYXRhLnN0ciA9ICp0cmFzaDsKCQlicmVhazsKCWRlZmF1bHQ6CgkJLyogT3RoZXIgY2FzZXMgYXJlIHVuZXhwZWN0ZWQuICovCgkJcmV0dXJuIDA7Cgl9CgoJLyogcmVtb3ZlIGNvbnN0IGZsYWcgKi8KCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoJcmV0dXJuIDE7Cn0KCmludCBjX25vbmUoc3RydWN0IHNhbXBsZSAqc21wKQp7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBjX3N0cjJpbnQoc3RydWN0IHNhbXBsZSAqc21wKQp7CglpbnQgaTsKCXVpbnQzMl90IHJldCA9IDA7CgoJaWYgKHNtcC0+ZGF0YS5zdHIubGVuID09IDApCgkJcmV0dXJuIDA7CgoJZm9yIChpID0gMDsgaSA8IHNtcC0+ZGF0YS5zdHIubGVuOyBpKyspIHsKCQl1aW50MzJfdCB2YWwgPSBzbXAtPmRhdGEuc3RyLnN0cltpXSAtICcwJzsKCgkJaWYgKHZhbCA+IDkpIHsKCQkJaWYgKGkgPT0gMCkKCQkJCXJldHVybiAwOwoJCQlicmVhazsKCQl9CgoJCXJldCA9IHJldCAqIDEwICsgdmFsOwoJfQoKCXNtcC0+ZGF0YS51aW50ID0gcmV0OwoJc21wLT50eXBlID0gU01QX1RfVUlOVDsKCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19zdHIybWV0aChzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCWVudW0gaHR0cF9tZXRoX3QgbWV0aDsKCWludCBsZW47CgoJbWV0aCA9IGZpbmRfaHR0cF9tZXRoKHNtcC0+ZGF0YS5zdHIuc3RyLCBzbXAtPmRhdGEuc3RyLmxlbik7CglpZiAobWV0aCA9PSBIVFRQX01FVEhfT1RIRVIpIHsKCQlsZW4gPSBzbXAtPmRhdGEuc3RyLmxlbjsKCQlzbXAtPmRhdGEubWV0aC5zdHIuc3RyID0gc21wLT5kYXRhLnN0ci5zdHI7CgkJc21wLT5kYXRhLm1ldGguc3RyLmxlbiA9IGxlbjsKCX0KCWVsc2UKCQlzbXAtPmZsYWdzICY9IH5TTVBfRl9DT05TVDsKCXNtcC0+ZGF0YS5tZXRoLm1ldGggPSBtZXRoOwoJc21wLT50eXBlID0gU01QX1RfTUVUSDsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IGNfbWV0aDJzdHIoc3RydWN0IHNhbXBsZSAqc21wKQp7CglpbnQgbGVuOwoJZW51bSBodHRwX21ldGhfdCBtZXRoOwoKCWlmIChzbXAtPmRhdGEubWV0aC5tZXRoID09IEhUVFBfTUVUSF9PVEhFUikgewoJCS8qIFRoZSBtZXRob2QgaXMgdW5rbm93bi4gQ29weSB0aGUgb3JpZ2luYWwgcG9pbnRlci4gKi8KCQlsZW4gPSBzbXAtPmRhdGEubWV0aC5zdHIubGVuOwoJCXNtcC0+ZGF0YS5zdHIuc3RyID0gc21wLT5kYXRhLm1ldGguc3RyLnN0cjsKCQlzbXAtPmRhdGEuc3RyLmxlbiA9IGxlbjsKCQlzbXAtPnR5cGUgPSBTTVBfVF9TVFI7Cgl9CgllbHNlIGlmIChzbXAtPmRhdGEubWV0aC5tZXRoIDwgSFRUUF9NRVRIX09USEVSKSB7CgkJLyogVGhlIG1ldGhvZCBpcyBrbm93biwgY29weSB0aGUgcG9pbnRlciBjb250YWluaW5nIHRoZSBzdHJpbmcuICovCgkJbWV0aCA9IHNtcC0+ZGF0YS5tZXRoLm1ldGg7CgkJc21wLT5kYXRhLnN0ci5zdHIgPSBodHRwX2tub3duX21ldGhvZHNbbWV0aF0ubmFtZTsKCQlzbXAtPmRhdGEuc3RyLmxlbiA9IGh0dHBfa25vd25fbWV0aG9kc1ttZXRoXS5sZW47CgkJc21wLT5mbGFncyB8PSBTTVBfRl9DT05TVDsKCQlzbXAtPnR5cGUgPSBTTVBfVF9TVFI7Cgl9CgllbHNlIHsKCQkvKiBVbmtub3duIG1ldGhvZCAqLwoJCXJldHVybiAwOwoJfQoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19hZGRyMmJpbihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXN0cnVjdCBjaHVuayAqY2hrID0gZ2V0X3RyYXNoX2NodW5rKCk7CgoJaWYgKHNtcC0+dHlwZSA9PSBTTVBfVF9JUFY0KSB7CgkJY2hrLT5sZW4gPSA0OwoJCW1lbWNweShjaGstPnN0ciwgJnNtcC0+ZGF0YS5pcHY0LCBjaGstPmxlbik7Cgl9CgllbHNlIGlmIChzbXAtPnR5cGUgPT0gU01QX1RfSVBWNikgewoJCWNoay0+bGVuID0gMTY7CgkJbWVtY3B5KGNoay0+c3RyLCAmc21wLT5kYXRhLmlwdjYsIGNoay0+bGVuKTsKCX0KCWVsc2UKCQlyZXR1cm4gMDsKCglzbXAtPmRhdGEuc3RyID0gKmNoazsKCXNtcC0+dHlwZSA9IFNNUF9UX0JJTjsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IGNfaW50MmJpbihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXN0cnVjdCBjaHVuayAqY2hrID0gZ2V0X3RyYXNoX2NodW5rKCk7CgoJKih1bnNpZ25lZCBpbnQgKiljaGstPnN0ciA9IGh0b25sKHNtcC0+ZGF0YS51aW50KTsKCWNoay0+bGVuID0gNDsKCglzbXAtPmRhdGEuc3RyID0gKmNoazsKCXNtcC0+dHlwZSA9IFNNUF9UX0JJTjsKCXJldHVybiAxOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgIFNhbXBsZSBjYXN0cyBtYXRyaXg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICBzYW1wbGVfY2FzdHNbZnJvbSB0eXBlXVt0byB0eXBlXSAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgIE5VTEwgcG9pbnRlciB1c2VkIGZvciBpbXBvc3NpYmxlIHNhbXBsZSBjYXN0cyAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzYW1wbGVfY2FzdF9mY3Qgc2FtcGxlX2Nhc3RzW1NNUF9UWVBFU11bU01QX1RZUEVTXSA9IHsKLyogICAgICAgICAgICB0bzogIEJPT0wgICAgICAgVUlOVCAgICAgICBTSU5UICAgICAgIEFERFIgICAgICAgIElQVjQgICAgICBJUFY2ICAgICAgICBTVFIgICAgICAgICBCSU4gICAgICAgICBNRVRIICovCi8qIGZyb206IEJPT0wgKi8geyBjX25vbmUsICAgIGNfbm9uZSwgICAgY19ub25lLCAgICBOVUxMLCAgICAgICBOVUxMLCAgICAgTlVMTCwgICAgICAgY19pbnQyc3RyLCAgTlVMTCwgICAgICAgTlVMTCwgICAgICAgfSwKLyogICAgICAgVUlOVCAqLyB7IGNfbm9uZSwgICAgY19ub25lLCAgICBjX25vbmUsICAgIGNfaW50MmlwLCAgIGNfaW50MmlwLCBOVUxMLCAgICAgICBjX2ludDJzdHIsICBjX2ludDJiaW4sICBOVUxMLCAgICAgICB9LAovKiAgICAgICBTSU5UICovIHsgY19ub25lLCAgICBjX25vbmUsICAgIGNfbm9uZSwgICAgY19pbnQyaXAsICAgY19pbnQyaXAsIE5VTEwsICAgICAgIGNfaW50MnN0ciwgIGNfaW50MmJpbiwgIE5VTEwsICAgICAgIH0sCi8qICAgICAgIEFERFIgKi8geyBOVUxMLCAgICAgIE5VTEwsICAgICAgTlVMTCwgICAgICBOVUxMLCAgICAgICBOVUxMLCAgICAgTlVMTCwgICAgICAgTlVMTCwgICAgICAgTlVMTCwgICAgICAgTlVMTCwgICAgICAgfSwKLyogICAgICAgSVBWNCAqLyB7IE5VTEwsICAgICAgY19pcDJpbnQsICBjX2lwMmludCwgIGNfbm9uZSwgICAgIGNfbm9uZSwgICBjX2lwMmlwdjYsICBjX2lwMnN0ciwgICBjX2FkZHIyYmluLCBOVUxMLCAgICAgICB9LAovKiAgICAgICBJUFY2ICovIHsgTlVMTCwgICAgICBOVUxMLCAgICAgIE5VTEwsICAgICAgY19ub25lLCAgICAgTlVMTCwgICAgIGNfbm9uZSwgICAgIGNfaXB2NjJzdHIsIGNfYWRkcjJiaW4sIE5VTEwsICAgICAgIH0sCi8qICAgICAgICBTVFIgKi8geyBjX3N0cjJpbnQsIGNfc3RyMmludCwgY19zdHIyaW50LCBjX3N0cjJhZGRyLCBjX3N0cjJpcCwgY19zdHIyaXB2NiwgY19ub25lLCAgICAgY19ub25lLCAgICAgY19zdHIybWV0aCwgfSwKLyogICAgICAgIEJJTiAqLyB7IE5VTEwsICAgICAgTlVMTCwgICAgICBOVUxMLCAgICAgIE5VTEwsICAgICAgIE5VTEwsICAgICBOVUxMLCAgICAgICBjX2JpbjJzdHIsICBjX25vbmUsICAgICBjX3N0cjJtZXRoLCB9LAovKiAgICAgICBNRVRIICovIHsgTlVMTCwgICAgICBOVUxMLCAgICAgIE5VTEwsICAgICAgTlVMTCwgICAgICAgTlVMTCwgICAgIE5VTEwsICAgICAgIGNfbWV0aDJzdHIsIGNfbWV0aDJzdHIsIGNfbm9uZSwgICAgIH0sCn07CgovKgogKiBQYXJzZSBhIHNhbXBsZSBleHByZXNzaW9uIGNvbmZpZ3VyYXRpb246CiAqICAgICAgICBmZXRjaCBrZXl3b3JkIGZvbGxvd2VkIGJ5IGZvcm1hdCBjb252ZXJzaW9uIGtleXdvcmRzLgogKiBSZXR1cm5zIGEgcG9pbnRlciBvbiBhbGxvY2F0ZWQgc2FtcGxlIGV4cHJlc3Npb24gc3RydWN0dXJlLgogKiBUaGUgY2FsbGVyIG11c3QgaGF2ZSBzZXQgYWwtPmN0eC4KICovCnN0cnVjdCBzYW1wbGVfZXhwciAqc2FtcGxlX3BhcnNlX2V4cHIoY2hhciAqKnN0ciwgaW50ICppZHgsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjaGFyICoqZXJyX21zZywgc3RydWN0IGFyZ19saXN0ICphbCkKewoJY29uc3QgY2hhciAqYmVndzsgLyogYmVnaW5uaW5nIG9mIHdvcmQgKi8KCWNvbnN0IGNoYXIgKmVuZHc7IC8qIGVuZCBvZiB3b3JkICovCgljb25zdCBjaGFyICplbmR0OyAvKiBlbmQgb2YgdGVybSAqLwoJc3RydWN0IHNhbXBsZV9leHByICpleHByOwoJc3RydWN0IHNhbXBsZV9mZXRjaCAqZmV0Y2g7CglzdHJ1Y3Qgc2FtcGxlX2NvbnYgKmNvbnY7Cgl1bnNpZ25lZCBsb25nIHByZXZfdHlwZTsKCWNoYXIgKmZrdyA9IE5VTEw7CgljaGFyICpja3cgPSBOVUxMOwoJaW50IGVycl9hcmc7CgoJYmVndyA9IHN0clsqaWR4XTsKCWZvciAoZW5kdyA9IGJlZ3c7ICplbmR3ICYmICplbmR3ICE9ICcoJyAmJiAqZW5kdyAhPSAnLCc7IGVuZHcrKyk7CgoJaWYgKGVuZHcgPT0gYmVndykgewoJCW1lbXByaW50ZihlcnJfbXNnLCAibWlzc2luZyBmZXRjaCBtZXRob2QiKTsKCQlnb3RvIG91dF9lcnJvcjsKCX0KCgkvKiBrZWVwIGEgY29weSBvZiB0aGUgY3VycmVudCBmZXRjaCBrZXl3b3JkIGZvciBlcnJvciByZXBvcnRpbmcgKi8KCWZrdyA9IG15X3N0cm5kdXAoYmVndywgZW5kdyAtIGJlZ3cpOwoKCWZldGNoID0gZmluZF9zYW1wbGVfZmV0Y2goYmVndywgZW5kdyAtIGJlZ3cpOwoJaWYgKCFmZXRjaCkgewoJCW1lbXByaW50ZihlcnJfbXNnLCAidW5rbm93biBmZXRjaCBtZXRob2QgJyVzJyIsIGZrdyk7CgkJZ290byBvdXRfZXJyb3I7Cgl9CgoJZW5kdCA9IGVuZHc7CglpZiAoKmVuZHQgPT0gJygnKSB7CgkJLyogbG9vayBmb3IgdGhlIGVuZCBvZiB0aGlzIHRlcm0gYW5kIHNraXAgdGhlIG9wZW5pbmcgcGFyZW50aGVzaXMgKi8KCQllbmR0ID0gKytlbmR3OwoJCXdoaWxlICgqZW5kdCAmJiAqZW5kdCAhPSAnKScpCgkJCWVuZHQrKzsKCQlpZiAoKmVuZHQgIT0gJyknKSB7CgkJCW1lbXByaW50ZihlcnJfbXNnLCAibWlzc2luZyBjbG9zaW5nICcpJyBhZnRlciBhcmd1bWVudHMgdG8gZmV0Y2gga2V5d29yZCAnJXMnIiwgZmt3KTsKCQkJZ290byBvdXRfZXJyb3I7CgkJfQoJfQoKCS8qIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgOgoJICogICAtIGJlZ3cgOiBiZWdpbm5pbmcgb2YgdGhlIGtleXdvcmQKCSAqICAgLSBlbmR3IDogZW5kIG9mIHRoZSBrZXl3b3JkLCBmaXJzdCBjaGFyYWN0ZXIgbm90IHBhcnQgb2Yga2V5d29yZAoJICogICAgICAgICAgICBub3IgdGhlIG9wZW5pbmcgcGFyZW50aGVzaXMgKHNvIGZpcnN0IGNoYXJhY3RlciBvZiBhcmdzCgkgKiAgICAgICAgICAgIGlmIHByZXNlbnQpLgoJICogICAtIGVuZHQgOiBlbmQgb2YgdGhlIHRlcm0gKD1lbmR3IG9yIGxhc3QgcGFyZW50aGVzaXMgaWYgYXJncyBhcmUgcHJlc2VudCkKCSAqLwoKCWlmIChmZXRjaC0+b3V0X3R5cGUgPj0gU01QX1RZUEVTKSB7CgkJbWVtcHJpbnRmKGVycl9tc2csICJyZXR1cm5zIHR5cGUgb2YgZmV0Y2ggbWV0aG9kICclcycgaXMgdW5rbm93biIsIGZrdyk7CgkJZ290byBvdXRfZXJyb3I7Cgl9CglwcmV2X3R5cGUgPSBmZXRjaC0+b3V0X3R5cGU7CgoJZXhwciA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHNhbXBsZV9leHByKSk7CglpZiAoIWV4cHIpCgkJZ290byBvdXRfZXJyb3I7CgoJTElTVF9JTklUKCYoZXhwci0+Y29udl9leHBycykpOwoJZXhwci0+ZmV0Y2ggPSBmZXRjaDsKCWV4cHItPmFyZ19wID0gZW1wdHlfYXJnX2xpc3Q7CgoJLyogTm90ZSB0aGF0IHdlIGNhbGwgdGhlIGFyZ3VtZW50IHBhcnNlciBldmVuIHdpdGggYW4gZW1wdHkgc3RyaW5nLAoJICogdGhpcyBhbGxvd3MgaXQgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgZW50cmllcyBmb3IgbWFuZGF0b3J5CgkgKiBpbXBsaWNpdCBhcmd1bWVudHMgKGVnOiBsb2NhbCBwcm94eSBuYW1lKS4KCSAqLwoJYWwtPmt3ID0gZXhwci0+ZmV0Y2gtPmt3OwoJYWwtPmNvbnYgPSBOVUxMOwoJaWYgKG1ha2VfYXJnX2xpc3QoZW5kdywgZW5kdCAtIGVuZHcsIGZldGNoLT5hcmdfbWFzaywgJmV4cHItPmFyZ19wLCBlcnJfbXNnLCBOVUxMLCAmZXJyX2FyZywgYWwpIDwgMCkgewoJCW1lbXByaW50ZihlcnJfbXNnLCAiZmV0Y2ggbWV0aG9kICclcycgOiAlcyIsIGZrdywgKmVycl9tc2cpOwoJCWdvdG8gb3V0X2Vycm9yOwoJfQoKCWlmICghZXhwci0+YXJnX3ApIHsKCQlleHByLT5hcmdfcCA9IGVtcHR5X2FyZ19saXN0OwoJfQoJZWxzZSBpZiAoZmV0Y2gtPnZhbF9hcmdzICYmICFmZXRjaC0+dmFsX2FyZ3MoZXhwci0+YXJnX3AsIGVycl9tc2cpKSB7CgkJbWVtcHJpbnRmKGVycl9tc2csICJpbnZhbGlkIGFyZ3MgaW4gZmV0Y2ggbWV0aG9kICclcycgOiAlcyIsIGZrdywgKmVycl9tc2cpOwoJCWdvdG8gb3V0X2Vycm9yOwoJfQoKCS8qIE5vdyBwcm9jZXNzIHRoZSBjb252ZXJ0ZXJzIGlmIGFueS4gV2UgaGF2ZSB0d28gc3VwcG9ydGVkIHN5bnRheGVzCgkgKiBmb3IgdGhlIGNvbnZlcnRlcnMsIHdoaWNoIGNhbiBiZSBjb21iaW5lZCA6CgkgKiAgLSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiBjb252ZXJ0ZXJzIGp1c3QgYWZ0ZXIgdGhlIGtleXdvcmQgYW5kIGFyZ3MgOwoJICogIC0gb25lIGNvbnZlcnRlciBwZXIga2V5d29yZAoJICogVGhlIGNvbWJpbmF0aW9uIGFsbG93cyB0byBoYXZlIGVhY2gga2V5d29yZCBiZWluZyBhIGNvbW1hLWRlbGltaXRlZAoJICogc2VyaWVzIG9mIGNvbnZlcnRlcnMuCgkgKgoJICogV2Ugd2FudCB0byBwcm9jZXNzIHRoZSBmb3JtZXIgZmlyc3QsIHRoZW4gdGhlIGxhdHRlci4gRm9yIHRoaXMgd2Ugc3RhcnQKCSAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3VwcG9zZWQgcGxhY2UgaW4gdGhlIGV4aXRpbmcgY29udiBjaGFpbiwgd2hpY2gKCSAqIHN0YXJ0cyBhdCB0aGUgbGFzdCBjb21tYSAoZW5kdCkuCgkgKi8KCgl3aGlsZSAoMSkgewoJCXN0cnVjdCBzYW1wbGVfY29udl9leHByICpjb252X2V4cHI7CgoJCWlmICgqZW5kdCA9PSAnKScpIC8qIHNraXAgbGFzdCBjbG9zaW5nIHBhcmVudGhlc2lzICovCgkJCWVuZHQrKzsKCgkJaWYgKCplbmR0ICYmICplbmR0ICE9ICcsJykgewoJCQlpZiAoY2t3KQoJCQkJbWVtcHJpbnRmKGVycl9tc2csICJtaXNzaW5nIGNvbW1hIGFmdGVyIGNvbnYga2V5d29yZCAnJXMnIiwgY2t3KTsKCQkJZWxzZQoJCQkJbWVtcHJpbnRmKGVycl9tc2csICJtaXNzaW5nIGNvbW1hIGFmdGVyIGZldGNoIGtleXdvcmQgJyVzJyIsIGZrdyk7CgkJCWdvdG8gb3V0X2Vycm9yOwoJCX0KCgkJd2hpbGUgKCplbmR0ID09ICcsJykgLyogdGhlbiB0cmFpbGluZyBjb21tYXMgKi8KCQkJZW5kdCsrOwoKCQliZWd3ID0gZW5kdDsgLyogc3RhcnQgb2YgY29udiBrZXl3b3JkICovCgoJCWlmICghKmJlZ3cpIHsKCQkJLyogbm9uZSA/IHNraXAgdG8gbmV4dCBzdHJpbmcgKi8KCQkJKCppZHgpKys7CgkJCWJlZ3cgPSBzdHJbKmlkeF07CgkJCWlmICghYmVndyB8fCAhKmJlZ3cpCgkJCQlicmVhazsKCQl9CgoJCWZvciAoZW5kdyA9IGJlZ3c7ICplbmR3ICYmICplbmR3ICE9ICcoJyAmJiAqZW5kdyAhPSAnLCc7IGVuZHcrKyk7CgoJCWZyZWUoY2t3KTsKCQlja3cgPSBteV9zdHJuZHVwKGJlZ3csIGVuZHcgLSBiZWd3KTsKCgkJY29udiA9IGZpbmRfc2FtcGxlX2NvbnYoYmVndywgZW5kdyAtIGJlZ3cpOwoJCWlmICghY29udikgewoJCQkvKiB3ZSBmb3VuZCBhbiBpc29sYXRlZCBrZXl3b3JkIHRoYXQgd2UgZG9uJ3Qga25vdywgaXQncyBub3Qgb3VycyAqLwoJCQlpZiAoYmVndyA9PSBzdHJbKmlkeF0pCgkJCQlicmVhazsKCQkJbWVtcHJpbnRmKGVycl9tc2csICJ1bmtub3duIGNvbnYgbWV0aG9kICclcyciLCBja3cpOwoJCQlnb3RvIG91dF9lcnJvcjsKCQl9CgoJCWVuZHQgPSBlbmR3OwoJCWlmICgqZW5kdCA9PSAnKCcpIHsKCQkJLyogbG9vayBmb3IgdGhlIGVuZCBvZiB0aGlzIHRlcm0gKi8KCQkJd2hpbGUgKCplbmR0ICYmICplbmR0ICE9ICcpJykKCQkJCWVuZHQrKzsKCQkJaWYgKCplbmR0ICE9ICcpJykgewoJCQkJbWVtcHJpbnRmKGVycl9tc2csICJzeW50YXggZXJyb3I6IG1pc3NpbmcgJyknIGFmdGVyIGNvbnYga2V5d29yZCAnJXMnIiwgY2t3KTsKCQkJCWdvdG8gb3V0X2Vycm9yOwoJCQl9CgkJfQoKCQlpZiAoY29udi0+aW5fdHlwZSA+PSBTTVBfVFlQRVMgfHwgY29udi0+b3V0X3R5cGUgPj0gU01QX1RZUEVTKSB7CgkJCW1lbXByaW50ZihlcnJfbXNnLCAicmV0dXJucyB0eXBlIG9mIGNvbnYgbWV0aG9kICclcycgaXMgdW5rbm93biIsIGNrdyk7CgkJCWdvdG8gb3V0X2Vycm9yOwoJCX0KCgkJLyogSWYgaW1wb3NzaWJsZSB0eXBlIGNvbnZlcnNpb24gKi8KCQlpZiAoIXNhbXBsZV9jYXN0c1twcmV2X3R5cGVdW2NvbnYtPmluX3R5cGVdKSB7CgkJCW1lbXByaW50ZihlcnJfbXNnLCAiY29udiBtZXRob2QgJyVzJyBjYW5ub3QgYmUgYXBwbGllZCIsIGNrdyk7CgkJCWdvdG8gb3V0X2Vycm9yOwoJCX0KCgkJcHJldl90eXBlID0gY29udi0+b3V0X3R5cGU7CgkJY29udl9leHByID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgc2FtcGxlX2NvbnZfZXhwcikpOwoJCWlmICghY29udl9leHByKQoJCQlnb3RvIG91dF9lcnJvcjsKCgkJTElTVF9BRERRKCYoZXhwci0+Y29udl9leHBycyksICYoY29udl9leHByLT5saXN0KSk7CgkJY29udl9leHByLT5jb252ID0gY29udjsKCgkJaWYgKGVuZHQgIT0gZW5kdykgewoJCQlpbnQgZXJyX2FyZzsKCgkJCWlmICghY29udi0+YXJnX21hc2spIHsKCQkJCW1lbXByaW50ZihlcnJfbXNnLCAiY29udiBtZXRob2QgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGFueSBhcmdzIiwgY2t3KTsKCQkJCWdvdG8gb3V0X2Vycm9yOwoJCQl9CgoJCQlhbC0+a3cgPSBleHByLT5mZXRjaC0+a3c7CgkJCWFsLT5jb252ID0gY29udl9leHByLT5jb252LT5rdzsKCQkJaWYgKG1ha2VfYXJnX2xpc3QoZW5kdyArIDEsIGVuZHQgLSBlbmR3IC0gMSwgY29udi0+YXJnX21hc2ssICZjb252X2V4cHItPmFyZ19wLCBlcnJfbXNnLCBOVUxMLCAmZXJyX2FyZywgYWwpIDwgMCkgewoJCQkJbWVtcHJpbnRmKGVycl9tc2csICJpbnZhbGlkIGFyZyAlZCBpbiBjb252IG1ldGhvZCAnJXMnIDogJXMiLCBlcnJfYXJnKzEsIGNrdywgKmVycl9tc2cpOwoJCQkJZ290byBvdXRfZXJyb3I7CgkJCX0KCgkJCWlmICghY29udl9leHByLT5hcmdfcCkKCQkJCWNvbnZfZXhwci0+YXJnX3AgPSBlbXB0eV9hcmdfbGlzdDsKCgkJCWlmIChjb252LT52YWxfYXJncyAmJiAhY29udi0+dmFsX2FyZ3MoY29udl9leHByLT5hcmdfcCwgY29udiwgZmlsZSwgbGluZSwgZXJyX21zZykpIHsKCQkJCW1lbXByaW50ZihlcnJfbXNnLCAiaW52YWxpZCBhcmdzIGluIGNvbnYgbWV0aG9kICclcycgOiAlcyIsIGNrdywgKmVycl9tc2cpOwoJCQkJZ290byBvdXRfZXJyb3I7CgkJCX0KCQl9CgkJZWxzZSBpZiAoQVJHTShjb252LT5hcmdfbWFzaykpIHsKCQkJbWVtcHJpbnRmKGVycl9tc2csICJtaXNzaW5nIGFyZ3MgZm9yIGNvbnYgbWV0aG9kICclcyciLCBja3cpOwoJCQlnb3RvIG91dF9lcnJvcjsKCQl9Cgl9Cgogb3V0OgoJZnJlZShma3cpOwoJZnJlZShja3cpOwoJcmV0dXJuIGV4cHI7CgpvdXRfZXJyb3I6CgkvKiBUT0RPOiBwcnVuZV9zYW1wbGVfZXhwcihleHByKTsgKi8KCWV4cHIgPSBOVUxMOwoJZ290byBvdXQ7Cn0KCi8qCiAqIFByb2Nlc3MgYSBmZXRjaCArIGZvcm1hdCBjb252ZXJzaW9uIG9mIGRlZmluZWQgYnkgdGhlIHNhbXBsZSBleHByZXNzaW9uIDxleHByPgogKiBvbiByZXF1ZXN0IG9yIHJlc3BvbnNlIGNvbnNpZGVyaW5nIHRoZSA8b3B0PiBwYXJhbWV0ZXIuCiAqIFJldHVybnMgYSBwb2ludGVyIG9uIGEgdHlwZWQgc2FtcGxlIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSByZXN1bHQgb3IgTlVMTCBpZgogKiBzYW1wbGUgaXMgbm90IGZvdW5kIG9yIHdoZW4gZm9ybWF0IGNvbnZlcnNpb24gZmFpbGVkLgogKiAgSWYgPHA+IGlzIG5vdCBudWxsLCBmdW5jdGlvbiByZXR1cm5zIHJlc3VsdHMgaW4gc3RydWN0dXJlIHBvaW50ZWQgYnkgPHA+LgogKiAgSWYgPHA+IGlzIG51bGwsIGZ1bmN0aW9ucyByZXR1cm5zIGEgcG9pbnRlciBvbiBhIHN0YXRpYyBzYW1wbGUgc3RydWN0dXJlLgogKgogKiBOb3RlOiB0aGUgZmV0Y2ggZnVuY3Rpb25zIGFyZSByZXF1aXJlZCB0byBwcm9wZXJseSBzZXQgdGhlIHJldHVybiB0eXBlLiBUaGUKICogY29udmVyc2lvbiBmdW5jdGlvbnMgbXVzdCBkbyBzbyB0b28uIEhvd2V2ZXIgdGhlIGNhc3QgZnVuY3Rpb25zIGRvIG5vdCBuZWVkCiAqIHRvIHNpbmNlIHRoZXkncmUgbWFkZSB0byBjYXN0IG11dGlwbGUgdHlwZXMgYWNjb3JkaW5nIHRvIHdoYXQgaXMgcmVxdWlyZWQuCiAqCiAqIFRoZSBjYWxsZXIgbWF5IGluZGljYXRlIGluIDxvcHQ+IGlmIGl0IGNvbnNpZGVycyB0aGUgcmVzdWx0IGZpbmFsIG9yIG5vdC4KICogVGhlIGNhbGxlciBuZWVkcyB0byBjaGVjayB0aGUgU01QX0ZfTUFZX0NIQU5HRSBmbGFnIGluIHAtPmZsYWdzIHRvIHZlcmlmeQogKiBpZiB0aGUgcmVzdWx0IGlzIHN0YWJsZSBvciBub3QsIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHRhYmxlIDoKICoKICogcmV0dXJuIE1BWV9DSEFOR0UgRklOQUwgICBNZWFuaW5nIGZvciB0aGUgc2FtcGxlCiAqICBOVUxMICAgICAgMCAgICAgICAgKiAgICAgTm90IHByZXNlbnQgYW5kIHdpbGwgbmV2ZXIgYmUgKGVnOiBoZWFkZXIpCiAqICBOVUxMICAgICAgMSAgICAgICAgMCAgICAgTm90IHByZXNlbnQgeWV0LCBjb3VsZCBjaGFuZ2UgKGVnOiBQT1NUIHBhcmFtKQogKiAgTlVMTCAgICAgIDEgICAgICAgIDEgICAgIE5vdCBwcmVzZW50IHlldCwgd2lsbCBub3QgY2hhbmdlIGFueW1vcmUKICogICBzbXAgICAgICAwICAgICAgICAqICAgICBQcmVzZW50IGFuZCB3aWxsIG5vdCBjaGFuZ2UgKGVnOiBoZWFkZXIpCiAqICAgc21wICAgICAgMSAgICAgICAgMCAgICAgUHJlc2VudCwgbWF5IGNoYW5nZSAoZWc6IHJlcXVlc3QgbGVuZ3RoKQogKiAgIHNtcCAgICAgIDEgICAgICAgIDEgICAgIFByZXNlbnQsIGxhc3Qga25vd24gdmFsdWUgKGVnOiByZXF1ZXN0IGxlbmd0aCkKICovCnN0cnVjdCBzYW1wbGUgKnNhbXBsZV9wcm9jZXNzKHN0cnVjdCBwcm94eSAqcHgsIHN0cnVjdCBzdHJlYW0gKmw0LCB2b2lkICpsNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9wdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZV9leHByICpleHByLCBzdHJ1Y3Qgc2FtcGxlICpwKQp7CglzdHJ1Y3Qgc2FtcGxlX2NvbnZfZXhwciAqY29udl9leHByOwoKCWlmIChwID09IE5VTEwpIHsKCQlwID0gJnRlbXBfc21wOwoJCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKCX0KCglpZiAoIWV4cHItPmZldGNoLT5wcm9jZXNzKHB4LCBsNCwgbDcsIG9wdCwgZXhwci0+YXJnX3AsIHAsIGV4cHItPmZldGNoLT5rdywgZXhwci0+ZmV0Y2gtPnByaXZhdGUpKQoJCXJldHVybiBOVUxMOwoKCWxpc3RfZm9yX2VhY2hfZW50cnkoY29udl9leHByLCAmZXhwci0+Y29udl9leHBycywgbGlzdCkgewoJCS8qIHdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgcC0+dHlwZSBjYW4gYmUgY2FzdGVkIGludG8KCQkgKiBjb252X2V4cHItPmNvbnYtPmluX3R5cGUuIFdlIGhhdmUgMyBwb3NzaWJpbGl0aWVzIDoKCQkgKiAgLSBOVUxMICAgPT4gbm90IGNhc3RhYmxlLgoJCSAqICAtIGNfbm9uZSA9PiBub3RoaW5nIHRvIGRvIChsZXQncyBvcHRpbWl6ZSBpdCkKCQkgKiAgLSBvdGhlciAgPT4gYXBwbHkgY2FzdCBhbmQgcHJlcGFyZSB0byBmYWlsCgkJICovCgkJaWYgKCFzYW1wbGVfY2FzdHNbcC0+dHlwZV1bY29udl9leHByLT5jb252LT5pbl90eXBlXSkKCQkJcmV0dXJuIE5VTEw7CgoJCWlmIChzYW1wbGVfY2FzdHNbcC0+dHlwZV1bY29udl9leHByLT5jb252LT5pbl90eXBlXSAhPSBjX25vbmUgJiYKCQkgICAgIXNhbXBsZV9jYXN0c1twLT50eXBlXVtjb252X2V4cHItPmNvbnYtPmluX3R5cGVdKHApKQoJCQlyZXR1cm4gTlVMTDsKCgkJLyogT0sgY2FzdCBzdWNjZWVkZWQgKi8KCgkJaWYgKCFjb252X2V4cHItPmNvbnYtPnByb2Nlc3MobDQsIGNvbnZfZXhwci0+YXJnX3AsIHAsIGNvbnZfZXhwci0+Y29udi0+cHJpdmF0ZSkpCgkJCXJldHVybiBOVUxMOwoJfQoJcmV0dXJuIHA7Cn0KCi8qCiAqIFJlc29sdmUgYWxsIHJlbWFpbmluZyBhcmd1bWVudHMgaW4gcHJveHkgPHA+LiBSZXR1cm5zIHRoZSBudW1iZXIgb2YKICogZXJyb3JzIG9yIDAgaWYgZXZlcnl0aGluZyBpcyBmaW5lLgogKi8KaW50IHNtcF9yZXNvbHZlX2FyZ3Moc3RydWN0IHByb3h5ICpwKQp7CglzdHJ1Y3QgYXJnX2xpc3QgKmN1ciwgKmJhazsKCWNvbnN0IGNoYXIgKmN0eCwgKndoZXJlOwoJY29uc3QgY2hhciAqY29udl9jdHgsICpjb252X3ByZSwgKmNvbnZfcG9zOwoJc3RydWN0IHVzZXJsaXN0ICp1bDsKCXN0cnVjdCBteV9yZWdleCAqcmVnOwoJc3RydWN0IGFyZyAqYXJnOwoJaW50IGNmZ2VyciA9IDA7CglpbnQgcmZsYWdzOwoKCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjdXIsIGJhaywgJnAtPmNvbmYuYXJncy5saXN0LCBsaXN0KSB7CgkJc3RydWN0IHByb3h5ICpweDsKCQlzdHJ1Y3Qgc2VydmVyICpzcnY7CgkJY2hhciAqcG5hbWUsICpzbmFtZTsKCQljaGFyICplcnI7CgoJCWFyZyA9IGN1ci0+YXJnOwoKCQkvKiBwcmVwYXJlIG91dHB1dCBtZXNzYWdlcyAqLwoJCWNvbnZfcHJlID0gY29udl9wb3MgPSBjb252X2N0eCA9ICIiOwoJCWlmIChjdXItPmNvbnYpIHsKCQkJY29udl9jdHggPSBjdXItPmNvbnY7CgkJCWNvbnZfcHJlID0gImNvbnZlcnNpb24ga2V5d29yZCAnIjsKCQkJY29udl9wb3MgPSAiJyBmb3IgIjsKCQl9CgoJCXdoZXJlID0gImluIjsKCQljdHggPSAic2FtcGxlIGZldGNoIGtleXdvcmQiOwoJCXN3aXRjaCAoY3VyLT5jdHgpIHsKCQljYXNlIEFSR0NfU1RLOiB3aGVyZSA9ICJpbiBzdGljayBydWxlIGluIjsgYnJlYWs7CgkJY2FzZSBBUkdDX1RSSzogd2hlcmUgPSAiaW4gdHJhY2tpbmcgcnVsZSBpbiI7IGJyZWFrOwoJCWNhc2UgQVJHQ19MT0c6IHdoZXJlID0gImluIGxvZy1mb3JtYXQgc3RyaW5nIGluIjsgYnJlYWs7CgkJY2FzZSBBUkdDX0hSUTogd2hlcmUgPSAiaW4gaHR0cC1yZXF1ZXN0IGhlYWRlciBmb3JtYXQgc3RyaW5nIGluIjsgYnJlYWs7CgkJY2FzZSBBUkdDX0hSUzogd2hlcmUgPSAiaW4gaHR0cC1yZXNwb25zZSBoZWFkZXIgZm9ybWF0IHN0cmluZyBpbiI7IGJyZWFrOwoJCWNhc2UgQVJHQ19VSUY6IHdoZXJlID0gImluIHVuaXF1ZS1pZC1mb3JtYXQgc3RyaW5nIGluIjsgYnJlYWs7CgkJY2FzZSBBUkdDX1JEUjogd2hlcmUgPSAiaW4gcmVkaXJlY3QgZm9ybWF0IHN0cmluZyBpbiI7IGJyZWFrOwoJCWNhc2UgQVJHQ19DQVA6IHdoZXJlID0gImluIGNhcHR1cmUgcnVsZSBpbiI7IGJyZWFrOwoJCWNhc2UgQVJHQ19BQ0w6IGN0eCA9ICJBQ0wga2V5d29yZCI7IGJyZWFrOwoJCX0KCgkJLyogc2V0IGEgZmV3IGRlZmF1bHQgc2V0dGluZ3MgKi8KCQlweCA9IHA7CgkJcG5hbWUgPSBwLT5pZDsKCgkJc3dpdGNoIChhcmctPnR5cGUpIHsKCQljYXNlIEFSR1RfU1JWOgoJCQlpZiAoIWFyZy0+ZGF0YS5zdHIubGVuKSB7CgkJCQlBbGVydCgicGFyc2luZyBbJXM6JWRdIDogbWlzc2luZyBzZXJ2ZXIgbmFtZSBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLAoJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQpOwoJCQkJY2ZnZXJyKys7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLyogd2Ugc3VwcG9ydCB0d28gZm9ybWF0cyA6ICJiY2svc3J2IiBhbmQgInNydiIgKi8KCQkJc25hbWUgPSBzdHJyY2hyKGFyZy0+ZGF0YS5zdHIuc3RyLCAnLycpOwoKCQkJaWYgKHNuYW1lKSB7CgkJCQkqc25hbWUrKyA9ICdcMCc7CgkJCQlwbmFtZSA9IGFyZy0+ZGF0YS5zdHIuc3RyOwoKCQkJCXB4ID0gZmluZHByb3h5KHBuYW1lLCBQUl9DQVBfQkUpOwoJCQkJaWYgKCFweCkgewoJCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiB1bmFibGUgdG8gZmluZCBwcm94eSAnJXMnIHJlZmVyZW5jZWQgaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJy5cbiIsCgkJCQkJICAgICAgY3VyLT5maWxlLCBjdXItPmxpbmUsIHBuYW1lLAoJCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCQljZmdlcnIrKzsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCQlzbmFtZSA9IGFyZy0+ZGF0YS5zdHIuc3RyOwoKCQkJc3J2ID0gZmluZHNlcnZlcihweCwgc25hbWUpOwoJCQlpZiAoIXNydikgewoJCQkJQWxlcnQoInBhcnNpbmcgWyVzOiVkXSA6IHVuYWJsZSB0byBmaW5kIHNlcnZlciAnJXMnIGluIHByb3h5ICclcycsIHJlZmVyZW5jZWQgaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJy5cbiIsCgkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwgc25hbWUsIHBuYW1lLAoJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQpOwoJCQkJY2ZnZXJyKys7CgkJCQlicmVhazsKCQkJfQoKCQkJZnJlZShhcmctPmRhdGEuc3RyLnN0cik7CgkJCWFyZy0+ZGF0YS5zdHIuc3RyID0gTlVMTDsKCQkJYXJnLT51bnJlc29sdmVkID0gMDsKCQkJYXJnLT5kYXRhLnNydiA9IHNydjsKCQkJYnJlYWs7CgoJCWNhc2UgQVJHVF9GRToKCQkJaWYgKGFyZy0+ZGF0YS5zdHIubGVuKSB7CgkJCQlwbmFtZSA9IGFyZy0+ZGF0YS5zdHIuc3RyOwoJCQkJcHggPSBmaW5kcHJveHkocG5hbWUsIFBSX0NBUF9GRSk7CgkJCX0KCgkJCWlmICghcHgpIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiB1bmFibGUgdG8gZmluZCBmcm9udGVuZCAnJXMnIHJlZmVyZW5jZWQgaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJy5cbiIsCgkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwgcG5hbWUsCgkJCQkgICAgICBjdXItPmFyZ19wb3MgKyAxLCBjb252X3ByZSwgY29udl9jdHgsIGNvbnZfcG9zLCBjdHgsIGN1ci0+a3csIHdoZXJlLCBwLT5pZCk7CgkJCQljZmdlcnIrKzsKCQkJCWJyZWFrOwoJCQl9CgoJCQlpZiAoIShweC0+Y2FwICYgUFJfQ0FQX0ZFKSkgewoJCQkJQWxlcnQoInBhcnNpbmcgWyVzOiVkXSA6IHByb3h5ICclcycsIHJlZmVyZW5jZWQgaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJywgaGFzIG5vdCBmcm9udGVuZCBjYXBhYmlsaXR5LlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLCBwbmFtZSwKCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCWNmZ2VycisrOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWZyZWUoYXJnLT5kYXRhLnN0ci5zdHIpOwoJCQlhcmctPmRhdGEuc3RyLnN0ciA9IE5VTEw7CgkJCWFyZy0+dW5yZXNvbHZlZCA9IDA7CgkJCWFyZy0+ZGF0YS5wcnggPSBweDsKCQkJYnJlYWs7CgoJCWNhc2UgQVJHVF9CRToKCQkJaWYgKGFyZy0+ZGF0YS5zdHIubGVuKSB7CgkJCQlwbmFtZSA9IGFyZy0+ZGF0YS5zdHIuc3RyOwoJCQkJcHggPSBmaW5kcHJveHkocG5hbWUsIFBSX0NBUF9CRSk7CgkJCX0KCgkJCWlmICghcHgpIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiB1bmFibGUgdG8gZmluZCBiYWNrZW5kICclcycgcmVmZXJlbmNlZCBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLCBwbmFtZSwKCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCWNmZ2VycisrOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWlmICghKHB4LT5jYXAgJiBQUl9DQVBfQkUpKSB7CgkJCQlBbGVydCgicGFyc2luZyBbJXM6JWRdIDogcHJveHkgJyVzJywgcmVmZXJlbmNlZCBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLCBoYXMgbm90IGJhY2tlbmQgY2FwYWJpbGl0eS5cbiIsCgkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwgcG5hbWUsCgkJCQkgICAgICBjdXItPmFyZ19wb3MgKyAxLCBjb252X3ByZSwgY29udl9jdHgsIGNvbnZfcG9zLCBjdHgsIGN1ci0+a3csIHdoZXJlLCBwLT5pZCk7CgkJCQljZmdlcnIrKzsKCQkJCWJyZWFrOwoJCQl9CgoJCQlmcmVlKGFyZy0+ZGF0YS5zdHIuc3RyKTsKCQkJYXJnLT5kYXRhLnN0ci5zdHIgPSBOVUxMOwoJCQlhcmctPnVucmVzb2x2ZWQgPSAwOwoJCQlhcmctPmRhdGEucHJ4ID0gcHg7CgkJCWJyZWFrOwoKCQljYXNlIEFSR1RfVEFCOgoJCQlpZiAoYXJnLT5kYXRhLnN0ci5sZW4pIHsKCQkJCXBuYW1lID0gYXJnLT5kYXRhLnN0ci5zdHI7CgkJCQlweCA9IGZpbmRfc3RrdGFibGUocG5hbWUpOwoJCQl9CgoJCQlpZiAoIXB4KSB7CgkJCQlBbGVydCgicGFyc2luZyBbJXM6JWRdIDogdW5hYmxlIHRvIGZpbmQgdGFibGUgJyVzJyByZWZlcmVuY2VkIGluIGFyZyAlZCBvZiAlcyVzJXMlcyAnJXMnICVzIHByb3h5ICclcycuXG4iLAoJCQkJICAgICAgY3VyLT5maWxlLCBjdXItPmxpbmUsIHBuYW1lLAoJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQpOwoJCQkJY2ZnZXJyKys7CgkJCQlicmVhazsKCQkJfQoKCQkJaWYgKCFweC0+dGFibGUuc2l6ZSkgewoJCQkJQWxlcnQoInBhcnNpbmcgWyVzOiVkXSA6IG5vIHRhYmxlIGluIHByb3h5ICclcycgcmVmZXJlbmNlZCBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLCBwbmFtZSwKCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCWNmZ2VycisrOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWZyZWUoYXJnLT5kYXRhLnN0ci5zdHIpOwoJCQlhcmctPmRhdGEuc3RyLnN0ciA9IE5VTEw7CgkJCWFyZy0+dW5yZXNvbHZlZCA9IDA7CgkJCWFyZy0+ZGF0YS5wcnggPSBweDsKCQkJYnJlYWs7CgoJCWNhc2UgQVJHVF9VU1I6CgkJCWlmICghYXJnLT5kYXRhLnN0ci5sZW4pIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiBtaXNzaW5nIHVzZXJsaXN0IG5hbWUgaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJy5cbiIsCgkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwKCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCWNmZ2VycisrOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWlmIChwLT51cmlfYXV0aCAmJiBwLT51cmlfYXV0aC0+dXNlcmxpc3QgJiYKCQkJICAgICFzdHJjbXAocC0+dXJpX2F1dGgtPnVzZXJsaXN0LT5uYW1lLCBhcmctPmRhdGEuc3RyLnN0cikpCgkJCQl1bCA9IHAtPnVyaV9hdXRoLT51c2VybGlzdDsKCQkJZWxzZQoJCQkJdWwgPSBhdXRoX2ZpbmRfdXNlcmxpc3QoYXJnLT5kYXRhLnN0ci5zdHIpOwoKCQkJaWYgKCF1bCkgewoJCQkJQWxlcnQoInBhcnNpbmcgWyVzOiVkXSA6IHVuYWJsZSB0byBmaW5kIHVzZXJsaXN0ICclcycgcmVmZXJlbmNlZCBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLCBhcmctPmRhdGEuc3RyLnN0ciwKCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCWNmZ2VycisrOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWZyZWUoYXJnLT5kYXRhLnN0ci5zdHIpOwoJCQlhcmctPmRhdGEuc3RyLnN0ciA9IE5VTEw7CgkJCWFyZy0+dW5yZXNvbHZlZCA9IDA7CgkJCWFyZy0+ZGF0YS51c3IgPSB1bDsKCQkJYnJlYWs7CgoJCWNhc2UgQVJHVF9SRUc6CgkJCWlmICghYXJnLT5kYXRhLnN0ci5sZW4pIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiBtaXNzaW5nIHJlZ2V4IGluIGFyZyAlZCBvZiAlcyVzJXMlcyAnJXMnICVzIHByb3h5ICclcycuXG4iLAoJCQkJICAgICAgY3VyLT5maWxlLCBjdXItPmxpbmUsCgkJCQkgICAgICBjdXItPmFyZ19wb3MgKyAxLCBjb252X3ByZSwgY29udl9jdHgsIGNvbnZfcG9zLCBjdHgsIGN1ci0+a3csIHdoZXJlLCBwLT5pZCk7CgkJCQljZmdlcnIrKzsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlyZWcgPSBjYWxsb2MoMSwgc2l6ZW9mKCpyZWcpKTsKCQkJaWYgKCFyZWcpIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiBub3QgZW5vdWdoIG1lbW9yeSB0byBidWlsZCByZWdleCBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLAoJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQpOwoJCQkJY2ZnZXJyKys7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJcmZsYWdzID0gMDsKCQkJcmZsYWdzIHw9IChhcmctPnR5cGVfZmxhZ3MgJiBBUkdGX1JFR19JQ0FTRSkgPyBSRUdfSUNBU0UgOiAwOwoJCQllcnIgPSBOVUxMOwoKCQkJaWYgKCFyZWdleF9jb21wKGFyZy0+ZGF0YS5zdHIuc3RyLCByZWcsICEocmZsYWdzICYgUkVHX0lDQVNFKSwgMSAvKiBjYXB0dXJlIHN1YnN0ciAqLywgJmVycikpIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiBlcnJvciBpbiByZWdleCAnJXMnIGluIGFyZyAlZCBvZiAlcyVzJXMlcyAnJXMnICVzIHByb3h5ICclcycgOiAlcy5cbiIsCgkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwKCQkJCSAgICAgIGFyZy0+ZGF0YS5zdHIuc3RyLAoJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQsIGVycik7CgkJCQljZmdlcnIrKzsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlmcmVlKGFyZy0+ZGF0YS5zdHIuc3RyKTsKCQkJYXJnLT5kYXRhLnN0ci5zdHIgPSBOVUxMOwoJCQlhcmctPnVucmVzb2x2ZWQgPSAwOwoJCQlhcmctPmRhdGEucmVnID0gcmVnOwoJCQlicmVhazsKCgoJCX0KCgkJTElTVF9ERUwoJmN1ci0+bGlzdCk7CgkJZnJlZShjdXIpOwoJfSAvKiBlbmQgb2YgYXJncyBwcm9jZXNzaW5nICovCgoJcmV0dXJuIGNmZ2VycjsKfQoKLyoKICogUHJvY2VzcyBhIGZldGNoICsgZm9ybWF0IGNvbnZlcnNpb24gYXMgZGVmaW5lZCBieSB0aGUgc2FtcGxlIGV4cHJlc3Npb24KICogPGV4cHI+IG9uIHJlcXVlc3Qgb3IgcmVzcG9uc2UgY29uc2lkZXJpbmcgdGhlIDxvcHQ+IHBhcmFtZXRlci4gVGhlIG91dHB1dCBpcwogKiBhbHdheXMgb2YgdHlwZSBzdHJpbmcuIElmIGEgc3RhYmxlIHNhbXBsZSBjYW4gYmUgZmV0Y2hlZCwgb3IgYW4gdW5zdGFibGUgb25lCiAqIHdoZW4gPG9wdD4gY29udGFpbnMgU01QX09QVF9GSU5BTCwgdGhlIHNhbXBsZSBpcyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgYW5kCiAqIHJldHVybmVkIHdpdGhvdXQgdGhlIFNNUF9GX01BWV9DSEFOR0UgZmxhZy4gSWYgYW4gdW5zdGFibGUgc2FtcGxlIGlzIGZvdW5kCiAqIGFuZCA8b3B0PiBkb2VzIG5vdCBjb250YWluIFNNUF9PUFRfRklOQUwsIHRoZW4gdGhlIHNhbXBsZSBpcyByZXR1cm5lZCBhcy1pcwogKiB3aXRoIGl0cyBTTVBfRl9NQVlfQ0hBTkdFIGZsYWcgc28gdGhhdCB0aGUgY2FsbGVyIGNhbiBjaGVjayBpdCBhbmQgZGVjaWRlIHRvCiAqIHRha2UgYWN0aW9ucyAoZWc6IHdhaXQgbG9uZ2VyKS4gSWYgYSBzYW1wbGUgY291bGQgbm90IGJlIGZvdW5kIG9yIGNvdWxkIG5vdAogKiBiZSBjb252ZXJ0ZWQsIE5VTEwgaXMgcmV0dXJuZWQuIFRoZSBjYWxsZXIgTVVTVCBOT1QgdXNlIHRoZSBzYW1wbGUgaWYgdGhlCiAqIFNNUF9GX01BWV9DSEFOR0UgZmxhZyBpcyBwcmVzZW50LCBhcyBpdCBpcyB1c2VkIG9ubHkgYXMgYSBoaW50IHRoYXQgdGhlcmUgaXMKICogc3RpbGwgaG9wZSB0byBnZXQgaXQgYWZ0ZXIgd2FpdGluZyBsb25nZXIsIGFuZCBpcyBub3QgY29udmVydGVkIHRvIHN0cmluZy4KICogVGhlIHBvc3NpYmxlIG91dHB1dCBjb21iaW5hdGlvbnMgYXJlIHRoZSBmb2xsb3dpbmcgOgogKgogKiByZXR1cm4gTUFZX0NIQU5HRSBGSU5BTCAgIE1lYW5pbmcgZm9yIHRoZSBzYW1wbGUKICogIE5VTEwgICAgICAqICAgICAgICAqICAgICBOb3QgcHJlc2VudCBhbmQgd2lsbCBuZXZlciBiZSAoZWc6IGhlYWRlcikKICogICBzbXAgICAgICAwICAgICAgICAqICAgICBGaW5hbCB2YWx1ZSBjb252ZXJ0ZWQgKGVnOiBoZWFkZXIpCiAqICAgc21wICAgICAgMSAgICAgICAgMCAgICAgTm90IHByZXNlbnQgeWV0LCBtYXkgYXBwZWFyIGxhdGVyIChlZzogaGVhZGVyKQogKiAgIHNtcCAgICAgIDEgICAgICAgIDEgICAgIG5ldmVyIGhhcHBlbnMgKGVpdGhlciBmbGFnIGlzIGNsZWFyZWQgb24gb3V0cHV0KQogKi8Kc3RydWN0IHNhbXBsZSAqc2FtcGxlX2ZldGNoX3N0cmluZyhzdHJ1Y3QgcHJveHkgKnB4LCBzdHJ1Y3Qgc3RyZWFtICpsNCwgdm9pZCAqbDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9wdCwgc3RydWN0IHNhbXBsZV9leHByICpleHByKQp7CglzdHJ1Y3Qgc2FtcGxlICpzbXAgPSAmdGVtcF9zbXA7CgoJbWVtc2V0KHNtcCwgMCwgc2l6ZW9mKCpzbXApKTsKCglpZiAoIXNhbXBsZV9wcm9jZXNzKHB4LCBsNCwgbDcsIG9wdCwgZXhwciwgc21wKSkgewoJCWlmICgoc21wLT5mbGFncyAmIFNNUF9GX01BWV9DSEFOR0UpICYmICEob3B0ICYgU01QX09QVF9GSU5BTCkpCgkJCXJldHVybiBzbXA7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJaWYgKCFzYW1wbGVfY2FzdHNbc21wLT50eXBlXVtTTVBfVF9TVFJdKQoJCXJldHVybiBOVUxMOwoKCWlmICghc2FtcGxlX2Nhc3RzW3NtcC0+dHlwZV1bU01QX1RfU1RSXShzbXApKQoJCXJldHVybiBOVUxMOwoKCXNtcC0+dHlwZSA9IFNNUF9UX1NUUjsKCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX01BWV9DSEFOR0U7CglyZXR1cm4gc21wOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgIFNhbXBsZSBmb3JtYXQgY29udmVydCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgVGhlc2UgZnVuY3Rpb25zIHNldCB0aGUgZGF0YSB0eXBlIG9uIHJldHVybi4gICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgaW50IHNhbXBsZV9jb252X2JpbjJiYXNlNjQoc3RydWN0IHN0cmVhbSAqc3RyZWFtLCBjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc3RydWN0IGNodW5rICp0cmFzaCA9IGdldF90cmFzaF9jaHVuaygpOwoJaW50IGI2NF9sZW47CgoJdHJhc2gtPmxlbiA9IDA7CgliNjRfbGVuID0gYTJiYXNlNjQoc21wLT5kYXRhLnN0ci5zdHIsIHNtcC0+ZGF0YS5zdHIubGVuLCB0cmFzaC0+c3RyLCB0cmFzaC0+c2l6ZSk7CglpZiAoYjY0X2xlbiA8IDApCgkJcmV0dXJuIDA7CgoJdHJhc2gtPmxlbiA9IGI2NF9sZW47CglzbXAtPmRhdGEuc3RyID0gKnRyYXNoOwoJc21wLT50eXBlID0gU01QX1RfU1RSOwoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBzYW1wbGVfY29udl9iaW4yaGV4KHN0cnVjdCBzdHJlYW0gKnN0cmVhbSwgY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXN0cnVjdCBjaHVuayAqdHJhc2ggPSBnZXRfdHJhc2hfY2h1bmsoKTsKCXVuc2lnbmVkIGNoYXIgYzsKCWludCBwdHIgPSAwOwoKCXRyYXNoLT5sZW4gPSAwOwoJd2hpbGUgKHB0ciA8IHNtcC0+ZGF0YS5zdHIubGVuICYmIHRyYXNoLT5sZW4gPD0gdHJhc2gtPnNpemUgLSAyKSB7CgkJYyA9IHNtcC0+ZGF0YS5zdHIuc3RyW3B0cisrXTsKCQl0cmFzaC0+c3RyW3RyYXNoLT5sZW4rK10gPSBoZXh0YWJbKGMgPj4gNCkgJiAweEZdOwoJCXRyYXNoLT5zdHJbdHJhc2gtPmxlbisrXSA9IGhleHRhYltjICYgMHhGXTsKCX0KCXNtcC0+ZGF0YS5zdHIgPSAqdHJhc2g7CglzbXAtPnR5cGUgPSBTTVBfVF9TVFI7CglzbXAtPmZsYWdzICY9IH5TTVBfRl9DT05TVDsKCXJldHVybiAxOwp9CgovKiBoYXNoZXMgdGhlIGJpbmFyeSBpbnB1dCBpbnRvIGEgMzItYml0IHVuc2lnbmVkIGludCAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2RqYjIoc3RydWN0IHN0cmVhbSAqc3RyZWFtLCBjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgPSBoYXNoX2RqYjIoc21wLT5kYXRhLnN0ci5zdHIsIHNtcC0+ZGF0YS5zdHIubGVuKTsKCWlmIChhcmdfcCAmJiBhcmdfcC0+ZGF0YS51aW50KQoJCXNtcC0+ZGF0YS51aW50ID0gZnVsbF9oYXNoKHNtcC0+ZGF0YS51aW50KTsKCXNtcC0+dHlwZSA9IFNNUF9UX1VJTlQ7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBzYW1wbGVfY29udl9zdHIybG93ZXIoc3RydWN0IHN0cmVhbSAqc3RyZWFtLCBjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglpbnQgaTsKCglpZiAoIXNtcF9kdXAoc21wKSkKCQlyZXR1cm4gMDsKCglpZiAoIXNtcC0+ZGF0YS5zdHIuc2l6ZSkKCQlyZXR1cm4gMDsKCglmb3IgKGkgPSAwOyBpIDwgc21wLT5kYXRhLnN0ci5sZW47IGkrKykgewoJCWlmICgoc21wLT5kYXRhLnN0ci5zdHJbaV0gPj0gJ0EnKSAmJiAoc21wLT5kYXRhLnN0ci5zdHJbaV0gPD0gJ1onKSkKCQkJc21wLT5kYXRhLnN0ci5zdHJbaV0gKz0gJ2EnIC0gJ0EnOwoJfQoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfc3RyMnVwcGVyKHN0cnVjdCBzdHJlYW0gKnN0cmVhbSwgY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJaW50IGk7CgoJaWYgKCFzbXBfZHVwKHNtcCkpCgkJcmV0dXJuIDA7CgoJaWYgKCFzbXAtPmRhdGEuc3RyLnNpemUpCgkJcmV0dXJuIDA7CgoJZm9yIChpID0gMDsgaSA8IHNtcC0+ZGF0YS5zdHIubGVuOyBpKyspIHsKCQlpZiAoKHNtcC0+ZGF0YS5zdHIuc3RyW2ldID49ICdhJykgJiYgKHNtcC0+ZGF0YS5zdHIuc3RyW2ldIDw9ICd6JykpCgkJCXNtcC0+ZGF0YS5zdHIuc3RyW2ldICs9ICdBJyAtICdhJzsKCX0KCXJldHVybiAxOwp9CgovKiB0YWtlcyB0aGUgbmV0bWFzayBpbiBhcmdfcCAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2lwbWFzayhzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0sIGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS5pcHY0LnNfYWRkciAmPSBhcmdfcC0+ZGF0YS5pcHY0LnNfYWRkcjsKCXNtcC0+dHlwZSA9IFNNUF9UX0lQVjQ7CglyZXR1cm4gMTsKfQoKLyogdGFrZXMgYW4gVUlOVCB2YWx1ZSBvbiBpbnB1dCBzdXBwb3NlZCB0byByZXByZXNlbnQgdGhlIHRpbWUgc2luY2UgRVBPQ0gsCiAqIGFkZHMgYW4gb3B0aW9uYWwgb2Zmc2V0IGZvdW5kIGluIGFyZ3NbMV0gYW5kIGVtaXRzIGEgc3RyaW5nIHJlcHJlc2VudGluZwogKiB0aGUgbG9jYWwgdGltZSBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBpbiBhcmdzWzFdIHVzaW5nIHN0cmZ0aW1lKCkuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2x0aW1lKHN0cnVjdCBzdHJlYW0gKnN0cmVhbSwgY29uc3Qgc3RydWN0IGFyZyAqYXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXN0cnVjdCBjaHVuayAqdGVtcDsKCXRpbWVfdCBjdXJyX2RhdGUgPSBzbXAtPmRhdGEudWludDsKCgkvKiBhZGQgb2Zmc2V0ICovCglpZiAoYXJnc1sxXS50eXBlID09IEFSR1RfU0lOVCB8fCBhcmdzWzFdLnR5cGUgPT0gQVJHVF9VSU5UKQoJCWN1cnJfZGF0ZSArPSBhcmdzWzFdLmRhdGEuc2ludDsKCgl0ZW1wID0gZ2V0X3RyYXNoX2NodW5rKCk7Cgl0ZW1wLT5sZW4gPSBzdHJmdGltZSh0ZW1wLT5zdHIsIHRlbXAtPnNpemUsIGFyZ3NbMF0uZGF0YS5zdHIuc3RyLCBsb2NhbHRpbWUoJmN1cnJfZGF0ZSkpOwoJc21wLT5kYXRhLnN0ciA9ICp0ZW1wOwoJc21wLT50eXBlID0gU01QX1RfU1RSOwoJcmV0dXJuIDE7Cn0KCi8qIGhhc2hlcyB0aGUgYmluYXJ5IGlucHV0IGludG8gYSAzMi1iaXQgdW5zaWduZWQgaW50ICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfc2RibShzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0sIGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCA9IGhhc2hfc2RibShzbXAtPmRhdGEuc3RyLnN0ciwgc21wLT5kYXRhLnN0ci5sZW4pOwoJaWYgKGFyZ19wICYmIGFyZ19wLT5kYXRhLnVpbnQpCgkJc21wLT5kYXRhLnVpbnQgPSBmdWxsX2hhc2goc21wLT5kYXRhLnVpbnQpOwoJc21wLT50eXBlID0gU01QX1RfVUlOVDsKCXJldHVybiAxOwp9CgovKiB0YWtlcyBhbiBVSU5UIHZhbHVlIG9uIGlucHV0IHN1cHBvc2VkIHRvIHJlcHJlc2VudCB0aGUgdGltZSBzaW5jZSBFUE9DSCwKICogYWRkcyBhbiBvcHRpb25hbCBvZmZzZXQgZm91bmQgaW4gYXJnc1sxXSBhbmQgZW1pdHMgYSBzdHJpbmcgcmVwcmVzZW50aW5nCiAqIHRoZSBVVEMgZGF0ZSBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBpbiBhcmdzWzFdIHVzaW5nIHN0cmZ0aW1lKCkuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X3V0aW1lKHN0cnVjdCBzdHJlYW0gKnN0cmVhbSwgY29uc3Qgc3RydWN0IGFyZyAqYXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXN0cnVjdCBjaHVuayAqdGVtcDsKCXRpbWVfdCBjdXJyX2RhdGUgPSBzbXAtPmRhdGEudWludDsKCgkvKiBhZGQgb2Zmc2V0ICovCglpZiAoYXJnc1sxXS50eXBlID09IEFSR1RfU0lOVCB8fCBhcmdzWzFdLnR5cGUgPT0gQVJHVF9VSU5UKQoJCWN1cnJfZGF0ZSArPSBhcmdzWzFdLmRhdGEuc2ludDsKCgl0ZW1wID0gZ2V0X3RyYXNoX2NodW5rKCk7Cgl0ZW1wLT5sZW4gPSBzdHJmdGltZSh0ZW1wLT5zdHIsIHRlbXAtPnNpemUsIGFyZ3NbMF0uZGF0YS5zdHIuc3RyLCBnbXRpbWUoJmN1cnJfZGF0ZSkpOwoJc21wLT5kYXRhLnN0ciA9ICp0ZW1wOwoJc21wLT50eXBlID0gU01QX1RfU1RSOwoJcmV0dXJuIDE7Cn0KCi8qIGhhc2hlcyB0aGUgYmluYXJ5IGlucHV0IGludG8gYSAzMi1iaXQgdW5zaWduZWQgaW50ICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfd3Q2KHN0cnVjdCBzdHJlYW0gKnN0cmVhbSwgY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgPSBoYXNoX3d0NihzbXAtPmRhdGEuc3RyLnN0ciwgc21wLT5kYXRhLnN0ci5sZW4pOwoJaWYgKGFyZ19wICYmIGFyZ19wLT5kYXRhLnVpbnQpCgkJc21wLT5kYXRhLnVpbnQgPSBmdWxsX2hhc2goc21wLT5kYXRhLnVpbnQpOwoJc21wLT50eXBlID0gU01QX1RfVUlOVDsKCXJldHVybiAxOwp9CgovKiBoYXNoZXMgdGhlIGJpbmFyeSBpbnB1dCBpbnRvIGEgMzItYml0IHVuc2lnbmVkIGludCAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2NyYzMyKHN0cnVjdCBzdHJlYW0gKnN0cmVhbSwgY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCA9IGhhc2hfY3JjMzIoc21wLT5kYXRhLnN0ci5zdHIsIHNtcC0+ZGF0YS5zdHIubGVuKTsKCWlmIChhcmdfcCAmJiBhcmdfcC0+ZGF0YS51aW50KQoJCXNtcC0+ZGF0YS51aW50ID0gZnVsbF9oYXNoKHNtcC0+ZGF0YS51aW50KTsKCXNtcC0+dHlwZSA9IFNNUF9UX1VJTlQ7CglyZXR1cm4gMTsKfQoKLyogVGhpcyBmdW5jdGlvbiBlc2NhcGUgc3BlY2lhbCBqc29uIGNoYXJhY3RlcnMuIFRoZSByZXR1cm5lZCBzdHJpbmcgY2FuIGJlCiAqIHNhZmVseSBzZXQgYmV0d2VlbiB0d28gJyInIGFuZCB1c2VkIGFzIGpzb24gc3RyaW5nLiBUaGUganNvbiBzdHJpbmcgaXMKICogZGVmaW5lZCBsaWtlIHRoaXM6CiAqCiAqICAgIGFueSBVbmljb2RlIGNoYXJhY3RlciBleGNlcHQgJyInIG9yICdcJyBvciBjb250cm9sIGNoYXJhY3RlcgogKiAgICBcIiwgXFwsIFwvLCBcYiwgXGYsIFxuLCBcciwgXHQsIFx1ICsgZm91ci1oZXgtZGlnaXRzCiAqCiAqIFRoZSBlbnVtIGlucHV0X3R5cGUgY29udGFpbiBhbGwgdGhlIGFsbG93ZWQgbW9kZSBmb3IgZGVjb2RpbmcgdGhlIGlucHV0CiAqIHN0cmluZy4KICovCmVudW0gaW5wdXRfdHlwZSB7CglJVF9BU0NJSSA9IDAsCglJVF9VVEY4LAoJSVRfVVRGOFMsCglJVF9VVEY4UCwKCUlUX1VURjhQUywKfTsKc3RhdGljIGludCBzYW1wbGVfY29udl9qc29uX2NoZWNrKHN0cnVjdCBhcmcgKmFyZywgc3RydWN0IHNhbXBsZV9jb252ICpjb252LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNoYXIgKiplcnIpCnsKCWlmICghYXJnKSB7CgkJbWVtcHJpbnRmKGVyciwgIlVuZXhwZWN0ZWQgZW1wdHkgYXJnIGxpc3QiKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAoYXJnLT50eXBlICE9IEFSR1RfU1RSKSB7CgkJbWVtcHJpbnRmKGVyciwgIlVuZXhwZWN0ZWQgYXJnIHR5cGUiKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAoc3RyY21wKGFyZy0+ZGF0YS5zdHIuc3RyLCAiIikgPT0gMCkgewoJCWFyZy0+dHlwZSA9IEFSR1RfVUlOVDsKCQlhcmctPmRhdGEudWludCA9IElUX0FTQ0lJOwoJCXJldHVybiAxOwoJfQoKCWVsc2UgaWYgKHN0cmNtcChhcmctPmRhdGEuc3RyLnN0ciwgImFzY2lpIikgPT0gMCkgewoJCWFyZy0+dHlwZSA9IEFSR1RfVUlOVDsKCQlhcmctPmRhdGEudWludCA9IElUX0FTQ0lJOwoJCXJldHVybiAxOwoJfQoKCWVsc2UgaWYgKHN0cmNtcChhcmctPmRhdGEuc3RyLnN0ciwgInV0ZjgiKSA9PSAwKSB7CgkJYXJnLT50eXBlID0gQVJHVF9VSU5UOwoJCWFyZy0+ZGF0YS51aW50ID0gSVRfVVRGODsKCQlyZXR1cm4gMTsKCX0KCgllbHNlIGlmIChzdHJjbXAoYXJnLT5kYXRhLnN0ci5zdHIsICJ1dGY4cyIpID09IDApIHsKCQlhcmctPnR5cGUgPSBBUkdUX1VJTlQ7CgkJYXJnLT5kYXRhLnVpbnQgPSBJVF9VVEY4UzsKCQlyZXR1cm4gMTsKCX0KCgllbHNlIGlmIChzdHJjbXAoYXJnLT5kYXRhLnN0ci5zdHIsICJ1dGY4cCIpID09IDApIHsKCQlhcmctPnR5cGUgPSBBUkdUX1VJTlQ7CgkJYXJnLT5kYXRhLnVpbnQgPSBJVF9VVEY4UDsKCQlyZXR1cm4gMTsKCX0KCgllbHNlIGlmIChzdHJjbXAoYXJnLT5kYXRhLnN0ci5zdHIsICJ1dGY4cHMiKSA9PSAwKSB7CgkJYXJnLT50eXBlID0gQVJHVF9VSU5UOwoJCWFyZy0+ZGF0YS51aW50ID0gSVRfVVRGOFBTOwoJCXJldHVybiAxOwoJfQoKCW1lbXByaW50ZihlcnIsICJVbmV4cGVjdGVkIGlucHV0IGNvZGUgdHlwZSBhdCBmaWxlICclcycsIGxpbmUgJWQuICIKCSAgICAgICAgICAgICAgICJBbGxvd2VkIHZhbHVlIGFyZSAnYXNjaWknLCAndXRmOCcsICd1dGY4cCcgYW5kICd1dGY4cHAnIiwgZmlsZSwgbGluZSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzYW1wbGVfY29udl9qc29uKHN0cnVjdCBzdHJlYW0gKnN0cmVhbSwgY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXN0cnVjdCBjaHVuayAqdGVtcDsKCWNoYXIgX3N0cls3XTsgLyogXHUgKyA0IGhleCBkaWdpdCArIG51bGwgY2hhciBmb3Igc3ByaW50Zi4gKi8KCWNvbnN0IGNoYXIgKnN0cjsKCWludCBsZW47CgllbnVtIGlucHV0X3R5cGUgaW5wdXRfdHlwZSA9IElUX0FTQ0lJOwoJdW5zaWduZWQgaW50IGM7Cgl1bnNpZ25lZCBpbnQgcmV0OwoJY2hhciAqcDsKCglpZiAoYXJnX3ApCgkJaW5wdXRfdHlwZSA9IGFyZ19wLT5kYXRhLnVpbnQ7CgoJdGVtcCA9IGdldF90cmFzaF9jaHVuaygpOwoJdGVtcC0+bGVuID0gMDsKCglwID0gc21wLT5kYXRhLnN0ci5zdHI7Cgl3aGlsZSAocCA8IHNtcC0+ZGF0YS5zdHIuc3RyICsgc21wLT5kYXRhLnN0ci5sZW4pIHsKCgkJaWYgKGlucHV0X3R5cGUgPT0gSVRfQVNDSUkpIHsKCQkJLyogUmVhZCBpbnB1dCBhcyBBU0NJSS4gKi8KCQkJYyA9ICoodW5zaWduZWQgY2hhciAqKXA7CgkJCXArKzsKCQl9CgkJZWxzZSB7CgkJCS8qIFJlYWQgaW5wdXQgYXMgVVRGOC4gKi8KCQkJcmV0ID0gdXRmOF9uZXh0KHAsIHNtcC0+ZGF0YS5zdHIubGVuIC0gKCBwIC0gc21wLT5kYXRhLnN0ci5zdHIgKSwgJmMpOwoJCQlwICs9IHV0ZjhfcmV0dXJuX2xlbmd0aChyZXQpOwoKCQkJaWYgKGlucHV0X3R5cGUgPT0gSVRfVVRGOCAmJiB1dGY4X3JldHVybl9jb2RlKHJldCkgIT0gVVRGOF9DT0RFX09LKQoJCQkJCXJldHVybiAwOwoJCQlpZiAoaW5wdXRfdHlwZSA9PSBJVF9VVEY4UyAmJiB1dGY4X3JldHVybl9jb2RlKHJldCkgIT0gVVRGOF9DT0RFX09LKQoJCQkJCWNvbnRpbnVlOwoJCQlpZiAoaW5wdXRfdHlwZSA9PSBJVF9VVEY4UCAmJiB1dGY4X3JldHVybl9jb2RlKHJldCkgJiAoVVRGOF9DT0RFX0lOVlJBTkdFfFVURjhfQ09ERV9CQURTRVEpKQoJCQkJCXJldHVybiAwOwoJCQlpZiAoaW5wdXRfdHlwZSA9PSBJVF9VVEY4UFMgJiYgdXRmOF9yZXR1cm5fY29kZShyZXQpICYgKFVURjhfQ09ERV9JTlZSQU5HRXxVVEY4X0NPREVfQkFEU0VRKSkKCQkJCQljb250aW51ZTsKCgkJCS8qIENoZWNrIHRvbyBiaWcgdmFsdWVzLiAqLwoJCQlpZiAoKHVuc2lnbmVkIGludCljID4gMHhmZmZmKSB7CgkJCQlpZiAoaW5wdXRfdHlwZSA9PSBJVF9VVEY4IHx8IGlucHV0X3R5cGUgPT0gSVRfVVRGOFApCgkJCQkJcmV0dXJuIDA7CgkJCQljb250aW51ZTsKCQkJfQoJCX0KCgkJLyogQ29udmVydCBjaGFyYWN0ZXIuICovCgkJaWYgKGMgPT0gJyInKSB7CgkJCWxlbiA9IDI7CgkJCXN0ciA9ICJcXFwiIjsKCQl9CgkJZWxzZSBpZiAoYyA9PSAnXFwnKSB7CgkJCWxlbiA9IDI7CgkJCXN0ciA9ICJcXFxcIjsKCQl9CgkJZWxzZSBpZiAoYyA9PSAnLycpIHsKCQkJbGVuID0gMjsKCQkJc3RyID0gIlxcLyI7CgkJfQoJCWVsc2UgaWYgKGMgPT0gJ1xiJykgewoJCQlsZW4gPSAyOwoJCQlzdHIgPSAiXFxiIjsKCQl9CgkJZWxzZSBpZiAoYyA9PSAnXGYnKSB7CgkJCWxlbiA9IDI7CgkJCXN0ciA9ICJcXGYiOwoJCX0KCQllbHNlIGlmIChjID09ICdccicpIHsKCQkJbGVuID0gMjsKCQkJc3RyID0gIlxcciI7CgkJfQoJCWVsc2UgaWYgKGMgPT0gJ1xuJykgewoJCQlsZW4gPSAyOwoJCQlzdHIgPSAiXFxuIjsKCQl9CgkJZWxzZSBpZiAoYyA9PSAnXHQnKSB7CgkJCWxlbiA9IDI7CgkJCXN0ciA9ICJcXHQiOwoJCX0KCQllbHNlIGlmIChjID4gMHhmZiB8fCAhaXNwcmludChjKSkgewoJCQkvKiBpc3ByaW50IGdlbmVyYXRlIGEgc2VnZmF1bHQgaWYgYyBpcyB0b28gYmlnLiBUaGUgbWFuIHNheXMgdGhhdAoJCQkgKiBjIG11c3QgaGF2ZSB0aGUgdmFsdWUgb2YgYW4gdW5zaWduZWQgY2hhciBvciBFT0YuCgkJCSAqLwoJCQlsZW4gPSA2OwoJCQlfc3RyWzBdID0gJ1xcJzsKCQkJX3N0clsxXSA9ICd1JzsKCQkJc25wcmludGYoJl9zdHJbMl0sIDUsICIlMDR4IiwgKHVuc2lnbmVkIHNob3J0KWMpOwoJCQlzdHIgPSBfc3RyOwoJCX0KCQllbHNlIHsKCQkJbGVuID0gMTsKCQkJc3RyID0gKGNoYXIgKikmYzsKCQl9CgoJCS8qIENoZWNrIGxlbmd0aCAqLwoJCWlmICh0ZW1wLT5sZW4gKyBsZW4gPiB0ZW1wLT5zaXplKQoJCQlyZXR1cm4gMDsKCgkJLyogQ29weSBzdHJpbmcuICovCgkJbWVtY3B5KHRlbXAtPnN0ciArIHRlbXAtPmxlbiwgc3RyLCBsZW4pOwoJCXRlbXAtPmxlbiArPSBsZW47Cgl9CgoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CglzbXAtPmRhdGEuc3RyID0gKnRlbXA7CglzbXAtPnR5cGUgPSBTTVBfVF9TVFI7CgoJcmV0dXJuIDE7Cn0KCi8qIFRoaXMgc2FtcGxlIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGV4dHJhY3Qgc29tZSBieXRlcyBmcm9tIGFuIGlucHV0IGJ1ZmZlci4KICogRmlyc3QgYXJnIGlzIHRoZSBvZmZzZXQuCiAqIE9wdGlvbmFsIHNlY29uZCBhcmcgaXMgdGhlIGxlbmd0aCB0byB0cnVuY2F0ZSAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2J5dGVzKHN0cnVjdCBzdHJlYW0gKnN0cmVhbSwgY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglpZiAoc21wLT5kYXRhLnN0ci5sZW4gPD0gYXJnX3BbMF0uZGF0YS51aW50KSB7CgkJc21wLT5kYXRhLnN0ci5sZW4gPSAwOwoJCXJldHVybiAxOwoJfQoKCWlmIChzbXAtPmRhdGEuc3RyLnNpemUpCgkJCXNtcC0+ZGF0YS5zdHIuc2l6ZSAtPSBhcmdfcFswXS5kYXRhLnVpbnQ7CglzbXAtPmRhdGEuc3RyLmxlbiAtPSBhcmdfcFswXS5kYXRhLnVpbnQ7CglzbXAtPmRhdGEuc3RyLnN0ciArPSBhcmdfcFswXS5kYXRhLnVpbnQ7CgoJaWYgKChhcmdfcFsxXS50eXBlID09IEFSR1RfVUlOVCkgJiYgKGFyZ19wWzFdLmRhdGEudWludCA8IHNtcC0+ZGF0YS5zdHIubGVuKSkKCQlzbXAtPmRhdGEuc3RyLmxlbiA9IGFyZ19wWzFdLmRhdGEudWludDsKCglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBzYW1wbGVfY29udl9maWVsZF9jaGVjayhzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlX2NvbnYgKmNvbnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqKmVycikKewoJc3RydWN0IGFyZyAqYXJnID0gYXJnczsKCglpZiAoIWFyZykgewoJCW1lbXByaW50ZihlcnIsICJVbmV4cGVjdGVkIGVtcHR5IGFyZyBsaXN0Iik7CgkJcmV0dXJuIDA7Cgl9CgoJaWYgKGFyZy0+dHlwZSAhPSBBUkdUX1VJTlQpIHsKCQltZW1wcmludGYoZXJyLCAiVW5leHBlY3RlZCBhcmcgdHlwZSIpOwoJCXJldHVybiAwOwoJfQoKCWlmICghYXJnLT5kYXRhLnVpbnQpIHsKCQltZW1wcmludGYoZXJyLCAiVW5leHBlY3RlZCB2YWx1ZSAwIGZvciBpbmRleCIpOwoJCXJldHVybiAwOwoJfQoKCWFyZysrOwoKCWlmIChhcmctPnR5cGUgIT0gQVJHVF9TVFIpIHsKCQltZW1wcmludGYoZXJyLCAiVW5leHBlY3RlZCBhcmcgdHlwZSIpOwoJCXJldHVybiAwOwoJfQoKCWlmICghYXJnLT5kYXRhLnN0ci5sZW4pIHsKCQltZW1wcmludGYoZXJyLCAiRW1wdHkgc2VwYXJhdG9ycyBsaXN0Iik7CgkJcmV0dXJuIDA7Cgl9CgoJcmV0dXJuIDE7Cn0KCi8qIFRoaXMgc2FtcGxlIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGEgcmV0dXJuIHNlbGVjdGVkIHBhcnQgb2YgYSBzdHJpbmcgKGZpZWxkKS4KICogRmlyc3QgYXJnIGlzIHRoZSBpbmRleCBvZiB0aGUgZmllbGQgKHN0YXJ0IGF0IDEpCiAqIFNlY29uZCBhcmcgaXMgYSBjaGFyIGxpc3Qgb2Ygc2VwYXJhdG9ycyAodHlwZSBzdHJpbmcpCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2ZpZWxkKHN0cnVjdCBzdHJlYW0gKnN0cmVhbSwgY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7Cgl1bnNpZ25lZCBpbnQgZmllbGQ7CgljaGFyICpzdGFydCwgKmVuZDsKCWludCBpOwoKCWlmICghYXJnX3BbMF0uZGF0YS51aW50KQoJCXJldHVybiAwOwoKCWZpZWxkID0gMTsKCWVuZCA9IHN0YXJ0ID0gc21wLT5kYXRhLnN0ci5zdHI7Cgl3aGlsZSAoZW5kIC0gc21wLT5kYXRhLnN0ci5zdHIgPCBzbXAtPmRhdGEuc3RyLmxlbikgewoKCQlmb3IgKGkgPSAwIDsgaSA8IGFyZ19wWzFdLmRhdGEuc3RyLmxlbiA7IGkrKykgewoJCQlpZiAoKmVuZCA9PSBhcmdfcFsxXS5kYXRhLnN0ci5zdHJbaV0pIHsKCQkJCWlmIChmaWVsZCA9PSBhcmdfcFswXS5kYXRhLnVpbnQpCgkJCQkJZ290byBmb3VuZDsKCQkJCXN0YXJ0ID0gZW5kKzE7CgkJCQlmaWVsZCsrOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJZW5kKys7Cgl9CgoJLyogRmllbGQgbm90IGZvdW5kICovCglpZiAoZmllbGQgIT0gYXJnX3BbMF0uZGF0YS51aW50KSB7CgkJc21wLT5kYXRhLnN0ci5sZW4gPSAwOwoJCXJldHVybiAxOwoJfQpmb3VuZDoKCXNtcC0+ZGF0YS5zdHIubGVuID0gZW5kIC0gc3RhcnQ7CgkvKiBJZiByZXQgc3RyaW5nIGlzIGxlbiAwLCBubyBuZWVkIHRvCiAgICAgICAgICAgY2hhbmdlIHBvaW50ZXJzIG9yIHRvIHVwZGF0ZSBzaXplICovCglpZiAoIXNtcC0+ZGF0YS5zdHIubGVuKQoJCXJldHVybiAxOwoKCXNtcC0+ZGF0YS5zdHIuc3RyID0gc3RhcnQ7CgoJLyogQ29tcHV0ZSByZW1haW5pbmcgc2l6ZSBpZiBuZWVkZWQKICAgICAgICAgICBOb3RlOiBzbXAtPmRhdGEuc3RyLnNpemUgY2Fubm90IGJlIHNldCB0byAwICovCglpZiAoc21wLT5kYXRhLnN0ci5zaXplKQoJCXNtcC0+ZGF0YS5zdHIuc2l6ZSAtPSBzdGFydCAtIHNtcC0+ZGF0YS5zdHIuc3RyOwoKCXJldHVybiAxOwp9CgovKiBUaGlzIHNhbXBsZSBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byByZXR1cm4gYSB3b3JkIGZyb20gYSBzdHJpbmcuCiAqIEZpcnN0IGFyZyBpcyB0aGUgaW5kZXggb2YgdGhlIHdvcmQgKHN0YXJ0IGF0IDEpCiAqIFNlY29uZCBhcmcgaXMgYSBjaGFyIGxpc3Qgb2Ygd29yZHMgc2VwYXJhdG9ycyAodHlwZSBzdHJpbmcpCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X3dvcmQoc3RydWN0IHN0cmVhbSAqc3RyZWFtLCBjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJdW5zaWduZWQgaW50IHdvcmQ7CgljaGFyICpzdGFydCwgKmVuZDsKCWludCBpLCBpc3NlcCwgaW53b3JkOwoKCWlmICghYXJnX3BbMF0uZGF0YS51aW50KQoJCXJldHVybiAwOwoKCXdvcmQgPSAwOwoJaW53b3JkID0gMDsKCWVuZCA9IHN0YXJ0ID0gc21wLT5kYXRhLnN0ci5zdHI7Cgl3aGlsZSAoZW5kIC0gc21wLT5kYXRhLnN0ci5zdHIgPCBzbXAtPmRhdGEuc3RyLmxlbikgewoJCWlzc2VwID0gMDsKCQlmb3IgKGkgPSAwIDsgaSA8IGFyZ19wWzFdLmRhdGEuc3RyLmxlbiA7IGkrKykgewoJCQlpZiAoKmVuZCA9PSBhcmdfcFsxXS5kYXRhLnN0ci5zdHJbaV0pIHsKCQkJCWlzc2VwID0gMTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCWlmICghaW53b3JkKSB7CgkJCWlmICghaXNzZXApIHsKCQkJCXdvcmQrKzsKCQkJCXN0YXJ0ID0gZW5kOwoJCQkJaW53b3JkID0gMTsKCQkJfQoJCX0KCQllbHNlIGlmIChpc3NlcCkgewoJCQlpZiAod29yZCA9PSBhcmdfcFswXS5kYXRhLnVpbnQpCgkJCQlnb3RvIGZvdW5kOwoJCQlpbndvcmQgPSAwOwoJCX0KCQllbmQrKzsKCX0KCgkvKiBGaWVsZCBub3QgZm91bmQgKi8KCWlmICh3b3JkICE9IGFyZ19wWzBdLmRhdGEudWludCkgewoJCXNtcC0+ZGF0YS5zdHIubGVuID0gMDsKCQlyZXR1cm4gMTsKCX0KZm91bmQ6CglzbXAtPmRhdGEuc3RyLmxlbiA9IGVuZCAtIHN0YXJ0OwoJLyogSWYgcmV0IHN0cmluZyBpcyBsZW4gMCwgbm8gbmVlZCB0bwogICAgICAgICAgIGNoYW5nZSBwb2ludGVycyBvciB0byB1cGRhdGUgc2l6ZSAqLwoJaWYgKCFzbXAtPmRhdGEuc3RyLmxlbikKCQlyZXR1cm4gMTsKCglzbXAtPmRhdGEuc3RyLnN0ciA9IHN0YXJ0OwoKCS8qIENvbXB1dGUgcmVtYWluaW5nIHNpemUgaWYgbmVlZGVkCiAgICAgICAgICAgTm90ZTogc21wLT5kYXRhLnN0ci5zaXplIGNhbm5vdCBiZSBzZXQgdG8gMCAqLwoJaWYgKHNtcC0+ZGF0YS5zdHIuc2l6ZSkKCQlzbXAtPmRhdGEuc3RyLnNpemUgLT0gc3RhcnQgLSBzbXAtPmRhdGEuc3RyLnN0cjsKCglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBzYW1wbGVfY29udl9yZWdzdWJfY2hlY2soc3RydWN0IGFyZyAqYXJncywgc3RydWN0IHNhbXBsZV9jb252ICpjb252LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqKmVycikKewoJc3RydWN0IGFyZyAqYXJnID0gYXJnczsKCWNoYXIgKnA7CglpbnQgbGVuOwoKCS8qIGFyZzAgaXMgYSByZWdleCwgaXQgdXNlcyB0eXBlX2ZsYWcgZm9yIElDQVNFIGFuZCBnbG9iYWwgbWF0Y2ggKi8KCWFyZ1swXS50eXBlX2ZsYWdzID0gMDsKCglpZiAoYXJnWzJdLnR5cGUgIT0gQVJHVF9TVFIpCgkJcmV0dXJuIDE7CgoJcCA9IGFyZ1syXS5kYXRhLnN0ci5zdHI7CglsZW4gPSBhcmdbMl0uZGF0YS5zdHIubGVuOwoJd2hpbGUgKGxlbikgewoJCWlmICgqcCA9PSAnaScpIHsKCQkJYXJnWzBdLnR5cGVfZmxhZ3MgfD0gQVJHRl9SRUdfSUNBU0U7CgkJfQoJCWVsc2UgaWYgKCpwID09ICdnJykgewoJCQlhcmdbMF0udHlwZV9mbGFncyB8PSBBUkdGX1JFR19HTE9COwoJCX0KCQllbHNlIHsKCQkJbWVtcHJpbnRmKGVyciwgImludmFsaWQgcmVnZXggZmxhZyAnJWMnLCBvbmx5ICdpJyBhbmQgJ2cnIGFyZSBzdXBwb3J0ZWQiLCAqcCk7CgkJCXJldHVybiAwOwoJCX0KCQlwKys7CgkJbGVuLS07Cgl9CglyZXR1cm4gMTsKfQoKLyogVGhpcyBzYW1wbGUgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gZG8gdGhlIGVxdWl2YWxlbnQgb2Ygcy9tYXRjaC9yZXBsYWNlLyBvbgogKiB0aGUgaW5wdXQgc3RyaW5nLiBJdCBhcHBsaWVzIGEgcmVnZXggYW5kIHJlc3RhcnRzIGZyb20gdGhlIGxhc3QgbWF0Y2hlZAogKiBsb2NhdGlvbiB1bnRpbCBub3RoaW5nIG1hdGNoZXMgYW55bW9yZS4gRmlyc3QgYXJnIGlzIHRoZSByZWdleCB0byBhcHBseSB0bwogKiB0aGUgaW5wdXQgc3RyaW5nLCBzZWNvbmQgYXJnIGlzIHRoZSByZXBsYWNlbWVudCBleHByZXNzaW9uLgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9yZWdzdWIoc3RydWN0IHN0cmVhbSAqc3RyZWFtLCBjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CgljaGFyICpzdGFydCwgKmVuZDsKCXN0cnVjdCBteV9yZWdleCAqcmVnID0gYXJnX3BbMF0uZGF0YS5yZWc7CglyZWdtYXRjaF90IHBtYXRjaFtNQVhfTUFUQ0hdOwoJc3RydWN0IGNodW5rICp0cmFzaCA9IGdldF90cmFzaF9jaHVuaygpOwoJaW50IGZsYWcsIG1heDsKCWludCBmb3VuZDsKCglzdGFydCA9IHNtcC0+ZGF0YS5zdHIuc3RyOwoJZW5kID0gc3RhcnQgKyBzbXAtPmRhdGEuc3RyLmxlbjsKCglmbGFnID0gMDsKCXdoaWxlICgxKSB7CgkJLyogY2hlY2sgZm9yIGxhc3Qgcm91bmQgd2hpY2ggaXMgdXNlZCB0byBjb3B5IHJlbWFpbmluZyBwYXJ0cwoJCSAqIHdoZW4gbm90IHJ1bm5pbmcgaW4gZ2xvYmFsIHJlcGxhY2VtZW50IG1vZGUuCgkJICovCgkJZm91bmQgPSAwOwoJCWlmICgoYXJnX3BbMF0udHlwZV9mbGFncyAmIEFSR0ZfUkVHX0dMT0IpIHx8ICEoZmxhZyAmIFJFR19OT1RCT0wpKSB7CgkJCS8qIE5vdGU6IHdlIGNhbiBoYXZlIHN0YXJ0ID09IGVuZCBvbiBlbXB0eSBzdHJpbmdzIG9yIGF0IHRoZSBlbmQgKi8KCQkJZm91bmQgPSByZWdleF9leGVjX21hdGNoMihyZWcsIHN0YXJ0LCBlbmQgLSBzdGFydCwgTUFYX01BVENILCBwbWF0Y2gsIGZsYWcpOwoJCX0KCgkJaWYgKCFmb3VuZCkKCQkJcG1hdGNoWzBdLnJtX3NvID0gZW5kIC0gc3RhcnQ7CgoJCS8qIGNvcHkgdGhlIGhlYWRpbmcgbm9uLW1hdGNoaW5nIHBhcnQgKHdoaWNoIG1heSBhbHNvIGJlIHRoZSB0YWlsIGlmIG5vdGhpbmcgbWF0Y2hlcykgKi8KCQltYXggPSB0cmFzaC0+c2l6ZSAtIHRyYXNoLT5sZW47CgkJaWYgKG1heCAmJiBwbWF0Y2hbMF0ucm1fc28gPiAwKSB7CgkJCWlmIChtYXggPiBwbWF0Y2hbMF0ucm1fc28pCgkJCQltYXggPSBwbWF0Y2hbMF0ucm1fc287CgkJCW1lbWNweSh0cmFzaC0+c3RyICsgdHJhc2gtPmxlbiwgc3RhcnQsIG1heCk7CgkJCXRyYXNoLT5sZW4gKz0gbWF4OwoJCX0KCgkJaWYgKCFmb3VuZCkKCQkJYnJlYWs7CgoJCS8qIHJlcGxhY2UgdGhlIG1hdGNoaW5nIHBhcnQgKi8KCQltYXggPSB0cmFzaC0+c2l6ZSAtIHRyYXNoLT5sZW47CgkJaWYgKG1heCkgewoJCQlpZiAobWF4ID4gYXJnX3BbMV0uZGF0YS5zdHIubGVuKQoJCQkJbWF4ID0gYXJnX3BbMV0uZGF0YS5zdHIubGVuOwoJCQltZW1jcHkodHJhc2gtPnN0ciArIHRyYXNoLT5sZW4sIGFyZ19wWzFdLmRhdGEuc3RyLnN0ciwgbWF4KTsKCQkJdHJhc2gtPmxlbiArPSBtYXg7CgkJfQoKCQkvKiBzdG9wIGhlcmUgaWYgd2UncmUgZG9uZSB3aXRoIHRoaXMgc3RyaW5nICovCgkJaWYgKHN0YXJ0ID49IGVuZCkKCQkJYnJlYWs7CgoJCS8qIFdlIGhhdmUgYSBzcGVjaWFsIGNhc2UgZm9yIG1hdGNoZXMgb2YgbGVuZ3RoIDAgKGVnOiAieCp5KiIpLgoJCSAqIFRoZXNlIG9uZXMgYXJlIGNvbnNpZGVyZWQgdG8gbWF0Y2ggaW4gZnJvbnQgb2YgYSBjaGFyYWN0ZXIsCgkJICogc28gd2UgaGF2ZSB0byBjb3B5IHRoYXQgY2hhcmFjdGVyIGFuZCBza2lwIHRvIHRoZSBuZXh0IG9uZS4KCQkgKi8KCQlpZiAoIXBtYXRjaFswXS5ybV9lbykgewoJCQlpZiAodHJhc2gtPmxlbiA8IHRyYXNoLT5zaXplKQoJCQkJdHJhc2gtPnN0clt0cmFzaC0+bGVuKytdID0gc3RhcnRbcG1hdGNoWzBdLnJtX2VvXTsKCQkJcG1hdGNoWzBdLnJtX2VvKys7CgkJfQoKCQlzdGFydCArPSBwbWF0Y2hbMF0ucm1fZW87CgkJZmxhZyB8PSBSRUdfTk9UQk9MOwoJfQoKCXNtcC0+ZGF0YS5zdHIgPSAqdHJhc2g7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYSBVSU5UIG9uIGlucHV0LCBhcHBsaWVzIGEgYmluYXJ5IHR3b3MgY29tcGxlbWVudCBhbmQgcmV0dXJucyB0aGUgVUlOVAogKiByZXN1bHQuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2JpbmFyeV9jcGwoc3RydWN0IHN0cmVhbSAqc3RyZWFtLCBjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgPSB+c21wLT5kYXRhLnVpbnQ7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYSBVSU5UIG9uIGlucHV0LCBhcHBsaWVzIGEgYmluYXJ5ICJhbmQiIHdpdGggdGhlIFVJTlQgaW4gYXJnX3AsIGFuZAogKiByZXR1cm5zIHRoZSBVSU5UIHJlc3VsdC4KICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYmluYXJ5X2FuZChzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0sIGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCAmPSBhcmdfcC0+ZGF0YS51aW50OwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGEgVUlOVCBvbiBpbnB1dCwgYXBwbGllcyBhIGJpbmFyeSAib3IiIHdpdGggdGhlIFVJTlQgaW4gYXJnX3AsIGFuZAogKiByZXR1cm5zIHRoZSBVSU5UIHJlc3VsdC4KICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYmluYXJ5X29yKHN0cnVjdCBzdHJlYW0gKnN0cmVhbSwgY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgfD0gYXJnX3AtPmRhdGEudWludDsKCXJldHVybiAxOwp9CgovKiBUYWtlcyBhIFVJTlQgb24gaW5wdXQsIGFwcGxpZXMgYSBiaW5hcnkgInhvciIgd2l0aCB0aGUgVUlOVCBpbiBhcmdfcCwgYW5kCiAqIHJldHVybnMgdGhlIFVJTlQgcmVzdWx0LgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9iaW5hcnlfeG9yKHN0cnVjdCBzdHJlYW0gKnN0cmVhbSwgY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50IF49IGFyZ19wLT5kYXRhLnVpbnQ7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYSBVSU5UIG9uIGlucHV0LCBhcHBsaWVzIGFuIGFyaXRobWV0aWMgImFkZCIgd2l0aCB0aGUgVUlOVCBpbiBhcmdfcCwKICogYW5kIHJldHVybnMgdGhlIFVJTlQgcmVzdWx0LgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9hcml0aF9hZGQoc3RydWN0IHN0cmVhbSAqc3RyZWFtLCBjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCArPSBhcmdfcC0+ZGF0YS51aW50OwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGEgVUlOVCBvbiBpbnB1dCwgYXBwbGllcyBhbiBhcml0aG1ldGljICJzdWIiIHdpdGggdGhlIFVJTlQgaW4gYXJnX3AsCiAqIGFuZCByZXR1cm5zIHRoZSBVSU5UIHJlc3VsdC4KICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYXJpdGhfc3ViKHN0cnVjdCBzdHJlYW0gKnN0cmVhbSwgY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgLT0gYXJnX3AtPmRhdGEudWludDsKCXJldHVybiAxOwp9CgovKiBUYWtlcyBhIFVJTlQgb24gaW5wdXQsIGFwcGxpZXMgYW4gYXJpdGhtZXRpYyAibXVsIiB3aXRoIHRoZSBVSU5UIGluIGFyZ19wLAogKiBhbmQgcmV0dXJucyB0aGUgVUlOVCByZXN1bHQuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2FyaXRoX211bChzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0sIGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ICo9IGFyZ19wLT5kYXRhLnVpbnQ7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYSBVSU5UIG9uIGlucHV0LCBhcHBsaWVzIGFuIGFyaXRobWV0aWMgImRpdiIgd2l0aCB0aGUgVUlOVCBpbiBhcmdfcCwKICogYW5kIHJldHVybnMgdGhlIFVJTlQgcmVzdWx0LiBJZiBhcmdfcCBtYWtlcyB0aGUgcmVzdWx0IG92ZXJmbG93LCB0aGVuIHRoZQogKiBsYXJnZXN0IHBvc3NpYmxlIHF1YW50aXR5IGlzIHJldHVybmVkLgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9hcml0aF9kaXYoc3RydWN0IHN0cmVhbSAqc3RyZWFtLCBjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglpZiAoYXJnX3AtPmRhdGEudWludCkKCQlzbXAtPmRhdGEudWludCAvPSBhcmdfcC0+ZGF0YS51aW50OwoJZWxzZQoJCXNtcC0+ZGF0YS51aW50ID0gfjA7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYSBVSU5UIG9uIGlucHV0LCBhcHBsaWVzIGFuIGFyaXRobWV0aWMgIm1vZCIgd2l0aCB0aGUgVUlOVCBpbiBhcmdfcCwKICogYW5kIHJldHVybnMgdGhlIFVJTlQgcmVzdWx0LiBJZiBhcmdfcCBtYWtlcyB0aGUgcmVzdWx0IG92ZXJmbG93LCB0aGVuIHplcm8KICogaXMgcmV0dXJuZWQuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2FyaXRoX21vZChzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0sIGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCWlmIChhcmdfcC0+ZGF0YS51aW50KQoJCXNtcC0+ZGF0YS51aW50ICU9IGFyZ19wLT5kYXRhLnVpbnQ7CgllbHNlCgkJc21wLT5kYXRhLnVpbnQgPSAwOwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGFuIFVJTlQgb24gaW5wdXQsIGFwcGxpZXMgYW4gYXJpdGhtZXRpYyAibmVnIiBhbmQgcmV0dXJucyB0aGUgVUlOVAogKiByZXN1bHQuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2FyaXRoX25lZyhzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0sIGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ID0gLXNtcC0+ZGF0YS51aW50OwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGEgVUlOVCBvbiBpbnB1dCwgcmV0dXJucyB0cnVlIGlzIHRoZSB2YWx1ZSBpcyBub24tbnVsbCwgb3RoZXJ3aXNlCiAqIGZhbHNlLiBUaGUgb3V0cHV0IGlzIGEgQk9PTC4KICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYXJpdGhfYm9vbChzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0sIGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCA9ICEhc21wLT5kYXRhLnVpbnQ7CglzbXAtPnR5cGUgPSBTTVBfVF9CT09MOwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGEgVUlOVCBvbiBpbnB1dCwgcmV0dXJucyBmYWxzZSBpcyB0aGUgdmFsdWUgaXMgbm9uLW51bGwsIG90aGVyd2lzZQogKiB0cnVlZS4gVGhlIG91dHB1dCBpcyBhIEJPT0wuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2FyaXRoX25vdChzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0sIGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ID0gIXNtcC0+ZGF0YS51aW50OwoJc21wLT50eXBlID0gU01QX1RfQk9PTDsKCXJldHVybiAxOwp9CgovKiBUYWtlcyBhIFVJTlQgb24gaW5wdXQsIHJldHVybnMgdHJ1ZSBpcyB0aGUgdmFsdWUgaXMgb2RkLCBvdGhlcndpc2UgZmFsc2UuCiAqIFRoZSBvdXRwdXQgaXMgYSBCT09MLgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9hcml0aF9vZGQoc3RydWN0IHN0cmVhbSAqc3RyZWFtLCBjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCA9IHNtcC0+ZGF0YS51aW50ICYgMTsKCXNtcC0+dHlwZSA9IFNNUF9UX0JPT0w7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYSBVSU5UIG9uIGlucHV0LCByZXR1cm5zIHRydWUgaXMgdGhlIHZhbHVlIGlzIGV2ZW4sIG90aGVyd2lzZSBmYWxzZS4KICogVGhlIG91dHB1dCBpcyBhIEJPT0wuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2FyaXRoX2V2ZW4oc3RydWN0IHN0cmVhbSAqc3RyZWFtLCBjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgPSAhKHNtcC0+ZGF0YS51aW50ICYgMSk7CglzbXAtPnR5cGUgPSBTTVBfVF9CT09MOwoJcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgIEFsbCBzdXBwb3J0ZWQgc2FtcGxlIGZldGNoIGZ1bmN0aW9ucyBtdXN0IGJlIGRlY2xhcmVkIGhlcmUgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBmb3JjZSBUUlVFIHRvIGJlIHJldHVybmVkIGF0IHRoZSBmZXRjaCBsZXZlbCAqLwpzdGF0aWMgaW50CnNtcF9mZXRjaF90cnVlKHN0cnVjdCBwcm94eSAqcHgsIHN0cnVjdCBzdHJlYW0gKnMsIHZvaWQgKmw3LCB1bnNpZ25lZCBpbnQgb3B0LAogICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIGNvbnN0IGNoYXIgKmt3LCB2b2lkICpwcml2YXRlKQp7CglzbXAtPnR5cGUgPSBTTVBfVF9CT09MOwoJc21wLT5kYXRhLnVpbnQgPSAxOwoJcmV0dXJuIDE7Cn0KCi8qIGZvcmNlIEZBTFNFIHRvIGJlIHJldHVybmVkIGF0IHRoZSBmZXRjaCBsZXZlbCAqLwpzdGF0aWMgaW50CnNtcF9mZXRjaF9mYWxzZShzdHJ1Y3QgcHJveHkgKnB4LCBzdHJ1Y3Qgc3RyZWFtICpzLCB2b2lkICpsNywgdW5zaWduZWQgaW50IG9wdCwKICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+dHlwZSA9IFNNUF9UX0JPT0w7CglzbXAtPmRhdGEudWludCA9IDA7CglyZXR1cm4gMTsKfQoKLyogcmV0cmlldmUgZW52aXJvbm1lbnQgdmFyaWFibGUgJDEgYXMgYSBzdHJpbmcgKi8Kc3RhdGljIGludApzbXBfZmV0Y2hfZW52KHN0cnVjdCBwcm94eSAqcHgsIHN0cnVjdCBzdHJlYW0gKnMsIHZvaWQgKmw3LCB1bnNpZ25lZCBpbnQgb3B0LAogICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCWNoYXIgKmVudjsKCglpZiAoIWFyZ3MgfHwgYXJnc1swXS50eXBlICE9IEFSR1RfU1RSKQoJCXJldHVybiAwOwoKCWVudiA9IGdldGVudihhcmdzWzBdLmRhdGEuc3RyLnN0cik7CglpZiAoIWVudikKCQlyZXR1cm4gMDsKCglzbXAtPnR5cGUgPSBTTVBfVF9TVFI7CglzbXAtPmZsYWdzID0gU01QX0ZfQ09OU1Q7CglzbXAtPmRhdGEuc3RyLnN0ciA9IGVudjsKCXNtcC0+ZGF0YS5zdHIubGVuID0gc3RybGVuKGVudik7CglyZXR1cm4gMTsKfQoKLyogcmV0cmlldmUgdGhlIGN1cnJlbnQgbG9jYWwgZGF0ZSBpbiBlcG9jaCB0aW1lLCBhbmQgYXBwbGllcyBhbiBvcHRpb25hbCBvZmZzZXQKICogb2YgYXJnc1swXSBzZWNvbmRzLgogKi8Kc3RhdGljIGludApzbXBfZmV0Y2hfZGF0ZShzdHJ1Y3QgcHJveHkgKnB4LCBzdHJ1Y3Qgc3RyZWFtICpzLCB2b2lkICpsNywgdW5zaWduZWQgaW50IG9wdCwKICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGFyZyAqYXJncywgc3RydWN0IHNhbXBsZSAqc21wLCBjb25zdCBjaGFyICprdywgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgPSBkYXRlLnR2X3NlYzsKCgkvKiBhZGQgb2Zmc2V0ICovCglpZiAoYXJncyAmJiAoYXJnc1swXS50eXBlID09IEFSR1RfU0lOVCB8fCBhcmdzWzBdLnR5cGUgPT0gQVJHVF9VSU5UKSkKCQlzbXAtPmRhdGEudWludCArPSBhcmdzWzBdLmRhdGEuc2ludDsKCglzbXAtPnR5cGUgPSBTTVBfVF9VSU5UOwoJc21wLT5mbGFncyB8PSBTTVBfRl9WT0xfVEVTVCB8IFNNUF9GX01BWV9DSEFOR0U7CglyZXR1cm4gMTsKfQoKLyogcmV0dXJucyB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlcyAqLwpzdGF0aWMgaW50CnNtcF9mZXRjaF9uYnByb2Moc3RydWN0IHByb3h5ICpweCwgc3RydWN0IHN0cmVhbSAqcywgdm9pZCAqbDcsIHVuc2lnbmVkIGludCBvcHQsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGFyZyAqYXJncywgc3RydWN0IHNhbXBsZSAqc21wLCBjb25zdCBjaGFyICprdywgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT50eXBlID0gU01QX1RfVUlOVDsKCXNtcC0+ZGF0YS51aW50ID0gZ2xvYmFsLm5icHJvYzsKCXJldHVybiAxOwp9CgovKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcHJvY2VzcyAoYmV0d2VlbiAxIGFuZCBuYnByb2MgKi8Kc3RhdGljIGludApzbXBfZmV0Y2hfcHJvYyhzdHJ1Y3QgcHJveHkgKnB4LCBzdHJ1Y3Qgc3RyZWFtICpzLCB2b2lkICpsNywgdW5zaWduZWQgaW50IG9wdCwKICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGFyZyAqYXJncywgc3RydWN0IHNhbXBsZSAqc21wLCBjb25zdCBjaGFyICprdywgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT50eXBlID0gU01QX1RfVUlOVDsKCXNtcC0+ZGF0YS51aW50ID0gcmVsYXRpdmVfcGlkOwoJcmV0dXJuIDE7Cn0KCi8qIGdlbmVyYXRlIGEgcmFuZG9tIDMyLWJpdCBpbnRlZ2VyIGZvciB3aGF0ZXZlciBwdXJwb3NlLCB3aXRoIGFuIG9wdGlvbmFsCiAqIHJhbmdlIHNwZWNpZmllZCBpbiBhcmd1bWVudC4KICovCnN0YXRpYyBpbnQKc21wX2ZldGNoX3JhbmQoc3RydWN0IHByb3h5ICpweCwgc3RydWN0IHN0cmVhbSAqcywgdm9pZCAqbDcsIHVuc2lnbmVkIGludCBvcHQsCiAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ID0gcmFuZG9tKCk7CgoJLyogcmVkdWNlIGlmIG5lZWRlZC4gRG9uJ3QgZG8gYSBtb2R1bG8sIHVzZSBhbGwgYml0cyEgKi8KCWlmIChhcmdzICYmIGFyZ3NbMF0udHlwZSA9PSBBUkdUX1VJTlQpCgkJc21wLT5kYXRhLnVpbnQgPSAoKHVpbnQ2NF90KXNtcC0+ZGF0YS51aW50ICogYXJnc1swXS5kYXRhLnVpbnQpIC8gKCh1NjQpUkFORF9NQVgrMSk7CgoJc21wLT50eXBlID0gU01QX1RfVUlOVDsKCXNtcC0+ZmxhZ3MgfD0gU01QX0ZfVk9MX1RFU1QgfCBTTVBfRl9NQVlfQ0hBTkdFOwoJcmV0dXJuIDE7Cn0KCi8qIHJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBwcm9jZXNzIGlzIHN0b3BwaW5nICovCnN0YXRpYyBpbnQKc21wX2ZldGNoX3N0b3BwaW5nKHN0cnVjdCBwcm94eSAqcHgsIHN0cnVjdCBzdHJlYW0gKnMsIHZvaWQgKmw3LCB1bnNpZ25lZCBpbnQgb3B0LAogICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGFyZyAqYXJncywgc3RydWN0IHNhbXBsZSAqc21wLCBjb25zdCBjaGFyICprdywgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT50eXBlID0gU01QX1RfQk9PTDsKCXNtcC0+ZGF0YS51aW50ID0gc3RvcHBpbmc7CglyZXR1cm4gMTsKfQoKLyogTm90ZTogbXVzdCBub3QgYmUgZGVjbGFyZWQgPGNvbnN0PiBhcyBpdHMgbGlzdCB3aWxsIGJlIG92ZXJ3cml0dGVuLgogKiBOb3RlOiBmZXRjaGVzIHRoYXQgbWF5IHJldHVybiBtdWx0aXBsZSB0eXBlcyBtdXN0IGJlIGRlY2xhcmVkIGFzIHRoZSBsb3dlc3QKICogY29tbW9uIGRlbm9taW5hdG9yLCB0aGUgdHlwZSB0aGF0IGNhbiBiZSBjYXN0ZWQgaW50byBhbGwgb3RoZXIgb25lcy4gRm9yCiAqIGluc3RhbmNlIElQdjQvSVB2NiBtdXN0IGJlIGRlY2xhcmVkIElQdjQuCiAqLwpzdGF0aWMgc3RydWN0IHNhbXBsZV9mZXRjaF9rd19saXN0IHNtcF9rd3MgPSB7SUxILCB7Cgl7ICJhbHdheXNfZmFsc2UiLCBzbXBfZmV0Y2hfZmFsc2UsIDAsICAgICAgICAgICAgTlVMTCwgU01QX1RfQk9PTCwgU01QX1VTRV9JTlRSTiB9LAoJeyAiYWx3YXlzX3RydWUiLCAgc21wX2ZldGNoX3RydWUsICAwLCAgICAgICAgICAgIE5VTEwsIFNNUF9UX0JPT0wsIFNNUF9VU0VfSU5UUk4gfSwKCXsgImVudiIsICAgICAgICAgIHNtcF9mZXRjaF9lbnYsICAgQVJHMSgxLFNUUiksICBOVUxMLCBTTVBfVF9TVFIsICBTTVBfVVNFX0lOVFJOIH0sCgl7ICJkYXRlIiwgICAgICAgICBzbXBfZmV0Y2hfZGF0ZSwgIEFSRzEoMCxTSU5UKSwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1VTRV9JTlRSTiB9LAoJeyAibmJwcm9jIiwgICAgICAgc21wX2ZldGNoX25icHJvYywwLCAgICAgICAgICAgIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9VU0VfSU5UUk4gfSwKCXsgInByb2MiLCAgICAgICAgIHNtcF9mZXRjaF9wcm9jLCAgMCwgICAgICAgICAgICBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVVNFX0lOVFJOIH0sCgl7ICJyYW5kIiwgICAgICAgICBzbXBfZmV0Y2hfcmFuZCwgIEFSRzEoMCxVSU5UKSwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1VTRV9JTlRSTiB9LAoJeyAic3RvcHBpbmciLCAgICAgc21wX2ZldGNoX3N0b3BwaW5nLCAwLCAgICAgICAgIE5VTEwsIFNNUF9UX0JPT0wsIFNNUF9VU0VfSU5UUk4gfSwKCXsgLyogRU5EICovIH0sCn19OwoKLyogTm90ZTogbXVzdCBub3QgYmUgZGVjbGFyZWQgPGNvbnN0PiBhcyBpdHMgbGlzdCB3aWxsIGJlIG92ZXJ3cml0dGVuICovCnN0YXRpYyBzdHJ1Y3Qgc2FtcGxlX2NvbnZfa3dfbGlzdCBzYW1wbGVfY29udl9rd3MgPSB7SUxILCB7Cgl7ICJiYXNlNjQiLCBzYW1wbGVfY29udl9iaW4yYmFzZTY0LDAsICAgICAgICAgICAgTlVMTCwgU01QX1RfQklOLCAgU01QX1RfU1RSICB9LAoJeyAidXBwZXIiLCAgc2FtcGxlX2NvbnZfc3RyMnVwcGVyLCAwLCAgICAgICAgICAgIE5VTEwsIFNNUF9UX1NUUiwgIFNNUF9UX1NUUiAgfSwKCXsgImxvd2VyIiwgIHNhbXBsZV9jb252X3N0cjJsb3dlciwgMCwgICAgICAgICAgICBOVUxMLCBTTVBfVF9TVFIsICBTTVBfVF9TVFIgIH0sCgl7ICJoZXgiLCAgICBzYW1wbGVfY29udl9iaW4yaGV4LCAgIDAsICAgICAgICAgICAgTlVMTCwgU01QX1RfQklOLCAgU01QX1RfU1RSICB9LAoJeyAiaXBtYXNrIiwgc2FtcGxlX2NvbnZfaXBtYXNrLCAgICBBUkcxKDEsTVNLNCksIE5VTEwsIFNNUF9UX0lQVjQsIFNNUF9UX0lQVjQgfSwKCXsgImx0aW1lIiwgIHNhbXBsZV9jb252X2x0aW1lLCAgICAgQVJHMigxLFNUUixTSU5UKSwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfU1RSIH0sCgl7ICJ1dGltZSIsICBzYW1wbGVfY29udl91dGltZSwgICAgIEFSRzIoMSxTVFIsU0lOVCksIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX1NUUiB9LAoJeyAiY3JjMzIiLCAgc2FtcGxlX2NvbnZfY3JjMzIsICAgICBBUkcxKDAsVUlOVCksIE5VTEwsIFNNUF9UX0JJTiwgIFNNUF9UX1VJTlQgfSwKCXsgImRqYjIiLCAgIHNhbXBsZV9jb252X2RqYjIsICAgICAgQVJHMSgwLFVJTlQpLCBOVUxMLCBTTVBfVF9CSU4sICBTTVBfVF9VSU5UIH0sCgl7ICJzZGJtIiwgICBzYW1wbGVfY29udl9zZGJtLCAgICAgIEFSRzEoMCxVSU5UKSwgTlVMTCwgU01QX1RfQklOLCAgU01QX1RfVUlOVCB9LAoJeyAid3Q2IiwgICAgc2FtcGxlX2NvbnZfd3Q2LCAgICAgICBBUkcxKDAsVUlOVCksIE5VTEwsIFNNUF9UX0JJTiwgIFNNUF9UX1VJTlQgfSwKCXsgImpzb24iLCAgIHNhbXBsZV9jb252X2pzb24sICAgICAgQVJHMSgxLFNUUiksICBzYW1wbGVfY29udl9qc29uX2NoZWNrLCBTTVBfVF9TVFIsICBTTVBfVF9TVFIgfSwKCXsgImJ5dGVzIiwgIHNhbXBsZV9jb252X2J5dGVzLCAgICAgQVJHMigxLFVJTlQsVUlOVCksIE5VTEwsIFNNUF9UX0JJTiwgIFNNUF9UX0JJTiB9LAoJeyAiZmllbGQiLCAgc2FtcGxlX2NvbnZfZmllbGQsICAgICBBUkcyKDIsVUlOVCxTVFIpLCBzYW1wbGVfY29udl9maWVsZF9jaGVjaywgU01QX1RfU1RSLCAgU01QX1RfU1RSIH0sCgl7ICJ3b3JkIiwgICBzYW1wbGVfY29udl93b3JkLCAgICAgIEFSRzIoMixVSU5ULFNUUiksIHNhbXBsZV9jb252X2ZpZWxkX2NoZWNrLCBTTVBfVF9TVFIsICBTTVBfVF9TVFIgfSwKCXsgInJlZ3N1YiIsIHNhbXBsZV9jb252X3JlZ3N1YiwgICAgQVJHMygyLFJFRyxTVFIsU1RSKSwgc2FtcGxlX2NvbnZfcmVnc3ViX2NoZWNrLCBTTVBfVF9TVFIsIFNNUF9UX1NUUiB9LAoKCXsgImFuZCIsICAgIHNhbXBsZV9jb252X2JpbmFyeV9hbmQsIEFSRzEoMSxVSU5UKSwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfVUlOVCB9LAoJeyAib3IiLCAgICAgc2FtcGxlX2NvbnZfYmluYXJ5X29yLCAgQVJHMSgxLFVJTlQpLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9VSU5UIH0sCgl7ICJ4b3IiLCAgICBzYW1wbGVfY29udl9iaW5hcnlfeG9yLCBBUkcxKDEsVUlOVCksIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX1VJTlQgfSwKCXsgImNwbCIsICAgIHNhbXBsZV9jb252X2JpbmFyeV9jcGwsICAgICAgICAgICAgMCwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfVUlOVCB9LAoJeyAiYm9vbCIsICAgc2FtcGxlX2NvbnZfYXJpdGhfYm9vbCwgICAgICAgICAgICAwLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9CT09MIH0sCgl7ICJub3QiLCAgICBzYW1wbGVfY29udl9hcml0aF9ub3QsICAgICAgICAgICAgIDAsIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX0JPT0wgfSwKCXsgIm9kZCIsICAgIHNhbXBsZV9jb252X2FyaXRoX29kZCwgICAgICAgICAgICAgMCwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfQk9PTCB9LAoJeyAiZXZlbiIsICAgc2FtcGxlX2NvbnZfYXJpdGhfZXZlbiwgICAgICAgICAgICAwLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9CT09MIH0sCgl7ICJhZGQiLCAgICBzYW1wbGVfY29udl9hcml0aF9hZGQsICBBUkcxKDEsVUlOVCksIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX1VJTlQgfSwKCXsgInN1YiIsICAgIHNhbXBsZV9jb252X2FyaXRoX3N1YiwgIEFSRzEoMSxVSU5UKSwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfVUlOVCB9LAoJeyAibXVsIiwgICAgc2FtcGxlX2NvbnZfYXJpdGhfbXVsLCAgQVJHMSgxLFVJTlQpLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9VSU5UIH0sCgl7ICJkaXYiLCAgICBzYW1wbGVfY29udl9hcml0aF9kaXYsICBBUkcxKDEsVUlOVCksIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX1VJTlQgfSwKCXsgIm1vZCIsICAgIHNhbXBsZV9jb252X2FyaXRoX21vZCwgIEFSRzEoMSxVSU5UKSwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfVUlOVCB9LAoJeyAibmVnIiwgICAgc2FtcGxlX2NvbnZfYXJpdGhfbmVnLCAgICAgICAgICAgICAwLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9VSU5UIH0sCgoJeyBOVUxMLCBOVUxMLCAwLCAwLCAwIH0sCn19OwoKX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKQpzdGF0aWMgdm9pZCBfX3NhbXBsZV9pbml0KHZvaWQpCnsKCS8qIHJlZ2lzdGVyIHNhbXBsZSBmZXRjaCBhbmQgZm9ybWF0IGNvbnZlcnNpb24ga2V5d29yZHMgKi8KCXNhbXBsZV9yZWdpc3Rlcl9mZXRjaGVzKCZzbXBfa3dzKTsKCXNhbXBsZV9yZWdpc3Rlcl9jb252cygmc2FtcGxlX2NvbnZfa3dzKTsKfQo=