Lyogdm1zLWhkci5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVk1TL1ZBWCAob3BlblZNUy9WQVgpIGFuZAogICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgogICBIRFIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBFTUggcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBhbmQKICAgRU9NIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKICAgRUVPTSByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCgogICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCgpUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQp0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwoKI2luY2x1ZGUgPGN0eXBlLmg+CgojaW5jbHVkZSAiYmZkLmgiCiNpbmNsdWRlICJzeXNkZXAuaCIKI2luY2x1ZGUgImJmZGxpbmsuaCIKI2luY2x1ZGUgImxpYmJmZC5oIgoKI2luY2x1ZGUgInZtcy5oIgoKI2lmZGVmIEhBVkVfQUxMT0NBX0gKI2luY2x1ZGUgPGFsbG9jYS5oPgojZW5kaWYKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyogUmVhZCAmIHByb2Nlc3MgZW1oIHJlY29yZAogICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAgKi8KCmludApfYmZkX3Ztc19zbHVycF9oZHIgKGFiZmQsIG9ianR5cGUpCiAgICAgYmZkICphYmZkOwogICAgIGludCBvYmp0eXBlOwp7CiAgdW5zaWduZWQgY2hhciAqcHRyOwogIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7CiAgaW50IHN1YnR5cGU7CgogIHZtc19yZWMgPSBQUklWKHZtc19yZWMpOwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZygyLCAiSERSL0VNSFxuIik7CiNlbmRpZgoKICBzd2l0Y2ggKG9ianR5cGUpCiAgICB7CiAgICAgIGNhc2UgT0JKX1NfQ19IRFI6CglzdWJ0eXBlID0gdm1zX3JlY1sxXTsKCWJyZWFrOwogICAgICBjYXNlIEVPQkpfU19DX0VNSDoKCXN1YnR5cGUgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgNCkgKyBFVkFYX09GRlNFVDsKCWJyZWFrOwogICAgICBkZWZhdWx0OgoJc3VidHlwZSA9IC0xOwogICAgfQoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZygzLCAic3VidHlwZSAlZFxuIiwgc3VidHlwZSk7CiNlbmRpZgoKICBzd2l0Y2ggKHN1YnR5cGUpCiAgICB7CgogICAgICBjYXNlIE1IRF9TX0NfTUhEOgoJLyoKCSAqIG1vZHVsZSBoZWFkZXIKCSAqLwoJUFJJVihoZHJfZGF0YSkuaGRyX2Jfc3RybHZsID0gdm1zX3JlY1syXTsKCVBSSVYoaGRyX2RhdGEpLmhkcl9sX3JlY3NpeiA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyAzKTsKCVBSSVYoaGRyX2RhdGEpLmhkcl90X25hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjICsgNSk7CglwdHIgPSB2bXNfcmVjICsgNSArIHZtc19yZWNbNV0gKyAxOwoJUFJJVihoZHJfZGF0YSkuaGRyX3RfdmVyc2lvbiA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7CglwdHIgKz0gKnB0ciArIDE7CglQUklWKGhkcl9kYXRhKS5oZHJfdF9kYXRlID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHB0ciwgMTcpOwoKICAgICAgYnJlYWs7CgogICAgICBjYXNlIE1IRF9TX0NfTE5NOgoJLyoKCSAqCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9jX2xubSA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtMikpOwogICAgICBicmVhazsKCiAgICAgIGNhc2UgTUhEX1NfQ19TUkM6CgkvKgoJICoKCSAqLwoJUFJJVihoZHJfZGF0YSkuaGRyX2Nfc3JjID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC0yKSk7CiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBNSERfU19DX1RUTDoKCS8qCgkgKgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfY190dGwgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTIpKTsKICAgICAgYnJlYWs7CgogICAgICBjYXNlIE1IRF9TX0NfQ1BSOgoJLyoKCSAqCgkgKi8KICAgICAgYnJlYWs7CgogICAgICBjYXNlIE1IRF9TX0NfTVRDOgoJLyoKCSAqCgkgKi8KICAgICAgYnJlYWs7CgogICAgICBjYXNlIE1IRF9TX0NfR1RYOgoJLyoKCSAqCgkgKi8KICAgICAgYnJlYWs7CgogICAgICBjYXNlIEVNSF9TX0NfTUhEICsgRVZBWF9PRkZTRVQ6CgkvKgoJICogbW9kdWxlIGhlYWRlcgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfYl9zdHJsdmwgPSB2bXNfcmVjWzZdOwoJUFJJVihoZHJfZGF0YSkuaGRyX2xfYXJjaDEgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgOCk7CglQUklWKGhkcl9kYXRhKS5oZHJfbF9hcmNoMiA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxMik7CglQUklWKGhkcl9kYXRhKS5oZHJfbF9yZWNzaXogPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTYpOwoJUFJJVihoZHJfZGF0YSkuaGRyX3RfbmFtZSA9CgkgIF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMgKyAyMCk7CglwdHIgPSB2bXNfcmVjICsgMjAgKyB2bXNfcmVjWzIwXSArIDE7CglQUklWKGhkcl9kYXRhKS5oZHJfdF92ZXJzaW9uID0KCSAgX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKCXB0ciArPSAqcHRyICsgMTsKCVBSSVYoaGRyX2RhdGEpLmhkcl90X2RhdGUgPQoJICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAocHRyLCAxNyk7CgogICAgICBicmVhazsKCiAgICAgIGNhc2UgRU1IX1NfQ19MTk0gKyBFVkFYX09GRlNFVDoKCS8qCgkgKgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfY19sbm0gPQoJICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTYpKTsKICAgICAgYnJlYWs7CgogICAgICBjYXNlIEVNSF9TX0NfU1JDICsgRVZBWF9PRkZTRVQ6CgkvKgoJICoKCSAqLwoJUFJJVihoZHJfZGF0YSkuaGRyX2Nfc3JjID0KCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC02KSk7CiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBFTUhfU19DX1RUTCArIEVWQVhfT0ZGU0VUOgoJLyoKCSAqCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3R0bCA9CgkgIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtNikpOwogICAgICBicmVhazsKCiAgICAgIGNhc2UgRU1IX1NfQ19DUFIgKyBFVkFYX09GRlNFVDoKCS8qCgkgKgoJICovCiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBFTUhfU19DX01UQyArIEVWQVhfT0ZGU0VUOgoJLyoKCSAqCgkgKi8KICAgICAgYnJlYWs7CgogICAgICBjYXNlIEVNSF9TX0NfR1RYICsgRVZBWF9PRkZTRVQ6CgkvKgoJICoKCSAqLwogICAgICBicmVhazsKCiAgICAgIGRlZmF1bHQ6CgliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKICAgICAgcmV0dXJuIC0xOwoKICAgIH0gLyogc3dpdGNoICovCgogIHJldHVybiAwOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogT3V0cHV0IHJvdXRpbmVzLiAgKi8KCi8qIE1hbnVmYWN1cmUgYSBWTVMgbGlrZSB0aW1lIG9uIGEgdW5peCBiYXNlZCBzeXN0ZW0uCiAgIHN0b2xlbiBmcm9tIG9iai12bXMuYyAgKi8KCnN0YXRpYyB1bnNpZ25lZCBjaGFyICoKZ2V0X3Ztc190aW1lX3N0cmluZyAoKQp7CiAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdGJ1ZlsxOF07CiNpZm5kZWYgVk1TCiNpbmNsdWRlIDx0aW1lLmg+CgogIGNoYXIgKnBudDsKICB0aW1lX3QgdGltZWI7CiAgdGltZSAoJnRpbWViKTsKICBwbnQgPSBjdGltZSAoJnRpbWViKTsKICBwbnRbM10gPSAwOwogIHBudFs3XSA9IDA7CiAgcG50WzEwXSA9IDA7CiAgcG50WzE2XSA9IDA7CiAgcG50WzI0XSA9IDA7CiAgc3ByaW50ZiAodGJ1ZiwgIiUycy0lM3MtJXMgJXMiLCBwbnQgKyA4LCBwbnQgKyA0LCBwbnQgKyAyMCwgcG50ICsgMTEpOwojZWxzZQojaW5jbHVkZSA8c3RhcmxldC5oPgogIHN0cnVjdAogIHsKICAgIGludCBTaXplOwogICAgdW5zaWduZWQgY2hhciAqUHRyOwogIH0gRGVzY3JpcHRvcjsKICBEZXNjcmlwdG9yLlNpemUgPSAxNzsKICBEZXNjcmlwdG9yLlB0ciA9IHRidWY7CiAgU1lTJEFTQ1RJTSAoMCwgJkRlc2NyaXB0b3IsIDAsIDApOwojZW5kaWYgLyogbm90IFZNUyAqLwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZyAoNiwgInZtc3RpbWVzdHJpbmc6JyVzJ1xuIiwgdGJ1Zik7CiNlbmRpZgoKICByZXR1cm4gdGJ1ZjsKfQoKLyogd3JpdGUgb2JqZWN0IGhlYWRlciBmb3IgYmZkIGFiZmQgICovCgppbnQKX2JmZF92bXNfd3JpdGVfaGRyIChhYmZkLCBvYmp0eXBlKQogICAgIGJmZCAqYWJmZDsKICAgICBpbnQgb2JqdHlwZTsKewogIGFzeW1ib2wgKnN5bWJvbDsKICB1bnNpZ25lZCBpbnQgc3ltbnVtOwogIGludCBoYWRfY2FzZSA9IDA7CiAgaW50IGhhZF9maWxlID0gMDsKCiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfaGRyICglcClcbiIsIGFiZmQpOwojZW5kaWYKCiAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgMik7CgogIC8qIE1IRCAqLwoKICBpZiAob2JqdHlwZSA9PSBPQkpfU19DX0hEUikKICAgIHsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX01IRCk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgRU9CSl9TX0NfU1RSTFZMKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCBNQVhfT1VUUkVDX1NJWkUpOwogICAgfQoKICBpZiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkgIT0gMCkKICAgIHsKICAgICAgLyogc3RyaXAgcGF0aCBhbmQgc3VmZml4IGluZm9ybWF0aW9uICovCgogICAgICBjaGFyICpmbmFtZSwgKmZvdXQsICpmcHRyOwoKICAgICAgZnB0ciA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwogICAgICBmbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChmcHRyKSArIDEpOwogICAgICBzdHJjcHkgKGZuYW1lLCBmcHRyKTsKICAgICAgZm91dCA9IHN0cnJjaHIgKGZuYW1lLCAnXScpOwogICAgICBpZiAoZm91dCA9PSAwKQoJZm91dCA9IHN0cmNociAoZm5hbWUsICc6Jyk7CiAgICAgIGlmIChmb3V0ICE9IDApCglmb3V0Kys7CiAgICAgIGVsc2UKCWZvdXQgPSBmbmFtZTsKCiAgICAgIC8qIHN0cmlwIC5vYmogc3VmZml4ICAqLwoKICAgICAgZnB0ciA9IHN0cnJjaHIgKGZuYW1lLCAnLicpOwogICAgICBpZiAoKGZwdHIgIT0gMCkKCSAgJiYgKHN0cmNhc2VjbXAgKGZwdHIsICIuT0JKIikgPT0gMCkpCgkqZnB0ciA9IDA7CgogICAgICBmcHRyID0gZm91dDsKICAgICAgd2hpbGUgKCpmcHRyICE9IDApCgl7CgkgIGlmIChpc2xvd2VyICgqZnB0cikpCgkgICAgKmZwdHIgPSB0b3VwcGVyICgqZnB0cik7CgkgIGZwdHIrKzsKCSAgaWYgKCgqZnB0ciA9PSAnOycpCgkgICAgIHx8ICgoZnB0ciAtIGZvdXQpID4gMzEpKQoJICAgICpmcHRyID0gMDsKCX0KICAgICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIGZvdXQpOwogICAgfQogIGVsc2UKICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCAiTk9OQU1FIik7CgogIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBCRkRfVkVSU0lPTik7CiAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsIGdldF92bXNfdGltZV9zdHJpbmcgKCksIDE3KTsKICBfYmZkX3Ztc19vdXRwdXRfZmlsbCAoYWJmZCwgMCwgMTcpOwogIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CgogIC8qIExNTiAqLwoKICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19MTk0pOwogIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSJHQVMgcHJvR0lTIiwgMTApOwogIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CgogIC8qIFNSQyAqLwoKICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19TUkMpOwoKICBmb3IgKHN5bW51bSA9IDA7IHN5bW51bSA8IGFiZmQtPnN5bWNvdW50OyBzeW1udW0rKykKICAgIHsKICAgICAgc3ltYm9sID0gYWJmZC0+b3V0c3ltYm9sc1tzeW1udW1dOwoKICAgICAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfRklMRSkKCXsKCSAgaWYgKHN0cm5jbXAgKChjaGFyICopc3ltYm9sLT5uYW1lLCAiPENBU0U6IiwgNikgPT0gMCkKCSAgICB7CgkgICAgICBQUklWKGZsYWdfaGFzaF9sb25nX25hbWVzKSA9IHN5bWJvbC0+bmFtZVs2XSAtICcwJzsKCSAgICAgIFBSSVYoZmxhZ19zaG93X2FmdGVyX3RydW5jKSA9IHN5bWJvbC0+bmFtZVs3XSAtICcwJzsKCgkgICAgICBpZiAoaGFkX2ZpbGUpCgkJYnJlYWs7CgkgICAgICBoYWRfY2FzZSA9IDE7CgkgICAgICBjb250aW51ZTsKCSAgICB9CgoJICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKilzeW1ib2wtPm5hbWUsIHN0cmxlbiAoc3ltYm9sLT5uYW1lKSk7CgkgIGlmIChoYWRfY2FzZSkKCSAgICBicmVhazsKCSAgaGFkX2ZpbGUgPSAxOwoJfQogICAgfQoKICBpZiAoc3ltbnVtID09IGFiZmQtPnN5bWNvdW50KQogICAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIm5vbmFtZSIsIDYpOwoKICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwoKICAvKiBUVEwgKi8KCiAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfVFRMKTsKICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikiVFRMIiwgMyk7CiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgLyogQ1BSICovCgogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX0NQUik7CiAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsCgkJCSAodW5zaWduZWQgY2hhciAqKSJHTlUgQkZEIHBvcnRlZCBieSBLbGF1cyBL5G1wZiAxOTk0LTE5OTYiLAoJCQkgMzkpOwogIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CgogIHJldHVybiAwOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIFByb2Nlc3MgRU9NL0VFT00gcmVjb3JkCiAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwoKaW50Cl9iZmRfdm1zX3NsdXJwX2VvbSAoYWJmZCwgb2JqdHlwZSkKICAgICBiZmQgKmFiZmQ7CiAgICAgaW50IG9ianR5cGU7CnsKICB1bnNpZ25lZCBjaGFyICp2bXNfcmVjOwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZygyLCAiRU9NL0VFT01cbiIpOwojZW5kaWYKCiAgdm1zX3JlYyA9IFBSSVYodm1zX3JlYyk7CgogIGlmICgob2JqdHlwZSA9PSBPQkpfU19DX0VPTSkKICAgICB8fCAob2JqdHlwZSA9PSBPQkpfU19DX0VPTVcpKQogICAgewogICAgfQogIGVsc2UKICAgIHsKICAgICAgUFJJVihlb21fZGF0YSkuZW9tX2xfdG90YWxfbHBzID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDQpOwogICAgICBQUklWKGVvbV9kYXRhKS5lb21fYl9jb21jb2QgPSAqKHZtc19yZWMgKyA4KTsKICAgICAgaWYgKFBSSVYoZW9tX2RhdGEpLmVvbV9iX2NvbWNvZCA+IDEpCgl7CgkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiT2JqZWN0IG1vZHVsZSBOT1QgZXJyb3ItZnJlZSAhXG4iKSk7CgkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwoJICByZXR1cm4gLTE7Cgl9CiAgICAgIFBSSVYoZW9tX2RhdGEpLmVvbV9oYXNfdHJhbnNmZXIgPSBmYWxzZTsKICAgICAgaWYgKFBSSVYocmVjX3NpemUpID4gMTApCgl7CgkgICBQUklWKGVvbV9kYXRhKS5lb21faGFzX3RyYW5zZmVyID0gdHJ1ZTsKCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9iX3RmcmZsZyA9ICoodm1zX3JlYyArIDkpOwoJICAgUFJJVihlb21fZGF0YSkuZW9tX2xfcHNpbmR4ID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDEyKTsKCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9sX3RmcmFkciA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxNik7CgoJICAgYWJmZC0+c3RhcnRfYWRkcmVzcyA9IFBSSVYoZW9tX2RhdGEpLmVvbV9sX3RmcmFkcjsKCX0KICAgIH0KICByZXR1cm4gMDsKfQoKLyogV3JpdGUgZW9tIHJlY29yZCBmb3IgYmZkIGFiZmQgICovCgppbnQKX2JmZF92bXNfd3JpdGVfZW9tIChhYmZkLCBvYmp0eXBlKQogICAgIGJmZCAqYWJmZDsKICAgICBpbnQgb2JqdHlwZTsKewojaWYgVk1TX0RFQlVHCiAgdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX2VvbSAoJXAsICVkKVxuIiwgYWJmZCwgb2JqdHlwZSk7CiNlbmRpZgoKICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIG9ianR5cGUsIC0xKTsKICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpIChQUklWKHZtc19saW5rYWdlX2luZGV4KSA+PiAxKSk7CiAgX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIDApOwkvKiBjb21wbGV0aW9uIGNvZGUgKi8KICBfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgMCk7CS8qIGZpbGwgYnl0ZSAqLwoKICBpZiAoYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSAhPSAoYmZkX3ZtYSktMSkKICAgIHsKICAgICAgYXNlY3Rpb24gKnNlY3Rpb247CgogICAgICBzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubGluayIpOwogICAgICBpZiAoc2VjdGlvbiA9PSAwKQoJewoJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKCSAgcmV0dXJuIC0xOwoJfQogICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIDApOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpIChzZWN0aW9uLT5pbmRleCkpOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKCQkJICAgICAodW5zaWduZWQgbG9uZykgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKICAgIH0KCiAgX2JmZF92bXNfb3V0cHV0X2VuZCAoYWJmZCk7CiAgcmV0dXJuIDA7Cn0K