Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBUYWcgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucwovLwovLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5Ci8vIC0gSGVydukgRHJvbG9uIDxkcm9sb25AaW5mb25pZS5mcj4KLy8KLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKLy8KLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCi8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCi8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQovLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAovLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCi8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCi8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgovLyBUSElTIERJU0NMQUlNRVIuCi8vCi8vIFVzZSBhdCB5b3VyIG93biByaXNrIQovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaWZkZWYgX01TQ19WRVIgCiNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQ3ODYpIC8vIGlkZW50aWZpZXIgd2FzIHRydW5jYXRlZCB0byAnbnVtYmVyJyBjaGFyYWN0ZXJzCiNlbmRpZgoKI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgojaW5jbHVkZSAiVXRpbGl0aWVzLmgiCiNpbmNsdWRlICJGcmVlSW1hZ2VUYWcuaCIKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEZJVEFHIGhlYWRlciBkZWZpbml0aW9uCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGSV9TVFJVQ1QgKEZJVEFHSEVBREVSKSB7IAoJY2hhciAqa2V5OwkJCS8vIHRhZyBmaWVsZCBuYW1lCgljaGFyICpkZXNjcmlwdGlvbjsJLy8gdGFnIGRlc2NyaXB0aW9uCglXT1JEIGlkOwkJCS8vIHRhZyBJRAoJV09SRCB0eXBlOwkJCS8vIHRhZyBkYXRhIHR5cGUgKHNlZSBGUkVFX0lNQUdFX01EVFlQRSkKCURXT1JEIGNvdW50OwkJLy8gbnVtYmVyIG9mIGNvbXBvbmVudHMgKGluICd0YWcgZGF0YSB0eXBlcycgdW5pdHMpCglEV09SRCBsZW5ndGg7CQkvLyB2YWx1ZSBsZW5ndGggaW4gYnl0ZXMKCXZvaWQgKnZhbHVlOwkJLy8gdGFnIHZhbHVlCn07CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBGSVRBRyBjcmVhdGlvbiAvIGRlc3RydWN0aW9uCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGSVRBRyAqIERMTF9DQUxMQ09OViAKRnJlZUltYWdlX0NyZWF0ZVRhZygpIHsKCUZJVEFHICp0YWcgPSAoRklUQUcgKiltYWxsb2Moc2l6ZW9mKEZJVEFHKSk7CgoJaWYgKHRhZyAhPSBOVUxMKSB7CgkJdW5zaWduZWQgdGFnX3NpemUgPSBzaXplb2YoRklUQUdIRUFERVIpOyAKCQl0YWctPmRhdGEgPSAoQllURSAqKW1hbGxvYyh0YWdfc2l6ZSAqIHNpemVvZihCWVRFKSk7CgkJaWYgKHRhZy0+ZGF0YSAhPSBOVUxMKSB7CgkJCW1lbXNldCh0YWctPmRhdGEsIDAsIHRhZ19zaXplKTsKCQkJcmV0dXJuIHRhZzsKCQl9CgkJZnJlZSh0YWcpOwoJfQoKCXJldHVybiBOVUxMOwp9Cgp2b2lkIERMTF9DQUxMQ09OViAKRnJlZUltYWdlX0RlbGV0ZVRhZyhGSVRBRyAqdGFnKSB7CglpZiAoTlVMTCAhPSB0YWcpIHsJCgkJaWYgKE5VTEwgIT0gdGFnLT5kYXRhKSB7CgkJCUZJVEFHSEVBREVSICp0YWdfaGVhZGVyID0gKEZJVEFHSEVBREVSICopdGFnLT5kYXRhOwoJCQkvLyBkZWxldGUgdGFnIG1lbWJlcnMKCQkJZnJlZSh0YWdfaGVhZGVyLT5rZXkpOyAKCQkJZnJlZSh0YWdfaGVhZGVyLT5kZXNjcmlwdGlvbik7IAoJCQlmcmVlKHRhZ19oZWFkZXItPnZhbHVlKTsKCQkJLy8gZGVsZXRlIHRoZSB0YWcKCQkJZnJlZSh0YWctPmRhdGEpOwoJCX0KCQkvLyBhbmQgdGhlIHdyYXBwZXIKCQlmcmVlKHRhZyk7Cgl9Cn0KCkZJVEFHICogRExMX0NBTExDT05WIApGcmVlSW1hZ2VfQ2xvbmVUYWcoRklUQUcgKnRhZykgewoJaWYoIXRhZykgcmV0dXJuIE5VTEw7CgoJLy8gYWxsb2NhdGUgYSBuZXcgdGFnCglGSVRBRyAqY2xvbmUgPSBGcmVlSW1hZ2VfQ3JlYXRlVGFnKCk7CglpZighY2xvbmUpIHJldHVybiBOVUxMOwoKCXRyeSB7CgkJLy8gY29weSB0aGUgdGFnCgkJRklUQUdIRUFERVIgKnNyY190YWcgPSAoRklUQUdIRUFERVIgKil0YWctPmRhdGE7CgkJRklUQUdIRUFERVIgKmRzdF90YWcgPSAoRklUQUdIRUFERVIgKiljbG9uZS0+ZGF0YTsKCgkJLy8gdGFnIElECgkJZHN0X3RhZy0+aWQgPSBzcmNfdGFnLT5pZDsKCQkvLyB0YWcga2V5CgkJaWYoc3JjX3RhZy0+a2V5KSB7CgkJCWRzdF90YWctPmtleSA9IChjaGFyKiltYWxsb2MoKHN0cmxlbihzcmNfdGFnLT5rZXkpICsgMSkgKiBzaXplb2YoY2hhcikpOwoJCQlpZighZHN0X3RhZy0+a2V5KSB7CgkJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOwoJCQl9CgkJCXN0cmNweShkc3RfdGFnLT5rZXksIHNyY190YWctPmtleSk7CgkJfQoJCS8vIHRhZyBkZXNjcmlwdGlvbgoJCWlmKHNyY190YWctPmRlc2NyaXB0aW9uKSB7CgkJCWRzdF90YWctPmRlc2NyaXB0aW9uID0gKGNoYXIqKW1hbGxvYygoc3RybGVuKHNyY190YWctPmRlc2NyaXB0aW9uKSArIDEpICogc2l6ZW9mKGNoYXIpKTsKCQkJaWYoIWRzdF90YWctPmRlc2NyaXB0aW9uKSB7CgkJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOwoJCQl9CgkJCXN0cmNweShkc3RfdGFnLT5kZXNjcmlwdGlvbiwgc3JjX3RhZy0+ZGVzY3JpcHRpb24pOwoJCX0KCQkvLyB0YWcgZGF0YSB0eXBlCgkJZHN0X3RhZy0+dHlwZSA9IHNyY190YWctPnR5cGU7CgkJLy8gdGFnIGNvdW50CgkJZHN0X3RhZy0+Y291bnQgPSBzcmNfdGFnLT5jb3VudDsKCQkvLyB0YWcgbGVuZ3RoCgkJZHN0X3RhZy0+bGVuZ3RoID0gc3JjX3RhZy0+bGVuZ3RoOwoJCS8vIHRhZyB2YWx1ZQoJCXN3aXRjaChkc3RfdGFnLT50eXBlKSB7CgkJCWNhc2UgRklEVF9BU0NJSToKCQkJCWRzdF90YWctPnZhbHVlID0gKEJZVEUqKW1hbGxvYygoc3JjX3RhZy0+bGVuZ3RoICsgMSkgKiBzaXplb2YoQllURSkpOwoJCQkJaWYoIWRzdF90YWctPnZhbHVlKSB7CgkJCQkJdGhyb3cgRklfTVNHX0VSUk9SX01FTU9SWTsKCQkJCX0KCQkJCW1lbWNweShkc3RfdGFnLT52YWx1ZSwgc3JjX3RhZy0+dmFsdWUsIHNyY190YWctPmxlbmd0aCk7CgkJCQkoKEJZVEUqKWRzdF90YWctPnZhbHVlKVtzcmNfdGFnLT5sZW5ndGhdID0gMDsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJZHN0X3RhZy0+dmFsdWUgPSAoQllURSopbWFsbG9jKHNyY190YWctPmxlbmd0aCAqIHNpemVvZihCWVRFKSk7CgkJCQlpZighZHN0X3RhZy0+dmFsdWUpIHsKCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOwoJCQkJfQoJCQkJbWVtY3B5KGRzdF90YWctPnZhbHVlLCBzcmNfdGFnLT52YWx1ZSwgc3JjX3RhZy0+bGVuZ3RoKTsKCQkJCWJyZWFrOwoJCX0KCgkJcmV0dXJuIGNsb25lOwoKCX0gY2F0Y2goY29uc3QgY2hhciAqbWVzc2FnZSkgewoJCUZyZWVJbWFnZV9EZWxldGVUYWcoY2xvbmUpOwoJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhGSUZfVU5LTk9XTiwgbWVzc2FnZSk7CgkJcmV0dXJuIE5VTEw7Cgl9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEZJVEFHIGdldHRlcnMgLyBzZXR0ZXJzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjb25zdCBjaGFyICogRExMX0NBTExDT05WIApGcmVlSW1hZ2VfR2V0VGFnS2V5KEZJVEFHICp0YWcpIHsKCXJldHVybiB0YWcgPyAoKEZJVEFHSEVBREVSICopdGFnLT5kYXRhKS0+a2V5IDogMDsKfQoKY29uc3QgY2hhciAqIERMTF9DQUxMQ09OViAKRnJlZUltYWdlX0dldFRhZ0Rlc2NyaXB0aW9uKEZJVEFHICp0YWcpIHsKCXJldHVybiB0YWcgPyAoKEZJVEFHSEVBREVSICopdGFnLT5kYXRhKS0+ZGVzY3JpcHRpb24gOiAwOwp9CgpXT1JEIERMTF9DQUxMQ09OViAKRnJlZUltYWdlX0dldFRhZ0lEKEZJVEFHICp0YWcpIHsKCXJldHVybiB0YWcgPyAoKEZJVEFHSEVBREVSICopdGFnLT5kYXRhKS0+aWQgOiAwOwp9CgpGUkVFX0lNQUdFX01EVFlQRSBETExfQ0FMTENPTlYgCkZyZWVJbWFnZV9HZXRUYWdUeXBlKEZJVEFHICp0YWcpIHsKCXJldHVybiB0YWcgPyAoRlJFRV9JTUFHRV9NRFRZUEUpKCgoRklUQUdIRUFERVIgKil0YWctPmRhdGEpLT50eXBlKSA6IEZJRFRfTk9UWVBFOwp9CgpEV09SRCBETExfQ0FMTENPTlYgCkZyZWVJbWFnZV9HZXRUYWdDb3VudChGSVRBRyAqdGFnKSB7CglyZXR1cm4gdGFnID8gKChGSVRBR0hFQURFUiAqKXRhZy0+ZGF0YSktPmNvdW50IDogMDsKfQoKRFdPUkQgRExMX0NBTExDT05WIApGcmVlSW1hZ2VfR2V0VGFnTGVuZ3RoKEZJVEFHICp0YWcpIHsKCXJldHVybiB0YWcgPyAoKEZJVEFHSEVBREVSICopdGFnLT5kYXRhKS0+bGVuZ3RoIDogMDsKfQoKY29uc3Qgdm9pZCAqRExMX0NBTExDT05WIApGcmVlSW1hZ2VfR2V0VGFnVmFsdWUoRklUQUcgKnRhZykgewoJcmV0dXJuIHRhZyA/ICgoRklUQUdIRUFERVIgKil0YWctPmRhdGEpLT52YWx1ZSA6IDA7Cn0KCkJPT0wgRExMX0NBTExDT05WIApGcmVlSW1hZ2VfU2V0VGFnS2V5KEZJVEFHICp0YWcsIGNvbnN0IGNoYXIgKmtleSkgewoJaWYodGFnICYmIGtleSkgewoJCUZJVEFHSEVBREVSICp0YWdfaGVhZGVyID0gKEZJVEFHSEVBREVSICopdGFnLT5kYXRhOwoJCWlmKHRhZ19oZWFkZXItPmtleSkgZnJlZSh0YWdfaGVhZGVyLT5rZXkpOwoJCXRhZ19oZWFkZXItPmtleSA9IChjaGFyKiltYWxsb2Moc3RybGVuKGtleSkgKyAxKTsKCQlzdHJjcHkodGFnX2hlYWRlci0+a2V5LCBrZXkpOwoJCXJldHVybiBUUlVFOwoJfQoJcmV0dXJuIEZBTFNFOwp9CgpCT09MIERMTF9DQUxMQ09OViAKRnJlZUltYWdlX1NldFRhZ0Rlc2NyaXB0aW9uKEZJVEFHICp0YWcsIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uKSB7CglpZih0YWcgJiYgZGVzY3JpcHRpb24pIHsKCQlGSVRBR0hFQURFUiAqdGFnX2hlYWRlciA9IChGSVRBR0hFQURFUiAqKXRhZy0+ZGF0YTsKCQlpZih0YWdfaGVhZGVyLT5kZXNjcmlwdGlvbikgZnJlZSh0YWdfaGVhZGVyLT5kZXNjcmlwdGlvbik7CgkJdGFnX2hlYWRlci0+ZGVzY3JpcHRpb24gPSAoY2hhciopbWFsbG9jKHN0cmxlbihkZXNjcmlwdGlvbikgKyAxKTsKCQlzdHJjcHkodGFnX2hlYWRlci0+ZGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKTsKCQlyZXR1cm4gVFJVRTsKCX0KCXJldHVybiBGQUxTRTsKfQoKQk9PTCBETExfQ0FMTENPTlYgCkZyZWVJbWFnZV9TZXRUYWdJRChGSVRBRyAqdGFnLCBXT1JEIGlkKSB7CglpZih0YWcpIHsKCQlGSVRBR0hFQURFUiAqdGFnX2hlYWRlciA9IChGSVRBR0hFQURFUiAqKXRhZy0+ZGF0YTsKCQl0YWdfaGVhZGVyLT5pZCA9IGlkOwoJCXJldHVybiBUUlVFOwoJfQoJcmV0dXJuIEZBTFNFOwp9CgpCT09MIERMTF9DQUxMQ09OViAKRnJlZUltYWdlX1NldFRhZ1R5cGUoRklUQUcgKnRhZywgRlJFRV9JTUFHRV9NRFRZUEUgdHlwZSkgewoJaWYodGFnKSB7CgkJRklUQUdIRUFERVIgKnRhZ19oZWFkZXIgPSAoRklUQUdIRUFERVIgKil0YWctPmRhdGE7CgkJdGFnX2hlYWRlci0+dHlwZSA9IChXT1JEKXR5cGU7CgkJcmV0dXJuIFRSVUU7Cgl9CglyZXR1cm4gRkFMU0U7Cn0KCkJPT0wgRExMX0NBTExDT05WIApGcmVlSW1hZ2VfU2V0VGFnQ291bnQoRklUQUcgKnRhZywgRFdPUkQgY291bnQpIHsKCWlmKHRhZykgewoJCUZJVEFHSEVBREVSICp0YWdfaGVhZGVyID0gKEZJVEFHSEVBREVSICopdGFnLT5kYXRhOwoJCXRhZ19oZWFkZXItPmNvdW50ID0gY291bnQ7CgkJcmV0dXJuIFRSVUU7Cgl9CglyZXR1cm4gRkFMU0U7Cn0KCkJPT0wgRExMX0NBTExDT05WIApGcmVlSW1hZ2VfU2V0VGFnTGVuZ3RoKEZJVEFHICp0YWcsIERXT1JEIGxlbmd0aCkgewoJaWYodGFnKSB7CgkJRklUQUdIRUFERVIgKnRhZ19oZWFkZXIgPSAoRklUQUdIRUFERVIgKil0YWctPmRhdGE7CgkJdGFnX2hlYWRlci0+bGVuZ3RoID0gbGVuZ3RoOwoJCXJldHVybiBUUlVFOwoJfQoJcmV0dXJuIEZBTFNFOwp9CgpCT09MIERMTF9DQUxMQ09OViAKRnJlZUltYWdlX1NldFRhZ1ZhbHVlKEZJVEFHICp0YWcsIGNvbnN0IHZvaWQgKnZhbHVlKSB7CglpZih0YWcgJiYgdmFsdWUpIHsKCQlGSVRBR0hFQURFUiAqdGFnX2hlYWRlciA9IChGSVRBR0hFQURFUiAqKXRhZy0+ZGF0YTsKCQkvLyBmaXJzdCwgY2hlY2sgdGhlIHRhZwoJCWlmKHRhZ19oZWFkZXItPmNvdW50ICogRnJlZUltYWdlX1RhZ0RhdGFXaWR0aCgoRlJFRV9JTUFHRV9NRFRZUEUpdGFnX2hlYWRlci0+dHlwZSkgIT0gdGFnX2hlYWRlci0+bGVuZ3RoKSB7CgkJCS8vIGludmFsaWQgZGF0YSBjb3VudCA/CgkJCXJldHVybiBGQUxTRTsKCQl9CgoJCWlmKHRhZ19oZWFkZXItPnZhbHVlKSB7CgkJCWZyZWUodGFnX2hlYWRlci0+dmFsdWUpOwoJCX0KCgkJc3dpdGNoKHRhZ19oZWFkZXItPnR5cGUpIHsKCQkJY2FzZSBGSURUX0FTQ0lJOgoJCQl7CgkJCQl0YWdfaGVhZGVyLT52YWx1ZSA9IChjaGFyKiltYWxsb2MoKHRhZ19oZWFkZXItPmxlbmd0aCArIDEpICogc2l6ZW9mKGNoYXIpKTsKCQkJCWlmKCF0YWdfaGVhZGVyLT52YWx1ZSkgewoJCQkJCXJldHVybiBGQUxTRTsKCQkJCX0KCQkJCWNoYXIgKnNyY19kYXRhID0gKGNoYXIqKXZhbHVlOwoJCQkJY2hhciAqZHN0X2RhdGEgPSAoY2hhciopdGFnX2hlYWRlci0+dmFsdWU7CgkJCQlmb3IoRFdPUkQgaSA9IDA7IGkgPCB0YWdfaGVhZGVyLT5sZW5ndGg7IGkrKykgewoJCQkJCWRzdF9kYXRhW2ldID0gc3JjX2RhdGFbaV07CgkJCQl9CgkJCQlkc3RfZGF0YVt0YWdfaGVhZGVyLT5sZW5ndGhdID0gJ1wwJzsKCQkJfQoJCQlicmVhazsKCgkJCWRlZmF1bHQ6CgkJCQl0YWdfaGVhZGVyLT52YWx1ZSA9IG1hbGxvYyh0YWdfaGVhZGVyLT5sZW5ndGggKiBzaXplb2YoQllURSkpOwoJCQkJaWYoIXRhZ19oZWFkZXItPnZhbHVlKSB7CgkJCQkJcmV0dXJuIEZBTFNFOwoJCQkJfQoJCQkJbWVtY3B5KHRhZ19oZWFkZXItPnZhbHVlLCB2YWx1ZSwgdGFnX2hlYWRlci0+bGVuZ3RoKTsKCQkJCWJyZWFrOwoJCX0KCQlyZXR1cm4gVFJVRTsKCX0KCXJldHVybiBGQUxTRTsKfQoKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEZJVEFHIGludGVybmFsIGhlbHBlciBmdW5jdGlvbnMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnVuc2lnbmVkIApGcmVlSW1hZ2VfVGFnRGF0YVdpZHRoKEZSRUVfSU1BR0VfTURUWVBFIHR5cGUpIHsKCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBmb3JtYXRfYnl0ZXNbXSA9IHsgCgkJMCwgLy8gRklEVF9OT1RZUEUJPSAwLAkvLyBwbGFjZWhvbGRlciAKCQkxLCAvLyBGSURUX0JZVEUJCT0gMSwJLy8gOC1iaXQgdW5zaWduZWQgaW50ZWdlciAKCQkxLCAvLyBGSURUX0FTQ0lJCT0gMiwJLy8gOC1iaXQgYnl0ZXMgdy8gbGFzdCBieXRlIG51bGwgCgkJMiwgLy8gRklEVF9TSE9SVAk9IDMsCS8vIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIAoJCTQsIC8vIEZJRFRfTE9ORwkJPSA0LAkvLyAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciAKCQk4LCAvLyBGSURUX1JBVElPTkFMCT0gNSwJLy8gNjQtYml0IHVuc2lnbmVkIGZyYWN0aW9uIAoJCTEsIC8vIEZJRFRfU0JZVEUJPSA2LAkvLyA4LWJpdCBzaWduZWQgaW50ZWdlciAKCQkxLCAvLyBGSURUX1VOREVGSU5FRD0gNywJLy8gOC1iaXQgdW50eXBlZCBkYXRhIAoJCTIsIC8vIEZJRFRfU1NIT1JUCT0gOCwJLy8gMTYtYml0IHNpZ25lZCBpbnRlZ2VyIAoJCTQsIC8vIEZJRFRfU0xPTkcJPSA5LAkvLyAzMi1iaXQgc2lnbmVkIGludGVnZXIgCgkJOCwgLy8gRklEVF9TUkFUSU9OQUw9IDEwLAkvLyA2NC1iaXQgc2lnbmVkIGZyYWN0aW9uIAoJCTQsIC8vIEZJRFRfRkxPQVQJPSAxMSwJLy8gMzItYml0IElFRUUgZmxvYXRpbmcgcG9pbnQgCgkJOCwgLy8gRklEVF9ET1VCTEUJPSAxMiwJLy8gNjQtYml0IElFRUUgZmxvYXRpbmcgcG9pbnQgCgkJNCwgLy8gRklEVF9JRkQJCT0gMTMsCS8vIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIChvZmZzZXQpIAoJCTQsIC8vIEZJRFRfUEFMRVRURQk9IDE0CS8vIDMyLWJpdCBSR0JRVUFEIAoJCTAsIC8vIHBsYWNlaG9sZGVyICgxNSkKCQk4LCAvLyBGSURUX0xPTkc4CT0gMTYsCS8vIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIAoJCTgsIC8vIEZJRFRfU0xPTkc4CT0gMTcsCS8vIDY0LWJpdCBzaWduZWQgaW50ZWdlcgoJCTggIC8vIEZJRFRfSUZEOAkJPSAxOAkvLyA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciAob2Zmc2V0KQoJfTsKCgkgIHJldHVybiAodHlwZSA8IChzaXplb2YoZm9ybWF0X2J5dGVzKS9zaXplb2YoZm9ybWF0X2J5dGVzWzBdKSkpID8KCQkgIGZvcm1hdF9ieXRlc1t0eXBlXSA6IDA7Cn0KCnNpemVfdCAKRnJlZUltYWdlX0dldFRhZ01lbW9yeVNpemUoRklUQUcgKnRhZykgewoJc2l6ZV90IHNpemUgPSAwOwoJaWYgKHRhZykgewoJCUZJVEFHSEVBREVSICp0YWdfaGVhZGVyID0gKEZJVEFHSEVBREVSICopdGFnLT5kYXRhOwoJCXNpemUgKz0gc2l6ZW9mKEZJVEFHKTsKCQlzaXplICs9IHNpemVvZihGSVRBR0hFQURFUik7CgkJaWYgKHRhZ19oZWFkZXItPmtleSkgewoJCQlzaXplICs9IHN0cmxlbih0YWdfaGVhZGVyLT5rZXkpICsgMTsKCQl9CgkJaWYgKHRhZ19oZWFkZXItPmRlc2NyaXB0aW9uKSB7CgkJCXNpemUgKz0gc3RybGVuKHRhZ19oZWFkZXItPmRlc2NyaXB0aW9uKSArIDE7CgkJfQoJCWlmICh0YWdfaGVhZGVyLT52YWx1ZSkgewoJCQlzd2l0Y2ggKHRhZ19oZWFkZXItPnR5cGUpIHsKCQkJCWNhc2UgRklEVF9BU0NJSToKCQkJCQkvLyBmb3IgQVNDSUkgc3RyaW5ncywgdGhlIHZhbHVlIG9mIHRoZSBjb3VudCBwYXJ0IG9mIGFuIEFTQ0lJIHRhZyBlbnRyeSBpbmNsdWRlcyB0aGUgTlVMTC4KCQkJCQkvLyBob3dldmVyLCBGcmVlSW1hZ2UgYWRkcyBhbm90aGVyICdcMCcgdG8gYmUgc3VyZSB0aGF0IHRoaXMgbGFzdCBjaGFyYWN0ZXIgaXMgcHJlc2VudC4KCQkJCQlzaXplICs9IHRhZ19oZWFkZXItPmxlbmd0aCArIDE7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCXNpemUgKz0gdGFnX2hlYWRlci0+bGVuZ3RoOwoJCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoJcmV0dXJuIHNpemU7Cn0K