LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKICogaTJjLXBhcnBvcnQtbGlnaHQuYyBJMkMgYnVzIG92ZXIgcGFyYWxsZWwgcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDcgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CiAgIAogICBCYXNlZCBvbiBvbGRlciBpMmMtdmVsbGVtYW4uYyBkcml2ZXIKICAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgU2ltb24gRy4gVm9nbAogICBXaXRoIHNvbWUgY2hhbmdlcyBmcm9tOgogICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+CiAgIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPgogICAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlICJpMmMtcGFycG9ydC5oIgoKI2RlZmluZSBERUZBVUxUX0JBU0UgMHgzNzgKI2RlZmluZSBEUlZOQU1FICJpMmMtcGFycG9ydC1saWdodCIKCnN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwoKc3RhdGljIHUxNiBiYXNlOwptb2R1bGVfcGFyYW0oYmFzZSwgdXNob3J0LCAwKTsKTU9EVUxFX1BBUk1fREVTQyhiYXNlLCAiQmFzZSBJL08gYWRkcmVzcyIpOwoKLyogLS0tLS0gTG93LWxldmVsIHBhcmFsbGVsIHBvcnQgYWNjZXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgaW5saW5lIHZvaWQgcG9ydF93cml0ZSh1bnNpZ25lZCBjaGFyIHAsIHVuc2lnbmVkIGNoYXIgZCkKewoJb3V0YihkLCBiYXNlK3ApOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcG9ydF9yZWFkKHVuc2lnbmVkIGNoYXIgcCkKewoJcmV0dXJuIGluYihiYXNlK3ApOwp9CgovKiAtLS0tLSBVbmlmaWVkIGxpbmUgb3BlcmF0aW9uIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyBpbmxpbmUgdm9pZCBsaW5lX3NldChpbnQgc3RhdGUsIGNvbnN0IHN0cnVjdCBsaW5lb3AgKm9wKQp7Cgl1OCBvbGR2YWwgPSBwb3J0X3JlYWQob3AtPnBvcnQpOwoKCS8qIFRvdWNoIG9ubHkgdGhlIGJpdChzKSBuZWVkZWQgKi8KCWlmICgob3AtPmludmVydGVkICYmICFzdGF0ZSkgfHwgKCFvcC0+aW52ZXJ0ZWQgJiYgc3RhdGUpKQoJCXBvcnRfd3JpdGUob3AtPnBvcnQsIG9sZHZhbCB8IG9wLT52YWwpOwoJZWxzZQoJCXBvcnRfd3JpdGUob3AtPnBvcnQsIG9sZHZhbCAmIH5vcC0+dmFsKTsKfQoKc3RhdGljIGlubGluZSBpbnQgbGluZV9nZXQoY29uc3Qgc3RydWN0IGxpbmVvcCAqb3ApCnsKCXU4IG9sZHZhbCA9IHBvcnRfcmVhZChvcC0+cG9ydCk7CgoJcmV0dXJuICgob3AtPmludmVydGVkICYmIChvbGR2YWwgJiBvcC0+dmFsKSAhPSBvcC0+dmFsKQoJICAgIHx8ICghb3AtPmludmVydGVkICYmIChvbGR2YWwgJiBvcC0+dmFsKSA9PSBvcC0+dmFsKSk7Cn0KCi8qIC0tLS0tIEkyQyBhbGdvcml0aG0gY2FsbC1iYWNrIGZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlcyAtLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHZvaWQgcGFycG9ydF9zZXRzY2wodm9pZCAqZGF0YSwgaW50IHN0YXRlKQp7CglsaW5lX3NldChzdGF0ZSwgJmFkYXB0ZXJfcGFybVt0eXBlXS5zZXRzY2wpOwp9CgpzdGF0aWMgdm9pZCBwYXJwb3J0X3NldHNkYSh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCnsKCWxpbmVfc2V0KHN0YXRlLCAmYWRhcHRlcl9wYXJtW3R5cGVdLnNldHNkYSk7Cn0KCnN0YXRpYyBpbnQgcGFycG9ydF9nZXRzY2wodm9pZCAqZGF0YSkKewoJcmV0dXJuIGxpbmVfZ2V0KCZhZGFwdGVyX3Bhcm1bdHlwZV0uZ2V0c2NsKTsKfQoKc3RhdGljIGludCBwYXJwb3J0X2dldHNkYSh2b2lkICpkYXRhKQp7CglyZXR1cm4gbGluZV9nZXQoJmFkYXB0ZXJfcGFybVt0eXBlXS5nZXRzZGEpOwp9CgovKiBFbmNhcHN1bGF0ZSB0aGUgZnVuY3Rpb25zIGFib3ZlIGluIHRoZSBjb3JyZWN0IHN0cnVjdHVyZQogICBOb3RlIHRoYXQgZ2V0c2NsIHdpbGwgYmUgc2V0IHRvIE5VTEwgYnkgdGhlIGF0dGFjaGluZyBjb2RlIGZvciBhZGFwdGVycwogICB0aGF0IGNhbm5vdCByZWFkIFNDTCBiYWNrICovCnN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgcGFycG9ydF9hbGdvX2RhdGEgPSB7Cgkuc2V0c2RhCQk9IHBhcnBvcnRfc2V0c2RhLAoJLnNldHNjbAkJPSBwYXJwb3J0X3NldHNjbCwKCS5nZXRzZGEJCT0gcGFycG9ydF9nZXRzZGEsCgkuZ2V0c2NsCQk9IHBhcnBvcnRfZ2V0c2NsLAoJLnVkZWxheQkJPSA1MCwKCS50aW1lb3V0CT0gSFosCn07IAoKLyogLS0tLS0gRHJpdmVyIHJlZ2lzdHJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHBhcnBvcnRfYWRhcHRlciA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5jbGFzcwkJPSBJMkNfQ0xBU1NfSFdNT04sCgkuaWQJCT0gSTJDX0hXX0JfTFAsCgkuYWxnb19kYXRhCT0gJnBhcnBvcnRfYWxnb19kYXRhLAoJLm5hbWUJCT0gIlBhcmFsbGVsIHBvcnQgYWRhcHRlciAobGlnaHQpIiwKfTsKCnN0YXRpYyBpbnQgX19kZXZpbml0IGkyY19wYXJwb3J0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCnsKCWludCBlcnI7CglzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKCglyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JTywgMCk7CglpZiAoIXJlcXVlc3RfcmVnaW9uKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEsIERSVk5BTUUpKQoJCXJldHVybiAtRUJVU1k7CgoJLyogUmVzZXQgaGFyZHdhcmUgdG8gYSBzYW5lIHN0YXRlIChTQ0wgYW5kIFNEQSBoaWdoKSAqLwoJcGFycG9ydF9zZXRzZGEoTlVMTCwgMSk7CglwYXJwb3J0X3NldHNjbChOVUxMLCAxKTsKCS8qIE90aGVyIGluaXQgaWYgbmVlZGVkIChwb3dlciBvbi4uLikgKi8KCWlmIChhZGFwdGVyX3Bhcm1bdHlwZV0uaW5pdC52YWwpCgkJbGluZV9zZXQoMSwgJmFkYXB0ZXJfcGFybVt0eXBlXS5pbml0KTsKCglwYXJwb3J0X2FkYXB0ZXIuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CgllcnIgPSBpMmNfYml0X2FkZF9idXMoJnBhcnBvcnRfYWRhcHRlcik7CglpZiAoZXJyKSB7CgkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIHJlZ2lzdGVyIHdpdGggSTJDXG4iKTsKCQlnb3RvIGV4aXRfcmVnaW9uOwoJfQoJcmV0dXJuIDA7CgpleGl0X3JlZ2lvbjoKCXJlbGVhc2VfcmVnaW9uKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOwoJcmV0dXJuIGVycjsKfQoKc3RhdGljIGludCBfX2RldmV4aXQgaTJjX3BhcnBvcnRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCnsKCXN0cnVjdCByZXNvdXJjZSAqcmVzOwoKCWkyY19kZWxfYWRhcHRlcigmcGFycG9ydF9hZGFwdGVyKTsKCgkvKiBVbi1pbml0IGlmIG5lZWRlZCAocG93ZXIgb2ZmLi4uKSAqLwoJaWYgKGFkYXB0ZXJfcGFybVt0eXBlXS5pbml0LnZhbCkKCQlsaW5lX3NldCgwLCAmYWRhcHRlcl9wYXJtW3R5cGVdLmluaXQpOwoKCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lPLCAwKTsKCXJlbGVhc2VfcmVnaW9uKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGkyY19wYXJwb3J0X2RyaXZlciA9IHsKCS5kcml2ZXIgPSB7CgkJLm93bmVyCT0gVEhJU19NT0RVTEUsCgkJLm5hbWUJPSBEUlZOQU1FLAoJfSwKCS5wcm9iZQkJPSBpMmNfcGFycG9ydF9wcm9iZSwKCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoaTJjX3BhcnBvcnRfcmVtb3ZlKSwKfTsKCnN0YXRpYyBpbnQgX19pbml0IGkyY19wYXJwb3J0X2RldmljZV9hZGQodTE2IGFkZHJlc3MpCnsKCXN0cnVjdCByZXNvdXJjZSByZXMgPSB7CgkJLnN0YXJ0CT0gYWRkcmVzcywKCQkuZW5kCT0gYWRkcmVzcyArIDIsCgkJLm5hbWUJPSBEUlZOQU1FLAoJCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8sCgl9OwoJaW50IGVycjsKCglwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVk5BTUUsIC0xKTsKCWlmICghcGRldikgewoJCWVyciA9IC1FTk9NRU07CgkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKCQlnb3RvIGV4aXQ7Cgl9CgoJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CglpZiAoZXJyKSB7CgkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAiCgkJICAgICAgICIoJWQpXG4iLCBlcnIpOwoJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwoJfQoKCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CglpZiAoZXJyKSB7CgkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLAoJCSAgICAgICBlcnIpOwoJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwoJfQoKCXJldHVybiAwOwoKZXhpdF9kZXZpY2VfcHV0OgoJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKZXhpdDoKCXJldHVybiBlcnI7Cn0KCnN0YXRpYyBpbnQgX19pbml0IGkyY19wYXJwb3J0X2luaXQodm9pZCkKewoJaW50IGVycjsKCglpZiAodHlwZSA8IDApIHsKCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBhZGFwdGVyIHR5cGUgdW5zcGVjaWZpZWRcbiIpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCWlmICh0eXBlID49IEFSUkFZX1NJWkUoYWRhcHRlcl9wYXJtKSkgewoJCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IGludmFsaWQgdHlwZSAoJWQpXG4iLCB0eXBlKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglpZiAoYmFzZSA9PSAwKSB7CgkJcHJfaW5mbyhEUlZOQU1FICI6IHVzaW5nIGRlZmF1bHQgYmFzZSAweCV4XG4iLCBERUZBVUxUX0JBU0UpOwoJCWJhc2UgPSBERUZBVUxUX0JBU0U7Cgl9CgogICAgICAgIGlmICghYWRhcHRlcl9wYXJtW3R5cGVdLmdldHNjbC52YWwpCgkJcGFycG9ydF9hbGdvX2RhdGEuZ2V0c2NsID0gTlVMTDsKCgkvKiBTZXRzIGdsb2JhbCBwZGV2IGFzIGEgc2lkZSBlZmZlY3QgKi8KCWVyciA9IGkyY19wYXJwb3J0X2RldmljZV9hZGQoYmFzZSk7CglpZiAoZXJyKQoJCWdvdG8gZXhpdDsKCgllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmkyY19wYXJwb3J0X2RyaXZlcik7CglpZiAoZXJyKQoJCWdvdG8gZXhpdF9kZXZpY2U7CgoJcmV0dXJuIDA7CgpleGl0X2RldmljZToKCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOwpleGl0OgoJcmV0dXJuIGVycjsKfQoKc3RhdGljIHZvaWQgX19leGl0IGkyY19wYXJwb3J0X2V4aXQodm9pZCkKewoJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmkyY19wYXJwb3J0X2RyaXZlcik7CglwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKfQoKTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiSTJDIGJ1cyBvdmVyIHBhcmFsbGVsIHBvcnQgKGxpZ2h0KSIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cgptb2R1bGVfaW5pdChpMmNfcGFycG9ydF9pbml0KTsKbW9kdWxlX2V4aXQoaTJjX3BhcnBvcnRfZXhpdCk7Cg==