Lyogdm1zLWhkci5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVk1TL1ZBWCAob3BlblZNUy9WQVgpIGFuZAogICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIKICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgogICBIRFIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBFTUggcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBhbmQKICAgRU9NIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKICAgRUVPTSByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCgogICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCgpUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQp0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwoKI2luY2x1ZGUgImJmZC5oIgojaW5jbHVkZSAiYmZkdmVyLmgiCiNpbmNsdWRlICJzeXNkZXAuaCIKI2luY2x1ZGUgImJmZGxpbmsuaCIKI2luY2x1ZGUgInNhZmUtY3R5cGUuaCIKI2luY2x1ZGUgImxpYmJmZC5oIgoKI2luY2x1ZGUgInZtcy5oIgoKI2lmZGVmIEhBVkVfQUxMT0NBX0gKI2luY2x1ZGUgPGFsbG9jYS5oPgojZW5kaWYKCnN0YXRpYyB1bnNpZ25lZCBjaGFyICpnZXRfdm1zX3RpbWVfc3RyaW5nIFBBUkFNUyAoKHZvaWQpKTsKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBSZWFkICYgcHJvY2VzcyBlbWggcmVjb3JkCiAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwoKaW50Cl9iZmRfdm1zX3NsdXJwX2hkciAoYWJmZCwgb2JqdHlwZSkKICAgICBiZmQgKmFiZmQ7CiAgICAgaW50IG9ianR5cGU7CnsKICB1bnNpZ25lZCBjaGFyICpwdHI7CiAgdW5zaWduZWQgY2hhciAqdm1zX3JlYzsKICBpbnQgc3VidHlwZTsKCiAgdm1zX3JlYyA9IFBSSVYodm1zX3JlYyk7CgojaWYgVk1TX0RFQlVHCiAgdm1zX2RlYnVnKDIsICJIRFIvRU1IXG4iKTsKI2VuZGlmCgogIHN3aXRjaCAob2JqdHlwZSkKICAgIHsKICAgICAgY2FzZSBPQkpfU19DX0hEUjoKCXN1YnR5cGUgPSB2bXNfcmVjWzFdOwoJYnJlYWs7CiAgICAgIGNhc2UgRU9CSl9TX0NfRU1IOgoJc3VidHlwZSA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyA0KSArIEVWQVhfT0ZGU0VUOwoJYnJlYWs7CiAgICAgIGRlZmF1bHQ6CglzdWJ0eXBlID0gLTE7CiAgICB9CgojaWYgVk1TX0RFQlVHCiAgdm1zX2RlYnVnKDMsICJzdWJ0eXBlICVkXG4iLCBzdWJ0eXBlKTsKI2VuZGlmCgogIHN3aXRjaCAoc3VidHlwZSkKICAgIHsKCiAgICAgIGNhc2UgTUhEX1NfQ19NSEQ6CgkvKgoJICogbW9kdWxlIGhlYWRlcgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfYl9zdHJsdmwgPSB2bXNfcmVjWzJdOwoJUFJJVihoZHJfZGF0YSkuaGRyX2xfcmVjc2l6ID0gYmZkX2dldGwxNiAodm1zX3JlYyArIDMpOwoJUFJJVihoZHJfZGF0YSkuaGRyX3RfbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMgKyA1KTsKCXB0ciA9IHZtc19yZWMgKyA1ICsgdm1zX3JlY1s1XSArIDE7CglQUklWKGhkcl9kYXRhKS5oZHJfdF92ZXJzaW9uID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKCXB0ciArPSAqcHRyICsgMTsKCVBSSVYoaGRyX2RhdGEpLmhkcl90X2RhdGUgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAocHRyLCAxNyk7CgogICAgICBicmVhazsKCiAgICAgIGNhc2UgTUhEX1NfQ19MTk06CgkvKgoJICoKCSAqLwoJUFJJVihoZHJfZGF0YSkuaGRyX2NfbG5tID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC0yKSk7CiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBNSERfU19DX1NSQzoKCS8qCgkgKgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfY19zcmMgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTIpKTsKICAgICAgYnJlYWs7CgogICAgICBjYXNlIE1IRF9TX0NfVFRMOgoJLyoKCSAqCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3R0bCA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtMikpOwogICAgICBicmVhazsKCiAgICAgIGNhc2UgTUhEX1NfQ19DUFI6CgkvKgoJICoKCSAqLwogICAgICBicmVhazsKCiAgICAgIGNhc2UgTUhEX1NfQ19NVEM6CgkvKgoJICoKCSAqLwogICAgICBicmVhazsKCiAgICAgIGNhc2UgTUhEX1NfQ19HVFg6CgkvKgoJICoKCSAqLwogICAgICBicmVhazsKCiAgICAgIGNhc2UgRU1IX1NfQ19NSEQgKyBFVkFYX09GRlNFVDoKCS8qCgkgKiBtb2R1bGUgaGVhZGVyCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9iX3N0cmx2bCA9IHZtc19yZWNbNl07CglQUklWKGhkcl9kYXRhKS5oZHJfbF9hcmNoMSA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA4KTsKCVBSSVYoaGRyX2RhdGEpLmhkcl9sX2FyY2gyID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDEyKTsKCVBSSVYoaGRyX2RhdGEpLmhkcl9sX3JlY3NpeiA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxNik7CglQUklWKGhkcl9kYXRhKS5oZHJfdF9uYW1lID0KCSAgX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyArIDIwKTsKCXB0ciA9IHZtc19yZWMgKyAyMCArIHZtc19yZWNbMjBdICsgMTsKCVBSSVYoaGRyX2RhdGEpLmhkcl90X3ZlcnNpb24gPQoJICBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwoJcHRyICs9ICpwdHIgKyAxOwoJUFJJVihoZHJfZGF0YSkuaGRyX3RfZGF0ZSA9CgkgIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIChwdHIsIDE3KTsKCiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBFTUhfU19DX0xOTSArIEVWQVhfT0ZGU0VUOgoJLyoKCSAqCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9jX2xubSA9CgkgIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtNikpOwogICAgICBicmVhazsKCiAgICAgIGNhc2UgRU1IX1NfQ19TUkMgKyBFVkFYX09GRlNFVDoKCS8qCgkgKgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfY19zcmMgPQoJICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTYpKTsKICAgICAgYnJlYWs7CgogICAgICBjYXNlIEVNSF9TX0NfVFRMICsgRVZBWF9PRkZTRVQ6CgkvKgoJICoKCSAqLwoJUFJJVihoZHJfZGF0YSkuaGRyX2NfdHRsID0KCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC02KSk7CiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBFTUhfU19DX0NQUiArIEVWQVhfT0ZGU0VUOgoJLyoKCSAqCgkgKi8KICAgICAgYnJlYWs7CgogICAgICBjYXNlIEVNSF9TX0NfTVRDICsgRVZBWF9PRkZTRVQ6CgkvKgoJICoKCSAqLwogICAgICBicmVhazsKCiAgICAgIGNhc2UgRU1IX1NfQ19HVFggKyBFVkFYX09GRlNFVDoKCS8qCgkgKgoJICovCiAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdDoKCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwogICAgICByZXR1cm4gLTE7CgogICAgfSAvKiBzd2l0Y2ggKi8KCiAgcmV0dXJuIDA7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBPdXRwdXQgcm91dGluZXMuICAqLwoKLyogTWFudWZhY3R1cmUgYSBWTVMgbGlrZSB0aW1lIG9uIGEgdW5peCBiYXNlZCBzeXN0ZW0uCiAgIHN0b2xlbiBmcm9tIG9iai12bXMuYyAgKi8KCnN0YXRpYyB1bnNpZ25lZCBjaGFyICoKZ2V0X3Ztc190aW1lX3N0cmluZyAoKQp7CiAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdGJ1ZlsxOF07CiNpZm5kZWYgVk1TCiNpbmNsdWRlIDx0aW1lLmg+CgogIGNoYXIgKnBudDsKICB0aW1lX3QgdGltZWI7CiAgdGltZSAoJnRpbWViKTsKICBwbnQgPSBjdGltZSAoJnRpbWViKTsKICBwbnRbM10gPSAwOwogIHBudFs3XSA9IDA7CiAgcG50WzEwXSA9IDA7CiAgcG50WzE2XSA9IDA7CiAgcG50WzI0XSA9IDA7CiAgc3ByaW50ZiAodGJ1ZiwgIiUycy0lM3MtJXMgJXMiLCBwbnQgKyA4LCBwbnQgKyA0LCBwbnQgKyAyMCwgcG50ICsgMTEpOwojZWxzZQojaW5jbHVkZSA8c3RhcmxldC5oPgogIHN0cnVjdAogIHsKICAgIGludCBTaXplOwogICAgdW5zaWduZWQgY2hhciAqUHRyOwogIH0gRGVzY3JpcHRvcjsKICBEZXNjcmlwdG9yLlNpemUgPSAxNzsKICBEZXNjcmlwdG9yLlB0ciA9IHRidWY7CiAgU1lTJEFTQ1RJTSAoMCwgJkRlc2NyaXB0b3IsIDAsIDApOwojZW5kaWYgLyogbm90IFZNUyAqLwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZyAoNiwgInZtc3RpbWVzdHJpbmc6JyVzJ1xuIiwgdGJ1Zik7CiNlbmRpZgoKICByZXR1cm4gdGJ1ZjsKfQoKLyogd3JpdGUgb2JqZWN0IGhlYWRlciBmb3IgYmZkIGFiZmQgICovCgppbnQKX2JmZF92bXNfd3JpdGVfaGRyIChhYmZkLCBvYmp0eXBlKQogICAgIGJmZCAqYWJmZDsKICAgICBpbnQgb2JqdHlwZTsKewogIGFzeW1ib2wgKnN5bWJvbDsKICB1bnNpZ25lZCBpbnQgc3ltbnVtOwogIGludCBoYWRfY2FzZSA9IDA7CiAgaW50IGhhZF9maWxlID0gMDsKCiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfaGRyICglcClcbiIsIGFiZmQpOwojZW5kaWYKCiAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgMik7CgogIC8qIE1IRCAqLwoKICBpZiAob2JqdHlwZSA9PSBPQkpfU19DX0hEUikKICAgIHsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX01IRCk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgRU9CSl9TX0NfU1RSTFZMKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCBNQVhfT1VUUkVDX1NJWkUpOwogICAgfQoKICBpZiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkgIT0gMCkKICAgIHsKICAgICAgLyogc3RyaXAgcGF0aCBhbmQgc3VmZml4IGluZm9ybWF0aW9uICovCgogICAgICBjaGFyICpmbmFtZSwgKmZvdXQsICpmcHRyOwoKICAgICAgZnB0ciA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwogICAgICBmbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChmcHRyKSArIDEpOwogICAgICBzdHJjcHkgKGZuYW1lLCBmcHRyKTsKICAgICAgZm91dCA9IHN0cnJjaHIgKGZuYW1lLCAnXScpOwogICAgICBpZiAoZm91dCA9PSAwKQoJZm91dCA9IHN0cmNociAoZm5hbWUsICc6Jyk7CiAgICAgIGlmIChmb3V0ICE9IDApCglmb3V0Kys7CiAgICAgIGVsc2UKCWZvdXQgPSBmbmFtZTsKCiAgICAgIC8qIHN0cmlwIC5vYmogc3VmZml4ICAqLwoKICAgICAgZnB0ciA9IHN0cnJjaHIgKGZuYW1lLCAnLicpOwogICAgICBpZiAoKGZwdHIgIT0gMCkKCSAgJiYgKHN0cmNhc2VjbXAgKGZwdHIsICIuT0JKIikgPT0gMCkpCgkqZnB0ciA9IDA7CgogICAgICBmcHRyID0gZm91dDsKICAgICAgd2hpbGUgKCpmcHRyICE9IDApCgl7CgkgICpmcHRyID0gVE9VUFBFUiAoKmZwdHIpOwoJICBmcHRyKys7CgkgIGlmICgoKmZwdHIgPT0gJzsnKQoJICAgICB8fCAoKGZwdHIgLSBmb3V0KSA+IDMxKSkKCSAgICAqZnB0ciA9IDA7Cgl9CiAgICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBmb3V0KTsKICAgIH0KICBlbHNlCiAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgIk5PTkFNRSIpOwoKICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgQkZEX1ZFUlNJT05fU1RSSU5HKTsKICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgZ2V0X3Ztc190aW1lX3N0cmluZyAoKSwgMTcpOwogIF9iZmRfdm1zX291dHB1dF9maWxsIChhYmZkLCAwLCAxNyk7CiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgLyogTE1OICovCgogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX0xOTSk7CiAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIkdBUyBwcm9HSVMiLCAxMCk7CiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgLyogU1JDICovCgogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX1NSQyk7CgogIGZvciAoc3ltbnVtID0gMDsgc3ltbnVtIDwgYWJmZC0+c3ltY291bnQ7IHN5bW51bSsrKQogICAgewogICAgICBzeW1ib2wgPSBhYmZkLT5vdXRzeW1ib2xzW3N5bW51bV07CgogICAgICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9GSUxFKQoJewoJICBpZiAoc3RybmNtcCAoKGNoYXIgKilzeW1ib2wtPm5hbWUsICI8Q0FTRToiLCA2KSA9PSAwKQoJICAgIHsKCSAgICAgIFBSSVYoZmxhZ19oYXNoX2xvbmdfbmFtZXMpID0gc3ltYm9sLT5uYW1lWzZdIC0gJzAnOwoJICAgICAgUFJJVihmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpID0gc3ltYm9sLT5uYW1lWzddIC0gJzAnOwoKCSAgICAgIGlmIChoYWRfZmlsZSkKCQlicmVhazsKCSAgICAgIGhhZF9jYXNlID0gMTsKCSAgICAgIGNvbnRpbnVlOwoJICAgIH0KCgkgIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSBzeW1ib2wtPm5hbWUsCgkJCQkoaW50KSBzdHJsZW4gKHN5bWJvbC0+bmFtZSkpOwoJICBpZiAoaGFkX2Nhc2UpCgkgICAgYnJlYWs7CgkgIGhhZF9maWxlID0gMTsKCX0KICAgIH0KCiAgaWYgKHN5bW51bSA9PSBhYmZkLT5zeW1jb3VudCkKICAgIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSJub25hbWUiLCA2KTsKCiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgLyogVFRMICovCgogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX1RUTCk7CiAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIlRUTCIsIDMpOwogIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CgogIC8qIENQUiAqLwoKICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19DUFIpOwogIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLAoJCQkgKHVuc2lnbmVkIGNoYXIgKikiR05VIEJGRCBwb3J0ZWQgYnkgS2xhdXMgS+RtcGYgMTk5NC0xOTk2IiwKCQkJIDM5KTsKICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwoKICByZXR1cm4gMDsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBQcm9jZXNzIEVPTS9FRU9NIHJlY29yZAogICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAgKi8KCmludApfYmZkX3Ztc19zbHVycF9lb20gKGFiZmQsIG9ianR5cGUpCiAgICAgYmZkICphYmZkOwogICAgIGludCBvYmp0eXBlOwp7CiAgdW5zaWduZWQgY2hhciAqdm1zX3JlYzsKCiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcoMiwgIkVPTS9FRU9NXG4iKTsKI2VuZGlmCgogIHZtc19yZWMgPSBQUklWKHZtc19yZWMpOwoKICBpZiAoKG9ianR5cGUgPT0gT0JKX1NfQ19FT00pCiAgICAgfHwgKG9ianR5cGUgPT0gT0JKX1NfQ19FT01XKSkKICAgIHsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIFBSSVYoZW9tX2RhdGEpLmVvbV9sX3RvdGFsX2xwcyA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA0KTsKICAgICAgUFJJVihlb21fZGF0YSkuZW9tX2JfY29tY29kID0gKih2bXNfcmVjICsgOCk7CiAgICAgIGlmIChQUklWKGVvbV9kYXRhKS5lb21fYl9jb21jb2QgPiAxKQoJewoJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk9iamVjdCBtb2R1bGUgTk9UIGVycm9yLWZyZWUgIVxuIikpOwoJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKCSAgcmV0dXJuIC0xOwoJfQogICAgICBQUklWKGVvbV9kYXRhKS5lb21faGFzX3RyYW5zZmVyID0gRkFMU0U7CiAgICAgIGlmIChQUklWKHJlY19zaXplKSA+IDEwKQoJewoJICAgUFJJVihlb21fZGF0YSkuZW9tX2hhc190cmFuc2ZlciA9IFRSVUU7CgkgICBQUklWKGVvbV9kYXRhKS5lb21fYl90ZnJmbGcgPSAqKHZtc19yZWMgKyA5KTsKCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9sX3BzaW5keCA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxMik7CgkgICBQUklWKGVvbV9kYXRhKS5lb21fbF90ZnJhZHIgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTYpOwoKCSAgIGFiZmQtPnN0YXJ0X2FkZHJlc3MgPSBQUklWKGVvbV9kYXRhKS5lb21fbF90ZnJhZHI7Cgl9CiAgICB9CiAgcmV0dXJuIDA7Cn0KCi8qIFdyaXRlIGVvbSByZWNvcmQgZm9yIGJmZCBhYmZkICAqLwoKaW50Cl9iZmRfdm1zX3dyaXRlX2VvbSAoYWJmZCwgb2JqdHlwZSkKICAgICBiZmQgKmFiZmQ7CiAgICAgaW50IG9ianR5cGU7CnsKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZyAoMiwgInZtc193cml0ZV9lb20gKCVwLCAlZClcbiIsIGFiZmQsIG9ianR5cGUpOwojZW5kaWYKCiAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBvYmp0eXBlLCAtMSk7CiAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsICh1bnNpZ25lZCBsb25nKSAoUFJJVih2bXNfbGlua2FnZV9pbmRleCkgPj4gMSkpOwogIF9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCAwKTsJLyogY29tcGxldGlvbiBjb2RlICovCiAgX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIDApOwkvKiBmaWxsIGJ5dGUgKi8KCiAgaWYgKGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgIT0gKGJmZF92bWEpLTEpCiAgICB7CiAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwoKICAgICAgc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxpbmsiKTsKICAgICAgaWYgKHNlY3Rpb24gPT0gMCkKCXsKCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7CgkgIHJldHVybiAtMTsKCX0KICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCAwKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsICh1bnNpZ25lZCBsb25nKSAoc2VjdGlvbi0+aW5kZXgpKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsCgkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkpOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7CiAgICB9CgogIF9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpOwogIHJldHVybiAwOwp9Cg==