Lyogdm1zLWhkci5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVk1TL1ZBWCAob3BlblZNUy9WQVgpIGFuZAogICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgogICBIRFIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBFTUggcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBhbmQKICAgRU9NIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKICAgRUVPTSByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCgogICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCgpUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQp0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwoKI2luY2x1ZGUgPGN0eXBlLmg+CgojaW5jbHVkZSAiYmZkLmgiCiNpbmNsdWRlICJzeXNkZXAuaCIKI2luY2x1ZGUgImJmZGxpbmsuaCIKI2luY2x1ZGUgImxpYmJmZC5oIgoKI2luY2x1ZGUgInZtcy5oIgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCi8qIFJlYWQgJiBwcm9jZXNzIGVtaCByZWNvcmQKICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IgICovCgppbnQKX2JmZF92bXNfc2x1cnBfaGRyIChhYmZkLCBvYmp0eXBlKQogICAgIGJmZCAqYWJmZDsKICAgICBpbnQgb2JqdHlwZTsKewogIHVuc2lnbmVkIGNoYXIgKnB0cjsKICB1bnNpZ25lZCBjaGFyICp2bXNfcmVjOwogIGludCBzdWJ0eXBlOwoKICB2bXNfcmVjID0gUFJJVih2bXNfcmVjKTsKCiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcoMiwgIkhEUi9FTUhcbiIpOwojZW5kaWYKCiAgc3dpdGNoIChvYmp0eXBlKQogICAgewogICAgICBjYXNlIE9CSl9TX0NfSERSOgoJc3VidHlwZSA9IHZtc19yZWNbMV07CglicmVhazsKICAgICAgY2FzZSBFT0JKX1NfQ19FTUg6CglzdWJ0eXBlID0gYmZkX2dldGwxNiAodm1zX3JlYyArIDQpICsgRVZBWF9PRkZTRVQ7CglicmVhazsKICAgICAgZGVmYXVsdDoKCXN1YnR5cGUgPSAtMTsKICAgIH0KCiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcoMywgInN1YnR5cGUgJWRcbiIsIHN1YnR5cGUpOwojZW5kaWYKCiAgc3dpdGNoIChzdWJ0eXBlKQogICAgewoKICAgICAgY2FzZSBNSERfU19DX01IRDoKCS8qCgkgKiBtb2R1bGUgaGVhZGVyCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9iX3N0cmx2bCA9IHZtc19yZWNbMl07CglQUklWKGhkcl9kYXRhKS5oZHJfbF9yZWNzaXogPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgMyk7CglQUklWKGhkcl9kYXRhKS5oZHJfdF9uYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyArIDUpOwoJcHRyID0gdm1zX3JlYyArIDUgKyB2bXNfcmVjWzVdICsgMTsKCVBSSVYoaGRyX2RhdGEpLmhkcl90X3ZlcnNpb24gPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwoJcHRyICs9ICpwdHIgKyAxOwoJUFJJVihoZHJfZGF0YSkuaGRyX3RfZGF0ZSA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIChwdHIsIDE3KTsKCiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBNSERfU19DX0xOTToKCS8qCgkgKgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfY19sbm0gPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTIpKTsKICAgICAgYnJlYWs7CgogICAgICBjYXNlIE1IRF9TX0NfU1JDOgoJLyoKCSAqCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3NyYyA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtMikpOwogICAgICBicmVhazsKCiAgICAgIGNhc2UgTUhEX1NfQ19UVEw6CgkvKgoJICoKCSAqLwoJUFJJVihoZHJfZGF0YSkuaGRyX2NfdHRsID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC0yKSk7CiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBNSERfU19DX0NQUjoKCS8qCgkgKgoJICovCiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBNSERfU19DX01UQzoKCS8qCgkgKgoJICovCiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBNSERfU19DX0dUWDoKCS8qCgkgKgoJICovCiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBFTUhfU19DX01IRCArIEVWQVhfT0ZGU0VUOgoJLyoKCSAqIG1vZHVsZSBoZWFkZXIKCSAqLwoJUFJJVihoZHJfZGF0YSkuaGRyX2Jfc3RybHZsID0gdm1zX3JlY1s2XTsKCVBSSVYoaGRyX2RhdGEpLmhkcl9sX2FyY2gxID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDgpOwoJUFJJVihoZHJfZGF0YSkuaGRyX2xfYXJjaDIgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTIpOwoJUFJJVihoZHJfZGF0YSkuaGRyX2xfcmVjc2l6ID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDE2KTsKCVBSSVYoaGRyX2RhdGEpLmhkcl90X25hbWUgPQoJICBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjICsgMjApOwoJcHRyID0gdm1zX3JlYyArIDIwICsgdm1zX3JlY1syMF0gKyAxOwoJUFJJVihoZHJfZGF0YSkuaGRyX3RfdmVyc2lvbiA9CgkgIF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7CglwdHIgKz0gKnB0ciArIDE7CglQUklWKGhkcl9kYXRhKS5oZHJfdF9kYXRlID0KCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHB0ciwgMTcpOwoKICAgICAgYnJlYWs7CgogICAgICBjYXNlIEVNSF9TX0NfTE5NICsgRVZBWF9PRkZTRVQ6CgkvKgoJICoKCSAqLwoJUFJJVihoZHJfZGF0YSkuaGRyX2NfbG5tID0KCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC02KSk7CiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBFTUhfU19DX1NSQyArIEVWQVhfT0ZGU0VUOgoJLyoKCSAqCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3NyYyA9CgkgIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtNikpOwogICAgICBicmVhazsKCiAgICAgIGNhc2UgRU1IX1NfQ19UVEwgKyBFVkFYX09GRlNFVDoKCS8qCgkgKgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfY190dGwgPQoJICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTYpKTsKICAgICAgYnJlYWs7CgogICAgICBjYXNlIEVNSF9TX0NfQ1BSICsgRVZBWF9PRkZTRVQ6CgkvKgoJICoKCSAqLwogICAgICBicmVhazsKCiAgICAgIGNhc2UgRU1IX1NfQ19NVEMgKyBFVkFYX09GRlNFVDoKCS8qCgkgKgoJICovCiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBFTUhfU19DX0dUWCArIEVWQVhfT0ZGU0VUOgoJLyoKCSAqCgkgKi8KICAgICAgYnJlYWs7CgogICAgICBkZWZhdWx0OgoJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CiAgICAgIHJldHVybiAtMTsKCiAgICB9IC8qIHN3aXRjaCAqLwoKICByZXR1cm4gMDsKfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBPdXRwdXQgcm91dGluZXMuICAqLwoKCi8qIE1hbnVmYWN1cmUgYSBWTVMgbGlrZSB0aW1lIG9uIGEgdW5peCBiYXNlZCBzeXN0ZW0uCiAgIHN0b2xlbiBmcm9tIG9iai12bXMuYyAgKi8KCnN0YXRpYyB1bnNpZ25lZCBjaGFyICoKZ2V0X3Ztc190aW1lX3N0cmluZyAoKQp7CiAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdGJ1ZlsxOF07CiNpZm5kZWYgVk1TCiNpbmNsdWRlIDx0aW1lLmg+CgogIGNoYXIgKnBudDsKICB0aW1lX3QgdGltZWI7CiAgdGltZSAoJnRpbWViKTsKICBwbnQgPSBjdGltZSAoJnRpbWViKTsKICBwbnRbM10gPSAwOwogIHBudFs3XSA9IDA7CiAgcG50WzEwXSA9IDA7CiAgcG50WzE2XSA9IDA7CiAgcG50WzI0XSA9IDA7CiAgc3ByaW50ZiAodGJ1ZiwgIiUycy0lM3MtJXMgJXMiLCBwbnQgKyA4LCBwbnQgKyA0LCBwbnQgKyAyMCwgcG50ICsgMTEpOwojZWxzZQojaW5jbHVkZSA8c3RhcmxldC5oPgogIHN0cnVjdAogIHsKICAgIGludCBTaXplOwogICAgdW5zaWduZWQgY2hhciAqUHRyOwogIH0gRGVzY3JpcHRvcjsKICBEZXNjcmlwdG9yLlNpemUgPSAxNzsKICBEZXNjcmlwdG9yLlB0ciA9IHRidWY7CiAgU1lTJEFTQ1RJTSAoMCwgJkRlc2NyaXB0b3IsIDAsIDApOwojZW5kaWYgLyogbm90IFZNUyAqLwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZyAoNiwgInZtc3RpbWVzdHJpbmc6JyVzJ1xuIiwgdGJ1Zik7CiNlbmRpZgoKICByZXR1cm4gdGJ1ZjsKfQoKCi8qIHdyaXRlIG9iamVjdCBoZWFkZXIgZm9yIGJmZCBhYmZkICAqLwoKaW50Cl9iZmRfdm1zX3dyaXRlX2hkciAoYWJmZCwgb2JqdHlwZSkKICAgICBiZmQgKmFiZmQ7CiAgICAgaW50IG9ianR5cGU7CnsKICBhc3ltYm9sICpzeW1ib2w7CiAgdW5zaWduZWQgaW50IHN5bW51bTsKICBpbnQgaGFkX2Nhc2UgPSAwOwogIGludCBoYWRfZmlsZSA9IDA7CgoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZyAoMiwgInZtc193cml0ZV9oZHIgKCVwKVxuIiwgYWJmZCk7CiNlbmRpZgoKICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCAyKTsKCiAgLyogTUhEICovCgogIGlmIChvYmp0eXBlID09IE9CSl9TX0NfSERSKQogICAgewogICAgfQogIGVsc2UKICAgIHsKICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfTUhEKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCBFT0JKX1NfQ19TVFJMVkwpOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIE1BWF9PVVRSRUNfU0laRSk7CiAgICB9CgogIGlmIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSAhPSAwKQogICAgewogICAgICAvKiBzdHJpcCBwYXRoIGFuZCBzdWZmaXggaW5mb3JtYXRpb24gKi8KCiAgICAgIGNoYXIgKmZuYW1lLCAqZm91dCwgKmZwdHI7CgogICAgICBmcHRyID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7CiAgICAgIGZuYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGZwdHIpICsgMSk7CiAgICAgIHN0cmNweSAoZm5hbWUsIGZwdHIpOwogICAgICBmb3V0ID0gc3RycmNociAoZm5hbWUsICddJyk7CiAgICAgIGlmIChmb3V0ID09IDApCglmb3V0ID0gc3RyY2hyIChmbmFtZSwgJzonKTsKICAgICAgaWYgKGZvdXQgIT0gMCkKCWZvdXQrKzsKICAgICAgZWxzZQoJZm91dCA9IGZuYW1lOwoKICAgICAgLyogc3RyaXAgLm9iaiBzdWZmaXggICovCgogICAgICBmcHRyID0gc3RycmNociAoZm5hbWUsICcuJyk7CiAgICAgIGlmICgoZnB0ciAhPSAwKQoJICAmJiAoc3RyY2FzZWNtcCAoZnB0ciwgIi5PQkoiKSA9PSAwKSkKCSpmcHRyID0gMDsKCiAgICAgIGZwdHIgPSBmb3V0OwogICAgICB3aGlsZSAoKmZwdHIgIT0gMCkKCXsKCSAgaWYgKGlzbG93ZXIgKCpmcHRyKSkKCSAgICAqZnB0ciA9IHRvdXBwZXIgKCpmcHRyKTsKCSAgZnB0cisrOwoJICBpZiAoKCpmcHRyID09ICc7JykKCSAgICAgfHwgKChmcHRyIC0gZm91dCkgPiAzMSkpCgkgICAgKmZwdHIgPSAwOwoJfQogICAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgZm91dCk7CiAgICB9CiAgZWxzZQogICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsICJOT05BTUUiKTsKCiAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIEJGRF9WRVJTSU9OKTsKICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgZ2V0X3Ztc190aW1lX3N0cmluZyAoKSwgMTcpOwogIF9iZmRfdm1zX291dHB1dF9maWxsIChhYmZkLCAwLCAxNyk7CiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgLyogTE1OICovCgogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX0xOTSk7CiAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIkdBUyBwcm9HSVMiLCAxMCk7CiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgLyogU1JDICovCgogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX1NSQyk7CgogIGZvciAoc3ltbnVtID0gMDsgc3ltbnVtIDwgYWJmZC0+c3ltY291bnQ7IHN5bW51bSsrKQogICAgewogICAgICBzeW1ib2wgPSBhYmZkLT5vdXRzeW1ib2xzW3N5bW51bV07CgogICAgICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9GSUxFKQoJewoJICBpZiAoc3RybmNtcCAoKGNoYXIgKilzeW1ib2wtPm5hbWUsICI8Q0FTRToiLCA2KSA9PSAwKQoJICAgIHsKCSAgICAgIFBSSVYoZmxhZ19oYXNoX2xvbmdfbmFtZXMpID0gc3ltYm9sLT5uYW1lWzZdIC0gJzAnOwoJICAgICAgUFJJVihmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpID0gc3ltYm9sLT5uYW1lWzddIC0gJzAnOwoKCSAgICAgIGlmIChoYWRfZmlsZSkKCQlicmVhazsKCSAgICAgIGhhZF9jYXNlID0gMTsKCSAgICAgIGNvbnRpbnVlOwoJICAgIH0KCgkgIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKXN5bWJvbC0+bmFtZSwgc3RybGVuIChzeW1ib2wtPm5hbWUpKTsKCSAgaWYgKGhhZF9jYXNlKQoJICAgIGJyZWFrOwoJICBoYWRfZmlsZSA9IDE7Cgl9CiAgICB9CgogIGlmIChzeW1udW0gPT0gYWJmZC0+c3ltY291bnQpCiAgICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikibm9uYW1lIiwgNik7CgogIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CgogIC8qIFRUTCAqLwoKICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19UVEwpOwogIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSJUVEwiLCAzKTsKICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwoKICAvKiBDUFIgKi8KCiAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfQ1BSKTsKICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwKCQkJICh1bnNpZ25lZCBjaGFyICopIkdOVSBCRkQgcG9ydGVkIGJ5IEtsYXVzIEvkbXBmIDE5OTQtMTk5NiIsCgkJCSAzOSk7CiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgcmV0dXJuIDA7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyogUHJvY2VzcyBFT00vRUVPTSByZWNvcmQKICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IgICovCgppbnQKX2JmZF92bXNfc2x1cnBfZW9tIChhYmZkLCBvYmp0eXBlKQogICAgIGJmZCAqYWJmZDsKICAgICBpbnQgb2JqdHlwZTsKewogIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7CgojaWYgVk1TX0RFQlVHCiAgdm1zX2RlYnVnKDIsICJFT00vRUVPTVxuIik7CiNlbmRpZgoKICB2bXNfcmVjID0gUFJJVih2bXNfcmVjKTsKCiAgaWYgKChvYmp0eXBlID09IE9CSl9TX0NfRU9NKSAKICAgICB8fCAob2JqdHlwZSA9PSBPQkpfU19DX0VPTVcpKQogICAgewogICAgfQogIGVsc2UKICAgIHsKICAgICAgUFJJVihlb21fZGF0YSkuZW9tX2xfdG90YWxfbHBzID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDQpOwogICAgICBQUklWKGVvbV9kYXRhKS5lb21fYl9jb21jb2QgPSAqKHZtc19yZWMgKyA4KTsKICAgICAgaWYgKFBSSVYoZW9tX2RhdGEpLmVvbV9iX2NvbWNvZCA+IDEpCgl7CgkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiT2JqZWN0IG1vZHVsZSBOT1QgZXJyb3ItZnJlZSAhXG4iKSk7CgkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwoJICByZXR1cm4gLTE7Cgl9CiAgICAgIFBSSVYoZW9tX2RhdGEpLmVvbV9oYXNfdHJhbnNmZXIgPSBmYWxzZTsKICAgICAgaWYgKFBSSVYocmVjX3NpemUpID4gMTApCgl7CgkgICBQUklWKGVvbV9kYXRhKS5lb21faGFzX3RyYW5zZmVyID0gdHJ1ZTsKCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9iX3RmcmZsZyA9ICoodm1zX3JlYyArIDkpOwoJICAgUFJJVihlb21fZGF0YSkuZW9tX2xfcHNpbmR4ID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDEyKTsKCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9sX3RmcmFkciA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxNik7CgoJICAgYWJmZC0+c3RhcnRfYWRkcmVzcyA9IFBSSVYoZW9tX2RhdGEpLmVvbV9sX3RmcmFkcjsKCX0KICAgIH0KICByZXR1cm4gMDsKfQoKCi8qIFdyaXRlIGVvbSByZWNvcmQgZm9yIGJmZCBhYmZkICAqLwoKaW50Cl9iZmRfdm1zX3dyaXRlX2VvbSAoYWJmZCwgb2JqdHlwZSkKICAgICBiZmQgKmFiZmQ7CiAgICAgaW50IG9ianR5cGU7CnsKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZyAoMiwgInZtc193cml0ZV9lb20gKCVwLCAlZClcbiIsIGFiZmQsIG9ianR5cGUpOwojZW5kaWYKCiAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBvYmp0eXBlLCAtMSk7CiAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsICh1bnNpZ25lZCBsb25nKShQUklWKHZtc19saW5rYWdlX2luZGV4KSA+PiAxKSk7CiAgX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIDApOwkvKiBjb21wbGV0aW9uIGNvZGUgKi8KICBfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgMCk7CS8qIGZpbGwgYnl0ZSAqLwoKICBpZiAoYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSAhPSAoYmZkX3ZtYSktMSkKICAgIHsKICAgICAgYXNlY3Rpb24gKnNlY3Rpb247CgogICAgICBzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubGluayIpOwogICAgICBpZiAoc2VjdGlvbiA9PSAwKQoJewoJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKCSAgcmV0dXJuIC0xOwoJfQogICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIDApOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKHNlY3Rpb24tPmluZGV4KSk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLAoJCQkgICAgICh1bnNpZ25lZCBsb25nKSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwogICAgfQoKICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsKICByZXR1cm4gMDsKfQo=