LyoKICogIGxpbnV4L2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMKICoKICogU3VwcG9ydCBmdW5jdGlvbnMgZm9yIE9NQVAgR1BJTwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgogKiBXcml0dGVuIGJ5IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKi8KCiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgojaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiNpbmNsdWRlIDxsaW51eC9lcnIuaD4KI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgoKI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgojaW5jbHVkZSA8YXNtL2lycS5oPgojaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgojaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgojaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CgojaW5jbHVkZSA8YXNtL2lvLmg+CgovKgogKiBPTUFQMTUxMCBHUElPIHJlZ2lzdGVycwogKi8KI2RlZmluZSBPTUFQMTUxMF9HUElPX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmNlMDAwCiNkZWZpbmUgT01BUDE1MTBfR1BJT19EQVRBX0lOUFVUCTB4MDAKI2RlZmluZSBPTUFQMTUxMF9HUElPX0RBVEFfT1VUUFVUCTB4MDQKI2RlZmluZSBPTUFQMTUxMF9HUElPX0RJUl9DT05UUk9MCTB4MDgKI2RlZmluZSBPTUFQMTUxMF9HUElPX0lOVF9DT05UUk9MCTB4MGMKI2RlZmluZSBPTUFQMTUxMF9HUElPX0lOVF9NQVNLCQkweDEwCiNkZWZpbmUgT01BUDE1MTBfR1BJT19JTlRfU1RBVFVTCTB4MTQKI2RlZmluZSBPTUFQMTUxMF9HUElPX1BJTl9DT05UUk9MCTB4MTgKCiNkZWZpbmUgT01BUDE1MTBfSUhfR1BJT19CQVNFCQk2NAoKLyoKICogT01BUDE2MTAgc3BlY2lmaWMgR1BJTyByZWdpc3RlcnMKICovCiNkZWZpbmUgT01BUDE2MTBfR1BJTzFfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmYmU0MDAKI2RlZmluZSBPTUFQMTYxMF9HUElPMl9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiZWMwMAojZGVmaW5lIE9NQVAxNjEwX0dQSU8zX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmJiNDAwCiNkZWZpbmUgT01BUDE2MTBfR1BJTzRfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmYmJjMDAKI2RlZmluZSBPTUFQMTYxMF9HUElPX1JFVklTSU9OCQkweDAwMDAKI2RlZmluZSBPTUFQMTYxMF9HUElPX1NZU0NPTkZJRwkJMHgwMDEwCiNkZWZpbmUgT01BUDE2MTBfR1BJT19TWVNTVEFUVVMJCTB4MDAxNAojZGVmaW5lIE9NQVAxNjEwX0dQSU9fSVJRU1RBVFVTMQkweDAwMTgKI2RlZmluZSBPTUFQMTYxMF9HUElPX0lSUUVOQUJMRTEJMHgwMDFjCiNkZWZpbmUgT01BUDE2MTBfR1BJT19XQUtFVVBFTkFCTEUJMHgwMDI4CiNkZWZpbmUgT01BUDE2MTBfR1BJT19EQVRBSU4JCTB4MDAyYwojZGVmaW5lIE9NQVAxNjEwX0dQSU9fREFUQU9VVAkJMHgwMDMwCiNkZWZpbmUgT01BUDE2MTBfR1BJT19ESVJFQ1RJT04JCTB4MDAzNAojZGVmaW5lIE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMQkweDAwMzgKI2RlZmluZSBPTUFQMTYxMF9HUElPX0VER0VfQ1RSTDIJMHgwMDNjCiNkZWZpbmUgT01BUDE2MTBfR1BJT19DTEVBUl9JUlFFTkFCTEUxCTB4MDA5YwojZGVmaW5lIE9NQVAxNjEwX0dQSU9fQ0xFQVJfV0FLRVVQRU5BCTB4MDBhOAojZGVmaW5lIE9NQVAxNjEwX0dQSU9fQ0xFQVJfREFUQU9VVAkweDAwYjAKI2RlZmluZSBPTUFQMTYxMF9HUElPX1NFVF9JUlFFTkFCTEUxCTB4MDBkYwojZGVmaW5lIE9NQVAxNjEwX0dQSU9fU0VUX1dBS0VVUEVOQQkweDAwZTgKI2RlZmluZSBPTUFQMTYxMF9HUElPX1NFVF9EQVRBT1VUCTB4MDBmMAoKLyoKICogT01BUDczMCBzcGVjaWZpYyBHUElPIHJlZ2lzdGVycwogKi8KI2RlZmluZSBPTUFQNzMwX0dQSU8xX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmJjMDAwCiNkZWZpbmUgT01BUDczMF9HUElPMl9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiYzgwMAojZGVmaW5lIE9NQVA3MzBfR1BJTzNfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmYmQwMDAKI2RlZmluZSBPTUFQNzMwX0dQSU80X0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmJkODAwCiNkZWZpbmUgT01BUDczMF9HUElPNV9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiZTAwMAojZGVmaW5lIE9NQVA3MzBfR1BJTzZfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmYmU4MDAKI2RlZmluZSBPTUFQNzMwX0dQSU9fREFUQV9JTlBVVAkJMHgwMAojZGVmaW5lIE9NQVA3MzBfR1BJT19EQVRBX09VVFBVVAkweDA0CiNkZWZpbmUgT01BUDczMF9HUElPX0RJUl9DT05UUk9MCTB4MDgKI2RlZmluZSBPTUFQNzMwX0dQSU9fSU5UX0NPTlRST0wJMHgwYwojZGVmaW5lIE9NQVA3MzBfR1BJT19JTlRfTUFTSwkJMHgxMAojZGVmaW5lIE9NQVA3MzBfR1BJT19JTlRfU1RBVFVTCQkweDE0CgovKgogKiBvbWFwMjR4eCBzcGVjaWZpYyBHUElPIHJlZ2lzdGVycwogKi8KI2RlZmluZSBPTUFQMjRYWF9HUElPMV9CQVNFCQkodm9pZCBfX2lvbWVtICopMHg0ODAxODAwMAojZGVmaW5lIE9NQVAyNFhYX0dQSU8yX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweDQ4MDFhMDAwCiNkZWZpbmUgT01BUDI0WFhfR1BJTzNfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4NDgwMWMwMDAKI2RlZmluZSBPTUFQMjRYWF9HUElPNF9CQVNFCQkodm9pZCBfX2lvbWVtICopMHg0ODAxZTAwMAojZGVmaW5lIE9NQVAyNFhYX0dQSU9fUkVWSVNJT04JCTB4MDAwMAojZGVmaW5lIE9NQVAyNFhYX0dQSU9fU1lTQ09ORklHCQkweDAwMTAKI2RlZmluZSBPTUFQMjRYWF9HUElPX1NZU1NUQVRVUwkJMHgwMDE0CiNkZWZpbmUgT01BUDI0WFhfR1BJT19JUlFTVEFUVVMxCTB4MDAxOAojZGVmaW5lIE9NQVAyNFhYX0dQSU9fSVJRRU5BQkxFMQkweDAwMWMKI2RlZmluZSBPTUFQMjRYWF9HUElPX0NUUkwJCTB4MDAzMAojZGVmaW5lIE9NQVAyNFhYX0dQSU9fT0UJCTB4MDAzNAojZGVmaW5lIE9NQVAyNFhYX0dQSU9fREFUQUlOCQkweDAwMzgKI2RlZmluZSBPTUFQMjRYWF9HUElPX0RBVEFPVVQJCTB4MDAzYwojZGVmaW5lIE9NQVAyNFhYX0dQSU9fTEVWRUxERVRFQ1QwCTB4MDA0MAojZGVmaW5lIE9NQVAyNFhYX0dQSU9fTEVWRUxERVRFQ1QxCTB4MDA0NAojZGVmaW5lIE9NQVAyNFhYX0dQSU9fUklTSU5HREVURUNUCTB4MDA0OAojZGVmaW5lIE9NQVAyNFhYX0dQSU9fRkFMTElOR0RFVEVDVAkweDAwNGMKI2RlZmluZSBPTUFQMjRYWF9HUElPX0NMRUFSSVJRRU5BQkxFMQkweDAwNjAKI2RlZmluZSBPTUFQMjRYWF9HUElPX1NFVElSUUVOQUJMRTEJMHgwMDY0CiNkZWZpbmUgT01BUDI0WFhfR1BJT19DTEVBUldLVUVOQQkweDAwODAKI2RlZmluZSBPTUFQMjRYWF9HUElPX1NFVFdLVUVOQQkJMHgwMDg0CiNkZWZpbmUgT01BUDI0WFhfR1BJT19DTEVBUkRBVEFPVVQJMHgwMDkwCiNkZWZpbmUgT01BUDI0WFhfR1BJT19TRVREQVRBT1VUCTB4MDA5NAoKI2RlZmluZSBPTUFQX01QVUlPX01BU0sJCSh+T01BUF9NQVhfR1BJT19MSU5FUyAmIDB4ZmYpCgpzdHJ1Y3QgZ3Bpb19iYW5rIHsKCXZvaWQgX19pb21lbSAqYmFzZTsKCXUxNiBpcnE7Cgl1MTYgdmlydHVhbF9pcnFfc3RhcnQ7CglpbnQgbWV0aG9kOwoJdTMyIHJlc2VydmVkX21hcDsKCXUzMiBzdXNwZW5kX3dha2V1cDsKCXUzMiBzYXZlZF93YWtldXA7CglzcGlubG9ja190IGxvY2s7Cn07CgojZGVmaW5lIE1FVEhPRF9NUFVJTwkJMAojZGVmaW5lIE1FVEhPRF9HUElPXzE1MTAJMQojZGVmaW5lIE1FVEhPRF9HUElPXzE2MTAJMgojZGVmaW5lIE1FVEhPRF9HUElPXzczMAkJMwojZGVmaW5lIE1FVEhPRF9HUElPXzI0WFgJNAoKI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNlhYCnN0YXRpYyBzdHJ1Y3QgZ3Bpb19iYW5rIGdwaW9fYmFua18xNjEwWzVdID0gewoJeyBPTUFQX01QVUlPX0JBU0UsICAgICBJTlRfTVBVSU8sCSAgICBJSF9NUFVJT19CQVNFLCAgICAgTUVUSE9EX01QVUlPfSwKCXsgT01BUDE2MTBfR1BJTzFfQkFTRSwgSU5UX0dQSU9fQkFOSzEsCSAgICBJSF9HUElPX0JBU0UsICAgICAgTUVUSE9EX0dQSU9fMTYxMCB9LAoJeyBPTUFQMTYxMF9HUElPMl9CQVNFLCBJTlRfMTYxMF9HUElPX0JBTksyLCBJSF9HUElPX0JBU0UgKyAxNiwgTUVUSE9EX0dQSU9fMTYxMCB9LAoJeyBPTUFQMTYxMF9HUElPM19CQVNFLCBJTlRfMTYxMF9HUElPX0JBTkszLCBJSF9HUElPX0JBU0UgKyAzMiwgTUVUSE9EX0dQSU9fMTYxMCB9LAoJeyBPTUFQMTYxMF9HUElPNF9CQVNFLCBJTlRfMTYxMF9HUElPX0JBTks0LCBJSF9HUElPX0JBU0UgKyA0OCwgTUVUSE9EX0dQSU9fMTYxMCB9LAp9OwojZW5kaWYKCiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTVYWApzdGF0aWMgc3RydWN0IGdwaW9fYmFuayBncGlvX2JhbmtfMTUxMFsyXSA9IHsKCXsgT01BUF9NUFVJT19CQVNFLCAgICBJTlRfTVBVSU8sICAgICAgSUhfTVBVSU9fQkFTRSwgTUVUSE9EX01QVUlPIH0sCgl7IE9NQVAxNTEwX0dQSU9fQkFTRSwgSU5UX0dQSU9fQkFOSzEsIElIX0dQSU9fQkFTRSwgIE1FVEhPRF9HUElPXzE1MTAgfQp9OwojZW5kaWYKCiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCnN0YXRpYyBzdHJ1Y3QgZ3Bpb19iYW5rIGdwaW9fYmFua183MzBbN10gPSB7Cgl7IE9NQVBfTVBVSU9fQkFTRSwgICAgIElOVF83MzBfTVBVSU8sCSAgICBJSF9NUFVJT19CQVNFLAlNRVRIT0RfTVBVSU8gfSwKCXsgT01BUDczMF9HUElPMV9CQVNFLCAgSU5UXzczMF9HUElPX0JBTksxLCAgSUhfR1BJT19CQVNFLAlNRVRIT0RfR1BJT183MzAgfSwKCXsgT01BUDczMF9HUElPMl9CQVNFLCAgSU5UXzczMF9HUElPX0JBTksyLCAgSUhfR1BJT19CQVNFICsgMzIsCU1FVEhPRF9HUElPXzczMCB9LAoJeyBPTUFQNzMwX0dQSU8zX0JBU0UsICBJTlRfNzMwX0dQSU9fQkFOSzMsICBJSF9HUElPX0JBU0UgKyA2NCwJTUVUSE9EX0dQSU9fNzMwIH0sCgl7IE9NQVA3MzBfR1BJTzRfQkFTRSwgIElOVF83MzBfR1BJT19CQU5LNCwgIElIX0dQSU9fQkFTRSArIDk2LAlNRVRIT0RfR1BJT183MzAgfSwKCXsgT01BUDczMF9HUElPNV9CQVNFLCAgSU5UXzczMF9HUElPX0JBTks1LCAgSUhfR1BJT19CQVNFICsgMTI4LCBNRVRIT0RfR1BJT183MzAgfSwKCXsgT01BUDczMF9HUElPNl9CQVNFLCAgSU5UXzczMF9HUElPX0JBTks2LCAgSUhfR1BJT19CQVNFICsgMTYwLCBNRVRIT0RfR1BJT183MzAgfSwKfTsKI2VuZGlmCgojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKc3RhdGljIHN0cnVjdCBncGlvX2JhbmsgZ3Bpb19iYW5rXzI0eHhbNF0gPSB7Cgl7IE9NQVAyNFhYX0dQSU8xX0JBU0UsIElOVF8yNFhYX0dQSU9fQkFOSzEsIElIX0dQSU9fQkFTRSwJTUVUSE9EX0dQSU9fMjRYWCB9LAoJeyBPTUFQMjRYWF9HUElPMl9CQVNFLCBJTlRfMjRYWF9HUElPX0JBTksyLCBJSF9HUElPX0JBU0UgKyAzMiwJTUVUSE9EX0dQSU9fMjRYWCB9LAoJeyBPTUFQMjRYWF9HUElPM19CQVNFLCBJTlRfMjRYWF9HUElPX0JBTkszLCBJSF9HUElPX0JBU0UgKyA2NCwJTUVUSE9EX0dQSU9fMjRYWCB9LAoJeyBPTUFQMjRYWF9HUElPNF9CQVNFLCBJTlRfMjRYWF9HUElPX0JBTks0LCBJSF9HUElPX0JBU0UgKyA5NiwJTUVUSE9EX0dQSU9fMjRYWCB9LAp9OwojZW5kaWYKCnN0YXRpYyBzdHJ1Y3QgZ3Bpb19iYW5rICpncGlvX2Jhbms7CnN0YXRpYyBpbnQgZ3Bpb19iYW5rX2NvdW50OwoKc3RhdGljIGlubGluZSBzdHJ1Y3QgZ3Bpb19iYW5rICpnZXRfZ3Bpb19iYW5rKGludCBncGlvKQp7CiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTVYWAoJaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7CgkJaWYgKE9NQVBfR1BJT19JU19NUFVJTyhncGlvKSkKCQkJcmV0dXJuICZncGlvX2JhbmtbMF07CgkJcmV0dXJuICZncGlvX2JhbmtbMV07Cgl9CiNlbmRpZgojaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKCWlmIChjcHVfaXNfb21hcDE2eHgoKSkgewoJCWlmIChPTUFQX0dQSU9fSVNfTVBVSU8oZ3BpbykpCgkJCXJldHVybiAmZ3Bpb19iYW5rWzBdOwoJCXJldHVybiAmZ3Bpb19iYW5rWzEgKyAoZ3BpbyA+PiA0KV07Cgl9CiNlbmRpZgojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAoJaWYgKGNwdV9pc19vbWFwNzMwKCkpIHsKCQlpZiAoT01BUF9HUElPX0lTX01QVUlPKGdwaW8pKQoJCQlyZXR1cm4gJmdwaW9fYmFua1swXTsKCQlyZXR1cm4gJmdwaW9fYmFua1sxICsgKGdwaW8gPj4gNSldOwoJfQojZW5kaWYKI2lmZGVmIENPTkZJR19BUkNIX09NQVAyNFhYCglpZiAoY3B1X2lzX29tYXAyNHh4KCkpCgkJcmV0dXJuICZncGlvX2JhbmtbZ3BpbyA+PiA1XTsKI2VuZGlmCn0KCnN0YXRpYyBpbmxpbmUgaW50IGdldF9ncGlvX2luZGV4KGludCBncGlvKQp7CiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCglpZiAoY3B1X2lzX29tYXA3MzAoKSkKCQlyZXR1cm4gZ3BpbyAmIDB4MWY7CiNlbmRpZgojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKCWlmIChjcHVfaXNfb21hcDI0eHgoKSkKCQlyZXR1cm4gZ3BpbyAmIDB4MWY7CiNlbmRpZgoJcmV0dXJuIGdwaW8gJiAweDBmOwp9CgpzdGF0aWMgaW5saW5lIGludCBncGlvX3ZhbGlkKGludCBncGlvKQp7CglpZiAoZ3BpbyA8IDApCgkJcmV0dXJuIC0xOwoJaWYgKE9NQVBfR1BJT19JU19NUFVJTyhncGlvKSkgewoJCWlmICgoZ3BpbyAmIE9NQVBfTVBVSU9fTUFTSykgPiAxNikKCQkJcmV0dXJuIC0xOwoJCXJldHVybiAwOwoJfQojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKCWlmIChjcHVfaXNfb21hcDE1eHgoKSAmJiBncGlvIDwgMTYpCgkJcmV0dXJuIDA7CiNlbmRpZgojaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKCWlmICgoY3B1X2lzX29tYXAxNnh4KCkpICYmIGdwaW8gPCA2NCkKCQlyZXR1cm4gMDsKI2VuZGlmCiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCglpZiAoY3B1X2lzX29tYXA3MzAoKSAmJiBncGlvIDwgMTkyKQoJCXJldHVybiAwOwojZW5kaWYKI2lmZGVmIENPTkZJR19BUkNIX09NQVAyNFhYCglpZiAoY3B1X2lzX29tYXAyNHh4KCkgJiYgZ3BpbyA8IDEyOCkKCQlyZXR1cm4gMDsKI2VuZGlmCglyZXR1cm4gLTE7Cn0KCnN0YXRpYyBpbnQgY2hlY2tfZ3BpbyhpbnQgZ3BpbykKewoJaWYgKHVubGlrZWx5KGdwaW9fdmFsaWQoZ3BpbykpIDwgMCkgewoJCXByaW50ayhLRVJOX0VSUiAib21hcC1ncGlvOiBpbnZhbGlkIEdQSU8gJWRcbiIsIGdwaW8pOwoJCWR1bXBfc3RhY2soKTsKCQlyZXR1cm4gLTE7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgX3NldF9ncGlvX2RpcmVjdGlvbihzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbywgaW50IGlzX2lucHV0KQp7Cgl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2U7Cgl1MzIgbDsKCglzd2l0Y2ggKGJhbmstPm1ldGhvZCkgewoJY2FzZSBNRVRIT0RfTVBVSU86CgkJcmVnICs9IE9NQVBfTVBVSU9fSU9fQ05UTDsKCQlicmVhazsKCWNhc2UgTUVUSE9EX0dQSU9fMTUxMDoKCQlyZWcgKz0gT01BUDE1MTBfR1BJT19ESVJfQ09OVFJPTDsKCQlicmVhazsKCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKCQlyZWcgKz0gT01BUDE2MTBfR1BJT19ESVJFQ1RJT047CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzczMDoKCQlyZWcgKz0gT01BUDczMF9HUElPX0RJUl9DT05UUk9MOwoJCWJyZWFrOwoJY2FzZSBNRVRIT0RfR1BJT18yNFhYOgoJCXJlZyArPSBPTUFQMjRYWF9HUElPX09FOwoJCWJyZWFrOwoJfQoJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CglpZiAoaXNfaW5wdXQpCgkJbCB8PSAxIDw8IGdwaW87CgllbHNlCgkJbCAmPSB+KDEgPDwgZ3Bpbyk7CglfX3Jhd193cml0ZWwobCwgcmVnKTsKfQoKdm9pZCBvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihpbnQgZ3BpbywgaW50IGlzX2lucHV0KQp7CglzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOwoKCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKCQlyZXR1cm47CgliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKCXNwaW5fbG9jaygmYmFuay0+bG9jayk7Cglfc2V0X2dwaW9fZGlyZWN0aW9uKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCBpc19pbnB1dCk7CglzcGluX3VubG9jaygmYmFuay0+bG9jayk7Cn0KCnN0YXRpYyB2b2lkIF9zZXRfZ3Bpb19kYXRhb3V0KHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvLCBpbnQgZW5hYmxlKQp7Cgl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2U7Cgl1MzIgbCA9IDA7CgoJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKCWNhc2UgTUVUSE9EX01QVUlPOgoJCXJlZyArPSBPTUFQX01QVUlPX09VVFBVVDsKCQlsID0gX19yYXdfcmVhZGwocmVnKTsKCQlpZiAoZW5hYmxlKQoJCQlsIHw9IDEgPDwgZ3BpbzsKCQllbHNlCgkJCWwgJj0gfigxIDw8IGdwaW8pOwoJCWJyZWFrOwoJY2FzZSBNRVRIT0RfR1BJT18xNTEwOgoJCXJlZyArPSBPTUFQMTUxMF9HUElPX0RBVEFfT1VUUFVUOwoJCWwgPSBfX3Jhd19yZWFkbChyZWcpOwoJCWlmIChlbmFibGUpCgkJCWwgfD0gMSA8PCBncGlvOwoJCWVsc2UKCQkJbCAmPSB+KDEgPDwgZ3Bpbyk7CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzE2MTA6CgkJaWYgKGVuYWJsZSkKCQkJcmVnICs9IE9NQVAxNjEwX0dQSU9fU0VUX0RBVEFPVVQ7CgkJZWxzZQoJCQlyZWcgKz0gT01BUDE2MTBfR1BJT19DTEVBUl9EQVRBT1VUOwoJCWwgPSAxIDw8IGdwaW87CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzczMDoKCQlyZWcgKz0gT01BUDczMF9HUElPX0RBVEFfT1VUUFVUOwoJCWwgPSBfX3Jhd19yZWFkbChyZWcpOwoJCWlmIChlbmFibGUpCgkJCWwgfD0gMSA8PCBncGlvOwoJCWVsc2UKCQkJbCAmPSB+KDEgPDwgZ3Bpbyk7CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzI0WFg6CgkJaWYgKGVuYWJsZSkKCQkJcmVnICs9IE9NQVAyNFhYX0dQSU9fU0VUREFUQU9VVDsKCQllbHNlCgkJCXJlZyArPSBPTUFQMjRYWF9HUElPX0NMRUFSREFUQU9VVDsKCQlsID0gMSA8PCBncGlvOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlCVUcoKTsKCQlyZXR1cm47Cgl9CglfX3Jhd193cml0ZWwobCwgcmVnKTsKfQoKdm9pZCBvbWFwX3NldF9ncGlvX2RhdGFvdXQoaW50IGdwaW8sIGludCBlbmFibGUpCnsKCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7CgoJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQoJCXJldHVybjsKCWJhbmsgPSBnZXRfZ3Bpb19iYW5rKGdwaW8pOwoJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKCV9zZXRfZ3Bpb19kYXRhb3V0KGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCBlbmFibGUpOwoJc3Bpbl91bmxvY2soJmJhbmstPmxvY2spOwp9CgppbnQgb21hcF9nZXRfZ3Bpb19kYXRhaW4oaW50IGdwaW8pCnsKCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7Cgl2b2lkIF9faW9tZW0gKnJlZzsKCglpZiAoY2hlY2tfZ3BpbyhncGlvKSA8IDApCgkJcmV0dXJuIC0xOwoJYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7CglyZWcgPSBiYW5rLT5iYXNlOwoJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKCWNhc2UgTUVUSE9EX01QVUlPOgoJCXJlZyArPSBPTUFQX01QVUlPX0lOUFVUX0xBVENIOwoJCWJyZWFrOwoJY2FzZSBNRVRIT0RfR1BJT18xNTEwOgoJCXJlZyArPSBPTUFQMTUxMF9HUElPX0RBVEFfSU5QVVQ7CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzE2MTA6CgkJcmVnICs9IE9NQVAxNjEwX0dQSU9fREFUQUlOOwoJCWJyZWFrOwoJY2FzZSBNRVRIT0RfR1BJT183MzA6CgkJcmVnICs9IE9NQVA3MzBfR1BJT19EQVRBX0lOUFVUOwoJCWJyZWFrOwoJY2FzZSBNRVRIT0RfR1BJT18yNFhYOgoJCXJlZyArPSBPTUFQMjRYWF9HUElPX0RBVEFJTjsKCQlicmVhazsKCWRlZmF1bHQ6CgkJQlVHKCk7CgkJcmV0dXJuIC0xOwoJfQoJcmV0dXJuIChfX3Jhd19yZWFkbChyZWcpCgkJCSYgKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbykpKSAhPSAwOwp9CgojZGVmaW5lIE1PRF9SRUdfQklUKHJlZywgYml0X21hc2ssIHNldCkJXApkbyB7CVwKCWludCBsID0gX19yYXdfcmVhZGwoYmFzZSArIHJlZyk7IFwKCWlmIChzZXQpIGwgfD0gYml0X21hc2s7IFwKCWVsc2UgbCAmPSB+Yml0X21hc2s7IFwKCV9fcmF3X3dyaXRlbChsLCBiYXNlICsgcmVnKTsgXAp9IHdoaWxlKDApCgpzdGF0aWMgaW5saW5lIHZvaWQgc2V0XzI0eHhfZ3Bpb190cmlnZ2VyaW5nKHZvaWQgX19pb21lbSAqYmFzZSwgaW50IGdwaW8sIGludCB0cmlnZ2VyKQp7Cgl1MzIgZ3Bpb19iaXQgPSAxIDw8IGdwaW87CgoJTU9EX1JFR19CSVQoT01BUDI0WFhfR1BJT19MRVZFTERFVEVDVDAsIGdwaW9fYml0LAoJCXRyaWdnZXIgJiBfX0lSUVRfTE9XTFZMKTsKCU1PRF9SRUdfQklUKE9NQVAyNFhYX0dQSU9fTEVWRUxERVRFQ1QxLCBncGlvX2JpdCwKCQl0cmlnZ2VyICYgX19JUlFUX0hJR0hMVkwpOwoJTU9EX1JFR19CSVQoT01BUDI0WFhfR1BJT19SSVNJTkdERVRFQ1QsIGdwaW9fYml0LAoJCXRyaWdnZXIgJiBfX0lSUVRfUklTRURHRSk7CglNT0RfUkVHX0JJVChPTUFQMjRYWF9HUElPX0ZBTExJTkdERVRFQ1QsIGdwaW9fYml0LAoJCXRyaWdnZXIgJiBfX0lSUVRfRkFMRURHRSk7CgkvKiBGSVhNRTogUG9zc2libHkgZG8gJ3NldF9pcnFfaGFuZGxlcihqLCBkb19sZXZlbF9JUlEpJyBpZiBvbmx5IGxldmVsCgkgKiB0cmlnZ2VyaW5nIHJlcXVlc3RlZC4gKi8KfQoKc3RhdGljIGludCBfc2V0X2dwaW9fdHJpZ2dlcmluZyhzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbywgaW50IHRyaWdnZXIpCnsKCXZvaWQgX19pb21lbSAqcmVnID0gYmFuay0+YmFzZTsKCXUzMiBsID0gMDsKCglzd2l0Y2ggKGJhbmstPm1ldGhvZCkgewoJY2FzZSBNRVRIT0RfTVBVSU86CgkJcmVnICs9IE9NQVBfTVBVSU9fR1BJT19JTlRfRURHRTsKCQlsID0gX19yYXdfcmVhZGwocmVnKTsKCQlpZiAodHJpZ2dlciAmIF9fSVJRVF9SSVNFREdFKQoJCQlsIHw9IDEgPDwgZ3BpbzsKCQllbHNlIGlmICh0cmlnZ2VyICYgX19JUlFUX0ZBTEVER0UpCgkJCWwgJj0gfigxIDw8IGdwaW8pOwoJCWVsc2UKCQkJZ290byBiYWQ7CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzE1MTA6CgkJcmVnICs9IE9NQVAxNTEwX0dQSU9fSU5UX0NPTlRST0w7CgkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CgkJaWYgKHRyaWdnZXIgJiBfX0lSUVRfUklTRURHRSkKCQkJbCB8PSAxIDw8IGdwaW87CgkJZWxzZSBpZiAodHJpZ2dlciAmIF9fSVJRVF9GQUxFREdFKQoJCQlsICY9IH4oMSA8PCBncGlvKTsKCQllbHNlCgkJCWdvdG8gYmFkOwoJCWJyZWFrOwoJY2FzZSBNRVRIT0RfR1BJT18xNjEwOgoJCWlmIChncGlvICYgMHgwOCkKCQkJcmVnICs9IE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMjsKCQllbHNlCgkJCXJlZyArPSBPTUFQMTYxMF9HUElPX0VER0VfQ1RSTDE7CgkJZ3BpbyAmPSAweDA3OwoJCS8qIFdlIGFsbG93IG9ubHkgZWRnZSB0cmlnZ2VyaW5nLCBpLmUuIHR3byBsb3dlc3QgYml0cyAqLwoJCWlmICh0cmlnZ2VyICYgKF9fSVJRVF9MT1dMVkwgfCBfX0lSUVRfSElHSExWTCkpCgkJCUJVRygpOwoJCWwgPSBfX3Jhd19yZWFkbChyZWcpOwoJCWwgJj0gfigzIDw8IChncGlvIDw8IDEpKTsKCQlpZiAodHJpZ2dlciAmIF9fSVJRVF9SSVNFREdFKQoJCQlsIHw9IDIgPDwgKGdwaW8gPDwgMSk7CgkJaWYgKHRyaWdnZXIgJiBfX0lSUVRfRkFMRURHRSkKCQkJbCB8PSAxIDw8IChncGlvIDw8IDEpOwoJCWJyZWFrOwoJY2FzZSBNRVRIT0RfR1BJT183MzA6CgkJcmVnICs9IE9NQVA3MzBfR1BJT19JTlRfQ09OVFJPTDsKCQlsID0gX19yYXdfcmVhZGwocmVnKTsKCQlpZiAodHJpZ2dlciAmIF9fSVJRVF9SSVNFREdFKQoJCQlsIHw9IDEgPDwgZ3BpbzsKCQllbHNlIGlmICh0cmlnZ2VyICYgX19JUlFUX0ZBTEVER0UpCgkJCWwgJj0gfigxIDw8IGdwaW8pOwoJCWVsc2UKCQkJZ290byBiYWQ7CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzI0WFg6CgkJc2V0XzI0eHhfZ3Bpb190cmlnZ2VyaW5nKHJlZywgZ3BpbywgdHJpZ2dlcik7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUJVRygpOwoJCWdvdG8gYmFkOwoJfQoJX19yYXdfd3JpdGVsKGwsIHJlZyk7CglyZXR1cm4gMDsKYmFkOgoJcmV0dXJuIC1FSU5WQUw7Cn0KCnN0YXRpYyBpbnQgZ3Bpb19pcnFfdHlwZSh1bnNpZ25lZCBpcnEsIHVuc2lnbmVkIHR5cGUpCnsKCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7Cgl1bnNpZ25lZCBncGlvOwoJaW50IHJldHZhbDsKCglpZiAoaXJxID4gSUhfTVBVSU9fQkFTRSkKCQlncGlvID0gT01BUF9NUFVJTyhpcnEgLSBJSF9NUFVJT19CQVNFKTsKCWVsc2UKCQlncGlvID0gaXJxIC0gSUhfR1BJT19CQVNFOwoKCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKCQlyZXR1cm4gLUVJTlZBTDsKCglpZiAodHlwZSAmIElSUVRfUFJPQkUpCgkJcmV0dXJuIC1FSU5WQUw7CglpZiAoIWNwdV9pc19vbWFwMjR4eCgpICYmICh0eXBlICYgKF9fSVJRVF9MT1dMVkx8X19JUlFUX0hJR0hMVkwpKSkKCQlyZXR1cm4gLUVJTlZBTDsKCgliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKCXNwaW5fbG9jaygmYmFuay0+bG9jayk7CglyZXR2YWwgPSBfc2V0X2dwaW9fdHJpZ2dlcmluZyhiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgdHlwZSk7CglzcGluX3VubG9jaygmYmFuay0+bG9jayk7CglyZXR1cm4gcmV0dmFsOwp9CgpzdGF0aWMgdm9pZCBfY2xlYXJfZ3Bpb19pcnFiYW5rKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvX21hc2spCnsKCXZvaWQgX19pb21lbSAqcmVnID0gYmFuay0+YmFzZTsKCglzd2l0Y2ggKGJhbmstPm1ldGhvZCkgewoJY2FzZSBNRVRIT0RfTVBVSU86CgkJLyogTVBVSU8gaXJxc3RhdHVzIGlzIHJlc2V0IGJ5IHJlYWRpbmcgdGhlIHN0YXR1cyByZWdpc3RlciwKCQkgKiBzbyBkbyBub3RoaW5nIGhlcmUgKi8KCQlyZXR1cm47CgljYXNlIE1FVEhPRF9HUElPXzE1MTA6CgkJcmVnICs9IE9NQVAxNTEwX0dQSU9fSU5UX1NUQVRVUzsKCQlicmVhazsKCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKCQlyZWcgKz0gT01BUDE2MTBfR1BJT19JUlFTVEFUVVMxOwoJCWJyZWFrOwoJY2FzZSBNRVRIT0RfR1BJT183MzA6CgkJcmVnICs9IE9NQVA3MzBfR1BJT19JTlRfU1RBVFVTOwoJCWJyZWFrOwoJY2FzZSBNRVRIT0RfR1BJT18yNFhYOgoJCXJlZyArPSBPTUFQMjRYWF9HUElPX0lSUVNUQVRVUzE7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUJVRygpOwoJCXJldHVybjsKCX0KCV9fcmF3X3dyaXRlbChncGlvX21hc2ssIHJlZyk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBfY2xlYXJfZ3Bpb19pcnFzdGF0dXMoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8pCnsKCV9jbGVhcl9ncGlvX2lycWJhbmsoYmFuaywgMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSk7Cn0KCnN0YXRpYyB1MzIgX2dldF9ncGlvX2lycWJhbmtfbWFzayhzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rKQp7Cgl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2U7CglpbnQgaW52ID0gMDsKCXUzMiBsOwoJdTMyIG1hc2s7CgoJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKCWNhc2UgTUVUSE9EX01QVUlPOgoJCXJlZyArPSBPTUFQX01QVUlPX0dQSU9fTUFTS0lUOwoJCW1hc2sgPSAweGZmZmY7CgkJaW52ID0gMTsKCQlicmVhazsKCWNhc2UgTUVUSE9EX0dQSU9fMTUxMDoKCQlyZWcgKz0gT01BUDE1MTBfR1BJT19JTlRfTUFTSzsKCQltYXNrID0gMHhmZmZmOwoJCWludiA9IDE7CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzE2MTA6CgkJcmVnICs9IE9NQVAxNjEwX0dQSU9fSVJRRU5BQkxFMTsKCQltYXNrID0gMHhmZmZmOwoJCWJyZWFrOwoJY2FzZSBNRVRIT0RfR1BJT183MzA6CgkJcmVnICs9IE9NQVA3MzBfR1BJT19JTlRfTUFTSzsKCQltYXNrID0gMHhmZmZmZmZmZjsKCQlpbnYgPSAxOwoJCWJyZWFrOwoJY2FzZSBNRVRIT0RfR1BJT18yNFhYOgoJCXJlZyArPSBPTUFQMjRYWF9HUElPX0lSUUVOQUJMRTE7CgkJbWFzayA9IDB4ZmZmZmZmZmY7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUJVRygpOwoJCXJldHVybiAwOwoJfQoKCWwgPSBfX3Jhd19yZWFkbChyZWcpOwoJaWYgKGludikKCQlsID0gfmw7CglsICY9IG1hc2s7CglyZXR1cm4gbDsKfQoKc3RhdGljIHZvaWQgX2VuYWJsZV9ncGlvX2lycWJhbmsoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW9fbWFzaywgaW50IGVuYWJsZSkKewoJdm9pZCBfX2lvbWVtICpyZWcgPSBiYW5rLT5iYXNlOwoJdTMyIGw7CgoJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKCWNhc2UgTUVUSE9EX01QVUlPOgoJCXJlZyArPSBPTUFQX01QVUlPX0dQSU9fTUFTS0lUOwoJCWwgPSBfX3Jhd19yZWFkbChyZWcpOwoJCWlmIChlbmFibGUpCgkJCWwgJj0gfihncGlvX21hc2spOwoJCWVsc2UKCQkJbCB8PSBncGlvX21hc2s7CgkJYnJlYWs7CgljYXNlIE1FVEhPRF9HUElPXzE1MTA6CgkJcmVnICs9IE9NQVAxNTEwX0dQSU9fSU5UX01BU0s7CgkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CgkJaWYgKGVuYWJsZSkKCQkJbCAmPSB+KGdwaW9fbWFzayk7CgkJZWxzZQoJCQlsIHw9IGdwaW9fbWFzazsKCQlicmVhazsKCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKCQlpZiAoZW5hYmxlKQoJCQlyZWcgKz0gT01BUDE2MTBfR1BJT19TRVRfSVJRRU5BQkxFMTsKCQllbHNlCgkJCXJlZyArPSBPTUFQMTYxMF9HUElPX0NMRUFSX0lSUUVOQUJMRTE7CgkJbCA9IGdwaW9fbWFzazsKCQlicmVhazsKCWNhc2UgTUVUSE9EX0dQSU9fNzMwOgoJCXJlZyArPSBPTUFQNzMwX0dQSU9fSU5UX01BU0s7CgkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CgkJaWYgKGVuYWJsZSkKCQkJbCAmPSB+KGdwaW9fbWFzayk7CgkJZWxzZQoJCQlsIHw9IGdwaW9fbWFzazsKCQlicmVhazsKCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKCQlpZiAoZW5hYmxlKQoJCQlyZWcgKz0gT01BUDI0WFhfR1BJT19TRVRJUlFFTkFCTEUxOwoJCWVsc2UKCQkJcmVnICs9IE9NQVAyNFhYX0dQSU9fQ0xFQVJJUlFFTkFCTEUxOwoJCWwgPSBncGlvX21hc2s7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUJVRygpOwoJCXJldHVybjsKCX0KCV9fcmF3X3dyaXRlbChsLCByZWcpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgX3NldF9ncGlvX2lycWVuYWJsZShzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbywgaW50IGVuYWJsZSkKewoJX2VuYWJsZV9ncGlvX2lycWJhbmsoYmFuaywgMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSwgZW5hYmxlKTsKfQoKLyoKICogTm90ZSB0aGF0IEVOQVdBS0VVUCBuZWVkcyB0byBiZSBlbmFibGVkIGluIEdQSU9fU1lTQ09ORklHIHJlZ2lzdGVyLgogKiAxNTEwIGRvZXMgbm90IHNlZW0gdG8gaGF2ZSBhIHdha2UtdXAgcmVnaXN0ZXIuIElmIEpUQUcgaXMgY29ubmVjdGVkCiAqIHRvIHRoZSB0YXJnZXQsIHN5c3RlbSB3aWxsIHdha2UgdXAgYWx3YXlzIG9uIEdQSU8gZXZlbnRzLiBXaGlsZQogKiBzeXN0ZW0gaXMgcnVubmluZyBhbGwgcmVnaXN0ZXJlZCBHUElPIGludGVycnVwdHMgbmVlZCB0byBoYXZlIHdha2UtdXAKICogZW5hYmxlZC4gV2hlbiBzeXN0ZW0gaXMgc3VzcGVuZGVkLCBvbmx5IHNlbGVjdGVkIEdQSU8gaW50ZXJydXB0cyBuZWVkCiAqIHRvIGhhdmUgd2FrZS11cCBlbmFibGVkLgogKi8Kc3RhdGljIGludCBfc2V0X2dwaW9fd2FrZXVwKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvLCBpbnQgZW5hYmxlKQp7Cglzd2l0Y2ggKGJhbmstPm1ldGhvZCkgewoJY2FzZSBNRVRIT0RfR1BJT18xNjEwOgoJY2FzZSBNRVRIT0RfR1BJT18yNFhYOgoJCXNwaW5fbG9jaygmYmFuay0+bG9jayk7CgkJaWYgKGVuYWJsZSkKCQkJYmFuay0+c3VzcGVuZF93YWtldXAgfD0gKDEgPDwgZ3Bpbyk7CgkJZWxzZQoJCQliYW5rLT5zdXNwZW5kX3dha2V1cCAmPSB+KDEgPDwgZ3Bpbyk7CgkJc3Bpbl91bmxvY2soJmJhbmstPmxvY2spOwoJCXJldHVybiAwOwoJZGVmYXVsdDoKCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IGVuYWJsZSBHUElPIHdha2V1cCBmb3IgbWV0aG9kICVpXG4iLAoJCSAgICAgICBiYW5rLT5tZXRob2QpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgovKiBVc2UgZGlzYWJsZV9pcnFfd2FrZSgpIGFuZCBlbmFibGVfaXJxX3dha2UoKSBmdW5jdGlvbnMgZnJvbSBkcml2ZXJzICovCnN0YXRpYyBpbnQgZ3Bpb193YWtlX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZW5hYmxlKQp7Cgl1bnNpZ25lZCBpbnQgZ3BpbyA9IGlycSAtIElIX0dQSU9fQkFTRTsKCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7CglpbnQgcmV0dmFsOwoKCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKCQlyZXR1cm4gLUVOT0RFVjsKCWJhbmsgPSBnZXRfZ3Bpb19iYW5rKGdwaW8pOwoJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKCXJldHZhbCA9IF9zZXRfZ3Bpb193YWtldXAoYmFuaywgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIGVuYWJsZSk7CglzcGluX3VubG9jaygmYmFuay0+bG9jayk7CgoJcmV0dXJuIHJldHZhbDsKfQoKaW50IG9tYXBfcmVxdWVzdF9ncGlvKGludCBncGlvKQp7CglzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOwoKCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKCQlyZXR1cm4gLUVJTlZBTDsKCgliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKCXNwaW5fbG9jaygmYmFuay0+bG9jayk7CglpZiAodW5saWtlbHkoYmFuay0+cmVzZXJ2ZWRfbWFwICYgKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbykpKSkgewoJCXByaW50ayhLRVJOX0VSUiAib21hcC1ncGlvOiBHUElPICVkIGlzIGFscmVhZHkgcmVzZXJ2ZWQhXG4iLCBncGlvKTsKCQlkdW1wX3N0YWNrKCk7CgkJc3Bpbl91bmxvY2soJmJhbmstPmxvY2spOwoJCXJldHVybiAtMTsKCX0KCWJhbmstPnJlc2VydmVkX21hcCB8PSAoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSk7CgoJLyogU2V0IHRyaWdnZXIgdG8gbm9uZS4gWW91IG5lZWQgdG8gZW5hYmxlIHRoZSB0cmlnZ2VyIGFmdGVyIHJlcXVlc3RfaXJxICovCglfc2V0X2dwaW9fdHJpZ2dlcmluZyhiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgSVJRVF9OT0VER0UpOwoKI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNVhYCglpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzE1MTApIHsKCQl2b2lkIF9faW9tZW0gKnJlZzsKCgkJLyogQ2xhaW0gdGhlIHBpbiBmb3IgTVBVICovCgkJcmVnID0gYmFuay0+YmFzZSArIE9NQVAxNTEwX0dQSU9fUElOX0NPTlRST0w7CgkJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKHJlZykgfCAoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSksIHJlZyk7Cgl9CiNlbmRpZgojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE2WFgKCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMTYxMCkgewoJCS8qIEVuYWJsZSB3YWtlLXVwIGR1cmluZyBpZGxlIGZvciBkeW5hbWljIHRpY2sgKi8KCQl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX1NFVF9XQUtFVVBFTkE7CgkJX19yYXdfd3JpdGVsKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIHJlZyk7Cgl9CiNlbmRpZgojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMjRYWCkgewoJCS8qIEVuYWJsZSB3YWtlLXVwIGR1cmluZyBpZGxlIGZvciBkeW5hbWljIHRpY2sgKi8KCQl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2UgKyBPTUFQMjRYWF9HUElPX1NFVFdLVUVOQTsKCQlfX3Jhd193cml0ZWwoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSwgcmVnKTsKCX0KI2VuZGlmCglzcGluX3VubG9jaygmYmFuay0+bG9jayk7CgoJcmV0dXJuIDA7Cn0KCnZvaWQgb21hcF9mcmVlX2dwaW8oaW50IGdwaW8pCnsKCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7CgoJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQoJCXJldHVybjsKCWJhbmsgPSBnZXRfZ3Bpb19iYW5rKGdwaW8pOwoJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKCWlmICh1bmxpa2VseSghKGJhbmstPnJlc2VydmVkX21hcCAmICgxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKSkpKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJvbWFwLWdwaW86IEdQSU8gJWQgd2Fzbid0IHJlc2VydmVkIVxuIiwgZ3Bpbyk7CgkJZHVtcF9zdGFjaygpOwoJCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKCQlyZXR1cm47Cgl9CiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAoJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNjEwKSB7CgkJLyogRGlzYWJsZSB3YWtlLXVwIGR1cmluZyBpZGxlIGZvciBkeW5hbWljIHRpY2sgKi8KCQl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX0NMRUFSX1dBS0VVUEVOQTsKCQlfX3Jhd193cml0ZWwoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSwgcmVnKTsKCX0KI2VuZGlmCiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAoJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18yNFhYKSB7CgkJLyogRGlzYWJsZSB3YWtlLXVwIGR1cmluZyBpZGxlIGZvciBkeW5hbWljIHRpY2sgKi8KCQl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2UgKyBPTUFQMjRYWF9HUElPX0NMRUFSV0tVRU5BOwoJCV9fcmF3X3dyaXRlbCgxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pLCByZWcpOwoJfQojZW5kaWYKCWJhbmstPnJlc2VydmVkX21hcCAmPSB+KDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbykpOwoJX3NldF9ncGlvX2RpcmVjdGlvbihiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgMSk7Cglfc2V0X2dwaW9faXJxZW5hYmxlKGJhbmssIGdwaW8sIDApOwoJX2NsZWFyX2dwaW9faXJxc3RhdHVzKGJhbmssIGdwaW8pOwoJc3Bpbl91bmxvY2soJmJhbmstPmxvY2spOwp9CgovKgogKiBXZSBuZWVkIHRvIHVubWFzayB0aGUgR1BJTyBiYW5rIGludGVycnVwdCBhcyBzb29uIGFzIHBvc3NpYmxlIHRvCiAqIGF2b2lkIG1pc3NpbmcgR1BJTyBpbnRlcnJ1cHRzIGZvciBvdGhlciBsaW5lcyBpbiB0aGUgYmFuay4KICogVGhlbiB3ZSBuZWVkIHRvIG1hc2stcmVhZC1jbGVhci11bm1hc2sgdGhlIHRyaWdnZXJlZCBHUElPIGxpbmVzCiAqIGluIHRoZSBiYW5rIHRvIGF2b2lkIG1pc3NpbmcgbmVzdGVkIGludGVycnVwdHMgZm9yIGEgR1BJTyBsaW5lLgogKiBJZiB3ZSB3YWl0IHRvIHVubWFzayBpbmRpdmlkdWFsIEdQSU8gbGluZXMgaW4gdGhlIGJhbmsgYWZ0ZXIgdGhlCiAqIGxpbmUncyBpbnRlcnJ1cHQgaGFuZGxlciBoYXMgYmVlbiBydW4sIHdlIG1heSBtaXNzIHNvbWUgbmVzdGVkCiAqIGludGVycnVwdHMuCiAqLwpzdGF0aWMgdm9pZCBncGlvX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjLAoJCQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQp7Cgl2b2lkIF9faW9tZW0gKmlzcl9yZWcgPSBOVUxMOwoJdTMyIGlzcjsKCXVuc2lnbmVkIGludCBncGlvX2lycTsKCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7Cgl1MzIgcmV0cmlnZ2VyID0gMDsKCWludCB1bm1hc2tlZCA9IDA7CgoJZGVzYy0+Y2hpcC0+YWNrKGlycSk7CgoJYmFuayA9IGdldF9pcnFfZGF0YShpcnEpOwoJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfTVBVSU8pCgkJaXNyX3JlZyA9IGJhbmstPmJhc2UgKyBPTUFQX01QVUlPX0dQSU9fSU5UOwojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMTUxMCkKCQlpc3JfcmVnID0gYmFuay0+YmFzZSArIE9NQVAxNTEwX0dQSU9fSU5UX1NUQVRVUzsKI2VuZGlmCiNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQoJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNjEwKQoJCWlzcl9yZWcgPSBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19JUlFTVEFUVVMxOwojZW5kaWYKI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fNzMwKQoJCWlzcl9yZWcgPSBiYW5rLT5iYXNlICsgT01BUDczMF9HUElPX0lOVF9TVEFUVVM7CiNlbmRpZgojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMjRYWCkKCQlpc3JfcmVnID0gYmFuay0+YmFzZSArIE9NQVAyNFhYX0dQSU9fSVJRU1RBVFVTMTsKI2VuZGlmCgl3aGlsZSgxKSB7CgkJdTMyIGlzcl9zYXZlZCwgbGV2ZWxfbWFzayA9IDA7CgkJdTMyIGVuYWJsZWQ7CgoJCWVuYWJsZWQgPSBfZ2V0X2dwaW9faXJxYmFua19tYXNrKGJhbmspOwoJCWlzcl9zYXZlZCA9IGlzciA9IF9fcmF3X3JlYWRsKGlzcl9yZWcpICYgZW5hYmxlZDsKCgkJaWYgKGNwdV9pc19vbWFwMTV4eCgpICYmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX01QVUlPKSkKCQkJaXNyICY9IDB4MDAwMGZmZmY7CgoJCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgewoJCQlsZXZlbF9tYXNrID0KCQkJCV9fcmF3X3JlYWRsKGJhbmstPmJhc2UgKwoJCQkJCU9NQVAyNFhYX0dQSU9fTEVWRUxERVRFQ1QwKSB8CgkJCQlfX3Jhd19yZWFkbChiYW5rLT5iYXNlICsKCQkJCQlPTUFQMjRYWF9HUElPX0xFVkVMREVURUNUMSk7CgkJCWxldmVsX21hc2sgJj0gZW5hYmxlZDsKCQl9CgoJCS8qIGNsZWFyIGVkZ2Ugc2Vuc2l0aXZlIGludGVycnVwdHMgYmVmb3JlIGhhbmRsZXIocykgYXJlCgkJY2FsbGVkIHNvIHRoYXQgd2UgZG9uJ3QgbWlzcyBhbnkgaW50ZXJydXB0IG9jY3VycmVkIHdoaWxlCgkJZXhlY3V0aW5nIHRoZW0gKi8KCQlfZW5hYmxlX2dwaW9faXJxYmFuayhiYW5rLCBpc3Jfc2F2ZWQgJiB+bGV2ZWxfbWFzaywgMCk7CgkJX2NsZWFyX2dwaW9faXJxYmFuayhiYW5rLCBpc3Jfc2F2ZWQgJiB+bGV2ZWxfbWFzayk7CgkJX2VuYWJsZV9ncGlvX2lycWJhbmsoYmFuaywgaXNyX3NhdmVkICYgfmxldmVsX21hc2ssIDEpOwoKCQkvKiBpZiB0aGVyZSBpcyBvbmx5IGVkZ2Ugc2Vuc2l0aXZlIEdQSU8gcGluIGludGVycnVwdHMKCQljb25maWd1cmVkLCB3ZSBjb3VsZCB1bm1hc2sgR1BJTyBiYW5rIGludGVycnVwdCBpbW1lZGlhdGVseSAqLwoJCWlmICghbGV2ZWxfbWFzayAmJiAhdW5tYXNrZWQpIHsKCQkJdW5tYXNrZWQgPSAxOwoJCQlkZXNjLT5jaGlwLT51bm1hc2soaXJxKTsKCQl9CgoJCWlzciB8PSByZXRyaWdnZXI7CgkJcmV0cmlnZ2VyID0gMDsKCQlpZiAoIWlzcikKCQkJYnJlYWs7CgoJCWdwaW9faXJxID0gYmFuay0+dmlydHVhbF9pcnFfc3RhcnQ7CgkJZm9yICg7IGlzciAhPSAwOyBpc3IgPj49IDEsIGdwaW9faXJxKyspIHsKCQkJc3RydWN0IGlycWRlc2MgKmQ7CgkJCWludCBpcnFfbWFzazsKCQkJaWYgKCEoaXNyICYgMSkpCgkJCQljb250aW51ZTsKCQkJZCA9IGlycV9kZXNjICsgZ3Bpb19pcnE7CgkJCS8qIERvbid0IHJ1biB0aGUgaGFuZGxlciBpZiBpdCdzIGFscmVhZHkgcnVubmluZwoJCQkgKiBvciB3YXMgZGlzYWJsZWQgbGF6ZWx5LgoJCQkgKi8KCQkJaWYgKHVubGlrZWx5KChkLT5kZXB0aCB8fAoJCQkJICAgICAgKGQtPnN0YXR1cyAmIElSUV9JTlBST0dSRVNTKSkpKSB7CgkJCQlpcnFfbWFzayA9IDEgPDwKCQkJCQkoZ3Bpb19pcnEgLSBiYW5rLT52aXJ0dWFsX2lycV9zdGFydCk7CgkJCQkvKiBUaGUgdW5tYXNraW5nIHdpbGwgYmUgZG9uZSBieQoJCQkJICogZW5hYmxlX2lycSBpbiBjYXNlIGl0IGlzIGRpc2FibGVkIG9yCgkJCQkgKiBhZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgaGFuZGxlciBpZgoJCQkJICogaXQncyBhbHJlYWR5IHJ1bm5pbmcuCgkJCQkgKi8KCQkJCV9lbmFibGVfZ3Bpb19pcnFiYW5rKGJhbmssIGlycV9tYXNrLCAwKTsKCQkJCWlmICghZC0+ZGVwdGgpIHsKCQkJCQkvKiBMZXZlbCB0cmlnZ2VyZWQgaW50ZXJydXB0cwoJCQkJCSAqIHdvbid0IGV2ZXIgYmUgcmVlbnRlcmVkCgkJCQkJICovCgkJCQkJQlVHX09OKGxldmVsX21hc2sgJiBpcnFfbWFzayk7CgkJCQkJZC0+c3RhdHVzIHw9IElSUV9QRU5ESU5HOwoJCQkJfQoJCQkJY29udGludWU7CgkJCX0KCgkJCWRlc2NfaGFuZGxlX2lycShncGlvX2lycSwgZCwgcmVncyk7CgoJCQlpZiAodW5saWtlbHkoKGQtPnN0YXR1cyAmIElSUV9QRU5ESU5HKSAmJiAhZC0+ZGVwdGgpKSB7CgkJCQlpcnFfbWFzayA9IDEgPDwKCQkJCQkoZ3Bpb19pcnEgLSBiYW5rLT52aXJ0dWFsX2lycV9zdGFydCk7CgkJCQlkLT5zdGF0dXMgJj0gfklSUV9QRU5ESU5HOwoJCQkJX2VuYWJsZV9ncGlvX2lycWJhbmsoYmFuaywgaXJxX21hc2ssIDEpOwoJCQkJcmV0cmlnZ2VyIHw9IGlycV9tYXNrOwoJCQl9CgkJfQoKCQlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKCQkJLyogY2xlYXIgbGV2ZWwgc2Vuc2l0aXZlIGludGVycnVwdHMgYWZ0ZXIgaGFuZGxlcihzKSAqLwoJCQlfZW5hYmxlX2dwaW9faXJxYmFuayhiYW5rLCBpc3Jfc2F2ZWQgJiBsZXZlbF9tYXNrLCAwKTsKCQkJX2NsZWFyX2dwaW9faXJxYmFuayhiYW5rLCBpc3Jfc2F2ZWQgJiBsZXZlbF9tYXNrKTsKCQkJX2VuYWJsZV9ncGlvX2lycWJhbmsoYmFuaywgaXNyX3NhdmVkICYgbGV2ZWxfbWFzaywgMSk7CgkJfQoKCX0KCS8qIGlmIGJhbmsgaGFzIGFueSBsZXZlbCBzZW5zaXRpdmUgR1BJTyBwaW4gaW50ZXJydXB0Cgljb25maWd1cmVkLCB3ZSBtdXN0IHVubWFzayB0aGUgYmFuayBpbnRlcnJ1cHQgb25seSBhZnRlcgoJaGFuZGxlcihzKSBhcmUgZXhlY3V0ZWQgaW4gb3JkZXIgdG8gYXZvaWQgc3B1cmlvdXMgYmFuawoJaW50ZXJydXB0ICovCglpZiAoIXVubWFza2VkKQoJCWRlc2MtPmNoaXAtPnVubWFzayhpcnEpOwoKfQoKc3RhdGljIHZvaWQgZ3Bpb19hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCnsKCXVuc2lnbmVkIGludCBncGlvID0gaXJxIC0gSUhfR1BJT19CQVNFOwoJc3RydWN0IGdwaW9fYmFuayAqYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7CgoJX2NsZWFyX2dwaW9faXJxc3RhdHVzKGJhbmssIGdwaW8pOwp9CgpzdGF0aWMgdm9pZCBncGlvX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCnsKCXVuc2lnbmVkIGludCBncGlvID0gaXJxIC0gSUhfR1BJT19CQVNFOwoJc3RydWN0IGdwaW9fYmFuayAqYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7CgoJX3NldF9ncGlvX2lycWVuYWJsZShiYW5rLCBncGlvLCAwKTsKfQoKc3RhdGljIHZvaWQgZ3Bpb191bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCnsKCXVuc2lnbmVkIGludCBncGlvID0gaXJxIC0gSUhfR1BJT19CQVNFOwoJdW5zaWduZWQgaW50IGdwaW9faWR4ID0gZ2V0X2dwaW9faW5kZXgoZ3Bpbyk7CglzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKCglfc2V0X2dwaW9faXJxZW5hYmxlKGJhbmssIGdwaW9faWR4LCAxKTsKfQoKc3RhdGljIHZvaWQgbXB1aW9fYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQp7CgkvKiBUaGUgSVNSIGlzIHJlc2V0IGF1dG9tYXRpY2FsbHksIHNvIGRvIG5vdGhpbmcgaGVyZS4gKi8KfQoKc3RhdGljIHZvaWQgbXB1aW9fbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKewoJdW5zaWduZWQgaW50IGdwaW8gPSBPTUFQX01QVUlPKGlycSAtIElIX01QVUlPX0JBU0UpOwoJc3RydWN0IGdwaW9fYmFuayAqYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7CgoJX3NldF9ncGlvX2lycWVuYWJsZShiYW5rLCBncGlvLCAwKTsKfQoKc3RhdGljIHZvaWQgbXB1aW9fdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQp7Cgl1bnNpZ25lZCBpbnQgZ3BpbyA9IE9NQVBfTVBVSU8oaXJxIC0gSUhfTVBVSU9fQkFTRSk7CglzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKCglfc2V0X2dwaW9faXJxZW5hYmxlKGJhbmssIGdwaW8sIDEpOwp9CgpzdGF0aWMgc3RydWN0IGlycWNoaXAgZ3Bpb19pcnFfY2hpcCA9IHsKCS5hY2sJCT0gZ3Bpb19hY2tfaXJxLAoJLm1hc2sJCT0gZ3Bpb19tYXNrX2lycSwKCS51bm1hc2sJCT0gZ3Bpb191bm1hc2tfaXJxLAoJLnNldF90eXBlCT0gZ3Bpb19pcnFfdHlwZSwKCS5zZXRfd2FrZQk9IGdwaW9fd2FrZV9lbmFibGUsCn07CgpzdGF0aWMgc3RydWN0IGlycWNoaXAgbXB1aW9faXJxX2NoaXAgPSB7CgkuYWNrCT0gbXB1aW9fYWNrX2lycSwKCS5tYXNrCT0gbXB1aW9fbWFza19pcnEsCgkudW5tYXNrID0gbXB1aW9fdW5tYXNrX2lycQp9OwoKc3RhdGljIGludCBpbml0aWFsaXplZDsKc3RhdGljIHN0cnVjdCBjbGsgKiBncGlvX2ljazsKc3RhdGljIHN0cnVjdCBjbGsgKiBncGlvX2ZjazsKCnN0YXRpYyBpbnQgX19pbml0IF9vbWFwX2dwaW9faW5pdCh2b2lkKQp7CglpbnQgaTsKCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7CgoJaW5pdGlhbGl6ZWQgPSAxOwoKCWlmIChjcHVfaXNfb21hcDE1eHgoKSkgewoJCWdwaW9faWNrID0gY2xrX2dldChOVUxMLCAiYXJtX2dwaW9fY2siKTsKCQlpZiAoSVNfRVJSKGdwaW9faWNrKSkKCQkJcHJpbnRrKCJDb3VsZCBub3QgZ2V0IGFybV9ncGlvX2NrXG4iKTsKCQllbHNlCgkJCWNsa19lbmFibGUoZ3Bpb19pY2spOwoJfQoJaWYgKGNwdV9pc19vbWFwMjR4eCgpKSB7CgkJZ3Bpb19pY2sgPSBjbGtfZ2V0KE5VTEwsICJncGlvc19pY2siKTsKCQlpZiAoSVNfRVJSKGdwaW9faWNrKSkKCQkJcHJpbnRrKCJDb3VsZCBub3QgZ2V0IGdwaW9zX2lja1xuIik7CgkJZWxzZQoJCQljbGtfZW5hYmxlKGdwaW9faWNrKTsKCQlncGlvX2ZjayA9IGNsa19nZXQoTlVMTCwgImdwaW9zX2ZjayIpOwoJCWlmIChJU19FUlIoZ3Bpb19pY2spKQoJCQlwcmludGsoIkNvdWxkIG5vdCBnZXQgZ3Bpb3NfZmNrXG4iKTsKCQllbHNlCgkJCWNsa19lbmFibGUoZ3Bpb19mY2spOwoJfQoKI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNVhYCglpZiAoY3B1X2lzX29tYXAxNXh4KCkpIHsKCQlwcmludGsoS0VSTl9JTkZPICJPTUFQMTUxMCBHUElPIGhhcmR3YXJlXG4iKTsKCQlncGlvX2JhbmtfY291bnQgPSAyOwoJCWdwaW9fYmFuayA9IGdwaW9fYmFua18xNTEwOwoJfQojZW5kaWYKI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCglpZiAoY3B1X2lzX29tYXAxNnh4KCkpIHsKCQl1MzIgcmV2OwoKCQlncGlvX2JhbmtfY291bnQgPSA1OwoJCWdwaW9fYmFuayA9IGdwaW9fYmFua18xNjEwOwoJCXJldiA9IG9tYXBfcmVhZHcoZ3Bpb19iYW5rWzFdLmJhc2UgKyBPTUFQMTYxMF9HUElPX1JFVklTSU9OKTsKCQlwcmludGsoS0VSTl9JTkZPICJPTUFQIEdQSU8gaGFyZHdhcmUgdmVyc2lvbiAlZC4lZFxuIiwKCQkgICAgICAgKHJldiA+PiA0KSAmIDB4MGYsIHJldiAmIDB4MGYpOwoJfQojZW5kaWYKI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKCWlmIChjcHVfaXNfb21hcDczMCgpKSB7CgkJcHJpbnRrKEtFUk5fSU5GTyAiT01BUDczMCBHUElPIGhhcmR3YXJlXG4iKTsKCQlncGlvX2JhbmtfY291bnQgPSA3OwoJCWdwaW9fYmFuayA9IGdwaW9fYmFua183MzA7Cgl9CiNlbmRpZgojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgewoJCWludCByZXY7CgoJCWdwaW9fYmFua19jb3VudCA9IDQ7CgkJZ3Bpb19iYW5rID0gZ3Bpb19iYW5rXzI0eHg7CgkJcmV2ID0gb21hcF9yZWFkbChncGlvX2JhbmtbMF0uYmFzZSArIE9NQVAyNFhYX0dQSU9fUkVWSVNJT04pOwoJCXByaW50ayhLRVJOX0lORk8gIk9NQVAyNHh4IEdQSU8gaGFyZHdhcmUgdmVyc2lvbiAlZC4lZFxuIiwKCQkJKHJldiA+PiA0KSAmIDB4MGYsIHJldiAmIDB4MGYpOwoJfQojZW5kaWYKCWZvciAoaSA9IDA7IGkgPCBncGlvX2JhbmtfY291bnQ7IGkrKykgewoJCWludCBqLCBncGlvX2NvdW50ID0gMTY7CgoJCWJhbmsgPSAmZ3Bpb19iYW5rW2ldOwoJCWJhbmstPnJlc2VydmVkX21hcCA9IDA7CgkJYmFuay0+YmFzZSA9IElPX0FERFJFU1MoYmFuay0+YmFzZSk7CgkJc3Bpbl9sb2NrX2luaXQoJmJhbmstPmxvY2spOwoJCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX01QVUlPKSB7CgkJCW9tYXBfd3JpdGV3KDB4RkZGRiwgT01BUF9NUFVJT19CQVNFICsgT01BUF9NUFVJT19HUElPX01BU0tJVCk7CgkJfQojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKCQlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzE1MTApIHsKCQkJX19yYXdfd3JpdGV3KDB4ZmZmZiwgYmFuay0+YmFzZSArIE9NQVAxNTEwX0dQSU9fSU5UX01BU0spOwoJCQlfX3Jhd193cml0ZXcoMHgwMDAwLCBiYW5rLT5iYXNlICsgT01BUDE1MTBfR1BJT19JTlRfU1RBVFVTKTsKCQl9CiNlbmRpZgojaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKCQlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzE2MTApIHsKCQkJX19yYXdfd3JpdGV3KDB4MDAwMCwgYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fSVJRRU5BQkxFMSk7CgkJCV9fcmF3X3dyaXRldygweGZmZmYsIGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX0lSUVNUQVRVUzEpOwoJCQlfX3Jhd193cml0ZXcoMHgwMDE0LCBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19TWVNDT05GSUcpOwoJCX0KI2VuZGlmCiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCgkJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT183MzApIHsKCQkJX19yYXdfd3JpdGVsKDB4ZmZmZmZmZmYsIGJhbmstPmJhc2UgKyBPTUFQNzMwX0dQSU9fSU5UX01BU0spOwoJCQlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgYmFuay0+YmFzZSArIE9NQVA3MzBfR1BJT19JTlRfU1RBVFVTKTsKCgkJCWdwaW9fY291bnQgPSAzMjsgLyogNzMwIGhhcyAzMi1iaXQgR1BJT3MgKi8KCQl9CiNlbmRpZgojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKCQlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzI0WFgpIHsKCQkJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDAsIGJhbmstPmJhc2UgKyBPTUFQMjRYWF9HUElPX0lSUUVOQUJMRTEpOwoJCQlfX3Jhd193cml0ZWwoMHhmZmZmZmZmZiwgYmFuay0+YmFzZSArIE9NQVAyNFhYX0dQSU9fSVJRU1RBVFVTMSk7CgoJCQlncGlvX2NvdW50ID0gMzI7CgkJfQojZW5kaWYKCQlmb3IgKGogPSBiYW5rLT52aXJ0dWFsX2lycV9zdGFydDsKCQkgICAgIGogPCBiYW5rLT52aXJ0dWFsX2lycV9zdGFydCArIGdwaW9fY291bnQ7IGorKykgewoJCQlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9NUFVJTykKCQkJCXNldF9pcnFfY2hpcChqLCAmbXB1aW9faXJxX2NoaXApOwoJCQllbHNlCgkJCQlzZXRfaXJxX2NoaXAoaiwgJmdwaW9faXJxX2NoaXApOwoJCQlzZXRfaXJxX2hhbmRsZXIoaiwgZG9fc2ltcGxlX0lSUSk7CgkJCXNldF9pcnFfZmxhZ3MoaiwgSVJRRl9WQUxJRCk7CgkJfQoJCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGJhbmstPmlycSwgZ3Bpb19pcnFfaGFuZGxlcik7CgkJc2V0X2lycV9kYXRhKGJhbmstPmlycSwgYmFuayk7Cgl9CgoJLyogRW5hYmxlIHN5c3RlbSBjbG9jayBmb3IgR1BJTyBtb2R1bGUuCgkgKiBUaGUgQ0FNX0NMS19DVFJMICppcyogcmVhbGx5IHRoZSByaWdodCBwbGFjZS4gKi8KCWlmIChjcHVfaXNfb21hcDE2eHgoKSkKCQlvbWFwX3dyaXRlbChvbWFwX3JlYWRsKFVMUERfQ0FNX0NMS19DVFJMKSB8IDB4MDQsIFVMUERfQ0FNX0NMS19DVFJMKTsKCglyZXR1cm4gMDsKfQoKI2lmIGRlZmluZWQgKENPTkZJR19BUkNIX09NQVAxNlhYKSB8fCBkZWZpbmVkIChDT05GSUdfQVJDSF9PTUFQMjRYWCkKc3RhdGljIGludCBvbWFwX2dwaW9fc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKewoJaW50IGk7CgoJaWYgKCFjcHVfaXNfb21hcDI0eHgoKSAmJiAhY3B1X2lzX29tYXAxNnh4KCkpCgkJcmV0dXJuIDA7CgoJZm9yIChpID0gMDsgaSA8IGdwaW9fYmFua19jb3VudDsgaSsrKSB7CgkJc3RydWN0IGdwaW9fYmFuayAqYmFuayA9ICZncGlvX2JhbmtbaV07CgkJdm9pZCBfX2lvbWVtICp3YWtlX3N0YXR1czsKCQl2b2lkIF9faW9tZW0gKndha2VfY2xlYXI7CgkJdm9pZCBfX2lvbWVtICp3YWtlX3NldDsKCgkJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKCQljYXNlIE1FVEhPRF9HUElPXzE2MTA6CgkJCXdha2Vfc3RhdHVzID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fV0FLRVVQRU5BQkxFOwoJCQl3YWtlX2NsZWFyID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fQ0xFQVJfV0FLRVVQRU5BOwoJCQl3YWtlX3NldCA9IGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX1NFVF9XQUtFVVBFTkE7CgkJCWJyZWFrOwoJCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKCQkJd2FrZV9zdGF0dXMgPSBiYW5rLT5iYXNlICsgT01BUDI0WFhfR1BJT19TRVRXS1VFTkE7CgkJCXdha2VfY2xlYXIgPSBiYW5rLT5iYXNlICsgT01BUDI0WFhfR1BJT19DTEVBUldLVUVOQTsKCQkJd2FrZV9zZXQgPSBiYW5rLT5iYXNlICsgT01BUDI0WFhfR1BJT19TRVRXS1VFTkE7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWNvbnRpbnVlOwoJCX0KCgkJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKCQliYW5rLT5zYXZlZF93YWtldXAgPSBfX3Jhd19yZWFkbCh3YWtlX3N0YXR1cyk7CgkJX19yYXdfd3JpdGVsKDB4ZmZmZmZmZmYsIHdha2VfY2xlYXIpOwoJCV9fcmF3X3dyaXRlbChiYW5rLT5zdXNwZW5kX3dha2V1cCwgd2FrZV9zZXQpOwoJCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBvbWFwX2dwaW9fcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCnsKCWludCBpOwoKCWlmICghY3B1X2lzX29tYXAyNHh4KCkgJiYgIWNwdV9pc19vbWFwMTZ4eCgpKQoJCXJldHVybiAwOwoKCWZvciAoaSA9IDA7IGkgPCBncGlvX2JhbmtfY291bnQ7IGkrKykgewoJCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSAmZ3Bpb19iYW5rW2ldOwoJCXZvaWQgX19pb21lbSAqd2FrZV9jbGVhcjsKCQl2b2lkIF9faW9tZW0gKndha2Vfc2V0OwoKCQlzd2l0Y2ggKGJhbmstPm1ldGhvZCkgewoJCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKCQkJd2FrZV9jbGVhciA9IGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX0NMRUFSX1dBS0VVUEVOQTsKCQkJd2FrZV9zZXQgPSBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19TRVRfV0FLRVVQRU5BOwoJCQlicmVhazsKCQljYXNlIE1FVEhPRF9HUElPXzI0WFg6CgkJCXdha2VfY2xlYXIgPSBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19DTEVBUl9XQUtFVVBFTkE7CgkJCXdha2Vfc2V0ID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fU0VUX1dBS0VVUEVOQTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJY29udGludWU7CgkJfQoKCQlzcGluX2xvY2soJmJhbmstPmxvY2spOwoJCV9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCB3YWtlX2NsZWFyKTsKCQlfX3Jhd193cml0ZWwoYmFuay0+c2F2ZWRfd2FrZXVwLCB3YWtlX3NldCk7CgkJc3Bpbl91bmxvY2soJmJhbmstPmxvY2spOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBvbWFwX2dwaW9fc3lzY2xhc3MgPSB7CglzZXRfa3NldF9uYW1lKCJncGlvIiksCgkuc3VzcGVuZAk9IG9tYXBfZ3Bpb19zdXNwZW5kLAoJLnJlc3VtZQkJPSBvbWFwX2dwaW9fcmVzdW1lLAp9OwoKc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIG9tYXBfZ3Bpb19kZXZpY2UgPSB7CgkuaWQJCT0gMCwKCS5jbHMJCT0gJm9tYXBfZ3Bpb19zeXNjbGFzcywKfTsKI2VuZGlmCgovKgogKiBUaGlzIG1heSBnZXQgY2FsbGVkIGVhcmx5IGZyb20gYm9hcmQgc3BlY2lmaWMgaW5pdAogKiBmb3IgYm9hcmRzIHRoYXQgaGF2ZSBpbnRlcnJ1cHRzIHJvdXRlZCB2aWEgRlBHQS4KICovCmludCBvbWFwX2dwaW9faW5pdCh2b2lkKQp7CglpZiAoIWluaXRpYWxpemVkKQoJCXJldHVybiBfb21hcF9ncGlvX2luaXQoKTsKCWVsc2UKCQlyZXR1cm4gMDsKfQoKc3RhdGljIGludCBfX2luaXQgb21hcF9ncGlvX3N5c2luaXQodm9pZCkKewoJaW50IHJldCA9IDA7CgoJaWYgKCFpbml0aWFsaXplZCkKCQlyZXQgPSBfb21hcF9ncGlvX2luaXQoKTsKCiNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNFhYKQoJaWYgKGNwdV9pc19vbWFwMTZ4eCgpIHx8IGNwdV9pc19vbWFwMjR4eCgpKSB7CgkJaWYgKHJldCA9PSAwKSB7CgkJCXJldCA9IHN5c2Rldl9jbGFzc19yZWdpc3Rlcigmb21hcF9ncGlvX3N5c2NsYXNzKTsKCQkJaWYgKHJldCA9PSAwKQoJCQkJcmV0ID0gc3lzZGV2X3JlZ2lzdGVyKCZvbWFwX2dwaW9fZGV2aWNlKTsKCQl9Cgl9CiNlbmRpZgoKCXJldHVybiByZXQ7Cn0KCkVYUE9SVF9TWU1CT0wob21hcF9yZXF1ZXN0X2dwaW8pOwpFWFBPUlRfU1lNQk9MKG9tYXBfZnJlZV9ncGlvKTsKRVhQT1JUX1NZTUJPTChvbWFwX3NldF9ncGlvX2RpcmVjdGlvbik7CkVYUE9SVF9TWU1CT0wob21hcF9zZXRfZ3Bpb19kYXRhb3V0KTsKRVhQT1JUX1NZTUJPTChvbWFwX2dldF9ncGlvX2RhdGFpbik7CgphcmNoX2luaXRjYWxsKG9tYXBfZ3Bpb19zeXNpbml0KTsK