I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgInVzYi5oIgojaW5jbHVkZSAic2NzaWdsdWUuaCIKI2luY2x1ZGUgInRyYW5zcG9ydC5oIgovLyNpbmNsdWRlICJpbml0LmgiCgovLyNpbmNsdWRlICJzdGRsaWIuaCIKLy8jaW5jbHVkZSAiRVVDUjZTSy5oIgojaW5jbHVkZSAic21jb21tb24uaCIKI2luY2x1ZGUgInNtaWwuaCIKCnZvaWQgICBfU2V0X0RfU3NmZGNSZENtZCAgICAgKEJZVEUpOwp2b2lkICAgX1NldF9EX1NzZmRjUmRBZGRyICAgIChCWVRFKTsKdm9pZCAgIF9TZXRfRF9Tc2ZkY1JkQ2hpcCAgICAodm9pZCk7CnZvaWQgICBfU2V0X0RfU3NmZGNSZFN0YW5kYnkgKHZvaWQpOwp2b2lkICAgX1N0YXJ0X0RfU3NmZGNSZEh3RUNDICh2b2lkKTsKdm9pZCAgIF9TdG9wX0RfU3NmZGNSZEh3RUNDICAodm9pZCk7CnZvaWQgICBfTG9hZF9EX1NzZmRjUmRId0VDQyAgKEJZVEUpOwp2b2lkICAgX1NldF9EX1NzZmRjV3JDbWQgICAgIChCWVRFKTsKdm9pZCAgIF9TZXRfRF9Tc2ZkY1dyQWRkciAgICAoQllURSk7CnZvaWQgICBfU2V0X0RfU3NmZGNXckJsb2NrICAgKHZvaWQpOwp2b2lkICAgX1NldF9EX1NzZmRjV3JTdGFuZGJ5ICh2b2lkKTsKdm9pZCAgIF9TdGFydF9EX1NzZmRjV3JId0VDQyAodm9pZCk7CnZvaWQgICBfTG9hZF9EX1NzZmRjV3JId0VDQyAgKEJZVEUpOwppbnQgICAgX0NoZWNrX0RfU3NmZGNCdXN5ICAgIChXT1JEKTsKaW50ICAgIF9DaGVja19EX1NzZmRjU3RhdHVzICAodm9pZCk7CnZvaWQgICBfUmVzZXRfRF9Tc2ZkY0VyciAgICAgKHZvaWQpOwp2b2lkICAgX1JlYWRfRF9Tc2ZkY0J1ZiAgICAgIChCWVRFICopOwp2b2lkICAgX1dyaXRlX0RfU3NmZGNCdWYgICAgIChCWVRFICopOwp2b2lkICAgX1JlYWRfRF9Tc2ZkY0J5dGUgICAgIChCWVRFICopOwp2b2lkICAgX1JlYWRSZWR0X0RfU3NmZGNCdWYgIChCWVRFICopOwp2b2lkICAgX1dyaXRlUmVkdF9EX1NzZmRjQnVmIChCWVRFICopOwpCWVRFICAgX0NoZWNrX0RfRGV2Q29kZSAgICAgIChCWVRFKTsKCnZvaWQgICBfU2V0X0RfRUNDZGF0YSAgICAgICAgKEJZVEUsQllURSAqKTsKdm9pZCAgIF9DYWxjX0RfRUNDZGF0YSAgICAgICAoQllURSAqKTsKCi8vdm9pZCAgIFNNX1JlYWREYXRhV2l0aERNQSAgICAgIChQRkRPX0RFVklDRV9FWFRFTlNJT04sIEJZVEUgKiwgV09SRCk7Ci8vdm9pZCAgIFNNX1dyaXRlRGF0YVdpdGhETUEgICAgIChQRkRPX0RFVklDRV9FWFRFTlNJT04sIEJZVEUgKiwgV09SRCk7Ci8vCnN0cnVjdCBTU0ZEQ1RZUEUgICAgICAgICAgICAgICAgU3NmZGM7CnN0cnVjdCBBRERSRVNTICAgICAgICAgICAgICAgICAgTWVkaWE7CnN0cnVjdCBDSVNfQVJFQSAgICAgICAgICAgICAgICAgQ2lzQXJlYTsKCkJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNjQnVmWzZdOwpleHRlcm4gUEJZVEUgICAgICAgICAgICAgICAgICAgIFNNSG9zdEFkZHI7CmV4dGVybiBCWVRFICAgICAgICAgICAgICAgICAgICAgSXNTU0ZEQ0NvbXBsaWFuY2U7CmV4dGVybiBCWVRFICAgICAgICAgICAgICAgICAgICAgSXNYRENvbXBsaWFuY2U7CmV4dGVybiBEV09SRCAgICAgICAgICAgICAgICAgICAgRXJyWERDb2RlOwoKZXh0ZXJuIFdPUkQgIFJlYWRCbG9jazsKZXh0ZXJuIFdPUkQgIFdyaXRlQmxvY2s7CgovL0tFVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgU01fRE1BRG9uZUV2ZW50OwoKI2RlZmluZSBFVkVOICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgIC8vIEV2ZW4gUGFnZSBmb3IgMjU2Ynl0ZS9wYWdlCiNkZWZpbmUgT0REICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAvLyBPZGQgUGFnZSBmb3IgMjU2Ynl0ZS9wYWdlCgoKLy9TbWFydE1lZGlhIFJlZHVuZGFudCBidWZmZXIgZGF0YSBDb250cm9sbCBTdWJyb3V0aW5lCi8vLS0tLS0gQ2hlY2tfRF9EYXRhQmxhbmsoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ2hlY2tfRF9EYXRhQmxhbmsoQllURSAqcmVkdW5kYW50KQp7CgljaGFyIGk7CgoJZm9yKGk9MDsgaTxSRURUU0laRTsgaSsrKQoJCWlmICgqcmVkdW5kYW50KyshPTB4RkYpCgkJCXJldHVybihFUlJPUik7CgoJcmV0dXJuKFNVQ0NFU1MpOwp9CgovLy0tLS0tIENoZWNrX0RfRmFpbEJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IENoZWNrX0RfRmFpbEJsb2NrKEJZVEUgKnJlZHVuZGFudCkKewoJcmVkdW5kYW50Kz1SRURUX0JMT0NLOwoKCWlmICgqcmVkdW5kYW50PT0weEZGKQoJCXJldHVybihTVUNDRVNTKTsKCWlmICghKnJlZHVuZGFudCkKCQlyZXR1cm4oRVJST1IpOwoJaWYgKEJpdF9EX0NvdW50KCpyZWR1bmRhbnQpPDcpCgkJcmV0dXJuKEVSUk9SKTsKCglyZXR1cm4oU1VDQ0VTUyk7Cn0KCi8vLS0tLS0gQ2hlY2tfRF9EYXRhU3RhdHVzKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ2hlY2tfRF9EYXRhU3RhdHVzKEJZVEUgKnJlZHVuZGFudCkKewoJcmVkdW5kYW50Kz1SRURUX0RBVEE7CgoJaWYgKCpyZWR1bmRhbnQ9PTB4RkYpCgkJcmV0dXJuKFNVQ0NFU1MpOwoJaWYgKCEqcmVkdW5kYW50KQoJewoJCUVyclhEQ29kZSA9IEVSUl9EYXRhU3RhdHVzOwoJCXJldHVybihFUlJPUik7Cgl9CgllbHNlCgkJRXJyWERDb2RlID0gTk9fRVJST1I7CgoJaWYgKEJpdF9EX0NvdW50KCpyZWR1bmRhbnQpPDUpCgkJcmV0dXJuKEVSUk9SKTsKCglyZXR1cm4oU1VDQ0VTUyk7Cn0KCi8vLS0tLS0gTG9hZF9EX0xvZ0Jsb2NrQWRkcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTG9hZF9EX0xvZ0Jsb2NrQWRkcihCWVRFICpyZWR1bmRhbnQpCnsKCVdPUkQgYWRkcjEsYWRkcjI7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCglhZGRyMT0oV09SRCkqKHJlZHVuZGFudCtSRURUX0FERFIxSCkqMHgwMTAwKyhXT1JEKSoocmVkdW5kYW50K1JFRFRfQUREUjFMKTsKCWFkZHIyPShXT1JEKSoocmVkdW5kYW50K1JFRFRfQUREUjJIKSoweDAxMDArKFdPUkQpKihyZWR1bmRhbnQrUkVEVF9BRERSMkwpOwoKCWlmIChhZGRyMT09YWRkcjIpCgkJaWYgKChhZGRyMSAmMHhGMDAwKT09MHgxMDAwKQoJCXsgTWVkaWEuTG9nQmxvY2s9KGFkZHIxICYweDBGRkYpLzI7IHJldHVybihTVUNDRVNTKTsgfQoKCWlmIChCaXRfRF9Db3VudFdvcmQoKFdPUkQpKGFkZHIxXmFkZHIyKSkhPTB4MDEpIHJldHVybihFUlJPUik7CgoJaWYgKChhZGRyMSAmMHhGMDAwKT09MHgxMDAwKQoJCWlmICghKEJpdF9EX0NvdW50V29yZChhZGRyMSkgJjB4MDEpKQoJCXsgTWVkaWEuTG9nQmxvY2s9KGFkZHIxICYweDBGRkYpLzI7IHJldHVybihTVUNDRVNTKTsgfQoKCWlmICgoYWRkcjIgJjB4RjAwMCk9PTB4MTAwMCkKCQlpZiAoIShCaXRfRF9Db3VudFdvcmQoYWRkcjIpICYweDAxKSkKCQl7IE1lZGlhLkxvZ0Jsb2NrPShhZGRyMiAmMHgwRkZGKS8yOyByZXR1cm4oU1VDQ0VTUyk7IH0KCglyZXR1cm4oRVJST1IpOwp9CgovLy0tLS0tIENscl9EX1JlZHVuZGFudERhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBDbHJfRF9SZWR1bmRhbnREYXRhKEJZVEUgKnJlZHVuZGFudCkKewoJY2hhciBpOwoKCWZvcihpPTA7IGk8UkVEVFNJWkU7IGkrKykKCSoocmVkdW5kYW50K2kpPTB4RkY7Cn0KCi8vLS0tLS0gU2V0X0RfTG9nQmxvY2tBZGRyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIFNldF9EX0xvZ0Jsb2NrQWRkcihCWVRFICpyZWR1bmRhbnQpCnsKCVdPUkQgYWRkcjsKCgkqKHJlZHVuZGFudCtSRURUX0JMT0NLKT0weEZGOwoJKihyZWR1bmRhbnQrUkVEVF9EQVRBKSA9MHhGRjsKCWFkZHI9TWVkaWEuTG9nQmxvY2sqMisweDEwMDA7CgoJaWYgKChCaXRfRF9Db3VudFdvcmQoYWRkciklMikpCgkJYWRkcisrOwoKCSoocmVkdW5kYW50K1JFRFRfQUREUjFIKT0qKHJlZHVuZGFudCtSRURUX0FERFIySCk9KEJZVEUpKGFkZHIvMHgwMTAwKTsKCSoocmVkdW5kYW50K1JFRFRfQUREUjFMKT0qKHJlZHVuZGFudCtSRURUX0FERFIyTCk9KEJZVEUpYWRkcjsKfQoKLy8tLS0tLSBTZXRfRF9GYWlsQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgU2V0X0RfRmFpbEJsb2NrKEJZVEUgKnJlZHVuZGFudCkKewogICAgY2hhciBpOwoKICAgIGZvcihpPTA7IGk8UkVEVFNJWkU7IGkrKykKICAgICAgICAqcmVkdW5kYW50Kys9KEJZVEUpKChpPT1SRURUX0JMT0NLKT8weEYwOjB4RkYpOwp9CgovLy0tLS0tIFNldF9EX0RhdGFTdGF1cygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBTZXRfRF9EYXRhU3RhdXMoQllURSAqcmVkdW5kYW50KQp7CiAgICByZWR1bmRhbnQrPVJFRFRfREFUQTsKICAgICpyZWR1bmRhbnQ9MHgwMDsKfQoKLy9TbWFydE1lZGlhIEZ1bmN0aW9uIENvbW1hbmQgU3Vicm91dGluZQovLyA2MjUwIENNRCA2Ci8vLS0tLS0gU3NmZGNfRF9SZXNldCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIFNzZmRjX0RfUmVzZXQoc3RydWN0IHVzX2RhdGEgKnVzKQp7CgkvL05UU1RBVFVTICAgICAgICBudFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwoJLy9QQlVMS19DQlcgICAgICAgcEJ1bGtDYncgPSBmZG9FeHQtPnBCdWxrQ2J3OwoJLy9CWVRFICAgICAgICAgICAgYnVmWzB4MjAwXTsKCgkvL3ByaW50aygiU3NmZGNfRF9SZXNldCAtLS0gQnV0IGRvIG5vdGhpbmcgISFcbiIpOwoJcmV0dXJuOwovKglSdGxaZXJvTWVtb3J5KHBCdWxrQ2J3LCBzaXplb2Yoc3RydWN0IF9CVUxLX0NCVykpOwoJcEJ1bGtDYnctPmRDQldTaWduYXR1cmUgICAgICAgICAgPSBDQldfU0lHTlRVUkU7CglwQnVsa0Nidy0+YkNCV0x1biAgICAgICAgICAgICAgICA9IENCV19MVU47CgkvL3BCdWxrQ2J3LT5kQ0JXRGF0YVRyYW5zZmVyTGVuZ3RoID0gMHgyMDA7CglwQnVsa0Nidy0+Ym1DQldGbGFncyAgICAgICAgICAgICA9IDB4ODA7CglwQnVsa0Nidy0+Q0JXQ2JbMF0gICAgICAgICAgICAgICA9IDB4RjI7CglwQnVsa0Nidy0+Q0JXQ2JbMV0gICAgICAgICAgICAgICA9IDB4MDc7CgoJbnRTdGF0dXMgPSBFTkVfU2VuZFNjc2lDbWQoZmRvRXh0LCBGRElSX1JFQUQsIE5VTEwpOwoKCWlmICghTlRfU1VDQ0VTUyhudFN0YXR1cykpCgl7CgkJRU5FX1ByaW50KCJTc2ZkY19EX1Jlc2V0IEZhaWwgISFcbiIpOwoJCS8vcmV0dXJuIG50U3RhdHVzOwoJfSovCn0KCi8vLS0tLS0gU3NmZGNfRF9SZWFkQ2lzU2VjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU3NmZGNfRF9SZWFkQ2lzU2VjdChzdHJ1Y3QgdXNfZGF0YSAqdXMsIEJZVEUgKmJ1ZixCWVRFICpyZWR1bmRhbnQpCnsKCUJZVEUgem9uZSxzZWN0b3I7CglXT1JEIGJsb2NrOwoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgoJem9uZT1NZWRpYS5ab25lOyBibG9jaz1NZWRpYS5QaHlCbG9jazsgc2VjdG9yPU1lZGlhLlNlY3RvcjsKCU1lZGlhLlpvbmU9MDsKCU1lZGlhLlBoeUJsb2NrPUNpc0FyZWEuUGh5QmxvY2s7CglNZWRpYS5TZWN0b3I9Q2lzQXJlYS5TZWN0b3I7CgoJaWYgKFNzZmRjX0RfUmVhZFNlY3QodXMsYnVmLHJlZHVuZGFudCkpCgl7CgkJTWVkaWEuWm9uZT16b25lOyBNZWRpYS5QaHlCbG9jaz1ibG9jazsgTWVkaWEuU2VjdG9yPXNlY3RvcjsKCQlyZXR1cm4oRVJST1IpOwoJfQoKCU1lZGlhLlpvbmU9em9uZTsgTWVkaWEuUGh5QmxvY2s9YmxvY2s7IE1lZGlhLlNlY3Rvcj1zZWN0b3I7CglyZXR1cm4oU1VDQ0VTUyk7Cn0KLyoKLy8vLy0tLS0tIFNzZmRjX0RfV3JpdGVSZWR0TW9kZSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIFNzZmRjX0RfV3JpdGVSZWR0TW9kZSh2b2lkKQovL3sKLy8gICAgX1NldF9EX1NzZmRjUmRDbWQgICAgIChSU1RfQ0hJUCk7Ci8vICAgIF9DaGVja19EX1NzZmRjQnVzeSAgICAoQlVTWV9SRVNFVCk7Ci8vICAgIF9TZXRfRF9Tc2ZkY1JkQ21kICAgICAoUkVBRF9SRURUKTsKLy8gICAgX0NoZWNrX0RfU3NmZGNCdXN5ICAgIChCVVNZX1JFQUQpOwovLyAgICBfU2V0X0RfU3NmZGNSZFN0YW5kYnkgKCk7Ci8vfQovLwovLy8vLS0tLS0gU3NmZGNfRF9SZWFkSUQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgU3NmZGNfRF9SZWFkSUQoQllURSAqYnVmLCBCWVRFIFJlYWRJRCkKLy97Ci8vICAgIF9TZXRfRF9Tc2ZkY1JkQ21kICAgICAoUmVhZElEKTsKLy8gICAgX1NldF9EX1NzZmRjUmRDaGlwICAgICgpOwovLyAgICBfUmVhZF9EX1NzZmRjQnl0ZSAgICAgKGJ1ZisrKTsKLy8gICAgX1JlYWRfRF9Tc2ZkY0J5dGUgICAgIChidWYrKyk7Ci8vICAgIF9SZWFkX0RfU3NmZGNCeXRlICAgICAoYnVmKyspOwovLyAgICBfUmVhZF9EX1NzZmRjQnl0ZSAgICAgKGJ1Zik7Ci8vICAgIF9TZXRfRF9Tc2ZkY1JkU3RhbmRieSAoKTsKLy99CiovCi8vIDYyNTAgQ01EIDEKLy8tLS0tLSBTc2ZkY19EX1JlYWRTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBTc2ZkY19EX1JlYWRTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKewoJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwoJaW50CXJlc3VsdDsKCVdPUkQJYWRkcjsKCglyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgl7CgkJcHJpbnRrKCJMb2FkIFNNIFJXIENvZGUgRmFpbCAhIVxuIik7CgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCX0KCglhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7CglhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKCgkvLyBSZWFkIHNlY3QgZGF0YQoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoCT0gMHgyMDA7CgliY2ItPkZsYWdzCQkJPSAweDgwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjE7CgliY2ItPkNEQlsxXQkJCT0gMHgwMjsKCWJjYi0+Q0RCWzRdCQkJPSAoQllURSlhZGRyOwoJYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7CgliY2ItPkNEQlsyXQkJCT0gTWVkaWEuWm9uZS8yOwoKCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCBidWYsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCgkvLyBSZWFkIHJlZHVuZGFudAoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoCT0gMHgxMDsKCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CgliY2ItPkNEQlswXQkJCT0gMHhGMTsKCWJjYi0+Q0RCWzFdCQkJPSAweDAzOwoJYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7CgliY2ItPkNEQlszXQkJCT0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKCWJjYi0+Q0RCWzJdCQkJPSBNZWRpYS5ab25lLzI7CgliY2ItPkNEQls4XQkJCT0gMDsKCWJjYi0+Q0RCWzldCQkJPSAxOwoKCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCByZWR1bmRhbnQsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KCi8vLS0tLS0gU3NmZGNfRF9SZWFkQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNzZmRjX0RfUmVhZEJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBjb3VudCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKewoJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwoJaW50CXJlc3VsdDsKCVdPUkQJYWRkcjsKCgkvL3ByaW50aygiU3NmZGNfRF9SZWFkQmxvY2tcbiIpOwoJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJewoJCXByaW50aygiTG9hZCBTTSBSVyBDb2RlIEZhaWwgISFcbiIpOwoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7Cgl9CgoJYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwoJYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7CgoJLy8gUmVhZCBzZWN0IGRhdGEKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aAk9IDB4MjAwKmNvdW50OwoJYmNiLT5GbGFncwkJCT0gMHg4MDsKCWJjYi0+Q0RCWzBdCQkJPSAweEYxOwoJYmNiLT5DREJbMV0JCQk9IDB4MDI7CgliY2ItPkNEQls0XQkJCT0gKEJZVEUpYWRkcjsKCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYWRkci8weDAxMDApOwoJYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUvMjsKCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgYnVmLCAwKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJLy8gUmVhZCByZWR1bmRhbnQKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aAk9IDB4MTA7CgliY2ItPkZsYWdzCQkJPSAweDgwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjE7CgliY2ItPkNEQlsxXQkJCT0gMHgwMzsKCWJjYi0+Q0RCWzRdCQkJPSAoQllURSlhZGRyOwoJYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7CgliY2ItPkNEQlsyXQkJCT0gTWVkaWEuWm9uZS8yOwoJYmNiLT5DREJbOF0JCQk9IDA7CgliY2ItPkNEQls5XQkJCT0gMTsKCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgcmVkdW5kYW50LCAwKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwp9Ci8qCi8vLy8tLS0tLSBTc2ZkY19EX1JlYWRTZWN0X0RNQSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBTc2ZkY19EX1JlYWRTZWN0X0RNQShQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQovL3sKLy8gICAgV09SRCAgICBTZWN0Qnl0ZUNvdW50LCBhZGRyOwovLyAgICBEV09SRCAgIEJ1ZmZlcls0XTsKLy8gICAgV09SRCAgICBsZW47Ci8vCi8vICAgIGlmICghX0h3X0RfQ2hrQ2FyZEluKCkpCi8vICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgIGFkZHI9KFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7Ci8vICAgIGFkZHI9YWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKLy8gICAgLy8gY3ljbGUgc3RhcnRpbmcgYWRkcmVzcwovLyAgICBTTV9TVEFSVEFERFJfTFNCID0gMHgwMDsKLy8gICAgU01fU1RBUlRBRERSX0lJU0IgPSAoQllURSlhZGRyOwovLyAgICBTTV9TVEFSVEFERFJfSUlJU0IgPSAoQllURSkoYWRkci8weDAxMDApOwovLyAgICBTTV9TVEFSVEFERFJfTVNCID0gTWVkaWEuWm9uZS8yOwovLwovLyAgICAvL1NlY3RvciBieXRlIGNvdW50ID0gMHgyMDAoRE1BKQovLyAgICBTZWN0Qnl0ZUNvdW50ID0gMHgyMGY7Ci8vICAgIFNNX0JZVEVDTlRfTE8gPSAoQllURSlTZWN0Qnl0ZUNvdW50OwovLyAgICBTTV9DTURfQ1RSTDMgPSAoU01fQ01EX0NUUkwzICYgMHhGQykgfCAoQllURSkoU2VjdEJ5dGVDb3VudC8weDAxMDApOwovLyAgICBpZiAoICgoZmRvRXh0LT5DaGlwSUQ9PVJFQURFUl9DQjcxMikmJihmZG9FeHQtPlJldklEPT1DSElQX0EpKSB8fCBmZG9FeHQtPklzSGliZXJuYXRlICkKLy8gICAgICAgU01fRklGT19DVFJMID0gKFNNX0FQQjA4X01BU0sgfCBTTV9ETUFFTl9NQVNLIHwgU01fRE1BX1VQU1RSRUFNX01BU0sgfCBTTV9GSUZPU0hMRFZMVV84X01BU0spOwovLyAgICBlbHNlCi8vICAgICAgIFNNX0ZJRk9fQ1RSTCA9IChTTV9BUEIzMl9NQVNLIHwgU01fRE1BRU5fTUFTSyB8IFNNX0RNQV9VUFNUUkVBTV9NQVNLIHwgU01fRklGT1NITERWTFVfOF9NQVNLKTsKLy8KLy8gICAgX0h3X0RfRWNjUmRSZXNldCgpOwovLyAgICBfSHdfRF9FY2NSZFN0YXJ0KCk7Ci8vCi8vICAgIFNNX0NNRF9DVFJMMSA9IChTTV9DTURfUkVBRF8xKTsKLy8gICAgU01fQ01EX0NUUkwxID0gKFNNX0NNRF9SRUFEXzEgfCBTTV9DTURfU1RBUlRfQklUKTsKLy8KLy8gICAgU2VjdEJ5dGVDb3VudCA9IDB4MWZmOwovLyAgICAvL1NNX1JlYWREYXRhV2l0aERNQShmZG9FeHQsIGJ1ZiwgU2VjdEJ5dGVDb3VudCk7Ci8vICAgIC8vX1JlYWRSZWR0X0RfU3NmZGNCdWYocmVkdW5kYW50KTsKLy8gICAgbGVuID0gMHgxMDAwIC0gKChXT1JEKShidWYpICYgMHgwRkZGKTsKLy8gICAgaWYgKGxlbiA8IDB4MjAwKQovLyAgICB7Ci8vICAgICAgIFNNX1JlYWREYXRhV2l0aERNQShmZG9FeHQsIGJ1ZiwgbGVuLTEpOwovLyAgICAgICBTTV9SZWFkRGF0YVdpdGhETUEoZmRvRXh0LCBidWYrbGVuLCBTZWN0Qnl0ZUNvdW50LWxlbik7Ci8vICAgICAgIC8vRU5FX1ByaW50KCJSZWFkIERNQSAhISEgYnVmMSA9ICVwLCBsZW4gPSAleCwgYnVmMiA9ICVwXG4iLCBidWYsIGxlbiwgYnVmK2xlbik7Ci8vICAgIH0KLy8gICAgZWxzZQovLyAgICAgIFNNX1JlYWREYXRhV2l0aERNQShmZG9FeHQsIGJ1ZiwgU2VjdEJ5dGVDb3VudCk7Ci8vCi8vICAgIGlmICggKChmZG9FeHQtPkNoaXBJRD09UkVBREVSX0NCNzEyKSYmKGZkb0V4dC0+UmV2SUQ9PUNISVBfQSkpIHx8IGZkb0V4dC0+SXNIaWJlcm5hdGUgKQovLyAgICB7Ci8vICAgICAgIF9SZWFkUmVkdF9EX1NzZmRjQnVmKHJlZHVuZGFudCk7Ci8vICAgIH0KLy8gICAgZWxzZQovLyAgICB7Ci8vICAgICAgIEJ1ZmZlclswXSA9IFJFQURfUE9SVF9EV09SRChTTV9SRUdfREFUQSk7Ci8vICAgICAgIEJ1ZmZlclsxXSA9IFJFQURfUE9SVF9EV09SRChTTV9SRUdfREFUQSk7Ci8vICAgICAgIEJ1ZmZlclsyXSA9IFJFQURfUE9SVF9EV09SRChTTV9SRUdfREFUQSk7Ci8vICAgICAgIEJ1ZmZlclszXSA9IFJFQURfUE9SVF9EV09SRChTTV9SRUdfREFUQSk7Ci8vICAgICAgIG1lbWNweShyZWR1bmRhbnQsIEJ1ZmZlciwgMHgxMCk7Ci8vICAgIH0KLy8KLy8gICAgd2hpbGUgKCBfSHdfRF9DaGtDYXJkSW4oKSApCi8vICAgIHsKLy8gICAgICAgIGlmKChSRUFEX1BPUlRfQllURShTTV9SRUdfSU5UX1NUQVRVUykgJiAweDEwKSkKLy8gICAgICAgIHsKLy8gICAgICAgICAgICBXUklURV9QT1JUX0JZVEUoU01fUkVHX0lOVF9TVEFUVVMsIDB4MTApOwovLyAgICAgICAgICAgIGJyZWFrOwovLyAgICAgICAgfQovLyAgICB9Ci8vICAgIF9Id19EX0VjY1JkU3RvcCgpOwovLyAgICBfSHdfRF9TZXRSZFN0YW5kYnkoKTsKLy8gICAgX0xvYWRfRF9Tc2ZkY1JkSHdFQ0MoRVZFTik7Ci8vCi8vICAgIF9DYWxjX0RfRUNDZGF0YShidWYpOwovLyAgICBfU2V0X0RfU3NmZGNSZFN0YW5kYnkoKTsKLy8KLy8gICAgaWYgKCFfSHdfRF9DaGtDYXJkSW4oKSkKLy8gICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgcmV0dXJuKFNVQ0NFU1MpOwovL30KLy8KLy8vLy0tLS0tIFNzZmRjX0RfUmVhZFNlY3RfUElPKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IFNzZmRjX0RfUmVhZFNlY3RfUElPKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIEJZVEUgKmJ1ZixCWVRFICpyZWR1bmRhbnQpCi8vewovLyAgICBfU2V0X0RfU3NmZGNSZENtZChSRUFEKTsKLy8gICAgX1NldF9EX1NzZmRjUmRBZGRyKEVWRU4pOwovLwovLyAgICBpZiAoX0NoZWNrX0RfU3NmZGNCdXN5KEJVU1lfUkVBRCkpCi8vICAgIHsgX1Jlc2V0X0RfU3NmZGNFcnIoKTsgcmV0dXJuKEVSUk9SKTsgfQovLwovLyAgICBfU3RhcnRfRF9Tc2ZkY1JkSHdFQ0MoKTsKLy8gICAgX1JlYWRfRF9Tc2ZkY0J1ZihidWYpOwovLyAgICBfU3RvcF9EX1NzZmRjUmRId0VDQygpOwovLyAgICBfUmVhZFJlZHRfRF9Tc2ZkY0J1ZihyZWR1bmRhbnQpOwovLyAgICBfTG9hZF9EX1NzZmRjUmRId0VDQyhFVkVOKTsKLy8KLy8gICAgaWYgKF9DaGVja19EX1NzZmRjQnVzeShCVVNZX1JFQUQpKQovLyAgICB7IF9SZXNldF9EX1NzZmRjRXJyKCk7IHJldHVybihFUlJPUik7IH0KLy8KLy8gICAgX0NhbGNfRF9FQ0NkYXRhKGJ1Zik7Ci8vICAgIF9TZXRfRF9Tc2ZkY1JkU3RhbmRieSgpOwovLyAgICByZXR1cm4oU1VDQ0VTUyk7Ci8vfQoKLy8gNjI1MCBDTUQgMwovLy0tLS0tIFNzZmRjX0RfV3JpdGVTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNzZmRjX0RfV3JpdGVTZWN0KFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIEJZVEUgKmJ1ZixCWVRFICpyZWR1bmRhbnQpCnsKICAgIFBCVUxLX0NCVyAgICAgICAgICAgICAgIHBCdWxrQ2J3ID0gZmRvRXh0LT5wQnVsa0NidzsKICAgIE5UU1RBVFVTICAgICAgICAgICAgICAgIG50U3RhdHVzOwogICAgV09SRCAgICAgICAgICAgICAgICAgICAgYWRkcjsKCiAgICAvL0VORV9QcmludCgiU01JTFNVQiAtLS0gU3NmZGNfRF9Xcml0ZVNlY3RcbiIpOwogICAgRU5FX0xvYWRCaW5Db2RlKGZkb0V4dCwgU01fUldfUEFUVEVSTik7CgogICAgYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwogICAgYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7CgogICAgLy8gV3JpdGUgc2VjdCBkYXRhCiAgICBSdGxaZXJvTWVtb3J5KHBCdWxrQ2J3LCBzaXplb2Yoc3RydWN0IF9CVUxLX0NCVykpOwogICAgcEJ1bGtDYnctPmRDQldTaWduYXR1cmUgICAgICAgICAgPSBDQldfU0lHTlRVUkU7CiAgICBwQnVsa0Nidy0+YkNCV0x1biAgICAgICAgICAgICAgICA9IENCV19MVU47CiAgICBwQnVsa0Nidy0+ZENCV0RhdGFUcmFuc2Zlckxlbmd0aCA9IDB4MjAwOwogICAgcEJ1bGtDYnctPmJtQ0JXRmxhZ3MgICAgICAgICAgICAgPSAweDAwOwogICAgcEJ1bGtDYnctPkNCV0NiWzBdICAgICAgICAgICAgICAgPSAweEYwOwogICAgcEJ1bGtDYnctPkNCV0NiWzFdICAgICAgICAgICAgICAgPSAweDA0OwogICAgLy9wQnVsa0Nidy0+Q0JXQ2JbNF0gICAgICAgICAgICAgICA9IChCWVRFKWFkZHI7CiAgICAvL3BCdWxrQ2J3LT5DQldDYlszXSAgICAgICAgICAgICAgID0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKICAgIC8vcEJ1bGtDYnctPkNCV0NiWzJdICAgICAgICAgICAgICAgPSBNZWRpYS5ab25lLzI7CiAgICAvL3BCdWxrQ2J3LT5DQldDYls1XSAgICAgICAgICAgICAgID0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUgpOwogICAgLy9wQnVsa0Nidy0+Q0JXQ2JbNl0gICAgICAgICAgICAgICA9ICoocmVkdW5kYW50K1JFRFRfQUREUjFMKTsKICAgIHBCdWxrQ2J3LT5DQldDYls3XSAgICAgICAgICAgICAgID0gKEJZVEUpYWRkcjsKICAgIHBCdWxrQ2J3LT5DQldDYls2XSAgICAgICAgICAgICAgID0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKICAgIHBCdWxrQ2J3LT5DQldDYls1XSAgICAgICAgICAgICAgID0gTWVkaWEuWm9uZS8yOwogICAgcEJ1bGtDYnctPkNCV0NiWzhdICAgICAgICAgICAgICAgPSAqKHJlZHVuZGFudCtSRURUX0FERFIxSCk7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbOV0gICAgICAgICAgICAgICA9ICoocmVkdW5kYW50K1JFRFRfQUREUjFMKTsKCiAgICBudFN0YXR1cyA9IEVORV9TZW5kU2NzaUNtZChmZG9FeHQsIEZESVJfV1JJVEUsIGJ1Zik7CgogICAgaWYgKCFOVF9TVUNDRVNTKG50U3RhdHVzKSkKICAgICAgIHJldHVybihFUlJPUik7CgovLyAgLy8gRm9yIFRlc3QKLy8gIHsKLy8gICAgIEJZVEUgICBiZlsweDIwMF0sIHJkZFsweDEwXTsKLy8gICAgIFVMT05HICBpOwovLwovLyAgICAgUnRsWmVyb01lbW9yeShiZiwgMHgyMDApOwovLyAgICAgUnRsWmVyb01lbW9yeShyZGQsIDB4MTApOwovLyAgICAgbnRTdGF0dXMgPSBTTV9SZWFkQmxvY2soZmRvRXh0LCBiZiwgcmRkKTsKLy8gICAgIGZvciAoaT0wOyBpPDB4MjAwOyBpKyspCi8vICAgICB7Ci8vICAgICAgICAgaWYgKGJ1ZltpXSAhPSBiZltpXSkKLy8gICAgICAgICAgICBFTkVfUHJpbnQoImJ1ZlsleF0gPSAleCwgYmZbJXhdID0gJXhcbiIsIGJ1ZiwgYmYpOwovLyAgICAgfQovLyAgICAgaWYgKCFOVF9TVUNDRVNTKG50U3RhdHVzKSkKLy8gICAgICAgIEVORV9QcmludCgiRXJyb3JcbiIpOwovLyAgfQoKICAgIHJldHVybihTVUNDRVNTKTsKfQoqLwovLy0tLS0tIFNzZmRjX0RfQ29weUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNzZmRjX0RfQ29weUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBjb3VudCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKewoJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwoJaW50CXJlc3VsdDsKICAgIC8vUEJVTEtfQ0JXICAgICAgICAgICAgICAgcEJ1bGtDYncgPSBmZG9FeHQtPnBCdWxrQ2J3OwogICAgLy9OVFNUQVRVUyAgICAgICAgICAgICAgICBudFN0YXR1czsKCVdPUkQJUmVhZEFkZHIsIFdyaXRlQWRkcjsKCgkvL3ByaW50aygiU3NmZGNfRF9Xcml0ZVNlY3QgLS0tIFpPTkUgPSAleCwgUmVhZEJsb2NrID0gJXgsIFdyaXRlQmxvY2sgPSAleFxuIiwgTWVkaWEuWm9uZSwgUmVhZEJsb2NrLCBXcml0ZUJsb2NrKTsKCglyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgl7CgkJcHJpbnRrKCJMb2FkIFNNIFJXIENvZGUgRmFpbCAhIVxuIik7CgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCX0KCglSZWFkQWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK1JlYWRCbG9jazsKCVJlYWRBZGRyID0gUmVhZEFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9yczsKCVdyaXRlQWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK1dyaXRlQmxvY2s7CglXcml0ZUFkZHIgPSBXcml0ZUFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9yczsKCgkvLyBXcml0ZSBzZWN0IGRhdGEKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aAk9IDB4MjAwKmNvdW50OwoJYmNiLT5GbGFncwkJCT0gMHgwMDsKCWJjYi0+Q0RCWzBdCQkJPSAweEYwOwoJYmNiLT5DREJbMV0JCQk9IDB4MDg7CgliY2ItPkNEQls3XQkJCT0gKEJZVEUpV3JpdGVBZGRyOwoJYmNiLT5DREJbNl0JCQk9IChCWVRFKShXcml0ZUFkZHIvMHgwMTAwKTsKCWJjYi0+Q0RCWzVdCQkJPSBNZWRpYS5ab25lLzI7CgliY2ItPkNEQls4XQkJCT0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUgpOwoJYmNiLT5DREJbOV0JCQk9ICoocmVkdW5kYW50K1JFRFRfQUREUjFMKTsKCWJjYi0+Q0RCWzEwXQkJPSBNZWRpYS5TZWN0b3I7CgoJaWYgKFJlYWRCbG9jayAhPSBOT19BU1NJR04pCgl7CgkJYmNiLT5DREJbNF0JCT0gKEJZVEUpUmVhZEFkZHI7CgkJYmNiLT5DREJbM10JCT0gKEJZVEUpKFJlYWRBZGRyLzB4MDEwMCk7CgkJYmNiLT5DREJbMl0JCT0gTWVkaWEuWm9uZS8yOwoJfQoJZWxzZQoJCWJjYi0+Q0RCWzExXQk9IDE7CgoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1dSSVRFLCBidWYsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KLyoKLy8tLS0tLSBTc2ZkY19EX1dyaXRlQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU3NmZGNfRF9Xcml0ZUJsb2NrKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIFdPUkQgY291bnQsIEJZVEUgKmJ1ZixCWVRFICpyZWR1bmRhbnQpCnsKICAgIFBCVUxLX0NCVyAgICAgICAgICAgICAgIHBCdWxrQ2J3ID0gZmRvRXh0LT5wQnVsa0NidzsKICAgIE5UU1RBVFVTICAgICAgICAgICAgICAgIG50U3RhdHVzOwogICAgV09SRCAgICAgICAgICAgICAgICAgICAgYWRkcjsKCiAgICAvL0VORV9QcmludCgiU01JTFNVQiAtLS0gU3NmZGNfRF9Xcml0ZVNlY3RcbiIpOwogICAgRU5FX0xvYWRCaW5Db2RlKGZkb0V4dCwgU01fUldfUEFUVEVSTik7CgogICAgYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwogICAgYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7CgogICAgLy8gV3JpdGUgc2VjdCBkYXRhCiAgICBSdGxaZXJvTWVtb3J5KHBCdWxrQ2J3LCBzaXplb2Yoc3RydWN0IF9CVUxLX0NCVykpOwogICAgcEJ1bGtDYnctPmRDQldTaWduYXR1cmUgICAgICAgICAgPSBDQldfU0lHTlRVUkU7CiAgICBwQnVsa0Nidy0+YkNCV0x1biAgICAgICAgICAgICAgICA9IENCV19MVU47CiAgICBwQnVsa0Nidy0+ZENCV0RhdGFUcmFuc2Zlckxlbmd0aCA9IDB4MjAwKmNvdW50OwogICAgcEJ1bGtDYnctPmJtQ0JXRmxhZ3MgICAgICAgICAgICAgPSAweDAwOwogICAgcEJ1bGtDYnctPkNCV0NiWzBdICAgICAgICAgICAgICAgPSAweEYwOwogICAgcEJ1bGtDYnctPkNCV0NiWzFdICAgICAgICAgICAgICAgPSAweDA0OwogICAgcEJ1bGtDYnctPkNCV0NiWzddICAgICAgICAgICAgICAgPSAoQllURSlhZGRyOwogICAgcEJ1bGtDYnctPkNCV0NiWzZdICAgICAgICAgICAgICAgPSAoQllURSkoYWRkci8weDAxMDApOwogICAgcEJ1bGtDYnctPkNCV0NiWzVdICAgICAgICAgICAgICAgPSBNZWRpYS5ab25lLzI7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbOF0gICAgICAgICAgICAgICA9ICoocmVkdW5kYW50K1JFRFRfQUREUjFIKTsKICAgIHBCdWxrQ2J3LT5DQldDYls5XSAgICAgICAgICAgICAgID0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUwpOwoKICAgIG50U3RhdHVzID0gRU5FX1NlbmRTY3NpQ21kKGZkb0V4dCwgRkRJUl9XUklURSwgYnVmKTsKCiAgICBpZiAoIU5UX1NVQ0NFU1MobnRTdGF0dXMpKQogICAgICAgcmV0dXJuKEVSUk9SKTsKCi8vICAvLyBGb3IgVGVzdAovLyAgewovLyAgICAgQllURSAgIGJmWzB4MjAwXSwgcmRkWzB4MTBdOwovLyAgICAgVUxPTkcgIGk7Ci8vCi8vICAgICBSdGxaZXJvTWVtb3J5KGJmLCAweDIwMCk7Ci8vICAgICBSdGxaZXJvTWVtb3J5KHJkZCwgMHgxMCk7Ci8vICAgICBudFN0YXR1cyA9IFNNX1JlYWRCbG9jayhmZG9FeHQsIGJmLCByZGQpOwovLyAgICAgZm9yIChpPTA7IGk8MHgyMDA7IGkrKykKLy8gICAgIHsKLy8gICAgICAgICBpZiAoYnVmW2ldICE9IGJmW2ldKQovLyAgICAgICAgICAgIEVORV9QcmludCgiYnVmWyV4XSA9ICV4LCBiZlsleF0gPSAleFxuIiwgYnVmLCBiZik7Ci8vICAgICB9Ci8vICAgICBpZiAoIU5UX1NVQ0NFU1MobnRTdGF0dXMpKQovLyAgICAgICAgRU5FX1ByaW50KCJFcnJvclxuIik7Ci8vICB9CgogICAgcmV0dXJuKFNVQ0NFU1MpOwp9Ci8vCi8vLy8tLS0tLSBTc2ZkY19EX1dyaXRlU2VjdF9ETUEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBTc2ZkY19EX1dyaXRlU2VjdF9ETUEoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKLy97Ci8vICAgIFdPUkQgICAgU2VjdEJ5dGVDb3VudCwgYWRkcjsKLy8gICAgRFdPUkQgICBCdWZmZXJbNF07Ci8vICAgIFdPUkQgICAgbGVuOwovLwovLyAgICBpZiAoIV9Id19EX0Noa0NhcmRJbigpKQovLyAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICBhZGRyPShXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwovLyAgICBhZGRyPWFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7Ci8vICAgIC8vIGN5Y2xlIHN0YXJ0aW5nIGFkZHJlc3MKLy8gICAgU01fU1RBUlRBRERSX0xTQiA9IDB4MDA7Ci8vICAgIFNNX1NUQVJUQUREUl9JSVNCID0gKEJZVEUpYWRkcjsKLy8gICAgU01fU1RBUlRBRERSX0lJSVNCID0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKLy8gICAgU01fU1RBUlRBRERSX01TQiA9IE1lZGlhLlpvbmUvMjsKLy8KLy8gICAgLy9TZWN0b3IgYnl0ZSBjb3VudCAoRE1BKQovLyAgICBTZWN0Qnl0ZUNvdW50ID0gMHgyMGY7Ci8vICAgIFNNX0JZVEVDTlRfTE8gPSAoQllURSlTZWN0Qnl0ZUNvdW50OwovLyAgICBTTV9DTURfQ1RSTDMgPSAoU01fQ01EX0NUUkwzICYgMHhGQykgfCAweDIwIHwgKEJZVEUpKFNlY3RCeXRlQ291bnQvMHgwMTAwKTsKLy8gICAgaWYgKCAoKGZkb0V4dC0+Q2hpcElEPT1SRUFERVJfQ0I3MTIpJiYoZmRvRXh0LT5SZXZJRD09Q0hJUF9BKSkgfHwgZmRvRXh0LT5Jc0hpYmVybmF0ZSApCi8vICAgICAgIFNNX0ZJRk9fQ1RSTCA9IChTTV9BUEIwOF9NQVNLIHwgU01fRE1BRU5fTUFTSyB8IFNNX0RNQV9ET1dOU1RSRUFNX01BU0sgfCBTTV9GSUZPU0hMRFZMVV84X01BU0spOwovLyAgICBlbHNlCi8vICAgICAgIFNNX0ZJRk9fQ1RSTCA9IChTTV9BUEIzMl9NQVNLIHwgU01fRE1BRU5fTUFTSyB8IFNNX0RNQV9ET1dOU1RSRUFNX01BU0sgfCBTTV9GSUZPU0hMRFZMVV84X01BU0spOwovLwovLyAgICBfSHdfRF9FY2NSZFJlc2V0KCk7Ci8vICAgIF9Id19EX0VjY1JkU3RhcnQoKTsKLy8KLy8gICAgU01fQ01EX0NUUkwxID0gU01fQ01EX1BBR1BSR01fVFJVRTsKLy8gICAgU01fQ01EX0NUUkwxID0gKFNNX0NNRF9QQUdQUkdNX1RSVUUgfCBTTV9DTURfU1RBUlRfQklUKTsKLy8KLy8gICAgU2VjdEJ5dGVDb3VudCA9IDB4MWZmOwovLyAgICAvL1NNX1dyaXRlRGF0YVdpdGhETUEoZmRvRXh0LCBidWYsIFNlY3RCeXRlQ291bnQpOwovLyAgICAvL19Xcml0ZVJlZHRfRF9Tc2ZkY0J1ZihyZWR1bmRhbnQpOwovLyAgICBsZW4gPSAweDEwMDAgLSAoKFdPUkQpKGJ1ZikgJiAweDBGRkYpOwovLyAgICBpZiAobGVuIDwgMHgyMDApCi8vICAgIHsKLy8gICAgICAgU01fV3JpdGVEYXRhV2l0aERNQShmZG9FeHQsIGJ1ZiwgbGVuLTEpOwovLyAgICAgICBTTV9Xcml0ZURhdGFXaXRoRE1BKGZkb0V4dCwgYnVmK2xlbiwgU2VjdEJ5dGVDb3VudC1sZW4pOwovLyAgICAgICAvL0VORV9QcmludCgiUmVhZCBETUEgISEhIGJ1ZjEgPSAlcCwgbGVuID0gJXgsIGJ1ZjIgPSAlcFxuIiwgYnVmLCBsZW4sIGJ1ZitsZW4pOwovLyAgICB9Ci8vICAgIGVsc2UKLy8gICAgICBTTV9Xcml0ZURhdGFXaXRoRE1BKGZkb0V4dCwgYnVmLCBTZWN0Qnl0ZUNvdW50KTsKLy8KLy8gICAgLy9UMSA9IChVTE9OR0xPTkcpYnVmICYgMHhGRkZGRkZGRkZGRkZGMDAwOwovLyAgICAvL1QyID0gKChVTE9OR0xPTkcpYnVmICsgMHgxRkYpICYgMHhGRkZGRkZGRkZGRkZGMDAwOwovLyAgICAvL2lmIChUMSAhPSBUMikKLy8gICAgLy8gICBFTkVfUHJpbnQoIlNzZmRjX0RfV3JpdGVTZWN0X0RNQSAhISEgYnVmID0gJXAsIFQxID0gJXAsIFQyID0gJXBcbiIsIGJ1ZiwgVDEsIFQyKTsKLy8gICAgLy9pZiAoVDItVDEpCi8vICAgIC8vewovLyAgICAvLyAgIGwxID0gKFdPUkQpKFQyIC0gKFVMT05HTE9ORylidWYpOwovLyAgICAvLyAgIFNNX1dyaXRlRGF0YVdpdGhETUEoZmRvRXh0LCBidWYsIGwxLTEpOwovLyAgICAvLyAgIFNNX1dyaXRlRGF0YVdpdGhETUEoZmRvRXh0LCAoUEJZVEUpVDIsIFNlY3RCeXRlQ291bnQtbDEpOwovLyAgICAvL30KLy8gICAgLy9lbHNlCi8vICAgIC8vICBTTV9Xcml0ZURhdGFXaXRoRE1BKGZkb0V4dCwgYnVmLCBTZWN0Qnl0ZUNvdW50KTsKLy8KLy8gICAgaWYgKCAoKGZkb0V4dC0+Q2hpcElEPT1SRUFERVJfQ0I3MTIpJiYoZmRvRXh0LT5SZXZJRD09Q0hJUF9BKSkgfHwgZmRvRXh0LT5Jc0hpYmVybmF0ZSApCi8vICAgIHsKLy8gICAgICAgX1dyaXRlUmVkdF9EX1NzZmRjQnVmKHJlZHVuZGFudCk7Ci8vICAgIH0KLy8gICAgZWxzZQovLyAgICB7Ci8vICAgICAgIG1lbWNweShCdWZmZXIsIHJlZHVuZGFudCwgMHgxMCk7Ci8vICAgICAgIFdSSVRFX1BPUlRfRFdPUkQoU01fUkVHX0RBVEEsIEJ1ZmZlclswXSk7Ci8vICAgICAgIFdSSVRFX1BPUlRfRFdPUkQoU01fUkVHX0RBVEEsIEJ1ZmZlclsxXSk7Ci8vICAgICAgIFdSSVRFX1BPUlRfRFdPUkQoU01fUkVHX0RBVEEsIEJ1ZmZlclsyXSk7Ci8vICAgICAgIFdSSVRFX1BPUlRfRFdPUkQoU01fUkVHX0RBVEEsIEJ1ZmZlclszXSk7Ci8vICAgIH0KLy8KLy8gICAgd2hpbGUgKCBfSHdfRF9DaGtDYXJkSW4oKSApCi8vICAgIHsKLy8gICAgICAgaWYgKChSRUFEX1BPUlRfQllURShTTV9SRUdfSU5UX1NUQVRVUykgJiAweDEwKSkKLy8gICAgICAgewovLyAgICAgICAgICAgV1JJVEVfUE9SVF9CWVRFKFNNX1JFR19JTlRfU1RBVFVTLCAweDEwKTsKLy8gICAgICAgICAgIGJyZWFrOwovLyAgICAgICB9Ci8vICAgIH0KLy8gICAgX0h3X0RfRWNjUmRTdG9wKCk7Ci8vICAgIF9Id19EX1NldFJkU3RhbmRieSgpOwovLwovLyAgICBfU2V0X0RfU3NmZGNXclN0YW5kYnkoKTsKLy8gICAgX1NldF9EX1NzZmRjUmRTdGFuZGJ5KCk7Ci8vICAgIGlmICghX0h3X0RfQ2hrQ2FyZEluKCkpCi8vICAgICAgIHJldHVybihFUlJPUik7Ci8vCi8vICAgIHJldHVybihTVUNDRVNTKTsKLy99Ci8vCi8vLy8tLS0tLSBTc2ZkY19EX1dyaXRlU2VjdF9QSU8oKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBTc2ZkY19EX1dyaXRlU2VjdF9QSU8oUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKLy97Ci8vICAgIF9DYWxjX0RfRUNDZGF0YShidWYpOwovLyAgICBfU2V0X0RfU3NmZGNXckNtZChXUkRBVEEpOwovLyAgICBfU2V0X0RfU3NmZGNXckFkZHIoRVZFTik7Ci8vICAgIF9TdGFydF9EX1NzZmRjV3JId0VDQygpOwovLwovLyAgICBfV3JpdGVfRF9Tc2ZkY0J1ZihidWYpOwovLwovLyAgICBfTG9hZF9EX1NzZmRjV3JId0VDQyhFVkVOKTsKLy8gICAgX1NldF9EX0VDQ2RhdGEoRVZFTixyZWR1bmRhbnQpOwovLwovLyAgICBfV3JpdGVSZWR0X0RfU3NmZGNCdWYocmVkdW5kYW50KTsKLy8KLy8gICAgX1NldF9EX1NzZmRjV3JDbWQoV1JJVEUpOwovLwovLyAgICBpZiAoX0NoZWNrX0RfU3NmZGNCdXN5KEJVU1lfUFJPRykpCi8vICAgIHsgX1Jlc2V0X0RfU3NmZGNFcnIoKTsgcmV0dXJuKEVSUk9SKTsgfQovLwovLyAgICBfU2V0X0RfU3NmZGNXclN0YW5kYnkoKTsKLy8gICAgX1NldF9EX1NzZmRjUmRTdGFuZGJ5KCk7Ci8vICAgIHJldHVybihTVUNDRVNTKTsKLy99CiovCi8vLS0tLS0gU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5KHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnQpCnsKCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKCWludAlyZXN1bHQ7CgkvL1BCVUxLX0NCVyAgICAgICAgICAgICAgIHBCdWxrQ2J3ID0gZmRvRXh0LT5wQnVsa0NidzsKCS8vTlRTVEFUVVMgICAgICAgICAgICAgICAgbnRTdGF0dXM7CglXT1JEICAgICAgICAgICAgICAgICAgICBhZGRyOwoKCS8vcHJpbnRrKCJTTUlMU1VCIC0tLSBTc2ZkY19EX1dyaXRlU2VjdEZvckNvcHlcbiIpOwoJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJewoJCXByaW50aygiTG9hZCBTTSBSVyBDb2RlIEZhaWwgISFcbiIpOwoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7Cgl9CgoKCWFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKCWFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMrTWVkaWEuU2VjdG9yOwoKCS8vIFdyaXRlIHNlY3QgZGF0YQoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoCT0gMHgyMDA7CgliY2ItPkZsYWdzCQkJPSAweDAwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjA7CgliY2ItPkNEQlsxXQkJCT0gMHgwNDsKCWJjYi0+Q0RCWzddCQkJPSAoQllURSlhZGRyOwoJYmNiLT5DREJbNl0JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7CgliY2ItPkNEQls1XQkJCT0gTWVkaWEuWm9uZS8yOwoJYmNiLT5DREJbOF0JCQk9ICoocmVkdW5kYW50K1JFRFRfQUREUjFIKTsKCWJjYi0+Q0RCWzldCQkJPSAqKHJlZHVuZGFudCtSRURUX0FERFIxTCk7CgoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1dSSVRFLCBidWYsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KCi8vIDYyNTAgQ01EIDUKLy8tLS0tLSBTc2ZkY19EX0VyYXNlQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBTc2ZkY19EX0VyYXNlQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzKQp7CglzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CglpbnQJcmVzdWx0OwoJV09SRAlhZGRyOwoKCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU01fUldfUEFUVEVSTik7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCXsKCQlwcmludGsoIkxvYWQgU00gUlcgQ29kZSBGYWlsICEhXG4iKTsKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoJfQoKCWFkZHI9KFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7CglhZGRyPWFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9yczsKCgltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwoJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwoJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGgJPSAweDIwMDsKCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CgliY2ItPkNEQlswXQkJCT0gMHhGMjsKCWJjYi0+Q0RCWzFdCQkJPSAweDA2OwoJYmNiLT5DREJbN10JCQk9IChCWVRFKWFkZHI7CgliY2ItPkNEQls2XQkJCT0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKCWJjYi0+Q0RCWzVdCQkJPSBNZWRpYS5ab25lLzI7CgoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIE5VTEwsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KCi8vIDYyNTAgQ01EIDIKLy8tLS0tLSBTc2ZkY19EX1JlYWRSZWR0RGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBTc2ZkY19EX1JlYWRSZWR0RGF0YShzdHJ1Y3QgdXNfZGF0YSAqdXMsIEJZVEUgKnJlZHVuZGFudCkKewoJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwoJaW50CXJlc3VsdDsKCVdPUkQJYWRkcjsKCUJZVEUgICpidWY7CgoJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJewoJCXByaW50aygiTG9hZCBTTSBSVyBDb2RlIEZhaWwgISFcbiIpOwoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7Cgl9CgoJYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwoJYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7CgoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoCT0gMHgxMDsKCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CgliY2ItPkNEQlswXQkJCT0gMHhGMTsKCWJjYi0+Q0RCWzFdCQkJPSAweDAzOwoJYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7CgliY2ItPkNEQlszXQkJCT0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKCWJjYi0+Q0RCWzJdCQkJPSBNZWRpYS5ab25lLzI7CgliY2ItPkNEQls4XQkJCT0gMDsKCWJjYi0+Q0RCWzldCQkJPSAxOwoKCWJ1ZiA9IGttYWxsb2MoMHgxMCwgR0ZQX0tFUk5FTCk7CgkvL3Jlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCByZWR1bmRhbnQsIDApOwoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIGJ1ZiwgMCk7CgltZW1jcHkocmVkdW5kYW50LCBidWYsIDB4MTApOwoJa2ZyZWUoYnVmKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwp9CgovLyA2MjUwIENNRCA0Ci8vLS0tLS0gU3NmZGNfRF9Xcml0ZVJlZHREYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU3NmZGNfRF9Xcml0ZVJlZHREYXRhKHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqcmVkdW5kYW50KQp7CglzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CglpbnQJcmVzdWx0OwoJLy9QQlVMS19DQlcgICAgICAgICAgICAgICBwQnVsa0NidyA9IGZkb0V4dC0+cEJ1bGtDYnc7CgkvL05UU1RBVFVTICAgICAgICAgICAgICAgIG50U3RhdHVzOwoJV09SRCAgICAgICAgICAgICAgICAgICAgYWRkcjsKCglyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgl7CgkJcHJpbnRrKCJMb2FkIFNNIFJXIENvZGUgRmFpbCAhIVxuIik7CgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCX0KCglhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7CglhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKCgltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwoJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwoJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGgJPSAweDEwOwoJYmNiLT5GbGFncwkJCT0gMHg4MDsKCWJjYi0+Q0RCWzBdCQkJPSAweEYyOwoJYmNiLT5DREJbMV0JCQk9IDB4MDU7CgliY2ItPkNEQls3XQkJCT0gKEJZVEUpYWRkcjsKCWJjYi0+Q0RCWzZdCQkJPSAoQllURSkoYWRkci8weDAxMDApOwoJYmNiLT5DREJbNV0JCQk9IE1lZGlhLlpvbmUvMjsKCWJjYi0+Q0RCWzhdCQkJPSAqKHJlZHVuZGFudCtSRURUX0FERFIxSCk7CgliY2ItPkNEQls5XQkJCT0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUwpOwoKCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCBOVUxMLCAwKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwp9CgovLy0tLS0tIFNzZmRjX0RfQ2hlY2tTdGF0dXMoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNzZmRjX0RfQ2hlY2tTdGF0dXModm9pZCkKewogICAgLy8gRHJpdmVyIKSjsLUKICAgIHJldHVybihTVUNDRVNTKTsKICAgIC8vX1NldF9EX1NzZmRjUmRDbWQoUkRTVEFUVVMpOwogICAgLy8KICAgIC8vaWYgKF9DaGVja19EX1NzZmRjU3RhdHVzKCkpCiAgICAvL3sgX1NldF9EX1NzZmRjUmRTdGFuZGJ5KCk7IHJldHVybihFUlJPUik7IH0KICAgIC8vCiAgICAvL19TZXRfRF9Tc2ZkY1JkU3RhbmRieSgpOwogICAgLy9yZXR1cm4oU1VDQ0VTUyk7Cn0KLyoKLy8vL05BTkQgTWVtb3J5IChTbWFydE1lZGlhKSBDb250cm9sIFN1YnJvdXRpbmUgZm9yIFJlYWQgRGF0YQovLy8vLS0tLS0gX1NldF9EX1NzZmRjUmRDbWQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1NldF9EX1NzZmRjUmRDbWQoQllURSBjbWQpCi8vewovLyAgICBfSHdfRF9TZXRSZENtZCgpOwovLyAgICBfSHdfRF9PdXREYXRhKGNtZCk7Ci8vICAgIF9Id19EX1NldFJkRGF0YSgpOwovL30KLy8KLy8vLy0tLS0tIF9TZXRfRF9Tc2ZkY1JkQWRkcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9TZXRfRF9Tc2ZkY1JkQWRkcihCWVRFIGFkZCkKLy97Ci8vICAgIFdPUkQgYWRkcjsKLy8gICAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7Ci8vICAgIEFERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwovLwovLyAgICBhZGRyPShXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwovLyAgICBhZGRyPWFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7Ci8vCi8vICAgIC8vaWYgKChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KSAvLyBmb3IgMjU2Ynl0ZS9wYWdlCi8vICAgIC8vICAgIGFkZHI9YWRkcioyKyhXT1JEKWFkZDsKLy8KLy8gICAgX0h3X0RfU2V0UmRBZGRyKCk7Ci8vICAgIF9Id19EX091dERhdGEoMHgwMCk7Ci8vICAgIF9Id19EX091dERhdGEoKEJZVEUpYWRkcik7Ci8vICAgIF9Id19EX091dERhdGEoKEJZVEUpKGFkZHIvMHgwMTAwKSk7Ci8vCi8vICAgIGlmICgoU3NmZGMuQXR0cmlidXRlICZNQURDKT09QUQ0Q1lDKQovLyAgICAgICAgX0h3X0RfT3V0RGF0YSgoQllURSkoTWVkaWEuWm9uZS8yKSk7IC8vIFBhdGNoCi8vCi8vICAgIF9Id19EX1NldFJkRGF0YSgpOwovL30KLy8KLy8vLy0tLS0tIF9TZXRfRF9Tc2ZkY1JkQ2hpcCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9TZXRfRF9Tc2ZkY1JkQ2hpcCh2b2lkKQovL3sKLy8gICAgX0h3X0RfU2V0UmRBZGRyKCk7Ci8vICAgIF9Id19EX091dERhdGEoMHgwMCk7Ci8vICAgIF9Id19EX1NldFJkRGF0YSgpOwovL30KLy8KLy8vLy0tLS0tIF9TZXRfRF9Tc2ZkY1JkU3RhbmRieSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9TZXRfRF9Tc2ZkY1JkU3RhbmRieSh2b2lkKQovL3sKLy8gICAgX0h3X0RfU2V0UmRTdGFuZGJ5KCk7Ci8vfQovLwovLy8vLS0tLS0gX1N0YXJ0X0RfU3NmZGNSZEh3RUNDKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1N0YXJ0X0RfU3NmZGNSZEh3RUNDKHZvaWQpCi8vewovLyNpZmRlZiBIV19FQ0NfU1VQUE9SVEVECi8vICAgIF9Id19EX0VjY1JkUmVzZXQoKTsKLy8gICAgX0h3X0RfSW5EYXRhKCk7Ci8vICAgIF9Id19EX0VjY1JkU3RhcnQoKTsKLy8jZW5kaWYKLy99Ci8vCi8vLy8tLS0tLSBfU3RvcF9EX1NzZmRjUmRId0VDQygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfU3RvcF9EX1NzZmRjUmRId0VDQyh2b2lkKQovL3sKLy8jaWZkZWYgSFdfRUNDX1NVUFBPUlRFRAovLyAgICBfSHdfRF9FY2NSZFN0b3AoKTsKLy8jZW5kaWYKLy99Ci8vCi8vLy8tLS0tLSBfTG9hZF9EX1NzZmRjUmRId0VDQygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfTG9hZF9EX1NzZmRjUmRId0VDQyhCWVRFIGFkZCkKLy97Ci8vI2lmZGVmIEhXX0VDQ19TVVBQT1JURUQKLy8gICAgX0h3X0RfRWNjUmRSZWFkKCk7Ci8vICAgIC8vaWYgKCEoYWRkPT1PREQgJiYgKFNzZmRjLkF0dHJpYnV0ZSAmTVBTKT09UFMyNTYpKQovLyAgICB7Ci8vICAgICAgICBFY2NCdWZbMF09X0h3X0RfSW5EYXRhKCk7Ci8vICAgICAgICBFY2NCdWZbMV09X0h3X0RfSW5EYXRhKCk7Ci8vICAgICAgICBFY2NCdWZbMl09X0h3X0RfSW5EYXRhKCk7Ci8vICAgIH0KLy8KLy8gICAgLy9pZiAoIShhZGQ9PUVWRU4gJiYgKFNzZmRjLkF0dHJpYnV0ZSAmTVBTKT09UFMyNTYpKQovLyAgICB7Ci8vICAgICAgICBFY2NCdWZbM109X0h3X0RfSW5EYXRhKCk7Ci8vICAgICAgICBFY2NCdWZbNF09X0h3X0RfSW5EYXRhKCk7Ci8vICAgICAgICBFY2NCdWZbNV09X0h3X0RfSW5EYXRhKCk7Ci8vICAgIH0KLy8KLy8gICAgX0h3X0RfRWNjUmRTdG9wKCk7Ci8vI2VuZGlmCi8vfQovLwovLy8vTkFORCBNZW1vcnkgKFNtYXJ0TWVkaWEpIENvbnRyb2wgU3Vicm91dGluZSBmb3IgV3JpdGUgRGF0YQovLwovLy8vLS0tLS0gX1NldF9EX1NzZmRjV3JDbWQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1NldF9EX1NzZmRjV3JDbWQoQllURSBjbWQpCi8vewovLyAgICBfSHdfRF9TZXRXckNtZCgpOwovLyAgICBfSHdfRF9PdXREYXRhKGNtZCk7Ci8vICAgIF9Id19EX1NldFdyRGF0YSgpOwovL30KLy8KLy8vLy0tLS0tIF9TZXRfRF9Tc2ZkY1dyQWRkcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfU2V0X0RfU3NmZGNXckFkZHIoQllURSBhZGQpCi8vewovLyAgICBXT1JEIGFkZHI7Ci8vICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwovLyAgICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKLy8KLy8gICAgYWRkcj0oV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKLy8gICAgYWRkcj1hZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMrTWVkaWEuU2VjdG9yOwovLwovLyAgICAvL2lmICgoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1NikgLy8gZm9yIDI1NmJ5dGUvcGFnZQovLyAgICAvLyAgICBhZGRyPWFkZHIqMisoV09SRClhZGQ7Ci8vCi8vICAgIF9Id19EX1NldFdyQWRkcigpOwovLyAgICBfSHdfRF9PdXREYXRhKDB4MDApOwovLyAgICBfSHdfRF9PdXREYXRhKChCWVRFKWFkZHIpOwovLyAgICBfSHdfRF9PdXREYXRhKChCWVRFKShhZGRyLzB4MDEwMCkpOwovLwovLyAgICBpZiAoKFNzZmRjLkF0dHJpYnV0ZSAmTUFEQyk9PUFENENZQykKLy8gICAgICAgIF9Id19EX091dERhdGEoKEJZVEUpKE1lZGlhLlpvbmUvMikpOyAvLyBQYXRjaAovLwovLyAgICBfSHdfRF9TZXRXckRhdGEoKTsKLy99Ci8vCi8vLy8tLS0tLSBfU2V0X0RfU3NmZGNXckJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9TZXRfRF9Tc2ZkY1dyQmxvY2sodm9pZCkKLy97Ci8vICAgIFdPUkQgYWRkcjsKLy8gICAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7Ci8vICAgIEFERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwovLwovLyAgICBhZGRyPShXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwovLyAgICBhZGRyPWFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9yczsKLy8KLy8gICAgLy9pZiAoKFNzZmRjLkF0dHJpYnV0ZSAmTVBTKT09UFMyNTYpIC8vIGZvciAyNTZieXRlL3BhZ2UKLy8gICAgLy8gICAgYWRkcj1hZGRyKjI7Ci8vCi8vICAgIF9Id19EX1NldFdyQWRkcigpOwovLyAgICBfSHdfRF9PdXREYXRhKChCWVRFKWFkZHIpOwovLyAgICBfSHdfRF9PdXREYXRhKChCWVRFKShhZGRyLzB4MDEwMCkpOwovLwovLyAgICBpZiAoKFNzZmRjLkF0dHJpYnV0ZSAmTUFEQyk9PUFENENZQykKLy8gICAgICAgIF9Id19EX091dERhdGEoKEJZVEUpKE1lZGlhLlpvbmUvMikpOyAvLyBQYXRjaAovLwovLyAgICBfSHdfRF9TZXRXckRhdGEoKTsKLy99Ci8vCi8vLy8tLS0tLSBfU2V0X0RfU3NmZGNXclN0YW5kYnkoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1NldF9EX1NzZmRjV3JTdGFuZGJ5KHZvaWQpCi8vewovLyAgICBfSHdfRF9TZXRXclN0YW5kYnkoKTsKLy99Ci8vCi8vLy8tLS0tLSBfU3RhcnRfRF9Tc2ZkY1dySHdFQ0MoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1N0YXJ0X0RfU3NmZGNXckh3RUNDKHZvaWQpCi8vewovLyNpZmRlZiBIV19FQ0NfU1VQUE9SVEVECi8vICAgIF9Id19EX0VjY1dyUmVzZXQoKTsKLy8gICAgX0h3X0RfSW5EYXRhKCk7Ci8vICAgIF9Id19EX0VjY1dyU3RhcnQoKTsKLy8jZW5kaWYKLy99Ci8vCi8vLy8tLS0tLSBfTG9hZF9EX1NzZmRjV3JId0VDQygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfTG9hZF9EX1NzZmRjV3JId0VDQyhCWVRFIGFkZCkKLy97Ci8vI2lmZGVmIEhXX0VDQ19TVVBQT1JURUQKLy8gICAgX0h3X0RfRWNjV3JSZWFkKCk7Ci8vICAgIC8vaWYgKCEoYWRkPT1PREQgJiYgKFNzZmRjLkF0dHJpYnV0ZSAmTVBTKT09UFMyNTYpKQovLyAgICB7Ci8vICAgICAgICBFY2NCdWZbMF09X0h3X0RfSW5EYXRhKCk7Ci8vICAgICAgICBFY2NCdWZbMV09X0h3X0RfSW5EYXRhKCk7Ci8vICAgICAgICBFY2NCdWZbMl09X0h3X0RfSW5EYXRhKCk7Ci8vICAgIH0KLy8KLy8gICAgLy9pZiAoIShhZGQ9PUVWRU4gJiYgKFNzZmRjLkF0dHJpYnV0ZSAmTVBTKT09UFMyNTYpKQovLyAgICB7Ci8vICAgICAgICBFY2NCdWZbM109X0h3X0RfSW5EYXRhKCk7Ci8vICAgICAgICBFY2NCdWZbNF09X0h3X0RfSW5EYXRhKCk7Ci8vICAgICAgICBFY2NCdWZbNV09X0h3X0RfSW5EYXRhKCk7Ci8vICAgIH0KLy8KLy8gICAgX0h3X0RfRWNjV3JTdG9wKCk7Ci8vI2VuZGlmCi8vfQovLwovLy8vTkFORCBNZW1vcnkgKFNtYXJ0TWVkaWEpIENvbnRyb2wgU3Vicm91dGluZQovLy8vLS0tLS0gX0NoZWNrX0RfU3NmZGNCdXN5KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBfQ2hlY2tfRF9Tc2ZkY0J1c3koV09SRCB0aW1lKQovL3sKLy8gICAgV09SRCAgY291bnQgPSAwOwovLwovLyAgICBkbyB7Ci8vICAgICAgICBpZiAoIV9Id19EX0Noa0J1c3koKSkKLy8gICAgICAgICAgICByZXR1cm4oU1VDQ0VTUyk7Ci8vICAgICAgICBFRGVsYXkoMTAwKTsKLy8gICAgICAgIGNvdW50Kys7Ci8vICAgIH0gd2hpbGUgKGNvdW50PD10aW1lKTsKLy8KLy8gICAgcmV0dXJuKEVSUk9SKTsKLy99Ci8vCi8vLy8tLS0tLSBfQ2hlY2tfRF9Tc2ZkY1N0YXR1cygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IF9DaGVja19EX1NzZmRjU3RhdHVzKHZvaWQpCi8vewovLyAgICBpZiAoX0h3X0RfSW5EYXRhKCkgJiBXUl9GQUlMKQovLyAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8KLy8gICAgcmV0dXJuKFNVQ0NFU1MpOwovL30KLy8KLy8vLyBGb3IgNzEyCi8vLy8tLS0tLSBfUmVzZXRfRF9Tc2ZkY0VycigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfUmVzZXRfRF9Tc2ZkY0Vycih2b2lkKQovL3sKLy8gICAgV09SRCAgY291bnQgPSAwOwovLwovLyAgICBfSHdfRF9TZXRSZENtZCgpOwovLyAgICBfSHdfRF9PdXREYXRhKFJTVF9DSElQKTsKLy8gICAgX0h3X0RfU2V0UmREYXRhKCk7Ci8vCi8vICAgIGRvIHsKLy8gICAgICAgIGlmICghX0h3X0RfQ2hrQnVzeSgpKQovLyAgICAgICAgICAgIGJyZWFrOwovLyAgICAgICAgRURlbGF5KDEwMCk7Ci8vICAgICAgICBjb3VudCsrOwovLyAgICB9IHdoaWxlIChjb3VudDw9QlVTWV9SRVNFVCk7Ci8vCi8vICAgIF9Id19EX1NldFJkU3RhbmRieSgpOwovL30KLy8KLy8vL05BTkQgTWVtb3J5IChTbWFydE1lZGlhKSBCdWZmZXIgRGF0YSBYZmVyIFN1YnJvdXRpbmUKLy8vLy0tLS0tIFNNX1JlYWREYXRhV2l0aERNQSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBTTV9SZWFkRGF0YVdpdGhETUEoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgQllURSAqZGF0YWJ1ZiwgV09SRCBTZWN0Qnl0ZUNvdW50KQovL3sKLy8gICAgUEhZU0lDQUxfQUREUkVTUyAgICAgICAgQWRkcjsKLy8gICAgTEFSR0VfSU5URUdFUiAgICAgICAgICAgcHRpbWVvdXQgOwovLwovLyAgICBLZUNsZWFyRXZlbnQoJmZkb0V4dC0+U01fRE1BRG9uZUV2ZW50KTsKLy8KLy8gICAgQWRkciA9IE1tR2V0UGh5c2ljYWxBZGRyZXNzKGRhdGFidWYpOwovLwovLyAgICBXUklURV9QT1JUX0RXT1JEKFNNX0RNQV9BRERSX1JFRywgKERXT1JEKUFkZHIuTG93UGFydCk7Ci8vICAgIFdSSVRFX1BPUlRfQllURShTTV9ETUFfREFUQV9DVFJMLCAwKTsKLy8gICAgV1JJVEVfUE9SVF9XT1JEKFNNX0RNQV9CWVRFX0NPVU5UX1JFRywgU2VjdEJ5dGVDb3VudCk7Ci8vCi8vICAgIHdoaWxlICggX0h3X0RfQ2hrQ2FyZEluKCkgKQovLyAgICB7Ci8vICAgICAgICBpZiAoKFJFQURfUE9SVF9CWVRFKFNNX1JFR19GSUZPX1NUQVRVUykgJiAweDgwKSkKLy8gICAgICAgICAgIGJyZWFrOwovLyAgICB9Ci8vICAgIGlmICghX0h3X0RfQ2hrQ2FyZEluKCkpICAgICAgcmV0dXJuOwovLyAgICBXUklURV9QT1JUX0JZVEUoU01fRE1BX0RBVEFfQ1RSTCwgMHgwMSk7Ci8vCi8vICAgIHB0aW1lb3V0LlF1YWRQYXJ0ID0gMjAwMCAqICgtMTAwMDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIgc2VjCi8vICAgIEtlV2FpdEZvclNpbmdsZU9iamVjdCgmZmRvRXh0LT5TTV9ETUFEb25lRXZlbnQsIEV4ZWN1dGl2ZSwgS2VybmVsTW9kZSwgRkFMU0UsICZwdGltZW91dCk7Ci8vICAgIF9Id19EX1NldERNQUludE1hc2soKTsKLy99Ci8vCi8vLy8tLS0tLSBTTV9Xcml0ZURhdGFXaXRoRE1BKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIFNNX1dyaXRlRGF0YVdpdGhETUEoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgQllURSAqZGF0YWJ1ZiwgV09SRCBTZWN0Qnl0ZUNvdW50KQovL3sKLy8gICAgUEhZU0lDQUxfQUREUkVTUyAgICAgICAgQWRkcjsKLy8gICAgTEFSR0VfSU5URUdFUiAgICAgICAgICAgcHRpbWVvdXQgOwovLwovLyAgICBLZUNsZWFyRXZlbnQoJmZkb0V4dC0+U01fRE1BRG9uZUV2ZW50KTsKLy8KLy8gICAgQWRkciA9IE1tR2V0UGh5c2ljYWxBZGRyZXNzKGRhdGFidWYpOwovLwovLyAgICBXUklURV9QT1JUX0RXT1JEKFNNX0RNQV9BRERSX1JFRywgKERXT1JEKUFkZHIuTG93UGFydCk7Ci8vICAgIFdSSVRFX1BPUlRfQllURShTTV9ETUFfREFUQV9DVFJMLCAyKTsKLy8gICAgV1JJVEVfUE9SVF9XT1JEKFNNX0RNQV9CWVRFX0NPVU5UX1JFRywgU2VjdEJ5dGVDb3VudCk7Ci8vCi8vICAgIHdoaWxlICggX0h3X0RfQ2hrQ2FyZEluKCkgKQovLyAgICB7Ci8vICAgICAgIGlmICgoUkVBRF9QT1JUX0JZVEUoU01fUkVHX0ZJRk9fU1RBVFVTKSAmIDB4NDApKQovLyAgICAgICAgICAgYnJlYWs7Ci8vICAgIH0KLy8gICAgaWYgKCFfSHdfRF9DaGtDYXJkSW4oKSkgICAgICByZXR1cm47Ci8vICAgIFdSSVRFX1BPUlRfQllURShTTV9ETUFfREFUQV9DVFJMLCAweDAzKTsKLy8KLy8gICAgcHRpbWVvdXQuUXVhZFBhcnQgPSAyMDAwICogKC0xMDAwMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMiBzZWMKLy8gICAgS2VXYWl0Rm9yU2luZ2xlT2JqZWN0KCZmZG9FeHQtPlNNX0RNQURvbmVFdmVudCwgRXhlY3V0aXZlLCBLZXJuZWxNb2RlLCBGQUxTRSwgJnB0aW1lb3V0KTsKLy8gICAgX0h3X0RfU2V0RE1BSW50TWFzaygpOwovL30KLy8KLy8vLy0tLS0tIF9SZWFkX0RfU3NmZGNCdWYoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1JlYWRfRF9Tc2ZkY0J1ZihCWVRFICpkYXRhYnVmKQovL3sKLy8gICAgaW50IGk7Ci8vCi8vICAgIC8vZm9yKGk9MHgwMDAwO2k8KCgoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1Nik/MHgwMTAwOjB4MDIwMCk7aSsrKQovLyAgICBmb3IoaT0wOyBpPDB4MjAwOyBpKyspCi8vICAgICAgICAqZGF0YWJ1ZisrID1fSHdfRF9JbkRhdGEoKTsKLy99Ci8vCi8vLy8tLS0tLSBfV3JpdGVfRF9Tc2ZkY0J1ZigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfV3JpdGVfRF9Tc2ZkY0J1ZihCWVRFICpkYXRhYnVmKQovL3sKLy8gICAgaW50IGk7Ci8vCi8vICAgIC8vZm9yKGk9MHgwMDAwO2k8KCgoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1Nik/MHgwMTAwOjB4MDIwMCk7aSsrKQovLyAgICBmb3IoaT0wOyBpPDB4MjAwOyBpKyspCi8vICAgICAgICBfSHdfRF9PdXREYXRhKCpkYXRhYnVmKyspOwovL30KLy8KLy8vLy0tLS0tIF9SZWFkX0RfU3NmZGNCeXRlKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9SZWFkX0RfU3NmZGNCeXRlKEJZVEUgKmRhdGFidWYpCi8vewovLyAgICAqZGF0YWJ1Zj0oQllURSlfSHdfRF9JbkRhdGEoKTsKLy99Ci8vCi8vLy8tLS0tLSBfUmVhZFJlZHRfRF9Tc2ZkY0J1ZigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfUmVhZFJlZHRfRF9Tc2ZkY0J1ZihCWVRFICpyZWR1bmRhbnQpCi8vewovLyAgICBjaGFyIGk7Ci8vCi8vICAgIC8vZm9yKGk9MHgwMDtpPCgoKFNzZmRjLkF0dHJpYnV0ZSAmTVBTKT09UFMyNTYpPzB4MDg6MHgxMCk7aSsrKQovLyAgICBmb3IoaT0wOyBpPDB4MTA7IGkrKykKLy8gICAgICAgIHJlZHVuZGFudFtpXSA9X0h3X0RfSW5EYXRhKCk7Ci8vfQovLwovLy8vLS0tLS0gX1dyaXRlUmVkdF9EX1NzZmRjQnVmKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9Xcml0ZVJlZHRfRF9Tc2ZkY0J1ZihCWVRFICpyZWR1bmRhbnQpCi8vewovLyAgICBjaGFyIGk7Ci8vCi8vICAgIC8vZm9yKGk9MHgwMDtpPCgoKFNzZmRjLkF0dHJpYnV0ZSAmTVBTKT09UFMyNTYpPzB4MDg6MHgxMCk7aSsrKQovLyAgICBmb3IoaT0wOyBpPDB4MTA7IGkrKykKLy8gICAgICAgIF9Id19EX091dERhdGEoKnJlZHVuZGFudCsrKTsKLy99CiovCi8vU21hcnRNZWRpYSBJRCBDb2RlIENoZWNrICYgTW9kZSBTZXQgU3Vicm91dGluZQovLy0tLS0tIFNldF9EX1NzZmRjTW9kZWwoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNldF9EX1NzZmRjTW9kZWwoQllURSBkY29kZSkKewogICAgc3dpdGNoIChfQ2hlY2tfRF9EZXZDb2RlKGRjb2RlKSkgewogICAgICAgIGNhc2UgU1NGREMxTUI6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMU1COwogICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFEM0NZQyB8IEJTMTYgfCBQUzI1NjsKICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gMTsKICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMjU2OwogICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAyNTA7CiAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDg7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREMyTUI6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMk1COwogICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFEM0NZQyB8IEJTMTYgfCBQUzI1NjsKICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gMTsKICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gNTEyOwogICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSA1MDA7CiAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDg7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREM0TUI6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDNE1COwogICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFEM0NZQyB8IEJTMTYgfCBQUzUxMjsKICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gMTsKICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gNTEyOwogICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSA1MDA7CiAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDE2OwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNTRkRDOE1COgogICAgICAgICAgICBTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzhNQjsKICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDNDWUMgfCBCUzE2IHwgUFM1MTI7CiAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDE7CiAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7CiAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDE2OwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNTRkRDMTZNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMxNk1COwogICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFEM0NZQyB8IEJTMzIgfCBQUzUxMjsKICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gMTsKICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREMzMk1COgogICAgICAgICAgICBTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzMyTUI7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMzMiB8IFBTNTEyOwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAyOwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OwogICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOwogICAgICAgICAgICBTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTU0ZEQzY0TUI6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDNjRNQjsKICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDRDWUMgfCBCUzMyIHwgUFM1MTI7CiAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDQ7CiAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7CiAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDMyOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNTRkRDMTI4TUI6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMTI4TUI7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQ0Q1lDIHwgQlMzMiB8IFBTNTEyOwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSA4OwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OwogICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOwogICAgICAgICAgICBTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTU0ZEQzI1Nk1COgogICAgICAgICAgICBTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzI1Nk1COwogICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFENENZQyB8IEJTMzIgfCBQUzUxMjsKICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gMTY7CiAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7CiAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDMyOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNTRkRDNTEyTUI6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDNTEyTUI7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQ0Q1lDIHwgQlMzMiB8IFBTNTEyOwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAzMjsKICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREMxR0I6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMUdCOwogICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFENENZQyB8IEJTMzIgfCBQUzUxMjsKICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gNjQ7CiAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7CiAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDMyOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNTRkRDMkdCOgogICAgICAgICAgICBTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzJHQjsKICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDRDWUMgfCBCUzMyIHwgUFM1MTI7CiAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDEyODsKICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsID0gTk9TU0ZEQzsKICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKICAgIH0KCiAgICByZXR1cm4oU1VDQ0VTUyk7Cn0KCi8vLS0tLS0gX0NoZWNrX0RfRGV2Q29kZSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpCWVRFIF9DaGVja19EX0RldkNvZGUoQllURSBkY29kZSkKewogICAgc3dpdGNoKGRjb2RlKXsKICAgICAgICBjYXNlIDB4NkU6CiAgICAgICAgY2FzZSAweEU4OgogICAgICAgIGNhc2UgMHhFQzogcmV0dXJuKFNTRkRDMU1CKTsgICAvLyA4TWJpdCAoMU0pIE5BTkQKICAgICAgICBjYXNlIDB4NjQ6CiAgICAgICAgY2FzZSAweEVBOiByZXR1cm4oU1NGREMyTUIpOyAgIC8vIDE2TWJpdCAoMk0pIE5BTkQKICAgICAgICBjYXNlIDB4NkI6CiAgICAgICAgY2FzZSAweEUzOgogICAgICAgIGNhc2UgMHhFNTogcmV0dXJuKFNTRkRDNE1CKTsgICAvLyAzMk1iaXQgKDRNKSBOQU5ECiAgICAgICAgY2FzZSAweEU2OiByZXR1cm4oU1NGREM4TUIpOyAgIC8vIDY0TWJpdCAoOE0pIE5BTkQKICAgICAgICBjYXNlIDB4NzM6IHJldHVybihTU0ZEQzE2TUIpOyAgLy8gMTI4TWJpdCAoMTZNKU5BTkQKICAgICAgICBjYXNlIDB4NzU6IHJldHVybihTU0ZEQzMyTUIpOyAgLy8gMjU2TWJpdCAoMzJNKU5BTkQKICAgICAgICBjYXNlIDB4NzY6IHJldHVybihTU0ZEQzY0TUIpOyAgLy8gNTEyTWJpdCAoNjRNKU5BTkQKICAgICAgICBjYXNlIDB4Nzk6IHJldHVybihTU0ZEQzEyOE1CKTsgLy8gMUdiaXQoMTI4TSlOQU5ECiAgICAgICAgY2FzZSAweDcxOiByZXR1cm4oU1NGREMyNTZNQik7CiAgICAgICAgY2FzZSAweERDOiByZXR1cm4oU1NGREM1MTJNQik7CiAgICAgICAgY2FzZSAweEQzOiByZXR1cm4oU1NGREMxR0IpOwogICAgICAgIGNhc2UgMHhENTogcmV0dXJuKFNTRkRDMkdCKTsKICAgICAgICBkZWZhdWx0OiByZXR1cm4oTk9TU0ZEQyk7CiAgICB9Cn0KLyoKLy8vL1NtYXJ0TWVkaWEgUG93ZXIgQ29udHJvbGwgU3Vicm91dGluZQovLy8vLS0tLS0gQ250X0RfUmVzZXQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBDbnRfRF9SZXNldCh2b2lkKQovL3sKLy8gICAgX0h3X0RfTGVkT2ZmKCk7Ci8vICAgIF9Id19EX1NldFJkU3RhbmRieSgpOwovLyAgICBfSHdfRF9WY2NPZmYoKTsKLy99Ci8vCi8vLy8tLS0tLSBDbnRfRF9Qb3dlck9uKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBDbnRfRF9Qb3dlck9uKHZvaWQpCi8vewovLyAgICAvLyBObyBzdXBwb3J0IDVWLgovLyAgICBfSHdfRF9FbmFibGVWY2MzVk9uKCk7ICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBTTV9SRUdfQ1RSTF81IFJlZy4gdG8gM1YKLy8gICAgX0h3X0RfVmNjT24oKTsKLy8gICAgX0h3X0RfU2V0UmRTdGFuZGJ5KCk7Ci8vICAgIF9XYWl0X0RfVGltZXIoVElNRV9QT04pOwovLwovLyAgICBpZiAoX0h3X0RfQ2hrUG93ZXIoKSkKLy8gICAgewovLyAgICAgICAgX0h3X0RfRW5hYmxlT0IoKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBTTV9SRUdfQ1RSTF81IFJlZy4gdG8gMHg4MwovLyAgICAgICAgcmV0dXJuKFNVQ0NFU1MpOwovLyAgICB9Ci8vCi8vICAgIF9Id19EX1NldFZjY09mZigpOwovLyAgICByZXR1cm4oRVJST1IpOwovL30KLy8KLy8vLy0tLS0tIENudF9EX1Bvd2VyT2ZmKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgQ250X0RfUG93ZXJPZmYodm9pZCkKLy97Ci8vICAgIF9Id19EX1NldFJkU3RhbmRieSgpOwovLyAgICBfSHdfRF9TZXRWY2NPZmYoKTsKLy8gICAgX0h3X0RfVmNjT2ZmKCk7Ci8vfQovLwovLy8vLS0tLS0gQ250X0RfTGVkT24oKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBDbnRfRF9MZWRPbih2b2lkKQovL3sKLy8gICAgX0h3X0RfTGVkT24oKTsKLy99Ci8vCi8vLy8tLS0tLSBDbnRfRF9MZWRPZmYoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBDbnRfRF9MZWRPZmYodm9pZCkKLy97Ci8vICAgIF9Id19EX0xlZE9mZigpOwovL30KLy8KLy8vLy0tLS0tIENoZWNrX0RfQ250UG93ZXIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IENoZWNrX0RfQ250UG93ZXIodm9pZCkKLy97Ci8vICAgIGlmIChfSHdfRF9DaGtQb3dlcigpKQovLyAgICAgICAgcmV0dXJuKFNVQ0NFU1MpOyAvLyBQb3dlciBPbgovLwovLyAgICByZXR1cm4oRVJST1IpOyAgICAgICAvLyBQb3dlciBPZmYKLy99Ci8vCi8vLy8tLS0tLSBDaGVja19EX0NhcmRFeGlzdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgQ2hlY2tfRF9DYXJkRXhpc3Qodm9pZCkKLy97Ci8vICAgIGNoYXIgaSxqLGs7Ci8vCi8vICAgIGlmICghX0h3X0RfQ2hrU3RhdHVzKCkpIC8vIE5vdCBTdGF0dXMgQ2hhbmdlCi8vICAgICAgICBpZiAoX0h3X0RfQ2hrQ2FyZEluKCkpCi8vICAgICAgICAgICAgcmV0dXJuKFNVQ0NFU1MpOyAvLyBDYXJkIGV4aXN0IGluIFNsb3QKLy8KLy8gICAgZm9yKGk9MCxqPTAsaz0wOyBpPDE2OyBpKyspIHsKLy8gICAgICAgIGlmIChfSHdfRF9DaGtDYXJkSW4oKSkgLy8gU3RhdHVzIENoYW5nZQovLyAgICAgICAgewovLyAgICAgICAgICAgIGorKzsgaz0wOwovLyAgICAgICAgfQovLyAgICAgICAgZWxzZQovLyAgICAgICAgewovLyAgICAgICAgICAgIGo9MDsgaysrOwovLyAgICAgICAgfQovLwovLyAgICAgICAgaWYgKGo+MykKLy8gICAgICAgICAgICByZXR1cm4oU1VDQ0VTUyk7IC8vIENhcmQgZXhpc3QgaW4gU2xvdAovLyAgICAgICAgaWYgKGs+MykKLy8gICAgICAgICAgICByZXR1cm4oRVJST1IpOyAvLyBOTyBDYXJkIGV4aXN0IGluIFNsb3QKLy8KLy8gICAgICAgIF9XYWl0X0RfVGltZXIoVElNRV9DRENISyk7Ci8vICAgIH0KLy8KLy8gICAgcmV0dXJuKEVSUk9SKTsKLy99Ci8vCi8vLy8tLS0tLSBDaGVja19EX0NhcmRTdHNDaGcoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IENoZWNrX0RfQ2FyZFN0c0NoZyh2b2lkKQovL3sKLy8gICAgaWYgKF9Id19EX0Noa1N0YXR1cygpKQovLyAgICAgICAgcmV0dXJuKEVSUk9SKTsgLy8gU3RhdHVzIENoYW5nZQovLwovLyAgICByZXR1cm4oU1VDQ0VTUyk7ICAgLy8gTm90IFN0YXR1cyBDaGFuZ2UKLy99Ci8vCi8vLy8tLS0tLSBDaGVja19EX1NzZmRjV1AoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IENoZWNrX0RfU3NmZGNXUCh2b2lkKQovL3sgLy8gRVJST1I6IFdQLCBTVUNDRVNTOiBOb3QgV1AKLy8gICAgY2hhciBpOwovLwovLyAgICBmb3IoaT0wOyBpPDg7IGkrKykgewovLyAgICAgICAgaWYgKF9Id19EX0Noa1dQKCkpCi8vICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgIF9XYWl0X0RfVGltZXIoVElNRV9XUENISyk7Ci8vICAgIH0KLy8KLy8gICAgcmV0dXJuKFNVQ0NFU1MpOwovL30KLy8KKi8KLy9TbWFydE1lZGlhIEVDQyBDb250cm9sbCBTdWJyb3V0aW5lCi8vLS0tLS0gQ2hlY2tfRF9SZWFkRXJyb3IoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBDaGVja19EX1JlYWRFcnJvcihCWVRFICpyZWR1bmRhbnQpCnsKICAgIC8vIERyaXZlciCko7C1IEVDQyBDaGVjawogICAgcmV0dXJuKFNVQ0NFU1MpOwogICAgaWYgKCFTdHJpbmdDbXAoKGNoYXIgKikocmVkdW5kYW50KzB4MEQpLChjaGFyICopRWNjQnVmLDMpKQogICAgICAgIGlmICghU3RyaW5nQ21wKChjaGFyICopKHJlZHVuZGFudCsweDA4KSwoY2hhciAqKShFY2NCdWYrMHgwMyksMykpCiAgICAgICAgICAgIHJldHVybihTVUNDRVNTKTsKCiAgICByZXR1cm4oRVJST1IpOwp9CgovLy0tLS0tIENoZWNrX0RfQ29ycmVjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IENoZWNrX0RfQ29ycmVjdChCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQp7CiAgICAvLyBEcml2ZXIgpKOwtSBFQ0MgQ2hlY2sKICAgIHJldHVybihTVUNDRVNTKTsKICAgIGlmIChTdHJpbmdDbXAoKGNoYXIgKikocmVkdW5kYW50KzB4MEQpLChjaGFyICopRWNjQnVmLDMpKQogICAgICAgIGlmIChfQ29ycmVjdF9EX1N3RUNDKGJ1ZixyZWR1bmRhbnQrMHgwRCxFY2NCdWYpKQogICAgICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgIGJ1Zis9MHgxMDA7CiAgICBpZiAoU3RyaW5nQ21wKChjaGFyICopKHJlZHVuZGFudCsweDA4KSwoY2hhciAqKShFY2NCdWYrMHgwMyksMykpCiAgICAgICAgaWYgKF9Db3JyZWN0X0RfU3dFQ0MoYnVmLHJlZHVuZGFudCsweDA4LEVjY0J1ZisweDAzKSkKICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKCiAgICByZXR1cm4oU1VDQ0VTUyk7Cn0KCi8vLS0tLS0gQ2hlY2tfRF9DSVNkYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ2hlY2tfRF9DSVNkYXRhKEJZVEUgKmJ1ZiwgQllURSAqcmVkdW5kYW50KQp7CiAgICBCWVRFIGNpc1tdPXsweDAxLDB4MDMsMHhEOSwweDAxLDB4RkYsMHgxOCwweDAyLDB4REYsMHgwMSwweDIwfTsKCiAgICBpZiAoIUlzU1NGRENDb21wbGlhbmNlICYmICFJc1hEQ29tcGxpYW5jZSkKICAgICAgICByZXR1cm4oU1VDQ0VTUyk7ICAgICAgICAgICAgIC8vIKXYq2WssLFqqO4gU1VDQ0VTUyBbQXJub2xkIDAyLTA4LTIzXSBTU0ZEQyC0+rjVLCCko6/gsWqo7iBTVUNDRVNTCgogICAgaWYgKCFTdHJpbmdDbXAoKGNoYXIgKikocmVkdW5kYW50KzB4MEQpLChjaGFyICopRWNjQnVmLDMpKQogICAgICAgIHJldHVybihTdHJpbmdDbXAoKGNoYXIgKilidWYsKGNoYXIgKiljaXMsMTApKTsKCiAgICBpZiAoIV9Db3JyZWN0X0RfU3dFQ0MoYnVmLHJlZHVuZGFudCsweDBELEVjY0J1ZikpCiAgICAgICAgcmV0dXJuKFN0cmluZ0NtcCgoY2hhciAqKWJ1ZiwoY2hhciAqKWNpcywxMCkpOwoKICAgIGJ1Zis9MHgxMDA7CiAgICBpZiAoIVN0cmluZ0NtcCgoY2hhciAqKShyZWR1bmRhbnQrMHgwOCksKGNoYXIgKikoRWNjQnVmKzB4MDMpLDMpKQogICAgICAgIHJldHVybihTdHJpbmdDbXAoKGNoYXIgKilidWYsKGNoYXIgKiljaXMsMTApKTsKCiAgICBpZiAoIV9Db3JyZWN0X0RfU3dFQ0MoYnVmLHJlZHVuZGFudCsweDA4LEVjY0J1ZisweDAzKSkKICAgICAgICByZXR1cm4oU3RyaW5nQ21wKChjaGFyICopYnVmLChjaGFyICopY2lzLDEwKSk7CgogICAgcmV0dXJuKEVSUk9SKTsKfQoKLy8tLS0tLSBTZXRfRF9SaWdodEVDQygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBTZXRfRF9SaWdodEVDQyhCWVRFICpyZWR1bmRhbnQpCnsKICAgIC8vIERyaXZlciCko7C1IEVDQyBDaGVjawogICAgcmV0dXJuOwogICAgLy9TdHJpbmdDb3B5KChjaGFyICopKHJlZHVuZGFudCsweDBEKSwoY2hhciAqKUVjY0J1ZiwzKTsKICAgIC8vU3RyaW5nQ29weSgoY2hhciAqKShyZWR1bmRhbnQrMHgwOCksKGNoYXIgKikoRWNjQnVmKzB4MDMpLDMpOwp9Ci8qCi8vLy8tLS0tLSBfQ2FsY19EX0VDQ2RhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfQ2FsY19EX0VDQ2RhdGEoQllURSAqYnVmKQovL3sKLy8jaWZkZWYgSFdfRUNDX1NVUFBPUlRFRAovLyNlbHNlCi8vICAgIF9DYWxjdWxhdGVfRF9Td0VDQyhidWYsRWNjQnVmKTsKLy8gICAgYnVmKz0weDAxMDA7Ci8vICAgIF9DYWxjdWxhdGVfRF9Td0VDQyhidWYsRWNjQnVmKzB4MDMpOwovLyNlbmRpZgovL30KLy8KLy8vLy0tLS0tIF9TZXRfRF9FQ0NkYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1NldF9EX0VDQ2RhdGEoQllURSBhZGQsQllURSAqcmVkdW5kYW50KQovL3sKLy8gICAgLy9pZiAoYWRkPT1FVkVOICYmIChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KQovLyAgICAvLyAgICByZXR1cm47Ci8vCi8vICAgIC8vIGZvciAyNTZieXRlL3BhZ2UKLy8gICAgU3RyaW5nQ29weSgoY2hhciAqKShyZWR1bmRhbnQrMHgwRCksKGNoYXIgKilFY2NCdWYsMyk7Ci8vICAgIFN0cmluZ0NvcHkoKGNoYXIgKikocmVkdW5kYW50KzB4MDgpLChjaGFyICopKEVjY0J1ZisweDAzKSwzKTsKLy99CiovCi8vQ29tbW9uIFN1YnJvdXRpbmUKY2hhciBCaXRfRF9Db3VudChCWVRFIGNkYXRhKQp7CiAgICBXT1JEIGJpdGNvdW50PTA7CgogICAgd2hpbGUoY2RhdGEpIHsKICAgICAgICBiaXRjb3VudCs9KFdPUkQpKGNkYXRhICYweDAxKTsKICAgICAgICBjZGF0YSAvPTI7CiAgICB9CgogICAgcmV0dXJuKChjaGFyKWJpdGNvdW50KTsKfQoKLy8tLS0tLQpjaGFyIEJpdF9EX0NvdW50V29yZChXT1JEIGNkYXRhKQp7CiAgICBXT1JEIGJpdGNvdW50PTA7CgogICAgd2hpbGUoY2RhdGEpIHsKICAgICAgICBiaXRjb3VudCs9KGNkYXRhICYweDAxKTsKICAgICAgICBjZGF0YSAvPTI7CiAgICB9CgogICAgcmV0dXJuKChjaGFyKWJpdGNvdW50KTsKfQoKdm9pZCBTdHJpbmdDb3B5KGNoYXIgKnN0cmluZ0EsIGNoYXIgKnN0cmluZ0IsIGludCBjb3VudCkKewogICAgaW50IGk7CgogICAgZm9yKGk9MDsgaTxjb3VudDsgaSsrKQogICAgICAgICpzdHJpbmdBKysgPSAqc3RyaW5nQisrOwp9CgovLy0tLS0tCmludCBTdHJpbmdDbXAoY2hhciAqc3RyaW5nQSwgY2hhciAqc3RyaW5nQiwgaW50IGNvdW50KQp7CiAgICBpbnQgaTsKCiAgICBmb3IgKGk9MDtpPGNvdW50O2krKykKICAgICAgICBpZiAoKnN0cmluZ0ErKyAhPSAqc3RyaW5nQisrKQogICAgICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgIHJldHVybihTVUNDRVNTKTsKfQovKgovLy0tLS0tIFNNX1JlYWRCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU01fUmVhZEJsb2NrKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIEJZVEUgKmJ1ZixCWVRFICpyZWR1bmRhbnQpCnsKICAgIFBCVUxLX0NCVyAgICAgICAgICAgICAgIHBCdWxrQ2J3ID0gZmRvRXh0LT5wQnVsa0NidzsKICAgIE5UU1RBVFVTICAgICAgICAgICAgICAgIG50U3RhdHVzOwogICAgV09SRCAgICAgICAgICAgICAgICAgICAgYWRkcjsKCiAgICBFTkVfTG9hZEJpbkNvZGUoZmRvRXh0LCBTTV9SV19QQVRURVJOKTsKCiAgICBhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7CiAgICBhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKCiAgICAvLyBSZWFkIHNlY3QgZGF0YQogICAgUnRsWmVyb01lbW9yeShwQnVsa0Nidywgc2l6ZW9mKHN0cnVjdCBfQlVMS19DQlcpKTsKICAgIHBCdWxrQ2J3LT5kQ0JXU2lnbmF0dXJlICAgICAgICAgID0gQ0JXX1NJR05UVVJFOwogICAgcEJ1bGtDYnctPmJDQldMdW4gICAgICAgICAgICAgICAgPSBDQldfTFVOOwogICAgcEJ1bGtDYnctPmRDQldEYXRhVHJhbnNmZXJMZW5ndGggPSAweDIwMDsKICAgIHBCdWxrQ2J3LT5ibUNCV0ZsYWdzICAgICAgICAgICAgID0gMHg4MDsKICAgIHBCdWxrQ2J3LT5DQldDYlswXSAgICAgICAgICAgICAgID0gMHhGMTsKICAgIHBCdWxrQ2J3LT5DQldDYlsxXSAgICAgICAgICAgICAgID0gMHgwMjsKICAgIHBCdWxrQ2J3LT5DQldDYls0XSAgICAgICAgICAgICAgID0gKEJZVEUpYWRkcjsKICAgIHBCdWxrQ2J3LT5DQldDYlszXSAgICAgICAgICAgICAgID0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKICAgIHBCdWxrQ2J3LT5DQldDYlsyXSAgICAgICAgICAgICAgID0gTWVkaWEuWm9uZS8yOwoKICAgIG50U3RhdHVzID0gRU5FX1NlbmRTY3NpQ21kKGZkb0V4dCwgRkRJUl9SRUFELCBidWYpOwoKICAgIGlmICghTlRfU1VDQ0VTUyhudFN0YXR1cykpCiAgICAgICByZXR1cm4oRVJST1IpOwoKICAgIC8vIFJlYWQgcmVkdW5kYW50CiAgICBSdGxaZXJvTWVtb3J5KHBCdWxrQ2J3LCBzaXplb2Yoc3RydWN0IF9CVUxLX0NCVykpOwogICAgcEJ1bGtDYnctPmRDQldTaWduYXR1cmUgICAgICAgICAgPSBDQldfU0lHTlRVUkU7CiAgICBwQnVsa0Nidy0+YkNCV0x1biAgICAgICAgICAgICAgICA9IENCV19MVU47CiAgICBwQnVsa0Nidy0+ZENCV0RhdGFUcmFuc2Zlckxlbmd0aCA9IDB4MTA7CiAgICBwQnVsa0Nidy0+Ym1DQldGbGFncyAgICAgICAgICAgICA9IDB4ODA7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbMF0gICAgICAgICAgICAgICA9IDB4RjE7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbMV0gICAgICAgICAgICAgICA9IDB4MDM7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbNF0gICAgICAgICAgICAgICA9IChCWVRFKWFkZHI7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbM10gICAgICAgICAgICAgICA9IChCWVRFKShhZGRyLzB4MDEwMCk7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbMl0gICAgICAgICAgICAgICA9IE1lZGlhLlpvbmUvMjsKICAgIHBCdWxrQ2J3LT5DQldDYls1XSAgICAgICAgICAgICAgID0gMDsKICAgIHBCdWxrQ2J3LT5DQldDYls2XSAgICAgICAgICAgICAgID0gMTsKCiAgICBudFN0YXR1cyA9IEVORV9TZW5kU2NzaUNtZChmZG9FeHQsIEZESVJfUkVBRCwgcmVkdW5kYW50KTsKCiAgICBpZiAoIU5UX1NVQ0NFU1MobnRTdGF0dXMpKQogICAgICAgcmV0dXJuKEVSUk9SKTsKCiAgICByZXR1cm4oU1VDQ0VTUyk7Cn0qLwo=