I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KCiNpbmNsdWRlICJ1c2IuaCIKI2luY2x1ZGUgInNjc2lnbHVlLmgiCiNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKI2luY2x1ZGUgIm1zLmgiCgovLy0tLS0tIE1TX1JlYWRlckNvcHlCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfUmVhZGVyQ29weUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBvbGRwaHksIFdPUkQgbmV3cGh5LCBXT1JEIFBoeUJsb2NrQWRkciwgQllURSBQYWdlTnVtLCBQQllURSBidWYsIFdPUkQgbGVuKQp7CglzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CglpbnQJcmVzdWx0OwoKCS8vcHJpbnRrKCJNU19SZWFkZXJDb3B5QmxvY2sgLS0tIFBoeUJsb2NrQWRkciA9ICV4LCBQYWdlTnVtID0gJXhcbiIsIFBoeUJsb2NrQWRkciwgUGFnZU51bSk7CglyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIE1TX1JXX1BBVFRFUk4pOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCgltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwoJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwoJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGggPSAweDIwMCpsZW47CgliY2ItPkZsYWdzCQkJPSAweDAwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjA7CgliY2ItPkNEQlsxXQkJCT0gMHgwODsKCWJjYi0+Q0RCWzRdCQkJPSAoQllURSkob2xkcGh5KTsKCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkob2xkcGh5Pj44KTsKCWJjYi0+Q0RCWzJdCQkJPSAoQllURSkob2xkcGh5Pj4xNik7CgliY2ItPkNEQls3XQkJCT0gKEJZVEUpKG5ld3BoeSk7CgliY2ItPkNEQls2XQkJCT0gKEJZVEUpKG5ld3BoeT4+OCk7CgliY2ItPkNEQls1XQkJCT0gKEJZVEUpKG5ld3BoeT4+MTYpOwoJYmNiLT5DREJbOV0JCQk9IChCWVRFKShQaHlCbG9ja0FkZHIpOwoJYmNiLT5DREJbOF0JCQk9IChCWVRFKShQaHlCbG9ja0FkZHI+PjgpOwoJYmNiLT5DREJbMTBdCQk9IFBhZ2VOdW07CgoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1dSSVRFLCBidWYsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KCi8vLS0tLS0gTVNfUmVhZGVyUmVhZFBhZ2UoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX1JlYWRlclJlYWRQYWdlKHN0cnVjdCB1c19kYXRhICp1cywgRFdPUkQgUGh5QmxvY2tBZGRyLCBCWVRFIFBhZ2VOdW0sIFBEV09SRCBQYWdlQnVmLCBNU19MaWJUeXBlRXh0ZGF0ICpFeHRyYURhdCkKewoJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwoJaW50CXJlc3VsdDsKCUJZVEUJRXh0QnVmWzRdOwoJRFdPUkQJYm4gPSBQaHlCbG9ja0FkZHIgKiAweDIwICsgUGFnZU51bTsKCgkvL3ByaW50aygiTVMgLS0tIE1TX1JlYWRlclJlYWRQYWdlLCAgUGh5QmxvY2tBZGRyID0gJXgsIFBhZ2VOdW0gPSAleFxuIiwgUGh5QmxvY2tBZGRyLCBQYWdlTnVtKTsKCglyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIE1TX1JXX1BBVFRFUk4pOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCgkvLyBSZWFkIFBhZ2UgRGF0YQoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoID0gMHgyMDA7CgliY2ItPkZsYWdzCQkJPSAweDgwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjE7CgliY2ItPkNEQlsxXQkJCT0gMHgwMjsKCWJjYi0+Q0RCWzVdCQkJPSAoQllURSkoYm4pOwoJYmNiLT5DREJbNF0JCQk9IChCWVRFKShibj4+OCk7CgliY2ItPkNEQlszXQkJCT0gKEJZVEUpKGJuPj4xNik7CgliY2ItPkNEQlsyXQkJCT0gKEJZVEUpKGJuPj4yNCk7CgkKCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCBQYWdlQnVmLCAwKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJLy8gUmVhZCBFeHRyYSBEYXRhCgltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwoJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwoJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGggPSAweDQ7CgliY2ItPkZsYWdzCQkJPSAweDgwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjE7CgliY2ItPkNEQlsxXQkJCT0gMHgwMzsKCWJjYi0+Q0RCWzVdCQkJPSAoQllURSkoUGFnZU51bSk7CgliY2ItPkNEQls0XQkJCT0gKEJZVEUpKFBoeUJsb2NrQWRkcik7CgliY2ItPkNEQlszXQkJCT0gKEJZVEUpKFBoeUJsb2NrQWRkcj4+OCk7CgliY2ItPkNEQlsyXQkJCT0gKEJZVEUpKFBoeUJsb2NrQWRkcj4+MTYpOwoJYmNiLT5DREJbNl0JCQk9IDB4MDE7CgoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsICZFeHRCdWYsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglFeHRyYURhdC0+cmVzZXJ2ZWQgPSAwOwoJRXh0cmFEYXQtPmludHIgICAgID0gMHg4MDsgIC8vIE5vdCB5ZXQsIKX9sLKzXSwgtaUgZmlyZXdhcmUgc3VwcG9ydAoJRXh0cmFEYXQtPnN0YXR1czAgID0gMHgxMDsgIC8vIE5vdCB5ZXQsIKX9sLKzXSwgtaUgZmlyZXdhcmUgc3VwcG9ydAoJRXh0cmFEYXQtPnN0YXR1czEgID0gMHgwMDsgIC8vIE5vdCB5ZXQsIKX9sLKzXSwgtaUgZmlyZXdhcmUgc3VwcG9ydAoJRXh0cmFEYXQtPm92cmZsZyAgID0gRXh0QnVmWzBdOwoJRXh0cmFEYXQtPm1uZ2ZsZyAgID0gRXh0QnVmWzFdOwoJRXh0cmFEYXQtPmxvZ2FkciAgID0gTWVtU3RpY2tMb2dBZGRyKEV4dEJ1ZlsyXSwgRXh0QnVmWzNdKTsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KCi8vLS0tLS0gTVNfUmVhZGVyRXJhc2VCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX1JlYWRlckVyYXNlQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBEV09SRCBQaHlCbG9ja0FkZHIpCnsKCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKCWludAlyZXN1bHQ7CglEV09SRAlibiA9IFBoeUJsb2NrQWRkcjsKCgkvL3ByaW50aygiTVMgLS0tIE1TX1JlYWRlckVyYXNlQmxvY2ssICBQaHlCbG9ja0FkZHIgPSAleFxuIiwgUGh5QmxvY2tBZGRyKTsKCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgTVNfUldfUEFUVEVSTik7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aCA9IDB4MjAwOwoJYmNiLT5GbGFncwkJCT0gMHg4MDsKCWJjYi0+Q0RCWzBdCQkJPSAweEYyOwoJYmNiLT5DREJbMV0JCQk9IDB4MDY7CgliY2ItPkNEQls0XQkJCT0gKEJZVEUpKGJuKTsKCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYm4+PjgpOwoJYmNiLT5DREJbMl0JCQk9IChCWVRFKShibj4+MTYpOwoJCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgTlVMTCwgMCk7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKfQoKLy8tLS0tLSBNU19DYXJkSW5pdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfQ2FyZEluaXQoc3RydWN0IHVzX2RhdGEgKnVzKQp7CglEV09SRAkJCXJlc3VsdD0wOwoJV09SRAkJCVRtcEJsb2NrOwoJUEJZVEUJCQlQYWdlQnVmZmVyMCA9IE5VTEwsIFBhZ2VCdWZmZXIxID0gTlVMTDsKCU1TX0xpYlR5cGVFeHRkYXQJZXh0ZGF0OwoJV09SRAkJCWJ0QmxrMXN0LCBidEJsazJuZDsKCURXT1JECQkJYnRCbGsxc3RFcnJlZDsKCglwcmludGsoIk1TX0NhcmRJbml0IHN0YXJ0XG4iKTsKCglNU19MaWJGcmVlQWxsb2NhdGVkQXJlYSh1cyk7CgoJaWYgKCgoUGFnZUJ1ZmZlcjAgPSBrbWFsbG9jKE1TX0JZVEVTX1BFUl9QQUdFLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgfHwKCSAgICAoKFBhZ2VCdWZmZXIxID0ga21hbGxvYyhNU19CWVRFU19QRVJfUEFHRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpKQoJewoJCXJlc3VsdCA9IE1TX05PX01FTU9SWV9FUlJPUjsKCQlnb3RvIGV4aXQ7Cgl9CgoJYnRCbGsxc3QgPSBidEJsazJuZCA9IE1TX0xCX05PVF9VU0VEOwoJYnRCbGsxc3RFcnJlZCA9IDA7CgoJZm9yIChUbXBCbG9jaz0wOyBUbXBCbG9jayA8IE1TX01BWF9JTklUSUFMX0VSUk9SX0JMT0NLUysyOyBUbXBCbG9jaysrKQoJewoJCXN3aXRjaCAoTVNfUmVhZGVyUmVhZFBhZ2UodXMsIFRtcEJsb2NrLCAwLCAoRFdPUkQgKilQYWdlQnVmZmVyMCwgJmV4dGRhdCkpCgkJewoJCQljYXNlIE1TX1NUQVRVU19TVUNDRVNTOgoJCQlicmVhazsKCQkJY2FzZSBNU19TVEFUVVNfSU5UX0VSUk9SOgoJCQlicmVhazsKCQkJY2FzZSBNU19TVEFUVVNfRVJST1I6CgkJCWRlZmF1bHQ6CgkJCWNvbnRpbnVlOwoJCX0KCgkJaWYgKChleHRkYXQub3ZyZmxnICYgTVNfUkVHX09WUl9CS1NUKSA9PSBNU19SRUdfT1ZSX0JLU1RfTkcpCgkJCWNvbnRpbnVlOwoKCQlpZiAoKChleHRkYXQubW5nZmxnICYgTVNfUkVHX01OR19TWVNGTEcpID09IE1TX1JFR19NTkdfU1lTRkxHX1VTRVIpIHx8CgkJCShiZTE2X3RvX2NwdSgoKE1lbVN0aWNrQm9vdEJsb2NrUGFnZTAgKilQYWdlQnVmZmVyMCktPmhlYWRlci53QmxvY2tJRCkgIT0gTVNfQk9PVF9CTE9DS19JRCkgfHwKCQkJKGJlMTZfdG9fY3B1KCgoTWVtU3RpY2tCb290QmxvY2tQYWdlMCAqKVBhZ2VCdWZmZXIwKS0+aGVhZGVyLndGb3JtYXRWZXJzaW9uKSAhPSBNU19CT09UX0JMT0NLX0ZPUk1BVF9WRVJTSU9OKSB8fAoJCQkoKChNZW1TdGlja0Jvb3RCbG9ja1BhZ2UwICopUGFnZUJ1ZmZlcjApLT5oZWFkZXIuYk51bWJlck9mRGF0YUVudHJ5ICE9IE1TX0JPT1RfQkxPQ0tfREFUQV9FTlRSSUVTKSkKCQkJCWNvbnRpbnVlOwoKCQlpZiAoYnRCbGsxc3QgIT0gTVNfTEJfTk9UX1VTRUQpCgkJewoJCQlidEJsazJuZCA9IFRtcEJsb2NrOwoJCQlicmVhazsKCQl9CgoJCWJ0QmxrMXN0ID0gVG1wQmxvY2s7CgkJbWVtY3B5KFBhZ2VCdWZmZXIxLCBQYWdlQnVmZmVyMCwgTVNfQllURVNfUEVSX1BBR0UpOwoJCWlmIChleHRkYXQuc3RhdHVzMSAmIChNU19SRUdfU1QxX0RURVIgfCBNU19SRUdfU1QxX0VYRVIgfCBNU19SRUdfU1QxX0ZHRVIpKQoJCQlidEJsazFzdEVycmVkID0gMTsKCX0KCglpZiAoYnRCbGsxc3QgPT0gTVNfTEJfTk9UX1VTRUQpCgl7CgkJcmVzdWx0ID0gTVNfU1RBVFVTX0VSUk9SOwoJCWdvdG8gZXhpdDsKCX0KCgkvLyB3cml0ZSBwcm90ZWN0CglpZiAoKGV4dGRhdC5zdGF0dXMwICYgTVNfUkVHX1NUMF9XUCkgPT0gTVNfUkVHX1NUMF9XUF9PTikKCQlNU19MaWJDdHJsU2V0KHVzLCBNU19MSUJfQ1RSTF9XUlBST1RFQ1QpOwoKCXJlc3VsdCA9IE1TX1NUQVRVU19FUlJPUjsKCS8vIDFzdCBCb290IEJsb2NrCglpZiAoYnRCbGsxc3RFcnJlZCA9PSAwKQoJCXJlc3VsdCA9IE1TX0xpYlByb2Nlc3NCb290QmxvY2sodXMsIGJ0QmxrMXN0LCBQYWdlQnVmZmVyMSk7ICAgLy8gMXN0CgkvLyAybmQgQm9vdCBCbG9jawoJaWYgKHJlc3VsdCAmJiAoYnRCbGsybmQgIT0gTVNfTEJfTk9UX1VTRUQpKQoJCXJlc3VsdCA9IE1TX0xpYlByb2Nlc3NCb290QmxvY2sodXMsIGJ0QmxrMm5kLCBQYWdlQnVmZmVyMCk7CgoJaWYgKHJlc3VsdCkKCXsKCQlyZXN1bHQgPSBNU19TVEFUVVNfRVJST1I7CgkJZ290byBleGl0OwoJfQoKCWZvciAoVG1wQmxvY2sgPSAwOyBUbXBCbG9jayA8IGJ0QmxrMXN0OyBUbXBCbG9jaysrKQoJCXVzLT5NU19MaWIuUGh5MkxvZ01hcFtUbXBCbG9ja10gPSBNU19MQl9JTklUSUFMX0VSUk9SOwoKCXVzLT5NU19MaWIuUGh5MkxvZ01hcFtidEJsazFzdF0gPSBNU19MQl9CT09UX0JMT0NLOwoKCWlmIChidEJsazJuZCAhPSBNU19MQl9OT1RfVVNFRCkKCXsKCQlmb3IgKFRtcEJsb2NrID0gYnRCbGsxc3QgKyAxOyBUbXBCbG9jayA8IGJ0QmxrMm5kOyBUbXBCbG9jaysrKQoJCQl1cy0+TVNfTGliLlBoeTJMb2dNYXBbVG1wQmxvY2tdID0gTVNfTEJfSU5JVElBTF9FUlJPUjsKCQl1cy0+TVNfTGliLlBoeTJMb2dNYXBbYnRCbGsybmRdID0gTVNfTEJfQk9PVF9CTE9DSzsKCX0KCglyZXN1bHQgPSBNU19MaWJTY2FuTG9naWNhbEJsb2NrTnVtYmVyKHVzLCBidEJsazFzdCk7CglpZiAocmVzdWx0KQoJCWdvdG8gZXhpdDsKCglmb3IgKFRtcEJsb2NrPU1TX1BIWVNJQ0FMX0JMT0NLU19QRVJfU0VHTUVOVDsgVG1wQmxvY2s8dXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrOyBUbXBCbG9jays9TVNfUEhZU0lDQUxfQkxPQ0tTX1BFUl9TRUdNRU5UKQoJewoJCWlmIChNU19Db3VudEZyZWVCbG9jayh1cywgVG1wQmxvY2spID09IDApCgkJewoJCQlNU19MaWJDdHJsU2V0KHVzLCBNU19MSUJfQ1RSTF9XUlBST1RFQ1QpOwoJCQlicmVhazsKCQl9Cgl9CgoJLy8gd3JpdGUKCWlmIChNU19MaWJBbGxvY1dyaXRlQnVmKHVzKSkKCXsKCQlyZXN1bHQgPSBNU19OT19NRU1PUllfRVJST1I7CgkJZ290byBleGl0OwoJfQoKCXJlc3VsdCA9IE1TX1NUQVRVU19TVUNDRVNTOwoKZXhpdDoKCWtmcmVlKFBhZ2VCdWZmZXIxKTsKICAgIAlrZnJlZShQYWdlQnVmZmVyMCk7CgoJcHJpbnRrKCJNU19DYXJkSW5pdCBlbmRcbiIpOwoJcmV0dXJuIHJlc3VsdDsKfQoKLy8tLS0tLSBNU19MaWJDaGVja0Rpc2FibGVCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliQ2hlY2tEaXNhYmxlQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIFBoeUJsb2NrKQp7CglQV09SRAkJCVBhZ2VCdWY9TlVMTDsKCURXT1JECQkJcmVzdWx0PU1TX1NUQVRVU19TVUNDRVNTOwoJRFdPUkQJCQlibGssIGluZGV4PTA7CglNU19MaWJUeXBlRXh0ZGF0CWV4dGRhdDsKCglpZiAoKChQYWdlQnVmID0ga21hbGxvYyhNU19CWVRFU19QRVJfUEFHRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpKQoJewoJCXJlc3VsdCA9IE1TX05PX01FTU9SWV9FUlJPUjsKCQlnb3RvIGV4aXQ7Cgl9CgoJTVNfUmVhZGVyUmVhZFBhZ2UodXMsIFBoeUJsb2NrLCAxLCAoRFdPUkQgKilQYWdlQnVmLCAmZXh0ZGF0KTsKCWRvCgl7CgkJYmxrID0gYmUxNl90b19jcHUoUGFnZUJ1ZltpbmRleF0pOwoJCWlmIChibGsgPT0gTVNfTEJfTk9UX1VTRUQpCgkJCWJyZWFrOwoJCWlmIChibGsgPT0gdXMtPk1TX0xpYi5Mb2cyUGh5TWFwWzBdKQoJCXsKCQkJcmVzdWx0ID0gTVNfRVJST1JfRkxBU0hfUkVBRDsKCQkJYnJlYWs7CgkJfQoJCWluZGV4Kys7Cgl9IHdoaWxlKDEpOwoKZXhpdDoKCWtmcmVlKFBhZ2VCdWYpOwoJcmV0dXJuIHJlc3VsdDsKfQoKLy8tLS0tLSBNU19MaWJGcmVlQWxsb2NhdGVkQXJlYSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIE1TX0xpYkZyZWVBbGxvY2F0ZWRBcmVhKHN0cnVjdCB1c19kYXRhICp1cykKewoJTVNfTGliRnJlZVdyaXRlQnVmKHVzKTsKCU1TX0xpYkZyZWVMb2dpY2FsTWFwKHVzKTsKCgl1cy0+TVNfTGliLmZsYWdzCQkJPSAwOwoJdXMtPk1TX0xpYi5CeXRlc1BlclNlY3Rvcgk9IDA7Cgl1cy0+TVNfTGliLlNlY3RvcnNQZXJDeWxpbmRlcgk9IDA7CgoJdXMtPk1TX0xpYi5jYXJkVHlwZQkJPSAwOwoJdXMtPk1TX0xpYi5ibG9ja1NpemUJCT0gMDsKCXVzLT5NU19MaWIuUGFnZXNQZXJCbG9jawk9IDA7CgoJdXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrCT0gMDsKCXVzLT5NU19MaWIuTnVtYmVyT2ZMb2dCbG9jawk9IDA7Cn0KCi8vLS0tLS0gTVNfTGliRnJlZVdyaXRlQnVmKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBNU19MaWJGcmVlV3JpdGVCdWYoc3RydWN0IHVzX2RhdGEgKnVzKQp7Cgl1cy0+TVNfTGliLndydGJsayA9IChXT1JEKS0xOyAvL3NldCB0byAtMQoJTVNfTGliQ2xlYXJQYWdlTWFwKHVzKTsgLy8gbWVtc2V0KChmZG9FeHQpLT5NU19MaWIucGFnZW1hcCwgMCwgc2l6ZW9mKChmZG9FeHQpLT5NU19MaWIucGFnZW1hcCkpCgoJaWYgKHVzLT5NU19MaWIuYmxrcGFnKQoJewoJCWtmcmVlKChCWVRFICopKHVzLT5NU19MaWIuYmxrcGFnKSk7ICAvLyBBcm5vbGQgdGVzdCAuLi4KCQl1cy0+TVNfTGliLmJsa3BhZyA9IE5VTEw7Cgl9CgoJaWYgKHVzLT5NU19MaWIuYmxrZXh0KQoJewoJCWtmcmVlKChCWVRFICopKHVzLT5NU19MaWIuYmxrZXh0KSk7ICAvLyBBcm5vbGQgdGVzdCAuLi4KCQl1cy0+TVNfTGliLmJsa2V4dCA9IE5VTEw7Cgl9Cn0KCi8vLS0tLS0gTVNfTGliRnJlZUxvZ2ljYWxNYXAoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0xpYkZyZWVMb2dpY2FsTWFwKHN0cnVjdCB1c19kYXRhICp1cykKewoJa2ZyZWUodXMtPk1TX0xpYi5QaHkyTG9nTWFwKTsKCXVzLT5NU19MaWIuUGh5MkxvZ01hcCA9IE5VTEw7CgoJa2ZyZWUodXMtPk1TX0xpYi5Mb2cyUGh5TWFwKTsKCXVzLT5NU19MaWIuTG9nMlBoeU1hcCA9IE5VTEw7CgogICAgcmV0dXJuIDA7Cn0KCi8vLS0tLS0gTVNfTGliUHJvY2Vzc0Jvb3RCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0xpYlByb2Nlc3NCb290QmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIFBoeUJsb2NrLCBCWVRFICpQYWdlRGF0YSkKewoJTWVtU3RpY2tCb290QmxvY2tTeXNFbnQgICpTeXNFbnRyeTsKCU1lbVN0aWNrQm9vdEJsb2NrU3lzSW5mICAqU3lzSW5mbzsKCURXT1JEICAgICAgICAgICAgICAgICAgICBpLCByZXN1bHQ7CglCWVRFICAgICAgICAgICAgICAgICAgICAgUGFnZU51bWJlcjsKCUJZVEUgICAgICAgICAgICAgICAgICAgICAqUGFnZUJ1ZmZlcjsKCU1TX0xpYlR5cGVFeHRkYXQgICAgICAgICBFeHRyYURhdGE7CgoJaWYgKChQYWdlQnVmZmVyID0ga21hbGxvYyhNU19CWVRFU19QRVJfUEFHRSwgR0ZQX0tFUk5FTCkpPT1OVUxMKQoJCXJldHVybiAoRFdPUkQpLTE7CgoJcmVzdWx0ID0gKERXT1JEKS0xOwoKCVN5c0luZm89ICYoKChNZW1TdGlja0Jvb3RCbG9ja1BhZ2UwICopUGFnZURhdGEpLT5zeXNpbmYpOwoKCWlmICgoU3lzSW5mby0+Yk1zQ2xhc3MgIT0gTVNfU1lTSU5GX01TQ0xBU1NfVFlQRV8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKCQkoYmUxNl90b19jcHUoU3lzSW5mby0+d1BhZ2VTaXplKSAhPSBNU19TWVNJTkZfUEFHRV9TSVpFKSAgICAgICAgICAgICAgICAgICAgICAgfHwKCQkoKFN5c0luZm8tPmJTZWN1cml0eVN1cHBvcnQgJiBNU19TWVNJTkZfU0VDVVJJVFkpID09IE1TX1NZU0lORl9TRUNVUklUWV9TVVBQT1JUKSB8fAoJCShTeXNJbmZvLT5iUmVzZXJ2ZWQxICE9IE1TX1NZU0lORl9SRVNFUlZFRDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CgkJKFN5c0luZm8tPmJSZXNlcnZlZDIgIT0gTVNfU1lTSU5GX1JFU0VSVkVEMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKCQkoU3lzSW5mby0+YkZvcm1hdFR5cGUhPSBNU19TWVNJTkZfRk9STUFUX0ZBVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAoJCShTeXNJbmZvLT5iVXNhZ2UgIT0gTVNfU1lTSU5GX1VTQUdFX0dFTkVSQUwpKQoJCWdvdG8gZXhpdDsKCglzd2l0Y2ggKHVzLT5NU19MaWIuY2FyZFR5cGUgPSBTeXNJbmZvLT5iQ2FyZFR5cGUpCgl7CgkJY2FzZSBNU19TWVNJTkZfQ0FSRFRZUEVfUkRPTkxZOgoJCQlNU19MaWJDdHJsU2V0KHVzLCBNU19MSUJfQ1RSTF9SRE9OTFkpOwoJCQlicmVhazsKCQljYXNlIE1TX1NZU0lORl9DQVJEVFlQRV9SRFdSOgoJCQlNU19MaWJDdHJsUmVzZXQodXMsIE1TX0xJQl9DVFJMX1JET05MWSk7CgkJCWJyZWFrOwoJCWNhc2UgTVNfU1lTSU5GX0NBUkRUWVBFX0hZQlJJRDoKCQlkZWZhdWx0OgoJCQlnb3RvIGV4aXQ7Cgl9CgoJdXMtPk1TX0xpYi5ibG9ja1NpemUgICAgICAgID0gYmUxNl90b19jcHUoU3lzSW5mby0+d0Jsb2NrU2l6ZSk7Cgl1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2sgPSBiZTE2X3RvX2NwdShTeXNJbmZvLT53QmxvY2tOdW1iZXIpOwoJdXMtPk1TX0xpYi5OdW1iZXJPZkxvZ0Jsb2NrID0gYmUxNl90b19jcHUoU3lzSW5mby0+d1RvdGFsQmxvY2tOdW1iZXIpIC0gMjsKCXVzLT5NU19MaWIuUGFnZXNQZXJCbG9jayAgICA9IHVzLT5NU19MaWIuYmxvY2tTaXplICogU0laRV9PRl9LSVJPIC8gTVNfQllURVNfUEVSX1BBR0U7Cgl1cy0+TVNfTGliLk51bWJlck9mU2VnbWVudCAgPSB1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2sgLyBNU19QSFlTSUNBTF9CTE9DS1NfUEVSX1NFR01FTlQ7Cgl1cy0+TVNfTW9kZWwgICAgICAgICAgICAgICAgPSBiZTE2X3RvX2NwdShTeXNJbmZvLT53TWVtb3J5U2l6ZSk7CgoJaWYgKE1TX0xpYkFsbG9jTG9naWNhbE1hcCh1cykpCQkJLy9BbGxvY2F0ZSB0byBhbGwgbnVtYmVyIG9mIGxvZ2ljYWxibG9jayBhbmQgcGh5c2ljYWxibG9jawoJCWdvdG8gZXhpdDsKCglNU19MaWJTZXRCb290QmxvY2tNYXJrKHVzLCBQaHlCbG9jayk7CQkvL01hcmsgdGhlIGJvb2sgYmxvY2sKCglTeXNFbnRyeSA9ICYoKChNZW1TdGlja0Jvb3RCbG9ja1BhZ2UwICopUGFnZURhdGEpLT5zeXNlbnQpOwoKCWZvciAoaT0wOyBpPE1TX05VTUJFUl9PRl9TWVNURU1fRU5UUlk7IGkrKykKCXsKCQlEV09SRCAgRW50cnlPZmZzZXQsIEVudHJ5U2l6ZTsKCgkJaWYgKChFbnRyeU9mZnNldCA9IGJlMzJfdG9fY3B1KFN5c0VudHJ5LT5lbnRyeVtpXS5kd1N0YXJ0KSkgPT0gMHhmZmZmZmYpCgkJCWNvbnRpbnVlOwoKCQlpZiAoKEVudHJ5U2l6ZSA9IGJlMzJfdG9fY3B1KFN5c0VudHJ5LT5lbnRyeVtpXS5kd1NpemUpKSA9PSAwKQoJCQljb250aW51ZTsKCgkJaWYgKEVudHJ5T2Zmc2V0ICsgTVNfQllURVNfUEVSX1BBR0UgKyBFbnRyeVNpemUgPiB1cy0+TVNfTGliLmJsb2NrU2l6ZSAqIChEV09SRClTSVpFX09GX0tJUk8pCgkJCWNvbnRpbnVlOwoKCQlpZiAoaSA9PSAwKQoJCXsKCQkJQllURSAgUHJldlBhZ2VOdW1iZXIgPSAwOwoJCQlXT1JEICBwaHlibGs7CgoJCQlpZiAoU3lzRW50cnktPmVudHJ5W2ldLmJUeXBlICE9IE1TX1NZU0VOVF9UWVBFX0lOVkFMSURfQkxPQ0spCgkJCQlnb3RvIGV4aXQ7CgoJCQl3aGlsZSAoRW50cnlTaXplID4gMCkKCQkJewoJCQkJaWYgKChQYWdlTnVtYmVyID0gKEJZVEUpKEVudHJ5T2Zmc2V0IC8gTVNfQllURVNfUEVSX1BBR0UgKyAxKSkgIT0gUHJldlBhZ2VOdW1iZXIpCgkJCQl7CgkJCQkJc3dpdGNoIChNU19SZWFkZXJSZWFkUGFnZSh1cywgUGh5QmxvY2ssIFBhZ2VOdW1iZXIsIChEV09SRCAqKVBhZ2VCdWZmZXIsICZFeHRyYURhdGEpKQoJCQkJCXsKCQkJCQkJY2FzZSBNU19TVEFUVVNfU1VDQ0VTUzoKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlIE1TX1NUQVRVU19XUklURV9QUk9URUNUOgoJCQkJCQljYXNlIE1TX0VSUk9SX0ZMQVNIX1JFQUQ6CgkJCQkJCWNhc2UgTVNfU1RBVFVTX0VSUk9SOgoJCQkJCQlkZWZhdWx0OgoJCQkJCQkJZ290byBleGl0OwoJCQkJCX0KCgkJCQkJUHJldlBhZ2VOdW1iZXIgPSBQYWdlTnVtYmVyOwoJCQkJfQoKCQkJCWlmICgocGh5YmxrID0gYmUxNl90b19jcHUoKihXT1JEICopKFBhZ2VCdWZmZXIgKyAoRW50cnlPZmZzZXQgJSBNU19CWVRFU19QRVJfUEFHRSkpKSkgPCAweDBmZmYpCgkJCQkJTVNfTGliU2V0SW5pdGlhbEVycm9yQmxvY2sodXMsIHBoeWJsayk7CgoJCQkJRW50cnlPZmZzZXQgKz0gMjsKCQkJCUVudHJ5U2l6ZSAtPSAyOwoJCQl9CgkJfQoJCWVsc2UgaWYgKGkgPT0gMSkKCQl7ICAvLyBDSVMvSURJCgkJCU1lbVN0aWNrQm9vdEJsb2NrSURJICAqaWRpOwoKCQkJaWYgKFN5c0VudHJ5LT5lbnRyeVtpXS5iVHlwZSAhPSBNU19TWVNFTlRfVFlQRV9DSVNfSURJKQoJCQkJZ290byBleGl0OwoKCQkJc3dpdGNoIChNU19SZWFkZXJSZWFkUGFnZSh1cywgUGh5QmxvY2ssIChCWVRFKShFbnRyeU9mZnNldCAvIE1TX0JZVEVTX1BFUl9QQUdFICsgMSksIChEV09SRCAqKVBhZ2VCdWZmZXIsICZFeHRyYURhdGEpKQoJCQl7CgkJCQljYXNlIE1TX1NUQVRVU19TVUNDRVNTOgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBNU19TVEFUVVNfV1JJVEVfUFJPVEVDVDoKCQkJCWNhc2UgTVNfRVJST1JfRkxBU0hfUkVBRDoKCQkJCWNhc2UgTVNfU1RBVFVTX0VSUk9SOgoJCQkJZGVmYXVsdDoKCQkJCQlnb3RvIGV4aXQ7CgkJCX0KCgkJCWlkaSA9ICYoKE1lbVN0aWNrQm9vdEJsb2NrQ0lTX0lESSAqKShQYWdlQnVmZmVyICsgKEVudHJ5T2Zmc2V0ICUgTVNfQllURVNfUEVSX1BBR0UpKSktPmlkaS5pZGk7CgkJCWlmIChsZTE2X3RvX2NwdShpZGktPndJRElnZW5lcmFsQ29uZmlndXJhdGlvbikgIT0gTVNfSURJX0dFTkVSQUxfQ09ORikKCQkJCWdvdG8gZXhpdDsKCgkJCXVzLT5NU19MaWIuQnl0ZXNQZXJTZWN0b3IgPSBsZTE2X3RvX2NwdShpZGktPndJRElieXRlc1BlclNlY3Rvcik7CgkJCWlmICh1cy0+TVNfTGliLkJ5dGVzUGVyU2VjdG9yICE9IE1TX0JZVEVTX1BFUl9QQUdFKQoJCQkJZ290byBleGl0OwoJCX0KCX0gLy8gRW5kIGZvciAuLgoKCXJlc3VsdCA9IDA7CgpleGl0OgoJaWYgKHJlc3VsdCkJCU1TX0xpYkZyZWVMb2dpY2FsTWFwKHVzKTsKCWtmcmVlKFBhZ2VCdWZmZXIpOwoKCXJlc3VsdCA9IDA7CglyZXR1cm4gcmVzdWx0Owp9CgovLy0tLS0tIE1TX0xpYkFsbG9jTG9naWNhbE1hcCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJBbGxvY0xvZ2ljYWxNYXAoc3RydWN0IHVzX2RhdGEgKnVzKQp7CglEV09SRCAgaTsKCgoJdXMtPk1TX0xpYi5QaHkyTG9nTWFwID0ga21hbGxvYyh1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2sgKiBzaXplb2YoV09SRCksIEdGUF9LRVJORUwpOwoJdXMtPk1TX0xpYi5Mb2cyUGh5TWFwID0ga21hbGxvYyh1cy0+TVNfTGliLk51bWJlck9mTG9nQmxvY2sgKiBzaXplb2YoV09SRCksIEdGUF9LRVJORUwpOwoKCWlmICgodXMtPk1TX0xpYi5QaHkyTG9nTWFwID09IE5VTEwpIHx8ICh1cy0+TVNfTGliLkxvZzJQaHlNYXAgPT0gTlVMTCkpCgl7CgkJTVNfTGliRnJlZUxvZ2ljYWxNYXAodXMpOwoJCXJldHVybiAoRFdPUkQpLTE7Cgl9CgoJZm9yIChpID0gMDsgaSA8IHVzLT5NU19MaWIuTnVtYmVyT2ZQaHlCbG9jazsgaSsrKQoJCXVzLT5NU19MaWIuUGh5MkxvZ01hcFtpXSA9IE1TX0xCX05PVF9VU0VEOwoKCWZvciAoaSA9IDA7IGkgPCB1cy0+TVNfTGliLk51bWJlck9mTG9nQmxvY2s7IGkrKykKCXVzLT5NU19MaWIuTG9nMlBoeU1hcFtpXSA9IE1TX0xCX05PVF9VU0VEOwoKCXJldHVybiAwOwp9CgovLy0tLS0tIE1TX0xpYlNldEJvb3RCbG9ja01hcmsoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJTZXRCb290QmxvY2tNYXJrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBwaHlibGspCnsKICAgIHJldHVybiBNU19MaWJTZXRMb2dpY2FsQmxvY2tNYXJrKHVzLCBwaHlibGssIE1TX0xCX0JPT1RfQkxPQ0spOwp9CgovLy0tLS0tIE1TX0xpYlNldExvZ2ljYWxCbG9ja01hcmsoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJTZXRMb2dpY2FsQmxvY2tNYXJrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBwaHlibGssIFdPUkQgbWFyaykKewogICAgaWYgKHBoeWJsayA+PSB1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2spCiAgICAgICAgcmV0dXJuIChEV09SRCktMTsKCiAgICB1cy0+TVNfTGliLlBoeTJMb2dNYXBbcGh5YmxrXSA9IG1hcms7CgogICAgcmV0dXJuIDA7Cn0KCi8vLS0tLS0gTVNfTGliU2V0SW5pdGlhbEVycm9yQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0xpYlNldEluaXRpYWxFcnJvckJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBwaHlibGspCnsKICAgIHJldHVybiBNU19MaWJTZXRMb2dpY2FsQmxvY2tNYXJrKHVzLCBwaHlibGssIE1TX0xCX0lOSVRJQUxfRVJST1IpOwp9CgovLy0tLS0tIE1TX0xpYlNjYW5Mb2dpY2FsQmxvY2tOdW1iZXIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJTY2FuTG9naWNhbEJsb2NrTnVtYmVyKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBidEJsazFzdCkKewoJV09SRAkJCVBoeUJsb2NrLCBuZXdibGssIGk7CglXT1JECQkJTG9nU3RhcnQsIExvZ0VuZGU7CglNU19MaWJUeXBlRXh0ZGF0CWV4dGRhdDsKCUJZVEUJCQlidWZbMHgyMDBdOwoJRFdPUkQJCQljb3VudD0wLCBpbmRleD0wOwoKCWZvciAoUGh5QmxvY2sgPSAwOyBQaHlCbG9jayA8IHVzLT5NU19MaWIuTnVtYmVyT2ZQaHlCbG9jazspCgl7CgkJTVNfTGliUGh5MkxvZ1JhbmdlKFBoeUJsb2NrLCAmTG9nU3RhcnQsICZMb2dFbmRlKTsKCgkJZm9yIChpPTA7IGk8TVNfUEhZU0lDQUxfQkxPQ0tTX1BFUl9TRUdNRU5UOyBpKyssIFBoeUJsb2NrKyspCgkJewoJCQlzd2l0Y2ggKE1TX0xpYkNvbnYyTG9naWNhbCh1cywgUGh5QmxvY2spKQoJCQl7CgkJCQljYXNlIE1TX1NUQVRVU19FUlJPUjoKCQkJCQljb250aW51ZTsKCQkJCWRlZmF1bHQ6CgkJCQkJYnJlYWs7CgkJCX0KCgkJCWlmIChjb3VudCA9PSBQaHlCbG9jaykKCQkJewoJCQkJTVNfTGliUmVhZEV4dHJhQmxvY2sodXMsIFBoeUJsb2NrLCAwLCAweDgwLCAmYnVmKTsKCQkJCWNvdW50ICs9IDB4ODA7CgkJCX0KCQkJaW5kZXggPSAoUGh5QmxvY2sgJSAweDgwKSAqIDQ7CgoJCQlleHRkYXQub3ZyZmxnID0gYnVmW2luZGV4XTsKCQkJZXh0ZGF0Lm1uZ2ZsZyA9IGJ1ZltpbmRleCsxXTsKCQkJZXh0ZGF0LmxvZ2FkciA9IE1lbVN0aWNrTG9nQWRkcihidWZbaW5kZXgrMl0sIGJ1ZltpbmRleCszXSk7CgoJCQlpZiAoKGV4dGRhdC5vdnJmbGcgJiBNU19SRUdfT1ZSX0JLU1QpICE9IE1TX1JFR19PVlJfQktTVF9PSykKCQkJewoJCQkJTVNfTGliU2V0QWNxdWlyZWRFcnJvckJsb2NrKHVzLCBQaHlCbG9jayk7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYgKChleHRkYXQubW5nZmxnICYgTVNfUkVHX01OR19BVEZMRykgPT0gTVNfUkVHX01OR19BVEZMR19BVFRCTCkKCQkJewoJCQkJTVNfTGliRXJhc2VQaHlCbG9jayh1cywgUGh5QmxvY2spOwoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmIChleHRkYXQubG9nYWRyICE9IE1TX0xCX05PVF9VU0VEKQoJCQl7CgkJCQlpZiAoKGV4dGRhdC5sb2dhZHIgPCBMb2dTdGFydCkgfHwgKExvZ0VuZGUgPD0gZXh0ZGF0LmxvZ2FkcikpCgkJCQl7CgkJCQkJTVNfTGliRXJhc2VQaHlCbG9jayh1cywgUGh5QmxvY2spOwoJCQkJCWNvbnRpbnVlOwoJCQkJfQoKCQkJCWlmICgobmV3YmxrID0gTVNfTGliQ29udjJQaHlzaWNhbCh1cywgZXh0ZGF0LmxvZ2FkcikpICE9IE1TX0xCX05PVF9VU0VEKQoJCQkJewoJCQkJCWlmIChleHRkYXQubG9nYWRyPT0wKQoJCQkJCXsKCQkJCQkJTVNfTGliU2V0TG9naWNhbFBhaXIodXMsIGV4dGRhdC5sb2dhZHIsIFBoeUJsb2NrKTsKCQkJCQkJaWYgKCBNU19MaWJDaGVja0Rpc2FibGVCbG9jayh1cywgYnRCbGsxc3QpICkKCQkJCQkJewoJCQkJCQkJTVNfTGliU2V0TG9naWNhbFBhaXIodXMsIGV4dGRhdC5sb2dhZHIsIG5ld2Jsayk7CgkJCQkJCQljb250aW51ZTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJTVNfTGliUmVhZEV4dHJhKHVzLCBuZXdibGssIDAsICZleHRkYXQpOwoJCQkJCWlmICgoZXh0ZGF0Lm92cmZsZyAmIE1TX1JFR19PVlJfVURTVCkgPT0gTVNfUkVHX09WUl9VRFNUX1VQREFUSU5HKQoJCQkJCXsKCQkJCQkJTVNfTGliRXJhc2VQaHlCbG9jayh1cywgUGh5QmxvY2spOwoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCQlNU19MaWJFcmFzZVBoeUJsb2NrKHVzLCBuZXdibGspOwoJCQkJfQoKCQkJCU1TX0xpYlNldExvZ2ljYWxQYWlyKHVzLCBleHRkYXQubG9nYWRyLCBQaHlCbG9jayk7CgkJCX0KCQl9Cgl9IC8vRW5kIGZvciAuLi4KCglyZXR1cm4gTVNfU1RBVFVTX1NVQ0NFU1M7Cn0KCi8vLS0tLS0gTVNfTGliQWxsb2NXcml0ZUJ1ZigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0xpYkFsbG9jV3JpdGVCdWYoc3RydWN0IHVzX2RhdGEgKnVzKQp7Cgl1cy0+TVNfTGliLndydGJsayA9IChXT1JEKS0xOwoKCXVzLT5NU19MaWIuYmxrcGFnID0ga21hbGxvYyh1cy0+TVNfTGliLlBhZ2VzUGVyQmxvY2sgKiB1cy0+TVNfTGliLkJ5dGVzUGVyU2VjdG9yLCBHRlBfS0VSTkVMKTsKCXVzLT5NU19MaWIuYmxrZXh0ID0ga21hbGxvYyh1cy0+TVNfTGliLlBhZ2VzUGVyQmxvY2sgKiBzaXplb2YoTVNfTGliVHlwZUV4dGRhdCksIEdGUF9LRVJORUwpOwoKCWlmICgodXMtPk1TX0xpYi5ibGtwYWcgPT0gTlVMTCkgfHwgKHVzLT5NU19MaWIuYmxrZXh0ID09IE5VTEwpKQoJewoJCU1TX0xpYkZyZWVXcml0ZUJ1Zih1cyk7CgkJcmV0dXJuIChEV09SRCktMTsKCX0KCglNU19MaWJDbGVhcldyaXRlQnVmKHVzKTsKCglyZXR1cm4gMDsKfQoKLy8tLS0tLSBNU19MaWJDbGVhcldyaXRlQnVmKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIE1TX0xpYkNsZWFyV3JpdGVCdWYoc3RydWN0IHVzX2RhdGEgKnVzKQp7CglpbnQgaTsKCgl1cy0+TVNfTGliLndydGJsayA9IChXT1JEKS0xOwoJTVNfTGliQ2xlYXJQYWdlTWFwKHVzKTsKCglpZiAodXMtPk1TX0xpYi5ibGtwYWcpCgkJbWVtc2V0KHVzLT5NU19MaWIuYmxrcGFnLCAweGZmLCB1cy0+TVNfTGliLlBhZ2VzUGVyQmxvY2sgKiB1cy0+TVNfTGliLkJ5dGVzUGVyU2VjdG9yKTsKCglpZiAodXMtPk1TX0xpYi5ibGtleHQpCgl7CgkJZm9yIChpID0gMDsgaSA8IHVzLT5NU19MaWIuUGFnZXNQZXJCbG9jazsgaSsrKQoJCXsKCQkJdXMtPk1TX0xpYi5ibGtleHRbaV0uc3RhdHVzMSA9IE1TX1JFR19TVDFfREVGQVVMVDsKCQkJdXMtPk1TX0xpYi5ibGtleHRbaV0ub3ZyZmxnID0gTVNfUkVHX09WUl9ERUZBVUxUOwoJCQl1cy0+TVNfTGliLmJsa2V4dFtpXS5tbmdmbGcgPSBNU19SRUdfTU5HX0RFRkFVTFQ7CgkJCXVzLT5NU19MaWIuYmxrZXh0W2ldLmxvZ2FkciA9IE1TX0xCX05PVF9VU0VEOwoJCX0KCX0KfQoKLy8tLS0tLSBNU19MaWJQaHkyTG9nUmFuZ2UoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIE1TX0xpYlBoeTJMb2dSYW5nZShXT1JEIFBoeUJsb2NrLCBXT1JEICpMb2dTdGFydCwgV09SRCAqTG9nRW5kZSkKewoJUGh5QmxvY2sgLz0gTVNfUEhZU0lDQUxfQkxPQ0tTX1BFUl9TRUdNRU5UOwoKCWlmIChQaHlCbG9jaykKCXsKCQkqTG9nU3RhcnQgPSBNU19MT0dJQ0FMX0JMT0NLU19JTl8xU1RfU0VHTUVOVCArIChQaHlCbG9jayAtIDEpICogTVNfTE9HSUNBTF9CTE9DS1NfUEVSX1NFR01FTlQ7Ly80OTYKCQkqTG9nRW5kZSA9ICpMb2dTdGFydCArIE1TX0xPR0lDQUxfQkxPQ0tTX1BFUl9TRUdNRU5UOy8vNDk2Cgl9CgllbHNlCgl7CgkJKkxvZ1N0YXJ0ID0gMDsKCQkqTG9nRW5kZSA9IE1TX0xPR0lDQUxfQkxPQ0tTX0lOXzFTVF9TRUdNRU5UOy8vNDk0Cgl9Cn0KCi8vLS0tLS0gTVNfTGliUmVhZEV4dHJhQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliUmVhZEV4dHJhQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBEV09SRCBQaHlCbG9jaywgQllURSBQYWdlTnVtLCBCWVRFIGJsZW4sIHZvaWQgKmJ1ZikKewoJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwoJaW50CXJlc3VsdDsKCgkvL3ByaW50aygiTVNfTGliUmVhZEV4dHJhQmxvY2sgLS0tIFBoeUJsb2NrID0gJXgsIFBhZ2VOdW0gPSAleCwgYmxlbiA9ICV4XG4iLCBQaHlCbG9jaywgUGFnZU51bSwgYmxlbik7CgoJLy8gUmVhZCBFeHRyYSBEYXRhCgltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwoJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwoJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGggPSAweDQgKiBibGVuOwoJYmNiLT5GbGFncwkJCT0gMHg4MDsKCWJjYi0+Q0RCWzBdCQkJPSAweEYxOwoJYmNiLT5DREJbMV0JCQk9IDB4MDM7CgliY2ItPkNEQls1XQkJCT0gKEJZVEUpKFBhZ2VOdW0pOwoJYmNiLT5DREJbNF0JCQk9IChCWVRFKShQaHlCbG9jayk7CgliY2ItPkNEQlszXQkJCT0gKEJZVEUpKFBoeUJsb2NrPj44KTsKCWJjYi0+Q0RCWzJdCQkJPSAoQllURSkoUGh5QmxvY2s+PjE2KTsKCWJjYi0+Q0RCWzZdCQkJPSBibGVuOwoKCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCBidWYsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KCi8vLS0tLS0gTVNfTGliUmVhZEV4dHJhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0xpYlJlYWRFeHRyYShzdHJ1Y3QgdXNfZGF0YSAqdXMsIERXT1JEIFBoeUJsb2NrLCBCWVRFIFBhZ2VOdW0sIE1TX0xpYlR5cGVFeHRkYXQgKkV4dHJhRGF0KQp7CglzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CglpbnQJcmVzdWx0OwoJQllURQlFeHRCdWZbNF07CgoJLy9wcmludGsoIk1TX0xpYlJlYWRFeHRyYSAtLS0gUGh5QmxvY2sgPSAleCwgUGFnZU51bSA9ICV4XG4iLCBQaHlCbG9jaywgUGFnZU51bSk7CgltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwoJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwoJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGggPSAweDQ7CgliY2ItPkZsYWdzCQkJPSAweDgwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjE7CgliY2ItPkNEQlsxXQkJCT0gMHgwMzsKCWJjYi0+Q0RCWzVdCQkJPSAoQllURSkoUGFnZU51bSk7CgliY2ItPkNEQls0XQkJCT0gKEJZVEUpKFBoeUJsb2NrKTsKCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoUGh5QmxvY2s+PjgpOwoJYmNiLT5DREJbMl0JCQk9IChCWVRFKShQaHlCbG9jaz4+MTYpOwoJYmNiLT5DREJbNl0JCQk9IDB4MDE7CgkKCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCAmRXh0QnVmLCAwKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJRXh0cmFEYXQtPnJlc2VydmVkID0gMDsKCUV4dHJhRGF0LT5pbnRyICAgICA9IDB4ODA7ICAvLyBOb3QgeWV0LCB3YWl0aW5nIGZvciBmaXJld2FyZSBzdXBwb3J0CglFeHRyYURhdC0+c3RhdHVzMCAgPSAweDEwOyAgLy8gTm90IHlldCwgd2FpdGluZyBmb3IgZmlyZXdhcmUgc3VwcG9ydAoJRXh0cmFEYXQtPnN0YXR1czEgID0gMHgwMDsgIC8vIE5vdCB5ZXQsIHdhaXRpbmcgZm9yIGZpcmV3YXJlIHN1cHBvcnQKCUV4dHJhRGF0LT5vdnJmbGcgICA9IEV4dEJ1ZlswXTsKCUV4dHJhRGF0LT5tbmdmbGcgICA9IEV4dEJ1ZlsxXTsKCUV4dHJhRGF0LT5sb2dhZHIgICA9IE1lbVN0aWNrTG9nQWRkcihFeHRCdWZbMl0sIEV4dEJ1ZlszXSk7CgkKCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKfQoKLy8tLS0tLSBNU19MaWJTZXRBY3F1aXJlZEVycm9yQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliU2V0QWNxdWlyZWRFcnJvckJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBwaHlibGspCnsKCVdPUkQgbG9nOwoKCWlmIChwaHlibGsgPj0gdXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrKQoJCXJldHVybiAoRFdPUkQpLTE7CgoJaWYgKChsb2cgPSB1cy0+TVNfTGliLlBoeTJMb2dNYXBbcGh5YmxrXSkgPCB1cy0+TVNfTGliLk51bWJlck9mTG9nQmxvY2spCgkJdXMtPk1TX0xpYi5Mb2cyUGh5TWFwW2xvZ10gPSBNU19MQl9OT1RfVVNFRDsKCglpZiAodXMtPk1TX0xpYi5QaHkyTG9nTWFwW3BoeWJsa10gIT0gTVNfTEJfSU5JVElBTF9FUlJPUikKCQl1cy0+TVNfTGliLlBoeTJMb2dNYXBbcGh5YmxrXSA9IE1TX0xCX0FDUVVJUkVEX0VSUk9SOwoKCXJldHVybiAwOwp9CgovLy0tLS0tIE1TX0xpYkVyYXNlUGh5QmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJFcmFzZVBoeUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBwaHlibGspCnsKCVdPUkQgIGxvZzsKCglpZiAocGh5YmxrID49IHVzLT5NU19MaWIuTnVtYmVyT2ZQaHlCbG9jaykKCQlyZXR1cm4gTVNfU1RBVFVTX0VSUk9SOwoKCWlmICgobG9nID0gdXMtPk1TX0xpYi5QaHkyTG9nTWFwW3BoeWJsa10pIDwgdXMtPk1TX0xpYi5OdW1iZXJPZkxvZ0Jsb2NrKQoJCXVzLT5NU19MaWIuTG9nMlBoeU1hcFtsb2ddID0gTVNfTEJfTk9UX1VTRUQ7CgoJdXMtPk1TX0xpYi5QaHkyTG9nTWFwW3BoeWJsa10gPSBNU19MQl9OT1RfVVNFRDsKCglpZiAoTVNfTGliSXNXcml0YWJsZSh1cykpCgl7CgkJc3dpdGNoIChNU19SZWFkZXJFcmFzZUJsb2NrKHVzLCBwaHlibGspKQoJCXsKCQkJY2FzZSBNU19TVEFUVVNfU1VDQ0VTUzoKCQkJCXVzLT5NU19MaWIuUGh5MkxvZ01hcFtwaHlibGtdID0gTVNfTEJfTk9UX1VTRURfRVJBU0VEOwoJCQkJcmV0dXJuIE1TX1NUQVRVU19TVUNDRVNTOwoJCQljYXNlIE1TX0VSUk9SX0ZMQVNIX0VSQVNFOgoJCQljYXNlIE1TX1NUQVRVU19JTlRfRVJST1IgOgoJCQkJTVNfTGliRXJyb3JQaHlCbG9jayh1cywgcGh5YmxrKTsKCQkJCXJldHVybiBNU19FUlJPUl9GTEFTSF9FUkFTRTsKCQkJY2FzZSBNU19TVEFUVVNfRVJST1I6CgkJCWRlZmF1bHQ6CgkJCQlNU19MaWJDdHJsU2V0KHVzLCBNU19MSUJfQ1RSTF9SRE9OTFkpOwoJCQkJTVNfTGliU2V0QWNxdWlyZWRFcnJvckJsb2NrKHVzLCBwaHlibGspOwoJCQkJcmV0dXJuIE1TX1NUQVRVU19FUlJPUjsKCQl9Cgl9CgoJTVNfTGliU2V0QWNxdWlyZWRFcnJvckJsb2NrKHVzLCBwaHlibGspOwoKCXJldHVybiBNU19TVEFUVVNfU1VDQ0VTUzsKfQoKLy8tLS0tLSBNU19MaWJFcnJvclBoeUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliRXJyb3JQaHlCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgcGh5YmxrKQp7CiAgICBpZiAocGh5YmxrID49IHVzLT5NU19MaWIuTnVtYmVyT2ZQaHlCbG9jaykKICAgICAgICByZXR1cm4gTVNfU1RBVFVTX0VSUk9SOwoKICAgIE1TX0xpYlNldEFjcXVpcmVkRXJyb3JCbG9jayh1cywgcGh5YmxrKTsKCiAgICBpZiAoTVNfTGliSXNXcml0YWJsZSh1cykpCiAgICAgICAgcmV0dXJuIE1TX0xpYk92ZXJ3cml0ZUV4dHJhKHVzLCBwaHlibGssIDAsIChCWVRFKSh+TVNfUkVHX09WUl9CS1NUKSk7CgoKICAgIHJldHVybiBNU19TVEFUVVNfU1VDQ0VTUzsKfQoKLy8tLS0tLSBNU19MaWJPdmVyd3JpdGVFeHRyYSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliT3ZlcndyaXRlRXh0cmEoc3RydWN0IHVzX2RhdGEgKnVzLCBEV09SRCBQaHlCbG9ja0FkZHIsIEJZVEUgUGFnZU51bSwgQllURSBPdmVyd3JpdGVGbGFnKQp7CglzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CglpbnQJcmVzdWx0OwoKCS8vcHJpbnRrKCJNUyAtLS0gTVNfTGliT3ZlcndyaXRlRXh0cmEsICBQaHlCbG9ja0FkZHIgPSAleCwgUGFnZU51bSA9ICV4XG4iLCBQaHlCbG9ja0FkZHIsIFBhZ2VOdW0pOwoJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBNU19SV19QQVRURVJOKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoID0gMHg0OwoJYmNiLT5GbGFncwkJCT0gMHg4MDsKCWJjYi0+Q0RCWzBdCQkJPSAweEYyOwoJYmNiLT5DREJbMV0JCQk9IDB4MDU7CgliY2ItPkNEQls1XQkJCT0gKEJZVEUpKFBhZ2VOdW0pOwoJYmNiLT5DREJbNF0JCQk9IChCWVRFKShQaHlCbG9ja0FkZHIpOwoJYmNiLT5DREJbM10JCQk9IChCWVRFKShQaHlCbG9ja0FkZHI+PjgpOwoJYmNiLT5DREJbMl0JCQk9IChCWVRFKShQaHlCbG9ja0FkZHI+PjE2KTsKCWJjYi0+Q0RCWzZdCQkJPSBPdmVyd3JpdGVGbGFnOwoJYmNiLT5DREJbN10JCQk9IDB4RkY7CgliY2ItPkNEQls4XQkJCT0gMHhGRjsKCWJjYi0+Q0RCWzldCQkJPSAweEZGOwoJCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgTlVMTCwgMCk7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKfQoKLy8tLS0tLSBNU19MaWJGb3JjZVNldExvZ2ljYWxQYWlyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliRm9yY2VTZXRMb2dpY2FsUGFpcihzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgbG9nYmxrLCBXT1JEIHBoeWJsaykKewoJaWYgKGxvZ2JsayA9PSBNU19MQl9OT1RfVVNFRCkKCQlyZXR1cm4gMDsKCglpZiAoKGxvZ2JsayA+PSB1cy0+TVNfTGliLk51bWJlck9mTG9nQmxvY2spIHx8IChwaHlibGsgPj0gdXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrKSkKCQlyZXR1cm4gKERXT1JEKS0xOwoKCXVzLT5NU19MaWIuUGh5MkxvZ01hcFtwaHlibGtdID0gbG9nYmxrOwoJdXMtPk1TX0xpYi5Mb2cyUGh5TWFwW2xvZ2Jsa10gPSBwaHlibGs7CgoJcmV0dXJuIDA7Cn0KCi8vLS0tLS0gTVNfTGliU2V0TG9naWNhbFBhaXIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0xpYlNldExvZ2ljYWxQYWlyKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBsb2dibGssIFdPUkQgcGh5YmxrKQp7CglpZiAoKGxvZ2JsayA+PSB1cy0+TVNfTGliLk51bWJlck9mTG9nQmxvY2spIHx8IChwaHlibGsgPj0gdXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrKSkKCQlyZXR1cm4gKERXT1JEKS0xOwoKCXVzLT5NU19MaWIuUGh5MkxvZ01hcFtwaHlibGtdID0gbG9nYmxrOwoJdXMtPk1TX0xpYi5Mb2cyUGh5TWFwW2xvZ2Jsa10gPSBwaHlibGs7CgoJcmV0dXJuIDA7Cn0KCi8vLS0tLS0gTVNfQ291bnRGcmVlQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0NvdW50RnJlZUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBQaHlCbG9jaykKewoJRFdPUkQgRW5kZSwgQ291bnQ7CgoJRW5kZSA9IFBoeUJsb2NrICsgTVNfUEhZU0lDQUxfQkxPQ0tTX1BFUl9TRUdNRU5UOwoJZm9yIChDb3VudCA9IDA7IFBoeUJsb2NrIDwgRW5kZTsgUGh5QmxvY2srKykKCXsKCQlzd2l0Y2ggKHVzLT5NU19MaWIuUGh5MkxvZ01hcFtQaHlCbG9ja10pCgkJewoJCQljYXNlIE1TX0xCX05PVF9VU0VEOgoJCQljYXNlIE1TX0xCX05PVF9VU0VEX0VSQVNFRDoKCQkJCUNvdW50Kys7CgkJCWRlZmF1bHQ6CgkJCQlicmVhazsKCQl9Cgl9CgoJcmV0dXJuIENvdW50Owp9CgovLy0tLS0tIE1TX0xpYlNlYXJjaEJsb2NrRnJvbVBoeXNpY2FsKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJTZWFyY2hCbG9ja0Zyb21QaHlzaWNhbChzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgcGh5YmxrKQp7CglXT1JECQkJTmV3YmxrOwoJV09SRAkJCWJsazsKCU1TX0xpYlR5cGVFeHRkYXQJZXh0ZGF0OwoKCWlmIChwaHlibGsgPj0gdXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrKQoJCXJldHVybiBNU19MQl9FUlJPUjsKCglmb3IgKGJsayA9IHBoeWJsayArIDE7IGJsayAhPSBwaHlibGs7IGJsaysrKQoJewoJCWlmICgoYmxrICYgTVNfUEhZU0lDQUxfQkxPQ0tTX1BFUl9TRUdNRU5UX01BU0spID09IDApCgkJCWJsayAtPSBNU19QSFlTSUNBTF9CTE9DS1NfUEVSX1NFR01FTlQ7CgoJCU5ld2JsayA9IHVzLT5NU19MaWIuUGh5MkxvZ01hcFtibGtdOwoJCWlmICh1cy0+TVNfTGliLlBoeTJMb2dNYXBbYmxrXSA9PSBNU19MQl9OT1RfVVNFRF9FUkFTRUQpCgkJCXJldHVybiBibGs7CgkJZWxzZSBpZiAodXMtPk1TX0xpYi5QaHkyTG9nTWFwW2Jsa10gPT0gTVNfTEJfTk9UX1VTRUQpCgkJewoJCQlzd2l0Y2ggKE1TX0xpYlJlYWRFeHRyYSh1cywgYmxrLCAwLCAmZXh0ZGF0KSkKCQkJewoJCQkJY2FzZSBNU19TVEFUVVNfU1VDQ0VTUyA6CgkJCQljYXNlIE1TX1NUQVRVU19TVUNDRVNTX1dJVEhfRUNDOgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBNU19OT0NBUkRfRVJST1I6CgkJCQkJcmV0dXJuIE1TX05PQ0FSRF9FUlJPUjsKCQkJCWNhc2UgTVNfU1RBVFVTX0lOVF9FUlJPUjoKCQkJCQlyZXR1cm4gTVNfTEJfRVJST1I7CgkJCQljYXNlIE1TX0VSUk9SX0ZMQVNIX1JFQUQ6CgkJCQlkZWZhdWx0OgoJCQkJCU1TX0xpYlNldEFjcXVpcmVkRXJyb3JCbG9jayh1cywgYmxrKTsgICAgIC8vIE1TX0xpYkVycm9yUGh5QmxvY2soZmRvRXh0LCBibGspOwoJCQkJCWNvbnRpbnVlOwoJCQl9IC8vIEVuZCBzd2l0Y2gKCgkJCWlmICgoZXh0ZGF0Lm92cmZsZyAmIE1TX1JFR19PVlJfQktTVCkgIT0gTVNfUkVHX09WUl9CS1NUX09LKQoJCQl7CgkJCQlNU19MaWJTZXRBY3F1aXJlZEVycm9yQmxvY2sodXMsIGJsayk7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJc3dpdGNoIChNU19MaWJFcmFzZVBoeUJsb2NrKHVzLCBibGspKQoJCQl7CgkJCQljYXNlIE1TX1NUQVRVU19TVUNDRVNTOgoJCQkJCXJldHVybiBibGs7CgkJCQljYXNlIE1TX1NUQVRVU19FUlJPUjoKCQkJCQlyZXR1cm4gTVNfTEJfRVJST1I7CgkJCQljYXNlIE1TX0VSUk9SX0ZMQVNIX0VSQVNFOgoJCQkJZGVmYXVsdDoKCQkJCQlNU19MaWJFcnJvclBoeUJsb2NrKHVzLCBibGspOwoJCQkJCWJyZWFrOwoJCQl9CgkJfQoJfSAvLyBFbmQgZm9yCgoJcmV0dXJuIE1TX0xCX0VSUk9SOwp9CgovLy0tLS0tIE1TX0xpYlNlYXJjaEJsb2NrRnJvbUxvZ2ljYWwoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJTZWFyY2hCbG9ja0Zyb21Mb2dpY2FsKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBsb2dibGspCnsKCVdPUkQgcGh5YmxrOwoKCWlmICgocGh5YmxrPU1TX0xpYkNvbnYyUGh5c2ljYWwodXMsIGxvZ2JsaykpID49IE1TX0xCX0VSUk9SKQoJewoJCWlmIChsb2dibGsgPj0gdXMtPk1TX0xpYi5OdW1iZXJPZkxvZ0Jsb2NrKQoJCQlyZXR1cm4gTVNfTEJfRVJST1I7CgoJCXBoeWJsayA9IChsb2dibGsgKyBNU19OVU1CRVJfT0ZfQk9PVF9CTE9DSykgLyBNU19MT0dJQ0FMX0JMT0NLU19QRVJfU0VHTUVOVDsKCQlwaHlibGsgKj0gTVNfUEhZU0lDQUxfQkxPQ0tTX1BFUl9TRUdNRU5UOwoJCXBoeWJsayArPSBNU19QSFlTSUNBTF9CTE9DS1NfUEVSX1NFR01FTlQgLSAxOwoJfQoKCXJldHVybiBNU19MaWJTZWFyY2hCbG9ja0Zyb21QaHlzaWNhbCh1cywgcGh5YmxrKTsKfQoKCg==