I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgInVzYi5oIgojaW5jbHVkZSAic2NzaWdsdWUuaCIKI2luY2x1ZGUgInRyYW5zcG9ydC5oIgovLyNpbmNsdWRlICJpbml0LmgiCgovLyNpbmNsdWRlICJzdGRsaWIuaCIKLy8jaW5jbHVkZSAiRVVDUjZTSy5oIgojaW5jbHVkZSAic21jb21tb24uaCIKI2luY2x1ZGUgInNtaWwuaCIKCnZvaWQgICBfU2V0X0RfU3NmZGNSZENtZCAgICAgKEJZVEUpOwp2b2lkICAgX1NldF9EX1NzZmRjUmRBZGRyICAgIChCWVRFKTsKdm9pZCAgIF9TZXRfRF9Tc2ZkY1JkQ2hpcCAgICAodm9pZCk7CnZvaWQgICBfU2V0X0RfU3NmZGNSZFN0YW5kYnkgKHZvaWQpOwp2b2lkICAgX1N0YXJ0X0RfU3NmZGNSZEh3RUNDICh2b2lkKTsKdm9pZCAgIF9TdG9wX0RfU3NmZGNSZEh3RUNDICAodm9pZCk7CnZvaWQgICBfTG9hZF9EX1NzZmRjUmRId0VDQyAgKEJZVEUpOwp2b2lkICAgX1NldF9EX1NzZmRjV3JDbWQgICAgIChCWVRFKTsKdm9pZCAgIF9TZXRfRF9Tc2ZkY1dyQWRkciAgICAoQllURSk7CnZvaWQgICBfU2V0X0RfU3NmZGNXckJsb2NrICAgKHZvaWQpOwp2b2lkICAgX1NldF9EX1NzZmRjV3JTdGFuZGJ5ICh2b2lkKTsKdm9pZCAgIF9TdGFydF9EX1NzZmRjV3JId0VDQyAodm9pZCk7CnZvaWQgICBfTG9hZF9EX1NzZmRjV3JId0VDQyAgKEJZVEUpOwppbnQgICAgX0NoZWNrX0RfU3NmZGNCdXN5ICAgIChXT1JEKTsKaW50ICAgIF9DaGVja19EX1NzZmRjU3RhdHVzICAodm9pZCk7CnZvaWQgICBfUmVzZXRfRF9Tc2ZkY0VyciAgICAgKHZvaWQpOwp2b2lkICAgX1JlYWRfRF9Tc2ZkY0J1ZiAgICAgIChCWVRFICopOwp2b2lkICAgX1dyaXRlX0RfU3NmZGNCdWYgICAgIChCWVRFICopOwp2b2lkICAgX1JlYWRfRF9Tc2ZkY0J5dGUgICAgIChCWVRFICopOwp2b2lkICAgX1JlYWRSZWR0X0RfU3NmZGNCdWYgIChCWVRFICopOwp2b2lkICAgX1dyaXRlUmVkdF9EX1NzZmRjQnVmIChCWVRFICopOwpCWVRFICAgX0NoZWNrX0RfRGV2Q29kZSAgICAgIChCWVRFKTsKCnZvaWQgICBfU2V0X0RfRUNDZGF0YSAgICAgICAgKEJZVEUsQllURSAqKTsKdm9pZCAgIF9DYWxjX0RfRUNDZGF0YSAgICAgICAoQllURSAqKTsKCi8vdm9pZCAgIFNNX1JlYWREYXRhV2l0aERNQSAgICAgIChQRkRPX0RFVklDRV9FWFRFTlNJT04sIEJZVEUgKiwgV09SRCk7Ci8vdm9pZCAgIFNNX1dyaXRlRGF0YVdpdGhETUEgICAgIChQRkRPX0RFVklDRV9FWFRFTlNJT04sIEJZVEUgKiwgV09SRCk7Ci8vCnN0cnVjdCBTU0ZEQ1RZUEUgICAgICAgICAgICAgICAgU3NmZGM7CnN0cnVjdCBBRERSRVNTICAgICAgICAgICAgICAgICAgTWVkaWE7CnN0cnVjdCBDSVNfQVJFQSAgICAgICAgICAgICAgICAgQ2lzQXJlYTsKCkJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNjQnVmWzZdOwpleHRlcm4gUEJZVEUgICAgICAgICAgICAgICAgICAgIFNNSG9zdEFkZHI7CmV4dGVybiBCWVRFICAgICAgICAgICAgICAgICAgICAgSXNTU0ZEQ0NvbXBsaWFuY2U7CmV4dGVybiBCWVRFICAgICAgICAgICAgICAgICAgICAgSXNYRENvbXBsaWFuY2U7CmV4dGVybiBEV09SRCAgICAgICAgICAgICAgICAgICAgRXJyWERDb2RlOwoKZXh0ZXJuIFdPUkQgIFJlYWRCbG9jazsKZXh0ZXJuIFdPUkQgIFdyaXRlQmxvY2s7CgovL0tFVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgU01fRE1BRG9uZUV2ZW50OwoKI2RlZmluZSBFVkVOICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgIC8vIEV2ZW4gUGFnZSBmb3IgMjU2Ynl0ZS9wYWdlCiNkZWZpbmUgT0REICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAvLyBPZGQgUGFnZSBmb3IgMjU2Ynl0ZS9wYWdlCgoKLy9TbWFydE1lZGlhIFJlZHVuZGFudCBidWZmZXIgZGF0YSBDb250cm9sIFN1YnJvdXRpbmUKLy8tLS0tLSBDaGVja19EX0RhdGFCbGFuaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBDaGVja19EX0RhdGFCbGFuayhCWVRFICpyZWR1bmRhbnQpCnsKCWNoYXIgaTsKCglmb3IoaT0wOyBpPFJFRFRTSVpFOyBpKyspCgkJaWYgKCpyZWR1bmRhbnQrKyE9MHhGRikKCQkJcmV0dXJuKEVSUk9SKTsKCglyZXR1cm4oU1VDQ0VTUyk7Cn0KCi8vLS0tLS0gQ2hlY2tfRF9GYWlsQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ2hlY2tfRF9GYWlsQmxvY2soQllURSAqcmVkdW5kYW50KQp7CglyZWR1bmRhbnQrPVJFRFRfQkxPQ0s7CgoJaWYgKCpyZWR1bmRhbnQ9PTB4RkYpCgkJcmV0dXJuKFNVQ0NFU1MpOwoJaWYgKCEqcmVkdW5kYW50KQoJCXJldHVybihFUlJPUik7CglpZiAoaHdlaWdodDgoKnJlZHVuZGFudCk8NykKCQlyZXR1cm4oRVJST1IpOwoKCXJldHVybihTVUNDRVNTKTsKfQoKLy8tLS0tLSBDaGVja19EX0RhdGFTdGF0dXMoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBDaGVja19EX0RhdGFTdGF0dXMoQllURSAqcmVkdW5kYW50KQp7CglyZWR1bmRhbnQrPVJFRFRfREFUQTsKCglpZiAoKnJlZHVuZGFudD09MHhGRikKCQlyZXR1cm4oU1VDQ0VTUyk7CglpZiAoISpyZWR1bmRhbnQpCgl7CgkJRXJyWERDb2RlID0gRVJSX0RhdGFTdGF0dXM7CgkJcmV0dXJuKEVSUk9SKTsKCX0KCWVsc2UKCQlFcnJYRENvZGUgPSBOT19FUlJPUjsKCglpZiAoaHdlaWdodDgoKnJlZHVuZGFudCk8NSkKCQlyZXR1cm4oRVJST1IpOwoKCXJldHVybihTVUNDRVNTKTsKfQoKLy8tLS0tLSBMb2FkX0RfTG9nQmxvY2tBZGRyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBMb2FkX0RfTG9nQmxvY2tBZGRyKEJZVEUgKnJlZHVuZGFudCkKewoJV09SRCBhZGRyMSxhZGRyMjsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKCWFkZHIxPShXT1JEKSoocmVkdW5kYW50K1JFRFRfQUREUjFIKSoweDAxMDArKFdPUkQpKihyZWR1bmRhbnQrUkVEVF9BRERSMUwpOwoJYWRkcjI9KFdPUkQpKihyZWR1bmRhbnQrUkVEVF9BRERSMkgpKjB4MDEwMCsoV09SRCkqKHJlZHVuZGFudCtSRURUX0FERFIyTCk7CgoJaWYgKGFkZHIxPT1hZGRyMikKCQlpZiAoKGFkZHIxICYweEYwMDApPT0weDEwMDApCgkJeyBNZWRpYS5Mb2dCbG9jaz0oYWRkcjEgJjB4MEZGRikvMjsgcmV0dXJuKFNVQ0NFU1MpOyB9CgoJaWYgKGh3ZWlnaHQxNigoV09SRCkoYWRkcjFeYWRkcjIpKSE9MHgwMSkgcmV0dXJuKEVSUk9SKTsKCglpZiAoKGFkZHIxICYweEYwMDApPT0weDEwMDApCgkJaWYgKCEoaHdlaWdodDE2KGFkZHIxKSAmMHgwMSkpCgkJeyBNZWRpYS5Mb2dCbG9jaz0oYWRkcjEgJjB4MEZGRikvMjsgcmV0dXJuKFNVQ0NFU1MpOyB9CgoJaWYgKChhZGRyMiAmMHhGMDAwKT09MHgxMDAwKQoJCWlmICghKGh3ZWlnaHQxNihhZGRyMikgJjB4MDEpKQoJCXsgTWVkaWEuTG9nQmxvY2s9KGFkZHIyICYweDBGRkYpLzI7IHJldHVybihTVUNDRVNTKTsgfQoKCXJldHVybihFUlJPUik7Cn0KCi8vLS0tLS0gQ2xyX0RfUmVkdW5kYW50RGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIENscl9EX1JlZHVuZGFudERhdGEoQllURSAqcmVkdW5kYW50KQp7CgljaGFyIGk7CgoJZm9yKGk9MDsgaTxSRURUU0laRTsgaSsrKQoJKihyZWR1bmRhbnQraSk9MHhGRjsKfQoKLy8tLS0tLSBTZXRfRF9Mb2dCbG9ja0FkZHIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgU2V0X0RfTG9nQmxvY2tBZGRyKEJZVEUgKnJlZHVuZGFudCkKewoJV09SRCBhZGRyOwoKCSoocmVkdW5kYW50K1JFRFRfQkxPQ0spPTB4RkY7CgkqKHJlZHVuZGFudCtSRURUX0RBVEEpID0weEZGOwoJYWRkcj1NZWRpYS5Mb2dCbG9jayoyKzB4MTAwMDsKCglpZiAoKGh3ZWlnaHQxNihhZGRyKSUyKSkKCQlhZGRyKys7CgoJKihyZWR1bmRhbnQrUkVEVF9BRERSMUgpPSoocmVkdW5kYW50K1JFRFRfQUREUjJIKT0oQllURSkoYWRkci8weDAxMDApOwoJKihyZWR1bmRhbnQrUkVEVF9BRERSMUwpPSoocmVkdW5kYW50K1JFRFRfQUREUjJMKT0oQllURSlhZGRyOwp9CgovLy0tLS0tIFNldF9EX0ZhaWxCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBTZXRfRF9GYWlsQmxvY2soQllURSAqcmVkdW5kYW50KQp7CiAgICBjaGFyIGk7CgogICAgZm9yKGk9MDsgaTxSRURUU0laRTsgaSsrKQogICAgICAgICpyZWR1bmRhbnQrKz0oQllURSkoKGk9PVJFRFRfQkxPQ0spPzB4RjA6MHhGRik7Cn0KCi8vLS0tLS0gU2V0X0RfRGF0YVN0YXVzKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIFNldF9EX0RhdGFTdGF1cyhCWVRFICpyZWR1bmRhbnQpCnsKICAgIHJlZHVuZGFudCs9UkVEVF9EQVRBOwogICAgKnJlZHVuZGFudD0weDAwOwp9CgovL1NtYXJ0TWVkaWEgRnVuY3Rpb24gQ29tbWFuZCBTdWJyb3V0aW5lCi8vIDYyNTAgQ01EIDYKLy8tLS0tLSBTc2ZkY19EX1Jlc2V0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgU3NmZGNfRF9SZXNldChzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCS8vTlRTVEFUVVMgICAgICAgIG50U3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CgkvL1BCVUxLX0NCVyAgICAgICBwQnVsa0NidyA9IGZkb0V4dC0+cEJ1bGtDYnc7CgkvL0JZVEUgICAgICAgICAgICBidWZbMHgyMDBdOwoKCS8vcHJpbnRrKCJTc2ZkY19EX1Jlc2V0IC0tLSBCdXQgZG8gbm90aGluZyAhIVxuIik7CglyZXR1cm47Ci8qCVJ0bFplcm9NZW1vcnkocEJ1bGtDYncsIHNpemVvZihzdHJ1Y3QgX0JVTEtfQ0JXKSk7CglwQnVsa0Nidy0+ZENCV1NpZ25hdHVyZSAgICAgICAgICA9IENCV19TSUdOVFVSRTsKCXBCdWxrQ2J3LT5iQ0JXTHVuICAgICAgICAgICAgICAgID0gQ0JXX0xVTjsKCS8vcEJ1bGtDYnctPmRDQldEYXRhVHJhbnNmZXJMZW5ndGggPSAweDIwMDsKCXBCdWxrQ2J3LT5ibUNCV0ZsYWdzICAgICAgICAgICAgID0gMHg4MDsKCXBCdWxrQ2J3LT5DQldDYlswXSAgICAgICAgICAgICAgID0gMHhGMjsKCXBCdWxrQ2J3LT5DQldDYlsxXSAgICAgICAgICAgICAgID0gMHgwNzsKCgludFN0YXR1cyA9IEVORV9TZW5kU2NzaUNtZChmZG9FeHQsIEZESVJfUkVBRCwgTlVMTCk7CgoJaWYgKCFOVF9TVUNDRVNTKG50U3RhdHVzKSkKCXsKCQlFTkVfUHJpbnQoIlNzZmRjX0RfUmVzZXQgRmFpbCAhIVxuIik7CgkJLy9yZXR1cm4gbnRTdGF0dXM7Cgl9Ki8KfQoKLy8tLS0tLSBTc2ZkY19EX1JlYWRDaXNTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBTc2ZkY19EX1JlYWRDaXNTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKewoJQllURSB6b25lLHNlY3RvcjsKCVdPUkQgYmxvY2s7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCgl6b25lPU1lZGlhLlpvbmU7IGJsb2NrPU1lZGlhLlBoeUJsb2NrOyBzZWN0b3I9TWVkaWEuU2VjdG9yOwoJTWVkaWEuWm9uZT0wOwoJTWVkaWEuUGh5QmxvY2s9Q2lzQXJlYS5QaHlCbG9jazsKCU1lZGlhLlNlY3Rvcj1DaXNBcmVhLlNlY3RvcjsKCglpZiAoU3NmZGNfRF9SZWFkU2VjdCh1cyxidWYscmVkdW5kYW50KSkKCXsKCQlNZWRpYS5ab25lPXpvbmU7IE1lZGlhLlBoeUJsb2NrPWJsb2NrOyBNZWRpYS5TZWN0b3I9c2VjdG9yOwoJCXJldHVybihFUlJPUik7Cgl9CgoJTWVkaWEuWm9uZT16b25lOyBNZWRpYS5QaHlCbG9jaz1ibG9jazsgTWVkaWEuU2VjdG9yPXNlY3RvcjsKCXJldHVybihTVUNDRVNTKTsKfQovKgovLy8vLS0tLS0gU3NmZGNfRF9Xcml0ZVJlZHRNb2RlKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgU3NmZGNfRF9Xcml0ZVJlZHRNb2RlKHZvaWQpCi8vewovLyAgICBfU2V0X0RfU3NmZGNSZENtZCAgICAgKFJTVF9DSElQKTsKLy8gICAgX0NoZWNrX0RfU3NmZGNCdXN5ICAgIChCVVNZX1JFU0VUKTsKLy8gICAgX1NldF9EX1NzZmRjUmRDbWQgICAgIChSRUFEX1JFRFQpOwovLyAgICBfQ2hlY2tfRF9Tc2ZkY0J1c3kgICAgKEJVU1lfUkVBRCk7Ci8vICAgIF9TZXRfRF9Tc2ZkY1JkU3RhbmRieSAoKTsKLy99Ci8vCi8vLy8tLS0tLSBTc2ZkY19EX1JlYWRJRCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBTc2ZkY19EX1JlYWRJRChCWVRFICpidWYsIEJZVEUgUmVhZElEKQovL3sKLy8gICAgX1NldF9EX1NzZmRjUmRDbWQgICAgIChSZWFkSUQpOwovLyAgICBfU2V0X0RfU3NmZGNSZENoaXAgICAgKCk7Ci8vICAgIF9SZWFkX0RfU3NmZGNCeXRlICAgICAoYnVmKyspOwovLyAgICBfUmVhZF9EX1NzZmRjQnl0ZSAgICAgKGJ1ZisrKTsKLy8gICAgX1JlYWRfRF9Tc2ZkY0J5dGUgICAgIChidWYrKyk7Ci8vICAgIF9SZWFkX0RfU3NmZGNCeXRlICAgICAoYnVmKTsKLy8gICAgX1NldF9EX1NzZmRjUmRTdGFuZGJ5ICgpOwovL30KKi8KLy8gNjI1MCBDTUQgMQovLy0tLS0tIFNzZmRjX0RfUmVhZFNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNzZmRjX0RfUmVhZFNlY3Qoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQp7CglzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CglpbnQJcmVzdWx0OwoJV09SRAlhZGRyOwoKCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU01fUldfUEFUVEVSTik7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCXsKCQlwcmludGsoIkxvYWQgU00gUlcgQ29kZSBGYWlsICEhXG4iKTsKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoJfQoKCWFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKCWFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMrTWVkaWEuU2VjdG9yOwoKCS8vIFJlYWQgc2VjdCBkYXRhCgltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwoJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwoJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGgJPSAweDIwMDsKCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CgliY2ItPkNEQlswXQkJCT0gMHhGMTsKCWJjYi0+Q0RCWzFdCQkJPSAweDAyOwoJYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7CgliY2ItPkNEQlszXQkJCT0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKCWJjYi0+Q0RCWzJdCQkJPSBNZWRpYS5ab25lLzI7CgoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIGJ1ZiwgMCk7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCS8vIFJlYWQgcmVkdW5kYW50CgltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwoJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwoJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGgJPSAweDEwOwoJYmNiLT5GbGFncwkJCT0gMHg4MDsKCWJjYi0+Q0RCWzBdCQkJPSAweEYxOwoJYmNiLT5DREJbMV0JCQk9IDB4MDM7CgliY2ItPkNEQls0XQkJCT0gKEJZVEUpYWRkcjsKCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYWRkci8weDAxMDApOwoJYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUvMjsKCWJjYi0+Q0RCWzhdCQkJPSAwOwoJYmNiLT5DREJbOV0JCQk9IDE7CgoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIHJlZHVuZGFudCwgMCk7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKfQoKLy8tLS0tLSBTc2ZkY19EX1JlYWRCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU3NmZGNfRF9SZWFkQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIGNvdW50LCBCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQp7CglzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CglpbnQJcmVzdWx0OwoJV09SRAlhZGRyOwoKCS8vcHJpbnRrKCJTc2ZkY19EX1JlYWRCbG9ja1xuIik7CglyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgl7CgkJcHJpbnRrKCJMb2FkIFNNIFJXIENvZGUgRmFpbCAhIVxuIik7CgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCX0KCglhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7CglhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKCgkvLyBSZWFkIHNlY3QgZGF0YQoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoCT0gMHgyMDAqY291bnQ7CgliY2ItPkZsYWdzCQkJPSAweDgwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjE7CgliY2ItPkNEQlsxXQkJCT0gMHgwMjsKCWJjYi0+Q0RCWzRdCQkJPSAoQllURSlhZGRyOwoJYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7CgliY2ItPkNEQlsyXQkJCT0gTWVkaWEuWm9uZS8yOwoKCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCBidWYsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCgkvLyBSZWFkIHJlZHVuZGFudAoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoCT0gMHgxMDsKCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CgliY2ItPkNEQlswXQkJCT0gMHhGMTsKCWJjYi0+Q0RCWzFdCQkJPSAweDAzOwoJYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7CgliY2ItPkNEQlszXQkJCT0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKCWJjYi0+Q0RCWzJdCQkJPSBNZWRpYS5ab25lLzI7CgliY2ItPkNEQls4XQkJCT0gMDsKCWJjYi0+Q0RCWzldCQkJPSAxOwoKCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCByZWR1bmRhbnQsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KLyoKLy8vLy0tLS0tIFNzZmRjX0RfUmVhZFNlY3RfRE1BKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IFNzZmRjX0RfUmVhZFNlY3RfRE1BKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIEJZVEUgKmJ1ZixCWVRFICpyZWR1bmRhbnQpCi8vewovLyAgICBXT1JEICAgIFNlY3RCeXRlQ291bnQsIGFkZHI7Ci8vICAgIERXT1JEICAgQnVmZmVyWzRdOwovLyAgICBXT1JEICAgIGxlbjsKLy8KLy8gICAgaWYgKCFfSHdfRF9DaGtDYXJkSW4oKSkKLy8gICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgYWRkcj0oV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKLy8gICAgYWRkcj1hZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMrTWVkaWEuU2VjdG9yOwovLyAgICAvLyBjeWNsZSBzdGFydGluZyBhZGRyZXNzCi8vICAgIFNNX1NUQVJUQUREUl9MU0IgPSAweDAwOwovLyAgICBTTV9TVEFSVEFERFJfSUlTQiA9IChCWVRFKWFkZHI7Ci8vICAgIFNNX1NUQVJUQUREUl9JSUlTQiA9IChCWVRFKShhZGRyLzB4MDEwMCk7Ci8vICAgIFNNX1NUQVJUQUREUl9NU0IgPSBNZWRpYS5ab25lLzI7Ci8vCi8vICAgIC8vU2VjdG9yIGJ5dGUgY291bnQgPSAweDIwMChETUEpCi8vICAgIFNlY3RCeXRlQ291bnQgPSAweDIwZjsKLy8gICAgU01fQllURUNOVF9MTyA9IChCWVRFKVNlY3RCeXRlQ291bnQ7Ci8vICAgIFNNX0NNRF9DVFJMMyA9IChTTV9DTURfQ1RSTDMgJiAweEZDKSB8IChCWVRFKShTZWN0Qnl0ZUNvdW50LzB4MDEwMCk7Ci8vICAgIGlmICggKChmZG9FeHQtPkNoaXBJRD09UkVBREVSX0NCNzEyKSYmKGZkb0V4dC0+UmV2SUQ9PUNISVBfQSkpIHx8IGZkb0V4dC0+SXNIaWJlcm5hdGUgKQovLyAgICAgICBTTV9GSUZPX0NUUkwgPSAoU01fQVBCMDhfTUFTSyB8IFNNX0RNQUVOX01BU0sgfCBTTV9ETUFfVVBTVFJFQU1fTUFTSyB8IFNNX0ZJRk9TSExEVkxVXzhfTUFTSyk7Ci8vICAgIGVsc2UKLy8gICAgICAgU01fRklGT19DVFJMID0gKFNNX0FQQjMyX01BU0sgfCBTTV9ETUFFTl9NQVNLIHwgU01fRE1BX1VQU1RSRUFNX01BU0sgfCBTTV9GSUZPU0hMRFZMVV84X01BU0spOwovLwovLyAgICBfSHdfRF9FY2NSZFJlc2V0KCk7Ci8vICAgIF9Id19EX0VjY1JkU3RhcnQoKTsKLy8KLy8gICAgU01fQ01EX0NUUkwxID0gKFNNX0NNRF9SRUFEXzEpOwovLyAgICBTTV9DTURfQ1RSTDEgPSAoU01fQ01EX1JFQURfMSB8IFNNX0NNRF9TVEFSVF9CSVQpOwovLwovLyAgICBTZWN0Qnl0ZUNvdW50ID0gMHgxZmY7Ci8vICAgIC8vU01fUmVhZERhdGFXaXRoRE1BKGZkb0V4dCwgYnVmLCBTZWN0Qnl0ZUNvdW50KTsKLy8gICAgLy9fUmVhZFJlZHRfRF9Tc2ZkY0J1ZihyZWR1bmRhbnQpOwovLyAgICBsZW4gPSAweDEwMDAgLSAoKFdPUkQpKGJ1ZikgJiAweDBGRkYpOwovLyAgICBpZiAobGVuIDwgMHgyMDApCi8vICAgIHsKLy8gICAgICAgU01fUmVhZERhdGFXaXRoRE1BKGZkb0V4dCwgYnVmLCBsZW4tMSk7Ci8vICAgICAgIFNNX1JlYWREYXRhV2l0aERNQShmZG9FeHQsIGJ1ZitsZW4sIFNlY3RCeXRlQ291bnQtbGVuKTsKLy8gICAgICAgLy9FTkVfUHJpbnQoIlJlYWQgRE1BICEhISBidWYxID0gJXAsIGxlbiA9ICV4LCBidWYyID0gJXBcbiIsIGJ1ZiwgbGVuLCBidWYrbGVuKTsKLy8gICAgfQovLyAgICBlbHNlCi8vICAgICAgU01fUmVhZERhdGFXaXRoRE1BKGZkb0V4dCwgYnVmLCBTZWN0Qnl0ZUNvdW50KTsKLy8KLy8gICAgaWYgKCAoKGZkb0V4dC0+Q2hpcElEPT1SRUFERVJfQ0I3MTIpJiYoZmRvRXh0LT5SZXZJRD09Q0hJUF9BKSkgfHwgZmRvRXh0LT5Jc0hpYmVybmF0ZSApCi8vICAgIHsKLy8gICAgICAgX1JlYWRSZWR0X0RfU3NmZGNCdWYocmVkdW5kYW50KTsKLy8gICAgfQovLyAgICBlbHNlCi8vICAgIHsKLy8gICAgICAgQnVmZmVyWzBdID0gUkVBRF9QT1JUX0RXT1JEKFNNX1JFR19EQVRBKTsKLy8gICAgICAgQnVmZmVyWzFdID0gUkVBRF9QT1JUX0RXT1JEKFNNX1JFR19EQVRBKTsKLy8gICAgICAgQnVmZmVyWzJdID0gUkVBRF9QT1JUX0RXT1JEKFNNX1JFR19EQVRBKTsKLy8gICAgICAgQnVmZmVyWzNdID0gUkVBRF9QT1JUX0RXT1JEKFNNX1JFR19EQVRBKTsKLy8gICAgICAgbWVtY3B5KHJlZHVuZGFudCwgQnVmZmVyLCAweDEwKTsKLy8gICAgfQovLwovLyAgICB3aGlsZSAoIF9Id19EX0Noa0NhcmRJbigpICkKLy8gICAgewovLyAgICAgICAgaWYoKFJFQURfUE9SVF9CWVRFKFNNX1JFR19JTlRfU1RBVFVTKSAmIDB4MTApKQovLyAgICAgICAgewovLyAgICAgICAgICAgIFdSSVRFX1BPUlRfQllURShTTV9SRUdfSU5UX1NUQVRVUywgMHgxMCk7Ci8vICAgICAgICAgICAgYnJlYWs7Ci8vICAgICAgICB9Ci8vICAgIH0KLy8gICAgX0h3X0RfRWNjUmRTdG9wKCk7Ci8vICAgIF9Id19EX1NldFJkU3RhbmRieSgpOwovLyAgICBfTG9hZF9EX1NzZmRjUmRId0VDQyhFVkVOKTsKLy8KLy8gICAgX0NhbGNfRF9FQ0NkYXRhKGJ1Zik7Ci8vICAgIF9TZXRfRF9Tc2ZkY1JkU3RhbmRieSgpOwovLwovLyAgICBpZiAoIV9Id19EX0Noa0NhcmRJbigpKQovLyAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICByZXR1cm4oU1VDQ0VTUyk7Ci8vfQovLwovLy8vLS0tLS0gU3NmZGNfRF9SZWFkU2VjdF9QSU8oKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgU3NmZGNfRF9SZWFkU2VjdF9QSU8oUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKLy97Ci8vICAgIF9TZXRfRF9Tc2ZkY1JkQ21kKFJFQUQpOwovLyAgICBfU2V0X0RfU3NmZGNSZEFkZHIoRVZFTik7Ci8vCi8vICAgIGlmIChfQ2hlY2tfRF9Tc2ZkY0J1c3koQlVTWV9SRUFEKSkKLy8gICAgeyBfUmVzZXRfRF9Tc2ZkY0VycigpOyByZXR1cm4oRVJST1IpOyB9Ci8vCi8vICAgIF9TdGFydF9EX1NzZmRjUmRId0VDQygpOwovLyAgICBfUmVhZF9EX1NzZmRjQnVmKGJ1Zik7Ci8vICAgIF9TdG9wX0RfU3NmZGNSZEh3RUNDKCk7Ci8vICAgIF9SZWFkUmVkdF9EX1NzZmRjQnVmKHJlZHVuZGFudCk7Ci8vICAgIF9Mb2FkX0RfU3NmZGNSZEh3RUNDKEVWRU4pOwovLwovLyAgICBpZiAoX0NoZWNrX0RfU3NmZGNCdXN5KEJVU1lfUkVBRCkpCi8vICAgIHsgX1Jlc2V0X0RfU3NmZGNFcnIoKTsgcmV0dXJuKEVSUk9SKTsgfQovLwovLyAgICBfQ2FsY19EX0VDQ2RhdGEoYnVmKTsKLy8gICAgX1NldF9EX1NzZmRjUmRTdGFuZGJ5KCk7Ci8vICAgIHJldHVybihTVUNDRVNTKTsKLy99CgovLyA2MjUwIENNRCAzCi8vLS0tLS0gU3NmZGNfRF9Xcml0ZVNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU3NmZGNfRF9Xcml0ZVNlY3QoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKewogICAgUEJVTEtfQ0JXICAgICAgICAgICAgICAgcEJ1bGtDYncgPSBmZG9FeHQtPnBCdWxrQ2J3OwogICAgTlRTVEFUVVMgICAgICAgICAgICAgICAgbnRTdGF0dXM7CiAgICBXT1JEICAgICAgICAgICAgICAgICAgICBhZGRyOwoKICAgIC8vRU5FX1ByaW50KCJTTUlMU1VCIC0tLSBTc2ZkY19EX1dyaXRlU2VjdFxuIik7CiAgICBFTkVfTG9hZEJpbkNvZGUoZmRvRXh0LCBTTV9SV19QQVRURVJOKTsKCiAgICBhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7CiAgICBhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKCiAgICAvLyBXcml0ZSBzZWN0IGRhdGEKICAgIFJ0bFplcm9NZW1vcnkocEJ1bGtDYncsIHNpemVvZihzdHJ1Y3QgX0JVTEtfQ0JXKSk7CiAgICBwQnVsa0Nidy0+ZENCV1NpZ25hdHVyZSAgICAgICAgICA9IENCV19TSUdOVFVSRTsKICAgIHBCdWxrQ2J3LT5iQ0JXTHVuICAgICAgICAgICAgICAgID0gQ0JXX0xVTjsKICAgIHBCdWxrQ2J3LT5kQ0JXRGF0YVRyYW5zZmVyTGVuZ3RoID0gMHgyMDA7CiAgICBwQnVsa0Nidy0+Ym1DQldGbGFncyAgICAgICAgICAgICA9IDB4MDA7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbMF0gICAgICAgICAgICAgICA9IDB4RjA7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbMV0gICAgICAgICAgICAgICA9IDB4MDQ7CiAgICAvL3BCdWxrQ2J3LT5DQldDYls0XSAgICAgICAgICAgICAgID0gKEJZVEUpYWRkcjsKICAgIC8vcEJ1bGtDYnctPkNCV0NiWzNdICAgICAgICAgICAgICAgPSAoQllURSkoYWRkci8weDAxMDApOwogICAgLy9wQnVsa0Nidy0+Q0JXQ2JbMl0gICAgICAgICAgICAgICA9IE1lZGlhLlpvbmUvMjsKICAgIC8vcEJ1bGtDYnctPkNCV0NiWzVdICAgICAgICAgICAgICAgPSAqKHJlZHVuZGFudCtSRURUX0FERFIxSCk7CiAgICAvL3BCdWxrQ2J3LT5DQldDYls2XSAgICAgICAgICAgICAgID0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUwpOwogICAgcEJ1bGtDYnctPkNCV0NiWzddICAgICAgICAgICAgICAgPSAoQllURSlhZGRyOwogICAgcEJ1bGtDYnctPkNCV0NiWzZdICAgICAgICAgICAgICAgPSAoQllURSkoYWRkci8weDAxMDApOwogICAgcEJ1bGtDYnctPkNCV0NiWzVdICAgICAgICAgICAgICAgPSBNZWRpYS5ab25lLzI7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbOF0gICAgICAgICAgICAgICA9ICoocmVkdW5kYW50K1JFRFRfQUREUjFIKTsKICAgIHBCdWxrQ2J3LT5DQldDYls5XSAgICAgICAgICAgICAgID0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUwpOwoKICAgIG50U3RhdHVzID0gRU5FX1NlbmRTY3NpQ21kKGZkb0V4dCwgRkRJUl9XUklURSwgYnVmKTsKCiAgICBpZiAoIU5UX1NVQ0NFU1MobnRTdGF0dXMpKQogICAgICAgcmV0dXJuKEVSUk9SKTsKCi8vICAvLyBGb3IgVGVzdAovLyAgewovLyAgICAgQllURSAgIGJmWzB4MjAwXSwgcmRkWzB4MTBdOwovLyAgICAgVUxPTkcgIGk7Ci8vCi8vICAgICBSdGxaZXJvTWVtb3J5KGJmLCAweDIwMCk7Ci8vICAgICBSdGxaZXJvTWVtb3J5KHJkZCwgMHgxMCk7Ci8vICAgICBudFN0YXR1cyA9IFNNX1JlYWRCbG9jayhmZG9FeHQsIGJmLCByZGQpOwovLyAgICAgZm9yIChpPTA7IGk8MHgyMDA7IGkrKykKLy8gICAgIHsKLy8gICAgICAgICBpZiAoYnVmW2ldICE9IGJmW2ldKQovLyAgICAgICAgICAgIEVORV9QcmludCgiYnVmWyV4XSA9ICV4LCBiZlsleF0gPSAleFxuIiwgYnVmLCBiZik7Ci8vICAgICB9Ci8vICAgICBpZiAoIU5UX1NVQ0NFU1MobnRTdGF0dXMpKQovLyAgICAgICAgRU5FX1ByaW50KCJFcnJvclxuIik7Ci8vICB9CgogICAgcmV0dXJuKFNVQ0NFU1MpOwp9CiovCi8vLS0tLS0gU3NmZGNfRF9Db3B5QmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU3NmZGNfRF9Db3B5QmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIGNvdW50LCBCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQp7CglzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CglpbnQJcmVzdWx0OwogICAgLy9QQlVMS19DQlcgICAgICAgICAgICAgICBwQnVsa0NidyA9IGZkb0V4dC0+cEJ1bGtDYnc7CiAgICAvL05UU1RBVFVTICAgICAgICAgICAgICAgIG50U3RhdHVzOwoJV09SRAlSZWFkQWRkciwgV3JpdGVBZGRyOwoKCS8vcHJpbnRrKCJTc2ZkY19EX1dyaXRlU2VjdCAtLS0gWk9ORSA9ICV4LCBSZWFkQmxvY2sgPSAleCwgV3JpdGVCbG9jayA9ICV4XG4iLCBNZWRpYS5ab25lLCBSZWFkQmxvY2ssIFdyaXRlQmxvY2spOwoKCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU01fUldfUEFUVEVSTik7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCXsKCQlwcmludGsoIkxvYWQgU00gUlcgQ29kZSBGYWlsICEhXG4iKTsKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoJfQoKCVJlYWRBZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrUmVhZEJsb2NrOwoJUmVhZEFkZHIgPSBSZWFkQWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzOwoJV3JpdGVBZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrV3JpdGVCbG9jazsKCVdyaXRlQWRkciA9IFdyaXRlQWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzOwoKCS8vIFdyaXRlIHNlY3QgZGF0YQoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoCT0gMHgyMDAqY291bnQ7CgliY2ItPkZsYWdzCQkJPSAweDAwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjA7CgliY2ItPkNEQlsxXQkJCT0gMHgwODsKCWJjYi0+Q0RCWzddCQkJPSAoQllURSlXcml0ZUFkZHI7CgliY2ItPkNEQls2XQkJCT0gKEJZVEUpKFdyaXRlQWRkci8weDAxMDApOwoJYmNiLT5DREJbNV0JCQk9IE1lZGlhLlpvbmUvMjsKCWJjYi0+Q0RCWzhdCQkJPSAqKHJlZHVuZGFudCtSRURUX0FERFIxSCk7CgliY2ItPkNEQls5XQkJCT0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUwpOwoJYmNiLT5DREJbMTBdCQk9IE1lZGlhLlNlY3RvcjsKCglpZiAoUmVhZEJsb2NrICE9IE5PX0FTU0lHTikKCXsKCQliY2ItPkNEQls0XQkJPSAoQllURSlSZWFkQWRkcjsKCQliY2ItPkNEQlszXQkJPSAoQllURSkoUmVhZEFkZHIvMHgwMTAwKTsKCQliY2ItPkNEQlsyXQkJPSBNZWRpYS5ab25lLzI7Cgl9CgllbHNlCgkJYmNiLT5DREJbMTFdCT0gMTsKCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfV1JJVEUsIGJ1ZiwgMCk7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKfQovKgovLy0tLS0tIFNzZmRjX0RfV3JpdGVCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBTc2ZkY19EX1dyaXRlQmxvY2soUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgV09SRCBjb3VudCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKewogICAgUEJVTEtfQ0JXICAgICAgICAgICAgICAgcEJ1bGtDYncgPSBmZG9FeHQtPnBCdWxrQ2J3OwogICAgTlRTVEFUVVMgICAgICAgICAgICAgICAgbnRTdGF0dXM7CiAgICBXT1JEICAgICAgICAgICAgICAgICAgICBhZGRyOwoKICAgIC8vRU5FX1ByaW50KCJTTUlMU1VCIC0tLSBTc2ZkY19EX1dyaXRlU2VjdFxuIik7CiAgICBFTkVfTG9hZEJpbkNvZGUoZmRvRXh0LCBTTV9SV19QQVRURVJOKTsKCiAgICBhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7CiAgICBhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKCiAgICAvLyBXcml0ZSBzZWN0IGRhdGEKICAgIFJ0bFplcm9NZW1vcnkocEJ1bGtDYncsIHNpemVvZihzdHJ1Y3QgX0JVTEtfQ0JXKSk7CiAgICBwQnVsa0Nidy0+ZENCV1NpZ25hdHVyZSAgICAgICAgICA9IENCV19TSUdOVFVSRTsKICAgIHBCdWxrQ2J3LT5iQ0JXTHVuICAgICAgICAgICAgICAgID0gQ0JXX0xVTjsKICAgIHBCdWxrQ2J3LT5kQ0JXRGF0YVRyYW5zZmVyTGVuZ3RoID0gMHgyMDAqY291bnQ7CiAgICBwQnVsa0Nidy0+Ym1DQldGbGFncyAgICAgICAgICAgICA9IDB4MDA7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbMF0gICAgICAgICAgICAgICA9IDB4RjA7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbMV0gICAgICAgICAgICAgICA9IDB4MDQ7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbN10gICAgICAgICAgICAgICA9IChCWVRFKWFkZHI7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbNl0gICAgICAgICAgICAgICA9IChCWVRFKShhZGRyLzB4MDEwMCk7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbNV0gICAgICAgICAgICAgICA9IE1lZGlhLlpvbmUvMjsKICAgIHBCdWxrQ2J3LT5DQldDYls4XSAgICAgICAgICAgICAgID0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUgpOwogICAgcEJ1bGtDYnctPkNCV0NiWzldICAgICAgICAgICAgICAgPSAqKHJlZHVuZGFudCtSRURUX0FERFIxTCk7CgogICAgbnRTdGF0dXMgPSBFTkVfU2VuZFNjc2lDbWQoZmRvRXh0LCBGRElSX1dSSVRFLCBidWYpOwoKICAgIGlmICghTlRfU1VDQ0VTUyhudFN0YXR1cykpCiAgICAgICByZXR1cm4oRVJST1IpOwoKLy8gIC8vIEZvciBUZXN0Ci8vICB7Ci8vICAgICBCWVRFICAgYmZbMHgyMDBdLCByZGRbMHgxMF07Ci8vICAgICBVTE9ORyAgaTsKLy8KLy8gICAgIFJ0bFplcm9NZW1vcnkoYmYsIDB4MjAwKTsKLy8gICAgIFJ0bFplcm9NZW1vcnkocmRkLCAweDEwKTsKLy8gICAgIG50U3RhdHVzID0gU01fUmVhZEJsb2NrKGZkb0V4dCwgYmYsIHJkZCk7Ci8vICAgICBmb3IgKGk9MDsgaTwweDIwMDsgaSsrKQovLyAgICAgewovLyAgICAgICAgIGlmIChidWZbaV0gIT0gYmZbaV0pCi8vICAgICAgICAgICAgRU5FX1ByaW50KCJidWZbJXhdID0gJXgsIGJmWyV4XSA9ICV4XG4iLCBidWYsIGJmKTsKLy8gICAgIH0KLy8gICAgIGlmICghTlRfU1VDQ0VTUyhudFN0YXR1cykpCi8vICAgICAgICBFTkVfUHJpbnQoIkVycm9yXG4iKTsKLy8gIH0KCiAgICByZXR1cm4oU1VDQ0VTUyk7Cn0KLy8KLy8vLy0tLS0tIFNzZmRjX0RfV3JpdGVTZWN0X0RNQSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IFNzZmRjX0RfV3JpdGVTZWN0X0RNQShQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQovL3sKLy8gICAgV09SRCAgICBTZWN0Qnl0ZUNvdW50LCBhZGRyOwovLyAgICBEV09SRCAgIEJ1ZmZlcls0XTsKLy8gICAgV09SRCAgICBsZW47Ci8vCi8vICAgIGlmICghX0h3X0RfQ2hrQ2FyZEluKCkpCi8vICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgIGFkZHI9KFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7Ci8vICAgIGFkZHI9YWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKLy8gICAgLy8gY3ljbGUgc3RhcnRpbmcgYWRkcmVzcwovLyAgICBTTV9TVEFSVEFERFJfTFNCID0gMHgwMDsKLy8gICAgU01fU1RBUlRBRERSX0lJU0IgPSAoQllURSlhZGRyOwovLyAgICBTTV9TVEFSVEFERFJfSUlJU0IgPSAoQllURSkoYWRkci8weDAxMDApOwovLyAgICBTTV9TVEFSVEFERFJfTVNCID0gTWVkaWEuWm9uZS8yOwovLwovLyAgICAvL1NlY3RvciBieXRlIGNvdW50IChETUEpCi8vICAgIFNlY3RCeXRlQ291bnQgPSAweDIwZjsKLy8gICAgU01fQllURUNOVF9MTyA9IChCWVRFKVNlY3RCeXRlQ291bnQ7Ci8vICAgIFNNX0NNRF9DVFJMMyA9IChTTV9DTURfQ1RSTDMgJiAweEZDKSB8IDB4MjAgfCAoQllURSkoU2VjdEJ5dGVDb3VudC8weDAxMDApOwovLyAgICBpZiAoICgoZmRvRXh0LT5DaGlwSUQ9PVJFQURFUl9DQjcxMikmJihmZG9FeHQtPlJldklEPT1DSElQX0EpKSB8fCBmZG9FeHQtPklzSGliZXJuYXRlICkKLy8gICAgICAgU01fRklGT19DVFJMID0gKFNNX0FQQjA4X01BU0sgfCBTTV9ETUFFTl9NQVNLIHwgU01fRE1BX0RPV05TVFJFQU1fTUFTSyB8IFNNX0ZJRk9TSExEVkxVXzhfTUFTSyk7Ci8vICAgIGVsc2UKLy8gICAgICAgU01fRklGT19DVFJMID0gKFNNX0FQQjMyX01BU0sgfCBTTV9ETUFFTl9NQVNLIHwgU01fRE1BX0RPV05TVFJFQU1fTUFTSyB8IFNNX0ZJRk9TSExEVkxVXzhfTUFTSyk7Ci8vCi8vICAgIF9Id19EX0VjY1JkUmVzZXQoKTsKLy8gICAgX0h3X0RfRWNjUmRTdGFydCgpOwovLwovLyAgICBTTV9DTURfQ1RSTDEgPSBTTV9DTURfUEFHUFJHTV9UUlVFOwovLyAgICBTTV9DTURfQ1RSTDEgPSAoU01fQ01EX1BBR1BSR01fVFJVRSB8IFNNX0NNRF9TVEFSVF9CSVQpOwovLwovLyAgICBTZWN0Qnl0ZUNvdW50ID0gMHgxZmY7Ci8vICAgIC8vU01fV3JpdGVEYXRhV2l0aERNQShmZG9FeHQsIGJ1ZiwgU2VjdEJ5dGVDb3VudCk7Ci8vICAgIC8vX1dyaXRlUmVkdF9EX1NzZmRjQnVmKHJlZHVuZGFudCk7Ci8vICAgIGxlbiA9IDB4MTAwMCAtICgoV09SRCkoYnVmKSAmIDB4MEZGRik7Ci8vICAgIGlmIChsZW4gPCAweDIwMCkKLy8gICAgewovLyAgICAgICBTTV9Xcml0ZURhdGFXaXRoRE1BKGZkb0V4dCwgYnVmLCBsZW4tMSk7Ci8vICAgICAgIFNNX1dyaXRlRGF0YVdpdGhETUEoZmRvRXh0LCBidWYrbGVuLCBTZWN0Qnl0ZUNvdW50LWxlbik7Ci8vICAgICAgIC8vRU5FX1ByaW50KCJSZWFkIERNQSAhISEgYnVmMSA9ICVwLCBsZW4gPSAleCwgYnVmMiA9ICVwXG4iLCBidWYsIGxlbiwgYnVmK2xlbik7Ci8vICAgIH0KLy8gICAgZWxzZQovLyAgICAgIFNNX1dyaXRlRGF0YVdpdGhETUEoZmRvRXh0LCBidWYsIFNlY3RCeXRlQ291bnQpOwovLwovLyAgICAvL1QxID0gKFVMT05HTE9ORylidWYgJiAweEZGRkZGRkZGRkZGRkYwMDA7Ci8vICAgIC8vVDIgPSAoKFVMT05HTE9ORylidWYgKyAweDFGRikgJiAweEZGRkZGRkZGRkZGRkYwMDA7Ci8vICAgIC8vaWYgKFQxICE9IFQyKQovLyAgICAvLyAgIEVORV9QcmludCgiU3NmZGNfRF9Xcml0ZVNlY3RfRE1BICEhISBidWYgPSAlcCwgVDEgPSAlcCwgVDIgPSAlcFxuIiwgYnVmLCBUMSwgVDIpOwovLyAgICAvL2lmIChUMi1UMSkKLy8gICAgLy97Ci8vICAgIC8vICAgbDEgPSAoV09SRCkoVDIgLSAoVUxPTkdMT05HKWJ1Zik7Ci8vICAgIC8vICAgU01fV3JpdGVEYXRhV2l0aERNQShmZG9FeHQsIGJ1ZiwgbDEtMSk7Ci8vICAgIC8vICAgU01fV3JpdGVEYXRhV2l0aERNQShmZG9FeHQsIChQQllURSlUMiwgU2VjdEJ5dGVDb3VudC1sMSk7Ci8vICAgIC8vfQovLyAgICAvL2Vsc2UKLy8gICAgLy8gIFNNX1dyaXRlRGF0YVdpdGhETUEoZmRvRXh0LCBidWYsIFNlY3RCeXRlQ291bnQpOwovLwovLyAgICBpZiAoICgoZmRvRXh0LT5DaGlwSUQ9PVJFQURFUl9DQjcxMikmJihmZG9FeHQtPlJldklEPT1DSElQX0EpKSB8fCBmZG9FeHQtPklzSGliZXJuYXRlICkKLy8gICAgewovLyAgICAgICBfV3JpdGVSZWR0X0RfU3NmZGNCdWYocmVkdW5kYW50KTsKLy8gICAgfQovLyAgICBlbHNlCi8vICAgIHsKLy8gICAgICAgbWVtY3B5KEJ1ZmZlciwgcmVkdW5kYW50LCAweDEwKTsKLy8gICAgICAgV1JJVEVfUE9SVF9EV09SRChTTV9SRUdfREFUQSwgQnVmZmVyWzBdKTsKLy8gICAgICAgV1JJVEVfUE9SVF9EV09SRChTTV9SRUdfREFUQSwgQnVmZmVyWzFdKTsKLy8gICAgICAgV1JJVEVfUE9SVF9EV09SRChTTV9SRUdfREFUQSwgQnVmZmVyWzJdKTsKLy8gICAgICAgV1JJVEVfUE9SVF9EV09SRChTTV9SRUdfREFUQSwgQnVmZmVyWzNdKTsKLy8gICAgfQovLwovLyAgICB3aGlsZSAoIF9Id19EX0Noa0NhcmRJbigpICkKLy8gICAgewovLyAgICAgICBpZiAoKFJFQURfUE9SVF9CWVRFKFNNX1JFR19JTlRfU1RBVFVTKSAmIDB4MTApKQovLyAgICAgICB7Ci8vICAgICAgICAgICBXUklURV9QT1JUX0JZVEUoU01fUkVHX0lOVF9TVEFUVVMsIDB4MTApOwovLyAgICAgICAgICAgYnJlYWs7Ci8vICAgICAgIH0KLy8gICAgfQovLyAgICBfSHdfRF9FY2NSZFN0b3AoKTsKLy8gICAgX0h3X0RfU2V0UmRTdGFuZGJ5KCk7Ci8vCi8vICAgIF9TZXRfRF9Tc2ZkY1dyU3RhbmRieSgpOwovLyAgICBfU2V0X0RfU3NmZGNSZFN0YW5kYnkoKTsKLy8gICAgaWYgKCFfSHdfRF9DaGtDYXJkSW4oKSkKLy8gICAgICAgcmV0dXJuKEVSUk9SKTsKLy8KLy8gICAgcmV0dXJuKFNVQ0NFU1MpOwovL30KLy8KLy8vLy0tLS0tIFNzZmRjX0RfV3JpdGVTZWN0X1BJTygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IFNzZmRjX0RfV3JpdGVTZWN0X1BJTyhQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQovL3sKLy8gICAgX0NhbGNfRF9FQ0NkYXRhKGJ1Zik7Ci8vICAgIF9TZXRfRF9Tc2ZkY1dyQ21kKFdSREFUQSk7Ci8vICAgIF9TZXRfRF9Tc2ZkY1dyQWRkcihFVkVOKTsKLy8gICAgX1N0YXJ0X0RfU3NmZGNXckh3RUNDKCk7Ci8vCi8vICAgIF9Xcml0ZV9EX1NzZmRjQnVmKGJ1Zik7Ci8vCi8vICAgIF9Mb2FkX0RfU3NmZGNXckh3RUNDKEVWRU4pOwovLyAgICBfU2V0X0RfRUNDZGF0YShFVkVOLHJlZHVuZGFudCk7Ci8vCi8vICAgIF9Xcml0ZVJlZHRfRF9Tc2ZkY0J1ZihyZWR1bmRhbnQpOwovLwovLyAgICBfU2V0X0RfU3NmZGNXckNtZChXUklURSk7Ci8vCi8vICAgIGlmIChfQ2hlY2tfRF9Tc2ZkY0J1c3koQlVTWV9QUk9HKSkKLy8gICAgeyBfUmVzZXRfRF9Tc2ZkY0VycigpOyByZXR1cm4oRVJST1IpOyB9Ci8vCi8vICAgIF9TZXRfRF9Tc2ZkY1dyU3RhbmRieSgpOwovLyAgICBfU2V0X0RfU3NmZGNSZFN0YW5kYnkoKTsKLy8gICAgcmV0dXJuKFNVQ0NFU1MpOwovL30KKi8KLy8tLS0tLSBTc2ZkY19EX1dyaXRlU2VjdEZvckNvcHkoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBTc2ZkY19EX1dyaXRlU2VjdEZvckNvcHkoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFICpidWYsIEJZVEUgKnJlZHVuZGFudCkKewoJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwoJaW50CXJlc3VsdDsKCS8vUEJVTEtfQ0JXICAgICAgICAgICAgICAgcEJ1bGtDYncgPSBmZG9FeHQtPnBCdWxrQ2J3OwoJLy9OVFNUQVRVUyAgICAgICAgICAgICAgICBudFN0YXR1czsKCVdPUkQgICAgICAgICAgICAgICAgICAgIGFkZHI7CgoJLy9wcmludGsoIlNNSUxTVUIgLS0tIFNzZmRjX0RfV3JpdGVTZWN0Rm9yQ29weVxuIik7CglyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgl7CgkJcHJpbnRrKCJMb2FkIFNNIFJXIENvZGUgRmFpbCAhIVxuIik7CgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCX0KCgoJYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwoJYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7CgoJLy8gV3JpdGUgc2VjdCBkYXRhCgltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwoJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwoJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGgJPSAweDIwMDsKCWJjYi0+RmxhZ3MJCQk9IDB4MDA7CgliY2ItPkNEQlswXQkJCT0gMHhGMDsKCWJjYi0+Q0RCWzFdCQkJPSAweDA0OwoJYmNiLT5DREJbN10JCQk9IChCWVRFKWFkZHI7CgliY2ItPkNEQls2XQkJCT0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKCWJjYi0+Q0RCWzVdCQkJPSBNZWRpYS5ab25lLzI7CgliY2ItPkNEQls4XQkJCT0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUgpOwoJYmNiLT5DREJbOV0JCQk9ICoocmVkdW5kYW50K1JFRFRfQUREUjFMKTsKCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfV1JJVEUsIGJ1ZiwgMCk7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKfQoKLy8gNjI1MCBDTUQgNQovLy0tLS0tIFNzZmRjX0RfRXJhc2VCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNzZmRjX0RfRXJhc2VCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKCWludAlyZXN1bHQ7CglXT1JECWFkZHI7CgoJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJewoJCXByaW50aygiTG9hZCBTTSBSVyBDb2RlIEZhaWwgISFcbiIpOwoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7Cgl9CgoJYWRkcj0oV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKCWFkZHI9YWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzOwoKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aAk9IDB4MjAwOwoJYmNiLT5GbGFncwkJCT0gMHg4MDsKCWJjYi0+Q0RCWzBdCQkJPSAweEYyOwoJYmNiLT5DREJbMV0JCQk9IDB4MDY7CgliY2ItPkNEQls3XQkJCT0gKEJZVEUpYWRkcjsKCWJjYi0+Q0RCWzZdCQkJPSAoQllURSkoYWRkci8weDAxMDApOwoJYmNiLT5DREJbNV0JCQk9IE1lZGlhLlpvbmUvMjsKCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgTlVMTCwgMCk7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKfQoKLy8gNjI1MCBDTUQgMgovLy0tLS0tIFNzZmRjX0RfUmVhZFJlZHREYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNzZmRjX0RfUmVhZFJlZHREYXRhKHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqcmVkdW5kYW50KQp7CglzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CglpbnQJcmVzdWx0OwoJV09SRAlhZGRyOwoJQllURSAgKmJ1ZjsKCglyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgl7CgkJcHJpbnRrKCJMb2FkIFNNIFJXIENvZGUgRmFpbCAhIVxuIik7CgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCX0KCglhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7CglhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKCgltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwoJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwoJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGgJPSAweDEwOwoJYmNiLT5GbGFncwkJCT0gMHg4MDsKCWJjYi0+Q0RCWzBdCQkJPSAweEYxOwoJYmNiLT5DREJbMV0JCQk9IDB4MDM7CgliY2ItPkNEQls0XQkJCT0gKEJZVEUpYWRkcjsKCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYWRkci8weDAxMDApOwoJYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUvMjsKCWJjYi0+Q0RCWzhdCQkJPSAwOwoJYmNiLT5DREJbOV0JCQk9IDE7CgoJYnVmID0ga21hbGxvYygweDEwLCBHRlBfS0VSTkVMKTsKCS8vcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIHJlZHVuZGFudCwgMCk7CglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgYnVmLCAwKTsKCW1lbWNweShyZWR1bmRhbnQsIGJ1ZiwgMHgxMCk7CglrZnJlZShidWYpOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KCi8vIDYyNTAgQ01EIDQKLy8tLS0tLSBTc2ZkY19EX1dyaXRlUmVkdERhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBTc2ZkY19EX1dyaXRlUmVkdERhdGEoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFICpyZWR1bmRhbnQpCnsKCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKCWludAlyZXN1bHQ7CgkvL1BCVUxLX0NCVyAgICAgICAgICAgICAgIHBCdWxrQ2J3ID0gZmRvRXh0LT5wQnVsa0NidzsKCS8vTlRTVEFUVVMgICAgICAgICAgICAgICAgbnRTdGF0dXM7CglXT1JEICAgICAgICAgICAgICAgICAgICBhZGRyOwoKCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU01fUldfUEFUVEVSTik7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCXsKCQlwcmludGsoIkxvYWQgU00gUlcgQ29kZSBGYWlsICEhXG4iKTsKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoJfQoKCWFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKCWFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMrTWVkaWEuU2VjdG9yOwoKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aAk9IDB4MTA7CgliY2ItPkZsYWdzCQkJPSAweDgwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjI7CgliY2ItPkNEQlsxXQkJCT0gMHgwNTsKCWJjYi0+Q0RCWzddCQkJPSAoQllURSlhZGRyOwoJYmNiLT5DREJbNl0JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7CgliY2ItPkNEQls1XQkJCT0gTWVkaWEuWm9uZS8yOwoJYmNiLT5DREJbOF0JCQk9ICoocmVkdW5kYW50K1JFRFRfQUREUjFIKTsKCWJjYi0+Q0RCWzldCQkJPSAqKHJlZHVuZGFudCtSRURUX0FERFIxTCk7CgoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIE5VTEwsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KCi8vLS0tLS0gU3NmZGNfRF9DaGVja1N0YXR1cygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU3NmZGNfRF9DaGVja1N0YXR1cyh2b2lkKQp7CiAgICAvLyBEcml2ZXIgpKOwtQogICAgcmV0dXJuKFNVQ0NFU1MpOwogICAgLy9fU2V0X0RfU3NmZGNSZENtZChSRFNUQVRVUyk7CiAgICAvLwogICAgLy9pZiAoX0NoZWNrX0RfU3NmZGNTdGF0dXMoKSkKICAgIC8veyBfU2V0X0RfU3NmZGNSZFN0YW5kYnkoKTsgcmV0dXJuKEVSUk9SKTsgfQogICAgLy8KICAgIC8vX1NldF9EX1NzZmRjUmRTdGFuZGJ5KCk7CiAgICAvL3JldHVybihTVUNDRVNTKTsKfQovKgovLy8vTkFORCBNZW1vcnkgKFNtYXJ0TWVkaWEpIENvbnRyb2wgU3Vicm91dGluZSBmb3IgUmVhZCBEYXRhCi8vLy8tLS0tLSBfU2V0X0RfU3NmZGNSZENtZCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfU2V0X0RfU3NmZGNSZENtZChCWVRFIGNtZCkKLy97Ci8vICAgIF9Id19EX1NldFJkQ21kKCk7Ci8vICAgIF9Id19EX091dERhdGEoY21kKTsKLy8gICAgX0h3X0RfU2V0UmREYXRhKCk7Ci8vfQovLwovLy8vLS0tLS0gX1NldF9EX1NzZmRjUmRBZGRyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1NldF9EX1NzZmRjUmRBZGRyKEJZVEUgYWRkKQovL3sKLy8gICAgV09SRCBhZGRyOwovLyAgICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKLy8gICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7Ci8vCi8vICAgIGFkZHI9KFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7Ci8vICAgIGFkZHI9YWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKLy8KLy8gICAgLy9pZiAoKFNzZmRjLkF0dHJpYnV0ZSAmTVBTKT09UFMyNTYpIC8vIGZvciAyNTZieXRlL3BhZ2UKLy8gICAgLy8gICAgYWRkcj1hZGRyKjIrKFdPUkQpYWRkOwovLwovLyAgICBfSHdfRF9TZXRSZEFkZHIoKTsKLy8gICAgX0h3X0RfT3V0RGF0YSgweDAwKTsKLy8gICAgX0h3X0RfT3V0RGF0YSgoQllURSlhZGRyKTsKLy8gICAgX0h3X0RfT3V0RGF0YSgoQllURSkoYWRkci8weDAxMDApKTsKLy8KLy8gICAgaWYgKChTc2ZkYy5BdHRyaWJ1dGUgJk1BREMpPT1BRDRDWUMpCi8vICAgICAgICBfSHdfRF9PdXREYXRhKChCWVRFKShNZWRpYS5ab25lLzIpKTsgLy8gUGF0Y2gKLy8KLy8gICAgX0h3X0RfU2V0UmREYXRhKCk7Ci8vfQovLwovLy8vLS0tLS0gX1NldF9EX1NzZmRjUmRDaGlwKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1NldF9EX1NzZmRjUmRDaGlwKHZvaWQpCi8vewovLyAgICBfSHdfRF9TZXRSZEFkZHIoKTsKLy8gICAgX0h3X0RfT3V0RGF0YSgweDAwKTsKLy8gICAgX0h3X0RfU2V0UmREYXRhKCk7Ci8vfQovLwovLy8vLS0tLS0gX1NldF9EX1NzZmRjUmRTdGFuZGJ5KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1NldF9EX1NzZmRjUmRTdGFuZGJ5KHZvaWQpCi8vewovLyAgICBfSHdfRF9TZXRSZFN0YW5kYnkoKTsKLy99Ci8vCi8vLy8tLS0tLSBfU3RhcnRfRF9Tc2ZkY1JkSHdFQ0MoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfU3RhcnRfRF9Tc2ZkY1JkSHdFQ0Modm9pZCkKLy97Ci8vI2lmZGVmIEhXX0VDQ19TVVBQT1JURUQKLy8gICAgX0h3X0RfRWNjUmRSZXNldCgpOwovLyAgICBfSHdfRF9JbkRhdGEoKTsKLy8gICAgX0h3X0RfRWNjUmRTdGFydCgpOwovLyNlbmRpZgovL30KLy8KLy8vLy0tLS0tIF9TdG9wX0RfU3NmZGNSZEh3RUNDKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9TdG9wX0RfU3NmZGNSZEh3RUNDKHZvaWQpCi8vewovLyNpZmRlZiBIV19FQ0NfU1VQUE9SVEVECi8vICAgIF9Id19EX0VjY1JkU3RvcCgpOwovLyNlbmRpZgovL30KLy8KLy8vLy0tLS0tIF9Mb2FkX0RfU3NmZGNSZEh3RUNDKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9Mb2FkX0RfU3NmZGNSZEh3RUNDKEJZVEUgYWRkKQovL3sKLy8jaWZkZWYgSFdfRUNDX1NVUFBPUlRFRAovLyAgICBfSHdfRF9FY2NSZFJlYWQoKTsKLy8gICAgLy9pZiAoIShhZGQ9PU9ERCAmJiAoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1NikpCi8vICAgIHsKLy8gICAgICAgIEVjY0J1ZlswXT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgICAgIEVjY0J1ZlsxXT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgICAgIEVjY0J1ZlsyXT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgfQovLwovLyAgICAvL2lmICghKGFkZD09RVZFTiAmJiAoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1NikpCi8vICAgIHsKLy8gICAgICAgIEVjY0J1ZlszXT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgICAgIEVjY0J1Zls0XT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgICAgIEVjY0J1Zls1XT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgfQovLwovLyAgICBfSHdfRF9FY2NSZFN0b3AoKTsKLy8jZW5kaWYKLy99Ci8vCi8vLy9OQU5EIE1lbW9yeSAoU21hcnRNZWRpYSkgQ29udHJvbCBTdWJyb3V0aW5lIGZvciBXcml0ZSBEYXRhCi8vCi8vLy8tLS0tLSBfU2V0X0RfU3NmZGNXckNtZCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfU2V0X0RfU3NmZGNXckNtZChCWVRFIGNtZCkKLy97Ci8vICAgIF9Id19EX1NldFdyQ21kKCk7Ci8vICAgIF9Id19EX091dERhdGEoY21kKTsKLy8gICAgX0h3X0RfU2V0V3JEYXRhKCk7Ci8vfQovLwovLy8vLS0tLS0gX1NldF9EX1NzZmRjV3JBZGRyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9TZXRfRF9Tc2ZkY1dyQWRkcihCWVRFIGFkZCkKLy97Ci8vICAgIFdPUkQgYWRkcjsKLy8gICAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7Ci8vICAgIEFERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwovLwovLyAgICBhZGRyPShXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwovLyAgICBhZGRyPWFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7Ci8vCi8vICAgIC8vaWYgKChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KSAvLyBmb3IgMjU2Ynl0ZS9wYWdlCi8vICAgIC8vICAgIGFkZHI9YWRkcioyKyhXT1JEKWFkZDsKLy8KLy8gICAgX0h3X0RfU2V0V3JBZGRyKCk7Ci8vICAgIF9Id19EX091dERhdGEoMHgwMCk7Ci8vICAgIF9Id19EX091dERhdGEoKEJZVEUpYWRkcik7Ci8vICAgIF9Id19EX091dERhdGEoKEJZVEUpKGFkZHIvMHgwMTAwKSk7Ci8vCi8vICAgIGlmICgoU3NmZGMuQXR0cmlidXRlICZNQURDKT09QUQ0Q1lDKQovLyAgICAgICAgX0h3X0RfT3V0RGF0YSgoQllURSkoTWVkaWEuWm9uZS8yKSk7IC8vIFBhdGNoCi8vCi8vICAgIF9Id19EX1NldFdyRGF0YSgpOwovL30KLy8KLy8vLy0tLS0tIF9TZXRfRF9Tc2ZkY1dyQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1NldF9EX1NzZmRjV3JCbG9jayh2b2lkKQovL3sKLy8gICAgV09SRCBhZGRyOwovLyAgICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKLy8gICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7Ci8vCi8vICAgIGFkZHI9KFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7Ci8vICAgIGFkZHI9YWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzOwovLwovLyAgICAvL2lmICgoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1NikgLy8gZm9yIDI1NmJ5dGUvcGFnZQovLyAgICAvLyAgICBhZGRyPWFkZHIqMjsKLy8KLy8gICAgX0h3X0RfU2V0V3JBZGRyKCk7Ci8vICAgIF9Id19EX091dERhdGEoKEJZVEUpYWRkcik7Ci8vICAgIF9Id19EX091dERhdGEoKEJZVEUpKGFkZHIvMHgwMTAwKSk7Ci8vCi8vICAgIGlmICgoU3NmZGMuQXR0cmlidXRlICZNQURDKT09QUQ0Q1lDKQovLyAgICAgICAgX0h3X0RfT3V0RGF0YSgoQllURSkoTWVkaWEuWm9uZS8yKSk7IC8vIFBhdGNoCi8vCi8vICAgIF9Id19EX1NldFdyRGF0YSgpOwovL30KLy8KLy8vLy0tLS0tIF9TZXRfRF9Tc2ZkY1dyU3RhbmRieSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfU2V0X0RfU3NmZGNXclN0YW5kYnkodm9pZCkKLy97Ci8vICAgIF9Id19EX1NldFdyU3RhbmRieSgpOwovL30KLy8KLy8vLy0tLS0tIF9TdGFydF9EX1NzZmRjV3JId0VDQygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfU3RhcnRfRF9Tc2ZkY1dySHdFQ0Modm9pZCkKLy97Ci8vI2lmZGVmIEhXX0VDQ19TVVBQT1JURUQKLy8gICAgX0h3X0RfRWNjV3JSZXNldCgpOwovLyAgICBfSHdfRF9JbkRhdGEoKTsKLy8gICAgX0h3X0RfRWNjV3JTdGFydCgpOwovLyNlbmRpZgovL30KLy8KLy8vLy0tLS0tIF9Mb2FkX0RfU3NmZGNXckh3RUNDKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9Mb2FkX0RfU3NmZGNXckh3RUNDKEJZVEUgYWRkKQovL3sKLy8jaWZkZWYgSFdfRUNDX1NVUFBPUlRFRAovLyAgICBfSHdfRF9FY2NXclJlYWQoKTsKLy8gICAgLy9pZiAoIShhZGQ9PU9ERCAmJiAoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1NikpCi8vICAgIHsKLy8gICAgICAgIEVjY0J1ZlswXT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgICAgIEVjY0J1ZlsxXT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgICAgIEVjY0J1ZlsyXT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgfQovLwovLyAgICAvL2lmICghKGFkZD09RVZFTiAmJiAoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1NikpCi8vICAgIHsKLy8gICAgICAgIEVjY0J1ZlszXT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgICAgIEVjY0J1Zls0XT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgICAgIEVjY0J1Zls1XT1fSHdfRF9JbkRhdGEoKTsKLy8gICAgfQovLwovLyAgICBfSHdfRF9FY2NXclN0b3AoKTsKLy8jZW5kaWYKLy99Ci8vCi8vLy9OQU5EIE1lbW9yeSAoU21hcnRNZWRpYSkgQ29udHJvbCBTdWJyb3V0aW5lCi8vLy8tLS0tLSBfQ2hlY2tfRF9Tc2ZkY0J1c3koKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IF9DaGVja19EX1NzZmRjQnVzeShXT1JEIHRpbWUpCi8vewovLyAgICBXT1JEICBjb3VudCA9IDA7Ci8vCi8vICAgIGRvIHsKLy8gICAgICAgIGlmICghX0h3X0RfQ2hrQnVzeSgpKQovLyAgICAgICAgICAgIHJldHVybihTVUNDRVNTKTsKLy8gICAgICAgIEVEZWxheSgxMDApOwovLyAgICAgICAgY291bnQrKzsKLy8gICAgfSB3aGlsZSAoY291bnQ8PXRpbWUpOwovLwovLyAgICByZXR1cm4oRVJST1IpOwovL30KLy8KLy8vLy0tLS0tIF9DaGVja19EX1NzZmRjU3RhdHVzKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgX0NoZWNrX0RfU3NmZGNTdGF0dXModm9pZCkKLy97Ci8vICAgIGlmIChfSHdfRF9JbkRhdGEoKSAmIFdSX0ZBSUwpCi8vICAgICAgICByZXR1cm4oRVJST1IpOwovLwovLyAgICByZXR1cm4oU1VDQ0VTUyk7Ci8vfQovLwovLy8vIEZvciA3MTIKLy8vLy0tLS0tIF9SZXNldF9EX1NzZmRjRXJyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9SZXNldF9EX1NzZmRjRXJyKHZvaWQpCi8vewovLyAgICBXT1JEICBjb3VudCA9IDA7Ci8vCi8vICAgIF9Id19EX1NldFJkQ21kKCk7Ci8vICAgIF9Id19EX091dERhdGEoUlNUX0NISVApOwovLyAgICBfSHdfRF9TZXRSZERhdGEoKTsKLy8KLy8gICAgZG8gewovLyAgICAgICAgaWYgKCFfSHdfRF9DaGtCdXN5KCkpCi8vICAgICAgICAgICAgYnJlYWs7Ci8vICAgICAgICBFRGVsYXkoMTAwKTsKLy8gICAgICAgIGNvdW50Kys7Ci8vICAgIH0gd2hpbGUgKGNvdW50PD1CVVNZX1JFU0VUKTsKLy8KLy8gICAgX0h3X0RfU2V0UmRTdGFuZGJ5KCk7Ci8vfQovLwovLy8vTkFORCBNZW1vcnkgKFNtYXJ0TWVkaWEpIEJ1ZmZlciBEYXRhIFhmZXIgU3Vicm91dGluZQovLy8vLS0tLS0gU01fUmVhZERhdGFXaXRoRE1BKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIFNNX1JlYWREYXRhV2l0aERNQShQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpkYXRhYnVmLCBXT1JEIFNlY3RCeXRlQ291bnQpCi8vewovLyAgICBQSFlTSUNBTF9BRERSRVNTICAgICAgICBBZGRyOwovLyAgICBMQVJHRV9JTlRFR0VSICAgICAgICAgICBwdGltZW91dCA7Ci8vCi8vICAgIEtlQ2xlYXJFdmVudCgmZmRvRXh0LT5TTV9ETUFEb25lRXZlbnQpOwovLwovLyAgICBBZGRyID0gTW1HZXRQaHlzaWNhbEFkZHJlc3MoZGF0YWJ1Zik7Ci8vCi8vICAgIFdSSVRFX1BPUlRfRFdPUkQoU01fRE1BX0FERFJfUkVHLCAoRFdPUkQpQWRkci5Mb3dQYXJ0KTsKLy8gICAgV1JJVEVfUE9SVF9CWVRFKFNNX0RNQV9EQVRBX0NUUkwsIDApOwovLyAgICBXUklURV9QT1JUX1dPUkQoU01fRE1BX0JZVEVfQ09VTlRfUkVHLCBTZWN0Qnl0ZUNvdW50KTsKLy8KLy8gICAgd2hpbGUgKCBfSHdfRF9DaGtDYXJkSW4oKSApCi8vICAgIHsKLy8gICAgICAgIGlmICgoUkVBRF9QT1JUX0JZVEUoU01fUkVHX0ZJRk9fU1RBVFVTKSAmIDB4ODApKQovLyAgICAgICAgICAgYnJlYWs7Ci8vICAgIH0KLy8gICAgaWYgKCFfSHdfRF9DaGtDYXJkSW4oKSkgICAgICByZXR1cm47Ci8vICAgIFdSSVRFX1BPUlRfQllURShTTV9ETUFfREFUQV9DVFJMLCAweDAxKTsKLy8KLy8gICAgcHRpbWVvdXQuUXVhZFBhcnQgPSAyMDAwICogKC0xMDAwMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMiBzZWMKLy8gICAgS2VXYWl0Rm9yU2luZ2xlT2JqZWN0KCZmZG9FeHQtPlNNX0RNQURvbmVFdmVudCwgRXhlY3V0aXZlLCBLZXJuZWxNb2RlLCBGQUxTRSwgJnB0aW1lb3V0KTsKLy8gICAgX0h3X0RfU2V0RE1BSW50TWFzaygpOwovL30KLy8KLy8vLy0tLS0tIFNNX1dyaXRlRGF0YVdpdGhETUEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgU01fV3JpdGVEYXRhV2l0aERNQShQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpkYXRhYnVmLCBXT1JEIFNlY3RCeXRlQ291bnQpCi8vewovLyAgICBQSFlTSUNBTF9BRERSRVNTICAgICAgICBBZGRyOwovLyAgICBMQVJHRV9JTlRFR0VSICAgICAgICAgICBwdGltZW91dCA7Ci8vCi8vICAgIEtlQ2xlYXJFdmVudCgmZmRvRXh0LT5TTV9ETUFEb25lRXZlbnQpOwovLwovLyAgICBBZGRyID0gTW1HZXRQaHlzaWNhbEFkZHJlc3MoZGF0YWJ1Zik7Ci8vCi8vICAgIFdSSVRFX1BPUlRfRFdPUkQoU01fRE1BX0FERFJfUkVHLCAoRFdPUkQpQWRkci5Mb3dQYXJ0KTsKLy8gICAgV1JJVEVfUE9SVF9CWVRFKFNNX0RNQV9EQVRBX0NUUkwsIDIpOwovLyAgICBXUklURV9QT1JUX1dPUkQoU01fRE1BX0JZVEVfQ09VTlRfUkVHLCBTZWN0Qnl0ZUNvdW50KTsKLy8KLy8gICAgd2hpbGUgKCBfSHdfRF9DaGtDYXJkSW4oKSApCi8vICAgIHsKLy8gICAgICAgaWYgKChSRUFEX1BPUlRfQllURShTTV9SRUdfRklGT19TVEFUVVMpICYgMHg0MCkpCi8vICAgICAgICAgICBicmVhazsKLy8gICAgfQovLyAgICBpZiAoIV9Id19EX0Noa0NhcmRJbigpKSAgICAgIHJldHVybjsKLy8gICAgV1JJVEVfUE9SVF9CWVRFKFNNX0RNQV9EQVRBX0NUUkwsIDB4MDMpOwovLwovLyAgICBwdGltZW91dC5RdWFkUGFydCA9IDIwMDAgKiAoLTEwMDAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyIHNlYwovLyAgICBLZVdhaXRGb3JTaW5nbGVPYmplY3QoJmZkb0V4dC0+U01fRE1BRG9uZUV2ZW50LCBFeGVjdXRpdmUsIEtlcm5lbE1vZGUsIEZBTFNFLCAmcHRpbWVvdXQpOwovLyAgICBfSHdfRF9TZXRETUFJbnRNYXNrKCk7Ci8vfQovLwovLy8vLS0tLS0gX1JlYWRfRF9Tc2ZkY0J1ZigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfUmVhZF9EX1NzZmRjQnVmKEJZVEUgKmRhdGFidWYpCi8vewovLyAgICBpbnQgaTsKLy8KLy8gICAgLy9mb3IoaT0weDAwMDA7aTwoKChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KT8weDAxMDA6MHgwMjAwKTtpKyspCi8vICAgIGZvcihpPTA7IGk8MHgyMDA7IGkrKykKLy8gICAgICAgICpkYXRhYnVmKysgPV9Id19EX0luRGF0YSgpOwovL30KLy8KLy8vLy0tLS0tIF9Xcml0ZV9EX1NzZmRjQnVmKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9Xcml0ZV9EX1NzZmRjQnVmKEJZVEUgKmRhdGFidWYpCi8vewovLyAgICBpbnQgaTsKLy8KLy8gICAgLy9mb3IoaT0weDAwMDA7aTwoKChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KT8weDAxMDA6MHgwMjAwKTtpKyspCi8vICAgIGZvcihpPTA7IGk8MHgyMDA7IGkrKykKLy8gICAgICAgIF9Id19EX091dERhdGEoKmRhdGFidWYrKyk7Ci8vfQovLwovLy8vLS0tLS0gX1JlYWRfRF9Tc2ZkY0J5dGUoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1JlYWRfRF9Tc2ZkY0J5dGUoQllURSAqZGF0YWJ1ZikKLy97Ci8vICAgICpkYXRhYnVmPShCWVRFKV9Id19EX0luRGF0YSgpOwovL30KLy8KLy8vLy0tLS0tIF9SZWFkUmVkdF9EX1NzZmRjQnVmKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9SZWFkUmVkdF9EX1NzZmRjQnVmKEJZVEUgKnJlZHVuZGFudCkKLy97Ci8vICAgIGNoYXIgaTsKLy8KLy8gICAgLy9mb3IoaT0weDAwO2k8KCgoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1Nik/MHgwODoweDEwKTtpKyspCi8vICAgIGZvcihpPTA7IGk8MHgxMDsgaSsrKQovLyAgICAgICAgcmVkdW5kYW50W2ldID1fSHdfRF9JbkRhdGEoKTsKLy99Ci8vCi8vLy8tLS0tLSBfV3JpdGVSZWR0X0RfU3NmZGNCdWYoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1dyaXRlUmVkdF9EX1NzZmRjQnVmKEJZVEUgKnJlZHVuZGFudCkKLy97Ci8vICAgIGNoYXIgaTsKLy8KLy8gICAgLy9mb3IoaT0weDAwO2k8KCgoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1Nik/MHgwODoweDEwKTtpKyspCi8vICAgIGZvcihpPTA7IGk8MHgxMDsgaSsrKQovLyAgICAgICAgX0h3X0RfT3V0RGF0YSgqcmVkdW5kYW50KyspOwovL30KKi8KLy9TbWFydE1lZGlhIElEIENvZGUgQ2hlY2sgJiBNb2RlIFNldCBTdWJyb3V0aW5lCi8vLS0tLS0gU2V0X0RfU3NmZGNNb2RlbCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU2V0X0RfU3NmZGNNb2RlbChCWVRFIGRjb2RlKQp7CiAgICBzd2l0Y2ggKF9DaGVja19EX0RldkNvZGUoZGNvZGUpKSB7CiAgICAgICAgY2FzZSBTU0ZEQzFNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMxTUI7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMxNiB8IFBTMjU2OwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxOwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAyNTY7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDI1MDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gODsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTU0ZEQzJNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMyTUI7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMxNiB8IFBTMjU2OwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxOwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSA1MTI7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDUwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gODsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTU0ZEQzRNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREM0TUI7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMxNiB8IFBTNTEyOwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxOwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSA1MTI7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDUwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMTY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREM4TUI6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDOE1COwogICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFEM0NZQyB8IEJTMTYgfCBQUzUxMjsKICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gMTsKICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMTY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREMxNk1COgogICAgICAgICAgICBTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzE2TUI7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMzMiB8IFBTNTEyOwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxOwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OwogICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOwogICAgICAgICAgICBTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTU0ZEQzMyTUI6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMzJNQjsKICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDNDWUMgfCBCUzMyIHwgUFM1MTI7CiAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDI7CiAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7CiAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDMyOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNTRkRDNjRNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREM2NE1COwogICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFENENZQyB8IEJTMzIgfCBQUzUxMjsKICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gNDsKICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREMxMjhNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMxMjhNQjsKICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDRDWUMgfCBCUzMyIHwgUFM1MTI7CiAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDg7CiAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7CiAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDMyOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNTRkRDMjU2TUI6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMjU2TUI7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQ0Q1lDIHwgQlMzMiB8IFBTNTEyOwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxNjsKICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREM1MTJNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREM1MTJNQjsKICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDRDWUMgfCBCUzMyIHwgUFM1MTI7CiAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDMyOwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OwogICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOwogICAgICAgICAgICBTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTU0ZEQzFHQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMxR0I7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQ0Q1lDIHwgQlMzMiB8IFBTNTEyOwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSA2NDsKICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREMyR0I6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMkdCOwogICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFENENZQyB8IEJTMzIgfCBQUzUxMjsKICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gMTI4OwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OwogICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOwogICAgICAgICAgICBTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgPSBOT1NTRkRDOwogICAgICAgICAgICByZXR1cm4oRVJST1IpOwogICAgfQoKICAgIHJldHVybihTVUNDRVNTKTsKfQoKLy8tLS0tLSBfQ2hlY2tfRF9EZXZDb2RlKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJZVEUgX0NoZWNrX0RfRGV2Q29kZShCWVRFIGRjb2RlKQp7CiAgICBzd2l0Y2goZGNvZGUpewogICAgICAgIGNhc2UgMHg2RToKICAgICAgICBjYXNlIDB4RTg6CiAgICAgICAgY2FzZSAweEVDOiByZXR1cm4oU1NGREMxTUIpOyAgIC8vIDhNYml0ICgxTSkgTkFORAogICAgICAgIGNhc2UgMHg2NDoKICAgICAgICBjYXNlIDB4RUE6IHJldHVybihTU0ZEQzJNQik7ICAgLy8gMTZNYml0ICgyTSkgTkFORAogICAgICAgIGNhc2UgMHg2QjoKICAgICAgICBjYXNlIDB4RTM6CiAgICAgICAgY2FzZSAweEU1OiByZXR1cm4oU1NGREM0TUIpOyAgIC8vIDMyTWJpdCAoNE0pIE5BTkQKICAgICAgICBjYXNlIDB4RTY6IHJldHVybihTU0ZEQzhNQik7ICAgLy8gNjRNYml0ICg4TSkgTkFORAogICAgICAgIGNhc2UgMHg3MzogcmV0dXJuKFNTRkRDMTZNQik7ICAvLyAxMjhNYml0ICgxNk0pTkFORAogICAgICAgIGNhc2UgMHg3NTogcmV0dXJuKFNTRkRDMzJNQik7ICAvLyAyNTZNYml0ICgzMk0pTkFORAogICAgICAgIGNhc2UgMHg3NjogcmV0dXJuKFNTRkRDNjRNQik7ICAvLyA1MTJNYml0ICg2NE0pTkFORAogICAgICAgIGNhc2UgMHg3OTogcmV0dXJuKFNTRkRDMTI4TUIpOyAvLyAxR2JpdCgxMjhNKU5BTkQKICAgICAgICBjYXNlIDB4NzE6IHJldHVybihTU0ZEQzI1Nk1CKTsKICAgICAgICBjYXNlIDB4REM6IHJldHVybihTU0ZEQzUxMk1CKTsKICAgICAgICBjYXNlIDB4RDM6IHJldHVybihTU0ZEQzFHQik7CiAgICAgICAgY2FzZSAweEQ1OiByZXR1cm4oU1NGREMyR0IpOwogICAgICAgIGRlZmF1bHQ6IHJldHVybihOT1NTRkRDKTsKICAgIH0KfQovKgovLy8vU21hcnRNZWRpYSBQb3dlciBDb250cm9sIFN1YnJvdXRpbmUKLy8vLy0tLS0tIENudF9EX1Jlc2V0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgQ250X0RfUmVzZXQodm9pZCkKLy97Ci8vICAgIF9Id19EX0xlZE9mZigpOwovLyAgICBfSHdfRF9TZXRSZFN0YW5kYnkoKTsKLy8gICAgX0h3X0RfVmNjT2ZmKCk7Ci8vfQovLwovLy8vLS0tLS0gQ250X0RfUG93ZXJPbigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgQ250X0RfUG93ZXJPbih2b2lkKQovL3sKLy8gICAgLy8gTm8gc3VwcG9ydCA1Vi4KLy8gICAgX0h3X0RfRW5hYmxlVmNjM1ZPbigpOyAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgU01fUkVHX0NUUkxfNSBSZWcuIHRvIDNWCi8vICAgIF9Id19EX1ZjY09uKCk7Ci8vICAgIF9Id19EX1NldFJkU3RhbmRieSgpOwovLyAgICBfV2FpdF9EX1RpbWVyKFRJTUVfUE9OKTsKLy8KLy8gICAgaWYgKF9Id19EX0Noa1Bvd2VyKCkpCi8vICAgIHsKLy8gICAgICAgIF9Id19EX0VuYWJsZU9CKCk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgU01fUkVHX0NUUkxfNSBSZWcuIHRvIDB4ODMKLy8gICAgICAgIHJldHVybihTVUNDRVNTKTsKLy8gICAgfQovLwovLyAgICBfSHdfRF9TZXRWY2NPZmYoKTsKLy8gICAgcmV0dXJuKEVSUk9SKTsKLy99Ci8vCi8vLy8tLS0tLSBDbnRfRF9Qb3dlck9mZigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIENudF9EX1Bvd2VyT2ZmKHZvaWQpCi8vewovLyAgICBfSHdfRF9TZXRSZFN0YW5kYnkoKTsKLy8gICAgX0h3X0RfU2V0VmNjT2ZmKCk7Ci8vICAgIF9Id19EX1ZjY09mZigpOwovL30KLy8KLy8vLy0tLS0tIENudF9EX0xlZE9uKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgQ250X0RfTGVkT24odm9pZCkKLy97Ci8vICAgIF9Id19EX0xlZE9uKCk7Ci8vfQovLwovLy8vLS0tLS0gQ250X0RfTGVkT2ZmKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgQ250X0RfTGVkT2ZmKHZvaWQpCi8vewovLyAgICBfSHdfRF9MZWRPZmYoKTsKLy99Ci8vCi8vLy8tLS0tLSBDaGVja19EX0NudFBvd2VyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBDaGVja19EX0NudFBvd2VyKHZvaWQpCi8vewovLyAgICBpZiAoX0h3X0RfQ2hrUG93ZXIoKSkKLy8gICAgICAgIHJldHVybihTVUNDRVNTKTsgLy8gUG93ZXIgT24KLy8KLy8gICAgcmV0dXJuKEVSUk9SKTsgICAgICAgLy8gUG93ZXIgT2ZmCi8vfQovLwovLy8vLS0tLS0gQ2hlY2tfRF9DYXJkRXhpc3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IENoZWNrX0RfQ2FyZEV4aXN0KHZvaWQpCi8vewovLyAgICBjaGFyIGksaixrOwovLwovLyAgICBpZiAoIV9Id19EX0Noa1N0YXR1cygpKSAvLyBOb3QgU3RhdHVzIENoYW5nZQovLyAgICAgICAgaWYgKF9Id19EX0Noa0NhcmRJbigpKQovLyAgICAgICAgICAgIHJldHVybihTVUNDRVNTKTsgLy8gQ2FyZCBleGlzdCBpbiBTbG90Ci8vCi8vICAgIGZvcihpPTAsaj0wLGs9MDsgaTwxNjsgaSsrKSB7Ci8vICAgICAgICBpZiAoX0h3X0RfQ2hrQ2FyZEluKCkpIC8vIFN0YXR1cyBDaGFuZ2UKLy8gICAgICAgIHsKLy8gICAgICAgICAgICBqKys7IGs9MDsKLy8gICAgICAgIH0KLy8gICAgICAgIGVsc2UKLy8gICAgICAgIHsKLy8gICAgICAgICAgICBqPTA7IGsrKzsKLy8gICAgICAgIH0KLy8KLy8gICAgICAgIGlmIChqPjMpCi8vICAgICAgICAgICAgcmV0dXJuKFNVQ0NFU1MpOyAvLyBDYXJkIGV4aXN0IGluIFNsb3QKLy8gICAgICAgIGlmIChrPjMpCi8vICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsgLy8gTk8gQ2FyZCBleGlzdCBpbiBTbG90Ci8vCi8vICAgICAgICBfV2FpdF9EX1RpbWVyKFRJTUVfQ0RDSEspOwovLyAgICB9Ci8vCi8vICAgIHJldHVybihFUlJPUik7Ci8vfQovLwovLy8vLS0tLS0gQ2hlY2tfRF9DYXJkU3RzQ2hnKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBDaGVja19EX0NhcmRTdHNDaGcodm9pZCkKLy97Ci8vICAgIGlmIChfSHdfRF9DaGtTdGF0dXMoKSkKLy8gICAgICAgIHJldHVybihFUlJPUik7IC8vIFN0YXR1cyBDaGFuZ2UKLy8KLy8gICAgcmV0dXJuKFNVQ0NFU1MpOyAgIC8vIE5vdCBTdGF0dXMgQ2hhbmdlCi8vfQovLwovLy8vLS0tLS0gQ2hlY2tfRF9Tc2ZkY1dQKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBDaGVja19EX1NzZmRjV1Aodm9pZCkKLy97IC8vIEVSUk9SOiBXUCwgU1VDQ0VTUzogTm90IFdQCi8vICAgIGNoYXIgaTsKLy8KLy8gICAgZm9yKGk9MDsgaTw4OyBpKyspIHsKLy8gICAgICAgIGlmIChfSHdfRF9DaGtXUCgpKQovLyAgICAgICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgICAgICBfV2FpdF9EX1RpbWVyKFRJTUVfV1BDSEspOwovLyAgICB9Ci8vCi8vICAgIHJldHVybihTVUNDRVNTKTsKLy99Ci8vCiovCi8vU21hcnRNZWRpYSBFQ0MgQ29udHJvbCBTdWJyb3V0aW5lCi8vLS0tLS0gQ2hlY2tfRF9SZWFkRXJyb3IoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBDaGVja19EX1JlYWRFcnJvcihCWVRFICpyZWR1bmRhbnQpCnsKCXJldHVybiBTVUNDRVNTOwp9CgovLy0tLS0tIENoZWNrX0RfQ29ycmVjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IENoZWNrX0RfQ29ycmVjdChCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQp7CglyZXR1cm4gU1VDQ0VTUzsKfQoKLy8tLS0tLSBDaGVja19EX0NJU2RhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBDaGVja19EX0NJU2RhdGEoQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnQpCnsKCUJZVEUgY2lzW10gPSB7MHgwMSwgMHgwMywgMHhEOSwgMHgwMSwgMHhGRiwgMHgxOCwgMHgwMiwKCQkgICAgICAweERGLCAweDAxLCAweDIwfTsKCglpbnQgY2lzX2xlbiA9IHNpemVvZihjaXMpOwoKCWlmICghSXNTU0ZEQ0NvbXBsaWFuY2UgJiYgIUlzWERDb21wbGlhbmNlKQoJCXJldHVybiBTVUNDRVNTOwoKCWlmICghbWVtY21wKHJlZHVuZGFudCArIDB4MEQsIEVjY0J1ZiwgMykpCgkJcmV0dXJuIG1lbWNtcChidWYsIGNpcywgY2lzX2xlbik7CgoJaWYgKCFfQ29ycmVjdF9EX1N3RUNDKGJ1ZiwgcmVkdW5kYW50ICsgMHgwRCwgRWNjQnVmKSkKCQlyZXR1cm4gbWVtY21wKGJ1ZiwgY2lzLCBjaXNfbGVuKTsKCglidWYgKz0gMHgxMDA7CglpZiAoIW1lbWNtcChyZWR1bmRhbnQgKyAweDA4LCBFY2NCdWYgKyAweDAzLCAzKSkKCQlyZXR1cm4gbWVtY21wKGJ1ZiwgY2lzLCBjaXNfbGVuKTsKCglpZiAoIV9Db3JyZWN0X0RfU3dFQ0MoYnVmLCByZWR1bmRhbnQgKyAweDA4LCBFY2NCdWYgKyAweDAzKSkKCQlyZXR1cm4gbWVtY21wKGJ1ZiwgY2lzLCBjaXNfbGVuKTsKCglyZXR1cm4gRVJST1I7Cn0KCi8vLS0tLS0gU2V0X0RfUmlnaHRFQ0MoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgU2V0X0RfUmlnaHRFQ0MoQllURSAqcmVkdW5kYW50KQp7CiAgICAvLyBEcml2ZXIgpKOwtSBFQ0MgQ2hlY2sKICAgIHJldHVybjsKICAgIC8vU3RyaW5nQ29weSgoY2hhciAqKShyZWR1bmRhbnQrMHgwRCksKGNoYXIgKilFY2NCdWYsMyk7CiAgICAvL1N0cmluZ0NvcHkoKGNoYXIgKikocmVkdW5kYW50KzB4MDgpLChjaGFyICopKEVjY0J1ZisweDAzKSwzKTsKfQovKgovLy8vLS0tLS0gX0NhbGNfRF9FQ0NkYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX0NhbGNfRF9FQ0NkYXRhKEJZVEUgKmJ1ZikKLy97Ci8vI2lmZGVmIEhXX0VDQ19TVVBQT1JURUQKLy8jZWxzZQovLyAgICBfQ2FsY3VsYXRlX0RfU3dFQ0MoYnVmLEVjY0J1Zik7Ci8vICAgIGJ1Zis9MHgwMTAwOwovLyAgICBfQ2FsY3VsYXRlX0RfU3dFQ0MoYnVmLEVjY0J1ZisweDAzKTsKLy8jZW5kaWYKLy99Ci8vCi8vLy8tLS0tLSBfU2V0X0RfRUNDZGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9TZXRfRF9FQ0NkYXRhKEJZVEUgYWRkLEJZVEUgKnJlZHVuZGFudCkKLy97Ci8vICAgIC8vaWYgKGFkZD09RVZFTiAmJiAoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1NikKLy8gICAgLy8gICAgcmV0dXJuOwovLwovLyAgICAvLyBmb3IgMjU2Ynl0ZS9wYWdlCi8vICAgIFN0cmluZ0NvcHkoKGNoYXIgKikocmVkdW5kYW50KzB4MEQpLChjaGFyICopRWNjQnVmLDMpOwovLyAgICBTdHJpbmdDb3B5KChjaGFyICopKHJlZHVuZGFudCsweDA4KSwoY2hhciAqKShFY2NCdWYrMHgwMyksMyk7Ci8vfQoqLwoKLyoKLy8tLS0tLSBTTV9SZWFkQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNNX1JlYWRCbG9jayhQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQp7CiAgICBQQlVMS19DQlcgICAgICAgICAgICAgICBwQnVsa0NidyA9IGZkb0V4dC0+cEJ1bGtDYnc7CiAgICBOVFNUQVRVUyAgICAgICAgICAgICAgICBudFN0YXR1czsKICAgIFdPUkQgICAgICAgICAgICAgICAgICAgIGFkZHI7CgogICAgRU5FX0xvYWRCaW5Db2RlKGZkb0V4dCwgU01fUldfUEFUVEVSTik7CgogICAgYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwogICAgYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7CgogICAgLy8gUmVhZCBzZWN0IGRhdGEKICAgIFJ0bFplcm9NZW1vcnkocEJ1bGtDYncsIHNpemVvZihzdHJ1Y3QgX0JVTEtfQ0JXKSk7CiAgICBwQnVsa0Nidy0+ZENCV1NpZ25hdHVyZSAgICAgICAgICA9IENCV19TSUdOVFVSRTsKICAgIHBCdWxrQ2J3LT5iQ0JXTHVuICAgICAgICAgICAgICAgID0gQ0JXX0xVTjsKICAgIHBCdWxrQ2J3LT5kQ0JXRGF0YVRyYW5zZmVyTGVuZ3RoID0gMHgyMDA7CiAgICBwQnVsa0Nidy0+Ym1DQldGbGFncyAgICAgICAgICAgICA9IDB4ODA7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbMF0gICAgICAgICAgICAgICA9IDB4RjE7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbMV0gICAgICAgICAgICAgICA9IDB4MDI7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbNF0gICAgICAgICAgICAgICA9IChCWVRFKWFkZHI7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbM10gICAgICAgICAgICAgICA9IChCWVRFKShhZGRyLzB4MDEwMCk7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbMl0gICAgICAgICAgICAgICA9IE1lZGlhLlpvbmUvMjsKCiAgICBudFN0YXR1cyA9IEVORV9TZW5kU2NzaUNtZChmZG9FeHQsIEZESVJfUkVBRCwgYnVmKTsKCiAgICBpZiAoIU5UX1NVQ0NFU1MobnRTdGF0dXMpKQogICAgICAgcmV0dXJuKEVSUk9SKTsKCiAgICAvLyBSZWFkIHJlZHVuZGFudAogICAgUnRsWmVyb01lbW9yeShwQnVsa0Nidywgc2l6ZW9mKHN0cnVjdCBfQlVMS19DQlcpKTsKICAgIHBCdWxrQ2J3LT5kQ0JXU2lnbmF0dXJlICAgICAgICAgID0gQ0JXX1NJR05UVVJFOwogICAgcEJ1bGtDYnctPmJDQldMdW4gICAgICAgICAgICAgICAgPSBDQldfTFVOOwogICAgcEJ1bGtDYnctPmRDQldEYXRhVHJhbnNmZXJMZW5ndGggPSAweDEwOwogICAgcEJ1bGtDYnctPmJtQ0JXRmxhZ3MgICAgICAgICAgICAgPSAweDgwOwogICAgcEJ1bGtDYnctPkNCV0NiWzBdICAgICAgICAgICAgICAgPSAweEYxOwogICAgcEJ1bGtDYnctPkNCV0NiWzFdICAgICAgICAgICAgICAgPSAweDAzOwogICAgcEJ1bGtDYnctPkNCV0NiWzRdICAgICAgICAgICAgICAgPSAoQllURSlhZGRyOwogICAgcEJ1bGtDYnctPkNCV0NiWzNdICAgICAgICAgICAgICAgPSAoQllURSkoYWRkci8weDAxMDApOwogICAgcEJ1bGtDYnctPkNCV0NiWzJdICAgICAgICAgICAgICAgPSBNZWRpYS5ab25lLzI7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbNV0gICAgICAgICAgICAgICA9IDA7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbNl0gICAgICAgICAgICAgICA9IDE7CgogICAgbnRTdGF0dXMgPSBFTkVfU2VuZFNjc2lDbWQoZmRvRXh0LCBGRElSX1JFQUQsIHJlZHVuZGFudCk7CgogICAgaWYgKCFOVF9TVUNDRVNTKG50U3RhdHVzKSkKICAgICAgIHJldHVybihFUlJPUik7CgogICAgcmV0dXJuKFNVQ0NFU1MpOwp9Ki8K