Lyogdm1zLWhkci5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVk1TL1ZBWCAob3BlblZNUy9WQVgpIGFuZAogICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgogICBIRFIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBFTUggcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBhbmQKICAgRU9NIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKICAgRUVPTSByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCgogICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCgpUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQp0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwoKI2luY2x1ZGUgImJmZC5oIgojaW5jbHVkZSAic3lzZGVwLmgiCiNpbmNsdWRlICJiZmRsaW5rLmgiCiNpbmNsdWRlICJzYWZlLWN0eXBlLmgiCiNpbmNsdWRlICJsaWJiZmQuaCIKCiNpbmNsdWRlICJ2bXMuaCIKCiNpZmRlZiBIQVZFX0FMTE9DQV9ICiNpbmNsdWRlIDxhbGxvY2EuaD4KI2VuZGlmCgpzdGF0aWMgdW5zaWduZWQgY2hhciAqZ2V0X3Ztc190aW1lX3N0cmluZyBQQVJBTVMgKCh2b2lkKSk7CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyogUmVhZCAmIHByb2Nlc3MgZW1oIHJlY29yZAogICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAgKi8KCmludApfYmZkX3Ztc19zbHVycF9oZHIgKGFiZmQsIG9ianR5cGUpCiAgICAgYmZkICphYmZkOwogICAgIGludCBvYmp0eXBlOwp7CiAgdW5zaWduZWQgY2hhciAqcHRyOwogIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7CiAgaW50IHN1YnR5cGU7CgogIHZtc19yZWMgPSBQUklWKHZtc19yZWMpOwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZygyLCAiSERSL0VNSFxuIik7CiNlbmRpZgoKICBzd2l0Y2ggKG9ianR5cGUpCiAgICB7CiAgICAgIGNhc2UgT0JKX1NfQ19IRFI6CglzdWJ0eXBlID0gdm1zX3JlY1sxXTsKCWJyZWFrOwogICAgICBjYXNlIEVPQkpfU19DX0VNSDoKCXN1YnR5cGUgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgNCkgKyBFVkFYX09GRlNFVDsKCWJyZWFrOwogICAgICBkZWZhdWx0OgoJc3VidHlwZSA9IC0xOwogICAgfQoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZygzLCAic3VidHlwZSAlZFxuIiwgc3VidHlwZSk7CiNlbmRpZgoKICBzd2l0Y2ggKHN1YnR5cGUpCiAgICB7CgogICAgICBjYXNlIE1IRF9TX0NfTUhEOgoJLyoKCSAqIG1vZHVsZSBoZWFkZXIKCSAqLwoJUFJJVihoZHJfZGF0YSkuaGRyX2Jfc3RybHZsID0gdm1zX3JlY1syXTsKCVBSSVYoaGRyX2RhdGEpLmhkcl9sX3JlY3NpeiA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyAzKTsKCVBSSVYoaGRyX2RhdGEpLmhkcl90X25hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjICsgNSk7CglwdHIgPSB2bXNfcmVjICsgNSArIHZtc19yZWNbNV0gKyAxOwoJUFJJVihoZHJfZGF0YSkuaGRyX3RfdmVyc2lvbiA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7CglwdHIgKz0gKnB0ciArIDE7CglQUklWKGhkcl9kYXRhKS5oZHJfdF9kYXRlID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHB0ciwgMTcpOwoKICAgICAgYnJlYWs7CgogICAgICBjYXNlIE1IRF9TX0NfTE5NOgoJLyoKCSAqCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9jX2xubSA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtMikpOwogICAgICBicmVhazsKCiAgICAgIGNhc2UgTUhEX1NfQ19TUkM6CgkvKgoJICoKCSAqLwoJUFJJVihoZHJfZGF0YSkuaGRyX2Nfc3JjID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC0yKSk7CiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBNSERfU19DX1RUTDoKCS8qCgkgKgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfY190dGwgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTIpKTsKICAgICAgYnJlYWs7CgogICAgICBjYXNlIE1IRF9TX0NfQ1BSOgoJLyoKCSAqCgkgKi8KICAgICAgYnJlYWs7CgogICAgICBjYXNlIE1IRF9TX0NfTVRDOgoJLyoKCSAqCgkgKi8KICAgICAgYnJlYWs7CgogICAgICBjYXNlIE1IRF9TX0NfR1RYOgoJLyoKCSAqCgkgKi8KICAgICAgYnJlYWs7CgogICAgICBjYXNlIEVNSF9TX0NfTUhEICsgRVZBWF9PRkZTRVQ6CgkvKgoJICogbW9kdWxlIGhlYWRlcgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfYl9zdHJsdmwgPSB2bXNfcmVjWzZdOwoJUFJJVihoZHJfZGF0YSkuaGRyX2xfYXJjaDEgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgOCk7CglQUklWKGhkcl9kYXRhKS5oZHJfbF9hcmNoMiA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxMik7CglQUklWKGhkcl9kYXRhKS5oZHJfbF9yZWNzaXogPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTYpOwoJUFJJVihoZHJfZGF0YSkuaGRyX3RfbmFtZSA9CgkgIF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMgKyAyMCk7CglwdHIgPSB2bXNfcmVjICsgMjAgKyB2bXNfcmVjWzIwXSArIDE7CglQUklWKGhkcl9kYXRhKS5oZHJfdF92ZXJzaW9uID0KCSAgX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKCXB0ciArPSAqcHRyICsgMTsKCVBSSVYoaGRyX2RhdGEpLmhkcl90X2RhdGUgPQoJICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAocHRyLCAxNyk7CgogICAgICBicmVhazsKCiAgICAgIGNhc2UgRU1IX1NfQ19MTk0gKyBFVkFYX09GRlNFVDoKCS8qCgkgKgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfY19sbm0gPQoJICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTYpKTsKICAgICAgYnJlYWs7CgogICAgICBjYXNlIEVNSF9TX0NfU1JDICsgRVZBWF9PRkZTRVQ6CgkvKgoJICoKCSAqLwoJUFJJVihoZHJfZGF0YSkuaGRyX2Nfc3JjID0KCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC02KSk7CiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBFTUhfU19DX1RUTCArIEVWQVhfT0ZGU0VUOgoJLyoKCSAqCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3R0bCA9CgkgIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtNikpOwogICAgICBicmVhazsKCiAgICAgIGNhc2UgRU1IX1NfQ19DUFIgKyBFVkFYX09GRlNFVDoKCS8qCgkgKgoJICovCiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBFTUhfU19DX01UQyArIEVWQVhfT0ZGU0VUOgoJLyoKCSAqCgkgKi8KICAgICAgYnJlYWs7CgogICAgICBjYXNlIEVNSF9TX0NfR1RYICsgRVZBWF9PRkZTRVQ6CgkvKgoJICoKCSAqLwogICAgICBicmVhazsKCiAgICAgIGRlZmF1bHQ6CgliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKICAgICAgcmV0dXJuIC0xOwoKICAgIH0gLyogc3dpdGNoICovCgogIHJldHVybiAwOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogT3V0cHV0IHJvdXRpbmVzLiAgKi8KCi8qIE1hbnVmYWN1cmUgYSBWTVMgbGlrZSB0aW1lIG9uIGEgdW5peCBiYXNlZCBzeXN0ZW0uCiAgIHN0b2xlbiBmcm9tIG9iai12bXMuYyAgKi8KCnN0YXRpYyB1bnNpZ25lZCBjaGFyICoKZ2V0X3Ztc190aW1lX3N0cmluZyAoKQp7CiAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdGJ1ZlsxOF07CiNpZm5kZWYgVk1TCiNpbmNsdWRlIDx0aW1lLmg+CgogIGNoYXIgKnBudDsKICB0aW1lX3QgdGltZWI7CiAgdGltZSAoJnRpbWViKTsKICBwbnQgPSBjdGltZSAoJnRpbWViKTsKICBwbnRbM10gPSAwOwogIHBudFs3XSA9IDA7CiAgcG50WzEwXSA9IDA7CiAgcG50WzE2XSA9IDA7CiAgcG50WzI0XSA9IDA7CiAgc3ByaW50ZiAodGJ1ZiwgIiUycy0lM3MtJXMgJXMiLCBwbnQgKyA4LCBwbnQgKyA0LCBwbnQgKyAyMCwgcG50ICsgMTEpOwojZWxzZQojaW5jbHVkZSA8c3RhcmxldC5oPgogIHN0cnVjdAogIHsKICAgIGludCBTaXplOwogICAgdW5zaWduZWQgY2hhciAqUHRyOwogIH0gRGVzY3JpcHRvcjsKICBEZXNjcmlwdG9yLlNpemUgPSAxNzsKICBEZXNjcmlwdG9yLlB0ciA9IHRidWY7CiAgU1lTJEFTQ1RJTSAoMCwgJkRlc2NyaXB0b3IsIDAsIDApOwojZW5kaWYgLyogbm90IFZNUyAqLwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZyAoNiwgInZtc3RpbWVzdHJpbmc6JyVzJ1xuIiwgdGJ1Zik7CiNlbmRpZgoKICByZXR1cm4gdGJ1ZjsKfQoKLyogd3JpdGUgb2JqZWN0IGhlYWRlciBmb3IgYmZkIGFiZmQgICovCgppbnQKX2JmZF92bXNfd3JpdGVfaGRyIChhYmZkLCBvYmp0eXBlKQogICAgIGJmZCAqYWJmZDsKICAgICBpbnQgb2JqdHlwZTsKewogIGFzeW1ib2wgKnN5bWJvbDsKICB1bnNpZ25lZCBpbnQgc3ltbnVtOwogIGludCBoYWRfY2FzZSA9IDA7CiAgaW50IGhhZF9maWxlID0gMDsKCiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfaGRyICglcClcbiIsIGFiZmQpOwojZW5kaWYKCiAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgMik7CgogIC8qIE1IRCAqLwoKICBpZiAob2JqdHlwZSA9PSBPQkpfU19DX0hEUikKICAgIHsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX01IRCk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgRU9CSl9TX0NfU1RSTFZMKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCBNQVhfT1VUUkVDX1NJWkUpOwogICAgfQoKICBpZiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkgIT0gMCkKICAgIHsKICAgICAgLyogc3RyaXAgcGF0aCBhbmQgc3VmZml4IGluZm9ybWF0aW9uICovCgogICAgICBjaGFyICpmbmFtZSwgKmZvdXQsICpmcHRyOwoKICAgICAgZnB0ciA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwogICAgICBmbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChmcHRyKSArIDEpOwogICAgICBzdHJjcHkgKGZuYW1lLCBmcHRyKTsKICAgICAgZm91dCA9IHN0cnJjaHIgKGZuYW1lLCAnXScpOwogICAgICBpZiAoZm91dCA9PSAwKQoJZm91dCA9IHN0cmNociAoZm5hbWUsICc6Jyk7CiAgICAgIGlmIChmb3V0ICE9IDApCglmb3V0Kys7CiAgICAgIGVsc2UKCWZvdXQgPSBmbmFtZTsKCiAgICAgIC8qIHN0cmlwIC5vYmogc3VmZml4ICAqLwoKICAgICAgZnB0ciA9IHN0cnJjaHIgKGZuYW1lLCAnLicpOwogICAgICBpZiAoKGZwdHIgIT0gMCkKCSAgJiYgKHN0cmNhc2VjbXAgKGZwdHIsICIuT0JKIikgPT0gMCkpCgkqZnB0ciA9IDA7CgogICAgICBmcHRyID0gZm91dDsKICAgICAgd2hpbGUgKCpmcHRyICE9IDApCgl7CgkgICpmcHRyID0gVE9VUFBFUiAoKmZwdHIpOwoJICBmcHRyKys7CgkgIGlmICgoKmZwdHIgPT0gJzsnKQoJICAgICB8fCAoKGZwdHIgLSBmb3V0KSA+IDMxKSkKCSAgICAqZnB0ciA9IDA7Cgl9CiAgICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBmb3V0KTsKICAgIH0KICBlbHNlCiAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgIk5PTkFNRSIpOwoKICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgQkZEX1ZFUlNJT05fU1RSSU5HKTsKICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgZ2V0X3Ztc190aW1lX3N0cmluZyAoKSwgMTcpOwogIF9iZmRfdm1zX291dHB1dF9maWxsIChhYmZkLCAwLCAxNyk7CiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgLyogTE1OICovCgogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX0xOTSk7CiAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIkdBUyBwcm9HSVMiLCAxMCk7CiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgLyogU1JDICovCgogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX1NSQyk7CgogIGZvciAoc3ltbnVtID0gMDsgc3ltbnVtIDwgYWJmZC0+c3ltY291bnQ7IHN5bW51bSsrKQogICAgewogICAgICBzeW1ib2wgPSBhYmZkLT5vdXRzeW1ib2xzW3N5bW51bV07CgogICAgICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9GSUxFKQoJewoJICBpZiAoc3RybmNtcCAoKGNoYXIgKilzeW1ib2wtPm5hbWUsICI8Q0FTRToiLCA2KSA9PSAwKQoJICAgIHsKCSAgICAgIFBSSVYoZmxhZ19oYXNoX2xvbmdfbmFtZXMpID0gc3ltYm9sLT5uYW1lWzZdIC0gJzAnOwoJICAgICAgUFJJVihmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpID0gc3ltYm9sLT5uYW1lWzddIC0gJzAnOwoKCSAgICAgIGlmIChoYWRfZmlsZSkKCQlicmVhazsKCSAgICAgIGhhZF9jYXNlID0gMTsKCSAgICAgIGNvbnRpbnVlOwoJICAgIH0KCgkgIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSBzeW1ib2wtPm5hbWUsCgkJCQkoaW50KSBzdHJsZW4gKHN5bWJvbC0+bmFtZSkpOwoJICBpZiAoaGFkX2Nhc2UpCgkgICAgYnJlYWs7CgkgIGhhZF9maWxlID0gMTsKCX0KICAgIH0KCiAgaWYgKHN5bW51bSA9PSBhYmZkLT5zeW1jb3VudCkKICAgIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSJub25hbWUiLCA2KTsKCiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgLyogVFRMICovCgogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX1RUTCk7CiAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIlRUTCIsIDMpOwogIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CgogIC8qIENQUiAqLwoKICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19DUFIpOwogIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLAoJCQkgKHVuc2lnbmVkIGNoYXIgKikiR05VIEJGRCBwb3J0ZWQgYnkgS2xhdXMgS+RtcGYgMTk5NC0xOTk2IiwKCQkJIDM5KTsKICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwoKICByZXR1cm4gMDsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBQcm9jZXNzIEVPTS9FRU9NIHJlY29yZAogICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAgKi8KCmludApfYmZkX3Ztc19zbHVycF9lb20gKGFiZmQsIG9ianR5cGUpCiAgICAgYmZkICphYmZkOwogICAgIGludCBvYmp0eXBlOwp7CiAgdW5zaWduZWQgY2hhciAqdm1zX3JlYzsKCiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcoMiwgIkVPTS9FRU9NXG4iKTsKI2VuZGlmCgogIHZtc19yZWMgPSBQUklWKHZtc19yZWMpOwoKICBpZiAoKG9ianR5cGUgPT0gT0JKX1NfQ19FT00pCiAgICAgfHwgKG9ianR5cGUgPT0gT0JKX1NfQ19FT01XKSkKICAgIHsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIFBSSVYoZW9tX2RhdGEpLmVvbV9sX3RvdGFsX2xwcyA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA0KTsKICAgICAgUFJJVihlb21fZGF0YSkuZW9tX2JfY29tY29kID0gKih2bXNfcmVjICsgOCk7CiAgICAgIGlmIChQUklWKGVvbV9kYXRhKS5lb21fYl9jb21jb2QgPiAxKQoJewoJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk9iamVjdCBtb2R1bGUgTk9UIGVycm9yLWZyZWUgIVxuIikpOwoJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKCSAgcmV0dXJuIC0xOwoJfQogICAgICBQUklWKGVvbV9kYXRhKS5lb21faGFzX3RyYW5zZmVyID0gZmFsc2U7CiAgICAgIGlmIChQUklWKHJlY19zaXplKSA+IDEwKQoJewoJICAgUFJJVihlb21fZGF0YSkuZW9tX2hhc190cmFuc2ZlciA9IHRydWU7CgkgICBQUklWKGVvbV9kYXRhKS5lb21fYl90ZnJmbGcgPSAqKHZtc19yZWMgKyA5KTsKCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9sX3BzaW5keCA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxMik7CgkgICBQUklWKGVvbV9kYXRhKS5lb21fbF90ZnJhZHIgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTYpOwoKCSAgIGFiZmQtPnN0YXJ0X2FkZHJlc3MgPSBQUklWKGVvbV9kYXRhKS5lb21fbF90ZnJhZHI7Cgl9CiAgICB9CiAgcmV0dXJuIDA7Cn0KCi8qIFdyaXRlIGVvbSByZWNvcmQgZm9yIGJmZCBhYmZkICAqLwoKaW50Cl9iZmRfdm1zX3dyaXRlX2VvbSAoYWJmZCwgb2JqdHlwZSkKICAgICBiZmQgKmFiZmQ7CiAgICAgaW50IG9ianR5cGU7CnsKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZyAoMiwgInZtc193cml0ZV9lb20gKCVwLCAlZClcbiIsIGFiZmQsIG9ianR5cGUpOwojZW5kaWYKCiAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBvYmp0eXBlLCAtMSk7CiAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsICh1bnNpZ25lZCBsb25nKSAoUFJJVih2bXNfbGlua2FnZV9pbmRleCkgPj4gMSkpOwogIF9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCAwKTsJLyogY29tcGxldGlvbiBjb2RlICovCiAgX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIDApOwkvKiBmaWxsIGJ5dGUgKi8KCiAgaWYgKGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgIT0gKGJmZF92bWEpLTEpCiAgICB7CiAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwoKICAgICAgc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxpbmsiKTsKICAgICAgaWYgKHNlY3Rpb24gPT0gMCkKCXsKCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7CgkgIHJldHVybiAtMTsKCX0KICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCAwKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsICh1bnNpZ25lZCBsb25nKSAoc2VjdGlvbi0+aW5kZXgpKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsCgkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkpOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7CiAgICB9CgogIF9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpOwogIHJldHVybiAwOwp9Cg==