LyoqCiAqICRJZDogcGhyYW0uYyx2IDEuMTYgMjAwNS8xMS8wNyAxMToxNDoyNSBnbGVpeG5lciBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpID8/Pz8JCUpvY2hlbiBTY2jkdWJsZSA8cHNpb25pY0Bwc2lvbmljLmRlPgogKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNAlK9nJuIEVuZ2VsIDxqb2VybkB3aC5maC13ZWRlbC5kZT4KICoKICogVXNhZ2U6CiAqCiAqIG9uZSBjb21tZW5kIGxpbmUgcGFyYW1ldGVyIHBlciBkZXZpY2UsIGVhY2ggaW4gdGhlIGZvcm06CiAqICAgcGhyYW09PG5hbWU+LDxzdGFydD4sPGxlbj4KICogPG5hbWU+IG1heSBiZSB1cCB0byA2MyBjaGFyYWN0ZXJzLgogKiA8c3RhcnQ+IGFuZCA8bGVuPiBjYW4gYmUgb2N0YWwsIGRlY2ltYWwgb3IgaGV4YWRlY2ltYWwuICBJZiBmb2xsb3dlZAogKiBieSAia2kiLCAiTWkiIG9yICJHaSIsIHRoZSBudW1iZXJzIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMga2lsbywgbWVnYSBvcgogKiBnaWdhYnl0ZXMuCiAqCiAqIEV4YW1wbGU6CiAqCXBocmFtPXN3YXAsNjRNaSwxMjhNaSBwaHJhbT10ZXN0LDkwME1pLDFNaQogKi8KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CgojZGVmaW5lIEVSUk9SKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSICJwaHJhbTogIiBmbXQgLCAjIyBhcmdzKQoKc3RydWN0IHBocmFtX210ZF9saXN0IHsKCXN0cnVjdCBtdGRfaW5mbyBtdGQ7CglzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cn07CgpzdGF0aWMgTElTVF9IRUFEKHBocmFtX2xpc3QpOwoKCnN0YXRpYyBpbnQgcGhyYW1fZXJhc2Uoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cikKewoJdV9jaGFyICpzdGFydCA9IG10ZC0+cHJpdjsKCglpZiAoaW5zdHItPmFkZHIgKyBpbnN0ci0+bGVuID4gbXRkLT5zaXplKQoJCXJldHVybiAtRUlOVkFMOwoKCW1lbXNldChzdGFydCArIGluc3RyLT5hZGRyLCAweGZmLCBpbnN0ci0+bGVuKTsKCgkvKiBUaGlzJ2xsIGNhdGNoIGEgZmV3IHJhY2VzLiBGcmVlIHRoZSB0aGluZyBiZWZvcmUgcmV0dXJuaW5nIDopCgkgKiBJIGRvbid0IGZlZWwgYXQgYWxsIGFzaGFtZWQuIFRoaXMga2luZCBvZiB0aGluZyBpcyBwb3NzaWJsZSBhbnl3YXkKCSAqIHdpdGggZmxhc2gsIGJ1dCB1bmxpa2VseS4KCSAqLwoKCWluc3RyLT5zdGF0ZSA9IE1URF9FUkFTRV9ET05FOwoKCW10ZF9lcmFzZV9jYWxsYmFjayhpbnN0cik7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgcGhyYW1fcG9pbnQoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLAoJCXNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKiptdGRidWYpCnsKCXVfY2hhciAqc3RhcnQgPSBtdGQtPnByaXY7CgoJaWYgKGZyb20gKyBsZW4gPiBtdGQtPnNpemUpCgkJcmV0dXJuIC1FSU5WQUw7CgoJKm10ZGJ1ZiA9IHN0YXJ0ICsgZnJvbTsKCSpyZXRsZW4gPSBsZW47CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgcGhyYW1fdW5wb2ludChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICphZGRyLCBsb2ZmX3QgZnJvbSwKCQlzaXplX3QgbGVuKQp7Cn0KCnN0YXRpYyBpbnQgcGhyYW1fcmVhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sCgkJc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKQp7Cgl1X2NoYXIgKnN0YXJ0ID0gbXRkLT5wcml2OwoKCWlmIChmcm9tID49IG10ZC0+c2l6ZSkKCQlyZXR1cm4gLUVJTlZBTDsKCglpZiAobGVuID4gbXRkLT5zaXplIC0gZnJvbSkKCQlsZW4gPSBtdGQtPnNpemUgLSBmcm9tOwoKCW1lbWNweShidWYsIHN0YXJ0ICsgZnJvbSwgbGVuKTsKCgkqcmV0bGVuID0gbGVuOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgcGhyYW1fd3JpdGUoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywgc2l6ZV90IGxlbiwKCQlzaXplX3QgKnJldGxlbiwgY29uc3QgdV9jaGFyICpidWYpCnsKCXVfY2hhciAqc3RhcnQgPSBtdGQtPnByaXY7CgoJaWYgKHRvID49IG10ZC0+c2l6ZSkKCQlyZXR1cm4gLUVJTlZBTDsKCglpZiAobGVuID4gbXRkLT5zaXplIC0gdG8pCgkJbGVuID0gbXRkLT5zaXplIC0gdG87CgoJbWVtY3B5KHN0YXJ0ICsgdG8sIGJ1ZiwgbGVuKTsKCgkqcmV0bGVuID0gbGVuOwoJcmV0dXJuIDA7Cn0KCgoKc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl9kZXZpY2VzKHZvaWQpCnsKCXN0cnVjdCBwaHJhbV9tdGRfbGlzdCAqdGhpcywgKnNhZmU7CgoJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRoaXMsIHNhZmUsICZwaHJhbV9saXN0LCBsaXN0KSB7CgkJZGVsX210ZF9kZXZpY2UoJnRoaXMtPm10ZCk7CgkJaW91bm1hcCh0aGlzLT5tdGQucHJpdik7CgkJa2ZyZWUodGhpcyk7Cgl9Cn0KCnN0YXRpYyBpbnQgcmVnaXN0ZXJfZGV2aWNlKGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuKQp7CglzdHJ1Y3QgcGhyYW1fbXRkX2xpc3QgKm5ldzsKCWludCByZXQgPSAtRU5PTUVNOwoKCW5ldyA9IGttYWxsb2Moc2l6ZW9mKCpuZXcpLCBHRlBfS0VSTkVMKTsKCWlmICghbmV3KQoJCWdvdG8gb3V0MDsKCgltZW1zZXQobmV3LCAwLCBzaXplb2YoKm5ldykpOwoKCXJldCA9IC1FSU87CgluZXctPm10ZC5wcml2ID0gaW9yZW1hcChzdGFydCwgbGVuKTsKCWlmICghbmV3LT5tdGQucHJpdikgewoJCUVSUk9SKCJpb3JlbWFwIGZhaWxlZFxuIik7CgkJZ290byBvdXQxOwoJfQoKCgluZXctPm10ZC5uYW1lID0gbmFtZTsKCW5ldy0+bXRkLnNpemUgPSBsZW47CgluZXctPm10ZC5mbGFncyA9IE1URF9DQVBfUkFNIHwgTVREX0VSQVNFQUJMRSB8IE1URF9WT0xBVElMRTsKICAgICAgICBuZXctPm10ZC5lcmFzZSA9IHBocmFtX2VyYXNlOwoJbmV3LT5tdGQucG9pbnQgPSBwaHJhbV9wb2ludDsKCW5ldy0+bXRkLnVucG9pbnQgPSBwaHJhbV91bnBvaW50OwoJbmV3LT5tdGQucmVhZCA9IHBocmFtX3JlYWQ7CgluZXctPm10ZC53cml0ZSA9IHBocmFtX3dyaXRlOwoJbmV3LT5tdGQub3duZXIgPSBUSElTX01PRFVMRTsKCW5ldy0+bXRkLnR5cGUgPSBNVERfUkFNOwoJbmV3LT5tdGQuZXJhc2VzaXplID0gUEFHRV9TSVpFOwoKCXJldCA9IC1FQUdBSU47CglpZiAoYWRkX210ZF9kZXZpY2UoJm5ldy0+bXRkKSkgewoJCUVSUk9SKCJGYWlsZWQgdG8gcmVnaXN0ZXIgbmV3IGRldmljZVxuIik7CgkJZ290byBvdXQyOwoJfQoKCWxpc3RfYWRkX3RhaWwoJm5ldy0+bGlzdCwgJnBocmFtX2xpc3QpOwoJcmV0dXJuIDA7CgpvdXQyOgoJaW91bm1hcChuZXctPm10ZC5wcml2KTsKb3V0MToKCWtmcmVlKG5ldyk7Cm91dDA6CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IHVzdHJ0b3VsKGNvbnN0IGNoYXIgKmNwLCBjaGFyICoqZW5kcCwgdW5zaWduZWQgaW50IGJhc2UpCnsKCXVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gc2ltcGxlX3N0cnRvdWwoY3AsIGVuZHAsIGJhc2UpOwoKCXN3aXRjaCAoKiplbmRwKSB7CgljYXNlICdHJzoKCQlyZXN1bHQgKj0gMTAyNDsKCWNhc2UgJ00nOgoJCXJlc3VsdCAqPSAxMDI0OwoJY2FzZSAnayc6CgkJcmVzdWx0ICo9IDEwMjQ7CgkvKiBCeSBkd213MiBlZGl0b3JpYWwgZGVjcmVlLCAia2kiLCAiTWkiIG9yICJHaSIgYXJlIHRvIGJlIHVzZWQuICovCgkJaWYgKCgqZW5kcClbMV0gPT0gJ2knKQoJCQkoKmVuZHApICs9IDI7Cgl9CglyZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgaW50IHBhcnNlX251bTMyKHVpbnQzMl90ICpudW0zMiwgY29uc3QgY2hhciAqdG9rZW4pCnsKCWNoYXIgKmVuZHA7Cgl1bnNpZ25lZCBsb25nIG47CgoJbiA9IHVzdHJ0b3VsKHRva2VuLCAmZW5kcCwgMCk7CglpZiAoKmVuZHApCgkJcmV0dXJuIC1FSU5WQUw7CgoJKm51bTMyID0gbjsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHBhcnNlX25hbWUoY2hhciAqKnBuYW1lLCBjb25zdCBjaGFyICp0b2tlbikKewoJc2l6ZV90IGxlbjsKCWNoYXIgKm5hbWU7CgoJbGVuID0gc3RybGVuKHRva2VuKSArIDE7CglpZiAobGVuID4gNjQpCgkJcmV0dXJuIC1FTk9TUEM7CgoJbmFtZSA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKCWlmICghbmFtZSkKCQlyZXR1cm4gLUVOT01FTTsKCglzdHJjcHkobmFtZSwgdG9rZW4pOwoKCSpwbmFtZSA9IG5hbWU7CglyZXR1cm4gMDsKfQoKCnN0YXRpYyBpbmxpbmUgdm9pZCBraWxsX2ZpbmFsX25ld2xpbmUoY2hhciAqc3RyKQp7CgljaGFyICpuZXdsaW5lID0gc3RycmNocihzdHIsICdcbicpOwoJaWYgKG5ld2xpbmUgJiYgIW5ld2xpbmVbMV0pCgkJKm5ld2xpbmUgPSAwOwp9CgoKI2RlZmluZSBwYXJzZV9lcnIoZm10LCBhcmdzLi4uKSBkbyB7CVwKCUVSUk9SKGZtdCAsICMjIGFyZ3MpOwlcCglyZXR1cm4gMDsJCVwKfSB3aGlsZSAoMCkKCnN0YXRpYyBpbnQgcGhyYW1fc2V0dXAoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKewoJY2hhciBidWZbNjQrMTIrMTJdLCAqc3RyID0gYnVmOwoJY2hhciAqdG9rZW5bM107CgljaGFyICpuYW1lOwoJdWludDMyX3Qgc3RhcnQ7Cgl1aW50MzJfdCBsZW47CglpbnQgaSwgcmV0OwoKCWlmIChzdHJubGVuKHZhbCwgc2l6ZW9mKGJ1ZikpID49IHNpemVvZihidWYpKQoJCXBhcnNlX2VycigicGFyYW1ldGVyIHRvbyBsb25nXG4iKTsKCglzdHJjcHkoc3RyLCB2YWwpOwoJa2lsbF9maW5hbF9uZXdsaW5lKHN0cik7CgoJZm9yIChpPTA7IGk8MzsgaSsrKQoJCXRva2VuW2ldID0gc3Ryc2VwKCZzdHIsICIsIik7CgoJaWYgKHN0cikKCQlwYXJzZV9lcnIoInRvbyBtYW55IGFyZ3VtZW50c1xuIik7CgoJaWYgKCF0b2tlblsyXSkKCQlwYXJzZV9lcnIoIm5vdCBlbm91Z2ggYXJndW1lbnRzXG4iKTsKCglyZXQgPSBwYXJzZV9uYW1lKCZuYW1lLCB0b2tlblswXSk7CglpZiAocmV0ID09IC1FTk9NRU0pCgkJcGFyc2VfZXJyKCJvdXQgb2YgbWVtb3J5XG4iKTsKCWlmIChyZXQgPT0gLUVOT1NQQykKCQlwYXJzZV9lcnIoIm5hbWUgdG9vIGxvbmdcbiIpOwoJaWYgKHJldCkKCQlyZXR1cm4gMDsKCglyZXQgPSBwYXJzZV9udW0zMigmc3RhcnQsIHRva2VuWzFdKTsKCWlmIChyZXQpCgkJcGFyc2VfZXJyKCJpbGxlZ2FsIHN0YXJ0IGFkZHJlc3NcbiIpOwoKCXJldCA9IHBhcnNlX251bTMyKCZsZW4sIHRva2VuWzJdKTsKCWlmIChyZXQpCgkJcGFyc2VfZXJyKCJpbGxlZ2FsIGRldmljZSBsZW5ndGhcbiIpOwoKCXJlZ2lzdGVyX2RldmljZShuYW1lLCBzdGFydCwgbGVuKTsKCglyZXR1cm4gMDsKfQoKbW9kdWxlX3BhcmFtX2NhbGwocGhyYW0sIHBocmFtX3NldHVwLCBOVUxMLCBOVUxMLCAwMDApOwpNT0RVTEVfUEFSTV9ERVNDKHBocmFtLCJNZW1vcnkgcmVnaW9uIHRvIG1hcC4gXCJtYXA9PG5hbWU+LDxzdGFydD4sPGxlbmd0aD5cIiIpOwoKCnN0YXRpYyBpbnQgX19pbml0IGluaXRfcGhyYW0odm9pZCkKewoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3BocmFtKHZvaWQpCnsKCXVucmVnaXN0ZXJfZGV2aWNlcygpOwp9Cgptb2R1bGVfaW5pdChpbml0X3BocmFtKTsKbW9kdWxlX2V4aXQoY2xlYW51cF9waHJhbSk7CgpNT0RVTEVfTElDRU5TRSgiR1BMIik7Ck1PRFVMRV9BVVRIT1IoIkr2cm4gRW5nZWwgPGpvZXJuQHdoLmZoLXdlZGVsLmRlPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIk1URCBkcml2ZXIgZm9yIHBoeXNpY2FsIFJBTSIpOwo=