I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgInVzYi5oIgojaW5jbHVkZSAic2NzaWdsdWUuaCIKI2luY2x1ZGUgInRyYW5zcG9ydC5oIgojaW5jbHVkZSAibXMuaCIKCi8vLS0tLS0gTVNfUmVhZGVyQ29weUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19SZWFkZXJDb3B5QmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIG9sZHBoeSwgV09SRCBuZXdwaHksIFdPUkQgUGh5QmxvY2tBZGRyLCBCWVRFIFBhZ2VOdW0sIFBCWVRFIGJ1ZiwgV09SRCBsZW4pCnsKCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKCWludAlyZXN1bHQ7CgoJLy9wcmludGsoIk1TX1JlYWRlckNvcHlCbG9jayAtLS0gUGh5QmxvY2tBZGRyID0gJXgsIFBhZ2VOdW0gPSAleFxuIiwgUGh5QmxvY2tBZGRyLCBQYWdlTnVtKTsKCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgTVNfUldfUEFUVEVSTik7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aCA9IDB4MjAwKmxlbjsKCWJjYi0+RmxhZ3MJCQk9IDB4MDA7CgliY2ItPkNEQlswXQkJCT0gMHhGMDsKCWJjYi0+Q0RCWzFdCQkJPSAweDA4OwoJYmNiLT5DREJbNF0JCQk9IChCWVRFKShvbGRwaHkpOwoJYmNiLT5DREJbM10JCQk9IChCWVRFKShvbGRwaHk+PjgpOwoJYmNiLT5DREJbMl0JCQk9IChCWVRFKShvbGRwaHk+PjE2KTsKCWJjYi0+Q0RCWzddCQkJPSAoQllURSkobmV3cGh5KTsKCWJjYi0+Q0RCWzZdCQkJPSAoQllURSkobmV3cGh5Pj44KTsKCWJjYi0+Q0RCWzVdCQkJPSAoQllURSkobmV3cGh5Pj4xNik7CgliY2ItPkNEQls5XQkJCT0gKEJZVEUpKFBoeUJsb2NrQWRkcik7CgliY2ItPkNEQls4XQkJCT0gKEJZVEUpKFBoeUJsb2NrQWRkcj4+OCk7CgliY2ItPkNEQlsxMF0JCT0gUGFnZU51bTsKCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfV1JJVEUsIGJ1ZiwgMCk7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKfQoKLy8tLS0tLSBNU19SZWFkZXJSZWFkUGFnZSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfUmVhZGVyUmVhZFBhZ2Uoc3RydWN0IHVzX2RhdGEgKnVzLCBEV09SRCBQaHlCbG9ja0FkZHIsIEJZVEUgUGFnZU51bSwgUERXT1JEIFBhZ2VCdWYsIE1TX0xpYlR5cGVFeHRkYXQgKkV4dHJhRGF0KQp7CglzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CglpbnQJcmVzdWx0OwoJQllURQlFeHRCdWZbNF07CglEV09SRAlibiA9IFBoeUJsb2NrQWRkciAqIDB4MjAgKyBQYWdlTnVtOwoKCS8vcHJpbnRrKCJNUyAtLS0gTVNfUmVhZGVyUmVhZFBhZ2UsICBQaHlCbG9ja0FkZHIgPSAleCwgUGFnZU51bSA9ICV4XG4iLCBQaHlCbG9ja0FkZHIsIFBhZ2VOdW0pOwoKCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgTVNfUldfUEFUVEVSTik7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCS8vIFJlYWQgUGFnZSBEYXRhCgltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwoJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwoJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGggPSAweDIwMDsKCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CgliY2ItPkNEQlswXQkJCT0gMHhGMTsKCWJjYi0+Q0RCWzFdCQkJPSAweDAyOwoJYmNiLT5DREJbNV0JCQk9IChCWVRFKShibik7CgliY2ItPkNEQls0XQkJCT0gKEJZVEUpKGJuPj44KTsKCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYm4+PjE2KTsKCWJjYi0+Q0RCWzJdCQkJPSAoQllURSkoYm4+PjI0KTsKCQoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIFBhZ2VCdWYsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCgkvLyBSZWFkIEV4dHJhIERhdGEKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aCA9IDB4NDsKCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CgliY2ItPkNEQlswXQkJCT0gMHhGMTsKCWJjYi0+Q0RCWzFdCQkJPSAweDAzOwoJYmNiLT5DREJbNV0JCQk9IChCWVRFKShQYWdlTnVtKTsKCWJjYi0+Q0RCWzRdCQkJPSAoQllURSkoUGh5QmxvY2tBZGRyKTsKCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoUGh5QmxvY2tBZGRyPj44KTsKCWJjYi0+Q0RCWzJdCQkJPSAoQllURSkoUGh5QmxvY2tBZGRyPj4xNik7CgliY2ItPkNEQls2XQkJCT0gMHgwMTsKCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgJkV4dEJ1ZiwgMCk7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCUV4dHJhRGF0LT5yZXNlcnZlZCA9IDA7CglFeHRyYURhdC0+aW50ciAgICAgPSAweDgwOyAgLy8gTm90IHlldCwgpf2wsrNdLCC1pSBmaXJld2FyZSBzdXBwb3J0CglFeHRyYURhdC0+c3RhdHVzMCAgPSAweDEwOyAgLy8gTm90IHlldCwgpf2wsrNdLCC1pSBmaXJld2FyZSBzdXBwb3J0CglFeHRyYURhdC0+c3RhdHVzMSAgPSAweDAwOyAgLy8gTm90IHlldCwgpf2wsrNdLCC1pSBmaXJld2FyZSBzdXBwb3J0CglFeHRyYURhdC0+b3ZyZmxnICAgPSBFeHRCdWZbMF07CglFeHRyYURhdC0+bW5nZmxnICAgPSBFeHRCdWZbMV07CglFeHRyYURhdC0+bG9nYWRyICAgPSBNZW1TdGlja0xvZ0FkZHIoRXh0QnVmWzJdLCBFeHRCdWZbM10pOwoKCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKfQoKLy8tLS0tLSBNU19SZWFkZXJFcmFzZUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfUmVhZGVyRXJhc2VCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIERXT1JEIFBoeUJsb2NrQWRkcikKewoJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwoJaW50CXJlc3VsdDsKCURXT1JECWJuID0gUGh5QmxvY2tBZGRyOwoKCS8vcHJpbnRrKCJNUyAtLS0gTVNfUmVhZGVyRXJhc2VCbG9jaywgIFBoeUJsb2NrQWRkciA9ICV4XG4iLCBQaHlCbG9ja0FkZHIpOwoJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBNU19SV19QQVRURVJOKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoID0gMHgyMDA7CgliY2ItPkZsYWdzCQkJPSAweDgwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjI7CgliY2ItPkNEQlsxXQkJCT0gMHgwNjsKCWJjYi0+Q0RCWzRdCQkJPSAoQllURSkoYm4pOwoJYmNiLT5DREJbM10JCQk9IChCWVRFKShibj4+OCk7CgliY2ItPkNEQlsyXQkJCT0gKEJZVEUpKGJuPj4xNik7CgkKCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCBOVUxMLCAwKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwp9CgovLy0tLS0tIE1TX0NhcmRJbml0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19DYXJkSW5pdChzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCURXT1JECQkJcmVzdWx0PTA7CglXT1JECQkJVG1wQmxvY2s7CglQQllURQkJCVBhZ2VCdWZmZXIwID0gTlVMTCwgUGFnZUJ1ZmZlcjEgPSBOVUxMOwoJTVNfTGliVHlwZUV4dGRhdAlleHRkYXQ7CglXT1JECQkJYnRCbGsxc3QsIGJ0QmxrMm5kOwoJRFdPUkQJCQlidEJsazFzdEVycmVkOwoKCXByaW50aygiTVNfQ2FyZEluaXQgc3RhcnRcbiIpOwoKCU1TX0xpYkZyZWVBbGxvY2F0ZWRBcmVhKHVzKTsKCglpZiAoKChQYWdlQnVmZmVyMCA9IGttYWxsb2MoTVNfQllURVNfUEVSX1BBR0UsIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB8fAoJICAgICgoUGFnZUJ1ZmZlcjEgPSBrbWFsbG9jKE1TX0JZVEVTX1BFUl9QQUdFLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkpCgl7CgkJcmVzdWx0ID0gTVNfTk9fTUVNT1JZX0VSUk9SOwoJCWdvdG8gZXhpdDsKCX0KCglidEJsazFzdCA9IGJ0QmxrMm5kID0gTVNfTEJfTk9UX1VTRUQ7CglidEJsazFzdEVycmVkID0gMDsKCglmb3IgKFRtcEJsb2NrPTA7IFRtcEJsb2NrIDwgTVNfTUFYX0lOSVRJQUxfRVJST1JfQkxPQ0tTKzI7IFRtcEJsb2NrKyspCgl7CgkJc3dpdGNoIChNU19SZWFkZXJSZWFkUGFnZSh1cywgVG1wQmxvY2ssIDAsIChEV09SRCAqKVBhZ2VCdWZmZXIwLCAmZXh0ZGF0KSkKCQl7CgkJCWNhc2UgTVNfU1RBVFVTX1NVQ0NFU1M6CgkJCWJyZWFrOwoJCQljYXNlIE1TX1NUQVRVU19JTlRfRVJST1I6CgkJCWJyZWFrOwoJCQljYXNlIE1TX1NUQVRVU19FUlJPUjoKCQkJZGVmYXVsdDoKCQkJY29udGludWU7CgkJfQoKCQlpZiAoKGV4dGRhdC5vdnJmbGcgJiBNU19SRUdfT1ZSX0JLU1QpID09IE1TX1JFR19PVlJfQktTVF9ORykKCQkJY29udGludWU7CgoJCWlmICgoKGV4dGRhdC5tbmdmbGcgJiBNU19SRUdfTU5HX1NZU0ZMRykgPT0gTVNfUkVHX01OR19TWVNGTEdfVVNFUikgfHwKCQkJKEJpZ0VuZGlhbldPUkQoKChNZW1TdGlja0Jvb3RCbG9ja1BhZ2UwICopUGFnZUJ1ZmZlcjApLT5oZWFkZXIud0Jsb2NrSUQpICE9IE1TX0JPT1RfQkxPQ0tfSUQpIHx8CgkJCShCaWdFbmRpYW5XT1JEKCgoTWVtU3RpY2tCb290QmxvY2tQYWdlMCAqKVBhZ2VCdWZmZXIwKS0+aGVhZGVyLndGb3JtYXRWZXJzaW9uKSAhPSBNU19CT09UX0JMT0NLX0ZPUk1BVF9WRVJTSU9OKSB8fAoJCQkoKChNZW1TdGlja0Jvb3RCbG9ja1BhZ2UwICopUGFnZUJ1ZmZlcjApLT5oZWFkZXIuYk51bWJlck9mRGF0YUVudHJ5ICE9IE1TX0JPT1RfQkxPQ0tfREFUQV9FTlRSSUVTKSkKCQkJCWNvbnRpbnVlOwoKCQlpZiAoYnRCbGsxc3QgIT0gTVNfTEJfTk9UX1VTRUQpCgkJewoJCQlidEJsazJuZCA9IFRtcEJsb2NrOwoJCQlicmVhazsKCQl9CgoJCWJ0QmxrMXN0ID0gVG1wQmxvY2s7CgkJbWVtY3B5KFBhZ2VCdWZmZXIxLCBQYWdlQnVmZmVyMCwgTVNfQllURVNfUEVSX1BBR0UpOwoJCWlmIChleHRkYXQuc3RhdHVzMSAmIChNU19SRUdfU1QxX0RURVIgfCBNU19SRUdfU1QxX0VYRVIgfCBNU19SRUdfU1QxX0ZHRVIpKQoJCQlidEJsazFzdEVycmVkID0gMTsKCX0KCglpZiAoYnRCbGsxc3QgPT0gTVNfTEJfTk9UX1VTRUQpCgl7CgkJcmVzdWx0ID0gTVNfU1RBVFVTX0VSUk9SOwoJCWdvdG8gZXhpdDsKCX0KCgkvLyB3cml0ZSBwcm90ZWN0CglpZiAoKGV4dGRhdC5zdGF0dXMwICYgTVNfUkVHX1NUMF9XUCkgPT0gTVNfUkVHX1NUMF9XUF9PTikKCQlNU19MaWJDdHJsU2V0KHVzLCBNU19MSUJfQ1RSTF9XUlBST1RFQ1QpOwoKCXJlc3VsdCA9IE1TX1NUQVRVU19FUlJPUjsKCS8vIDFzdCBCb290IEJsb2NrCglpZiAoYnRCbGsxc3RFcnJlZCA9PSAwKQoJCXJlc3VsdCA9IE1TX0xpYlByb2Nlc3NCb290QmxvY2sodXMsIGJ0QmxrMXN0LCBQYWdlQnVmZmVyMSk7ICAgLy8gMXN0CgkvLyAybmQgQm9vdCBCbG9jawoJaWYgKHJlc3VsdCAmJiAoYnRCbGsybmQgIT0gTVNfTEJfTk9UX1VTRUQpKQoJCXJlc3VsdCA9IE1TX0xpYlByb2Nlc3NCb290QmxvY2sodXMsIGJ0QmxrMm5kLCBQYWdlQnVmZmVyMCk7CgoJaWYgKHJlc3VsdCkKCXsKCQlyZXN1bHQgPSBNU19TVEFUVVNfRVJST1I7CgkJZ290byBleGl0OwoJfQoKCWZvciAoVG1wQmxvY2sgPSAwOyBUbXBCbG9jayA8IGJ0QmxrMXN0OyBUbXBCbG9jaysrKQoJCXVzLT5NU19MaWIuUGh5MkxvZ01hcFtUbXBCbG9ja10gPSBNU19MQl9JTklUSUFMX0VSUk9SOwoKCXVzLT5NU19MaWIuUGh5MkxvZ01hcFtidEJsazFzdF0gPSBNU19MQl9CT09UX0JMT0NLOwoKCWlmIChidEJsazJuZCAhPSBNU19MQl9OT1RfVVNFRCkKCXsKCQlmb3IgKFRtcEJsb2NrID0gYnRCbGsxc3QgKyAxOyBUbXBCbG9jayA8IGJ0QmxrMm5kOyBUbXBCbG9jaysrKQoJCQl1cy0+TVNfTGliLlBoeTJMb2dNYXBbVG1wQmxvY2tdID0gTVNfTEJfSU5JVElBTF9FUlJPUjsKCQl1cy0+TVNfTGliLlBoeTJMb2dNYXBbYnRCbGsybmRdID0gTVNfTEJfQk9PVF9CTE9DSzsKCX0KCglyZXN1bHQgPSBNU19MaWJTY2FuTG9naWNhbEJsb2NrTnVtYmVyKHVzLCBidEJsazFzdCk7CglpZiAocmVzdWx0KQoJCWdvdG8gZXhpdDsKCglmb3IgKFRtcEJsb2NrPU1TX1BIWVNJQ0FMX0JMT0NLU19QRVJfU0VHTUVOVDsgVG1wQmxvY2s8dXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrOyBUbXBCbG9jays9TVNfUEhZU0lDQUxfQkxPQ0tTX1BFUl9TRUdNRU5UKQoJewoJCWlmIChNU19Db3VudEZyZWVCbG9jayh1cywgVG1wQmxvY2spID09IDApCgkJewoJCQlNU19MaWJDdHJsU2V0KHVzLCBNU19MSUJfQ1RSTF9XUlBST1RFQ1QpOwoJCQlicmVhazsKCQl9Cgl9CgoJLy8gd3JpdGUKCWlmIChNU19MaWJBbGxvY1dyaXRlQnVmKHVzKSkKCXsKCQlyZXN1bHQgPSBNU19OT19NRU1PUllfRVJST1I7CgkJZ290byBleGl0OwoJfQoKCXJlc3VsdCA9IE1TX1NUQVRVU19TVUNDRVNTOwoKZXhpdDoKCWlmIChQYWdlQnVmZmVyMSkJCWtmcmVlKFBhZ2VCdWZmZXIxKTsKICAgIAlpZiAoUGFnZUJ1ZmZlcjApCQlrZnJlZShQYWdlQnVmZmVyMCk7CgoJcHJpbnRrKCJNU19DYXJkSW5pdCBlbmRcbiIpOwoJcmV0dXJuIHJlc3VsdDsKfQoKLy8tLS0tLSBNU19MaWJDaGVja0Rpc2FibGVCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliQ2hlY2tEaXNhYmxlQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIFBoeUJsb2NrKQp7CglQV09SRAkJCVBhZ2VCdWY9TlVMTDsKCURXT1JECQkJcmVzdWx0PU1TX1NUQVRVU19TVUNDRVNTOwoJRFdPUkQJCQlibGssIGluZGV4PTA7CglNU19MaWJUeXBlRXh0ZGF0CWV4dGRhdDsKCglpZiAoKChQYWdlQnVmID0ga21hbGxvYyhNU19CWVRFU19QRVJfUEFHRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpKQoJewoJCXJlc3VsdCA9IE1TX05PX01FTU9SWV9FUlJPUjsKCQlnb3RvIGV4aXQ7Cgl9CgoJTVNfUmVhZGVyUmVhZFBhZ2UodXMsIFBoeUJsb2NrLCAxLCAoRFdPUkQgKilQYWdlQnVmLCAmZXh0ZGF0KTsKCWRvCgl7CgkJYmxrID0gQmlnRW5kaWFuV09SRChQYWdlQnVmW2luZGV4XSk7CgkJaWYgKGJsayA9PSBNU19MQl9OT1RfVVNFRCkKCQkJYnJlYWs7CgkJaWYgKGJsayA9PSB1cy0+TVNfTGliLkxvZzJQaHlNYXBbMF0pCgkJewoJCQlyZXN1bHQgPSBNU19FUlJPUl9GTEFTSF9SRUFEOwoJCQlicmVhazsKCQl9CgkJaW5kZXgrKzsKCX0gd2hpbGUoMSk7CgpleGl0OgoJaWYgKFBhZ2VCdWYpCWtmcmVlKFBhZ2VCdWYpOwoJcmV0dXJuIHJlc3VsdDsKfQoKLy8tLS0tLSBNU19MaWJGcmVlQWxsb2NhdGVkQXJlYSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIE1TX0xpYkZyZWVBbGxvY2F0ZWRBcmVhKHN0cnVjdCB1c19kYXRhICp1cykKewoJTVNfTGliRnJlZVdyaXRlQnVmKHVzKTsKCU1TX0xpYkZyZWVMb2dpY2FsTWFwKHVzKTsKCgl1cy0+TVNfTGliLmZsYWdzCQkJPSAwOwoJdXMtPk1TX0xpYi5CeXRlc1BlclNlY3Rvcgk9IDA7Cgl1cy0+TVNfTGliLlNlY3RvcnNQZXJDeWxpbmRlcgk9IDA7CgoJdXMtPk1TX0xpYi5jYXJkVHlwZQkJPSAwOwoJdXMtPk1TX0xpYi5ibG9ja1NpemUJCT0gMDsKCXVzLT5NU19MaWIuUGFnZXNQZXJCbG9jawk9IDA7CgoJdXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrCT0gMDsKCXVzLT5NU19MaWIuTnVtYmVyT2ZMb2dCbG9jawk9IDA7Cn0KCi8vLS0tLS0gTVNfTGliRnJlZVdyaXRlQnVmKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBNU19MaWJGcmVlV3JpdGVCdWYoc3RydWN0IHVzX2RhdGEgKnVzKQp7Cgl1cy0+TVNfTGliLndydGJsayA9IChXT1JEKS0xOyAvL3NldCB0byAtMQoJTVNfTGliQ2xlYXJQYWdlTWFwKHVzKTsgLy8gbWVtc2V0KChmZG9FeHQpLT5NU19MaWIucGFnZW1hcCwgMCwgc2l6ZW9mKChmZG9FeHQpLT5NU19MaWIucGFnZW1hcCkpCgoJaWYgKHVzLT5NU19MaWIuYmxrcGFnKQoJewoJCWtmcmVlKChCWVRFICopKHVzLT5NU19MaWIuYmxrcGFnKSk7ICAvLyBBcm5vbGQgdGVzdCAuLi4KCQl1cy0+TVNfTGliLmJsa3BhZyA9IE5VTEw7Cgl9CgoJaWYgKHVzLT5NU19MaWIuYmxrZXh0KQoJewoJCWtmcmVlKChCWVRFICopKHVzLT5NU19MaWIuYmxrZXh0KSk7ICAvLyBBcm5vbGQgdGVzdCAuLi4KCQl1cy0+TVNfTGliLmJsa2V4dCA9IE5VTEw7Cgl9Cn0KCi8vLS0tLS0gTVNfTGliRnJlZUxvZ2ljYWxNYXAoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0xpYkZyZWVMb2dpY2FsTWFwKHN0cnVjdCB1c19kYXRhICp1cykKewoJaWYgKHVzLT5NU19MaWIuUGh5MkxvZ01hcCkKCXsKCQlrZnJlZSh1cy0+TVNfTGliLlBoeTJMb2dNYXApOwoJCXVzLT5NU19MaWIuUGh5MkxvZ01hcCA9IE5VTEw7Cgl9CgoJaWYgKHVzLT5NU19MaWIuTG9nMlBoeU1hcCkKCXsKCQlrZnJlZSh1cy0+TVNfTGliLkxvZzJQaHlNYXApOwoJCXVzLT5NU19MaWIuTG9nMlBoeU1hcCA9IE5VTEw7Cgl9CgogICAgcmV0dXJuIDA7Cn0KCi8vLS0tLS0gTVNfTGliUHJvY2Vzc0Jvb3RCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0xpYlByb2Nlc3NCb290QmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIFBoeUJsb2NrLCBCWVRFICpQYWdlRGF0YSkKewoJTWVtU3RpY2tCb290QmxvY2tTeXNFbnQgICpTeXNFbnRyeTsKCU1lbVN0aWNrQm9vdEJsb2NrU3lzSW5mICAqU3lzSW5mbzsKCURXT1JEICAgICAgICAgICAgICAgICAgICBpLCByZXN1bHQ7CglCWVRFICAgICAgICAgICAgICAgICAgICAgUGFnZU51bWJlcjsKCUJZVEUgICAgICAgICAgICAgICAgICAgICAqUGFnZUJ1ZmZlcjsKCU1TX0xpYlR5cGVFeHRkYXQgICAgICAgICBFeHRyYURhdGE7CgoJaWYgKChQYWdlQnVmZmVyID0ga21hbGxvYyhNU19CWVRFU19QRVJfUEFHRSwgR0ZQX0tFUk5FTCkpPT1OVUxMKQoJCXJldHVybiAoRFdPUkQpLTE7CgoJcmVzdWx0ID0gKERXT1JEKS0xOwoKCVN5c0luZm89ICYoKChNZW1TdGlja0Jvb3RCbG9ja1BhZ2UwICopUGFnZURhdGEpLT5zeXNpbmYpOwoKCWlmICgoU3lzSW5mby0+Yk1zQ2xhc3MgIT0gTVNfU1lTSU5GX01TQ0xBU1NfVFlQRV8xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKCQkoQmlnRW5kaWFuV09SRChTeXNJbmZvLT53UGFnZVNpemUpICE9IE1TX1NZU0lORl9QQUdFX1NJWkUpICAgICAgICAgICAgICAgICAgICAgICB8fAoJCSgoU3lzSW5mby0+YlNlY3VyaXR5U3VwcG9ydCAmIE1TX1NZU0lORl9TRUNVUklUWSkgPT0gTVNfU1lTSU5GX1NFQ1VSSVRZX1NVUFBPUlQpIHx8CgkJKFN5c0luZm8tPmJSZXNlcnZlZDEgIT0gTVNfU1lTSU5GX1JFU0VSVkVEMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKCQkoU3lzSW5mby0+YlJlc2VydmVkMiAhPSBNU19TWVNJTkZfUkVTRVJWRUQyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAoJCShTeXNJbmZvLT5iRm9ybWF0VHlwZSE9IE1TX1NZU0lORl9GT1JNQVRfRkFUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CgkJKFN5c0luZm8tPmJVc2FnZSAhPSBNU19TWVNJTkZfVVNBR0VfR0VORVJBTCkpCgkJZ290byBleGl0OwoKCXN3aXRjaCAodXMtPk1TX0xpYi5jYXJkVHlwZSA9IFN5c0luZm8tPmJDYXJkVHlwZSkKCXsKCQljYXNlIE1TX1NZU0lORl9DQVJEVFlQRV9SRE9OTFk6CgkJCU1TX0xpYkN0cmxTZXQodXMsIE1TX0xJQl9DVFJMX1JET05MWSk7CgkJCWJyZWFrOwoJCWNhc2UgTVNfU1lTSU5GX0NBUkRUWVBFX1JEV1I6CgkJCU1TX0xpYkN0cmxSZXNldCh1cywgTVNfTElCX0NUUkxfUkRPTkxZKTsKCQkJYnJlYWs7CgkJY2FzZSBNU19TWVNJTkZfQ0FSRFRZUEVfSFlCUklEOgoJCWRlZmF1bHQ6CgkJCWdvdG8gZXhpdDsKCX0KCgl1cy0+TVNfTGliLmJsb2NrU2l6ZSAgICAgICAgPSBCaWdFbmRpYW5XT1JEKFN5c0luZm8tPndCbG9ja1NpemUpOwoJdXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrID0gQmlnRW5kaWFuV09SRChTeXNJbmZvLT53QmxvY2tOdW1iZXIpOwoJdXMtPk1TX0xpYi5OdW1iZXJPZkxvZ0Jsb2NrID0gQmlnRW5kaWFuV09SRChTeXNJbmZvLT53VG90YWxCbG9ja051bWJlciktIDI7Cgl1cy0+TVNfTGliLlBhZ2VzUGVyQmxvY2sgICAgPSB1cy0+TVNfTGliLmJsb2NrU2l6ZSAqIFNJWkVfT0ZfS0lSTyAvIE1TX0JZVEVTX1BFUl9QQUdFOwoJdXMtPk1TX0xpYi5OdW1iZXJPZlNlZ21lbnQgID0gdXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrIC8gTVNfUEhZU0lDQUxfQkxPQ0tTX1BFUl9TRUdNRU5UOwoJdXMtPk1TX01vZGVsICAgICAgICAgICAgICAgID0gQmlnRW5kaWFuV09SRChTeXNJbmZvLT53TWVtb3J5U2l6ZSk7CgoJaWYgKE1TX0xpYkFsbG9jTG9naWNhbE1hcCh1cykpCQkJLy9BbGxvY2F0ZSB0byBhbGwgbnVtYmVyIG9mIGxvZ2ljYWxibG9jayBhbmQgcGh5c2ljYWxibG9jawoJCWdvdG8gZXhpdDsKCglNU19MaWJTZXRCb290QmxvY2tNYXJrKHVzLCBQaHlCbG9jayk7CQkvL01hcmsgdGhlIGJvb2sgYmxvY2sKCglTeXNFbnRyeSA9ICYoKChNZW1TdGlja0Jvb3RCbG9ja1BhZ2UwICopUGFnZURhdGEpLT5zeXNlbnQpOwoKCWZvciAoaT0wOyBpPE1TX05VTUJFUl9PRl9TWVNURU1fRU5UUlk7IGkrKykKCXsKCQlEV09SRCAgRW50cnlPZmZzZXQsIEVudHJ5U2l6ZTsKCgkJaWYgKChFbnRyeU9mZnNldCA9IEJpZ0VuZGlhbkRXT1JEKFN5c0VudHJ5LT5lbnRyeVtpXS5kd1N0YXJ0KSkgPT0gMHhmZmZmZmYpCgkJCWNvbnRpbnVlOwoKCQlpZiAoKEVudHJ5U2l6ZSA9IEJpZ0VuZGlhbkRXT1JEKFN5c0VudHJ5LT5lbnRyeVtpXS5kd1NpemUpKSA9PSAwKQoJCQljb250aW51ZTsKCgkJaWYgKEVudHJ5T2Zmc2V0ICsgTVNfQllURVNfUEVSX1BBR0UgKyBFbnRyeVNpemUgPiB1cy0+TVNfTGliLmJsb2NrU2l6ZSAqIChEV09SRClTSVpFX09GX0tJUk8pCgkJCWNvbnRpbnVlOwoKCQlpZiAoaSA9PSAwKQoJCXsKCQkJQllURSAgUHJldlBhZ2VOdW1iZXIgPSAwOwoJCQlXT1JEICBwaHlibGs7CgoJCQlpZiAoU3lzRW50cnktPmVudHJ5W2ldLmJUeXBlICE9IE1TX1NZU0VOVF9UWVBFX0lOVkFMSURfQkxPQ0spCgkJCQlnb3RvIGV4aXQ7CgoJCQl3aGlsZSAoRW50cnlTaXplID4gMCkKCQkJewoJCQkJaWYgKChQYWdlTnVtYmVyID0gKEJZVEUpKEVudHJ5T2Zmc2V0IC8gTVNfQllURVNfUEVSX1BBR0UgKyAxKSkgIT0gUHJldlBhZ2VOdW1iZXIpCgkJCQl7CgkJCQkJc3dpdGNoIChNU19SZWFkZXJSZWFkUGFnZSh1cywgUGh5QmxvY2ssIFBhZ2VOdW1iZXIsIChEV09SRCAqKVBhZ2VCdWZmZXIsICZFeHRyYURhdGEpKQoJCQkJCXsKCQkJCQkJY2FzZSBNU19TVEFUVVNfU1VDQ0VTUzoKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlIE1TX1NUQVRVU19XUklURV9QUk9URUNUOgoJCQkJCQljYXNlIE1TX0VSUk9SX0ZMQVNIX1JFQUQ6CgkJCQkJCWNhc2UgTVNfU1RBVFVTX0VSUk9SOgoJCQkJCQlkZWZhdWx0OgoJCQkJCQkJZ290byBleGl0OwoJCQkJCX0KCgkJCQkJUHJldlBhZ2VOdW1iZXIgPSBQYWdlTnVtYmVyOwoJCQkJfQoKCQkJCWlmICgocGh5YmxrID0gQmlnRW5kaWFuV09SRCgqKFdPUkQgKikoUGFnZUJ1ZmZlciArIChFbnRyeU9mZnNldCAlIE1TX0JZVEVTX1BFUl9QQUdFKSkpKSA8IDB4MGZmZikKCQkJCQlNU19MaWJTZXRJbml0aWFsRXJyb3JCbG9jayh1cywgcGh5YmxrKTsKCgkJCQlFbnRyeU9mZnNldCArPSAyOwoJCQkJRW50cnlTaXplIC09IDI7CgkJCX0KCQl9CgkJZWxzZSBpZiAoaSA9PSAxKQoJCXsgIC8vIENJUy9JREkKCQkJTWVtU3RpY2tCb290QmxvY2tJREkgICppZGk7CgoJCQlpZiAoU3lzRW50cnktPmVudHJ5W2ldLmJUeXBlICE9IE1TX1NZU0VOVF9UWVBFX0NJU19JREkpCgkJCQlnb3RvIGV4aXQ7CgoJCQlzd2l0Y2ggKE1TX1JlYWRlclJlYWRQYWdlKHVzLCBQaHlCbG9jaywgKEJZVEUpKEVudHJ5T2Zmc2V0IC8gTVNfQllURVNfUEVSX1BBR0UgKyAxKSwgKERXT1JEICopUGFnZUJ1ZmZlciwgJkV4dHJhRGF0YSkpCgkJCXsKCQkJCWNhc2UgTVNfU1RBVFVTX1NVQ0NFU1M6CgkJCQkJYnJlYWs7CgkJCQljYXNlIE1TX1NUQVRVU19XUklURV9QUk9URUNUOgoJCQkJY2FzZSBNU19FUlJPUl9GTEFTSF9SRUFEOgoJCQkJY2FzZSBNU19TVEFUVVNfRVJST1I6CgkJCQlkZWZhdWx0OgoJCQkJCWdvdG8gZXhpdDsKCQkJfQoKCQkJaWRpID0gJigoTWVtU3RpY2tCb290QmxvY2tDSVNfSURJICopKFBhZ2VCdWZmZXIgKyAoRW50cnlPZmZzZXQgJSBNU19CWVRFU19QRVJfUEFHRSkpKS0+aWRpLmlkaTsKCQkJaWYgKExpdHRsZUVuZGlhbldPUkQoaWRpLT53SURJZ2VuZXJhbENvbmZpZ3VyYXRpb24pICE9IE1TX0lESV9HRU5FUkFMX0NPTkYpCgkJCQlnb3RvIGV4aXQ7CgoJCQl1cy0+TVNfTGliLkJ5dGVzUGVyU2VjdG9yID0gTGl0dGxlRW5kaWFuV09SRChpZGktPndJRElieXRlc1BlclNlY3Rvcik7CgkJCWlmICh1cy0+TVNfTGliLkJ5dGVzUGVyU2VjdG9yICE9IE1TX0JZVEVTX1BFUl9QQUdFKQoJCQkJZ290byBleGl0OwoJCX0KCX0gLy8gRW5kIGZvciAuLgoKCXJlc3VsdCA9IDA7CgpleGl0OgoJaWYgKHJlc3VsdCkJCU1TX0xpYkZyZWVMb2dpY2FsTWFwKHVzKTsKCWlmIChQYWdlQnVmZmVyKQlrZnJlZShQYWdlQnVmZmVyKTsKCglyZXN1bHQgPSAwOwoJcmV0dXJuIHJlc3VsdDsKfQoKLy8tLS0tLSBNU19MaWJBbGxvY0xvZ2ljYWxNYXAoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliQWxsb2NMb2dpY2FsTWFwKHN0cnVjdCB1c19kYXRhICp1cykKewoJRFdPUkQgIGk7CgoKCXVzLT5NU19MaWIuUGh5MkxvZ01hcCA9IGttYWxsb2ModXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrICogc2l6ZW9mKFdPUkQpLCBHRlBfS0VSTkVMKTsKCXVzLT5NU19MaWIuTG9nMlBoeU1hcCA9IGttYWxsb2ModXMtPk1TX0xpYi5OdW1iZXJPZkxvZ0Jsb2NrICogc2l6ZW9mKFdPUkQpLCBHRlBfS0VSTkVMKTsKCglpZiAoKHVzLT5NU19MaWIuUGh5MkxvZ01hcCA9PSBOVUxMKSB8fCAodXMtPk1TX0xpYi5Mb2cyUGh5TWFwID09IE5VTEwpKQoJewoJCU1TX0xpYkZyZWVMb2dpY2FsTWFwKHVzKTsKCQlyZXR1cm4gKERXT1JEKS0xOwoJfQoKCWZvciAoaSA9IDA7IGkgPCB1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2s7IGkrKykKCQl1cy0+TVNfTGliLlBoeTJMb2dNYXBbaV0gPSBNU19MQl9OT1RfVVNFRDsKCglmb3IgKGkgPSAwOyBpIDwgdXMtPk1TX0xpYi5OdW1iZXJPZkxvZ0Jsb2NrOyBpKyspCgl1cy0+TVNfTGliLkxvZzJQaHlNYXBbaV0gPSBNU19MQl9OT1RfVVNFRDsKCglyZXR1cm4gMDsKfQoKLy8tLS0tLSBNU19MaWJTZXRCb290QmxvY2tNYXJrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliU2V0Qm9vdEJsb2NrTWFyayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgcGh5YmxrKQp7CiAgICByZXR1cm4gTVNfTGliU2V0TG9naWNhbEJsb2NrTWFyayh1cywgcGh5YmxrLCBNU19MQl9CT09UX0JMT0NLKTsKfQoKLy8tLS0tLSBNU19MaWJTZXRMb2dpY2FsQmxvY2tNYXJrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliU2V0TG9naWNhbEJsb2NrTWFyayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgcGh5YmxrLCBXT1JEIG1hcmspCnsKICAgIGlmIChwaHlibGsgPj0gdXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrKQogICAgICAgIHJldHVybiAoRFdPUkQpLTE7CgogICAgdXMtPk1TX0xpYi5QaHkyTG9nTWFwW3BoeWJsa10gPSBtYXJrOwoKICAgIHJldHVybiAwOwp9CgovLy0tLS0tIE1TX0xpYlNldEluaXRpYWxFcnJvckJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJTZXRJbml0aWFsRXJyb3JCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgcGh5YmxrKQp7CiAgICByZXR1cm4gTVNfTGliU2V0TG9naWNhbEJsb2NrTWFyayh1cywgcGh5YmxrLCBNU19MQl9JTklUSUFMX0VSUk9SKTsKfQoKLy8tLS0tLSBNU19MaWJTY2FuTG9naWNhbEJsb2NrTnVtYmVyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliU2NhbkxvZ2ljYWxCbG9ja051bWJlcihzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgYnRCbGsxc3QpCnsKCVdPUkQJCQlQaHlCbG9jaywgbmV3YmxrLCBpOwoJV09SRAkJCUxvZ1N0YXJ0LCBMb2dFbmRlOwoJTVNfTGliVHlwZUV4dGRhdAlleHRkYXQ7CglCWVRFCQkJYnVmWzB4MjAwXTsKCURXT1JECQkJY291bnQ9MCwgaW5kZXg9MDsKCglmb3IgKFBoeUJsb2NrID0gMDsgUGh5QmxvY2sgPCB1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2s7KQoJewoJCU1TX0xpYlBoeTJMb2dSYW5nZShQaHlCbG9jaywgJkxvZ1N0YXJ0LCAmTG9nRW5kZSk7CgoJCWZvciAoaT0wOyBpPE1TX1BIWVNJQ0FMX0JMT0NLU19QRVJfU0VHTUVOVDsgaSsrLCBQaHlCbG9jaysrKQoJCXsKCQkJc3dpdGNoIChNU19MaWJDb252MkxvZ2ljYWwodXMsIFBoeUJsb2NrKSkKCQkJewoJCQkJY2FzZSBNU19TVEFUVVNfRVJST1I6CgkJCQkJY29udGludWU7CgkJCQlkZWZhdWx0OgoJCQkJCWJyZWFrOwoJCQl9CgoJCQlpZiAoY291bnQgPT0gUGh5QmxvY2spCgkJCXsKCQkJCU1TX0xpYlJlYWRFeHRyYUJsb2NrKHVzLCBQaHlCbG9jaywgMCwgMHg4MCwgJmJ1Zik7CgkJCQljb3VudCArPSAweDgwOwoJCQl9CgkJCWluZGV4ID0gKFBoeUJsb2NrICUgMHg4MCkgKiA0OwoKCQkJZXh0ZGF0Lm92cmZsZyA9IGJ1ZltpbmRleF07CgkJCWV4dGRhdC5tbmdmbGcgPSBidWZbaW5kZXgrMV07CgkJCWV4dGRhdC5sb2dhZHIgPSBNZW1TdGlja0xvZ0FkZHIoYnVmW2luZGV4KzJdLCBidWZbaW5kZXgrM10pOwoKCQkJaWYgKChleHRkYXQub3ZyZmxnICYgTVNfUkVHX09WUl9CS1NUKSAhPSBNU19SRUdfT1ZSX0JLU1RfT0spCgkJCXsKCQkJCU1TX0xpYlNldEFjcXVpcmVkRXJyb3JCbG9jayh1cywgUGh5QmxvY2spOwoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmICgoZXh0ZGF0Lm1uZ2ZsZyAmIE1TX1JFR19NTkdfQVRGTEcpID09IE1TX1JFR19NTkdfQVRGTEdfQVRUQkwpCgkJCXsKCQkJCU1TX0xpYkVyYXNlUGh5QmxvY2sodXMsIFBoeUJsb2NrKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlpZiAoZXh0ZGF0LmxvZ2FkciAhPSBNU19MQl9OT1RfVVNFRCkKCQkJewoJCQkJaWYgKChleHRkYXQubG9nYWRyIDwgTG9nU3RhcnQpIHx8IChMb2dFbmRlIDw9IGV4dGRhdC5sb2dhZHIpKQoJCQkJewoJCQkJCU1TX0xpYkVyYXNlUGh5QmxvY2sodXMsIFBoeUJsb2NrKTsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQlpZiAoKG5ld2JsayA9IE1TX0xpYkNvbnYyUGh5c2ljYWwodXMsIGV4dGRhdC5sb2dhZHIpKSAhPSBNU19MQl9OT1RfVVNFRCkKCQkJCXsKCQkJCQlpZiAoZXh0ZGF0LmxvZ2Fkcj09MCkKCQkJCQl7CgkJCQkJCU1TX0xpYlNldExvZ2ljYWxQYWlyKHVzLCBleHRkYXQubG9nYWRyLCBQaHlCbG9jayk7CgkJCQkJCWlmICggTVNfTGliQ2hlY2tEaXNhYmxlQmxvY2sodXMsIGJ0QmxrMXN0KSApCgkJCQkJCXsKCQkJCQkJCU1TX0xpYlNldExvZ2ljYWxQYWlyKHVzLCBleHRkYXQubG9nYWRyLCBuZXdibGspOwoJCQkJCQkJY29udGludWU7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCU1TX0xpYlJlYWRFeHRyYSh1cywgbmV3YmxrLCAwLCAmZXh0ZGF0KTsKCQkJCQlpZiAoKGV4dGRhdC5vdnJmbGcgJiBNU19SRUdfT1ZSX1VEU1QpID09IE1TX1JFR19PVlJfVURTVF9VUERBVElORykKCQkJCQl7CgkJCQkJCU1TX0xpYkVyYXNlUGh5QmxvY2sodXMsIFBoeUJsb2NrKTsKCQkJCQkJY29udGludWU7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQkJTVNfTGliRXJhc2VQaHlCbG9jayh1cywgbmV3YmxrKTsKCQkJCX0KCgkJCQlNU19MaWJTZXRMb2dpY2FsUGFpcih1cywgZXh0ZGF0LmxvZ2FkciwgUGh5QmxvY2spOwoJCQl9CgkJfQoJfSAvL0VuZCBmb3IgLi4uCgoJcmV0dXJuIE1TX1NUQVRVU19TVUNDRVNTOwp9CgovLy0tLS0tIE1TX0xpYkFsbG9jV3JpdGVCdWYoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJBbGxvY1dyaXRlQnVmKHN0cnVjdCB1c19kYXRhICp1cykKewoJdXMtPk1TX0xpYi53cnRibGsgPSAoV09SRCktMTsKCgl1cy0+TVNfTGliLmJsa3BhZyA9IGttYWxsb2ModXMtPk1TX0xpYi5QYWdlc1BlckJsb2NrICogdXMtPk1TX0xpYi5CeXRlc1BlclNlY3RvciwgR0ZQX0tFUk5FTCk7Cgl1cy0+TVNfTGliLmJsa2V4dCA9IGttYWxsb2ModXMtPk1TX0xpYi5QYWdlc1BlckJsb2NrICogc2l6ZW9mKE1TX0xpYlR5cGVFeHRkYXQpLCBHRlBfS0VSTkVMKTsKCglpZiAoKHVzLT5NU19MaWIuYmxrcGFnID09IE5VTEwpIHx8ICh1cy0+TVNfTGliLmJsa2V4dCA9PSBOVUxMKSkKCXsKCQlNU19MaWJGcmVlV3JpdGVCdWYodXMpOwoJCXJldHVybiAoRFdPUkQpLTE7Cgl9CgoJTVNfTGliQ2xlYXJXcml0ZUJ1Zih1cyk7CgoJcmV0dXJuIDA7Cn0KCi8vLS0tLS0gTVNfTGliQ2xlYXJXcml0ZUJ1ZigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBNU19MaWJDbGVhcldyaXRlQnVmKHN0cnVjdCB1c19kYXRhICp1cykKewoJaW50IGk7CgoJdXMtPk1TX0xpYi53cnRibGsgPSAoV09SRCktMTsKCU1TX0xpYkNsZWFyUGFnZU1hcCh1cyk7CgoJaWYgKHVzLT5NU19MaWIuYmxrcGFnKQoJCW1lbXNldCh1cy0+TVNfTGliLmJsa3BhZywgMHhmZiwgdXMtPk1TX0xpYi5QYWdlc1BlckJsb2NrICogdXMtPk1TX0xpYi5CeXRlc1BlclNlY3Rvcik7CgoJaWYgKHVzLT5NU19MaWIuYmxrZXh0KQoJewoJCWZvciAoaSA9IDA7IGkgPCB1cy0+TVNfTGliLlBhZ2VzUGVyQmxvY2s7IGkrKykKCQl7CgkJCXVzLT5NU19MaWIuYmxrZXh0W2ldLnN0YXR1czEgPSBNU19SRUdfU1QxX0RFRkFVTFQ7CgkJCXVzLT5NU19MaWIuYmxrZXh0W2ldLm92cmZsZyA9IE1TX1JFR19PVlJfREVGQVVMVDsKCQkJdXMtPk1TX0xpYi5ibGtleHRbaV0ubW5nZmxnID0gTVNfUkVHX01OR19ERUZBVUxUOwoJCQl1cy0+TVNfTGliLmJsa2V4dFtpXS5sb2dhZHIgPSBNU19MQl9OT1RfVVNFRDsKCQl9Cgl9Cn0KCi8vLS0tLS0gTVNfTGliUGh5MkxvZ1JhbmdlKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBNU19MaWJQaHkyTG9nUmFuZ2UoV09SRCBQaHlCbG9jaywgV09SRCAqTG9nU3RhcnQsIFdPUkQgKkxvZ0VuZGUpCnsKCVBoeUJsb2NrIC89IE1TX1BIWVNJQ0FMX0JMT0NLU19QRVJfU0VHTUVOVDsKCglpZiAoUGh5QmxvY2spCgl7CgkJKkxvZ1N0YXJ0ID0gTVNfTE9HSUNBTF9CTE9DS1NfSU5fMVNUX1NFR01FTlQgKyAoUGh5QmxvY2sgLSAxKSAqIE1TX0xPR0lDQUxfQkxPQ0tTX1BFUl9TRUdNRU5UOy8vNDk2CgkJKkxvZ0VuZGUgPSAqTG9nU3RhcnQgKyBNU19MT0dJQ0FMX0JMT0NLU19QRVJfU0VHTUVOVDsvLzQ5NgoJfQoJZWxzZQoJewoJCSpMb2dTdGFydCA9IDA7CgkJKkxvZ0VuZGUgPSBNU19MT0dJQ0FMX0JMT0NLU19JTl8xU1RfU0VHTUVOVDsvLzQ5NAoJfQp9CgovLy0tLS0tIE1TX0xpYlJlYWRFeHRyYUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0xpYlJlYWRFeHRyYUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgRFdPUkQgUGh5QmxvY2ssIEJZVEUgUGFnZU51bSwgQllURSBibGVuLCB2b2lkICpidWYpCnsKCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKCWludAlyZXN1bHQ7CgoJLy9wcmludGsoIk1TX0xpYlJlYWRFeHRyYUJsb2NrIC0tLSBQaHlCbG9jayA9ICV4LCBQYWdlTnVtID0gJXgsIGJsZW4gPSAleFxuIiwgUGh5QmxvY2ssIFBhZ2VOdW0sIGJsZW4pOwoKCS8vIFJlYWQgRXh0cmEgRGF0YQoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoID0gMHg0ICogYmxlbjsKCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CgliY2ItPkNEQlswXQkJCT0gMHhGMTsKCWJjYi0+Q0RCWzFdCQkJPSAweDAzOwoJYmNiLT5DREJbNV0JCQk9IChCWVRFKShQYWdlTnVtKTsKCWJjYi0+Q0RCWzRdCQkJPSAoQllURSkoUGh5QmxvY2spOwoJYmNiLT5DREJbM10JCQk9IChCWVRFKShQaHlCbG9jaz4+OCk7CgliY2ItPkNEQlsyXQkJCT0gKEJZVEUpKFBoeUJsb2NrPj4xNik7CgliY2ItPkNEQls2XQkJCT0gYmxlbjsKCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgYnVmLCAwKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwp9CgovLy0tLS0tIE1TX0xpYlJlYWRFeHRyYSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJSZWFkRXh0cmEoc3RydWN0IHVzX2RhdGEgKnVzLCBEV09SRCBQaHlCbG9jaywgQllURSBQYWdlTnVtLCBNU19MaWJUeXBlRXh0ZGF0ICpFeHRyYURhdCkKewoJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwoJaW50CXJlc3VsdDsKCUJZVEUJRXh0QnVmWzRdOwoKCS8vcHJpbnRrKCJNU19MaWJSZWFkRXh0cmEgLS0tIFBoeUJsb2NrID0gJXgsIFBhZ2VOdW0gPSAleFxuIiwgUGh5QmxvY2ssIFBhZ2VOdW0pOwoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoID0gMHg0OwoJYmNiLT5GbGFncwkJCT0gMHg4MDsKCWJjYi0+Q0RCWzBdCQkJPSAweEYxOwoJYmNiLT5DREJbMV0JCQk9IDB4MDM7CgliY2ItPkNEQls1XQkJCT0gKEJZVEUpKFBhZ2VOdW0pOwoJYmNiLT5DREJbNF0JCQk9IChCWVRFKShQaHlCbG9jayk7CgliY2ItPkNEQlszXQkJCT0gKEJZVEUpKFBoeUJsb2NrPj44KTsKCWJjYi0+Q0RCWzJdCQkJPSAoQllURSkoUGh5QmxvY2s+PjE2KTsKCWJjYi0+Q0RCWzZdCQkJPSAweDAxOwoJCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgJkV4dEJ1ZiwgMCk7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCUV4dHJhRGF0LT5yZXNlcnZlZCA9IDA7CglFeHRyYURhdC0+aW50ciAgICAgPSAweDgwOyAgLy8gTm90IHlldCwgd2FpdGluZyBmb3IgZmlyZXdhcmUgc3VwcG9ydAoJRXh0cmFEYXQtPnN0YXR1czAgID0gMHgxMDsgIC8vIE5vdCB5ZXQsIHdhaXRpbmcgZm9yIGZpcmV3YXJlIHN1cHBvcnQKCUV4dHJhRGF0LT5zdGF0dXMxICA9IDB4MDA7ICAvLyBOb3QgeWV0LCB3YWl0aW5nIGZvciBmaXJld2FyZSBzdXBwb3J0CglFeHRyYURhdC0+b3ZyZmxnICAgPSBFeHRCdWZbMF07CglFeHRyYURhdC0+bW5nZmxnICAgPSBFeHRCdWZbMV07CglFeHRyYURhdC0+bG9nYWRyICAgPSBNZW1TdGlja0xvZ0FkZHIoRXh0QnVmWzJdLCBFeHRCdWZbM10pOwoJCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KCi8vLS0tLS0gTVNfTGliU2V0QWNxdWlyZWRFcnJvckJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0xpYlNldEFjcXVpcmVkRXJyb3JCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgcGh5YmxrKQp7CglXT1JEIGxvZzsKCglpZiAocGh5YmxrID49IHVzLT5NU19MaWIuTnVtYmVyT2ZQaHlCbG9jaykKCQlyZXR1cm4gKERXT1JEKS0xOwoKCWlmICgobG9nID0gdXMtPk1TX0xpYi5QaHkyTG9nTWFwW3BoeWJsa10pIDwgdXMtPk1TX0xpYi5OdW1iZXJPZkxvZ0Jsb2NrKQoJCXVzLT5NU19MaWIuTG9nMlBoeU1hcFtsb2ddID0gTVNfTEJfTk9UX1VTRUQ7CgoJaWYgKHVzLT5NU19MaWIuUGh5MkxvZ01hcFtwaHlibGtdICE9IE1TX0xCX0lOSVRJQUxfRVJST1IpCgkJdXMtPk1TX0xpYi5QaHkyTG9nTWFwW3BoeWJsa10gPSBNU19MQl9BQ1FVSVJFRF9FUlJPUjsKCglyZXR1cm4gMDsKfQoKLy8tLS0tLSBNU19MaWJFcmFzZVBoeUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliRXJhc2VQaHlCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgcGh5YmxrKQp7CglXT1JEICBsb2c7CgoJaWYgKHBoeWJsayA+PSB1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2spCgkJcmV0dXJuIE1TX1NUQVRVU19FUlJPUjsKCglpZiAoKGxvZyA9IHVzLT5NU19MaWIuUGh5MkxvZ01hcFtwaHlibGtdKSA8IHVzLT5NU19MaWIuTnVtYmVyT2ZMb2dCbG9jaykKCQl1cy0+TVNfTGliLkxvZzJQaHlNYXBbbG9nXSA9IE1TX0xCX05PVF9VU0VEOwoKCXVzLT5NU19MaWIuUGh5MkxvZ01hcFtwaHlibGtdID0gTVNfTEJfTk9UX1VTRUQ7CgoJaWYgKE1TX0xpYklzV3JpdGFibGUodXMpKQoJewoJCXN3aXRjaCAoTVNfUmVhZGVyRXJhc2VCbG9jayh1cywgcGh5YmxrKSkKCQl7CgkJCWNhc2UgTVNfU1RBVFVTX1NVQ0NFU1M6CgkJCQl1cy0+TVNfTGliLlBoeTJMb2dNYXBbcGh5YmxrXSA9IE1TX0xCX05PVF9VU0VEX0VSQVNFRDsKCQkJCXJldHVybiBNU19TVEFUVVNfU1VDQ0VTUzsKCQkJY2FzZSBNU19FUlJPUl9GTEFTSF9FUkFTRToKCQkJY2FzZSBNU19TVEFUVVNfSU5UX0VSUk9SIDoKCQkJCU1TX0xpYkVycm9yUGh5QmxvY2sodXMsIHBoeWJsayk7CgkJCQlyZXR1cm4gTVNfRVJST1JfRkxBU0hfRVJBU0U7CgkJCWNhc2UgTVNfU1RBVFVTX0VSUk9SOgoJCQlkZWZhdWx0OgoJCQkJTVNfTGliQ3RybFNldCh1cywgTVNfTElCX0NUUkxfUkRPTkxZKTsKCQkJCU1TX0xpYlNldEFjcXVpcmVkRXJyb3JCbG9jayh1cywgcGh5YmxrKTsKCQkJCXJldHVybiBNU19TVEFUVVNfRVJST1I7CgkJfQoJfQoKCU1TX0xpYlNldEFjcXVpcmVkRXJyb3JCbG9jayh1cywgcGh5YmxrKTsKCglyZXR1cm4gTVNfU1RBVFVTX1NVQ0NFU1M7Cn0KCi8vLS0tLS0gTVNfTGliRXJyb3JQaHlCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0xpYkVycm9yUGh5QmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIHBoeWJsaykKewogICAgaWYgKHBoeWJsayA+PSB1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2spCiAgICAgICAgcmV0dXJuIE1TX1NUQVRVU19FUlJPUjsKCiAgICBNU19MaWJTZXRBY3F1aXJlZEVycm9yQmxvY2sodXMsIHBoeWJsayk7CgogICAgaWYgKE1TX0xpYklzV3JpdGFibGUodXMpKQogICAgICAgIHJldHVybiBNU19MaWJPdmVyd3JpdGVFeHRyYSh1cywgcGh5YmxrLCAwLCAoQllURSkofk1TX1JFR19PVlJfQktTVCkpOwoKCiAgICByZXR1cm4gTVNfU1RBVFVTX1NVQ0NFU1M7Cn0KCi8vLS0tLS0gTVNfTGliT3ZlcndyaXRlRXh0cmEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0xpYk92ZXJ3cml0ZUV4dHJhKHN0cnVjdCB1c19kYXRhICp1cywgRFdPUkQgUGh5QmxvY2tBZGRyLCBCWVRFIFBhZ2VOdW0sIEJZVEUgT3ZlcndyaXRlRmxhZykKewoJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwoJaW50CXJlc3VsdDsKCgkvL3ByaW50aygiTVMgLS0tIE1TX0xpYk92ZXJ3cml0ZUV4dHJhLCAgUGh5QmxvY2tBZGRyID0gJXgsIFBhZ2VOdW0gPSAleFxuIiwgUGh5QmxvY2tBZGRyLCBQYWdlTnVtKTsKCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgTVNfUldfUEFUVEVSTik7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aCA9IDB4NDsKCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CgliY2ItPkNEQlswXQkJCT0gMHhGMjsKCWJjYi0+Q0RCWzFdCQkJPSAweDA1OwoJYmNiLT5DREJbNV0JCQk9IChCWVRFKShQYWdlTnVtKTsKCWJjYi0+Q0RCWzRdCQkJPSAoQllURSkoUGh5QmxvY2tBZGRyKTsKCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoUGh5QmxvY2tBZGRyPj44KTsKCWJjYi0+Q0RCWzJdCQkJPSAoQllURSkoUGh5QmxvY2tBZGRyPj4xNik7CgliY2ItPkNEQls2XQkJCT0gT3ZlcndyaXRlRmxhZzsKCWJjYi0+Q0RCWzddCQkJPSAweEZGOwoJYmNiLT5DREJbOF0JCQk9IDB4RkY7CgliY2ItPkNEQls5XQkJCT0gMHhGRjsKCQoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIE5VTEwsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KCi8vLS0tLS0gTVNfTGliRm9yY2VTZXRMb2dpY2FsUGFpcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0xpYkZvcmNlU2V0TG9naWNhbFBhaXIoc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIGxvZ2JsaywgV09SRCBwaHlibGspCnsKCWlmIChsb2dibGsgPT0gTVNfTEJfTk9UX1VTRUQpCgkJcmV0dXJuIDA7CgoJaWYgKChsb2dibGsgPj0gdXMtPk1TX0xpYi5OdW1iZXJPZkxvZ0Jsb2NrKSB8fCAocGh5YmxrID49IHVzLT5NU19MaWIuTnVtYmVyT2ZQaHlCbG9jaykpCgkJcmV0dXJuIChEV09SRCktMTsKCgl1cy0+TVNfTGliLlBoeTJMb2dNYXBbcGh5YmxrXSA9IGxvZ2JsazsKCXVzLT5NU19MaWIuTG9nMlBoeU1hcFtsb2dibGtdID0gcGh5YmxrOwoKCXJldHVybiAwOwp9CgovLy0tLS0tIE1TX0xpYlNldExvZ2ljYWxQYWlyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJTZXRMb2dpY2FsUGFpcihzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgbG9nYmxrLCBXT1JEIHBoeWJsaykKewoJaWYgKChsb2dibGsgPj0gdXMtPk1TX0xpYi5OdW1iZXJPZkxvZ0Jsb2NrKSB8fCAocGh5YmxrID49IHVzLT5NU19MaWIuTnVtYmVyT2ZQaHlCbG9jaykpCgkJcmV0dXJuIChEV09SRCktMTsKCgl1cy0+TVNfTGliLlBoeTJMb2dNYXBbcGh5YmxrXSA9IGxvZ2JsazsKCXVzLT5NU19MaWIuTG9nMlBoeU1hcFtsb2dibGtdID0gcGh5YmxrOwoKCXJldHVybiAwOwp9CgovLy0tLS0tIE1TX0NvdW50RnJlZUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19Db3VudEZyZWVCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgUGh5QmxvY2spCnsKCURXT1JEIEVuZGUsIENvdW50OwoKCUVuZGUgPSBQaHlCbG9jayArIE1TX1BIWVNJQ0FMX0JMT0NLU19QRVJfU0VHTUVOVDsKCWZvciAoQ291bnQgPSAwOyBQaHlCbG9jayA8IEVuZGU7IFBoeUJsb2NrKyspCgl7CgkJc3dpdGNoICh1cy0+TVNfTGliLlBoeTJMb2dNYXBbUGh5QmxvY2tdKQoJCXsKCQkJY2FzZSBNU19MQl9OT1RfVVNFRDoKCQkJY2FzZSBNU19MQl9OT1RfVVNFRF9FUkFTRUQ6CgkJCQlDb3VudCsrOwoJCQlkZWZhdWx0OgoJCQkJYnJlYWs7CgkJfQoJfQoKCXJldHVybiBDb3VudDsKfQoKLy8tLS0tLSBNU19MaWJTZWFyY2hCbG9ja0Zyb21QaHlzaWNhbCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliU2VhcmNoQmxvY2tGcm9tUGh5c2ljYWwoc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIHBoeWJsaykKewoJV09SRAkJCU5ld2JsazsKCVdPUkQJCQlibGs7CglNU19MaWJUeXBlRXh0ZGF0CWV4dGRhdDsKCglpZiAocGh5YmxrID49IHVzLT5NU19MaWIuTnVtYmVyT2ZQaHlCbG9jaykKCQlyZXR1cm4gTVNfTEJfRVJST1I7CgoJZm9yIChibGsgPSBwaHlibGsgKyAxOyBibGsgIT0gcGh5YmxrOyBibGsrKykKCXsKCQlpZiAoKGJsayAmIE1TX1BIWVNJQ0FMX0JMT0NLU19QRVJfU0VHTUVOVF9NQVNLKSA9PSAwKQoJCQlibGsgLT0gTVNfUEhZU0lDQUxfQkxPQ0tTX1BFUl9TRUdNRU5UOwoKCQlOZXdibGsgPSB1cy0+TVNfTGliLlBoeTJMb2dNYXBbYmxrXTsKCQlpZiAodXMtPk1TX0xpYi5QaHkyTG9nTWFwW2Jsa10gPT0gTVNfTEJfTk9UX1VTRURfRVJBU0VEKQoJCQlyZXR1cm4gYmxrOwoJCWVsc2UgaWYgKHVzLT5NU19MaWIuUGh5MkxvZ01hcFtibGtdID09IE1TX0xCX05PVF9VU0VEKQoJCXsKCQkJc3dpdGNoIChNU19MaWJSZWFkRXh0cmEodXMsIGJsaywgMCwgJmV4dGRhdCkpCgkJCXsKCQkJCWNhc2UgTVNfU1RBVFVTX1NVQ0NFU1MgOgoJCQkJY2FzZSBNU19TVEFUVVNfU1VDQ0VTU19XSVRIX0VDQzoKCQkJCQlicmVhazsKCQkJCWNhc2UgTVNfTk9DQVJEX0VSUk9SOgoJCQkJCXJldHVybiBNU19OT0NBUkRfRVJST1I7CgkJCQljYXNlIE1TX1NUQVRVU19JTlRfRVJST1I6CgkJCQkJcmV0dXJuIE1TX0xCX0VSUk9SOwoJCQkJY2FzZSBNU19FUlJPUl9GTEFTSF9SRUFEOgoJCQkJZGVmYXVsdDoKCQkJCQlNU19MaWJTZXRBY3F1aXJlZEVycm9yQmxvY2sodXMsIGJsayk7ICAgICAvLyBNU19MaWJFcnJvclBoeUJsb2NrKGZkb0V4dCwgYmxrKTsKCQkJCQljb250aW51ZTsKCQkJfSAvLyBFbmQgc3dpdGNoCgoJCQlpZiAoKGV4dGRhdC5vdnJmbGcgJiBNU19SRUdfT1ZSX0JLU1QpICE9IE1TX1JFR19PVlJfQktTVF9PSykKCQkJewoJCQkJTVNfTGliU2V0QWNxdWlyZWRFcnJvckJsb2NrKHVzLCBibGspOwoJCQkJY29udGludWU7CgkJCX0KCgkJCXN3aXRjaCAoTVNfTGliRXJhc2VQaHlCbG9jayh1cywgYmxrKSkKCQkJewoJCQkJY2FzZSBNU19TVEFUVVNfU1VDQ0VTUzoKCQkJCQlyZXR1cm4gYmxrOwoJCQkJY2FzZSBNU19TVEFUVVNfRVJST1I6CgkJCQkJcmV0dXJuIE1TX0xCX0VSUk9SOwoJCQkJY2FzZSBNU19FUlJPUl9GTEFTSF9FUkFTRToKCQkJCWRlZmF1bHQ6CgkJCQkJTVNfTGliRXJyb3JQaHlCbG9jayh1cywgYmxrKTsKCQkJCQlicmVhazsKCQkJfQoJCX0KCX0gLy8gRW5kIGZvcgoKCXJldHVybiBNU19MQl9FUlJPUjsKfQoKLy8tLS0tLSBNU19MaWJTZWFyY2hCbG9ja0Zyb21Mb2dpY2FsKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliU2VhcmNoQmxvY2tGcm9tTG9naWNhbChzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgbG9nYmxrKQp7CglXT1JEIHBoeWJsazsKCglpZiAoKHBoeWJsaz1NU19MaWJDb252MlBoeXNpY2FsKHVzLCBsb2dibGspKSA+PSBNU19MQl9FUlJPUikKCXsKCQlpZiAobG9nYmxrID49IHVzLT5NU19MaWIuTnVtYmVyT2ZMb2dCbG9jaykKCQkJcmV0dXJuIE1TX0xCX0VSUk9SOwoKCQlwaHlibGsgPSAobG9nYmxrICsgTVNfTlVNQkVSX09GX0JPT1RfQkxPQ0spIC8gTVNfTE9HSUNBTF9CTE9DS1NfUEVSX1NFR01FTlQ7CgkJcGh5YmxrICo9IE1TX1BIWVNJQ0FMX0JMT0NLU19QRVJfU0VHTUVOVDsKCQlwaHlibGsgKz0gTVNfUEhZU0lDQUxfQkxPQ0tTX1BFUl9TRUdNRU5UIC0gMTsKCX0KCglyZXR1cm4gTVNfTGliU2VhcmNoQmxvY2tGcm9tUGh5c2ljYWwodXMsIHBoeWJsayk7Cn0KCgo=